[med-svn] [libbpp-seq] 03/07: New upstream version 2.3.0

Andreas Tille tille at debian.org
Sat Jun 3 12:48:05 UTC 2017


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository libbpp-seq.

commit bb4a617779749da8f48d35b0a52af2ac829f5769
Author: Andreas Tille <tille at debian.org>
Date:   Sat Jun 3 07:25:16 2017 +0200

    New upstream version 2.3.0
---
 .gitignore                                         |   15 +
 AUTHORS.txt                                        |   15 +-
 CMakeLists.txt                                     |  184 +-
 CTestConfig.cmake                                  |   13 +
 ChangeLog                                          |  450 +---
 Doxyfile                                           | 2674 ++++++++++++--------
 Doxyfile-build                                     | 1889 --------------
 INSTALL.txt                                        |   19 +-
 bpp-core.spec                                      |  102 +
 bpp-seq.spec                                       |  203 --
 cmake/doc-cmake-for-developpers.cmake              |  240 ++
 cmake/project-template-for-users.cmake             |  106 +
 debian/changelog                                   |   71 -
 debian/compat                                      |    1 -
 debian/control                                     |   25 -
 debian/copyright                                   |   66 -
 debian/docs                                        |    0
 debian/libbpp-seq-dev.install                      |    3 -
 debian/libbpp-seq9.install                         |    1 -
 debian/postinst                                    |   57 -
 debian/postrm                                      |   59 -
 debian/prerm                                       |   41 -
 debian/rules                                       |  122 -
 debian/source/format                               |    1 -
 genIncludes.sh                                     |   35 -
 package.cmake.in                                   |   25 +
 src/Bpp/App/ApplicationTools.cpp                   |  374 +++
 src/Bpp/App/ApplicationTools.h                     |  640 +++++
 .../BppApplication.cpp}                            |   56 +-
 .../AbstractOAlignment.h => App/BppApplication.h}  |   79 +-
 src/Bpp/App/NumCalcApplicationTools.cpp            |  141 ++
 src/Bpp/App/NumCalcApplicationTools.h              |  134 +
 .../{Seq/Io/AbstractOAlignment.h => BppBoolean.h}  |   61 +-
 .../Alphabet/DefaultAlphabet.cpp => BppString.cpp} |   31 +-
 src/Bpp/{Seq/Io/GenBank.h => BppString.h}          |   86 +-
 src/Bpp/{Seq/Io/NexusTools.h => BppVector.h}       |   72 +-
 src/Bpp/Clonable.h                                 |  120 +
 .../Alphabet/CodonAlphabet.cpp => Exceptions.cpp}  |  105 +-
 src/Bpp/Exceptions.h                               |  425 ++++
 src/Bpp/Graph/AssociationDAGraphImplObserver.h     |  406 +++
 src/Bpp/Graph/AssociationDAGraphObserver.h         |  256 ++
 src/Bpp/Graph/AssociationGraphImplObserver.h       | 1332 ++++++++++
 src/Bpp/Graph/AssociationGraphObserver.h           |  483 ++++
 src/Bpp/Graph/AssociationTreeGraphImplObserver.h   |  397 +++
 src/Bpp/Graph/AssociationTreeGraphObserver.h       |  255 ++
 src/Bpp/Graph/DAGraph.h                            |  174 ++
 src/Bpp/Graph/DAGraphImpl.h                        |  525 ++++
 src/Bpp/Graph/GlobalGraph.cpp                      |  990 ++++++++
 src/Bpp/Graph/GlobalGraph.h                        |  956 +++++++
 src/Bpp/Graph/Graph.h                              |  582 +++++
 .../AlphabetIndex1.h => Graph/GraphObserver.h}     |   85 +-
 src/Bpp/Graph/TreeGraph.h                          |  201 ++
 src/Bpp/Graph/TreeGraphImpl.h                      |  593 +++++
 src/Bpp/Graphics/AbstractGraphicDevice.h           |  112 +
 src/Bpp/Graphics/ColorManager.h                    |  191 ++
 src/Bpp/Graphics/ColorSet.h                        |  132 +
 src/Bpp/Graphics/ColorTools.cpp                    |  101 +
 src/Bpp/Graphics/ColorTools.h                      |  133 +
 .../SiteIterator.h => Graphics/DefaultColorSet.h}  |   60 +-
 src/Bpp/Graphics/Fig/XFigGraphicDevice.cpp         |  194 ++
 src/Bpp/Graphics/Fig/XFigGraphicDevice.h           |  133 +
 .../Bpp/Graphics/Fig/XFigLaTeXFontManager.cpp      |   44 +-
 .../Fig/XFigLaTeXFontManager.h}                    |   40 +-
 src/Bpp/Graphics/Fig/XFigPostscriptFontManager.cpp |   85 +
 .../Fig/XFigPostscriptFontManager.h}               |   40 +-
 .../DistanceMatrix.cpp => Graphics/Font/Font.cpp}  |   33 +-
 src/Bpp/Graphics/Font/Font.h                       |  174 ++
 src/Bpp/Graphics/Font/FontManager.h                |  150 ++
 .../Bpp/Graphics/GraphicDevice.cpp                 |   45 +-
 src/Bpp/Graphics/GraphicDevice.h                   |  199 ++
 src/Bpp/Graphics/Latex/DvipsColorSet.cpp           |  115 +
 .../Latex/DvipsColorSet.h}                         |   37 +-
 src/Bpp/Graphics/Latex/PgfGraphicDevice.cpp        |  299 +++
 src/Bpp/Graphics/Latex/PgfGraphicDevice.h          |  117 +
 src/Bpp/Graphics/Molscript/MolscriptColorSet.cpp   |  210 ++
 .../Molscript/MolscriptColorSet.h}                 |   37 +-
 src/Bpp/Graphics/Point2D.h                         |  146 ++
 .../Point2DTools.h}                                |   73 +-
 src/Bpp/Graphics/R/RColorSet.cpp                   |  704 ++++++
 .../{Seq/SiteIterator.h => Graphics/R/RColorSet.h} |   64 +-
 src/Bpp/Graphics/RgbColor.h                        |  152 ++
 src/Bpp/Graphics/Svg/SvgGraphicDevice.cpp          |  171 ++
 src/Bpp/Graphics/Svg/SvgGraphicDevice.h            |  107 +
 src/Bpp/Io/BppODiscreteDistributionFormat.cpp      |  455 ++++
 src/Bpp/Io/BppODiscreteDistributionFormat.h        |   96 +
 src/Bpp/Io/BppOParametrizableFormat.cpp            |  120 +
 src/Bpp/Io/BppOParametrizableFormat.h              |  110 +
 .../CodonAlphabet.cpp => Io/FileTools.cpp}         |  114 +-
 src/Bpp/Io/FileTools.h                             |  162 ++
 src/Bpp/Io/IoDiscreteDistribution.h                |  125 +
 .../IoDiscreteDistributionFactory.cpp}             |   39 +-
 src/Bpp/Io/IoDiscreteDistributionFactory.h         |   99 +
 .../AlphabetNumericState.h => Io/IoFormat.h}       |  187 +-
 src/Bpp/Io/IoParametrizable.h                      |  117 +
 src/Bpp/Io/OutputStream.h                          |  350 +++
 src/Bpp/Numeric/AbstractParameterAliasable.cpp     |  397 +++
 src/Bpp/Numeric/AbstractParameterAliasable.h       |  281 ++
 .../Bpp/Numeric/AbstractParametrizable.cpp         |   51 +-
 src/Bpp/Numeric/AbstractParametrizable.h           |  259 ++
 .../Numeric/AdaptiveKernelDensityEstimation.cpp    |  141 ++
 src/Bpp/Numeric/AdaptiveKernelDensityEstimation.h  |  122 +
 src/Bpp/Numeric/AutoParameter.cpp                  |  120 +
 src/Bpp/Numeric/AutoParameter.h                    |  146 ++
 src/Bpp/Numeric/Constraints.h                      |  438 ++++
 src/Bpp/Numeric/DataTable.cpp                      |  716 ++++++
 src/Bpp/Numeric/DataTable.h                        |  437 ++++
 .../Numeric/Function/AbstractNumericalDerivative.h |  276 ++
 src/Bpp/Numeric/Function/AbstractOptimizer.cpp     |  344 +++
 src/Bpp/Numeric/Function/AbstractOptimizer.h       |  391 +++
 src/Bpp/Numeric/Function/BfgsMultiDimensions.cpp   |  300 +++
 src/Bpp/Numeric/Function/BfgsMultiDimensions.h     |  123 +
 src/Bpp/Numeric/Function/BrentOneDimension.cpp     |  216 ++
 src/Bpp/Numeric/Function/BrentOneDimension.h       |  150 ++
 .../Function/ConjugateGradientMultiDimensions.cpp  |  134 +
 .../Function/ConjugateGradientMultiDimensions.h    |  110 +
 src/Bpp/Numeric/Function/DirectionFunction.cpp     |  109 +
 src/Bpp/Numeric/Function/DirectionFunction.h       |  116 +
 src/Bpp/Numeric/Function/DownhillSimplexMethod.cpp |  243 ++
 src/Bpp/Numeric/Function/DownhillSimplexMethod.h   |  166 ++
 .../Function/FivePointsNumericalDerivative.cpp     |  147 ++
 .../Function/FivePointsNumericalDerivative.h       |  136 +
 src/Bpp/Numeric/Function/FunctionTools.cpp         |  140 +
 src/Bpp/Numeric/Function/FunctionTools.h           |  122 +
 src/Bpp/Numeric/Function/Functions.h               |  639 +++++
 src/Bpp/Numeric/Function/GoldenSectionSearch.cpp   |  174 ++
 src/Bpp/Numeric/Function/GoldenSectionSearch.h     |  145 ++
 src/Bpp/Numeric/Function/MetaOptimizer.cpp         |  208 ++
 src/Bpp/Numeric/Function/MetaOptimizer.h           |  246 ++
 .../Function/NewtonBacktrackOneDimension.cpp       |  124 +
 .../Numeric/Function/NewtonBacktrackOneDimension.h |  124 +
 src/Bpp/Numeric/Function/NewtonOneDimension.cpp    |  122 +
 .../Function/NewtonOneDimension.h}                 |   78 +-
 .../Function/OneDimensionOptimizationTools.cpp     |  267 ++
 .../Function/OneDimensionOptimizationTools.h       |  138 +
 .../Numeric/Function/Operators/BinaryOperator.h    |  168 ++
 .../Numeric/Function/Operators/ComputationTree.cpp |  213 ++
 .../Numeric/Function/Operators/ComputationTree.h   |  113 +
 .../Function/Operators/ConstantOperator.h}         |   72 +-
 .../Numeric/Function/Operators/FunctionOperator.h  |  133 +
 src/Bpp/Numeric/Function/Operators/MathOperator.h  |  138 +
 .../Function/Operators/Operator.h}                 |   57 +-
 .../Numeric/Function/OptimizationStopCondition.cpp |  241 ++
 .../Numeric/Function/OptimizationStopCondition.h   |  303 +++
 src/Bpp/Numeric/Function/Optimizer.h               |  398 +++
 src/Bpp/Numeric/Function/PowellMultiDimensions.cpp |  170 ++
 src/Bpp/Numeric/Function/PowellMultiDimensions.h   |  115 +
 .../Function/ReparametrizationFunctionWrapper.cpp  |  194 ++
 .../Function/ReparametrizationFunctionWrapper.h    |  262 ++
 src/Bpp/Numeric/Function/SimpleMultiDimensions.cpp |  114 +
 .../Function/SimpleMultiDimensions.h}              |   73 +-
 .../Function/SimpleNewtonMultiDimensions.cpp}      |   96 +-
 .../Function/SimpleNewtonMultiDimensions.h}        |   72 +-
 .../Function/ThreePointsNumericalDerivative.cpp    |  263 ++
 .../Function/ThreePointsNumericalDerivative.h      |  135 +
 .../Function/TwoPointsNumericalDerivative.cpp      |  127 +
 .../Function/TwoPointsNumericalDerivative.h        |  121 +
 .../Numeric/Hmm/AbstractHmmTransitionMatrix.cpp    |  129 +
 src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.h  |  120 +
 .../Hmm/AutoCorrelationTransitionMatrix.cpp        |  113 +
 .../Numeric/Hmm/AutoCorrelationTransitionMatrix.h  |  118 +
 src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.cpp    |  142 ++
 src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.h      |  130 +
 src/Bpp/Numeric/Hmm/HmmEmissionProbabilities.h     |  131 +
 .../SiteIterator.h => Numeric/Hmm/HmmExceptions.h} |   75 +-
 .../Hmm/HmmLikelihood.cpp}                         |   70 +-
 src/Bpp/Numeric/Hmm/HmmLikelihood.h                |  213 ++
 src/Bpp/Numeric/Hmm/HmmStateAlphabet.h             |  122 +
 src/Bpp/Numeric/Hmm/HmmTransitionMatrix.h          |  108 +
 src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.cpp        |  579 +++++
 src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.h          |  306 +++
 .../Numeric/Hmm/LowMemoryRescaledHmmLikelihood.cpp |  256 ++
 .../Numeric/Hmm/LowMemoryRescaledHmmLikelihood.h   |  240 ++
 src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.cpp      |  597 +++++
 src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.h        |  259 ++
 src/Bpp/Numeric/Matrix/EigenValue.h                | 1248 +++++++++
 src/Bpp/Numeric/Matrix/LUDecomposition.h           |  465 ++++
 src/Bpp/Numeric/Matrix/Matrix.h                    |  547 ++++
 src/Bpp/Numeric/Matrix/MatrixTools.h               | 1361 ++++++++++
 src/Bpp/Numeric/NumConstants.h                     |  102 +
 .../{Seq/Io/GenBank.cpp => Numeric/NumTools.cpp}   |   83 +-
 src/Bpp/Numeric/NumTools.h                         |  205 ++
 src/Bpp/Numeric/Number.h                           |  231 ++
 src/Bpp/Numeric/Parameter.cpp                      |  210 ++
 src/Bpp/Numeric/Parameter.h                        |  328 +++
 src/Bpp/Numeric/ParameterAliasable.h               |  194 ++
 .../ParameterExceptions.cpp}                       |   45 +-
 src/Bpp/Numeric/ParameterExceptions.h              |  164 ++
 src/Bpp/Numeric/ParameterList.cpp                  |  593 +++++
 src/Bpp/Numeric/ParameterList.h                    |  439 ++++
 src/Bpp/Numeric/Parametrizable.h                   |  230 ++
 src/Bpp/Numeric/ParametrizableCollection.h         |  382 +++
 .../Numeric/Prob/AbstractDiscreteDistribution.cpp  |  466 ++++
 .../Numeric/Prob/AbstractDiscreteDistribution.h    |  246 ++
 src/Bpp/Numeric/Prob/BetaDiscreteDistribution.cpp  |  122 +
 src/Bpp/Numeric/Prob/BetaDiscreteDistribution.h    |  117 +
 .../Prob/ConstantDistribution.cpp}                 |   70 +-
 .../Dcse.h => Numeric/Prob/ConstantDistribution.h} |  113 +-
 .../Numeric/Prob/DirichletDiscreteDistribution.cpp |  282 +++
 .../Numeric/Prob/DirichletDiscreteDistribution.h   |  178 ++
 src/Bpp/Numeric/Prob/DiscreteDistribution.h        |  320 +++
 .../Prob/ExponentialDiscreteDistribution.cpp}      |   56 +-
 .../Numeric/Prob/ExponentialDiscreteDistribution.h |  122 +
 src/Bpp/Numeric/Prob/GammaDiscreteDistribution.cpp |  135 +
 src/Bpp/Numeric/Prob/GammaDiscreteDistribution.h   |  125 +
 .../Numeric/Prob/GaussianDiscreteDistribution.cpp  |  109 +
 .../Prob/GaussianDiscreteDistribution.h}           |   88 +-
 .../Prob/InvariantMixedDiscreteDistribution.cpp    |  157 ++
 .../Prob/InvariantMixedDiscreteDistribution.h      |  162 ++
 .../Prob/MixtureOfDiscreteDistributions.cpp        |  319 +++
 .../Numeric/Prob/MixtureOfDiscreteDistributions.h  |  163 ++
 .../Numeric/Prob/MultipleDiscreteDistribution.h    |  149 ++
 .../Numeric/Prob/SimpleDiscreteDistribution.cpp    |  350 +++
 src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.h  |  158 ++
 src/Bpp/Numeric/Prob/Simplex.cpp                   |  299 +++
 src/Bpp/Numeric/Prob/Simplex.h                     |  183 ++
 .../TruncatedExponentialDiscreteDistribution.cpp}  |   76 +-
 .../TruncatedExponentialDiscreteDistribution.h     |  154 ++
 .../Prob/UniformDiscreteDistribution.cpp}          |   70 +-
 src/Bpp/Numeric/Prob/UniformDiscreteDistribution.h |  113 +
 .../Numeric/Random/ContingencyTableGenerator.cpp   |  199 ++
 .../Random/ContingencyTableGenerator.h}            |   92 +-
 .../Random/RandomFactory.h}                        |   50 +-
 src/Bpp/Numeric/Random/RandomTools.cpp             | 1034 ++++++++
 src/Bpp/Numeric/Random/RandomTools.h               |  554 ++++
 src/Bpp/Numeric/Random/Uniform01K.cpp              |  106 +
 .../Random/Uniform01K.h}                           |   79 +-
 .../Random/Uniform01QD.cpp}                        |   27 +-
 .../Random/Uniform01QD.h}                          |   69 +-
 .../Random/Uniform01WH.cpp}                        |   34 +-
 .../Random/Uniform01WH.h}                          |   77 +-
 src/Bpp/Numeric/Range.h                            |  543 ++++
 src/Bpp/Numeric/Stat/ContingencyTableTest.cpp      |  129 +
 .../Stat/ContingencyTableTest.h}                   |  101 +-
 .../Numeric/Stat/Mva/CorrespondenceAnalysis.cpp    |  114 +
 .../Stat/Mva/CorrespondenceAnalysis.h}             |   87 +-
 src/Bpp/Numeric/Stat/Mva/DualityDiagram.cpp        |  291 +++
 src/Bpp/Numeric/Stat/Mva/DualityDiagram.h          |  155 ++
 .../Stat/Mva/PrincipalComponentAnalysis.cpp        |  182 ++
 .../Numeric/Stat/Mva/PrincipalComponentAnalysis.h  |  138 +
 .../Io/IoSequence.h => Numeric/Stat/StatTest.h}    |   41 +-
 .../Stat/StatTools.cpp}                            |   38 +-
 .../Stat/StatTools.h}                              |   88 +-
 src/Bpp/Numeric/Table.h                            | 1222 +++++++++
 src/Bpp/Numeric/TableExceptions.h                  |  175 ++
 src/Bpp/Numeric/TransformedParameter.h             |  312 +++
 src/Bpp/Numeric/VectorExceptions.h                 |  155 ++
 .../VectorTools.cpp}                               |   97 +-
 src/Bpp/Numeric/VectorTools.h                      | 2007 +++++++++++++++
 src/Bpp/Seq/Alphabet/AbstractAlphabet.cpp          |  317 ---
 src/Bpp/Seq/Alphabet/AbstractAlphabet.h            |  276 --
 src/Bpp/Seq/Alphabet/Alphabet.h                    |  459 ----
 src/Bpp/Seq/Alphabet/AlphabetExceptions.h          |  213 --
 src/Bpp/Seq/Alphabet/AlphabetState.h               |  132 -
 src/Bpp/Seq/Alphabet/AlphabetTools.cpp             |  126 -
 src/Bpp/Seq/Alphabet/AlphabetTools.h               |  231 --
 src/Bpp/Seq/Alphabet/BinaryAlphabet.cpp            |   59 -
 src/Bpp/Seq/Alphabet/BinaryAlphabet.h              |   86 -
 src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.cpp        |   97 -
 src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.h          |  124 -
 src/Bpp/Seq/Alphabet/CodonAlphabet.h               |  190 --
 src/Bpp/Seq/Alphabet/DNA.cpp                       |  147 --
 src/Bpp/Seq/Alphabet/DNA.h                         |   96 -
 src/Bpp/Seq/Alphabet/IntegerAlphabet.h             |   94 -
 src/Bpp/Seq/Alphabet/LetterAlphabet.h              |  123 -
 src/Bpp/Seq/Alphabet/NucleicAlphabet.h             |  281 --
 src/Bpp/Seq/Alphabet/NucleicAlphabetState.h        |  116 -
 src/Bpp/Seq/Alphabet/NumericAlphabet.cpp           |  189 --
 src/Bpp/Seq/Alphabet/NumericAlphabet.h             |  131 -
 src/Bpp/Seq/Alphabet/ProteicAlphabet.cpp           |  251 --
 src/Bpp/Seq/Alphabet/ProteicAlphabet.h             |  162 --
 src/Bpp/Seq/Alphabet/ProteicAlphabetState.h        |   82 -
 src/Bpp/Seq/Alphabet/RNA.cpp                       |  145 --
 src/Bpp/Seq/Alphabet/RNA.h                         |   93 -
 src/Bpp/Seq/Alphabet/RNY.cpp                       |  533 ----
 src/Bpp/Seq/Alphabet/RNY.h                         |  126 -
 src/Bpp/Seq/Alphabet/WordAlphabet.cpp              |  351 ---
 src/Bpp/Seq/Alphabet/WordAlphabet.h                |  345 ---
 src/Bpp/Seq/AlphabetIndex/AAChargeIndex.h          |  151 --
 .../AAChenGuHuangHydrophobicityIndex.h             |  122 -
 .../Seq/AlphabetIndex/AAChouFasmanAHelixIndex.h    |  111 -
 .../Seq/AlphabetIndex/AAChouFasmanBSheetIndex.h    |  111 -
 src/Bpp/Seq/AlphabetIndex/AAChouFasmanTurnIndex.h  |  111 -
 src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.cpp        |   85 -
 src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.h          |  102 -
 src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.cpp        |  104 -
 src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.h          |  117 -
 src/Bpp/Seq/AlphabetIndex/AAMassIndex.h            |  108 -
 src/Bpp/Seq/AlphabetIndex/AASEA1030Index.h         |  109 -
 src/Bpp/Seq/AlphabetIndex/AASEAInf10Index.h        |  109 -
 src/Bpp/Seq/AlphabetIndex/AASEASup30Index.h        |  109 -
 src/Bpp/Seq/AlphabetIndex/AASurfaceIndex.h         |  109 -
 src/Bpp/Seq/AlphabetIndex/AAVolumeIndex.h          |  111 -
 src/Bpp/Seq/AlphabetIndex/AlphabetIndex2.h         |  104 -
 .../Seq/AlphabetIndex/DefaultNucleotideScore.cpp   |  113 -
 src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.h |  109 -
 .../AlphabetIndex/GranthamAAChemicalDistance.cpp   |  108 -
 .../Seq/AlphabetIndex/GranthamAAChemicalDistance.h |  158 --
 .../Seq/AlphabetIndex/GranthamAAPolarityIndex.h    |  123 -
 src/Bpp/Seq/AlphabetIndex/GranthamAAVolumeIndex.h  |  126 -
 src/Bpp/Seq/AlphabetIndex/KleinAANetChargeIndex.h  |  124 -
 .../Seq/AlphabetIndex/MiyataAAChemicalDistance.h   |  116 -
 src/Bpp/Seq/AlphabetIndex/SimpleIndexDistance.h    |  134 -
 src/Bpp/Seq/AlphabetIndex/SimpleScore.h            |  106 -
 src/Bpp/Seq/AlphabetIndex/UserAlphabetIndex1.h     |  111 -
 src/Bpp/Seq/AlphabetIndex/__BLOSUM50MatrixCode     |  400 ---
 src/Bpp/Seq/AlphabetIndex/__GranthamMatrixCode     |  827 ------
 src/Bpp/Seq/AlphabetIndex/__MiyataMatrixCode       |  400 ---
 src/Bpp/Seq/App/SequenceApplicationTools.cpp       |  599 -----
 src/Bpp/Seq/App/SequenceApplicationTools.h         |  288 ---
 src/Bpp/Seq/CodonSiteTools.cpp                     |  837 ------
 src/Bpp/Seq/CodonSiteTools.h                       |  333 ---
 src/Bpp/Seq/Container/AbstractSequenceContainer.h  |  190 --
 src/Bpp/Seq/Container/AlignedSequenceContainer.cpp |  523 ----
 src/Bpp/Seq/Container/AlignedSequenceContainer.h   |  202 --
 .../Container/CompressedVectorSiteContainer.cpp    |  597 -----
 .../Seq/Container/CompressedVectorSiteContainer.h  |  290 ---
 src/Bpp/Seq/Container/MapSequenceContainer.cpp     |  466 ----
 src/Bpp/Seq/Container/MapSequenceContainer.h       |  240 --
 src/Bpp/Seq/Container/OrderedSequenceContainer.h   |  246 --
 src/Bpp/Seq/Container/SequenceContainer.h          |  316 ---
 .../Seq/Container/SequenceContainerExceptions.h    |  149 --
 src/Bpp/Seq/Container/SequenceContainerTools.cpp   |  226 --
 src/Bpp/Seq/Container/SequenceContainerTools.h     |  299 ---
 src/Bpp/Seq/Container/SiteContainer.h              |  183 --
 src/Bpp/Seq/Container/SiteContainerIterator.cpp    |  144 --
 src/Bpp/Seq/Container/SiteContainerIterator.h      |  128 -
 src/Bpp/Seq/Container/SiteContainerTools.cpp       | 1082 --------
 src/Bpp/Seq/Container/SiteContainerTools.h         |  497 ----
 src/Bpp/Seq/Container/VectorSequenceContainer.cpp  |  399 ---
 src/Bpp/Seq/Container/VectorSequenceContainer.h    |  306 ---
 src/Bpp/Seq/Container/VectorSiteContainer.cpp      |  862 -------
 src/Bpp/Seq/Container/VectorSiteContainer.h        |  240 --
 src/Bpp/Seq/DNAToRNA.h                             |  100 -
 src/Bpp/Seq/DistanceMatrix.h                       |  256 --
 .../AscidianMitochondrialGeneticCode.cpp           |  117 -
 .../GeneticCode/AscidianMitochondrialGeneticCode.h |  113 -
 .../EchinodermMitochondrialGeneticCode.cpp         |  116 -
 .../EchinodermMitochondrialGeneticCode.h           |  110 -
 src/Bpp/Seq/GeneticCode/GeneticCode.cpp            |  213 --
 src/Bpp/Seq/GeneticCode/GeneticCode.h              |  260 --
 .../InvertebrateMitochondrialGeneticCode.cpp       |  117 -
 .../InvertebrateMitochondrialGeneticCode.h         |  111 -
 .../GeneticCode/MoldMitochondrialGeneticCode.cpp   |  117 -
 .../Seq/GeneticCode/MoldMitochondrialGeneticCode.h |  111 -
 src/Bpp/Seq/GeneticCode/StandardGeneticCode.cpp    |  117 -
 src/Bpp/Seq/GeneticCode/StandardGeneticCode.h      |  111 -
 .../VertebrateMitochondrialGeneticCode.cpp         |  117 -
 .../VertebrateMitochondrialGeneticCode.h           |  113 -
 .../GeneticCode/YeastMitochondrialGeneticCode.cpp  |  117 -
 .../GeneticCode/YeastMitochondrialGeneticCode.h    |  112 -
 src/Bpp/Seq/Io/AbstractIAlignment.h                |  185 --
 src/Bpp/Seq/Io/AbstractISequence.h                 |  182 --
 src/Bpp/Seq/Io/AbstractOSequence.h                 |  107 -
 src/Bpp/Seq/Io/BppOAlignmentReaderFormat.cpp       |  123 -
 src/Bpp/Seq/Io/BppOAlignmentReaderFormat.h         |   94 -
 src/Bpp/Seq/Io/BppOAlignmentWriterFormat.cpp       |  116 -
 src/Bpp/Seq/Io/BppOAlignmentWriterFormat.h         |   96 -
 src/Bpp/Seq/Io/BppOAlphabetIndex1Format.cpp        |  154 --
 src/Bpp/Seq/Io/BppOAlphabetIndex1Format.h          |  114 -
 src/Bpp/Seq/Io/BppOAlphabetIndex2Format.cpp        |  124 -
 src/Bpp/Seq/Io/BppOAlphabetIndex2Format.h          |  114 -
 src/Bpp/Seq/Io/BppOSequenceReaderFormat.cpp        |  128 -
 src/Bpp/Seq/Io/BppOSequenceReaderFormat.h          |   95 -
 src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.h    |   93 -
 src/Bpp/Seq/Io/BppOSequenceWriterFormat.cpp        |   74 -
 src/Bpp/Seq/Io/BppOSequenceWriterFormat.h          |   94 -
 src/Bpp/Seq/Io/Clustal.cpp                         |  138 -
 src/Bpp/Seq/Io/Clustal.h                           |  146 --
 src/Bpp/Seq/Io/Dcse.cpp                            |   97 -
 src/Bpp/Seq/Io/Fasta.cpp                           |  292 ---
 src/Bpp/Seq/Io/Fasta.h                             |  214 --
 src/Bpp/Seq/Io/ISequence.h                         |  132 -
 src/Bpp/Seq/Io/ISequenceStream.h                   |   82 -
 src/Bpp/Seq/Io/IoSequenceFactory.cpp               |  109 -
 src/Bpp/Seq/Io/IoSequenceFactory.h                 |  124 -
 src/Bpp/Seq/Io/Mase.cpp                            |  313 ---
 src/Bpp/Seq/Io/Mase.h                              |  256 --
 src/Bpp/Seq/Io/MaseTools.cpp                       |  306 ---
 src/Bpp/Seq/Io/MaseTools.h                         |  146 --
 src/Bpp/Seq/Io/NexusIoSequence.cpp                 |  209 --
 src/Bpp/Seq/Io/NexusIoSequence.h                   |  150 --
 src/Bpp/Seq/Io/NexusTools.cpp                      |  119 -
 src/Bpp/Seq/Io/OSequence.h                         |  128 -
 src/Bpp/Seq/Io/OSequenceStream.h                   |   81 -
 src/Bpp/Seq/Io/PhredPhd.cpp                        |  138 -
 src/Bpp/Seq/Io/PhredPhd.h                          |  156 --
 src/Bpp/Seq/Io/PhredPoly.cpp                       |   97 -
 src/Bpp/Seq/Io/PhredPoly.h                         |   91 -
 src/Bpp/Seq/Io/Phylip.cpp                          |  304 ---
 src/Bpp/Seq/Io/Phylip.h                            |  196 --
 src/Bpp/Seq/Io/SequenceFileIndex.h                 |   75 -
 src/Bpp/Seq/Io/Stockholm.cpp                       |   83 -
 src/Bpp/Seq/Io/Stockholm.h                         |  120 -
 src/Bpp/Seq/Io/StreamSequenceIterator.cpp          |   97 -
 src/Bpp/Seq/Io/StreamSequenceIterator.h            |  138 -
 src/Bpp/Seq/NucleicAcidsReplication.cpp            |  120 -
 src/Bpp/Seq/NucleicAcidsReplication.h              |  105 -
 src/Bpp/Seq/Sequence.cpp                           |  222 --
 src/Bpp/Seq/Sequence.h                             |  465 ----
 src/Bpp/Seq/SequenceExceptions.h                   |  161 --
 src/Bpp/Seq/SequencePositionIterators.cpp          |  151 --
 src/Bpp/Seq/SequencePositionIterators.h            |  210 --
 src/Bpp/Seq/SequenceTools.cpp                      |  727 ------
 src/Bpp/Seq/SequenceTools.h                        |  435 ----
 src/Bpp/Seq/SequenceWalker.cpp                     |  107 -
 src/Bpp/Seq/SequenceWithAnnotation.cpp             |  303 ---
 src/Bpp/Seq/SequenceWithAnnotation.h               |  443 ----
 src/Bpp/Seq/SequenceWithAnnotationTools.cpp        |   91 -
 src/Bpp/Seq/SequenceWithAnnotationTools.h          |  207 --
 src/Bpp/Seq/SequenceWithQuality.h                  |  786 ------
 src/Bpp/Seq/SequenceWithQualityTools.cpp           |  194 --
 src/Bpp/Seq/SequenceWithQualityTools.h             |  175 --
 src/Bpp/Seq/Site.cpp                               |  101 -
 src/Bpp/Seq/Site.h                                 |  179 --
 src/Bpp/Seq/SiteExceptions.h                       |  124 -
 src/Bpp/Seq/SiteTools.cpp                          |  410 ---
 src/Bpp/Seq/SiteTools.h                            |  254 --
 src/Bpp/Seq/StringSequenceTools.cpp                |  344 ---
 src/Bpp/Seq/StringSequenceTools.h                  |  204 --
 src/Bpp/Seq/SymbolList.cpp                         |  442 ----
 src/Bpp/Seq/SymbolList.h                           |  745 ------
 src/Bpp/Seq/SymbolListTools.cpp                    |  197 --
 src/Bpp/Seq/SymbolListTools.h                      |  207 --
 src/Bpp/Seq/Transliterator.cpp                     |   72 -
 src/Bpp/Seq/Transliterator.h                       |  187 --
 src/Bpp/Text/KeyvalTools.cpp                       |  194 ++
 src/Bpp/Text/KeyvalTools.h                         |  138 +
 src/Bpp/Text/NestedStringTokenizer.cpp             |  153 ++
 src/Bpp/Text/NestedStringTokenizer.h               |   99 +
 src/Bpp/Text/StringTokenizer.cpp                   |  116 +
 src/Bpp/Text/StringTokenizer.h                     |  146 ++
 src/Bpp/Text/TextTools.cpp                         |  522 ++++
 src/Bpp/Text/TextTools.h                           |  416 +++
 src/Bpp/Utils/AttributesTools.cpp                  |  317 +++
 src/Bpp/Utils/AttributesTools.h                    |  245 ++
 src/Bpp/Utils/MapTools.h                           |  129 +
 .../{Seq/Alphabet/LetterAlphabet.cpp => Version.h} |   23 +-
 src/CMakeLists.txt                                 |  360 +--
 test/CMakeLists.txt                                |   90 +-
 test/PolynomialFunction.h                          |  127 +
 test/example.aln                                   | 2143 ----------------
 test/example.fasta                                 | 1702 -------------
 test/example.fastq                                 |   12 -
 test/example.gff                                   |   25 -
 test/example.mase                                  | 1500 -----------
 test/example.ph                                    | 2526 ------------------
 test/example.ph3                                   | 2601 -------------------
 test/test_alignment_scores.cpp                     |  102 -
 test/{test_containers.cpp => test_bfgs.cpp}        |   45 +-
 test/test_bowker.cpp                               |  101 -
 test/test_dAGraphObs.cpp                           |  159 ++
 test/test_derivative1.cpp                          |  117 +
 test/test_distributions.cpp                        |  155 ++
 test/{test_alphabets.cpp => test_downhill.cpp}     |   42 +-
 test/{test_alphabets.cpp => test_eigen.cpp}        |   52 +-
 .../test_gradient.cpp                              |   58 +-
 test/test_graphObs.cpp                             |  144 ++
 test/test_io.cpp                                   |   96 -
 test/{test_alphabets.cpp => test_matrices.cpp}     |   44 +-
 test/test_mva.cpp                                  |  175 ++
 .../Seq/DNAToRNA.cpp => test/test_numconstants.cpp |   56 +-
 test/{test_alphabets.cpp => test_powell.cpp}       |   42 +-
 test/test_range.cpp                                |  198 ++
 test/test_reparametrization.cpp                    |   98 +
 test/test_sample.cpp                               |  131 +
 test/test_sequences.cpp                            |   92 -
 test/test_simplex.cpp                              |  117 +
 test/{test_containers.cpp => test_stats.cpp}       |   65 +-
 test/test_text_tools.cpp                           |  112 +
 test/test_treeGraphObs.cpp                         |  178 ++
 test/test_walker.cpp                               |  119 -
 471 files changed, 56533 insertions(+), 54575 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..13d3d06
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+# files to be ignored
+
+BppCore.tag
+CMakeCache.txt
+CMakeFiles
+*.cmake
+Makefile
+html
+install_manifest.txt
+libbpp-core.*
+
+# file to be specifically not ignored by previous rules
+
+!/CTestConfig.cmake
+!/cmake/*
diff --git a/AUTHORS.txt b/AUTHORS.txt
index 2e617ee..e94402e 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -1,11 +1,10 @@
 Julien Dutheil <julien.dutheil at univ-montp2.fr>
 Sylvain Gaillard <sylvain.gaillard at angers.inra.fr>
-Khalid Belkhir <belkhir at univ-montp2.fr>
-Laurent Gueguen <gueguen at biomserv.univ-lyon1.fr>
-Sylvain Glémin <glemin at univ-montp2.fr>
-Guillaume Deuchst
-Eric Bazin
-Vincent Cahais
+Nicolas Galtier <galtier at univ-montp2.fr>
+Céline Scornavacca <scornava at lirmm.fr>
+Laurent Guéguen <gueguen at biomserv.univ-lyon1.fr>
+Ania Pawelczyk <ania.pawelczyk at gmail.com>
+François Gindraud <francois.gindraud at gmail.com>
 
 Contributed code to Bio++ was enabled thanks to the following institutions and resources:
 
@@ -16,9 +15,11 @@ Contributed code to Bio++ was enabled thanks to the following institutions and r
 2007 - 2010 Bioinformatics Research Center, University of Aarhus (Julien Dutheil).
             Funded by European research Area on Plant Genomics (ERA-PG) ARelatives.
 2010 -      ISE-M UMR CNRS 5554 Université Montpellier 2 (Julien Dutheil)
-2010 -      ISE-M UMR CNRS 5554 Université Montpellier 2 (Vincent Cahais)
+2011 -      Max Planck Institute for Terrestrial Microbiology (Julien Dutheil)
 2007 -      Genetics and Horticulture UMR INRA 1259 Angers-Nantes INRA Center (Sylvain Gaillard)
 2008 - 2009 Laboratoire BBE - UMR CNRS 5558 Université Lyon 1 (Bastien Boussau)
 2009 - 2010 Berkeley University (Bastien Boussau)
 2010 -      Laboratoire BBE - UMR CNRS 5558 Université Lyon 1 (Bastien Boussau)   
 2008 -      Laboratoire BBE - UMR CNRS 5558 Université Lyon 1 (Laurent Guéguen)
+2017 - 2018 Projet GrASP - LabEX Ecofect - Université de Lyon (François Gindraud)
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0c66d62..986cebf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,38 +1,22 @@
-# CMake script for Bio++ Sequence library
-# Author: Sylvain Gaillard and Julien Dutheil
-# Created: 20/08/2009
+# CMake script for Bio++ Core
+# Authors:
+#   Sylvain Gaillard
+#   Julien Dutheil
+#   Francois Gindraud (2017)
+# Created: 17/09/2010
+
+cmake_minimum_required (VERSION 2.8.11)
+project (bpp-core CXX)
+
+# Compile options
+set (CMAKE_CXX_FLAGS "-std=c++11 -Wall -Weffc++ -Wshadow -Wconversion")
 
-# Global parameters
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(bpp-seq CXX)
 IF(NOT CMAKE_BUILD_TYPE)
   SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
       "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
       FORCE)
 ENDIF(NOT CMAKE_BUILD_TYPE)
 
-SET(CMAKE_CXX_FLAGS "-Wall -Weffc++ -Wshadow -Wconversion")
-IF(NOT NO_VIRTUAL_COV)
-  SET(NO_VIRTUAL_COV FALSE CACHE BOOL
-      "Disable covariant return type with virtual inheritance, for compilers that do not support it."
-      FORCE)
-ENDIF(NOT NO_VIRTUAL_COV)
-
-IF(NO_VIRTUAL_COV)
-  MESSAGE("-- Covariant return with virtual inheritance disabled.")
-  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNO_VIRTUAL_COV=1")
-ENDIF(NO_VIRTUAL_COV)
-
-IF(NOT NO_DEP_CHECK)
-  SET(NO_DEP_CHECK FALSE CACHE BOOL
-      "Disable dependencies check for building distribution only."
-      FORCE)
-ENDIF(NOT NO_DEP_CHECK)
-
-IF(NO_DEP_CHECK)
-  MESSAGE("-- Dependencies checking disabled. Only distribution can be built.")
-ELSE(NO_DEP_CHECK)
-
 # Libtool-like version number
 # CURRENT:REVISION:AGE => file.so.(C-A).A.R
 # current:  The most recent interface number that this library implements.
@@ -41,46 +25,38 @@ ELSE(NO_DEP_CHECK)
 #           library implements.
 # In other words, the library implements all the interface numbers in the
 # range from number current - age to current.
-SET(BPPSEQ_VERSION_CURRENT "10")
-SET(BPPSEQ_VERSION_REVISION "3")
-SET(BPPSEQ_VERSION_AGE "1")
+SET(${PROJECT_NAME}_VERSION_CURRENT "2")
+SET(${PROJECT_NAME}_VERSION_REVISION "4")
+SET(${PROJECT_NAME}_VERSION_AGE "0")
 
 # Effective version number computation
-math(EXPR BPPSEQ_VERSION_MAJOR "${BPPSEQ_VERSION_CURRENT} - ${BPPSEQ_VERSION_AGE}")
-SET(BPPSEQ_VERSION_MINOR ${BPPSEQ_VERSION_AGE})
-SET(BPPSEQ_VERSION_PATCH ${BPPSEQ_VERSION_REVISION})
-SET(BPPSEQ_VERSION "${BPPSEQ_VERSION_MAJOR}.${BPPSEQ_VERSION_MINOR}.${BPPSEQ_VERSION_PATCH}")
-
-# Set the CMAKE_PREFIX_PATH for the find_library fonction when using non
-# standard install location
-IF(CMAKE_INSTALL_PREFIX)
-  SET(CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}" ${CMAKE_PREFIX_PATH})
-ENDIF(CMAKE_INSTALL_PREFIX)
-
-MACRO(IMPROVED_FIND_LIBRARY OUTPUT_LIBS lib_name include_to_find)
-  #start:
-  FIND_PATH(${lib_name}_INCLUDE_DIR ${include_to_find})
-  SET(${lib_name}_NAMES ${lib_name} ${lib_name}lib ${lib_name}dll)
-  FIND_LIBRARY(${lib_name}_LIBRARY NAMES ${${lib_name}_NAMES} PATH_SUFFIXES lib${LIB_SUFFIX})
-
-  IF(${${lib_name}_INCLUDE_DIR} MATCHES ${lib_name}_INCLUDE_DIR-NOTFOUND)
-    MESSAGE(FATAL_ERROR "${lib_name} required but not found.")
-  ELSE(${${lib_name}_INCLUDE_DIR} MATCHES ${lib_name}_INCLUDE_DIR-NOTFOUND)
-    MESSAGE("-- Library ${lib_name} found here:")
-    MESSAGE("   includes : ${${lib_name}_INCLUDE_DIR}")
-    MESSAGE("   libraries: ${${lib_name}_LIBRARY}")
-  ENDIF(${${lib_name}_INCLUDE_DIR} MATCHES ${lib_name}_INCLUDE_DIR-NOTFOUND)
-  
-  #add the dependency:
-  INCLUDE_DIRECTORIES(${${lib_name}_INCLUDE_DIR})
-  SET(${OUTPUT_LIBS} ${${OUTPUT_LIBS}} ${${lib_name}_LIBRARY})
-ENDMACRO(IMPROVED_FIND_LIBRARY)
-
-#Find the Bio++ libraries:
-IMPROVED_FIND_LIBRARY(LIBS bpp-core Bpp/Clonable.h)
-
-# Subdirectories
-ADD_SUBDIRECTORY(src)
+MATH(EXPR ${PROJECT_NAME}_VERSION_MAJOR "${${PROJECT_NAME}_VERSION_CURRENT} - ${${PROJECT_NAME}_VERSION_AGE}")
+SET(${PROJECT_NAME}_VERSION_MINOR ${${PROJECT_NAME}_VERSION_AGE})
+SET(${PROJECT_NAME}_VERSION_PATCH ${${PROJECT_NAME}_VERSION_REVISION})
+SET(${PROJECT_NAME}_VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}")
+
+set (PROJECT_VERSION ${${PROJECT_NAME}_VERSION})
+
+# CMake package
+set (cmake-package-location lib/cmake/${PROJECT_NAME})
+include (CMakePackageConfigHelpers)
+configure_package_config_file (
+  package.cmake.in
+  ${CMAKE_CURRENT_BINARY_DIR}/package.cmake
+  INSTALL_DESTINATION ${cmake-package-location}
+  )
+write_basic_package_version_file (
+  ${CMAKE_CURRENT_BINARY_DIR}/package-version.cmake
+  VERSION ${PROJECT_VERSION}
+  COMPATIBILITY SameMajorVersion
+  )
+install (FILES ${CMAKE_CURRENT_BINARY_DIR}/package.cmake DESTINATION ${cmake-package-location}
+  RENAME ${PROJECT_NAME}-config.cmake)
+install (FILES ${CMAKE_CURRENT_BINARY_DIR}/package-version.cmake DESTINATION ${cmake-package-location}
+  RENAME ${PROJECT_NAME}-config-version.cmake)
+
+# Define the libraries
+add_subdirectory (src)
 
 # Doxygen
 FIND_PACKAGE(Doxygen)
@@ -96,52 +72,25 @@ IF (DOXYGEN_FOUND)
     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
 ENDIF (DOXYGEN_FOUND)
 
-ENDIF(NO_DEP_CHECK)
-
 # Packager
-SET(CPACK_PACKAGE_NAME "libbpp-seq")
+SET(CPACK_PACKAGE_NAME "libbpp-core")
 SET(CPACK_PACKAGE_VENDOR "Bio++ Development Team")
-SET(CPACK_PACKAGE_VERSION "2.2.0")
+SET(CPACK_PACKAGE_VERSION "2.3.0")
 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
-SET(CPACK_PACKAGE_VERSION_MINOR "2")
+SET(CPACK_PACKAGE_VERSION_MINOR "3")
 SET(CPACK_PACKAGE_VERSION_PATCH "0")
-SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The Bio++ Sequence library")
+SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The Bio++ Core library")
 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING.txt")
 SET(CPACK_RESOURCE_FILE_AUTHORS "${CMAKE_SOURCE_DIR}/AUTHORS.txt")
 SET(CPACK_RESOURCE_FILE_INSTALL "${CMAKE_SOURCE_DIR}/INSTALL.txt")
 SET(CPACK_SOURCE_GENERATOR "TGZ")
-SET(CPACK_SOURCE_IGNORE_FILES
- "CMakeFiles"
- "Makefile"
- "_CPack_Packages"
- "CMakeCache.txt"
- ".*\\\\.cmake"
- ".*\\\\.git"
- ".*\\\\.gz"
- ".*\\\\.deb"
- ".*\\\\.rpm"
- ".*\\\\.dmg"
- ".*\\\\..*\\\\.swp"
- "src/\\\\..*"
- "src/libbpp*"
- "debian/tmp"
- "debian/libbpp.*/"
- "debian/libbpp.*\\\\.so.*"
- "debian/libbpp.*\\\\.a"
- "debian/libbpp.*\\\\.substvars"
- "debian/libbpp.*\\\\.debhelper"
- "debian/debhelper\\\\.log"
- "html"
- "Seq.tag"
- "Testing"
- "build-stamp"
- "install_manifest.txt"
- "DartConfiguration.tcl"
- ${CPACK_SOURCE_IGNORE_FILES}
-)
-IF (MACOS)
-  SET(CPACK_GENERATOR "Bundle")
-ENDIF()
+# /!\ This assumes that an external build is used
+SET(CPACK_SOURCE_IGNORE_FILES 
+       "/build/" 
+       "/\\\\.git/" 
+       "/\\\\.gitignore" 
+       ${CPACK_SOURCE_IGNORE_FILES}
+       )
 
 SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
 SET(CPACK_DEBSOURCE_PACKAGE_FILE_NAME "lib${CMAKE_PROJECT_NAME}_${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}.orig")
@@ -149,22 +98,8 @@ INCLUDE(CPack)
 
 #This adds the 'dist' target
 ADD_CUSTOM_TARGET(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
-# 'clean' is not (yet) a first class target. However, we need to clean the directories before building the sources:
-IF("${CMAKE_GENERATOR}" MATCHES "Make")
-  ADD_CUSTOM_TARGET(make_clean
-  COMMAND ${CMAKE_MAKE_PROGRAM} clean
-  WORKING_DIRECTORY ${CMAKE_CURRENT_DIR}
-  )
-  ADD_DEPENDENCIES(dist make_clean)
-ENDIF()
 
-IF(NOT NO_DEP_CHECK)
 IF (UNIX)
-#This creates deb packages:
-ADD_CUSTOM_TARGET(origdist COMMAND cp ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz ../${CPACK_DEBSOURCE_PACKAGE_FILE_NAME}.tar.gz)
-ADD_DEPENDENCIES(origdist dist)
-ADD_CUSTOM_TARGET(deb dpkg-buildpackage -uc -us -i${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz)
-ADD_DEPENDENCIES(deb origdist)
 
 #This creates rpm packages:
 ADD_CUSTOM_TARGET(rpm rpmbuild -ta ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz)
@@ -176,10 +111,9 @@ SET(CTEST_UPDATE_TYPE git)
 SET(UPDATE_COMMAND "git")
 SET(UPDATE_OPTIONS "")
 
-ENABLE_TESTING()
-INCLUDE(CTest)
-IF (BUILD_TESTING)
-  ADD_SUBDIRECTORY(test)
-ENDIF(BUILD_TESTING)
-
-ENDIF(NOT NO_DEP_CHECK)
+# Tests
+enable_testing ()
+include (CTest)
+if (BUILD_TESTING)
+  add_subdirectory (test)
+endif (BUILD_TESTING)
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
new file mode 100644
index 0000000..9a54c4e
--- /dev/null
+++ b/CTestConfig.cmake
@@ -0,0 +1,13 @@
+## This file should be placed in the root directory of your project.
+## Then modify the CMakeLists.txt file in the root directory of your
+## project to incorporate the testing dashboard.
+## # The following are required to uses Dart and the Cdash dashboard
+##   ENABLE_TESTING()
+##   INCLUDE(CTest)
+set(CTEST_PROJECT_NAME "bpp-core")
+set(CTEST_NIGHTLY_START_TIME "00:00:00 CEST")
+
+set(CTEST_DROP_METHOD "http")
+set(CTEST_DROP_SITE "biopp.univ-montp2.fr")
+set(CTEST_DROP_LOCATION "/dashboard/submit.php?project=bpp-core")
+set(CTEST_DROP_SITE_CDASH TRUE)
diff --git a/ChangeLog b/ChangeLog
index de92f4c..5d4ff6f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,433 +1,75 @@
-23/09/14 -*- Version 2.2.0 -*- 
+10/0(/17 -*- Version 2.3.0 -*-
 
-23/09/14 Julien Dutheil
-* Fixed bug #73
+26/04/16 Julien Dutheil
+* Upgrading to C++11
 
-16/09/14 Julien Dutheil
-* Fixed bug #79
-
-24/07/14 Julien Dutheil
-* Alphabet code gets a refreshment!
-
-05/03/13 -*- Version 2.1.0 -*- 
-
-07/02/13 Julien Dutheil
-* StateProperties => Alphabet index (dir renamed).
-* New BppO classes forAlphabet Index 1 and 2, and corresponding methods in SequenceApplicationTools.
+10/07/14 Thomas Bigot
+* New graph structures
 
-19/01/13 Julien Dutheil
-* Compiles with -Wconversion.
+17/09/14 -*- Version 2.2.0 -*-
 
-09/01/13 Julien Dutheil
-* Use size_t instead of unsigned int for indexes in containers.
-
-17/09/12 Julien Dutheil
-* Reorganized IO classes.
+16/09/14 Julien Dutheil
+* Fixed bug in transformed parameters!
+  Derivative of tanh was incorrectly set to 1/cosh(x^2) instead of 1 / cosh^2(x) :s
+* Bug #88 fixed.
 
-11/09/12 Julien Dutheil
-* Added generic container converter function.
+12/06/14 Julien Dutheil
+* Added --warning argument to BppApplication + new gestion of warnings.
 
-30/07/12 Julien Dutheil
-* Moved features, fastq and maf to new bpp-seq-omics library.
+14/04/14 Julien Dutheil
+* Added --seed argument to BppApplication to set random seed.
 
-18/07/12 Julien Dutheil
-* Bug fixed in merge maf iterator, in case a sequence is missing in one of the two blocks.
+04/03/13 -*- Version 2.1.0 -*-
 
-25/06/12 Julien Dutheil
-* Extended maf tools and reorganization of the code.
-* Extended GFF output.
-* New [] operator in SequenceFeatureSet.
+06/02/13 Julien Dutheil
+* Fixed bug #60
+* Fixed bug #63
 
-18/06/12 Julien Dutheil
-* Fixed bug in Maf parser: scores are now parsed correctly.
+18/01/13 Julien Dutheil
+* Now compiles with -Wconversion
+* Several code formating update
 
-08/03/12 Julien Dutheil
-* Added support for '*' character in proteins (stop codon)
+09/01/13 Julien Dutheil
+* Bug 59 fixed.
 
 09/02/12 -*- Version 2.0.3 -*-
 
-16/01/12 Julien Dutheil
-* Bug #42 solved, new support for extended fasta parser in application tools.
-* Added contribution from Benoit Nabholz and Annabelle Haudry on 4-fold degenerated sites.
-
-06/01/12 Julien Dutheil
-* Added support for "!" state in nucleic alphabet, which can be either a gap or an unknown character.
+24/01/12 Julien Dutheil and Ania Pawelczyk
+* Added Linear Assignment Problem function in MatrixTools.
 
 24/11/11 Julien Dutheil
-* Added SequenceWalker class and test.
-
-22/11/11 Sylvain Gaillard
-* Added support for FastQ
-
-21/11/11 Julien Dutheil
-* Added support for GFF3.
-
-21/11/11 Sylvain Gaillard
-* Bug #35 solved.
-
-18/11/11 Julien Dutheil
-* New MafIterators: SequenceStatistics and PairwiseSequenceStatistics.
-* Function SequenceTools::getPercentIdentity now allows to exclude gaps.
+* NestedStringTokenizer now inherits from StringTokenizer.
 
-15/09/11 Julien Dutheil
-* Merge function of SequenceWithAnnotation now also merges annotations properly.
-
-17/06/11 Julien Dutheil
-* Bug #39 solved.
+22/11/11 Julien Dutheil
+* Added unit testing for matrices
+* Added new Range and MultiRange classes + unit test.
 
 09/06/11 -*- Version 2.0.2 -*-
 
-08/06/11 Julien Dutheil
-* Fixed several Maf iterators.
+22/03/11 Mathieu Groussin
+* Added classes for mutivariate analysis.
+
+18/03/11 Mathieu Groussin
+* Added Hadamard product function in MatrixTools.
 
 28/02/11 -*- Version 2.0.1 -*-
 
-* Fixed debian packaging. 
+25/02/11 Julien Dutheil
+* Fixed CMakeLists.txt: added RColorSet.cpp file to compilation chain!
 
 07/02/11 -*- Version 2.0.0 -*-
 
-19/11/10 Julien Dutheil
-* Solved bug 0000016 (General comments not copied in containers).
-* A few more code cleaning.
-
-01/11/10 Julien Dutheil
-* Solved bug 0000005 (Clustal parser).
-* Added unit testing for sequence input format.
-* Solved bug 0000004 (Remove gap sites in SiteContainer).
-
-12/10/10 Benoît Nabholz
-* Added yeast mitochondrial codon alphabet and genetic code.
-
-20/09/10 Julien Dutheil
-* Reorganization of the code for version 2.0.
-
-06/09/10 Julien Dutheil
-* Added support for masked sequences in SequenceWithAnnotationTools and MafParser.
-
-05/09/10 Julien Dutheil
-* First draft of CaseMaskedAlphabet, for dealing with repeat-masked sequences for instance.
-
-21/07/10 Julien Dutheil
-* Added method hasSequence(name) in SequenceContainer interface.
-
-20/07/10 Julien Dutheil
-* New Sequence interface design.
-* Maf parser now reads quality scores if there are some.
-
-19/07/10 Julien Dutheil
-* New method isInit in CodonAlphabet.
-* New method getCDS in SequenceTools.
-
-28/04/10 Julien Dutheil
-* New MAF genome alignment parser.
-
-22/04/10 Sylvain Gaillard
-* Break SequenceTools interface:
-		- renamed invert -> getInvert
-		- renamed complement -> getComplement
-	now invert and complement methods deals with sequence ref
-		- New method invertComplement
-
-16/04/10 Julien Dutheil
-* New Stockholm sequence format (output only).
-* Refactoring of class ISequence2 => IAlignment + new interface OAlignment.
-
-24/03/10 -*- Version 1.7.0 -*-
-
-11/03/10 Julien Dutheil
-* Nexus format now deals with lower case keywords.
-
-17/12/09 Julien Dutheil
-* Code cleaning for VectorSiteContainer
-* New class CompressedVectorSiteContainer using less memory than
-  VectorSiteContainer, but more restricted.
-
-16/11/09 Sylvain Gaillard
-* No more "using namespace" in header files.
-
-04/11/09 Julien Dutheil
-* Remove SymbolListTools::randomizeContent to a more efficient SymbolList::shuffle
-method.
-
-12/10/09 Julien Dutheil
-* Now SeqLib compiles with -Weffc++ and -Wshadow without any warning :)
-
-22/09/09 Julien Dutheil
-* Finally added 'addSequence' method in SequenceContainer.
-* MapSequenceContainer now has a addSequence method that uses the name of the
-  sequence as a key by default.
-* Several methods in Sequence/SiteContainerTools are not templated anymore and
-  have been improved.
-
-09/09/09 Sylvain Gaillard
-* Fixed white space skip in Fasta sequence
-
-20/08/09 Julien Dutheil
-* Added config files for CMake.
-
-19/08/09 Sylvain Gaillard
-* Introduced 3 new interfaces IOSequenceStream, ISequenceStream and
-  OSequenceStream. These interfaces are intended to be used by IOFormat
-  dealing with Sequence and not SequenceContainers. They are actually
-  implemented by the Fasta class.
-
-17/08/09 Adam Smith
-* Bug fixed in DefaultAlphabet: unknow state is 37 not 38.
-
-04/08/09 Sylvain Gaillard
-* Introduced new classes for Alphabet States
-
-23/07/09 Sylvain Gaillard
-* Added SequenceTools::getPutativeHaplotypes
-
-22/07/09 Sylvain Gaillard
-* Added SequenceTools::getNumberOfUnresolvedSites
-* Updated SequenceTools::getNumberOfSites,
-	SequenceTools::getNumberOfCompleteSites and SequenceTools::removeGaps to be
-	Alphabet implementation independant.
-
-07/07/07 Julien Dutheil
-* Updated GranthamAAChemicalDistance, with a new signed, non-symmetric,
-	option.
-
-26/06/09 Sylvain Gaillard
-* Added new SequencePositionIterators classes.
-
-23/06/09 Julien Dutheil
-* Actualization of the Container classes: now returns references and not
-pointer. Several code updates, including copy contructors.
-
-17/06/09 Sylvain Gaillard (Glasgow Workshop)
-* Fix DNA/RNA/ProteicAlphabet::getAlias: works now with lower case states.
-* Fix SiteTools::isConstant test gap or unknown
-* Turning SequenceContainerTools::getFrequencies into void function.
-
-21/07/08 -*- Version 1.6.0 -*-
-
-28/05/09 Julien Dutheil
-* Added basic support for the Nexus format.
-
-22/05/09 Julien Dutheil
-* Improved Clustal format (solves bug found by Emmanuel M.)
-* SequenceApplicationTools uses the keyval syntax for format description.
-
-27/04/09 Julien Dutheil
-* Added site randomization method.
-
-28/02/09 Julien Dutheil
-* Added mutual information calculation.
-* Added pairwise counting methods.
-* Frequencies counting methods have been improved (avoid useless copy of maps).
-
-16/01/09 Julien Dutheil
-* max_gap_allowed option in SequenceApplicationTools is now a included bound:
-  0 or 0% will keep all complete sites, and 'n=number of sequences' or 100%
-	will keep all sites.
-
-13/01/09 Sylvain Gaillard
-* Little optimization in Fasta::write() method.
-
-12/01/09 Sylvain Gaillard
-* Added support for comments (HUPO-PSI like) in Fasta.
-
-08/01/09 Julien Dutheil
-* SequenceTools::reverse method has been deprecated in favor of the
-  SequenceTools::inverse method, of witch it is now an alias.
-
-07/01/09 Julien Dutheil
-* Code improvement in Vector containers.
-
-21/12/08 Julien Dutheil
-* Return type for clone() methods corrected (Sequence, Site, SiteContainer and derivated classes).
-* Bug fixed in SequenceApplicationTools::get[Sequence/Site]Container, phylip format.
-
-21/07/08 -*- Version 1.5.0 -*-
-
-05/12/08 Julien Dutheil
-* VectorSiteContainer::getSite() faster (more than 10 times faster on a ~500
-	sequences data set!)
-
-04/12/08 Julien Dutheil
-* Fixed missing redefinition of translate and reverse methods in class DNAToRNA.
-* Made inheritance virtual.
-
-01/12/08 Julien Dutheil
-* New methods getSupportedInts and getSupportedChars in Alphabet classes.
-
-18/11/08 Julien Dutheil
-* biopp-help-forum 91 (by Stephen Smith): Fasta, Mase, Clustal and Phylip now
-  have an option to turn off the name checking and decrease loading time.
-* biopp-help-forum 93 (by Stephen Smith): Phylip format now supports any
- delimiter when reading/writing files in extended format.
-
-14/11/08 Sylvain Gaillard
-* New method SequenceTools::subtractHaplotype(Sequence, Sequence, string,
-  unsigned int).
-
-07/11/08 Julien Dutheil
-* New contructor in VectorSiteContainer now as a tag to disable position
-  checking, which can turn to be quite slow.
-
-06/11/08 Sylvain Gaillard
-* New class PhredPhd to read sequence from phd files produced by the phred
-  program
-* Removed an unused method in PhredPoly
-
-05/11/08 Sylvain Gaillard
-* New methods Alphabet::getGeneric(states) implemented in AbstractAlphabet,
-  DefaultAlphabet, DNA, RNA and ProteicAlphabet.
-* New alphabet exception CharStateNotSupportedException.
-* New class PhredPoly to read sequence from poly files produced by the phred
-  program.
-* Fixed heterozygous site read in PhredPoly.
-
-09/10/08 Julien Dutheil
-* New method SequenceTools::invert(Sequence).
-
-24/09/08 Bastien Boussau & Julien Dutheil
-* Memory leak fixed in Fasta and Mase readers.
-
-21/07/08 -*- Version 1.4.1 -*-
-
-26/06/08 Julien Dutheil
-* Bug fixed in Clustal format.
-
-20/04/08 Julien Dutheil
-* New interface ISequence2 for reading alignments.
-
-18/03/08 Julien Dutheil and Bastien Boussau
-* Bowker's test for homogeneity implemented in SequenceTools.
-
-08/02/08 Julien Dutheil
-* Bug fixed in VectorSequenceContainer: method addSequence is now virtual!
-  (thanks to Laurent Gueguen for pointing out this bug)!.
-
-07/02/08 Julien Dutheil
-* Added function isDNAAlphabet and isRNAAlphabet in AlphabetTools.
-* Bug fixed in getAlphabetFromSequence method.
-* Method getContent in Sequence and Site now outputs a reference.
-
-18/01/08 -*- Version 1.4.0 -*-
-
-09/01/08 Julien Dutheil
-* All classes included in the new 'bpp' namespace.
-
-06/11/07 Julien Dutheil
-* New function SequenceContainerTools::merge.
-
-02/10/07 Julien Dutheil
-* New class GenBank, enabling GenBank sequence format support for input.
-* Added new copy constructors from SequenceContainer in
-  Vector[Site/Sequence]Container.
-* New methods changeUnresolvedCharacterToGaps and changeGapsToUnknownCharacters in SymbolListTools.
-* Bug fixed in changeUnresolvedCharacterToGaps in SiteContainerTools.
-
-06/07/07 -*- Version 1.3.0 -*-
-
-12/06/07 Julien Dutheil
-* More tools in class alphabet (isGap, isUnresolved, etc.)
-* New class DistanceMatrix, previously in phyllib.
-* New similarity measures in SiteContainerTools.
-
-04/06/07 Julien Dutheil
-* New constructor from sequence names in VectorSiteContainer.
-
-01/06/07 Julien Dutheil
-* New method SiteContainerTools::boostrapSites to bootstrap an alignment.
-
-21/05/07 Julien Dutheil
-* New method SequenceContainerTools::getSequenceContainer to read non-aligned
-  sequences.
-
-04/05/07 Julien Dutheil
-* Bug fixed in global alignment with gap opening and extending penalties.
-* New generic score scheme.
-* Compatibility update (NumCalc)
-
-24/04/07 Benoît Nabholz & Julien Dutheil
-* GeneticCode classes can now translate unknow codons to unknown amino acids.
-
-02/04/07 Julien Dutheil
-* VIRTUAL_COV variable changed to NO_VIRTUAL_COV. configure.ac file updated.
-  => Default behaviour is now /really/ to use covariant return type with
-	virtual inheritence, even when importing the files in an IDE. To use the old
-	compilers behaviour, one must set the NO_VIRTUAL_COV preproc variable.
-* this modification also solves a problem with the old configure.ac which
-  was not correctly updated in version 1.2.0 :(
-* Bug fixed in SymbolListTools::getCounts.
-
-02/04/07 Julien Dutheil
-* New method getAlphabetIndex1() in class SimpleIndexDistance.
-
-24/02/07 Julien Dutheil
-* New pairwise alignment algorithm: gap opening and extending penalties.
-	
-22/02/07 Julien Dutheil
-* GeneticCode derivated classes now properly redefine the translate(Sequence&)
-	method.
-
-19/01/07 -*- Version 1.2.0 -*-
-
-19/01/07 Julien Dutheil
-* Functions AlphabetTools::getType() and StringSequenceTools::getAlphabetFromSequence() rewritten.
-* New DefaultNucleotideScore matrix.
-* New AAIndex1Entry and AAIndex2Entry classes which create AlphabetIndex1 and
-AlphabetIndex2 objects from AAIndex1 and AAIndex2 entries, respectively.
-
-18/12/06 Julien Dutheil
-* New alignment tools in SiteContainerTools, including the Needleman and
-Wunsch alogrithm.
-* BLOSUM50 matrix available.
-* Bug fixed in Sequence.h: method setContent is now properly redefined.
-* Bug fixed in ProteicAlphabet->getAbbr(int). The returned result is now
-correct!!!
-
-06/12/06 Julien Dutheil
-* DefaultAlphabet now accepts "." characters.
-* New AlphabetTools::isDefaultAlphabet(const Alphabet *) method.
-* New SiteContainerTools::resolveDottedAlignment(const Sitecontainer &, const Alphabet *) method.
-
-30/08/06 Julien Dutheil
-* Bug fixed in phylip sequential reader, + duplicated sequence in container
-now throws sequence name. (included in 1.1.1 release).
-
-28/08/06 -*- Version 1.1.1 -*-
-
-08/08/06 Julien Dutheil
-* Bug fixed in Phylip sequential read method.
-
-15/06/06 Julien Dutheil
-* Method changeGapsToUnknownCharacters() moved from SequenceContainerTools to
-SiteContainerTools, and is really faster!
-* New removeGapOnlySites() method in SiteContainerTools.
-* New method SiteTools::isGapOnly().
-* new 'sequence.max_gap_allowed' option in SequenceApplicationTools::getSitesToAnalyse().
-
-13/06/06 Julien Dutheil
-* Phylip sequential format improved, no more empty line between sequences
-needed.
-
-12/06/06 Julien Dutheil
-* SiteTools::isConstant() method now has a 'ignoreUnknown' option.
-
-01/01/06 Julien Dutheil
-* VectorSiteContainer and AlignedSequenceContainer now number sites from 1 (and not 0). 
-
-17/05/06 Benoît Nabholz, Sylvain Glémin & Julien Dutheil
-* Bug fixed in SiteContainerTools::getConsensus(), + SymbolListTools::getFrequencies() and getCounts() improved.
-
-15/05/06 Julien Dutheil
-* Bug fixed: Added getUnknownCharacterCode() method in DefaultAlphabet.
-
-09/05/06 Julien Dutheil
-* New AAChargeIndex class.
-* Bug fixed in SiteTools::hasUnknown(Site).
+09/11/10 Julien Dutheil
+* Added chisq test on contingency table.
+* Removed NumTools::pow which was incorrect. Use std::pow instead.
 
-18/04/06 -*- Version 1.1.0 -*-
+05/11/10 Julien Dutheil
+* In VectorTools: posmin -> whichMin, whichmax -> whichMax. Also recoded a bit more efficiently.
 
-18/04/06 Julien Dutheil
-* New IOSequenceFactory class.
+27/10/10 Julien Dutheil
+* Added unit testing
+* [0000003] Fixed downhill simplex method! Did not work when initial point was 0!
 
-06/04/06 Julien Dutheil
-* New () function operators defined on SequenceContainers.
+17/09/10 Julien Dutheil
+* Initial draft of bpp-core from old bpp-utils and bpp-numcalc.
 
diff --git a/Doxyfile b/Doxyfile
index eab3c61..df39478 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,358 +1,406 @@
-# Doxyfile 1.8.3.1-20130209
+# Doxyfile 1.8.11
 
 # This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
+# doxygen (www.doxygen.org) for a project.
 #
-# All text after a hash (#) is considered a comment and will be ignored
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
 # The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file 
-# that follow. The default is UTF-8 which is also the encoding used for all 
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
-# iconv built into libc) for the transcoding. See 
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
 
-# The PROJECT_NAME tag is a single word (or sequence of words) that should 
-# identify the project. Note that if you do not use Doxywizard you need 
-# to put quotes around the project name if it contains spaces.
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
 
-PROJECT_NAME           = bpp-seq
+PROJECT_NAME           = bpp-core
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
 
-PROJECT_NUMBER         = 2.2.0
+PROJECT_NUMBER         = 2.3.0
 
-# Using the PROJECT_BRIEF tag one can provide an optional one line description 
-# for a project that appears at the top of each page and should give viewer 
-# a quick idea about the purpose of the project. Keep the description short.
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
 
 PROJECT_BRIEF          = 
 
-# With the PROJECT_LOGO tag one can specify an logo or icon that is 
-# included in the documentation. The maximum height of the logo should not 
-# exceed 55 pixels and the maximum width should not exceed 200 pixels. 
-# Doxygen will copy the logo to the output directory.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
 
 PROJECT_LOGO           = 
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       = 
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
-# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, Persian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, 
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
+# The default value is: YES.
 
 REPEAT_BRIEF           = YES
 
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
 
 ABBREVIATE_BRIEF       = 
 
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
 # description.
+# The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
+# The default value is: NO.
 
 INLINE_INHERITED_MEMB  = YES
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
 
 FULL_PATH_NAMES        = YES
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip. Note that you specify absolute paths here, but also 
-# relative paths, which will be relative from the directory where doxygen is 
-# started.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
 STRIP_FROM_PATH        = ./src/
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
 
 STRIP_FROM_INC_PATH    = ./src/
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful if your file system 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like regular Qt-style comments 
-# (thus requiring an explicit @brief command for a brief description.)
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
 
 JAVADOC_AUTOBRIEF      = NO
 
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-# interpret the first line (until the first dot) of a Qt-style 
-# comment as the brief description. If set to NO, the comments 
-# will behave just like regular Qt-style comments (thus requiring 
-# an explicit \brief command for a brief description.)
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
 
 QT_AUTOBRIEF           = NO
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
 
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
 
 TAB_SIZE               = 2
 
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
 
 ALIASES                = 
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only). 
-# A mapping has the form "name=value". For example adding 
-# "class=itcl::class" will allow you to use the command class in the 
-# itcl::class meaning.
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
 
 TCL_SUBST              = 
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_FOR_C  = NO
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Java. For instance, namespaces will be presented as packages, qualified 
-# scopes will look different, etc.
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Fortran.
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
 
 OPTIMIZE_FOR_FORTRAN   = NO
 
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
-# sources. Doxygen will then generate output that is tailored for 
-# VHDL.
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
-# Doxygen selects the parser to use depending on the extension of the files it 
-# parses. With this tag you can assign which parser to use for a given 
-# extension. Doxygen has a built-in mapping, but you can override or extend it 
-# using this tag. The format is ext=language, where ext is a file extension, 
-# and language is one of the parsers supported by doxygen: IDL, Java, 
-# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, 
-# C++. For instance to make doxygen treat .inc files as Fortran files (default 
-# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note 
-# that for custom extensions you also need to set FILE_PATTERNS otherwise the 
-# files are not read by doxygen.
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
 
 EXTENSION_MAPPING      = 
 
-# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all 
-# comments according to the Markdown format, which allows for more readable 
-# documentation. See http://daringfireball.net/projects/markdown/ for details. 
-# The output of markdown processing is further processed by doxygen, so you 
-# can mix doxygen, HTML, and XML commands with Markdown formatting. 
-# Disable only in case of backward compatibilities issues.
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
 
 MARKDOWN_SUPPORT       = YES
 
-# When enabled doxygen tries to link words that correspond to documented classes, 
-# or namespaces to their corresponding documentation. Such a link can be 
-# prevented in individual cases by by putting a % sign in front of the word or 
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
 # globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
 
 AUTOLINK_SUPPORT       = YES
 
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
-# to include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also makes the inheritance and collaboration 
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
 # diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
 
 BUILTIN_STL_SUPPORT    = YES
 
-# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
 # enable parsing support.
+# The default value is: NO.
 
 CPP_CLI_SUPPORT        = NO
 
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
-# Doxygen will parse them like normal C++ but will assume all classes use public 
-# instead of private inheritance when no explicit protection keyword is present.
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
 
 SIP_SUPPORT            = NO
 
-# For Microsoft's IDL there are propget and propput attributes to indicate 
-# getter and setter methods for a property. Setting this option to YES (the 
-# default) will make doxygen replace the get and set methods by a property in 
-# the documentation. This will only work if the methods are indeed getting or 
-# setting a simple type. If this is not the case, or you want to show the 
-# methods anyway, you should set this option to NO.
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
 
 IDL_PROPERTY_SUPPORT   = YES
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
+# The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
 
 SUBGROUPING            = YES
 
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and 
-# unions are shown inside the group in which they are included (e.g. using 
-# @ingroup) instead of on a separate page (for HTML and Man pages) or 
-# section (for LaTeX and RTF).
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
 
 INLINE_GROUPED_CLASSES = NO
 
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and 
-# unions with only public data fields or simple typedef fields will be shown 
-# inline in the documentation of the scope in which they are defined (i.e. file, 
-# namespace, or group documentation), provided this scope is documented. If set 
-# to NO (the default), structs, classes, and unions are shown on a separate 
-# page (for HTML and Man pages) or section (for LaTeX and RTF).
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
 
 INLINE_SIMPLE_STRUCTS  = NO
 
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
-# is documented as struct, union, or enum with the name of the typedef. So 
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
-# with name TypeT. When disabled the typedef will appear as a member of a file, 
-# namespace, or class. And the struct will be named TypeS. This can typically 
-# be useful for C code in case the coding convention dictates that all compound 
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
 # types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
 
 TYPEDEF_HIDES_STRUCT   = NO
 
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
-# determine which symbols to keep in memory and which to flush to disk. 
-# When the cache is full, less often used symbols will be written to disk. 
-# For small to medium size projects (<1000 input files) the default value is 
-# probably good enough. For larger projects a too small cache size can cause 
-# doxygen to be busy swapping symbols to and from disk most of the time 
-# causing a significant performance penalty. 
-# If the system has enough physical memory increasing the cache will improve the 
-# performance by keeping more symbols in memory. Note that the value works on 
-# a logarithmic scale so increasing the size by one will roughly double the 
-# memory usage. The cache size is given by this formula: 
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-# SYMBOL_CACHE_SIZE      = 0
-
-# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be 
-# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given 
-# their name and scope. Since this can be an expensive process and often the 
-# same symbol appear multiple times in the code, doxygen keeps a cache of 
-# pre-resolved symbols. If the cache is too small doxygen will become slower. 
-# If the cache is too large, memory is wasted. The cache size is given by this 
-# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols.
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
 
 LOOKUP_CACHE_SIZE      = 0
 
@@ -360,1195 +408,1576 @@ LOOKUP_CACHE_SIZE      = 0
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PRIVATE        = YES
 
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal 
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
 # scope will be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PACKAGE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
 
 EXTRACT_LOCAL_METHODS  = NO
 
-# If this flag is set to YES, the members of anonymous namespaces will be 
-# extracted and appear in the documentation as a namespace called 
-# 'anonymous_namespace{file}', where file will be replaced with the base 
-# name of the file that contains the anonymous namespace. By default 
-# anonymous namespaces are hidden.
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
 
 EXTRACT_ANON_NSPACES   = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
 
 CASE_SENSE_NAMES       = YES
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
 
 SHOW_INCLUDE_FILES     = YES
 
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
-# will list include files with double quotes in the documentation 
-# rather than with sharp brackets.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
 
 FORCE_LOCAL_INCLUDES   = NO
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
-# will sort the (brief and detailed) documentation of class members so that 
-# constructors and destructors are listed first. If set to NO (the default) 
-# the constructors will appear in the respective orders defined by 
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
 
 SORT_MEMBERS_CTORS_1ST = NO
 
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
-# hierarchy of group names into alphabetical order. If set to NO (the default) 
-# the group names will appear in their defined order.
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
 
 SORT_GROUP_NAMES       = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to 
-# do proper type resolution of all parameters of a function it will reject a 
-# match between the prototype and the implementation of a member function even 
-# if there is only one candidate or it is obvious which candidate to choose 
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen 
-# will still accept a match between prototype and implementation in such cases.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
 
 STRICT_PROTO_MATCHING  = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
 
 GENERATE_TESTLIST      = NO
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
 
 GENERATE_BUGLIST       = NO
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if section-label ... \endif 
-# and \cond section-label ... \endcond blocks.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
 
 ENABLED_SECTIONS       = 
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or macro consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and macros in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
 # list will mention the files that were used to generate the documentation.
+# The default value is: YES.
 
 SHOW_USED_FILES        = YES
 
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
-# This will remove the Files entry from the Quick Index and from the 
-# Folder Tree View (if specified). The default is YES.
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
 
 SHOW_FILES             = YES
 
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
-# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
-# and from the Folder Tree View (if specified). The default is YES.
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
 
 SHOW_NAMESPACES        = YES
 
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from 
-# the version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
 
 FILE_VERSION_FILTER    = 
 
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
-# by doxygen. The layout file controls the global structure of the generated 
-# output files in an output format independent way. To create the layout file 
-# that represents doxygen's defaults, run doxygen with the -l option. 
-# You can optionally specify a file name after the option, if omitted 
-# DoxygenLayout.xml will be used as the name of the layout file.
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
 
 LAYOUT_FILE            = 
 
-# The CITE_BIB_FILES tag can be used to specify one or more bib files 
-# containing the references data. This must be a list of .bib files. The 
-# .bib extension is automatically appended if omitted. Using this command 
-# requires the bibtex tool to be installed. See also 
-# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style 
-# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this 
-# feature you need bibtex and perl available in the search path. Do not use 
-# file names with spaces, bibtex cannot handle them.
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
 
 CITE_BIB_FILES         = 
 
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
 
 QUIET                  = NO
 
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
 
 WARN_LOGFILE           = 
 
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
 
 INPUT                  = src
 
-# This tag can be used to specify the character encoding of the source files 
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
-# also the default input encoding. Doxygen uses libiconv (or the iconv built 
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
-# the list of possible encodings.
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py 
-# *.f90 *.f *.for *.vhd *.vhdl
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
 
 FILE_PATTERNS          = *.h \
                          *.cpp
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
 
 RECURSIVE              = YES
 
-# The EXCLUDE tag can be used to specify files and/or directories that should be 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag. 
-# Note that relative paths are relative to the directory from which doxygen is 
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
 # run.
 
 EXCLUDE                = 
 
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or 
-# directories that are symbolic links (a Unix file system feature) are excluded 
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
 # from the input.
+# The default value is: NO.
 
 EXCLUDE_SYMLINKS       = NO
 
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
 
 EXCLUDE_PATTERNS       = 
 
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the 
-# output. The symbol name can be a fully qualified name, a word, or if the 
-# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
 # AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
 
 EXCLUDE_SYMBOLS        = 
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
 
 EXAMPLE_PATH           = 
 
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
 
 EXAMPLE_PATTERNS       = 
 
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
 
 IMAGE_PATH             = 
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 INPUT_FILTER           = 
 
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty or if 
-# non of the patterns match the file name, INPUT_FILTER is applied.
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 FILTER_PATTERNS        = 
 
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
 
 FILTER_SOURCE_FILES    = NO
 
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) 
-# and it is also possible to disable source filtering for a specific pattern 
-# using *.ext= (so without naming a filter). This option only has effect when 
-# FILTER_SOURCE_FILES is enabled.
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
 
 FILTER_SOURCE_PATTERNS = 
 
-# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that 
-# is part of the input, its contents will be placed on the main page (index.html). 
-# This can be useful if you have a project on for instance GitHub and want reuse 
-# the introduction page also for the doxygen output.
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
 
 USE_MDFILE_AS_MAINPAGE = 
 
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
 
 SOURCE_BROWSER         = YES
 
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C, C++ and Fortran comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES 
-# then for each documented function all documented 
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
 
 REFERENCED_BY_RELATION = YES
 
-# If the REFERENCES_RELATION tag is set to YES 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
 
 REFERENCES_RELATION    = YES
 
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
-# link to the source code.  Otherwise they will link to the documentation.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
 
 REFERENCES_LINK_SOURCE = YES
 
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
 
 USE_HTAGS              = NO
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
 
 VERBATIM_HEADERS       = YES
 
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          = 
+
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
 
 ALPHABETICAL_INDEX     = NO
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 IGNORE_PREFIX          = 
 
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header. Note that when using a custom header you are responsible  
-# for the proper inclusion of any scripts and style sheets that doxygen 
-# needs, which is dependent on the configuration options used. 
-# It is advised to generate a default header using "doxygen -w html 
-# header.html footer.html stylesheet.css YourConfigFile" and then modify 
-# that header. Note that the header is subject to change so you typically 
-# have to redo this when upgrading to a newer version of doxygen or when 
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_HEADER            = 
 
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FOOTER            = 
 
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If left blank doxygen will 
-# generate a default style sheet. Note that it is recommended to use 
-# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this 
-# tag will in the future become obsolete.
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_STYLESHEET        = 
 
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional 
-# user-defined cascading style sheet that is included after the standard 
-# style sheets created by doxygen. Using this option one can overrule 
-# certain style aspects. This is preferred over using HTML_STYLESHEET 
-# since it does not replace the standard style sheet and is therefor more 
-# robust against future updates. Doxygen will copy the style sheet file to 
-# the output directory.
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_STYLESHEET  = 
 
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
-# other source files which should be copied to the HTML output directory. Note 
-# that these files will be copied to the base HTML output directory. Use the 
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that 
-# the files will be copied as-is; there are no commands or markers available.
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_FILES       = 
 
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
-# Doxygen will adjust the colors in the style sheet and background images 
-# according to this color. Hue is specified as an angle on a colorwheel, 
-# see http://en.wikipedia.org/wiki/Hue for more information. 
-# For instance the value 0 represents red, 60 is yellow, 120 is green, 
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
-# The allowed range is 0 to 359.
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_HUE    = 220
 
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
-# the colors in the HTML output. For a value of 0 the output will use 
-# grayscales only. A value of 255 will produce the most vivid colors.
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_SAT    = 100
 
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
-# the luminance component of the colors in the HTML output. Values below 
-# 100 gradually make the output lighter, whereas values above 100 make 
-# the output darker. The value divided by 100 is the actual gamma applied, 
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
-# and 100 does not change the gamma.
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_GAMMA  = 80
 
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
-# page will contain the date and time when the page was generated. Setting 
-# this to NO can help when comparing the output of multiple runs.
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_TIMESTAMP         = YES
 
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-# documentation will contain sections that can be hidden and shown after the 
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
 # page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_DYNAMIC_SECTIONS  = YES
 
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of 
-# entries shown in the various tree structured indices initially; the user 
-# can expand and collapse entries dynamically later on. Doxygen will expand 
-# the tree to such a level that at most the specified number of entries are 
-# visible (unless a fully collapsed tree already exceeds this amount). 
-# So setting the number of entries 1 will produce a full collapsed tree by 
-# default. 0 is a special value representing an infinite number of entries 
-# and will result in a full expanded tree by default.
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_INDEX_NUM_ENTRIES = 100
 
-# If the GENERATE_DOCSET tag is set to YES, additional index files 
-# will be generated that can be used as input for Apple's Xcode 3 
-# integrated development environment, introduced with OSX 10.5 (Leopard). 
-# To create a documentation set, doxygen will generate a Makefile in the 
-# HTML output directory. Running make will produce the docset in that 
-# directory and running "make install" will install the docset in 
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
-# it at startup. 
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
 # for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_DOCSET        = YES
 
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
-# feed. A documentation feed provides an umbrella under which multiple 
-# documentation sets from a single provider (such as a company or product suite) 
-# can be grouped.
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
-DOCSET_FEEDNAME        = "Bio++ Sequence Library"
+DOCSET_FEEDNAME        = "Bio++ Core Library"
 
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
-# should uniquely identify the documentation set bundle. This should be a 
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
-# will append .docset to the name.
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
-DOCSET_BUNDLE_ID       = bpp.seq
+DOCSET_BUNDLE_ID       = bpp.core
 
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely 
-# identify the documentation publisher. This should be a reverse domain-name 
-# style string, e.g. com.mycompany.MyDocSet.documentation.
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
 
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_PUBLISHER_NAME  = Publisher
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
-# of the generated HTML documentation.
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_HTMLHELP      = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
 # written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_FILE               = 
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 HHC_LOCATION           = 
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
-# content.
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_INDEX_ENCODING     = 
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 BINARY_TOC             = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 TOC_EXPAND             = NO
 
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
-# that can be used as input for Qt's qhelpgenerator to generate a 
-# Qt Compressed Help (.qch) of the generated HTML documentation.
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_QHP           = NO
 
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
-# be used to specify the file name of the resulting .qch file. 
-# The path specified is relative to the HTML output folder.
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QCH_FILE               = 
 
-# The QHP_NAMESPACE tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#namespace
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_NAMESPACE          = org.doxygen.Project
 
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_VIRTUAL_FOLDER     = doc
 
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
-# add. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_NAME   = 
 
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
-# custom filter to add. For more information please see 
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
-# Qt Help Project / Custom Filters</a>.
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_ATTRS  = 
 
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
-# project's 
-# filter section matches. 
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
-# Qt Help Project / Filter Attributes</a>.
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_SECT_FILTER_ATTRS  = 
 
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
-# be used to specify the location of Qt's qhelpgenerator. 
-# If non-empty doxygen will try to run qhelpgenerator on the generated 
-# .qhp file.
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHG_LOCATION           = 
 
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
-# will be generated, which together with the HTML files, form an Eclipse help 
-# plugin. To install this plugin and make it available under the help contents 
-# menu in Eclipse, the contents of the directory containing the HTML and XML 
-# files needs to be copied into the plugins directory of eclipse. The name of 
-# the directory within the plugins directory should be the same as 
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
-# the help appears.
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_ECLIPSEHELP   = NO
 
-# A unique identifier for the eclipse help plugin. When installing the plugin 
-# the directory name containing the HTML and XML files should also have 
-# this name.
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
 
 ECLIPSE_DOC_ID         = org.doxygen.Project
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) 
-# at top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it. Since the tabs have the same information as the 
-# navigation tree you can set this option to NO if you already set 
-# GENERATE_TREEVIEW to YES.
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 DISABLE_INDEX          = NO
 
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
-# structure should be generated to display hierarchical information. 
-# If the tag value is set to YES, a side panel will be generated 
-# containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
-# Windows users are probably better off using the HTML help feature. 
-# Since the tree basically has the same information as the tab index you 
-# could consider to set DISABLE_INDEX to NO when enabling this option.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_TREEVIEW      = YES
 
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values 
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML 
-# documentation. Note that a value of 0 will completely suppress the enum 
-# values from appearing in the overview section.
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 ENUM_VALUES_PER_LINE   = 4
 
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 TREEVIEW_WIDTH         = 250
 
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
-# links to external symbols imported via tag files in a separate window.
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 EXT_LINKS_IN_WINDOW    = NO
 
-# Use this tag to change the font size of Latex formulas included 
-# as images in the HTML documentation. The default is 10. Note that 
-# when you change the font size after a successful doxygen run you need 
-# to manually remove any form_*.png images from the HTML output directory 
-# to force them to be regenerated.
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
-# generated for formulas are transparent PNGs. Transparent PNGs are 
-# not supported properly for IE 6.0, but are supported on all modern browsers. 
-# Note that when changing this option you need to delete any form_*.png files 
-# in the HTML output before the changes have effect.
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_TRANSPARENT    = YES
 
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax 
-# (see http://www.mathjax.org) which uses client side Javascript for the 
-# rendering instead of using prerendered bitmaps. Use this if you do not 
-# have LaTeX installed or if you want to formulas look prettier in the HTML 
-# output. When enabled you may also need to install MathJax separately and 
-# configure the path to it using the MATHJAX_RELPATH option.
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 USE_MATHJAX            = NO
 
-# When MathJax is enabled you can set the default output format to be used for 
-# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and 
-# SVG. The default value is HTML-CSS, which is slower, but has the best 
-# compatibility.
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_FORMAT         = HTML-CSS
 
-# When MathJax is enabled you need to specify the location relative to the 
-# HTML output directory using the MATHJAX_RELPATH option. The destination 
-# directory should contain the MathJax.js script. For instance, if the mathjax 
-# directory is located at the same level as the HTML output directory, then 
-# MATHJAX_RELPATH should be ../mathjax. The default value points to 
-# the MathJax Content Delivery Network so you can quickly see the result without 
-# installing MathJax.  However, it is strongly recommended to install a local 
-# copy of MathJax from http://www.mathjax.org before deployment.
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
 
-MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
 
-# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
-# names that should be enabled during MathJax rendering.
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_EXTENSIONS     = 
 
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
-# for the HTML output. The underlying search engine uses javascript 
-# and DHTML and should work on any modern browser. Note that when using 
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
-# (GENERATE_DOCSET) there is already a search function so this one should 
-# typically be disabled. For large projects the javascript based search engine 
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       = 
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 SEARCHENGINE           = YES
 
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
-# implemented using a web server instead of a web client using Javascript. 
-# There are two flavours of web server based search depending on the 
-# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for 
-# searching and an index file used by the script. When EXTERNAL_SEARCH is 
-# enabled the indexing and searching needs to be provided by external tools. 
-# See the manual for details.
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 SERVER_BASED_SEARCH    = NO
 
-# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP 
-# script for searching. Instead the search results are written to an XML file 
-# which needs to be processed by an external indexer. Doxygen will invoke an 
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain 
-# the search results. Doxygen ships with an example indexer (doxyindexer) and 
-# search engine (doxysearch.cgi) which are based on the open source search engine 
-# library Xapian. See the manual for configuration details.
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 EXTERNAL_SEARCH        = NO
 
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server 
-# which will returned the search results when EXTERNAL_SEARCH is enabled. 
-# Doxygen ships with an example search engine (doxysearch) which is based on 
-# the open source search engine library Xapian. See the manual for configuration 
-# details.
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 SEARCHENGINE_URL       = 
 
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed 
-# search data is written to a file for indexing by an external tool. With the 
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
 # SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 SEARCHDATA_FILE        = searchdata.xml
 
-# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the 
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is 
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple 
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
 # projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 EXTERNAL_SEARCH_ID     = 
 
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen 
-# projects other than the one defined by this configuration file, but that are 
-# all added to the same external search index. Each project needs to have a 
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id 
-# of to a relative location where the documentation can be found. 
-# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 EXTRA_SEARCH_MAPPINGS  = 
 
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
 
 GENERATE_LATEX         = NO
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name. 
-# Note that when enabling USE_PDFLATEX this option is only used for 
-# generating bitmaps for formulas in the HTML output, but not in the 
-# Makefile that is written to the output directory.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, letter, legal and 
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PAPER_TYPE             = a4wide
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 EXTRA_PACKAGES         = amsmath
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           = 
 
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for 
-# the generated latex document. The footer should contain everything after 
-# the last chapter. If it is left blank doxygen will generate a 
-# standard footer. Notice: only use this tag if you know what you are doing!
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           = 
 
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images 
-# or other source files which should be copied to the LaTeX output directory. 
-# Note that the files will be copied as-is; there are no commands or markers 
-# available.
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET = 
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_EXTRA_FILES      = 
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PDF_HYPERLINKS         = NO
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
 # higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = YES
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
-# source code with syntax highlighting in the LaTeX output. 
-# Note that which sources are shown also depends on other settings 
-# such as SOURCE_BROWSER.
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_SOURCE_CODE      = NO
 
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
-# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See 
-# http://en.wikipedia.org/wiki/BibTeX for more info.
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BIB_STYLE        = plain
 
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_HYPERLINKS         = NO
 
-# Load style sheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_STYLESHEET_FILE    = 
 
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_EXTENSIONS_FILE    = 
 
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             = 
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_LINKS              = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
 
 GENERATE_XML           = NO
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_PROGRAMLISTING     = YES
 
 #---------------------------------------------------------------------------
-# configuration options related to the DOCBOOK output
+# Configuration options related to the DOCBOOK output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files 
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
 # that can be used to generate PDF.
+# The default value is: NO.
 
 GENERATE_DOCBOOK       = NO
 
-# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in 
-# front of it. If left blank docbook will be used as the default path.
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
 
 DOCBOOK_OUTPUT         = docbook
 
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_MAKEVAR_PREFIX = 
 
@@ -1556,110 +1985,129 @@ PERLMOD_MAKEVAR_PREFIX =
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 MACRO_EXPANSION        = NO
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SEARCH_INCLUDES        = YES
 
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
 INCLUDE_PATH           = 
 
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 INCLUDE_FILE_PATTERNS  = 
 
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 PREDEFINED             = 
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition that 
-# overrules the definition found in the source code.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_AS_DEFINED      = 
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all references to function-like macros 
-# that are alone on a line, have an all uppercase name, and do not end with a 
-# semicolon, because these will confuse the parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. For each 
-# tag file the location of the external documentation should be added. The 
-# format of a tag file without this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths 
-# or URLs. Note that each tag file must have a unique name (where the name does 
-# NOT include the path). If a tag file is not located in the directory in which 
-# doxygen is run, you must also specify the path to the tagfile here.
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
 
-TAGFILES               = ../bpp-core/BppCore.tag=../../bpp-core/html/
+TAGFILES               = 
 
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
 
-GENERATE_TAGFILE       = BppSeq.tag
+GENERATE_TAGFILE       = BppCore.tag
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed 
-# in the related pages index. If set to NO, only the current project's 
-# pages will be listed.
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
 
 PERL_PATH              = /usr/bin/perl
 
@@ -1667,222 +2115,314 @@ PERL_PATH              = /usr/bin/perl
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option also works with HAVE_DOT disabled, but it is recommended to 
-# install and use dot, since it yields more powerful graphs.
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see 
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
-# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
 # default search path.
 
 MSCGEN_PATH            = 
 
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               = 
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
 
 HAVE_DOT               = YES
 
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
-# allowed to run in parallel. When set to 0 (the default) doxygen will 
-# base this on the number of processors available in the system. You can set it 
-# explicitly to a value larger than 0 to get control over the balance 
-# between CPU load and processing speed.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_NUM_THREADS        = 0
 
-# By default doxygen will use the Helvetica font for all dot files that 
-# doxygen generates. When you want a differently looking font you can specify 
-# the font name using DOT_FONTNAME. You need to make sure dot is able to find 
-# the font, which can be done by putting it in a standard location or by setting 
-# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the 
-# directory containing the font.
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-# DOT_FONTNAME           = FreeSans
+DOT_FONTNAME           = Helvetica
 
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
-# The default size is 10pt.
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTSIZE           = 10
 
-# By default doxygen will tell dot to use the Helvetica font. 
-# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to 
-# set the path where dot can find it.
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTPATH           = 
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LOOK               = NO
 
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside 
-# the class node. If there are many fields or methods and many nodes the 
-# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS 
-# threshold limits the number of items for each type to make the size more 
-# managable. Set this to 0 for no limit. Note that the threshold may be 
-# exceeded by 50% before the limit is enforced.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LIMIT_NUM_FIELDS   = 10
 
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 TEMPLATE_RELATIONS     = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
-# doxygen will generate a call dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable call graphs 
-# for selected functions only using the \callgraph command.
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALL_GRAPH             = NO
 
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
-# doxygen will generate a caller dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable caller 
-# graphs for selected functions only using the \callergraph command.
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALLER_GRAPH           = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graphical hierarchy of all classes instead of a textual one.
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include 
-# relations between the files in the directories.
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DIRECTORY_GRAPH        = YES
 
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are svg, png, jpg, or gif. 
-# If left blank png will be used. If you choose svg you need to set 
-# HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
-# visible in IE 9+ (other browsers do not have this requirement).
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_IMAGE_FORMAT       = png
 
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to 
-# enable generation of interactive SVG images that allow zooming and panning. 
-# Note that this requires a modern browser other than Internet Explorer. 
-# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you 
-# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
-# visible. Older versions of IE do not have SVG support.
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INTERACTIVE_SVG        = NO
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_PATH               = 
 
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOTFILE_DIRS           = 
 
-# The MSCFILE_DIRS tag can be used to specify one or more directories that 
-# contain msc files that are included in the documentation (see the 
-# \mscfile command).
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
 
 MSCFILE_DIRS           = 
 
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen if the 
-# number of direct children of the root node in a graph is already larger than 
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           = 
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      = 
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_GRAPH_MAX_NODES    = 50
 
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that the size of a graph can be further restricted by 
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
 # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 MAX_DOT_GRAPH_DEPTH    = 0
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, because dot on Windows does not 
-# seem to support this out of the box. Warning: Depending on the platform used, 
-# enabling this option may lead to badly anti-aliased labels on the edges of 
-# a graph (i.e. they become hard to read).
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_MULTI_TARGETS      = YES
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
diff --git a/Doxyfile-build b/Doxyfile-build
deleted file mode 100644
index 71e9c08..0000000
--- a/Doxyfile-build
+++ /dev/null
@@ -1,1889 +0,0 @@
-# Doxyfile 1.8.3.1-20130209
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file 
-# that follow. The default is UTF-8 which is also the encoding used for all 
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
-# iconv built into libc) for the transcoding. See 
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or sequence of words) that should 
-# identify the project. Note that if you do not use Doxywizard you need 
-# to put quotes around the project name if it contains spaces.
-
-PROJECT_NAME           = bpp-seq
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = 2.2.0
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description 
-# for a project that appears at the top of each page and should give viewer 
-# a quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF          = 
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is 
-# included in the documentation. The maximum height of the logo should not 
-# exceed 55 pixels and the maximum width should not exceed 200 pixels. 
-# Doxygen will copy the logo to the output directory.
-
-PROJECT_LOGO           = 
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = 
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
-# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, Persian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, 
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip. Note that you specify absolute paths here, but also 
-# relative paths, which will be relative from the directory where doxygen is 
-# started.
-
-STRIP_FROM_PATH        = ./src/
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    = ./src/
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful if your file system 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like regular Qt-style comments 
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-# interpret the first line (until the first dot) of a Qt-style 
-# comment as the brief description. If set to NO, the comments 
-# will behave just like regular Qt-style comments (thus requiring 
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 2
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only). 
-# A mapping has the form "name=value". For example adding 
-# "class=itcl::class" will allow you to use the command class in the 
-# itcl::class meaning.
-
-TCL_SUBST              = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Java. For instance, namespaces will be presented as packages, qualified 
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN   = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
-# sources. Doxygen will then generate output that is tailored for 
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL   = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it 
-# parses. With this tag you can assign which parser to use for a given 
-# extension. Doxygen has a built-in mapping, but you can override or extend it 
-# using this tag. The format is ext=language, where ext is a file extension, 
-# and language is one of the parsers supported by doxygen: IDL, Java, 
-# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, 
-# C++. For instance to make doxygen treat .inc files as Fortran files (default 
-# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note 
-# that for custom extensions you also need to set FILE_PATTERNS otherwise the 
-# files are not read by doxygen.
-
-EXTENSION_MAPPING      = 
-
-# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all 
-# comments according to the Markdown format, which allows for more readable 
-# documentation. See http://daringfireball.net/projects/markdown/ for details. 
-# The output of markdown processing is further processed by doxygen, so you 
-# can mix doxygen, HTML, and XML commands with Markdown formatting. 
-# Disable only in case of backward compatibilities issues.
-
-MARKDOWN_SUPPORT       = YES
-
-# When enabled doxygen tries to link words that correspond to documented classes, 
-# or namespaces to their corresponding documentation. Such a link can be 
-# prevented in individual cases by by putting a % sign in front of the word or 
-# globally by setting AUTOLINK_SUPPORT to NO.
-
-AUTOLINK_SUPPORT       = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
-# to include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also makes the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT    = YES
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to 
-# enable parsing support.
-
-CPP_CLI_SUPPORT        = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
-# Doxygen will parse them like normal C++ but will assume all classes use public 
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT            = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate 
-# getter and setter methods for a property. Setting this option to YES (the 
-# default) will make doxygen replace the get and set methods by a property in 
-# the documentation. This will only work if the methods are indeed getting or 
-# setting a simple type. If this is not the case, or you want to show the 
-# methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT   = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and 
-# unions are shown inside the group in which they are included (e.g. using 
-# @ingroup) instead of on a separate page (for HTML and Man pages) or 
-# section (for LaTeX and RTF).
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and 
-# unions with only public data fields or simple typedef fields will be shown 
-# inline in the documentation of the scope in which they are defined (i.e. file, 
-# namespace, or group documentation), provided this scope is documented. If set 
-# to NO (the default), structs, classes, and unions are shown on a separate 
-# page (for HTML and Man pages) or section (for LaTeX and RTF).
-
-INLINE_SIMPLE_STRUCTS  = NO
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
-# is documented as struct, union, or enum with the name of the typedef. So 
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
-# with name TypeT. When disabled the typedef will appear as a member of a file, 
-# namespace, or class. And the struct will be named TypeS. This can typically 
-# be useful for C code in case the coding convention dictates that all compound 
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT   = NO
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
-# determine which symbols to keep in memory and which to flush to disk. 
-# When the cache is full, less often used symbols will be written to disk. 
-# For small to medium size projects (<1000 input files) the default value is 
-# probably good enough. For larger projects a too small cache size can cause 
-# doxygen to be busy swapping symbols to and from disk most of the time 
-# causing a significant performance penalty. 
-# If the system has enough physical memory increasing the cache will improve the 
-# performance by keeping more symbols in memory. Note that the value works on 
-# a logarithmic scale so increasing the size by one will roughly double the 
-# memory usage. The cache size is given by this formula: 
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-# SYMBOL_CACHE_SIZE      = 0
-
-# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be 
-# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given 
-# their name and scope. Since this can be an expensive process and often the 
-# same symbol appear multiple times in the code, doxygen keeps a cache of 
-# pre-resolved symbols. If the cache is too small doxygen will become slower. 
-# If the cache is too large, memory is wasted. The cache size is given by this 
-# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-LOOKUP_CACHE_SIZE      = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal 
-# scope will be included in the documentation.
-
-EXTRACT_PACKAGE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be 
-# extracted and appear in the documentation as a namespace called 
-# 'anonymous_namespace{file}', where file will be replaced with the base 
-# name of the file that contains the anonymous namespace. By default 
-# anonymous namespaces are hidden.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
-# will list include files with double quotes in the documentation 
-# rather than with sharp brackets.
-
-FORCE_LOCAL_INCLUDES   = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
-# will sort the (brief and detailed) documentation of class members so that 
-# constructors and destructors are listed first. If set to NO (the default) 
-# the constructors will appear in the respective orders defined by 
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
-# hierarchy of group names into alphabetical order. If set to NO (the default) 
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES       = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to 
-# do proper type resolution of all parameters of a function it will reject a 
-# match between the prototype and the implementation of a member function even 
-# if there is only one candidate or it is obvious which candidate to choose 
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen 
-# will still accept a match between prototype and implementation in such cases.
-
-STRICT_PROTO_MATCHING  = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
-GENERATE_TESTLIST      = NO
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
-GENERATE_BUGLIST       = NO
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if section-label ... \endif 
-# and \cond section-label ... \endcond blocks.
-
-ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or macro consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and macros in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
-# This will remove the Files entry from the Quick Index and from the 
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES             = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
-# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES        = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from 
-# the version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    = 
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
-# by doxygen. The layout file controls the global structure of the generated 
-# output files in an output format independent way. To create the layout file 
-# that represents doxygen's defaults, run doxygen with the -l option. 
-# You can optionally specify a file name after the option, if omitted 
-# DoxygenLayout.xml will be used as the name of the layout file.
-
-LAYOUT_FILE            = 
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files 
-# containing the references data. This must be a list of .bib files. The 
-# .bib extension is automatically appended if omitted. Using this command 
-# requires the bibtex tool to be installed. See also 
-# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style 
-# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this 
-# feature you need bibtex and perl available in the search path. Do not use 
-# file names with spaces, bibtex cannot handle them.
-
-CITE_BIB_FILES         = 
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
-WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
-WARN_LOGFILE           = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = src
-
-# This tag can be used to specify the character encoding of the source files 
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
-# also the default input encoding. Doxygen uses libiconv (or the iconv built 
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
-# the list of possible encodings.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py 
-# *.f90 *.f *.for *.vhd *.vhdl
-
-FILE_PATTERNS          = *.h \
-                         *.cpp
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
-RECURSIVE              = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag. 
-# Note that relative paths are relative to the directory from which doxygen is 
-# run.
-
-EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or 
-# directories that are symbolic links (a Unix file system feature) are excluded 
-# from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       = 
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the 
-# output. The symbol name can be a fully qualified name, a word, or if the 
-# wildcard * is used, a substring. Examples: ANamespace, AClass, 
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
-EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
-EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
-IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
-INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty or if 
-# non of the patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) 
-# and it is also possible to disable source filtering for a specific pattern 
-# using *.ext= (so without naming a filter). This option only has effect when 
-# FILTER_SOURCE_FILES is enabled.
-
-FILTER_SOURCE_PATTERNS = 
-
-# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that 
-# is part of the input, its contents will be placed on the main page (index.html). 
-# This can be useful if you have a project on for instance GitHub and want reuse 
-# the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE = 
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C, C++ and Fortran comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
-# link to the source code.  Otherwise they will link to the documentation.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header. Note that when using a custom header you are responsible  
-# for the proper inclusion of any scripts and style sheets that doxygen 
-# needs, which is dependent on the configuration options used. 
-# It is advised to generate a default header using "doxygen -w html 
-# header.html footer.html stylesheet.css YourConfigFile" and then modify 
-# that header. Note that the header is subject to change so you typically 
-# have to redo this when upgrading to a newer version of doxygen or when 
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If left blank doxygen will 
-# generate a default style sheet. Note that it is recommended to use 
-# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this 
-# tag will in the future become obsolete.
-
-HTML_STYLESHEET        = 
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional 
-# user-defined cascading style sheet that is included after the standard 
-# style sheets created by doxygen. Using this option one can overrule 
-# certain style aspects. This is preferred over using HTML_STYLESHEET 
-# since it does not replace the standard style sheet and is therefor more 
-# robust against future updates. Doxygen will copy the style sheet file to 
-# the output directory.
-
-HTML_EXTRA_STYLESHEET  = 
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
-# other source files which should be copied to the HTML output directory. Note 
-# that these files will be copied to the base HTML output directory. Use the 
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that 
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES       = 
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
-# Doxygen will adjust the colors in the style sheet and background images 
-# according to this color. Hue is specified as an angle on a colorwheel, 
-# see http://en.wikipedia.org/wiki/Hue for more information. 
-# For instance the value 0 represents red, 60 is yellow, 120 is green, 
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
-# The allowed range is 0 to 359.
-
-HTML_COLORSTYLE_HUE    = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
-# the colors in the HTML output. For a value of 0 the output will use 
-# grayscales only. A value of 255 will produce the most vivid colors.
-
-HTML_COLORSTYLE_SAT    = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
-# the luminance component of the colors in the HTML output. Values below 
-# 100 gradually make the output lighter, whereas values above 100 make 
-# the output darker. The value divided by 100 is the actual gamma applied, 
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
-# and 100 does not change the gamma.
-
-HTML_COLORSTYLE_GAMMA  = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
-# page will contain the date and time when the page was generated. Setting 
-# this to NO can help when comparing the output of multiple runs.
-
-HTML_TIMESTAMP         = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-# documentation will contain sections that can be hidden and shown after the 
-# page has loaded.
-
-HTML_DYNAMIC_SECTIONS  = YES
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of 
-# entries shown in the various tree structured indices initially; the user 
-# can expand and collapse entries dynamically later on. Doxygen will expand 
-# the tree to such a level that at most the specified number of entries are 
-# visible (unless a fully collapsed tree already exceeds this amount). 
-# So setting the number of entries 1 will produce a full collapsed tree by 
-# default. 0 is a special value representing an infinite number of entries 
-# and will result in a full expanded tree by default.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files 
-# will be generated that can be used as input for Apple's Xcode 3 
-# integrated development environment, introduced with OSX 10.5 (Leopard). 
-# To create a documentation set, doxygen will generate a Makefile in the 
-# HTML output directory. Running make will produce the docset in that 
-# directory and running "make install" will install the docset in 
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
-# it at startup. 
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
-# for more information.
-
-GENERATE_DOCSET        = YES
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
-# feed. A documentation feed provides an umbrella under which multiple 
-# documentation sets from a single provider (such as a company or product suite) 
-# can be grouped.
-
-DOCSET_FEEDNAME        = "Bio++ Sequence Library"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
-# should uniquely identify the documentation set bundle. This should be a 
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID       = bpp.seq
-
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely 
-# identify the documentation publisher. This should be a reverse domain-name 
-# style string, e.g. com.mycompany.MyDocSet.documentation.
-
-DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
-
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
-
-DOCSET_PUBLISHER_NAME  = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
-CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
-# content.
-
-CHM_INDEX_ENCODING     = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
-# that can be used as input for Qt's qhelpgenerator to generate a 
-# Qt Compressed Help (.qch) of the generated HTML documentation.
-
-GENERATE_QHP           = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
-# be used to specify the file name of the resulting .qch file. 
-# The path specified is relative to the HTML output folder.
-
-QCH_FILE               = 
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#namespace
-
-QHP_NAMESPACE          = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
-
-QHP_VIRTUAL_FOLDER     = doc
-
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
-# add. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
-
-QHP_CUST_FILTER_NAME   = 
-
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
-# custom filter to add. For more information please see 
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
-# Qt Help Project / Custom Filters</a>.
-
-QHP_CUST_FILTER_ATTRS  = 
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
-# project's 
-# filter section matches. 
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
-# Qt Help Project / Filter Attributes</a>.
-
-QHP_SECT_FILTER_ATTRS  = 
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
-# be used to specify the location of Qt's qhelpgenerator. 
-# If non-empty doxygen will try to run qhelpgenerator on the generated 
-# .qhp file.
-
-QHG_LOCATION           = 
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
-# will be generated, which together with the HTML files, form an Eclipse help 
-# plugin. To install this plugin and make it available under the help contents 
-# menu in Eclipse, the contents of the directory containing the HTML and XML 
-# files needs to be copied into the plugins directory of eclipse. The name of 
-# the directory within the plugins directory should be the same as 
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
-# the help appears.
-
-GENERATE_ECLIPSEHELP   = NO
-
-# A unique identifier for the eclipse help plugin. When installing the plugin 
-# the directory name containing the HTML and XML files should also have 
-# this name.
-
-ECLIPSE_DOC_ID         = org.doxygen.Project
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) 
-# at top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it. Since the tabs have the same information as the 
-# navigation tree you can set this option to NO if you already set 
-# GENERATE_TREEVIEW to YES.
-
-DISABLE_INDEX          = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
-# structure should be generated to display hierarchical information. 
-# If the tag value is set to YES, a side panel will be generated 
-# containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
-# Windows users are probably better off using the HTML help feature. 
-# Since the tree basically has the same information as the tab index you 
-# could consider to set DISABLE_INDEX to NO when enabling this option.
-
-GENERATE_TREEVIEW      = YES
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values 
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML 
-# documentation. Note that a value of 0 will completely suppress the enum 
-# values from appearing in the overview section.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
-# links to external symbols imported via tag files in a separate window.
-
-EXT_LINKS_IN_WINDOW    = NO
-
-# Use this tag to change the font size of Latex formulas included 
-# as images in the HTML documentation. The default is 10. Note that 
-# when you change the font size after a successful doxygen run you need 
-# to manually remove any form_*.png images from the HTML output directory 
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE       = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
-# generated for formulas are transparent PNGs. Transparent PNGs are 
-# not supported properly for IE 6.0, but are supported on all modern browsers. 
-# Note that when changing this option you need to delete any form_*.png files 
-# in the HTML output before the changes have effect.
-
-FORMULA_TRANSPARENT    = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax 
-# (see http://www.mathjax.org) which uses client side Javascript for the 
-# rendering instead of using prerendered bitmaps. Use this if you do not 
-# have LaTeX installed or if you want to formulas look prettier in the HTML 
-# output. When enabled you may also need to install MathJax separately and 
-# configure the path to it using the MATHJAX_RELPATH option.
-
-USE_MATHJAX            = NO
-
-# When MathJax is enabled you can set the default output format to be used for 
-# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and 
-# SVG. The default value is HTML-CSS, which is slower, but has the best 
-# compatibility.
-
-MATHJAX_FORMAT         = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the 
-# HTML output directory using the MATHJAX_RELPATH option. The destination 
-# directory should contain the MathJax.js script. For instance, if the mathjax 
-# directory is located at the same level as the HTML output directory, then 
-# MATHJAX_RELPATH should be ../mathjax. The default value points to 
-# the MathJax Content Delivery Network so you can quickly see the result without 
-# installing MathJax.  However, it is strongly recommended to install a local 
-# copy of MathJax from http://www.mathjax.org before deployment.
-
-MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
-# names that should be enabled during MathJax rendering.
-
-MATHJAX_EXTENSIONS     = 
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
-# for the HTML output. The underlying search engine uses javascript 
-# and DHTML and should work on any modern browser. Note that when using 
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
-# (GENERATE_DOCSET) there is already a search function so this one should 
-# typically be disabled. For large projects the javascript based search engine 
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
-
-SEARCHENGINE           = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
-# implemented using a web server instead of a web client using Javascript. 
-# There are two flavours of web server based search depending on the 
-# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for 
-# searching and an index file used by the script. When EXTERNAL_SEARCH is 
-# enabled the indexing and searching needs to be provided by external tools. 
-# See the manual for details.
-
-SERVER_BASED_SEARCH    = NO
-
-# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP 
-# script for searching. Instead the search results are written to an XML file 
-# which needs to be processed by an external indexer. Doxygen will invoke an 
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain 
-# the search results. Doxygen ships with an example indexer (doxyindexer) and 
-# search engine (doxysearch.cgi) which are based on the open source search engine 
-# library Xapian. See the manual for configuration details.
-
-EXTERNAL_SEARCH        = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server 
-# which will returned the search results when EXTERNAL_SEARCH is enabled. 
-# Doxygen ships with an example search engine (doxysearch) which is based on 
-# the open source search engine library Xapian. See the manual for configuration 
-# details.
-
-SEARCHENGINE_URL       = 
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed 
-# search data is written to a file for indexing by an external tool. With the 
-# SEARCHDATA_FILE tag the name of this file can be specified.
-
-SEARCHDATA_FILE        = searchdata.xml
-
-# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the 
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is 
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple 
-# projects and redirect the results back to the right project.
-
-EXTERNAL_SEARCH_ID     = 
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen 
-# projects other than the one defined by this configuration file, but that are 
-# all added to the same external search index. Each project needs to have a 
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id 
-# of to a relative location where the documentation can be found. 
-# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...
-
-EXTRA_SEARCH_MAPPINGS  = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
-GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name. 
-# Note that when enabling USE_PDFLATEX this option is only used for 
-# generating bitmaps for formulas in the HTML output, but not in the 
-# Makefile that is written to the output directory.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, letter, legal and 
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         = amsmath
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = 
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for 
-# the generated latex document. The footer should contain everything after 
-# the last chapter. If it is left blank doxygen will generate a 
-# standard footer. Notice: only use this tag if you know what you are doing!
-
-LATEX_FOOTER           = 
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images 
-# or other source files which should be copied to the LaTeX output directory. 
-# Note that the files will be copied as-is; there are no commands or markers 
-# available.
-
-LATEX_EXTRA_FILES      = 
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
-# source code with syntax highlighting in the LaTeX output. 
-# Note that which sources are shown also depends on other settings 
-# such as SOURCE_BROWSER.
-
-LATEX_SOURCE_CODE      = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
-# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See 
-# http://en.wikipedia.org/wiki/BibTeX for more info.
-
-LATEX_BIB_STYLE        = plain
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load style sheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
-GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files 
-# that can be used to generate PDF.
-
-GENERATE_DOCBOOK       = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in 
-# front of it. If left blank docbook will be used as the default path.
-
-DOCBOOK_OUTPUT         = docbook
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX = 
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
-INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
-INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = 
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition that 
-# overrules the definition found in the source code.
-
-EXPAND_AS_DEFINED      = 
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all references to function-like macros 
-# that are alone on a line, have an all uppercase name, and do not end with a 
-# semicolon, because these will confuse the parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. For each 
-# tag file the location of the external documentation should be added. The 
-# format of a tag file without this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths 
-# or URLs. Note that each tag file must have a unique name (where the name does 
-# NOT include the path). If a tag file is not located in the directory in which 
-# doxygen is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = ../bpp-core/BppCore.tag=../../bpp-core/html/
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = BppSeq.tag
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed 
-# in the related pages index. If set to NO, only the current project's 
-# pages will be listed.
-
-EXTERNAL_PAGES         = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option also works with HAVE_DOT disabled, but it is recommended to 
-# install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see 
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
-# the mscgen tool resides. If left empty the tool is assumed to be found in the 
-# default search path.
-
-MSCGEN_PATH            = 
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = YES
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
-# allowed to run in parallel. When set to 0 (the default) doxygen will 
-# base this on the number of processors available in the system. You can set it 
-# explicitly to a value larger than 0 to get control over the balance 
-# between CPU load and processing speed.
-
-DOT_NUM_THREADS        = 0
-
-# By default doxygen will use the Helvetica font for all dot files that 
-# doxygen generates. When you want a differently looking font you can specify 
-# the font name using DOT_FONTNAME. You need to make sure dot is able to find 
-# the font, which can be done by putting it in a standard location or by setting 
-# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the 
-# directory containing the font.
-
-# DOT_FONTNAME           = FreeSans
-
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
-# The default size is 10pt.
-
-DOT_FONTSIZE           = 10
-
-# By default doxygen will tell dot to use the Helvetica font. 
-# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to 
-# set the path where dot can find it.
-
-DOT_FONTPATH           = 
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
-UML_LOOK               = NO
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside 
-# the class node. If there are many fields or methods and many nodes the 
-# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS 
-# threshold limits the number of items for each type to make the size more 
-# managable. Set this to 0 for no limit. Note that the threshold may be 
-# exceeded by 50% before the limit is enforced.
-
-UML_LIMIT_NUM_FIELDS   = 10
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
-# doxygen will generate a call dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable call graphs 
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
-# doxygen will generate a caller dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable caller 
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include 
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are svg, png, jpg, or gif. 
-# If left blank png will be used. If you choose svg you need to set 
-# HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
-# visible in IE 9+ (other browsers do not have this requirement).
-
-DOT_IMAGE_FORMAT       = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to 
-# enable generation of interactive SVG images that allow zooming and panning. 
-# Note that this requires a modern browser other than Internet Explorer. 
-# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you 
-# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
-# visible. Older versions of IE do not have SVG support.
-
-INTERACTIVE_SVG        = NO
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
-DOTFILE_DIRS           = 
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that 
-# contain msc files that are included in the documentation (see the 
-# \mscfile command).
-
-MSCFILE_DIRS           = 
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen if the 
-# number of direct children of the root node in a graph is already larger than 
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that the size of a graph can be further restricted by 
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, because dot on Windows does not 
-# seem to support this out of the box. Warning: Depending on the platform used, 
-# enabling this option may lead to badly anti-aliased labels on the edges of 
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS      = YES
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
-DOT_CLEANUP            = YES
-OUTPUT_DIRECTORY=/home/jdutheil/Devel/Cpp/Projects/bpp-seq
diff --git a/INSTALL.txt b/INSTALL.txt
index c8859da..8c499db 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,12 +1,23 @@
-This software needs cmake >= 2.6 to build.
+This software needs cmake >= 2.8.11 and a C++11 capable compiler to build
 
 After installing cmake, run it with the following command:
-cmake -DCMAKE_INSTALL_PREFIX=[where to install, for instance /usr/local or $HOME/.local] .
+$ cmake -DCMAKE_INSTALL_PREFIX=[where to install, for instance /usr/local or $HOME/.local] .
 
 If available, you can also use ccmake instead of cmake for a more user-friendly interface.
 
-Then compile and install the software with
-make install
+Then compile and install the software with:
+$ make install
 
 You may also consider installing and using the software checkinstall for easier system administration.
 
+If you install Bio++ in a non standard path (not /usr/), remember that:
+-> if you compile your project with CMake, give it the path with -DCMAKE_PREFIX_PATH=<path>
+-> if you compile with something else, give the path to the compiler (-I / -L options)
+-> if you use shared libraries, you must also tell programs where to find them at startup:
+  -> either by adding the path to LD_LIBRARY_PATH environment variable.
+  -> or by using RPATHs to hard code the path in the executable (generates NON PORTABLE executables !)
+    -> with CMake, see documentation in bpp-core/cmake/project-template
+    -> or see your compiler documentation ("-Wl,-rpath,<path>" for clang/gcc)
+    -> consider installing Bio++ with the "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE" option
+
+Detailed documentation for using Bio++ with CMake are available in bpp-core/cmake/
diff --git a/bpp-core.spec b/bpp-core.spec
new file mode 100644
index 0000000..68fdcb6
--- /dev/null
+++ b/bpp-core.spec
@@ -0,0 +1,102 @@
+%define _basename bpp-core
+%define _version 2.3.0
+%define _release 1
+%define _prefix /usr
+
+URL: http://biopp.univ-montp2.fr/
+
+Name: %{_basename}
+Version: %{_version}
+Release: %{_release}
+License: CECILL-2.0
+Vendor: The Bio++ Project
+Source: http://biopp.univ-montp2.fr/repos/sources/%{_basename}-%{_version}.tar.gz
+Summary: Bio++ Core library
+Group: Development/Libraries/C and C++
+
+BuildRoot: %{_builddir}/%{_basename}-root
+BuildRequires: cmake >= 2.8.11
+BuildRequires: gcc-c++ >= 4.7.0
+AutoReq: yes
+AutoProv: yes
+
+%description
+This library contains the core classes and utilitary functions of the Bio++ project.
+
+%package -n libbpp-core2
+Summary: Bio++ Core library
+Group: Development/Libraries/C and C++
+
+%description -n libbpp-core2
+This library contains the core classes and utilitary functions of the Bio++ project.
+
+%package -n libbpp-core-devel
+Summary: Libraries, includes to develop applications with %{_basename}
+Group: Development/Libraries/C and C++
+Requires: libbpp-core2 = %{_version}
+
+%description -n libbpp-core-devel
+The libbpp-core-devel package contains the header files and static libraries for
+building applications which use %{_basename}.
+
+%prep
+%setup -q
+
+%build
+CFLAGS="$RPM_OPT_FLAGS"
+CMAKE_FLAGS="-DCMAKE_INSTALL_PREFIX=%{_prefix} -DBUILD_TESTING=OFF"
+if [ %{_lib} == 'lib64' ] ; then
+  CMAKE_FLAGS="$CMAKE_FLAGS -DLIB_SUFFIX=64"
+fi
+cmake $CMAKE_FLAGS .
+make
+
+%install
+make DESTDIR=$RPM_BUILD_ROOT install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -n libbpp-core2 -p /sbin/ldconfig
+
+%postun -n libbpp-core2 -p /sbin/ldconfig
+
+%files -n libbpp-core2
+%defattr(-,root,root)
+%doc AUTHORS.txt COPYING.txt INSTALL.txt ChangeLog
+%{_prefix}/%{_lib}/lib*.so.*
+
+%files -n libbpp-core-devel
+%defattr(-,root,root)
+%doc AUTHORS.txt COPYING.txt INSTALL.txt ChangeLog
+%dir %{_prefix}/lib/cmake/
+%dir %{_prefix}/lib/cmake/bpp-core
+%{_prefix}/%{_lib}/lib*.so
+%{_prefix}/%{_lib}/lib*.a
+%{_prefix}/lib/cmake/bpp-core/bpp-core*.cmake
+%{_prefix}/include/*
+
+%changelog
+* Wed May 10 2017 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.3.0-1
+- New graph structures
+- Upgrade to C++11
+* Wed Sep 17 2014 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.2.0-1
+- Reparametrization wrapper debugged
+- Improved and rationalized display of warning messages
+- Possibility to set random seed in applications
+- Code checked for compilation with CLang.
+* Mon Mar 04 2013 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.1.0-1
+- Extended range classes
+- Improved initialization of static members
+- Extended support for BppO.
+* Thu Feb 09 2012 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.3-1
+- New range classes
+- Linear assigment method
+- Improved string tokenizer and text tools.
+* Thu Jun 09 2011 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.2-1
+- New MVA classes + more numerical tools.
+* Mon Feb 28 2011 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.1-1
+- Fixed missing RColorSet file.
+* Mon Feb 07 2011 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.0-1
+- Initial package.
+
diff --git a/bpp-seq.spec b/bpp-seq.spec
deleted file mode 100644
index 8c57200..0000000
--- a/bpp-seq.spec
+++ /dev/null
@@ -1,203 +0,0 @@
-%define _basename bpp-seq
-%define _version 2.2.0
-%define _release 1
-%define _prefix /usr
-
-URL: http://biopp.univ-montp2.fr/
-
-Name: %{_basename}
-Version: %{_version}
-Release: %{_release}
-License: CECILL-2.0
-Vendor: The Bio++ Project
-Source: http://biopp.univ-montp2.fr/repos/sources/%{_basename}-%{_version}.tar.gz
-Summary: Bio++ Sequence library
-Group: Development/Libraries/C and C++
-Requires: bpp-core = %{_version}
-
-BuildRoot: %{_builddir}/%{_basename}-root
-BuildRequires: cmake >= 2.6.0
-BuildRequires: gcc-c++ >= 4.0.0
-BuildRequires: libbpp-core2 = %{_version}
-BuildRequires: libbpp-core-devel = %{_version}
-AutoReq: yes
-AutoProv: yes
-
-%description
-This library contains utilitary and classes for bio-sequence analysis.
-It is part of the Bio++ project.
-
-%package -n libbpp-seq9
-Summary: Bio++ Sequence library
-Group: Development/Libraries/C and C++
-
-%description -n libbpp-seq9
-This library contains utilitary and classes for bio-sequence analysis.
-It is part of the Bio++ project.
-
-%package -n libbpp-seq-devel
-Summary: Libraries, includes to develop applications with %{_basename}
-Group: Development/Libraries/C and C++
-Requires: libbpp-seq9 = %{_version}
-Requires: libbpp-core2 = %{_version}
-Requires: libbpp-core-devel = %{_version}
-
-%description -n libbpp-seq-devel
-The libbpp-seq-devel package contains the header files and static libraries for
-building applications which use %{_basename}.
-
-%prep
-%setup -q
-
-%build
-CFLAGS="$RPM_OPT_FLAGS"
-CMAKE_FLAGS="-DCMAKE_INSTALL_PREFIX=%{_prefix} -DBUILD_TESTING=OFF"
-if [ %{_lib} == 'lib64' ] ; then
-  CMAKE_FLAGS="$CMAKE_FLAGS -DLIB_SUFFIX=64"
-fi
-cmake $CMAKE_FLAGS .
-make
-
-%install
-make DESTDIR=$RPM_BUILD_ROOT install
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%post -n libbpp-seq9 -p /sbin/ldconfig
-
-%post -n libbpp-seq-devel
-createGeneric() {
-  echo "-- Creating generic include file: $1.all"
-  #Make sure we run into subdirectories first:
-  dirs=()
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      dirs+=( "$file" )
-    fi
-  done
-  for dir in ${dirs[@]}
-  do
-    createGeneric $dir
-  done
-  #Now list all files, including newly created .all files:
-  if [ -f $1.all ]
-  then
-    rm $1.all
-  fi
-  dir=`basename $1`
-  for file in "$1"/*
-  do
-    if [ -f "$file" ] && ( [ "${file##*.}" == "h" ] || [ "${file##*.}" == "all" ] )
-    then
-      file=`basename $file`
-      echo "#include \"$dir/$file\"" >> $1.all
-    fi
-  done;
-}
-# Actualize .all files
-createGeneric %{_prefix}/include/Bpp
-exit 0
-
-%preun -n libbpp-seq-devel
-removeGeneric() {
-  if [ -f $1.all ]
-  then
-    echo "-- Remove generic include file: $1.all"
-    rm $1.all
-  fi
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      removeGeneric $file
-    fi
-  done
-}
-# Actualize .all files
-removeGeneric %{_prefix}/include/Bpp
-exit 0
-
-%postun -n libbpp-seq9 -p /sbin/ldconfig
-
-%postun -n libbpp-seq-devel
-createGeneric() {
-  echo "-- Creating generic include file: $1.all"
-  #Make sure we run into subdirectories first:
-  dirs=()
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      dirs+=( "$file" )
-    fi
-  done
-  for dir in ${dirs[@]}
-  do
-    createGeneric $dir
-  done
-  #Now list all files, including newly created .all files:
-  if [ -f $1.all ]
-  then
-    rm $1.all
-  fi
-  dir=`basename $1`
-  for file in "$1"/*
-  do
-    if [ -f "$file" ] && ( [ "${file##*.}" == "h" ] || [ "${file##*.}" == "all" ] )
-    then
-      file=`basename $file`
-      echo "#include \"$dir/$file\"" >> $1.all
-    fi
-  done;
-}
-# Actualize .all files
-createGeneric %{_prefix}/include/Bpp
-exit 0
-
-%files -n libbpp-seq9
-%defattr(-,root,root)
-%doc AUTHORS.txt COPYING.txt INSTALL.txt ChangeLog
-%{_prefix}/%{_lib}/lib*.so.*
-
-%files -n libbpp-seq-devel
-%defattr(-,root,root)
-%doc AUTHORS.txt COPYING.txt INSTALL.txt ChangeLog
-%{_prefix}/%{_lib}/lib*.so
-%{_prefix}/%{_lib}/lib*.a
-%{_prefix}/include/*
-
-%changelog
-* Thu Sep 23 2014 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.2.0-1
-- Alphabet classes refreshed and updated
-- Bug fixes.
-* Tue Mar 05 2013 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.1.0-1
-- 'omics' tools now in bpp-seq-omics
-- Extended BppO support
-- StateProperties renamed to AlphabetIndex
-* Thu Feb 09 2012 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.3-1
-- Improved maf tools + new iterators
-- Added support for GFF
-- Added support for FastQ
-- Several bugs fixed.
-* Thu Jun 09 2011 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.2-1
-- Improved maf tools, several bugs fixed.
-* Mon Feb 28 2011 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.1-1
-* Mon Feb 07 2011 Julien Dutheil <julien.dutheil at univ-montp2.fr> 2.0.0-1
-* Thu Mar 25 2010 Julien Dutheil <julien.dutheil at univ-montp2.fr> 1.7.0-1
-* Wed Jun 10 2009 Julien Dutheil <jdutheil at birc.au.dk> 1.6.0-1
-* Thu Dec 11 2008 Julien Dutheil <jdutheil at birc.au.dk> 1.5.0-1
-* Mon Jul 21 2008 Julien Dutheil <jdutheil at birc.au.dk> 1.4.1-1
-* Fri Jan 18 2008 Julien Dutheil <Julien.Dutheil at univ-montp2.fr> 1.4.0-1
-* Fri Jul 06 2007 Julien Dutheil <Julien.Dutheil at univ-montp2.fr> 1.3.0-1
-* Fri Jan 19 2007 Julien Dutheil <Julien.Dutheil at univ-montp2.fr> 1.2.0-1
-* Mon Aug 28 2006 Julien Dutheil <Julien.Dutheil at univ-montp2.fr> 1.1.1-1
-* Tue Apr 18 2006 Julien Dutheil <Julien.Dutheil at univ-montp2.fr> 1.1.0-1
-* Fri Nov 16 2005 Julien Dutheil <Julien.Dutheil at univ-montp2.fr> 1.0.0-1
-- First draft of the spec file
-
diff --git a/cmake/doc-cmake-for-developpers.cmake b/cmake/doc-cmake-for-developpers.cmake
new file mode 100644
index 0000000..bbae8d1
--- /dev/null
+++ b/cmake/doc-cmake-for-developpers.cmake
@@ -0,0 +1,240 @@
+# Documentation of the CMake system of Bio++
+# Authors:
+#   Francois Gindraud (2017)
+# Created: 10/03/2017
+
+# This file describes the CMake setup of bio++ (for this component and others).
+# It includes important parts from cmake files and comments them.
+# Not described: cpack, doxygen
+
+####################################################################################################
+# Main CMakeLists.txt
+####################################################################################################
+
+cmake_minimum_required (VERSION 2.8.11)
+# 2.8.11 is required for:
+# - clean target properties (link, include dir)
+
+project (bpp-something CXX)
+# Defines a lot of stuff including PROJECT_NAME which will contain "bpp-something"
+# PROJECT_NAME is used to name:
+# - the library
+# - the CMake targets (${PROJECT_NAME}-static or ${PROJECT_NAME}-shared)
+# - the CMake package
+# Do not change it unless there is a good reason...
+
+set (CMAKE_CXX_FLAGS "std=c++11 -Wall -Weffc++ -Wshadow -Wconversion")
+# Define compile options to be used for all C++ targets.
+# NOTES for the future:
+# -> CMake >= 2.8.12 adds per target COMPILE_OPTIONS by using target_compile_options (<target> [PRIVATE|PUBLIC] <opt1> ... <optN>)
+# -> CMake >= 3.1.x provides a CXX_STANDARD variable to set -std=...
+# -> It also provides a "feature" property on targets which annotates, and auto selects the right -std=...
+
+SET(${PROJECT_NAME}_VERSION_CURRENT "2")
+SET(${PROJECT_NAME}_VERSION_REVISION "3")
+SET(${PROJECT_NAME}_VERSION_AGE "0")
+MATH(EXPR ${PROJECT_NAME}_VERSION_MAJOR "${${PROJECT_NAME}_VERSION_CURRENT} - ${${PROJECT_NAME}_VERSION_AGE}")
+SET(${PROJECT_NAME}_VERSION_MINOR ${${PROJECT_NAME}_VERSION_AGE})
+SET(${PROJECT_NAME}_VERSION_PATCH ${${PROJECT_NAME}_VERSION_REVISION})
+SET(${PROJECT_NAME}_VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}")
+# Libtool-like version number
+# CURRENT:REVISION:AGE => file.so.(C-A).A.R
+# current:  The most recent interface number that this library implements.
+# revision: The implementation number of the current interface.
+# age:      The difference between the newest and oldest interfaces that this
+#           library implements.
+# In other words, the library implements all the interface numbers in the
+# range from number current - age to current.
+# NOTE: unchanged from old cmake.
+
+set (PROJECT_VERSION ${${PROJECT_NAME}_VERSION})
+# Sets PROJECT_VERSION, which is used in package template files (version and config).
+# NOTE: CMake >= 3.0 adds a "VERSION x.y.z" parameter to project() that fills these variables automatically (major/minor/...).
+
+if (CMAKE_INSTALL_PREFIX)
+  set (CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}" ${CMAKE_PREFIX_PATH})
+endif (CMAKE_INSTALL_PREFIX)
+find_package (bpp-neededcomponent x.y.z REQUIRED)
+# Includes other needed bpp components.
+# They must be installed to standard paths, or to the target install path (hence the search path addition).
+# If a version is provided, it will check that the found component is version-compatible with what we requested.
+# -> Detects when we link to an old bpp version.
+# Internally, this executes the package files of the needed components if they are found.
+#
+# Package files will include their targets file that define "imported targets".
+# using target_link_libraries (current_target bpp-neededcomponent-static) will add link, include, and compile option flags to the whole compilation.
+# For convenience package files also define the BPP_LIBS_SHARED and BPP_LIBS_STATIC variables.
+# These variables hold a list of all imported shared or static library targets of bpp.
+
+set (cmake-package-location lib/cmake/${PROJECT_NAME})
+# Place where cmake package and target files will be placed at install.
+# This is one of the paths that find_package will check, others are possible, see find_package().
+
+include (CMakePackageConfigHelpers)
+# Standard CMake module defining configure_package_config_file and write_basic_package_version_file.
+
+configure_package_config_file (
+  package.cmake.in
+  ${CMAKE_CURRENT_BINARY_DIR}/package.cmake
+  INSTALL_DESTINATION ${cmake-package-location}
+  )
+# Generates the CMake package file from the template package.cmake.in
+# It performs variable substitutions to fill the template with project name and versions.
+
+write_basic_package_version_file (
+  ${CMAKE_CURRENT_BINARY_DIR}/package-version.cmake
+  VERSION ${PROJECT_VERSION}
+  COMPATIBILITY SameMajorVersion
+  )
+# Generates a CMake package version file. Used by find_package to check version numbers.
+
+install (FILES ${CMAKE_CURRENT_BINARY_DIR}/package.cmake DESTINATION ${cmake-package-location}
+  RENAME ${PROJECT_NAME}-config.cmake)
+install (FILES ${CMAKE_CURRENT_BINARY_DIR}/package-version.cmake DESTINATION ${cmake-package-location}
+  RENAME ${PROJECT_NAME}-config-version.cmake)
+# Install the cmake package files.
+# They are renamed to the name convention required by CMake.
+
+add_subdirectory (src)
+# Define the library targets.
+
+enable_testing ()
+include (CTest)
+if (BUILD_TESTING)
+  add_subdirectory (test)
+endif (BUILD_TESTING)
+# Include tests.
+
+####################################################################################################
+# src/CMakeLists.txt
+# Defines library targets (using PROJECT_NAME heavily, to be as generic as possible).
+####################################################################################################
+
+set (CPP_FILES
+  Bpp/Something/do_something.cpp
+  ...
+  )
+# File list (sorted to easily find duplicates or missing)
+
+add_library (${PROJECT_NAME}-static STATIC ${CPP_FILES})
+# Define the static lib
+
+target_include_directories (${PROJECT_NAME}-static PUBLIC
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>
+  )
+# Annotates the static lib target with include paths.
+# These paths will be added as -I options:
+# - during compilation of the target, by looking at CMAKE_CURRENT_SOURCE_DIR
+# - during compilation of anything that links to this target, by looking at <install_dir>/include.
+# This allow the code to reference headers by a path relative to src/ instead of using ../OtherDir/blah.h
+# NOTE the "$<INSTALL_PREFIX>/" part is only needed to support 2.8.11 due to a bugged cmake check.
+
+set_target_properties (${PROJECT_NAME}-static PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
+# Set target file name (default is the target name)
+
+target_link_libraries (${PROJECT_NAME}-static ${BPP_LIBS_STATIC})
+# "Links" to all bpp components included by find_package (adds everything, -I, -L -lbpp-comps...)
+# (a manual list of bpp components targets also works here).
+
+add_library (${PROJECT_NAME}-shared SHARED ${CPP_FILES})
+target_include_directories (${PROJECT_NAME}-shared PUBLIC
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:include>
+  )
+set_target_properties (${PROJECT_NAME}-shared
+  PROPERTIES OUTPUT_NAME ${PROJECT_NAME}
+  MACOSX_RPATH 1
+  VERSION ${${PROJECT_NAME}_VERSION}
+  SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}
+  )
+target_link_libraries (${PROJECT_NAME}-shared ${BPP_LIBS_SHARED})
+target_compile_options (${PROJECT_NAME}-shared
+  PUBLIC ${public-compile-options}
+  PRIVATE ${private-compile-options}
+  )
+# Build the shared lib, using the same system
+
+install (
+  TARGETS ${PROJECT_NAME}-static ${PROJECT_NAME}-shared
+  EXPORT ${PROJECT_NAME}-targets
+  LIBRARY DESTINATION lib${LIB_SUFFIX}
+  ARCHIVE DESTINATION lib${LIB_SUFFIX}
+  )
+# Install libraries, while recording them under "${PROJECT_NAME}-targets"
+
+install (
+  DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bpp
+  DESTINATION include
+  FILES_MATCHING PATTERN "*.h"
+  )
+# Install headers (using the sub Bpp dir avoids looking into CMake temporary internal dirs in case of in tree build).
+
+install (EXPORT ${PROJECT_NAME}-targets DESTINATION ${cmake-package-location})
+# Install the target export file, that defines "imported targets" with properties for the two libs.
+
+####################################################################################################
+# bpp-something-config.cmake.in
+# CMake package file template, will be expanded into a valid cmake file by configure_package_config_file()
+####################################################################################################
+
+ at PACKAGE_INIT@
+# Boilerplate from CMake (I do not think this is required in our case, but they say its better to use it).
+
+if (NOT @PROJECT_NAME at _FOUND)
+# Protection against double include of this package.
+
+find_package (bpp-core @bpp-core_VERSION@ REQUIRED)
+# Find dependencies.
+# bpp-core_VERSION is a variable defined in main CMakeLists to the version of the found bpp-core component.
+# @bpp-core_VERSION@ will be replaced by the version that was found.
+# Thus, after installation, this package of bpp-something we require the same version.
+
+include ("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME at -targets.cmake")
+# Include the imported targets
+
+set (BPP_LIBS_STATIC "${BPP_LIBS_STATIC}" @PROJECT_NAME at -static)
+set (BPP_LIBS_SHARED "${BPP_LIBS_SHARED}" @PROJECT_NAME at -shared)
+# Append targets to convenient lists
+
+get_property (static-location TARGET @PROJECT_NAME at -static PROPERTY LOCATION)
+get_property (shared-location TARGET @PROJECT_NAME at -shared PROPERTY LOCATION)
+get_property (header-location TARGET @PROJECT_NAME at -static PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+message (STATUS "@PROJECT_NAME@ @PROJECT_VERSION@ found:")
+message (STATUS "  static lib: ${static-location}")
+message (STATUS "  shared lib: ${shared-location}")
+message (STATUS "  includes: ${header-location}")
+unset (static-location)
+unset (shared-location)
+unset (header-location)
+# Print information about this package when included (version, paths of libs and includes).
+
+endif (NOT @PROJECT_NAME at _FOUND)
+
+####################################################################################################
+# test.CMakeLists.txt
+# Performs tests
+####################################################################################################
+
+file (GLOB test_cpp_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
+# Each .cpp file in test/ is considered to be a test.
+# Globbing is more error prone than an explicit list, but tests are not critical.
+# This allow tests to be added without having to modify the CMakelist (just re-run cmake).
+
+foreach (test_cpp_file ${test_cpp_files})
+  get_filename_component (test_name ${test_cpp_file} NAME_WE)
+  add_executable (${test_name} ${test_cpp_file})
+  # Each test is named after the cpp file without extension.
+
+  target_link_libraries (${test_name} ${PROJECT_NAME}-shared)
+  # Link to bpp-something shared library (pulls required -I -L -lbpp-*).
+
+  add_test (
+    NAME ${test_name}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    COMMAND ${test_name}
+    )
+  # Add test to "make test".
+  # The command must return EXIT_SUCCESS (usually 0) to be considered successful.
+  # Test is run explicitely in CMAKE_CURRENT_SOURCE_DIR to allow out of tree builds (find data files).
+endforeach (test_cpp_file)
diff --git a/cmake/project-template-for-users.cmake b/cmake/project-template-for-users.cmake
new file mode 100644
index 0000000..6fd957a
--- /dev/null
+++ b/cmake/project-template-for-users.cmake
@@ -0,0 +1,106 @@
+# Template project file to compile a program with Bio++ libraries
+# Authors:
+#   Francois Gindraud (2017)
+# Created: 21/04/2017
+
+# This file gives an example of how to compile your program using CMake and Bio++.
+# Do not just copy the file as is, but use it as a guideline for your own project.
+# If just copied and rename into place, some commands in section ADVANCED will interfere with the BASIC config.
+# Remember that to be processed by CMake, the project file must be named "CMakeLists.txt".
+
+################################### BASIC ####################################
+# This is a basic configuration for users with Bio++ libraries installed in a standard system place (/usr/).
+
+# These two lines are CMake boilerplate
+cmake_minimum_required (VERSION 2.8.11) # Test of version. 2.8.11 is the oldest version supported by Bio++
+project (myproject CXX) # The name is not critical
+
+# Find Bio++ libraries and import their configurations.
+find_package (bpp-core)
+find_package (bpp-seq)
+
+# Bio++ REQUIRES using at least the C++11 standard.
+# This line specifies options passed to the compiler (you can add your own).
+set (CMAKE_CXX_FLAGS "-std=c++11")
+
+# Tells CMake to create a binary from dummy.cpp (replace with your .cpp file(s))
+add_executable (myprogram dummy.cpp other.cpp)
+
+# Link with the shared libraries of Bio++
+target_link_libraries (myprogram ${BPP_LIBS_SHARED})
+
+# You can then compile your program with:
+# $ cmake .
+# $ make
+
+################################# ADVANCED ###################################
+# Here we give some more advanced details
+
+### Out of tree advice:
+# CMake supports what is called "out of tree build":
+# $ mkdir build
+# $ cd build
+# $ cmake <options> ..
+# $ make
+# In this form, you can easily delete all CMake stuff and generated files by deleting the build/ dir.
+# It can be useful if you want to be sure to recompile from a clean state.
+
+### find_package(bpp-<module>):
+#
+# If Bio++ is installed in a non standard path, CMake MUST be told to look there for it to find the Bio++ libraries.
+# This can be done with: $ cmake -DCMAKE_PREFIX_PATH=<bpp-location> .
+#
+# find_package(bpp-<module>) defines, if successful:
+# - a bpp-<module>-static symbol to link with the static library
+# - a bpp-<module>-shared symbol to link with the shared library
+# - variables BPP_LIBS_SHARED and BPP_LIBS_STATIC that includes the related symbols and symbols of Bio++ dependencies.
+# The bpp-<module>-{static/shared} symbols also force CMake to link to their Bio++ dependencies.
+# find_package of a a module also does a find_package of dependency Bio++ modules.
+#
+# So, for bpp-phyl (which depends on bpp-seq and bpp-core):
+find_package (bpp-phyl)
+# Is equivalent to:
+find_package (bpp-core)
+find_package (bpp-seq)
+find_package (bpp-phyl)
+# And the following target_link_libraries commands are equivalent:
+target_link_libraries (myprogram bpp-phyl-shared)
+target_link_libraries (myprogram bpp-core-shared bpp-seq-shared bpp-phyl-shared)
+target_link_libraries (myprogram ${BPP_LIBS_SHARED})
+# The short form relies on Bio++ inter module dependencies, but they are unlikely to change.
+
+### Static libraries can be linked by using either:
+target_link_libraries (myprogram bpp-phyl-static)
+target_link_libraries (myprogram ${BPP_LIBS_STATIC})
+# They make your binary program self contained (all Bio++ code is included with it).
+# It can be given to people without having them install Bio++.
+# However, the binary will be huge (10 to 100MB depending of which modules are used).
+# Using `$ strip myprogram` can reduce the binary size.
+
+### Shared libraries, RPATH and LD_LIBRARY_PATH:
+# If you installed Bio++ to a NON STANDARD path and use the shared libraries, you might run into problems like:
+# ./myprog: error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory
+#
+# The problem is that your executable must find the Bio++ shared library before starting.
+# Libraries are normally searched in standard paths (/usr/lib).
+# Two options exist to add a custom search path (to you Bio++ custom install path):
+# - adding the path to the LD_LIBRARY_PATH environment variable.
+# - adding the path as an RPATH entry in the executable 'myprog' itself.
+#
+# LD_LIBRARY_PATH:
+# - does not require modifying the executable.
+# - the executable can be used everywhere as long as the local Bio++ libs are in /usr/lib or in LD_LIBRARY_PATH.
+# - LD_LIBRARY_PATH paths are used by all program to search for their libs (i.e. other commands in the shell).
+#
+# RPATH:
+# - the executable runs without having to tweak LD_LIBRARY_PATH or anything else.
+# - the executable includes hard-coded paths, so it CANNOT BE PUBLISHED as the paths are local to your system.
+# - by default, the executable in the CMake build directory (after 'make') uses RPATH.
+# - by default, "installed" executables (after 'make install') have no RPATH.
+# - You can force the use of RPATH in installed executables with "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE"
+# - if using RPATHs, consider compiling Bio++ with them by adding "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE" during installation.
+# - if you need an installed executable (to publish it without RPATH), add an install command:
+install (TARGETS myprogram RUNTIME DESTINATION bin)
+# And run `$ make install` to install it.
+# You can select the location at the configuration step with -DCMAKE_INSTALL_PREFIX=<path>
+# Or at install step with `$ make DESTDIR=<prefix> install`
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index db8e565..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,71 +0,0 @@
-libbpp-seq (2.2.0-1) unstable; urgency=low
-
-  * Alphabet classes refreshed and updated
-  * Bug fixes.
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Thu, 23 Sep 2014 14:00:00 +0100
-
-libbpp-seq (2.1.0-1) unstable; urgency=low
-
-  * 'omics' tools now in bpp-seq-omics
-  * Extended BppO support
-  * StateProperties renamed to AlphabetIndex
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Tue, 05 Mar 2013 14:31:00 +0100
-
-libbpp-seq (2.0.3-1) unstable; urgency=low
-
-  * Bugs fixed in maf parser + new iterators
-  * Added support for GFF
-  * Added support for FastQ
-  * Several bugs fixed
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Thu, 09 Feb 2012 14:00:00 +0100
-
-libbpp-seq (2.0.2-1) unstable; urgency=low
-
-  * RFP: Bio++ -- The Bio++ bioinformatics libraries. (Closes: #616373).
-  * Packages are now non-native.
-  * Bugs fixed in maf parser.
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Thu, 09 Jun 2011 11:00:00 +0100
-
-libbpp-seq (2.0.1) unstable; urgency=low
-
-  * Fixed copyright and rules file.
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Mon, 28 Feb 2011 09:00:00 +0100
-
-libbpp-seq (2.0.0) unstable; urgency=low
-
-  * New source files organization.
-  * More NGS tools: sequence annotations, quality scores, file parsers, etc.
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Mon, 07 Feb 2011 09:00:00 +0100
-
-libbpp-seq (1.7.0) unstable; urgency=low
-
-  * Several bug fixed. Compilation with -Weffc++.
-  * New compressed sites container.
-  * Improved security by changing several pointers to references.
-
- -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Thu, 25 Mar 2010 10:02:50 +0100
-
-libbpp-seq (1.6.0) unstable; urgency=low
-
-  * New support for Nexus sequence files.
-  * Update for version 1.8 of Bio++.
-
- -- Julien Dutheil <jdutheil at birc.au.dk>  Wed, 10 Jun 2009 11:28:58 +0100
-
-libbpp-seq (1.5.0) unstable; urgency=low
-
-  * Several bugs fixed, new Phred sequence format, speed improvements.
-
- -- Julien Dutheil <jdutheil at birc.au.dk>  Thu, 11 Dec 2008 12:21:37 +0100
-
-libbpp-seq (1.4.1) unstable; urgency=low
-
-  * Initial Release.
-
- -- Julien Dutheil <jdutheil at birc.au.dk>  Mon, 21 Jul 2008 15:17:26 +0200
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index 7ed6ff8..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-5
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 02efa76..0000000
--- a/debian/control
+++ /dev/null
@@ -1,25 +0,0 @@
-Source: libbpp-seq
-Section: libs
-Priority: optional
-Maintainer: Loic Dachary <loic at dachary.org>
-Uploaders: Julien Dutheil <julien.dutheil at univ-montp2.fr>
-Build-Depends: debhelper (>= 5), cmake (>= 2.6),
-  libbpp-core-dev (>= 2.2.0)
-Standards-Version: 3.9.4
-
-Package: libbpp-seq-dev
-Section: libdevel
-Architecture: any
-Depends: libbpp-seq9 (= ${binary:Version}), ${misc:Depends},
-  libbpp-core-dev (>= 2.2.0)
-Description: Bio++ Sequence library development files.
- Contains the Bio++ classes for sequence analysis.
-
-Package: libbpp-seq9
-Section: libs
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends},
-  libbpp-core2 (>= 2.2.0)
-Description: Bio++ Sequence library.
- Contains the Bio++ classes for sequence analysis.
-
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 1f950f5..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,66 +0,0 @@
-This package was debianized by Julien Dutheil <julien.dutheil at univ-montp2.fr> on
-Thu, 23 Sep 2014 14:00:00 +0100.
-
-It was downloaded from <http://biopp.univ-montp2.fr/Repositories/sources>
-
-Upstream Author: 
-
-    Julien Dutheil <julien.dutheil at univ-montp2.fr>
-
-Copyright: 
-
-    Copyright (C) 2014 Bio++ Development Team
-
-License:
-
-    This package is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
- 
-    This package 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 General Public License for more details.
- 
-    You should have received a copy of the GNU General Public License
-    along with this package; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
-
-On Debian systems, the complete text of the GNU General
-Public License can be found in `/usr/share/common-licenses/GPL'.
-
-The Debian packaging is (C) 2014, Julien Dutheil <julien.dutheil at univ-montp2.fr> and
-is licensed under the GPL, see above.
-
-The provided software is distributed under the CeCILL license:
-
-    This software is governed by the CeCILL license under French law and
-    abiding by the rules of distribution of free software.  You can  use, 
-    modify and/ or redistribute the software under the terms of the CeCILL
-    license as circulated by CEA, CNRS and INRIA at the following URL
-    "http://www.cecill.info". 
-
-    As a counterpart to the access to the source code and  rights to copy,
-    modify and redistribute granted by the license, users are provided only
-    with a limited warranty  and the software's author,  the holder of the
-    economic rights,  and the successive licensors  have only  limited
-    liability. 
-
-    In this respect, the user's attention is drawn to the risks associated
-    with loading,  using,  modifying and/or developing or reproducing the
-    software by the user in light of its specific status of free software,
-    that may mean  that it is complicated to manipulate,  and  that  also
-    therefore means  that it is reserved for developers  and  experienced
-    professionals having in-depth computer knowledge. Users are therefore
-    encouraged to load and test the software's suitability as regards their
-    requirements in conditions enabling the security of their systems and/or 
-    data to be ensured and,  more generally, to use and operate it in the 
-    same conditions as regards security. 
-
-    The fact that you are presently reading this means that you have had
-    knowledge of the CeCILL license and that you accept its terms.
-    
-The complete text of the license may be found here:
-http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
-
diff --git a/debian/docs b/debian/docs
deleted file mode 100644
index e69de29..0000000
diff --git a/debian/libbpp-seq-dev.install b/debian/libbpp-seq-dev.install
deleted file mode 100644
index 0f5727e..0000000
--- a/debian/libbpp-seq-dev.install
+++ /dev/null
@@ -1,3 +0,0 @@
-debian/tmp/usr/include/*
-debian/tmp/usr/lib/*.a
-debian/tmp/usr/lib/*.so
diff --git a/debian/libbpp-seq9.install b/debian/libbpp-seq9.install
deleted file mode 100644
index c45ebcf..0000000
--- a/debian/libbpp-seq9.install
+++ /dev/null
@@ -1 +0,0 @@
-debian/tmp/usr/lib/lib*.so.*
diff --git a/debian/postinst b/debian/postinst
deleted file mode 100755
index cff89b1..0000000
--- a/debian/postinst
+++ /dev/null
@@ -1,57 +0,0 @@
-#! /bin/bash
-
-# Abort if any command returns an error value
-set -e
-
-createGeneric() {
-  echo "-- Creating generic include file: $1.all"
-  #Make sure we run into subdirectories first:
-  dirs=()
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      dirs+=( "$file" )
-    fi
-  done
-  for dir in ${dirs[@]}
-  do
-    createGeneric $dir
-  done
-  #Now list all files, including newly created .all files:
-  if [ -f $1.all ]
-  then
-    rm $1.all
-  fi
-  dir=`basename $1`
-  for file in "$1"/*
-  do
-    if [ -f "$file" ] && ( [ "${file##*.}" == "h" ] || [ "${file##*.}" == "all" ] )
-    then
-      file=`basename $file`
-      echo "#include \"$dir/$file\"" >> $1.all
-    fi
-  done;
-}
-
-case "$1" in
-  configure)
-    # Actualize .all files
-    createGeneric /usr/include/Bpp
-  ;;
-  abort-upgrade|abort-remove|abort-deconfigure)
-    echo "$1"
-  ;;
-  *)
-    echo "postinst called with unknown argument \`\$1'" >&2
-    exit 0
-  ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/postrm b/debian/postrm
deleted file mode 100755
index 744f8b1..0000000
--- a/debian/postrm
+++ /dev/null
@@ -1,59 +0,0 @@
-#! /bin/bash
-
-# Abort if any command returns an error value
-set -e
-
-createGeneric() {
-  echo "-- Creating generic include file: $1.all"
-  #Make sure we run into subdirectories first:
-  dirs=()
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      dirs+=( "$file" )
-    fi
-  done
-  for dir in ${dirs[@]}
-  do
-    createGeneric $dir
-  done
-  #Now list all files, including newly created .all files:
-  if [ -f $1.all ]
-  then
-    rm $1.all
-  fi
-  dir=`basename $1`
-  for file in "$1"/*
-  do
-    if [ -f "$file" ] && ( [ "${file##*.}" == "h" ] || [ "${file##*.}" == "all" ] )
-    then
-      file=`basename $file`
-      echo "#include \"$dir/$file\"" >> $1.all
-    fi
-  done;
-}
-
-case "$1" in
-  remove)
-    # Automatically added by dh_makeshlibs
-    ldconfig
-    # Actualize .all files
-    createGeneric /usr/include/Bpp
-  ;;
-  purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
-    echo $1
-  ;;
-  *)
-    echo "postrm called with unknown argument \`\$1'" >&2
-    exit 0
-  ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/prerm b/debian/prerm
deleted file mode 100755
index 8fab52e..0000000
--- a/debian/prerm
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /bin/bash
-
-# Abort if any command returns an error value
-set -e
-
-removeGeneric() {
-  if [ -f $1.all ]
-  then
-    echo "-- Remove generic include file: $1.all"
-    rm $1.all
-  fi
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      removeGeneric $file
-    fi
-  done
-}
-
-case "$1" in
-  remove|upgrade|deconfigure)
-    # Actualize .all files
-    removeGeneric /usr/include/Bpp
-  ;;
-  failed-upgrade)
-    echo "$1"
-  ;;
-  *)
-    echo "prerm called with unknown argument \`$1'" >&2
-    exit 1
-  ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 34313ef..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# 24/01/10 Modification for use with CMake by Julien Dutheil.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-
-# These are used for cross-compiling and for saving the configure script
-# from having to guess our platform (since we know it already)
-DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
-DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
-
-
-CFLAGS = -Wall -g
-
-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
-	CFLAGS += -O0
-else
-	CFLAGS += -O2
-endif
-
-# shared library versions
-version=`ls src/lib*.so.* | \
- awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'`
-major=`ls src/lib*.so.* | \
- awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'`
-
-configure:
-	cmake -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF .
-
-config.status: configure
-	dh_testdir
-
-build: build-arch build-indep
-build-arch: build-stamp
-build-indep: build-stamp
-build-stamp:  config.status
-	dh_testdir
-
-	# Add here commands to compile the package.
-	$(MAKE)
-
-	touch $@
-
-clean:
-	dh_testdir
-	dh_testroot
-
-	# Add here commands to clean up after the build process.
-	[ ! -f Makefile ] || $(MAKE) clean;
-	[ ! -f Makefile ] || rm Makefile;
-	[ ! -f src/Makefile ] || rm src/Makefile;
-	[ ! -f test/Makefile ] || rm test/Makefile;
-	rm -f config.sub config.guess
-	rm -f build-stamp
-	rm -f CMakeCache.txt
-	rm -f *.cmake
-	rm -f src/*.cmake
-	rm -f test/*.cmake
-	rm -rf CMakeFiles
-	rm -rf src/CMakeFiles
-	rm -rf test/CMakeFiles
-	rm -rf _CPack_Packages
-	rm -rf Testing
-	rm -f DartConfiguration.tcl
-
-	dh_clean 
-
-install: build
-	dh_testdir
-	dh_testroot
-	dh_prep 
-	dh_installdirs
-
-	# Add here commands to install the package into debian/tmp
-	$(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
-
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
-	dh_testdir
-	dh_testroot
-	dh_installchangelogs ChangeLog
-	dh_installdocs
-	dh_installexamples
-	dh_install
-#	dh_installmenu
-#	dh_installdebconf	
-#	dh_installlogrotate
-#	dh_installemacsen
-#	dh_installpam
-#	dh_installmime
-#	dh_installinit
-#	dh_installcron
-#	dh_installinfo
-	dh_installman
-	dh_link
-	dh_strip
-	dh_compress
-	dh_fixperms
-#	dh_perl
-#	dh_python
-	dh_makeshlibs
-	dh_installdeb
-	dh_shlibdeps
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install 
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/genIncludes.sh b/genIncludes.sh
deleted file mode 100755
index 56710e9..0000000
--- a/genIncludes.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#! /bin/bash
-
-createGeneric() {
-  echo "-- Creating generic include file: $1.all"
-  #Make sure we run into subdirectories first:
-  dirs=()
-  for file in "$1"/*
-  do
-    if [ -d "$file" ]
-    then
-      # Recursion:
-      dirs+=( "$file" )
-    fi
-  done
-  for dir in ${dirs[@]}
-  do
-    createGeneric $dir
-  done
-  #Now list all files, including newly created .all files:
-  if [ -f $1.all ]
-  then
-    rm $1.all
-  fi
-  dir=`basename $1`
-  for file in "$1"/*
-  do
-    if [ -f "$file" ] && ( [ "${file##*.}" == "h" ] || [ "${file##*.}" == "all" ] )
-    then
-      file=`basename $file`
-      echo "#include \"$dir/$file\"" >> $1.all
-    fi
-  done;
-}
-
-createGeneric $1
diff --git a/package.cmake.in b/package.cmake.in
new file mode 100644
index 0000000..f3005c0
--- /dev/null
+++ b/package.cmake.in
@@ -0,0 +1,25 @@
+# CMake package file for Bio++ Core
+# Authors:
+#   Francois Gindraud (2017)
+# Created: 08/03/2017
+ at PACKAGE_INIT@
+
+if (NOT @PROJECT_NAME at _FOUND)
+  # No deps
+  # Add targets
+  include ("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME at -targets.cmake")
+  # Append targets to convenient lists
+  set (BPP_LIBS_STATIC "${BPP_LIBS_STATIC}" @PROJECT_NAME at -static)
+  set (BPP_LIBS_SHARED "${BPP_LIBS_SHARED}" @PROJECT_NAME at -shared)
+  # Print some path info for targets
+  get_property (static-location TARGET @PROJECT_NAME at -static PROPERTY LOCATION)
+  get_property (shared-location TARGET @PROJECT_NAME at -shared PROPERTY LOCATION)
+  get_property (header-location TARGET @PROJECT_NAME at -static PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+  message (STATUS "@PROJECT_NAME@ @PROJECT_VERSION@ found:")
+  message (STATUS "  static lib: ${static-location}")
+  message (STATUS "  shared lib: ${shared-location}")
+  message (STATUS "  includes: ${header-location}")
+  unset (static-location)
+  unset (shared-location)
+  unset (header-location)
+endif (NOT @PROJECT_NAME at _FOUND)
diff --git a/src/Bpp/App/ApplicationTools.cpp b/src/Bpp/App/ApplicationTools.cpp
new file mode 100644
index 0000000..2e6bffa
--- /dev/null
+++ b/src/Bpp/App/ApplicationTools.cpp
@@ -0,0 +1,374 @@
+//
+// File: ApplicationTools.cpp
+// Created by: Julien Dutheil
+// Created on: Fri Oct 21 16:19 2005
+// From old file created on: Sun Dec 14 09:36:26 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide basal and 
+utilitary classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "ApplicationTools.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <cmath>
+
+using namespace std;
+
+/******************************************************************************/
+
+OutputStream* ApplicationTools::error   = new StdErr();
+OutputStream* ApplicationTools::message = new StdOut();
+OutputStream* ApplicationTools::warning = new StdOut();
+time_t ApplicationTools::startTime;
+size_t ApplicationTools::terminalWidth = 80;
+float ApplicationTools::terminalSplit = 0.5;
+bool ApplicationTools::interactive = true;
+int ApplicationTools::warningLevel = 0;
+
+
+/******************************************************************************/
+  
+std::vector<std::string> ApplicationTools::matchingParameters(const std::string& pattern, std::map<std::string, std::string>& params)
+{
+  vector<string> retv;
+
+  map<string, string>::iterator it;
+  for (it=params.begin(); it!=params.end(); it++)
+  {
+    StringTokenizer stj(pattern, "*", true, false);
+    size_t pos1, pos2;
+    string parn = it->first;
+    bool flag(true);
+    string g = stj.nextToken();
+    pos1 = parn.find(g);
+    if (pos1 != 0)
+      flag = false;
+    pos1 += g.length();
+    while (flag && stj.hasMoreToken())
+      {
+        g = stj.nextToken();
+        pos2 = parn.find(g, pos1);
+        if (pos2 == string::npos)
+          {
+            flag = false;
+            break;
+          }
+        pos1 = pos2 + g.length();
+      }
+    if (flag &&
+        ((g.length() == 0) || (pos1 == parn.length()) || (parn.rfind(g) == parn.length() - g.length())))
+      retv.push_back(parn);
+  }
+
+  return retv;
+}
+
+std::vector<std::string> ApplicationTools::matchingParameters(const std::string& pattern, std::vector<std::string>& params)
+{
+  vector<string> retv;
+
+  for (size_t i=0;i<params.size();i++)
+  {
+    StringTokenizer stj(pattern, "*", true, false);
+    size_t pos1, pos2;
+    string parn = params[i];
+    bool flag(true);
+    string g = stj.nextToken();
+    pos1 = parn.find(g);
+    if (pos1 != 0)
+      flag = false;
+    pos1 += g.length();
+    while (flag && stj.hasMoreToken())
+    {
+      g = stj.nextToken();
+      pos2 = parn.find(g, pos1);
+      if (pos2 == string::npos)
+      {
+        flag = false;
+        break;
+      }
+      pos1 = pos2 + g.length();
+    }
+    if (flag &&
+        ((g.length() == 0) || (pos1 == parn.length()) || (parn.rfind(g) == parn.length() - g.length())))
+      retv.push_back(parn);
+  }
+
+  return retv;
+}
+
+/******************************************************************************/
+
+string ApplicationTools::getAFilePath(
+  const string& parameter,
+  map<string, string>& params,
+  bool isRequired,
+  bool mustExist,
+  const string& suffix,
+  bool suffixIsOptional,
+  const string& defaultPath, 
+  int warn) throw (Exception)
+{
+  string filePath = getStringParameter(parameter, params, defaultPath, suffix, suffixIsOptional, warn);
+  if (filePath == "") filePath = "none";
+  if (filePath == "none" && isRequired)
+  {
+    throw Exception("You must specify a file for this parameter: " + parameter + (suffixIsOptional ? "" : suffix));
+  }
+  if(filePath == "none") return filePath;
+  if(mustExist && !FileTools::fileExists(filePath))
+  {
+    throw Exception("File does not exists: " + filePath);
+  }
+  return filePath;
+}
+
+/******************************************************************************/
+
+double ApplicationTools::getDoubleParameter(
+  const std::string& parameterName,
+  std::map<std::string, std::string>& params,
+  double defaultValue,
+  const std::string& suffix,
+  bool suffixIsOptional,
+  int warn)
+{
+  double dParam = defaultValue;
+  if (parameterExists(parameterName + suffix, params))
+  {
+    dParam = TextTools::toDouble(params[parameterName + suffix]);
+  }
+  else if (suffixIsOptional && parameterExists(parameterName, params))
+  {
+    dParam = TextTools::toDouble(params[parameterName]);
+  }
+  else if(warn <= warningLevel)
+  {
+    displayWarning("Parameter " + parameterName + suffix + " not specified. Default used instead: " + TextTools::toString(defaultValue));
+  }
+  return dParam;
+}
+
+/******************************************************************************/
+
+int ApplicationTools::getIntParameter(
+  const std::string & parameterName,
+  std::map<std::string, std::string> & params,
+  int defaultValue,
+  const std::string & suffix,
+  bool suffixIsOptional,
+  int warn)
+{
+  int iParam = defaultValue;
+  if (parameterExists(parameterName + suffix, params)) {
+    iParam = TextTools::toInt(params[parameterName + suffix]);
+  } else if(suffixIsOptional && parameterExists(parameterName, params)) {
+    iParam = TextTools::toInt(params[parameterName]);
+  } else if (warn <= warningLevel) {
+    displayWarning("Parameter " + parameterName + suffix + " not specified. Default used instead: " + TextTools::toString(defaultValue));
+  }
+  return iParam;
+}
+
+/******************************************************************************/
+
+
+bool ApplicationTools::getBooleanParameter(
+  const std::string& parameterName,
+  std::map<std::string, std::string>& params,
+  bool defaultValue,
+  const std::string& suffix,
+  bool suffixIsOptional,
+  int warn)
+{
+  string sParam;
+  bool bParam = defaultValue;
+  if (parameterExists(parameterName + suffix, params))
+  {
+    sParam = params[parameterName + suffix];
+  }
+  else if (suffixIsOptional && parameterExists(parameterName, params))
+  {
+    sParam = params[parameterName];
+  }
+  else {
+    if (warn <= warningLevel)
+    {
+      displayWarning("Parameter " + parameterName + " not specified. Default used instead: " + TextTools::toString(defaultValue));
+    }
+    return bParam;
+  }
+  if ((sParam == "true") 
+   || (sParam == "TRUE")
+   || (sParam == "t")
+   || (sParam == "T")
+   || (sParam == "yes")
+   || (sParam == "YES")
+   || (sParam == "y")
+   || (sParam == "Y")
+   || (sParam == "1"))
+    bParam = true;
+  else if ((sParam == "false") 
+        || (sParam == "FALSE")
+        || (sParam == "f")
+        || (sParam == "F")
+        || (sParam == "no")
+        || (sParam == "NO")
+        || (sParam == "n")
+        || (sParam == "N")
+        || (sParam == "0"))
+    bParam = false;
+  else throw Exception("ApplicationTools::getBooleanParameter. Wrong description:" + sParam);
+ 
+  return bParam;
+}
+
+/******************************************************************************/
+
+void ApplicationTools::displayMessage(const std::string& text) { if(message) (*message << text).endLine(); }
+    
+void ApplicationTools::displayError(const std::string& text) { if(error) (*error << "ERROR!!! " << text).endLine(); }
+    
+void ApplicationTools::displayWarning(const std::string& text) { if(warning) (*warning << "WARNING!!! " << text).endLine(); }
+
+void ApplicationTools::displayTask(const std::string& text, bool eof)
+{
+  if (message)
+  {
+    *message << TextTools::resizeRight(text, static_cast<size_t>(static_cast<float>(terminalWidth) * terminalSplit - 1), '.') << ": ";
+    if (eof) message->endLine();
+    else     message->flush();
+  }
+}
+    
+void ApplicationTools::displayTaskDone() { if(message) (*message << "Done.").endLine(); }
+
+/******************************************************************************/
+
+void ApplicationTools::displayGauge(size_t iter, size_t total, char symbol, const std::string& mes)
+{
+  if (!message) return;
+  if (total == 0) return;//We do not display anything in that case.
+  size_t width = static_cast<size_t>(static_cast<float>(terminalWidth) * terminalSplit - 2);
+  string gauge = string(static_cast<size_t>((1. * static_cast<double>(iter) / static_cast<double>(total)) * static_cast<double>(width)), symbol);
+  string info = mes;
+  size_t step = static_cast<size_t>(ceil(1. * static_cast<double>(total) / static_cast<double>(width)));
+  size_t x = iter % step;
+  if (interactive)
+  {
+    string fill = string(width - gauge.length(), ' ');
+    gauge = "[" + gauge + fill + "] " + TextTools::resizeLeft(TextTools::toString(100 * iter / total), 3) + "%";
+    if (mes.size() > terminalWidth - gauge.size())
+      info = TextTools::resizeRight(mes, terminalWidth - gauge.size());
+    if (x == 0 || iter == total) { *message << '\r' + info + gauge; message->flush(); }
+  }
+  else
+  {
+    if (iter == 0)
+    {
+      *message << "[";
+      message->flush();
+      return;
+    }
+    if (iter >= total)
+    {
+      size_t fill = static_cast<size_t>(static_cast<float>(terminalWidth) * terminalSplit) - (total - 1) / step - 1;
+      *message << TextTools::resizeLeft("]", fill, symbol);
+      message->flush();
+      return;
+    }
+    if (x == 0) { *message << symbol; message->flush(); }
+  }
+}
+
+/******************************************************************************/
+
+void ApplicationTools::displayUnlimitedGauge(size_t iter, const std::string& mes)
+{
+  if (!message) return;
+  string chars = "-/-\\";
+  string info = mes;
+  if (interactive)
+  {
+    unsigned int i = iter % 4;
+    *message << '\r' << info << chars[i] << " " << TextTools::toString(iter);
+    message->flush();
+  }
+  else
+  {
+    if (iter == 0)
+      *message << info;
+    *message << "*";
+    message->flush();
+    return;
+  }
+}
+
+/******************************************************************************/
+  
+void ApplicationTools::displayTime(const std::string& msg)
+{
+  time_t endTime;
+  time(&endTime);
+  if (message)
+  {
+    double nsec = difftime(endTime, startTime);
+    double nmin = floor(nsec/60.);
+    double nhou = floor(nmin/60.);
+    double nday = floor(nhou/24.);
+    nhou = nhou - nday * 24;
+    nmin = nmin - (nday * 24 + nhou) * 60;
+    nsec = nsec - ((nday * 24 + nhou) * 60 + nmin) * 60;
+    *message << msg << " ";
+    *message << nday << "d, ";
+    *message << nhou << "h, ";
+    *message << nmin << "m, ";
+    *message << nsec << "s.";
+    message->endLine();
+  }
+}
+
+/******************************************************************************/
+  
+double ApplicationTools::getTime()
+{
+  time_t endTime;
+  time(&endTime);
+  return difftime(endTime, startTime);
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/App/ApplicationTools.h b/src/Bpp/App/ApplicationTools.h
new file mode 100644
index 0000000..77a8ab1
--- /dev/null
+++ b/src/Bpp/App/ApplicationTools.h
@@ -0,0 +1,640 @@
+//
+// File: ApplicationTools.h
+// Created by: Julien Dutheil
+// Created on: Fri Oct 21 16:19 2005
+// From old file created on: Sun Dec 14 09:36:26 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide basal and 
+  utilitary classes. This file belongs to the Bio++ Project.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _APPLICATIONTOOLS_H_
+#define _APPLICATIONTOOLS_H_
+
+#include "../Io/FileTools.h"
+#include "../Io/OutputStream.h"
+#include "../Text/TextTools.h"
+#include "../Text/StringTokenizer.h"
+#include "../Text/NestedStringTokenizer.h"
+
+#include "../Numeric/Matrix/Matrix.h"
+
+// From the STL:
+#include <map>
+#include <vector>
+#include <iostream>
+#include <ctime>
+
+namespace bpp
+{
+
+/**
+ * @brief This class provides some common tools for developping applications.
+ *
+ * These functions are designed for helping to parse an option file.
+ * 
+ * The option files are supposed to follow this simple format:<br>
+ * @code
+ * parameterName = parameterContent
+ * @endcode
+ * with one parameter per line.
+ *
+ * In files, shell comments:
+ * @code
+ * # my comment line here
+ * @endcode
+ * C comments:
+ * @code
+ * / * my comment block here * /
+ * @endcode
+ * and C++ comments:
+ * @code
+ * // my comment line here
+ * @endcode
+ * are allowed, and ignored while parsing.
+ *
+ * Some methods for displaying information (messages, errors, warnings...) are also provided.
+ *
+ * Methods dealing with parameters takes as argument a map<string, string> object
+ * containing the parameters (names are the keys of the map, and values are... the values of the map!).
+ * These map objects may be obtained from the AttributesTools utilitary class.
+ */
+  class ApplicationTools
+  {
+  public:
+    
+    /**
+     * @brief The output stream where errors have to be displayed.
+     */
+    static OutputStream* error;
+    /**
+     * @brief The output stream where messages have to be displayed.
+     */
+    static OutputStream* message;
+    /**
+     * @brief The output stream where warnings have to be displayed.
+     */
+    static OutputStream* warning;
+
+    /**
+     * @brief Timer variable.
+     */
+    static time_t startTime;
+
+    /**
+     * @brief The width of the output terminal (in character).
+     */
+    static size_t terminalWidth;
+
+    /**
+     * @brief The fraction of terminal width dedicated to messages.
+     */
+    static float terminalSplit;
+
+    /**
+     * @brief Tell if the program is interactive (typically run in foreground). Default to yes.
+     */
+    static bool interactive;
+ 
+    /**
+     * @brief Specify the amount of warning to display.
+     */
+    static int warningLevel;
+
+  public:
+    ApplicationTools() {}
+    virtual ~ApplicationTools() {}
+  
+  public:
+
+    /**
+     * @brief Tells if a parameter have been specified.
+     *
+     * @param parameterName The name of the parameter.
+     * @param params        The parameter list.
+     * @return True is the parameter of specified name is in the list.
+     */
+    static bool parameterExists(const std::string& parameterName, const std::map<std::string, std::string>& params)
+    {
+      std::map<std::string, std::string>::const_iterator it=params.find(parameterName);
+  
+      return (it != params.end() && !TextTools::isEmpty(it->second));
+    }
+
+
+    static bool parameterExists(const std::string& parameterName, std::vector<std::string>& params)
+    {
+      for (size_t i = 0; i < params.size(); ++i)
+        if (params[i] == parameterName)
+          return true;
+
+      return false;
+    }
+
+    /**
+     * @brief Returns a vector of parameter names that match a given pattern.
+     *
+     * Only "*" wildcard is implemented now.
+     *
+     * @param pattern The pattern.
+     * @param params  The parameter list.
+     * @return a vector of matching names.
+     */  
+    static std::vector<std::string> matchingParameters(const std::string& pattern, std::map<std::string, std::string>& params);
+
+    static std::vector<std::string> matchingParameters(const std::string& pattern, std::vector<std::string>& params);
+
+    /**
+     * @brief Get a double parameter.
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    static double getDoubleParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      double defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      int warn = 0);
+  
+    /**
+     * @brief Get an integer parameter.
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    static int getIntParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      int defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      int warn = 0);
+  
+    /**
+     * @brief Get a string parameter.
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    
+    static std::string getStringParameter(
+      const std::string& parameterName,
+      const std::map<std::string, std::string>& params,
+      const std::string& defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      int warn = 0)
+    {
+      std::string sParam = defaultValue;
+      std::map<std::string, std::string>::const_iterator it1=params.find(parameterName + suffix);  
+      if (it1 != params.end() && !TextTools::isEmpty(it1->second))
+        sParam = it1->second;
+      else
+      {
+        std::map<std::string, std::string>::const_iterator it2=params.find(parameterName);  
+        if (suffixIsOptional && it2 != params.end() && !TextTools::isEmpty(it2->second))
+          sParam = it2->second;
+        else
+          if (warn <= warningLevel) {
+            displayWarning("Parameter " + parameterName + " not specified. Default used instead: " + defaultValue);
+          }
+      }
+  
+      return sParam;
+    }
+    
+
+    /**
+     * @brief Get a boolean parameter.
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    static bool getBooleanParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      bool defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      int warn = 0);
+
+    /**
+     * @brief Get a parameter.
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    template<class T> static T getParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      T defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      int warn = 0)
+    {
+      T tParam = defaultValue;
+      if (parameterExists(parameterName + suffix, params))
+      {
+        tParam = TextTools::to<T>(params[parameterName + suffix]);
+      }
+      else if (suffixIsOptional && parameterExists(parameterName, params))
+      {
+        tParam = TextTools::to<T>(params[parameterName]);
+      }
+      else if (warn <= warningLevel)
+      {
+        displayWarning("Parameter " + parameterName + suffix + " not specified. Default used instead: " + TextTools::toString(defaultValue));
+      }
+      return tParam;
+    }
+  
+
+    /**
+     * @brief Get a file path.
+     *
+     * @param parameter        The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param isRequired       Tell if this path is strictly required or is optional
+     * (in the first case, if the parameter is not found, the programm will
+     * send an error and exit).
+     * @param mustExist        Tell if the corresponding file must already exist.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param defaultPath      Path to use if no argument is provided.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @throw Exception        If no file path is specified and isRequired is
+     *                         true, or the file does not exist and mustExist
+     *                         is set to true.
+     */
+    static std::string getAFilePath(
+      const std::string& parameter,
+      std::map<std::string, std::string>& params,
+      bool isRequired = true,
+      bool mustExist = true,
+      const std::string& suffix = "",
+      bool suffixIsOptional = false,
+      const std::string& defaultPath = "none", 
+      int warn = 0) throw (Exception);
+
+    /**
+     * @brief Get a vector.
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param separator        The character used to delimit values.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    template<class T> static std::vector<T> getVectorParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      char separator,
+      const std::string& defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      int warn = 0)
+    {
+      std::string s = getStringParameter(parameterName, params, defaultValue, suffix, suffixIsOptional, warn);
+      if (TextTools::isEmpty(s)) return std::vector<T>(0);
+      if (s[0] == '(' && s[s.size() - 1] == ')') {
+        //This is a delimited vector:
+        s = s.substr(1, s.size() - 2);
+        if (TextTools::isEmpty(s)) return std::vector<T>(0);
+      }
+      NestedStringTokenizer st(s, "(", ")", TextTools::toString(separator));
+      size_t n = st.numberOfRemainingTokens();
+      std::vector<T> v(n);
+      for (size_t i = 0; i < n; i++)
+      {
+        v[i] = TextTools::fromString<T>(st.nextToken());
+      }
+      return v;
+    }
+
+    /**
+     * @brief Get a vector.
+     *
+     * Similar to getVectorParameter, but dedicated to numerical values.
+     * It allows the possibility to set range of values, which will be incremented by 1 (like the : operator in R).
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param separator        The character used to delimit values.
+     * @param rangeOperator    The character used to delimit ranges (the + 1 operator must be available for T).
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+    template<class T> static std::vector<T> getVectorParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      char separator,
+      char rangeOperator,
+      const std::string& defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      bool warn = true)
+    {
+      std::string s = getStringParameter(parameterName, params, defaultValue, suffix, suffixIsOptional, warn);
+      if (s[0] == '(' && s[s.size() - 1] == ')') {
+        //This is a delimited vector:
+        s = s.substr(1, s.size() - 2);
+        if (TextTools::isEmpty(s)) return std::vector<T>(0);
+      }
+      StringTokenizer st(s, TextTools::toString(separator));
+      size_t n = st.numberOfRemainingTokens();
+      std::vector<T> v;
+      for (size_t i = 0; i < n; i++)
+      {
+        std::string token = st.nextToken();
+        std::string::size_type pos = token.find(rangeOperator);
+        if (pos == std::string::npos)
+          v.push_back(TextTools::fromString<T>(token));
+        else
+        {
+          T d1 = TextTools::fromString<T>(token.substr(0, pos));
+          T d2 = TextTools::fromString<T>(token.substr(pos + 1));
+          for (T j = d1; j < d2; j++)
+          {
+            v.push_back(j);
+          }
+          v.push_back(d2);
+        }
+      }
+      return v;
+    }
+
+    /**
+     * @brief Get a RowMatrix. The input is made of embedded
+     * parenthesis, such as ((1,2),(3,4)), where the matrix is filled by
+     * lines. Here, the matrix would be:
+     * \f[
+     * \begin{pmatrix}
+     * 1 & 2 \\
+     * 3 & 4 \\
+     * \end{pmatrix}
+     * \f]
+     *
+     * @param parameterName    The name of the corresponding parameter.
+     * @param params           The attribute map where options may be found.
+     * @param separator        The character used to delimit values.
+     * @param defaultValue     The default value to use if the parameter is not found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return The corresponding value.
+     */
+
+    template<class T> static RowMatrix<T> getMatrixParameter(
+      const std::string& parameterName,
+      std::map<std::string, std::string>& params,
+      char separator,
+      const std::string& defaultValue,
+      const std::string& suffix = "",
+      bool suffixIsOptional = true,
+      bool warn = true)
+    {
+      RowMatrix<T> mat;
+
+      std::string s = getStringParameter(parameterName, params, defaultValue, suffix, suffixIsOptional, warn);
+      if (TextTools::isEmpty(s)) return RowMatrix<T>(0,0);
+      if (s[0] == '(' && s[s.size() - 1] == ')') {
+        //This is a delimited vector:
+        s = s.substr(1, s.size() - 2);
+        if (TextTools::isEmpty(s)) return RowMatrix<T>(0,0);
+      }
+    
+      StringTokenizer st1(s, "()");
+    
+      while (st1.hasMoreToken())
+      {
+        std::string si=st1.nextToken();
+        StringTokenizer st2(si, TextTools::toString(separator));
+        size_t n = st2.numberOfRemainingTokens();
+
+        std::vector<T> v(n);
+        for (size_t i = 0; i < n; i++)
+        {
+          v[i] = TextTools::fromString<T>(st2.nextToken());
+        }
+      
+        if (v.size()!=0)
+          mat.addRow(v);
+      }
+      return mat;
+    }
+
+
+    /**
+     * @name Output methods.
+     *
+     * @{
+     */
+    
+    /**
+     * @brief Print a message.
+     *
+     * @param text The text of the message.
+     */
+    static void displayMessage(const std::string& text);
+    
+    /**
+     * @brief Print an error message.
+     *
+     * @param text The text of the message.
+     */
+    static void displayError(const std::string& text);
+    
+    /**
+     * @brief Print a warning message.
+     *
+     * @param text The text of the message.
+     */
+    static void displayWarning(const std::string& text);
+    
+    /**
+     * @brief Print a task message.
+     *
+     * Display the message and flush the buffer, but do not end the current line.
+     *
+     * @param text The text of the message.
+     * @param eof  Insert a carriage return after displaying the message.
+     */
+    static void displayTask(const std::string& text, bool eof = false);
+    
+    /**
+     * @brief Print a task ended message.
+     *
+     * Print "Done." and go to next line.
+     */
+    static void displayTaskDone();
+    
+    /**
+     * @brief Print a result message.
+     *
+     * Result will be aligned to 30 character from the begining of the message.
+     * ex: text = "Here is what you get:" and result = "THAT" gives
+     * "Here is what you get:          THAT".
+     *    
+     * @param text   The text of the message.
+     * @param result The result.
+     */
+    template<class T>
+    static void displayResult(const std::string& text, const T& result)
+    {
+      displayMessage(TextTools::resizeRight(text, static_cast<size_t>(static_cast<float>(terminalWidth) * terminalSplit - 1), '.') + ": " + TextTools::toString<T>(result));
+    }
+
+    /**
+     * @brief Print a boolean result message ("yes" or "no").
+     *
+     * Result will be aligned to 30 character from the begining of the message.
+     * @param text   The text of the message.
+     * @param result The result.
+     */
+    static void displayBooleanResult(const std::string& text, bool result)
+    {
+      displayResult(text, result ? std::string("yes") : std::string("no"));
+    }
+
+    /**
+     * @brief Display a gauge.
+     *
+     * Show progress status.
+     * @code
+     * for(size_t i = 0; i < 1000; i++)
+     * {
+     *   ApplicationTools::displayGauge(i, 999, '*');
+     *   //Perform time consuming task...
+     * }
+     * @endcode
+     * will result in something like:
+     * @verbatim
+     * [************************************]
+     * @endverbatim
+     * 
+     * @param iter   The current iteration number.
+     * @param total  The total number of iteration.
+     * @param symbol The character to display in the gauge.
+     * @param mes    A message to print before the gauge.
+     */
+    static void displayGauge(size_t iter, size_t total, char symbol='>', const std::string& mes="");
+
+    /**
+     * @brief Display a gauge for unefined amount of iterations.
+     *
+     * Show progress status.
+     * @code
+     * for(size_t i = 0; i < 1000; i++)
+     * {
+     *   ApplicationTools::displayUnlimitedGauge(i);
+     *   //Perform time consuming task...
+     * }
+     * @endcode
+     * will result in something like:
+     * @verbatim
+     * - 1
+     * / 2
+     * - 3
+     * \ 4
+     * - 5
+     * etc
+     * @endverbatim
+     * 
+     * @param iter   The current iteration number.
+     * @param mes    A message to print before the gauge.
+     */
+    static void displayUnlimitedGauge(size_t iter, const std::string& mes="");
+
+
+    /** @} */
+
+    /**
+     * @brief Starts the timer.
+     */
+    static void startTimer()
+    {
+      time(&startTime);
+    }
+
+    /**
+     * @brief Display the current timer value to the 'message' stream.
+     *
+     * @param msg Message to display before time.
+     */
+    static void displayTime(const std::string& msg);
+ 
+    /**
+     * @brief Get the current timer value.
+     *
+     * @return The number of seconds from when timer was started.
+     */
+    static double getTime();
+  };
+
+} //end of namespace bpp.
+
+#endif  //_APPLICATIONTOOLS_H_
+
diff --git a/src/Bpp/Seq/Container/SequenceContainerIterator.cpp b/src/Bpp/App/BppApplication.cpp
similarity index 58%
copy from src/Bpp/Seq/Container/SequenceContainerIterator.cpp
copy to src/Bpp/App/BppApplication.cpp
index 977949d..dfbc988 100644
--- a/src/Bpp/Seq/Container/SequenceContainerIterator.cpp
+++ b/src/Bpp/App/BppApplication.cpp
@@ -1,14 +1,14 @@
 //
-// File: SequenceContainerIterator.cpp
+// File: BppApplication.cpp
 // Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:44 2013
+// Created on: Sat Aug 08 08:21 2009
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide basal and 
+utilitary classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,39 +37,41 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SequenceContainerIterator.h"
-
-using namespace bpp;
+#include "BppApplication.h"
+#include "../Utils/AttributesTools.h"
+#include "../Numeric/Random/RandomTools.h"
+#include "ApplicationTools.h"
 
 // From the STL:
 #include <iostream>
 
+using namespace bpp;
 using namespace std;
 
-/******************************************************************************/
-	
-AbstractSequenceContainerIterator::AbstractSequenceContainerIterator(const OrderedSequenceContainer& sequences) :
-  sequences_(&sequences),
-  currentPosition_(0)
-{}
-
-/******************************************************************************/
-	
-SimpleSequenceContainerIterator::SimpleSequenceContainerIterator(const OrderedSequenceContainer& sequences):
-  AbstractSequenceContainerIterator(sequences) {}
-
-const Sequence* SimpleSequenceContainerIterator::nextSequence()
+BppApplication::BppApplication(int argc, char* argv[], const std::string& name): appName_(name), params_(), timerStarted_(false)
 {
-	const Sequence* s = &sequences_->getSequence(currentPosition_);
-	currentPosition_++;
-	return s;
+  cout << "Parsing options:" << endl;  
+  params_ = AttributesTools::parseOptions(argc, argv);
+  ApplicationTools::warningLevel = ApplicationTools::getIntParameter("--warning", params_, 0, "", true, 3);
+  bool noint = ApplicationTools::getBooleanParameter("--noninteractive", params_, false, "", true, 3);
+  ApplicationTools::interactive = !noint;
+  long seed = ApplicationTools::getParameter<long>("--seed", params_, -1, "", true, 3);
+  if (seed >= 0) {
+    RandomTools::setSeed(seed);
+    ApplicationTools::displayResult("Random seed set to", seed);
+  }
 }
 
-bool SimpleSequenceContainerIterator::hasMoreSequences() const
+void BppApplication::startTimer()
 {
-	return currentPosition_ < sequences_->getNumberOfSequences();
+  ApplicationTools::startTimer();
+  timerStarted_ = true;
 }
 
-/******************************************************************************/
-
+void BppApplication::done()
+{
+  cout << appName_ << "'s done. Bye." << endl;
+  if (timerStarted_)
+    ApplicationTools::displayTime("Total execution time:");
+}
 
diff --git a/src/Bpp/Seq/Io/AbstractOAlignment.h b/src/Bpp/App/BppApplication.h
similarity index 59%
copy from src/Bpp/Seq/Io/AbstractOAlignment.h
copy to src/Bpp/App/BppApplication.h
index 2991063..78286f0 100644
--- a/src/Bpp/Seq/Io/AbstractOAlignment.h
+++ b/src/Bpp/App/BppApplication.h
@@ -1,14 +1,14 @@
 //
-// File: AbstractOAlignment.h
+// File: BppApplication.h
 // Created by: Julien Dutheil
-// Created on: ?
+// Created on: Sat Aug 08 08:21 2009
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. Development Team, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide basal and 
+utilitary classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,50 +37,45 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _ABSTRACTOALIGNMENT_H_
-#define _ABSTRACTOALIGNMENT_H_
+#ifndef _BPPAPPLICATION_H_
+#define _BPPAPPLICATION_H_
 
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Container/VectorSequenceContainer.h"
+#include "../Exceptions.h"
 
 // From the STL:
 #include <string>
-#include <fstream>
+#include <map>
 
 namespace bpp
 {
 
-/**
- * @brief Partial implementation of the OAlignment interface.
- */
-class AbstractOAlignment:
-  public virtual OAlignment
-{
+  class BppApplication
+  {
+    private:
+      std::string appName_;
+      mutable std::map<std::string, std::string> params_;
+      bool timerStarted_;
+
+    public:
+      BppApplication(int argc, char* argv[], const std::string& name);
+
+    public:
+      void startTimer();
+      void done();
+
+      std::map<std::string, std::string>& getParams() { return params_; }
+
+      const std::string& getParam(const std::string& name) const throw (Exception)
+      {
+        if (params_.find(name) == params_.end()) throw Exception("BppApplication::getParam(). Parameter '" + name + "' not found.");
+        return params_[name];
+      }
+      
+      std::string& getParam(const std::string& name) { return params_[name]; }
+
+  };
+
+} //end of namespace bpp;
 
-	public: 
-		AbstractOAlignment() {}
-		virtual ~AbstractOAlignment() {}
-
-	public:
-
-		/**
-		 * @name OAlignment methods:
-		 *
-		 * @{
-		 */ 
-		void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception) = 0;
-		void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-		{
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-			writeAlignment(output, sc);
-			output.close();
-		}
-		/** @} */
-};
-
-} //end of namespace bpp.
-
-#endif //_ABSTRACTOALIGNMENT_H_
+#endif // _BPPAPPLICATION_H_
 
diff --git a/src/Bpp/App/NumCalcApplicationTools.cpp b/src/Bpp/App/NumCalcApplicationTools.cpp
new file mode 100644
index 0000000..71d7cc8
--- /dev/null
+++ b/src/Bpp/App/NumCalcApplicationTools.cpp
@@ -0,0 +1,141 @@
+//
+// File: NumCalcApplicationTools.cpp
+// Created by: Julien Dutheil
+// Created on: Sun Mar 29 15:13 2009
+//
+
+/*
+Copyright or © or Copr. CNRS, (January 13, 2009)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "NumCalcApplicationTools.h"
+#include "../Numeric/NumConstants.h"
+#include "ApplicationTools.h"
+#include "../Text/KeyvalTools.h"
+
+using namespace bpp;
+using namespace std;
+
+vector<int> NumCalcApplicationTools::seqFromString(const std::string& s, const std::string& delim, const std::string& seqdelim)
+{
+  vector<int> seq;
+  StringTokenizer * st = new StringTokenizer(s, delim, true);
+  while (st->hasMoreToken())
+  {
+    StringTokenizer * st2 = new StringTokenizer(st->nextToken(), seqdelim, true);
+
+    if (st2->numberOfRemainingTokens() > 1)
+    {
+      vector<int> tmp = VectorTools::seq(TextTools::toInt(st2->getToken(0)), TextTools::toInt(st2->getToken(1)), 1);
+      VectorTools::append(seq, tmp);
+    }
+    else
+    {
+      seq.push_back(TextTools::toInt(st2->getToken(0)));
+    }  
+  }  
+  return seq;
+}
+
+
+
+vector<double> NumCalcApplicationTools::getVector(const std::string& desc) throw (Exception)
+{
+  vector<double> values;
+  string key, val;
+
+  if(desc.substr(0,3) == "seq") // Bounds specified as sequence
+  {
+    map<string, string> keyvals;
+    KeyvalTools::multipleKeyvals(desc.substr(4, desc.size() - 5), keyvals);
+    if(keyvals.find("from") == keyvals.end()) throw Exception("Unvalid sequence specification, missing 'from' key: " + desc.substr(3, desc.size() - 5));
+    if(keyvals.find("to") == keyvals.end()) throw Exception("Unvalid sequence specification, missing 'to' key: " + desc.substr(3, desc.size() - 5));
+    if(keyvals.find("step") == keyvals.end() && keyvals.find("size") == keyvals.end())
+      throw Exception("Unvalid sequence specification, missing 'step' or 'size' key: " + desc.substr(3, desc.size() - 5));
+    double start = TextTools::toDouble(keyvals["from"]);
+    double end   = TextTools::toDouble(keyvals["to"]);
+    if(keyvals.find("step") != keyvals.end())
+    {
+      double step = TextTools::toDouble(keyvals["step"]);
+      for(double x = start; x <= end+NumConstants::TINY(); x += step)
+        values.push_back(x);
+    }
+    else
+    {
+      int size = TextTools::toInt(keyvals["size"]);
+      double step = (end - start) / (double)size;
+      for(int i = 0; i < size - 1; i++)
+        values.push_back(start + i * step);
+      values.push_back(end); // for rounding purpose.
+    }
+  }
+  else // Direct enumaration of values
+  {
+    StringTokenizer st(desc, ",");
+    while(st.hasMoreToken()) values.push_back(TextTools::toDouble(st.nextToken()));
+  }
+  return values;
+}
+
+
+
+double NumCalcApplicationTools::getDefaultValue(const ParameterList& pl, const std::string& name, double x)
+{
+  for(unsigned int i = 0; i < pl.size(); i++)
+  {
+    const Parameter& p = pl[i];
+    if(p.getName() == name)
+      return p.getValue();
+  }
+  return x;
+}
+
+
+
+ParameterGrid* NumCalcApplicationTools::getParameterGrid(
+    map<string, string>& params,
+    const string& suffix,
+    bool suffixIsOptional,
+    bool warn) throw (Exception)
+{
+  unsigned int nbParams = ApplicationTools::getParameter<unsigned int>("grid.number_of_parameters", params, 1, suffix, suffixIsOptional, warn);
+  ParameterGrid* grid = new ParameterGrid();
+  for(unsigned int i = 0; i < nbParams; i++)
+  {
+    string name = ApplicationTools::getStringParameter("grid.parameter" + TextTools::toString(i+1) + ".name", params, "", suffix, suffixIsOptional, warn);
+    vector<double> values = getVector(ApplicationTools::getStringParameter("grid.parameter" + TextTools::toString(i+1) + ".values", params, "", suffix, suffixIsOptional, warn));
+    grid->addDimension(name, values);
+  }
+  return grid;
+}
+
+
diff --git a/src/Bpp/App/NumCalcApplicationTools.h b/src/Bpp/App/NumCalcApplicationTools.h
new file mode 100644
index 0000000..b250940
--- /dev/null
+++ b/src/Bpp/App/NumCalcApplicationTools.h
@@ -0,0 +1,134 @@
+//
+// File: NumCalcApplicationTools.h
+// Created by: Sylvain Gaillard
+// Created on: Tue Jan 14:58:50 CET 2009
+//
+
+/*
+Copyright or © or Copr. CNRS, (January 13, 2009)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _NUMCALCAPPLICATIONTOOLS_H_
+#define _NUMCALCAPPLICATIONTOOLS_H_
+
+#include "../Text/StringTokenizer.h"
+#include "ApplicationTools.h"
+#include "../Numeric/VectorTools.h"
+#include "../Numeric/Function/FunctionTools.h"
+
+namespace bpp
+{
+
+class NumCalcApplicationTools
+{
+  public:
+    NumCalcApplicationTools();
+    virtual ~NumCalcApplicationTools();
+
+  public:
+    /**
+     * @brief Build a vector of integers as described by a string
+     *
+     * Build a vector of integers following a description like:
+     * "2, 5, 7-10, 4" => [2, 5, 7, 8, 9, 10, 4]
+     *
+     * @author Sylvain Gaillard
+     * @param s The string to parse.
+     * @param delim Delimiter between elements.
+     * @param seqdelim Delimiter between min and max for a sequence.
+     * @return A vector containing the integers
+     */
+    static std::vector<int> seqFromString(const std::string& s, const std::string& delim = ",", const std::string& seqdelim = "-");
+
+    /**
+     * @brief Build a vector of double from a structured text description.
+     *
+     * The syntax may be one of the following:
+     * - Specified values: 1.23, 2.34, 3.45, 4.56
+     * - Sequence macro: seq(from=1.23,to=2.45,step=0.1)
+     *   or              seq(from=1.23,to=2.45,size=5)
+     *   The meaning of these to form is equivalent as the R function:
+     *   The first one start from 1.23 and increment 0.1 until it reaches
+     *   the 2.45 value, wheras the seocnd one will compute 3 values at
+     *   equal distance from 1.23 and 2.45. the 'from' and 'to' values are
+     *   included, except for the first syntax when the interval is not an
+     *   exact multiple of the 'step' argument.
+     *
+     * @author Julien Dutheil
+     * @param desc The string to parse.
+     * @return A vector containing the corresponding values as double.
+     * @throw Exception If the syntax describing the set is not correct.
+     */
+    static std::vector<double> getVector(const std::string& desc) throw (Exception);
+
+    /**
+     * @brief Returns the value of the Parameter of the given name
+     *  if it exists; otherwise returns the default value.
+     *
+     * @author Laurent Gueguen
+     * @param pl A parameter list to look in.
+     * @param name A string name
+     * @param x A double value
+     */
+    static double getDefaultValue(const ParameterList& pl, const std::string& name, double x);
+
+    /**
+     * @brief Design a parameter grid from input options.
+     *
+     * Example:
+     * @code
+     * grid.number_of_parameters=3
+     * grid.parameter1.name=x
+     * grid.parameter1.values=0.1,0.2,0.3,0.4,0.5
+     * grid.parameter2.name=y
+     * grid.parameter2.values=seq(from=0.1,to=0.5,step=0.1)
+     * grid.parameter3.name=z
+     * grid.parameter3.values=seq(from=0.1,to=0.5,size=5)
+     * @endcode
+     *
+     * @param params           The attribute map where options may be found.
+     * @param suffix           A suffix to be applied to the parameter name.
+     * @param suffixIsOptional Tell if the suffix is absolutely required.
+     * @param warn             Tell if a warning must be sent in case the parameter is not found.
+     * @return a parameter grid object.
+     */
+    static ParameterGrid* getParameterGrid(
+        std::map<std::string, std::string>& params,
+        const std::string& suffix = "",
+        bool suffixIsOptional = true,
+        bool warn = true) throw (Exception);
+
+};
+
+} //End of namespace bpp.
+
+#endif  //_NUMCALCAPPLICATIONTOOLS_H_
diff --git a/src/Bpp/Seq/Io/AbstractOAlignment.h b/src/Bpp/BppBoolean.h
similarity index 64%
copy from src/Bpp/Seq/Io/AbstractOAlignment.h
copy to src/Bpp/BppBoolean.h
index 2991063..78f1f5b 100644
--- a/src/Bpp/Seq/Io/AbstractOAlignment.h
+++ b/src/Bpp/BppBoolean.h
@@ -1,14 +1,14 @@
 //
-// File: AbstractOAlignment.h
+// File: BppBoolean.h
 // Created by: Julien Dutheil
-// Created on: ?
+// Created on: Fri 31 10:44 2010
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,50 +37,53 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _ABSTRACTOALIGNMENT_H_
-#define _ABSTRACTOALIGNMENT_H_
+#ifndef _BPP_BOOLEAN_H_
+#define _BPP_BOOLEAN_H_
 
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Container/VectorSequenceContainer.h"
+#include "Clonable.h"
 
 // From the STL:
 #include <string>
-#include <fstream>
+#include <ostream>
 
 namespace bpp
 {
 
 /**
- * @brief Partial implementation of the OAlignment interface.
+ * @brief The BppBoolean object class.
+ *
+ * This class extends the bool type to support the Clonable interface.
  */
-class AbstractOAlignment:
-  public virtual OAlignment
+class BppBoolean: public virtual Clonable
 {
-
-	public: 
-		AbstractOAlignment() {}
-		virtual ~AbstractOAlignment() {}
+  private:
+    bool value_;
 
 	public:
-
+		
+		BppBoolean(): value_(false) {}
+		BppBoolean(bool value): value_(value) {}
+		virtual ~BppBoolean() {}
+	
+	public:
+	
 		/**
-		 * @name OAlignment methods:
+		 * @name The Clonable interface.
 		 *
 		 * @{
-		 */ 
-		void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception) = 0;
-		void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-		{
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-			writeAlignment(output, sc);
-			output.close();
-		}
+		 */
+		BppBoolean * clone() const { return new BppBoolean(*this); }
 		/** @} */
+
+    const bool getValue() const { return value_; }
+    
 };
 
+std::ostream& operator<<(std::ostream& out, const BppBoolean& s) {
+  return out << s.getValue();
+}
+
 } //end of namespace bpp.
 
-#endif //_ABSTRACTOALIGNMENT_H_
+#endif	//_BPP_BOOLEAN_H_
 
diff --git a/src/Bpp/Seq/Alphabet/DefaultAlphabet.cpp b/src/Bpp/BppString.cpp
similarity index 71%
rename from src/Bpp/Seq/Alphabet/DefaultAlphabet.cpp
rename to src/Bpp/BppString.cpp
index d3d12a0..5df0fcb 100644
--- a/src/Bpp/Seq/Alphabet/DefaultAlphabet.cpp
+++ b/src/Bpp/BppString.cpp
@@ -1,15 +1,14 @@
 //
-// File: DefaultAlphabet.cpp
-// Authors: Julien Dutheil
-//          Sylvain Gaillard
-// Created on: 2005
+// File: BppString.cpp
+// Created by: Julien Dutheil
+// Created on: Thu May 04 10:21 2006
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -38,22 +37,14 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-
-#include "DefaultAlphabet.h"
-#include "AlphabetState.h"
-#include <Bpp/Text/TextTools.h>
+#include "BppString.h"
 
 using namespace bpp;
 
-DefaultAlphabet::DefaultAlphabet():
-  chars_("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.?")
+std::ostream& bpp::operator<<(std::ostream& out, const BppString& s)
 {
-	// Alphabet content definition
-  registerState(new AlphabetState(-1, "-", "Gap"));
-
-  for (size_t i = 0; i < chars_.size(); i++)
-  {
-    registerState(new AlphabetState(static_cast<int>(i), TextTools::toString(chars_[i]), ""));
-  }
+  out << s.toSTL();
+  return out;
 }
 
+
diff --git a/src/Bpp/Seq/Io/GenBank.h b/src/Bpp/BppString.h
similarity index 60%
copy from src/Bpp/Seq/Io/GenBank.h
copy to src/Bpp/BppString.h
index f4a450f..98e942c 100644
--- a/src/Bpp/Seq/Io/GenBank.h
+++ b/src/Bpp/BppString.h
@@ -1,14 +1,14 @@
 //
-// File: GenBank.h
+// File: BppString.h
 // Created by: Julien Dutheil
-// Created on: Tue Oct 2 2007
+// Created on: Thu May 04 10:21 2006
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,58 +37,54 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _GENBANK_H_
-#define _GENBANK_H_
+#ifndef _BPP_STRING_H_
+#define _BPP_STRING_H_
 
-#include "AbstractISequence.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
+#include "Clonable.h"
+
+// From the STL:
+#include <string>
+#include <ostream>
 
 namespace bpp
 {
 
 /**
- * @brief The GenBank sequence file format.
+ * @brief The BppString object class.
  *
- * For now, only read raw sequences. Features are not yet supported.
+ * This class extends the stl::string class to support the Clonable interface.
  */
-class GenBank :
-  public AbstractISequence
+class BppString: public virtual Clonable
 {
-  public:
-  
-    /**
-     * @brief Build a new GenBank object.
-     */
-    GenBank() {}
-
-    virtual ~GenBank() {}
-
-  public:
-
-    /**
-     * @name The AbstractISequence interface.
-     *
-     * @{
-     */
-    void appendSequencesFromStream(std::istream& input, SequenceContainer& sc) const throw (Exception);
-    /** @} */
-  
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const { return "GenBank file"; };
-    const std::string getFormatDescription() const
-    {
-      return "Sequences following the GenBank data base format.";
-    }
-    /** @} */
+  private:
+    std::string text_;
+
+	public:
+		
+		BppString(): text_() {}
+		BppString(const char* value): text_(value) {}
+		BppString(const std::string& value): text_(value) {}
+		BppString& operator=(const char* value) { text_ = value; return *this; }
+		BppString& operator=(const std::string& value) { text_ = value; return *this; }
+		virtual ~BppString() {}
+	
+	public:
+	
+		/**
+		 * @name The Clonable interface.
+		 *
+		 * @{
+		 */
+		BppString * clone() const { return new BppString(*this); }
+		/** @} */
+
+    const std::string& toSTL() const { return text_; }
+    
 };
 
+std::ostream& operator<<(std::ostream& out, const BppString& s);
+
 } //end of namespace bpp.
 
-#endif // _GENBANK_H_
+#endif	//_BPP_STRING_H_
 
diff --git a/src/Bpp/Seq/Io/NexusTools.h b/src/Bpp/BppVector.h
similarity index 56%
rename from src/Bpp/Seq/Io/NexusTools.h
rename to src/Bpp/BppVector.h
index 51c8f93..e9a921c 100644
--- a/src/Bpp/Seq/Io/NexusTools.h
+++ b/src/Bpp/BppVector.h
@@ -1,14 +1,14 @@
 //
-// File: NexusTools.h
+// File: BppVector.h
 // Created by: Julien Dutheil
-// Created on: Wed May 27 19:30 2009
+// Created on: Mon Apr 07 15:14 2008
 //
 
 /*
 Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,48 +37,64 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _NEXUSTOOLS_H_
-#define _NEXUSTOOLS_H_
+#ifndef _BPPVECTOR_H_
+#define _BPPVECTOR_H_
+
+#include "Clonable.h"
 
 // From the STL:
-#include <iostream>
-#include <Bpp/Exceptions.h>
+#include <vector>
 
 namespace bpp
 {
 
 /**
- * @brief Tools for parsing Nexus files.
- *
- * The Nexus format is described in the following paper:
- * Maddison D, Swofford D, and Maddison W (1997), _Syst Biol_ 46(4):590-621
+ * @brief The BppVector object class.
  *
- * @author Julien Dutheil
+ * This class extends the std::vector class to support the Clonable interface.
  */
-class NexusTools
+template<class TYPE>
+class BppVector: public Clonable
 {
+  private:
+    std::vector<TYPE> vector_;
+
   public:
-    /**
-     * @param input The input stream.
-     * @return A string containing the next line in the file wichi is not empty and is no a comment line.
-     */
-    static std::string getNextNonCommentLine(std::istream& input);
 
+    BppVector():
+      vector_() {}
+    
+    BppVector(typename std::vector<TYPE>::size_type num, const TYPE& val = TYPE() ):
+      vector_(num, val) {}
+
+    BppVector(typename std::vector<TYPE>::iterator start, typename std::vector<TYPE>::iterator end):
+      vector_(start, end) {}
+
+    virtual ~BppVector() {}
+  
+  public:
+  
     /**
-     * @brief parse the next command name within a block.
+     * @name The Clonable interface.
      *
-     * @param input     [in]  The input stream.
-     * @param name      [out] Will contain the name of the command. 
-     * @param arguments [out] Will contain the arguments of the commans, as raw data. The arguments will not be parsed.
-     * @param lineBrk   [in]  Tell is the line break should be preserved in the arguments.
-     * @return Whether a command was found in the current block.
-     * @throw IOException In case of bad format.
+     * @{
      */
-    static bool getNextCommand(std::istream& input, std::string& name, std::string& arguments, bool lineBrk = true) throw (IOException);
+    BppVector<TYPE> * clone() const { return new BppVector<TYPE>(*this); }
+    /** @} */
+
+    const std::vector<TYPE>& toSTL() const { return vector_; }
+    
+    std::vector<TYPE>& toSTL() { return vector_; }
+
+    unsigned int size() const { return vector_.size(); }
 
+    TYPE& operator[] (unsigned int i) { return vector_[i]; }
+    
+    const TYPE& operator[] (unsigned int i) const { return vector_[i]; }
+  
 };
 
 } //end of namespace bpp.
 
-#endif  //_NEXUSTOOLS_H_
+#endif  //_BPPVECTOR_H_
 
diff --git a/src/Bpp/Clonable.h b/src/Bpp/Clonable.h
new file mode 100644
index 0000000..f976847
--- /dev/null
+++ b/src/Bpp/Clonable.h
@@ -0,0 +1,120 @@
+//
+// File: Clonable.h
+// Created by: Julien Dutheil
+// Created on: Wed Nov 12 15:55:03 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _CLONABLE_H_
+#define _CLONABLE_H_
+
+/**
+ * @mainpage
+ *
+ * @par
+ * This library contains Bio++ core interfaces, classes and functions.
+ * It provides a general interface called bpp::Clonable, which allows dynamic copy of objects.
+ * Wrapper classes for numbers, strings and vectors that implement this interface are provided, and called
+ * respectively bpp::Number, bpp::BppString and bpp::BppVector.
+ *
+ * @par
+ * The bpp::Exception class is the most general exception class used in Bio++, and provides only a single text information.
+ * Several more specialized exception classes are also provided, like
+ * - bpp::IOException for input/output errors, usually when reading from or writing to files,
+ * - bpp::NullPointerException when a NULL pointer is unexpectedly provided,
+ * - bpp::BadNumberException and bpp::BadIntegerException, dealing with number problems (bounds, format, etc),
+ * - and more...
+ *
+ * @par
+ * This library also includes several submodules:
+ * - The Text module contains: functions to deal with character strings (bpp::StringTokenizer and the bpp::TextTools static class),
+ * like pattern matching, concatenation, number conversion, etc.
+ * - The Graphics module provides support for graphical output. This includes the general bpp::GraphicDevice interface, with currently three implementations for XFig (bpp::XFigGraphicDevice), SVG (bpp::SVGGraphicDevice) and PGF (bpp::PGFGraphicDevice) formats.
+ * Classes to deal with colors and fonts were created (see bpp::RGBColor, bpp::ColorSet, bpp::ColorTools and bpp::Font).
+ * - The App module contains classes and tools that provide powerful methods to parse command-line options and more.
+ * - The Numeric module is quite large and provides interfaces, classes and functions for numerical calculus.
+ *   The tools included are general enough to be useful beyond biology.
+ *   The originality of this module, unless many existing libraries, is to be fully object-oriented.
+ *   Available methods include:
+ *   - Vector operations, based on the stl::vector class, see bpp::VectorTools,
+ *   - Matrix data and operations, see the bpp::Matrix interface and bpp::MatrixTools class,
+ *   - Functions are implemented using several general classes:
+ *     - the bpp::Function interface and its derivatives,
+ *     - the bpp::Parameter, bpp::Constraint and bpp::ParameterList classes, and the bpp::Parametrizable interface
+ *       provide a very general way to deal with parameters
+ *     - Function operations, see the bpp::Optimizer interface, and the bpp::AbstractNumericalDerivative class for
+ *       numerical differenciation,
+ *     - Discrete probability distributions are implemented via the bpp::DiscreteDistribution interface
+ *     - Several random numbers generators are available through the bpp::RandomNumberFactory interface, and the
+ *       bpp::RandomTools static class provides useful methods to deal with random numbers.
+ *     .
+ *   .
+ * .
+ */
+
+namespace bpp
+{
+
+/**
+ * @brief The Clonable interface (allow an object to be cloned).
+ *
+ * A clone is a deep (or hard) copy of an object.
+ * This interface provides a method that dynamically creates a copy of itself
+ * and send a pointer toward it.
+ *
+ * This method allows an object to be copied when you do not now its class.
+ */
+class Clonable
+{
+  public:
+    
+    Clonable() {}
+  
+    virtual ~Clonable() {}
+  
+  public:
+    
+    /**
+     * @brief Create a copy of this object and send a pointer to it.
+     *
+     * @return A pointer toward the copy object.
+     */
+    virtual Clonable * clone() const = 0;
+};
+
+} //end of namespace bpp.
+
+#endif  //_CLONABLE_H_
+
diff --git a/src/Bpp/Seq/Alphabet/CodonAlphabet.cpp b/src/Bpp/Exceptions.cpp
similarity index 51%
copy from src/Bpp/Seq/Alphabet/CodonAlphabet.cpp
copy to src/Bpp/Exceptions.cpp
index 9072c02..60baf8d 100644
--- a/src/Bpp/Seq/Alphabet/CodonAlphabet.cpp
+++ b/src/Bpp/Exceptions.cpp
@@ -1,14 +1,16 @@
 //
-// File: CodonAlphabet.cpp
-// Created by: Julien Dutheil
-// Created on: Sun Oct 12 17:41:56 2003
+// File Exceptions.cpp
+// Created by: Guillaume Deuchst
+//              Julien Dutheil
+//              Sylvain Gaillard
+// Last modification : Thu Jul 22 2004
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,85 +39,66 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "CodonAlphabet.h"
-#include <Bpp/Text/TextTools.h>
+#include "Exceptions.h"
+#include "Text/TextTools.h"
 
 using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
 using namespace std;
 
 /******************************************************************************/
-
-int CodonAlphabet::getCodon(int pos1, int pos2, int pos3) const
-throw (BadIntException)
-{
-  vector<int> vint;
-  vint.push_back(pos1);
-  vint.push_back(pos2);
-  vint.push_back(pos3);
   
-  return getWord(vint);
-}
+BadIntegerException::BadIntegerException(const char* text, int badInt):
+  Exception(string(text) + "(" + TextTools::toString(badInt) + ")"),
+  badInt_(badInt) {}
 
-/******************************************************************************/
-
-string CodonAlphabet::getCodon(const string & pos1, const string & pos2, const string & pos3) const
-throw (BadCharException)
-{
-  vector<string> vint;
-  vint.push_back(pos1);
-  vint.push_back(pos2);
-  vint.push_back(pos3);
-  
-  return getWord(vint);
-}
+BadIntegerException::BadIntegerException(const std::string& text, int badInt):
+  Exception(text + "(" + TextTools::toString(badInt) + ")"),
+  badInt_(badInt) {}
 
 /******************************************************************************/
 
-int CodonAlphabet::getFirstPosition (int codon) const throw (BadIntException)
-{
-  return getNPosition(codon,0);
-}
-
-/******************************************************************************/
+BadNumberException::BadNumberException(const char* text, double badNumber):
+  Exception(string(text) + "(" + TextTools::toString(badNumber) + ")"),
+  badNumber_(badNumber) {}
 
-int CodonAlphabet::getSecondPosition(int codon) const throw (BadIntException)
-{
-  return getNPosition(codon,1);
-}
+BadNumberException::BadNumberException(const std::string& text, double badNumber):
+  Exception(text + "(" + TextTools::toString(badNumber) + ")"),
+  badNumber_(badNumber) {}
 
 /******************************************************************************/
 
-int CodonAlphabet::getThirdPosition (int codon) const throw (BadIntException)
-{
-  return getNPosition(codon,2);
-}
+NumberFormatException::NumberFormatException(const char* text, const std::string& badNumber):
+  Exception(string(text) + "(" + badNumber + ")"),
+  badNumber_(badNumber) {}
+
+NumberFormatException::NumberFormatException(const std::string& text, const std::string& badNumber):
+  Exception(text + "(" + badNumber + ")"),
+  badNumber_(badNumber) {}
 
 /******************************************************************************/
 
-string CodonAlphabet::getFirstPosition (const string & codon) const
-throw (BadCharException)
+vector<size_t> IndexOutOfBoundsException::getBounds() const
 {
-  return getNPosition(codon,0);
+  vector<size_t> bounds(2);
+  bounds[0] = lowerBound_;
+  bounds[1] = upperBound_;
+  return bounds;
 }
 
 /******************************************************************************/
-
-string CodonAlphabet::getSecondPosition(const string & codon) const
-throw (BadCharException)
-{
-  return getNPosition(codon,1);
-}
+  
+BadSizeException::BadSizeException(const std::string& text, size_t badSize, size_t correctSize):
+  Exception("Incorrect size " + TextTools::toString(badSize) + ", expected " + TextTools::toString(correctSize) + ". " + text),
+  badSize_(badSize),
+  correctSize_(correctSize) {}
 
 /******************************************************************************/
 
-string CodonAlphabet::getThirdPosition (const string & codon) const
-throw (BadCharException)
-{
-  return getNPosition(codon,2);
-}
+OutOfRangeException::OutOfRangeException(const std::string& text, double badValue, double lowerBound, double upperBound):
+  Exception(TextTools::toString(badValue) + " out of [" + TextTools::toString(lowerBound) + ", " + TextTools::toString(upperBound) +  "])" + text),
+  lowerBound_(lowerBound),
+  upperBound_(upperBound)
+{}
 
 /******************************************************************************/
+
diff --git a/src/Bpp/Exceptions.h b/src/Bpp/Exceptions.h
new file mode 100644
index 0000000..2c1bc08
--- /dev/null
+++ b/src/Bpp/Exceptions.h
@@ -0,0 +1,425 @@
+//
+// File Exceptions.h
+// Created by: Guillaume Deuchst
+//              Julien Dutheil
+//              Sylvain Gaillard
+// Last modification : Thu Jul 22 2004
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _EXCEPTIONS_H_
+#define _EXCEPTIONS_H_
+
+#include <stdexcept>
+#include <vector>
+#include <string>
+#include "Text/TextTools.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Exception base class.
+ *
+ * Overload exception constructor (to control the exceptions mechanism).</p>
+ */
+class Exception:
+  public std::exception
+{
+  protected:
+    std::string message_;
+  
+  public:
+    /**
+     * @brief Build a new Exception.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    Exception(const char* text): message_(std::string(text)) {}
+
+    /**
+     * @brief Build a new Exception.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    Exception(const std::string& text): message_(text) {}
+  
+    virtual ~Exception() throw() {}
+
+  public:
+    
+    /**
+     * @brief Method to get the message of the exception (STL method redefinition).
+     *
+     * @return The message passed to the exception hierarchy.
+     */
+    const char* what() const throw() { return message_.c_str(); }
+};
+
+
+/**
+ * @brief The base class exception for IO error.
+ */
+class IOException:
+  public Exception
+{
+  public: // Class constructors and destructor:
+    
+    /**
+     * @brief Build a new IOException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    IOException(const char* text): Exception(text) {}
+
+    /**
+     * @brief Build a new IOException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    IOException(const std::string& text): Exception(text) {} 
+  
+    virtual ~IOException() throw() {}
+
+};
+
+
+/**
+ * @brief The base class exception for NULL pointer error.
+ *
+ * This exception may be thrown when an unexpected NULL pointer is found.
+ */
+class NullPointerException:
+  public Exception
+{
+  public:
+
+    /**
+     * @brief Build a new NullPointerException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    NullPointerException(const char* text): Exception(text) {}
+
+    /**
+     * @brief Build a new NullPointerException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    NullPointerException(const std::string& text): Exception(text) {}
+
+    virtual ~NullPointerException() throw() {}
+};
+
+
+/**
+ * @brief The base class exception for zero division error.
+ */
+class ZeroDivisionException:
+  public Exception
+{
+  public:
+
+    /**
+     * @brief Build a new ZeroDivisionException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    ZeroDivisionException(const char* text): Exception(text) {}
+
+    /**
+     * @brief Build a new ZeroDivisionException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    ZeroDivisionException(const std::string& text): Exception(text) {}
+
+    virtual ~ZeroDivisionException() throw() {}
+};
+
+  
+/**
+ * @brief Number exception: integers.
+ */
+class BadIntegerException:
+  public Exception
+{
+  protected:
+    int badInt_;
+  
+  public:
+    
+    /**
+     * @brief Build a new BadIntegerException.
+     *
+     * @param text   A message to be passed to the exception hierarchy.
+     * @param badInt The faulty integer.
+     */
+    BadIntegerException(const char* text, int badInt);
+
+    /**
+     * @brief Build a new BadIntegerException.
+     *
+     * @param text   A message to be passed to the exception hierarchy.
+     * @param badInt The faulty integer.
+     */
+    BadIntegerException(const std::string& text, int badInt);
+  
+    virtual ~BadIntegerException() throw() {}
+
+  public:
+    
+    /**
+     * @brief Get the integer that threw this exception.
+     *
+     * @return The faulty integer.
+     */
+    int getBadInteger() const { return badInt_; }
+  
+};
+
+
+/**
+ * @brief Number exception: doubles.
+ */
+class BadNumberException:
+  public Exception
+{
+  protected:
+    double badNumber_;
+  
+  public:
+    
+    /**
+     * @brief Build a new BadNumberException.
+     *
+     * @param text      A message to be passed to the exception hierarchy.
+     * @param badNumber The faulty number.
+     */
+    BadNumberException(const char* text, double badNumber);
+
+    /**
+     * @brief Build a new BadNumberException.
+     *
+     * @param text      A message to be passed to the exception hierarchy.
+     * @param badNumber The faulty number.
+     */
+    BadNumberException(const std::string& text, double badNumber);
+  
+    virtual ~BadNumberException() throw() {}
+
+  public:
+    
+    /**
+     * @brief Get the number that threw this exception.
+     *
+     * @return The faulty number.
+     */
+    double getBadNumber() const { return badNumber_; }
+  
+};
+
+
+/**
+ * @brief Number format exception.
+ */
+class NumberFormatException:
+  public Exception
+{
+  protected:
+    std::string badNumber_;
+  
+  public:
+    
+    /**
+     * @brief Build a new NumberFormatException.
+     *
+     * @param text      A message to be passed to the exception hierarchy.
+     * @param badNumber The faulty number.
+     */
+    NumberFormatException(const char* text, const std::string& badNumber);
+
+    /**
+     * @brief Build a new NumberFormatException.
+     *
+     * @param text      A message to be passed to the exception hierarchy.
+     * @param badNumber The faulty number.
+     */
+    NumberFormatException(const std::string& text, const std::string& badNumber);
+  
+    virtual ~NumberFormatException() throw() {}
+
+  public:
+    
+    /**
+     * @brief Get the number that threw this exception.
+     *
+     * @return The faulty number.
+     */
+    std::string getBadNumber() const { return badNumber_; }
+  
+};
+
+
+/**
+ * @brief Index out of bounds exception class.
+ */
+class IndexOutOfBoundsException:
+  public virtual Exception
+{
+  protected:
+    size_t badIndex_, lowerBound_, upperBound_;
+  
+  public:
+
+    /**
+     * @brief Build a new IndexOutOfBoundsException.
+     *
+     * @param text   A message to be passed to the exception hierarchy.
+     * @param badInt The faulty integer.
+     * @param lowerBound Lower limit.
+     * @param upperBound Upper limit.
+     */
+  IndexOutOfBoundsException(const std::string& text, size_t badInt, size_t lowerBound, size_t upperBound) :
+    Exception("out of [" + TextTools::toString(lowerBound) + ", " + TextTools::toString(upperBound) +  "])" + text),
+    badIndex_(badInt),
+    lowerBound_(lowerBound),
+    upperBound_(upperBound) {}
+  
+    virtual ~IndexOutOfBoundsException() throw() {}
+
+  public:
+    
+    /**
+     * @brief Get the bounds.
+     *
+     * @return The bounds.
+     */
+    std::vector<size_t> getBounds() const;
+
+    size_t getBadIndex() const { return badIndex_; }
+};
+
+
+/**
+ * @brief Wrong size exception class.
+ */
+class BadSizeException:
+  public virtual Exception
+{
+  protected:
+    size_t badSize_, correctSize_;
+  
+  public:
+    
+    /**
+     * @brief Build a new BadSizeException.
+     *
+     * @param text   A message to be passed to the exception hierarchy.
+     * @param badSize The faulty size.
+     * @param correctSize The expected size.
+     */
+    BadSizeException(const std::string& text, size_t badSize, size_t correctSize);
+  
+    virtual ~BadSizeException() throw() {}
+
+  public:
+    
+    size_t getBadSize() const { return badSize_; }
+    size_t getCorrectSize() const { return correctSize_; }
+};
+
+
+/**
+ * @brief Out of range exception class.
+ */
+class OutOfRangeException:
+  public Exception
+{
+  protected:
+    double lowerBound_, upperBound_;
+  
+  public:
+    
+    /**
+     * @brief Build a new OutOfRangeException.
+     *
+     * @param text   A message to be passed to the exception hierarchy.
+     * @param badValue The faulty value.
+     * @param lowerBound Lower limit.
+     * @param upperBound Upper limit.
+     */
+    OutOfRangeException(const std::string& text, double badValue, double lowerBound, double upperBound);
+  
+    virtual ~OutOfRangeException() throw() {}
+
+  public:
+    
+    /**
+     * @return The lower bound.
+     */
+    double getLowerBound() const { return lowerBound_; }
+
+    /**
+     * @return The upper bound.
+     */
+    double getUpperBound() const { return upperBound_; }
+};
+
+
+/**
+ * @brief This expeption is sent when a given method is not implemented.
+ */
+class NotImplementedException:
+  public Exception
+{
+  public:
+
+    /**
+     * @brief Build a new NotImplementedException.
+     *
+     * @param text A message to be passed to the exception hierarchy.
+     */
+    NotImplementedException(const std::string& text): Exception(text) {}
+
+    virtual ~NotImplementedException() throw() {}
+};
+
+
+
+} //end of namespace bpp.
+
+#endif // _EXCEPTIONS_H_
+
diff --git a/src/Bpp/Graph/AssociationDAGraphImplObserver.h b/src/Bpp/Graph/AssociationDAGraphImplObserver.h
new file mode 100644
index 0000000..d5d18c2
--- /dev/null
+++ b/src/Bpp/Graph/AssociationDAGraphImplObserver.h
@@ -0,0 +1,406 @@
+//
+// File AssociationDAGraphImplObserver.h
+// Created by: Laurent Guéguen
+// Last modification : lundi 19 décembre 2016, à 22h 14
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ASSOCIATION_DAGRAPH_IMPL_OBSERVER_HPP_
+#define _ASSOCIATION_DAGRAPH_IMPL_OBSERVER_HPP_
+
+#include "DAGraphImpl.h"
+#include "AssociationDAGraphObserver.h"
+#include "AssociationGraphImplObserver.h"
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
+#include <memory>
+
+namespace bpp
+{
+template<class N, class E, class DAGraphImpl>
+class AssociationDAGraphImplObserver :
+  public AssociationDAGraphObserver<N, E>,
+  public AssociationGraphImplObserver<N, E, DAGraphImpl>
+{
+public:
+  typedef typename AssociationGraphObserver<N, E>::NodeIndex NodeIndex;
+  typedef typename AssociationGraphObserver<N, E>::EdgeIndex EdgeIndex;
+
+  typedef typename Graph::NodeId NodeGraphid;
+  typedef typename Graph::EdgeId EdgeGraphid;
+
+public:
+  /**
+   * Constructor
+   */
+
+  AssociationDAGraphImplObserver() :
+    AssociationGraphImplObserver<N, E, DAGraphImpl>(true)
+  {}
+
+  /**
+   * Constructor
+   * @param subjectDAGraph the DAGraph which is observed
+   */
+
+  AssociationDAGraphImplObserver(std::shared_ptr<DAGraphImpl> subjectDAGraph) :
+    AssociationGraphImplObserver<N, E, DAGraphImpl>(subjectDAGraph)
+  {}
+
+  /**
+   * Copy Constructor
+   * @param dAGraphObserver the DAGraphObserver to be copied
+   */
+
+  AssociationDAGraphImplObserver(bpp::AssociationDAGraphImplObserver<N, E, DAGraphImpl> const& dAGraphObserver) :
+    AssociationGraphImplObserver<N, E, DAGraphImpl>(dAGraphObserver)
+  {}
+
+
+  /**
+   * Copy Constructor
+   * @param dAGraphObserver the DAGraphObserver to be copied
+   */
+
+  template<class N2, class E2>
+  AssociationDAGraphImplObserver(bpp::AssociationDAGraphImplObserver<N2, E2, DAGraphImpl> const& dAGraphObserver) :
+    AssociationGraphImplObserver<N, E, DAGraphImpl>(dAGraphObserver)
+  {}
+
+  /**
+   * = Operator
+   * @param dAGraphObserver the DAGraphObserver we want to copy the values
+   */
+
+  AssociationDAGraphImplObserver<N, E, DAGraphImpl>& operator=(bpp::AssociationDAGraphImplObserver<N, E, DAGraphImpl> const& dAGraphObserver)
+  {
+    AssociationGraphImplObserver<N, E, DAGraphImpl>::operator=(dAGraphObserver);
+    return *this;
+  }
+
+  /**
+   * Destructor
+   */
+
+  ~AssociationDAGraphImplObserver()
+  {}
+
+  /**
+   * clone function
+   */
+
+  AssociationDAGraphImplObserver<N, E, DAGraphImpl>* clone() const
+  {
+    return new AssociationDAGraphImplObserver<N, E, DAGraphImpl>(*this);
+  }
+
+
+  /**
+   * Is the graph a DAG? A DAG must be acyclic and with no isolated node.
+   * @return true if valid DAG
+   */
+  bool isValid() const
+  {
+    return this->getGraph()->isValid();
+  }
+
+  /**
+   * Is the DAG rooted? Ie with a unique node with no father.
+   * @return true if rooted
+   */
+  bool isRooted() const
+  {
+    return this->getGraph()->isRooted();
+  }
+
+
+  /**
+   * Return the fathers of a node
+   * @param node the concerned node
+   * @return a vector of son Nodes
+   */
+
+  std::vector<std::shared_ptr<N> > getFathers(const std::shared_ptr<N>  node) const
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getFathers(this->getNodeGraphid(node)));
+  }
+
+  std::vector<NodeIndex> getFathers(const NodeIndex node) const
+  {
+    return this->getNodeIndexes(this->getNodesFromGraphid(this->getGraph()->getFathers(this->getNodeGraphid(this->getNode(node)))));
+  }
+
+  /**
+   * @brief Sets the root and make the DAG directed from root to
+   * leaves
+   *
+   */
+  void rootAt(const std::shared_ptr<N> root)
+  {
+    this->getGraph()->rootAt(this->getNodeGraphid(root));
+  }
+
+  /**
+   * Has the node a father?
+   */
+  bool hasFather(const std::shared_ptr<N> nodeObject) const
+  {
+    return this->getGraph()->hasFather(this->getNodeGraphid(nodeObject));
+  }
+
+  bool hasFather(const NodeIndex node) const
+  {
+    return this->getGraph()->hasFather(this->getNodeGraphid(this->getNode(node)));
+  }
+
+  /**
+   * Return the sons of a node
+   * @return a vector of son Nodes
+   */
+
+  std::vector<std::shared_ptr<N> > getSons(const std::shared_ptr<N> node) const
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getSons(this->getNodeGraphid(node)));
+  }
+
+  std::vector<NodeIndex> getSons(const NodeIndex node) const
+  {
+    return this->getNodeIndexes(this->getNodesFromGraphid(this->getGraph()->getSons(this->getNodeGraphid(this->getNode(node)))));
+  }
+
+
+  /**
+   * Return the son of an edge
+   * @param edge the concerned edge
+   * @return the son Node
+   */
+
+  std::shared_ptr<N> getSon(const std::shared_ptr<E>  edge) const
+  {
+    return this->getNodeFromGraphid(this->getGraph()->getBottom(this->getEdgeGraphid(edge)));
+  }
+
+  NodeIndex getSon(const EdgeIndex edgeId) const
+  {
+    return this->getNodeIndex(this->getNode(this->getGraph()->getBottom(this->getEdgeGraphid(this->getEdge(edgeId)))));
+  }
+
+
+  /**
+   * Return the father of an edge
+   * @param edge the concerned edge
+   * @return the father Node
+   */
+
+  std::shared_ptr<N> getFather(const std::shared_ptr<E>  edge) const
+  {
+    return this->getNodeFromGraphid(this->getGraph()->getTop(this->getEdgeGraphid(edge)));
+  }
+
+  NodeIndex getFather(const EdgeIndex edge) const
+  {
+    return this->getNodeIndex(this->getNode(this->getGraph()->getTop(this->getEdgeGraphid(this->getEdge(edge)))));
+  }
+
+  /**
+   * Return the number of fathers
+   * @param node the concerned node
+   * @return the number of fathers
+   */
+  size_t getNumberOfFathers(const std::shared_ptr<N>  node) const
+  {
+    return this->getGraph()->getNumberOfFathers(this->getNodeGraphid(node));
+  }
+
+  /**
+   * Return the number of sons
+   * @param node the concerned node
+   * @return the number of sons
+   */
+  size_t getNumberOfSons(const std::shared_ptr<N>  node) const
+  {
+    return this->getGraph()->getNumberOfSons(this->getNodeGraphid(node));
+  }
+
+  /**
+   * Get the leaves of a DAG under a peculiar node.
+   *
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  std::vector<std::shared_ptr<N> > getLeavesUnderNode(std::shared_ptr<N>  node) const
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getLeavesUnderNode(this->getNodeGraphid(node)));
+  }
+
+  /**
+   * Remove the fathers of a node
+   * @return a vector containing the removed fathers
+   */
+
+  std::vector<std::shared_ptr<N> > removeFathers(const std::shared_ptr<N>  node)
+  {
+    return this->getNodesFromGraphid(this->getGraph()->removeFathers(this->getNodeGraphid(node)));
+  }
+
+  /**
+   * Remove a father of a node
+   * @return a vector containing the removed nodes
+   */
+  void removeFather(const std::shared_ptr<N> node, const std::shared_ptr<N> father)
+  {
+    this->getGraph()->removeFather(this->getNodeGraphid(node), this->getNodeGraphid(father));
+  }
+
+  /**
+   * Remove the sons of a node
+   * @return a vector containing the removed nodes
+   */
+
+  std::vector<std::shared_ptr<N> > removeSons(const std::shared_ptr<N>  node)
+  {
+    return this->getNodesFromGraphid(this->getGraph()->removeSons(this->getNodeGraphid(node)));
+  }
+
+  /**
+   * Remove a son of a node
+   */
+  void removeSon(const std::shared_ptr<N> node, const std::shared_ptr<N> son)
+  {
+    this->getGraph()->removeSon(this->getNodeGraphid(node), this->getNodeGraphid(son));
+  }
+
+  /**
+   * Add a father to a node
+   * @param nodeObject the concerned node
+   * @param fatherNodeObject the node to be added as a father to the node
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+  void addFather(const std::shared_ptr<N> nodeObject, const std::shared_ptr<N>  fatherNodeObject, const std::shared_ptr<E> edgeObject = 0)
+  {
+    if (edgeObject)
+      try
+      {
+        this->getGraph()->addFather(this->getNodeGraphid(nodeObject), this->getNodeGraphid(fatherNodeObject), this->getEdgeGraphid(edgeObject));
+      }
+      catch (Exception& e)
+      {
+        this->link(fatherNodeObject, nodeObject, edgeObject);
+      }
+    else
+      this->getGraph()->addFather(this->getNodeGraphid(nodeObject), this->getNodeGraphid(fatherNodeObject));
+  }
+
+  /**
+   * Add a son to a node
+   * @param nodeObject the concerned node
+   * @param sonNodeObject the node to be added as a son to the father
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+  void addSon(const std::shared_ptr<N> nodeObject, const std::shared_ptr<N> sonNodeObject, const std::shared_ptr<E> edgeObject = 0)
+  {
+    if (edgeObject)
+      try
+      {
+        this->getGraph()->addSon(this->getNodeGraphid(nodeObject), this->getNodeGraphid(sonNodeObject), this->getEdgeGraphid(edgeObject));
+      }
+      catch (Exception& e)
+      {
+        this->link(nodeObject, sonNodeObject, edgeObject);
+      }
+    else
+      this->getGraph()->addSon(this->getNodeGraphid(nodeObject), this->getNodeGraphid(sonNodeObject));
+  }
+
+  /**
+   * Iterators
+   *
+   */
+
+  /*
+   * @brief builds iterator on the fathers of a Node
+   *
+   */
+
+  std::unique_ptr<typename AssociationDAGraphObserver<N, E>::NodeIterator> fathersIterator(std::shared_ptr<N> node)
+  {
+    return this->incomingNeighborNodesIterator(node);
+  }
+
+  /*
+   * @brief builds iterator on the sons of a Node
+   *
+   */
+
+  std::unique_ptr<typename AssociationDAGraphObserver<N, E>::NodeIterator> sonsIterator(std::shared_ptr<N> node)
+  {
+    return this->outgoingNeighborNodesIterator(node);
+  }
+
+  /**
+   * @brief Get Below Objects.
+   *
+   * @param localRoot of the subgraph.
+   * @return A vector of ancestor nodes ids.
+   *
+   */
+
+  std::vector<std::shared_ptr<N> > getBelowNodes(const std::shared_ptr<N> localRoot)
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getBelowNodes(this->getNodeGraphid(localRoot)));
+  }
+
+  std::vector<std::shared_ptr<E> > getBelowEdges(const std::shared_ptr<N> localRoot)
+  {
+    return AssociationGraphImplObserver<N, E, DAGraphImpl>::getEdgesFromGraphid(this->getGraph()->getBelowEdges(this->getNodeGraphid(localRoot)));
+  }
+};
+
+/********************/
+
+template<class N, class E>
+using AssociationDAGlobalGraphObserver =  AssociationDAGraphImplObserver<N, E, DAGlobalGraph>;
+
+/********************/
+}
+
+
+#endif
diff --git a/src/Bpp/Graph/AssociationDAGraphObserver.h b/src/Bpp/Graph/AssociationDAGraphObserver.h
new file mode 100644
index 0000000..e1694e4
--- /dev/null
+++ b/src/Bpp/Graph/AssociationDAGraphObserver.h
@@ -0,0 +1,256 @@
+//
+// File AssociationDAGraphObserver.h
+// Created by: Laurent Guéguen
+// Last modification : lundi 19 décembre 2016, à 21h 48
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ASSOCIATION_DA_GRAPHOBSERVER_HPP_
+#define _ASSOCIATION_DA_GRAPHOBSERVER_HPP_
+
+#include "DAGraph.h"
+#include "AssociationGraphObserver.h"
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
+#include <memory>
+
+namespace bpp
+{
+/**
+ * @brief Defines a DA Graph Associator. It is a template which
+ * follows (subscribed to) a Graph.
+ *
+ * @author Laurent Guéguen
+ */
+
+template<class N, class E>
+class AssociationDAGraphObserver :
+  public virtual AssociationGraphObserver<N, E>
+{
+public:
+  typedef typename AssociationDAGraphObserver<N, E>::NodeIndex NodeIndex;
+  typedef typename AssociationDAGraphObserver<N, E>::EdgeIndex EdgeIndex;
+
+  typedef typename DAGraph::NodeId NodeGraphid;
+  typedef typename DAGraph::EdgeId EdgeGraphid;
+
+public:
+  /**
+   * Is the graph a DAG? A DAG must be acyclic.
+   * @return true if valid DAG
+   */
+
+  virtual bool isValid() const = 0;
+
+  /**
+   * Is the DAG rooted? Ie with at most one node with no father.
+   * @return true if rooted DAG
+   */
+
+  virtual bool isRooted() const = 0;
+
+  /**
+   * @brief Sets the root and make the DAG directed from root to
+   * leaves
+   *
+   */
+
+  virtual void rootAt(const std::shared_ptr<N> root) = 0;
+
+
+  /**
+   * Return, the fathers of a node
+   * @param node the concerned node
+   * @return the father
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getFathers(const std::shared_ptr<N>  node) const = 0;
+
+  virtual std::vector<NodeIndex> getFathers(const NodeIndex node) const = 0;
+
+  /**
+   * Has the node a father?
+   */
+
+  virtual bool hasFather(const std::shared_ptr<N>  nodeObject) const = 0;
+  virtual bool hasFather(const NodeIndex node) const = 0;
+
+  /**
+   * Return the sons of a node
+   * @param node the concerned node
+   * @return a vector of son Nodes
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getSons(const std::shared_ptr<N>  node) const = 0;
+
+  virtual std::vector<NodeIndex> getSons(const NodeIndex node) const = 0;
+
+  /**
+   * Return the son of an edge
+   * @param edge the concerned edge
+   * @return the son Node
+   */
+
+  virtual std::shared_ptr<N> getSon(const std::shared_ptr<E>  edge) const = 0;
+  virtual NodeIndex getSon(const EdgeIndex edge) const = 0;
+
+  /**
+   * Return the father of an edge
+   * @param edge the concerned edge
+   * @return the father Node
+   */
+
+  virtual std::shared_ptr<N> getFather(const std::shared_ptr<E>  edge) const = 0;
+  virtual NodeIndex getFather(const EdgeIndex edge) const = 0;
+
+  /**
+   * Return the number of sons
+   * @param node the concerned node
+   * @return the number of sons
+   */
+
+  virtual size_t getNumberOfSons(const std::shared_ptr<N>  node) const = 0;
+
+  /**
+   * Return the number of fathers
+   * @param node the concerned node
+   * @return the number of fathers
+   */
+
+  virtual size_t getNumberOfFathers(const std::shared_ptr<N>  node) const = 0;
+
+  /**
+   * Get the leaves of a tree under a peculiar node.
+   *
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getLeavesUnderNode(std::shared_ptr<N>  node) const = 0;
+
+  /**
+   * Remove the sons of a node
+   * @return a vector containing the removed nodes
+   */
+
+  virtual std::vector<std::shared_ptr<N> > removeSons(const std::shared_ptr<N>  node) = 0;
+
+  /**
+   * Remove a son of a node
+   * @param node the concerned node
+   * @param son the node to be removed
+   */
+
+  virtual void removeSon(const std::shared_ptr<N> node, const std::shared_ptr<N> son) = 0;
+
+  /**
+   * Add a son to a node
+   * @param nodeObject the concerned node
+   * @param sonNodeObject the node to be added as a son to the father
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 0)
+   */
+
+  virtual void addSon(const std::shared_ptr<N>  nodeObject, const std::shared_ptr<N>  sonNodeObject, const std::shared_ptr<E> edgeObject = 0) = 0;
+
+  /**
+   * Remove the fathers of a node
+   * @return a vector containing the removed fathers
+   */
+
+  virtual std::vector<std::shared_ptr<N> > removeFathers(const std::shared_ptr<N> node) = 0;
+
+  /**
+   * Remove a father of a node
+   */
+
+  virtual void removeFather(const std::shared_ptr<N> node, const std::shared_ptr<N> father) = 0;
+
+  /**
+   * Add a father to a node
+   * @param nodeObject the concerned node
+   * @param fatherNodeObject the node to be added as a father to the node
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+
+  virtual void addFather(const std::shared_ptr<N>  nodeObject, const std::shared_ptr<N>  fatherNodeObject, const std::shared_ptr<E> edgeObject = 0) = 0;
+
+  /**
+   * Iterators
+   *
+   */
+
+  /*
+   * @brief builds iterator on the neighbor nodes of a Node
+   *
+   */
+
+  typedef typename AssociationGraphObserver<N, E>::NodeIterator NodeIterator;
+  typedef typename AssociationGraphObserver<N, E>::EdgeIterator EdgeIterator;
+
+
+  /*
+   * @brief builds iterator on the sons of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> sonsIterator(std::shared_ptr<N> node) = 0;
+
+  /*
+   * @brief builds iterator on the fathers of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> fathersIterator(std::shared_ptr<N> node) = 0;
+
+  /**
+   * @brief Get Below Objects.
+   *
+   * @param localRoot of the subgraph.
+   * @return A vector of ancestor nodes ids.
+   *
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getBelowNodes(const std::shared_ptr<N> localRoot) = 0;
+
+  virtual std::vector<std::shared_ptr<E> > getBelowEdges(const std::shared_ptr<N> localRoot) = 0;
+};
+}
+
+#endif
diff --git a/src/Bpp/Graph/AssociationGraphImplObserver.h b/src/Bpp/Graph/AssociationGraphImplObserver.h
new file mode 100644
index 0000000..3a4409e
--- /dev/null
+++ b/src/Bpp/Graph/AssociationGraphImplObserver.h
@@ -0,0 +1,1332 @@
+//
+// File AssociationGraphImplObserver.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ASSOCIATION_GRAPH_IMPL_OBSERVER_HPP_
+#define _ASSOCIATION_GRAPH_IMPL_OBSERVER_HPP_
+
+#include "AssociationGraphObserver.h"
+#include "GlobalGraph.h"
+
+#include "../Exceptions.h"
+#include "../Clonable.h"
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
+#include <memory>
+#include <type_traits>
+
+namespace bpp
+{
+template<class N, class E, class GraphImpl>
+class AssociationGraphImplObserver : public virtual AssociationGraphObserver<N, E>
+{
+public:
+  typedef typename AssociationGraphObserver<N, E>::NodeIndex NodeIndex;
+  typedef typename AssociationGraphObserver<N, E>::EdgeIndex EdgeIndex;
+
+  typedef Graph::NodeId NodeGraphid;
+  typedef Graph::EdgeId EdgeGraphid;
+
+protected:
+  /**
+   * The observed Graph. Anytime this graph is observed,
+   * the current object will be warned to take changes into account.
+   */
+
+  std::shared_ptr<GraphImpl> subjectGraph_;
+
+private:
+  /**
+   * Registration with Graph Ids.
+   *
+   * @{
+   */
+
+  /**
+   * List of nodes, stored at the same ID than the corresponding nodes
+   * in the observed graph.
+   */
+  std::vector<std::shared_ptr<N> > graphidToN_;
+
+  /**
+   * List of edges, stored at the same ID than the corresponding edges
+   * in the observed graph.
+   */
+  std::vector<std::shared_ptr<E> > graphidToE_;
+
+  /**
+   * Can find a Node with the corresponding object.
+   */
+  std::map<std::shared_ptr<N>, NodeGraphid> NToGraphid_;
+
+  /**
+   * Can find an Edge with the corresponding object.
+   */
+  std::map<std::shared_ptr<E>, EdgeGraphid> EToGraphid_;
+
+  /*
+   * @}
+   */
+
+  /**
+   * Registration with own Ids.
+   *
+   * @{
+   */
+
+  /**
+   * List of nodes, stored at a given index.
+   */
+  std::vector<std::shared_ptr<N> > indexToN_;
+
+  /**
+   * List of edges, stored at a given index.
+   */
+  std::vector<std::shared_ptr<E> > indexToE_;
+
+  /**
+   * Can find a Node index with the corresponding object.
+   */
+  std::map<std::shared_ptr<N>, NodeIndex> NToIndex_;
+
+  /**
+   * Can find an Edge index with the corresponding object.
+   */
+  std::map<std::shared_ptr<E>, EdgeIndex> EToIndex_;
+
+  /*
+   * @}
+   */
+
+
+  /**
+   * defines a type of neighbors : incoming and/or outgoing
+   */
+  enum neighborType {INCOMING, OUTGOING, BOTH};
+
+  /**
+   * Get incoming / outgoing neighbors according to the enum type
+   */
+
+  std::vector<std::shared_ptr<N> > getNeighbors_(const std::shared_ptr<N>  nodeObject, neighborType type) const
+  {
+    NodeGraphid node = getNodeGraphid(nodeObject);
+
+    // PHASE 1: getting the right neighbors
+    std::vector<NodeGraphid> neighbors;
+    switch (type)
+    {
+    case OUTGOING:
+      neighbors = getGraph()->getOutgoingNeighbors(node);
+      break;
+    case INCOMING:
+      neighbors = getGraph()->getIncomingNeighbors(node);
+      break;
+    case BOTH:
+      neighbors = getGraph()->getNeighbors(node);
+    }
+    return getNodesFromGraphid(neighbors);
+  }
+
+  /**
+   * Get incoming / outgoing edges according to the enum type
+   */
+  std::vector<std::shared_ptr<E> > getEdges_(const std::shared_ptr<N>  nodeObject, neighborType type) const
+  {
+    NodeGraphid node = getNodeGraphid(nodeObject);
+
+    // PHASE 1: getting the right neighbors
+    std::vector<EdgeGraphid> edges;
+    switch (type)
+    {
+    case OUTGOING:
+      edges = getGraph()->getOutgoingEdges(node);
+      break;
+    case INCOMING:
+      edges = getGraph()->getIncomingEdges(node);
+      break;
+    case BOTH:
+      edges = getGraph()->getEdges(node);
+    }
+    return getEdgesFromGraphid(edges);
+  }
+
+public:
+  /**
+   * Constructor
+   * @param directed is the graph directed
+   */
+
+  AssociationGraphImplObserver(bool directed = false) :
+    subjectGraph_(new GraphImpl(directed)),
+    graphidToN_(),
+    graphidToE_(),
+    NToGraphid_(),
+    EToGraphid_(),
+    indexToN_(),
+    indexToE_(),
+    NToIndex_(),
+    EToIndex_()
+  {
+    getGraph()->registerObserver(this);
+  }
+
+  /**
+   * Constructor
+   * @param subjectGraph the graph which is observed
+   */
+
+  AssociationGraphImplObserver(std::shared_ptr<GraphImpl> subjectGraph = 00) :
+    subjectGraph_(subjectGraph ? subjectGraph : new GraphImpl()),
+    graphidToN_(),
+    graphidToE_(),
+    NToGraphid_(),
+    EToGraphid_(),
+    indexToN_(),
+    indexToE_(),
+    NToIndex_(),
+    EToIndex_()
+  {
+    getGraph()->registerObserver(this);
+  }
+
+  /**
+   * Copy Constructor
+   * @param graphObserver the graphObserver to be copied
+   */
+
+  template<class N2, class E2>
+  AssociationGraphImplObserver(AssociationGraphImplObserver<N2, E2, GraphImpl> const& graphObserver) :
+    subjectGraph_(graphObserver.getGraph()),
+    graphidToN_(graphObserver.graphidToN_.size()),
+    graphidToE_(graphObserver.graphidToE_.size()),
+    NToGraphid_(),
+    EToGraphid_(),
+    indexToN_(graphObserver.indexToN_.size()),
+    indexToE_(graphObserver.indexToE_.size()),
+    NToIndex_(),
+    EToIndex_()
+  {
+    for (typename std::map<std::shared_ptr<N2>, NodeGraphid >::const_iterator itN = graphObserver.NToGraphid_.begin();
+         itN != graphObserver.NToGraphid_.end(); itN++)
+    {
+      std::shared_ptr<N> node(AssociationGraphObserver<N, E>::template copy<N2, N>(*itN->first));
+
+      NToGraphid_[node] = itN->second;
+      graphidToN_[itN->second] = node;
+
+      typename std::map<std::shared_ptr<N2>, typename AssociationGraphObserver<N2, E2>::NodeIndex>::const_iterator indN = graphObserver.NToIndex_.find(itN->first);
+
+      if (indN != graphObserver.NToIndex_.end())
+      {
+        NToIndex_[node] = indN->second;
+        indexToN_[indN->second] = node;
+      }
+    }
+
+    for (typename std::map<std::shared_ptr<E2>, EdgeGraphid >::const_iterator itE = graphObserver.EToGraphid_.begin();
+         itE != graphObserver.EToGraphid_.end(); itE++)
+    {
+      std::shared_ptr<E> edge(AssociationGraphObserver<N, E>::template copy<E2, E>(*itE->first));
+
+      EToGraphid_[edge] = itE->second;
+      graphidToE_[itE->second] = edge;
+
+      typename std::map<std::shared_ptr<E2>, typename AssociationGraphObserver<N2, E2>::EdgeIndex>::const_iterator indE = graphObserver.EToIndex_.find(itE->first);
+
+      if (indE != graphObserver.EToIndex_.end())
+      {
+        EToIndex_[edge] = indE->second;
+        indexToE_[indE->second] = edge;
+      }
+    }
+
+    getGraph()->registerObserver(this);
+  }
+
+  AssociationGraphImplObserver(AssociationGraphImplObserver<N, E, GraphImpl> const& graphObserver) :
+    subjectGraph_(graphObserver.subjectGraph_),
+    graphidToN_(graphObserver.graphidToN_.size()),
+    graphidToE_(graphObserver.graphidToE_.size()),
+    NToGraphid_(),
+    EToGraphid_(),
+    indexToN_(graphObserver.indexToN_.size()),
+    indexToE_(graphObserver.indexToE_.size()),
+    NToIndex_(),
+    EToIndex_()
+  {
+    for (typename std::map<std::shared_ptr<N>, NodeGraphid >::const_iterator itN = graphObserver.NToGraphid_.begin();
+         itN != graphObserver.NToGraphid_.end(); itN++)
+    {
+      std::shared_ptr<N> node(AssociationGraphObserver<N, E>::template copy<N, N>(*itN->first));
+
+      NToGraphid_[node] = itN->second;
+      graphidToN_[itN->second] = node;
+
+      typename std::map<std::shared_ptr<N>, typename AssociationGraphObserver<N, E>::NodeIndex>::const_iterator indN = graphObserver.NToIndex_.find(itN->first);
+
+      if (indN != graphObserver.NToIndex_.end())
+      {
+        NToIndex_[node] = indN->second;
+        indexToN_[indN->second] = node;
+      }
+    }
+
+    for (typename std::map<std::shared_ptr<E>, EdgeGraphid >::const_iterator itE = graphObserver.EToGraphid_.begin();
+         itE != graphObserver.EToGraphid_.end(); itE++)
+    {
+      std::shared_ptr<E> edge(AssociationGraphObserver<N, E>::template copy<E, E>(*itE->first));
+
+      EToGraphid_[edge] = itE->second;
+      graphidToE_[itE->second] = edge;
+
+      typename std::map<std::shared_ptr<E>, typename AssociationGraphObserver<N, E>::EdgeIndex>::const_iterator indE = graphObserver.EToIndex_.find(itE->first);
+
+      if (indE != graphObserver.EToIndex_.end())
+      {
+        EToIndex_[edge] = indE->second;
+        indexToE_[indE->second] = edge;
+      }
+    }
+
+    getGraph()->registerObserver(this);
+  }
+
+
+  /**
+   * = Operator
+   * @param graphObserver the graphObserver we want to copy the values
+   */
+
+  AssociationGraphImplObserver<N, E, GraphImpl>& operator=(bpp::AssociationGraphImplObserver<N, E, GraphImpl> const& graphObserver)
+  {
+    this->graphidToN_.resize(graphObserver.graphidToN_.size());
+    this->graphidToE_.resize(graphObserver.graphidToE_.size());
+    this->indexToN_.resize(graphObserver.indexToN_.size());
+    this->indexToE_.resize(graphObserver.indexToE_.size());
+
+    for (typename std::map<std::shared_ptr<N>, NodeGraphid >::const_iterator itN = graphObserver.NToGraphid_.begin();
+         itN != graphObserver.NToGraphid_.end(); itN++)
+    {
+      std::shared_ptr<N> node(AssociationGraphObserver<N, E>::template copy<N, N>(*itN->first));
+
+      NToGraphid_[node] = itN->second;
+      graphidToN_[itN->second] = node;
+
+      typename std::map<std::shared_ptr<N>, typename AssociationGraphObserver<N, E>::NodeIndex>::const_iterator indN = graphObserver.NToIndex_.find(itN->first);
+
+      if (indN != graphObserver.NToIndex_.end())
+      {
+        NToIndex_[node] = indN->second;
+        indexToN_[indN->second] = node;
+      }
+    }
+
+    for (typename std::map<std::shared_ptr<E>, EdgeGraphid >::const_iterator itE = graphObserver.EToGraphid_.begin(); itE != graphObserver.EToGraphid_.end(); itE++)
+    {
+      std::shared_ptr<E> edge(AssociationGraphObserver<N, E>::template copy<E, E>(*itE->first));
+
+      EToGraphid_[edge] = itE->second;
+      graphidToE_[itE->second] = edge;
+
+      typename std::map<std::shared_ptr<E>, typename AssociationGraphObserver<N, E>::EdgeIndex>::const_iterator indE = graphObserver.EToIndex_.find(itE->first);
+
+      if (indE != graphObserver.EToIndex_.end())
+      {
+        EToIndex_[edge] = indE->second;
+        indexToE_[indE->second] = edge;
+      }
+    }
+
+    this->subjectGraph_ = graphObserver.getGraph();
+
+    this->getGraph()->registerObserver(this);
+
+    return *this;
+  }
+
+
+  /**
+   * Destructor
+   */
+
+  ~AssociationGraphImplObserver()
+  {
+    getGraph()->unregisterObserver(this);
+  }
+
+  /**
+   * clone function
+   */
+
+  AssociationGraphImplObserver<N, E, GraphImpl>* clone() const { return new AssociationGraphImplObserver<N, E, GraphImpl>(*this); }
+
+  const std::shared_ptr<GraphImpl> getGraph() const
+  {
+    return subjectGraph_;
+  }
+
+  std::shared_ptr<GraphImpl> getGraph()
+  {
+    return subjectGraph_;
+  }
+
+  /**
+   * This function is called to tell the observer that the subject
+   * has changed and hence the observer has to take the changes
+   * into account.
+   */
+  void update();
+
+
+  /** @name Graph Relations Management
+   *  Modificating the structure of the graph.
+   */
+  // /@{
+
+  /**
+   * Creates an orphaned node from a NodeClass object.
+   * @param nodeObject the N object associated to the node in the graph.
+   *
+   */
+  void createNode(std::shared_ptr<N>  nodeObject)
+  {
+    if (NToGraphid_.find(nodeObject) != NToGraphid_.end())
+      throw Exception("AssociationGraphImplObserver::createNode : node already exists");
+
+    unsigned int newGraphNode = getGraph()->createNode();
+    associateNode(nodeObject, newGraphNode);
+  }
+
+  /**
+   * Creates an node linked to an existing node. Order of parameters match
+   * the link method.
+   * @param objectOriginNode existing node. In a directed graph: origin -> newNode.
+   * @param newNodeObject the N object associated to the node in the graph.
+   * @param newEdgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+  void createNode(std::shared_ptr<N>  objectOriginNode, std::shared_ptr<N>  newNodeObject, std::shared_ptr<E>  newEdgeObject = 00)
+  {
+    createNode(newNodeObject);
+    link(objectOriginNode, newNodeObject, newEdgeObject);
+  }
+
+public:
+  /**
+   * Creates a link between two existing nodes.
+   * If directed graph: nodeA -> nodeB.
+   * @param nodeObjectA source node (or first node if undirected)
+   * @param nodeObjectB target node (or second node if undirected)
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+  void link(std::shared_ptr<N>  nodeObjectA, std::shared_ptr<N>  nodeObjectB, std::shared_ptr<E>  edgeObject = 00)
+  {
+    // checking the nodes
+    typename std::map<std::shared_ptr<N>, NodeGraphid>::iterator foundNodeA, foundNodeB;
+    foundNodeA = NToGraphid_.find(nodeObjectA);
+    foundNodeB = NToGraphid_.find(nodeObjectB);
+    if (foundNodeA == NToGraphid_.end() || foundNodeB == NToGraphid_.end())
+      throw Exception("One of the nodes is not in the graph observer.");
+
+    // checking if the edge is not already in the GraphObserver
+    if (edgeObject != 00 && EToGraphid_.find(edgeObject) != EToGraphid_.end())
+      throw Exception("The given edge is already associated to a relation in the subjectGraph.");
+
+//  std::cout << "Trying to link node " << foundNodeA->second << " -> " << foundNodeB->second << std::endl;
+    EdgeGraphid newGraphEdge = getGraph()->link(foundNodeA->second, foundNodeB->second);
+
+    if (graphidToE_.size() < newGraphEdge + 1)
+      graphidToE_.resize(newGraphEdge + 1);
+    graphidToE_.at(newGraphEdge) = edgeObject;
+    EToGraphid_[edgeObject] = newGraphEdge;
+  }
+
+
+  /**
+   * Deletes the link between two existing nodes in the graph.
+   */
+  void unlink(std::shared_ptr<N>  nodeObjectA, std::shared_ptr<N>  nodeObjectB)
+  {
+    // checking the nodes
+    typename std::map<std::shared_ptr<N>, NodeGraphid>::iterator foundNodeA, foundNodeB;
+    foundNodeA = NToGraphid_.find(nodeObjectA);
+    foundNodeB = NToGraphid_.find(nodeObjectB);
+    if (foundNodeA == NToGraphid_.end() || foundNodeB == NToGraphid_.end())
+      throw Exception("One of the nodes is not in the graph observer.");
+
+    getGraph()->unlink(foundNodeA->second, foundNodeB->second);
+  }
+
+public:
+  /**
+   * Deletes a node
+   * @param nodeObject node to be deleted. The N node object given in argument is not deleted.
+   */
+  void deleteNode(std::shared_ptr<N>  nodeObject)
+  {
+    // first deleting the node in the graph
+    getGraph()->deleteNode(getNodeGraphid(nodeObject));
+    // then forgetting
+    dissociateNode(nodeObject);
+  }
+
+
+  // /@}
+
+  /** @name Object Association
+   *  Associate or dissociate N and E objects to pre-existing Graph Nodes and Graph Edges
+   */
+  // /@{
+
+  /**
+   * Associate a N  object to a node in the graph.
+   * @param nodeObject object to associate
+   * @param graphNode existing node to be associated
+   */
+  void associateNode(std::shared_ptr<N>  nodeObject, NodeGraphid graphNode)
+  {
+    // nodes vector must be the right size. Eg: to store a node with
+    // the ID 3, the vector must be of size 4: {0,1,2,3} (size = 4)
+    if (graphidToN_.size() < graphNode + 1)
+      graphidToN_.resize(graphNode + 1);
+
+    // now storing the node
+    graphidToN_.at(graphNode) = nodeObject;
+    NToGraphid_[nodeObject] = graphNode;
+  }
+
+  /**
+   * Associate a E object to an edge in the graph.
+   * @param edgeObject object to associate
+   * @param graphEdge existing edge to be associated
+   */
+  void associateEdge(std::shared_ptr<E>  edgeObject, EdgeGraphid graphEdge)
+  {
+    // nodes vector must be the right size. Eg: to store an edge with
+    // the ID 3, the vector must be of size 4: {0,1,2,3} (size = 4)
+    if (graphidToE_.size() < graphEdge + 1)
+      graphidToE_.resize(graphEdge + 1);
+
+    // now storing the edge
+    graphidToE_.at(graphEdge) = edgeObject;
+    EToGraphid_[edgeObject] = graphEdge;
+  }
+
+  /**
+   * Dissociate a N or E object to a node or an edge in the graph.
+   * @param nodeObject object to dissociate
+   */
+  void dissociateNode(std::shared_ptr<N>  nodeObject)
+  {
+    typename std::map<std::shared_ptr<N>, NodeGraphid>::iterator nodeToForget = NToGraphid_.find(nodeObject);
+    graphidToN_.at(nodeToForget->second) = 00;
+    NToGraphid_.erase(nodeToForget);
+  }
+
+
+  void dissociateEdge(std::shared_ptr<E>  edgeObject)
+  {
+    typename std::map<std::shared_ptr<E>, EdgeGraphid>::iterator edgeToForget = EToGraphid_.find(edgeObject);
+    graphidToE_.at(edgeToForget->second) = 00;
+    EToGraphid_.erase(edgeToForget);
+  }
+
+
+  /**
+   * Return the associated Node ID
+   * @param nodeObject object which to return the node ID
+   * @return a node ID
+   */
+  NodeGraphid getNodeGraphid(const std::shared_ptr<N>  nodeObject) const
+  {
+    typename std::map<std::shared_ptr<N>, NodeGraphid>::const_iterator found = NToGraphid_.find(nodeObject);
+    if (found == NToGraphid_.end())
+      throw Exception("Unexisting node object.");
+    return found->second;
+  }
+
+
+  /**
+   * Return the associated Edge ID
+   * @param edgeObject object which to return the node ID
+   * @return a edge ID
+   */
+  EdgeGraphid getEdgeGraphid(const std::shared_ptr<E>  edgeObject) const
+  {
+    typename std::map<std::shared_ptr<E>, EdgeGraphid>::const_iterator found = EToGraphid_.find(edgeObject);
+    if (found == EToGraphid_.end())
+      throw Exception("Unexisting edge object.");
+    return found->second;
+  }
+
+
+  /**
+   * Transforms an (a list of) id(s) into an (a list of) object(s)
+   */
+  std::shared_ptr<N>  getNodeFromGraphid(NodeGraphid node)
+  {
+    return graphidToN_.at(node);
+  }
+
+  const std::shared_ptr<N> getNodeFromGraphid(NodeGraphid node) const
+  {
+    return graphidToN_.at(node);
+  }
+
+  std::vector<std::shared_ptr<N> > getNodesFromGraphid(std::vector<NodeGraphid> nodes) const
+  {
+    std::vector<std::shared_ptr<N> > nodeObjects;
+    for (typename std::vector<NodeGraphid>::iterator currNode = nodes.begin(); currNode != nodes.end(); currNode++)
+    {
+      if (*currNode > graphidToN_.size())
+        continue;
+      std::shared_ptr<N>  foundNodeObject = graphidToN_.at(*currNode);
+      if (!foundNodeObject)
+        continue;
+      nodeObjects.push_back(foundNodeObject);
+    }
+    return nodeObjects;
+  }
+
+  std::shared_ptr<E> getEdgeFromGraphid(EdgeGraphid edge)
+  {
+    return graphidToE_.at(edge);
+  }
+
+  const std::shared_ptr<E> getEdgeFromGraphid(EdgeGraphid edge) const
+  {
+    return graphidToE_.at(edge);
+  }
+
+
+  std::vector<std::shared_ptr<E> > getEdgesFromGraphid(std::vector<EdgeGraphid> edges) const
+  {
+    std::vector<std::shared_ptr<E> > edgeObjects;
+    for (typename std::vector<EdgeGraphid>::iterator currEdge = edges.begin(); currEdge != edges.end(); currEdge++)
+    {
+      if (*currEdge > graphidToE_.size())
+        continue;
+      std::shared_ptr<E>  foundEdgeObject = graphidToE_.at(*currEdge);
+      if (!foundEdgeObject)
+        continue;
+      edgeObjects.push_back(foundEdgeObject);
+    }
+    return edgeObjects;
+  }
+
+
+  /**
+   * @brief set the root (but no checking, prefer rootAt)
+   */
+  void setRoot(const std::shared_ptr<N> newRoot)
+  {
+    return getGraph()->setRoot(getNodeGraphid(newRoot));
+  }
+
+  /**
+   * @return the root
+   */
+
+  std::shared_ptr<N> getRoot() const
+  {
+    return this->getNodeFromGraphid(this->getGraph()->getRoot());
+  }
+
+  NodeIndex getRootIndex() const
+  {
+    return this->getNodeIndex(this->getNodeFromGraphid(this->getGraph()->getRoot()));
+  }
+
+  // /@}
+
+  /** @name Object Indexation
+   *  Get or set indexes to nodes and edges
+   */
+  // /@{
+
+  /*
+   * @brief Return if object has an index.
+   *
+   */
+  bool hasIndex(const std::shared_ptr<N> nodeObject) const
+  {
+    typename std::map<std::shared_ptr<N>, typename AssociationGraphObserver<N, E>::NodeIndex>::const_iterator found = NToIndex_.find(nodeObject);
+    return found != NToIndex_.end();
+  }
+
+  bool hasIndex(const std::shared_ptr<E> edgeObject) const
+  {
+    typename std::map<std::shared_ptr<E>, typename AssociationGraphObserver<N, E>::EdgeIndex>::const_iterator found = EToIndex_.find(edgeObject);
+    return found != EToIndex_.end();
+  }
+
+  /**
+   * Return the associated Node index
+   * @param nodeObject object which to return the node index
+   * @return a node index
+   */
+  NodeIndex getNodeIndex(const std::shared_ptr<N>  nodeObject) const
+  {
+    typename std::map<std::shared_ptr<N>, typename AssociationGraphObserver<N, E>::NodeIndex>::const_iterator found = NToIndex_.find(nodeObject);
+    if (found == NToIndex_.end())
+      throw Exception("Node object with graph id " + TextTools::toString(getNodeGraphid(nodeObject)) + " has no index.");
+
+    return found->second;
+  }
+
+  std::vector<NodeIndex> getNodeIndexes(std::vector<std::shared_ptr<N> > nodes) const
+  {
+    std::vector<NodeIndex> nodeIndexes;
+    for (typename std::vector<std::shared_ptr<N> >::iterator currNode = nodes.begin(); currNode != nodes.end(); currNode++)
+    {
+      nodeIndexes.push_back(getNodeIndex(*currNode));
+    }
+    return nodeIndexes;
+  }
+
+  /**
+   * Return the associated Node index
+   * @param edgeObject object which to return the node index
+   * @return a node index
+   */
+  EdgeIndex getEdgeIndex(const std::shared_ptr<E>  edgeObject) const
+  {
+    typename std::map<std::shared_ptr<E>, typename AssociationGraphObserver<N, E>::EdgeIndex>::const_iterator found = EToIndex_.find(edgeObject);
+    if (found == EToIndex_.end())
+      throw Exception("Edge object with graph id " + TextTools::toString(getEdgeGraphid(edgeObject)) + " has no index.");
+    return found->second;
+  }
+
+  std::vector<EdgeIndex> getEdgeIndexes(std::vector<std::shared_ptr<E> > edges) const
+  {
+    std::vector<EdgeIndex> edgeIndexes;
+    for (typename std::vector<std::shared_ptr<E> >::iterator currEdge = edges.begin(); currEdge != edges.end(); currEdge++)
+    {
+      edgeIndexes.push_back(getEdgeIndex(*currEdge));
+    }
+    return edgeIndexes;
+  }
+
+  /**
+   * Set an index associated to a node
+   * @param nodeObject object to which one want to set the index
+   * @param index intex to be given, 0 to get the first free index
+   * @return the given index
+   */
+  NodeIndex setNodeIndex(const std::shared_ptr<N>  nodeObject, NodeIndex index)
+  {
+    // TODO: check if this object has already an index?
+
+    // nodes vector must be the right size. Eg: to store a node with
+    // the index 3, the vector must be of size 4: {0,1,2,3} (size = 4)
+    if (index >= indexToN_.size())
+      indexToN_.resize(index + 1);
+
+    // now storing the node
+    indexToN_.at(index) = nodeObject;
+    NToIndex_[nodeObject] = index;
+    return index;
+  }
+
+  /**
+   * Set an index associated to an edge
+   * @param edgeObject object to which one want to set the index
+   * @param index intex to be given, 0 to get the first free index
+   * @return the given index
+   */
+  EdgeIndex setEdgeIndex(const std::shared_ptr<E>  edgeObject, EdgeIndex index)
+  {
+    // TODO: check if this object has already an index?
+
+    // nodes vector must be the right size. Eg: to store an edge with
+    // the index 3, the vector must be of size 4: {0,1,2,3} (size = 4)
+    if (index >= indexToE_.size())
+      indexToE_.resize(index + 1);
+
+    // now storing the edge
+    indexToE_.at(index) = edgeObject;
+    EToIndex_[edgeObject] = index;
+    return index;
+  }
+
+  /**
+   * Return the associated Node index
+   * @param node object which to return the node index
+   * @return a node index
+   */
+
+  std::shared_ptr<N>  getNode(NodeIndex node) const
+  {
+    return indexToN_.at(node);
+  }
+
+  /**
+   * Return the associated Node index
+   * @param edge object which to return the node index
+   * @return a node index
+   */
+
+  std::shared_ptr<E>  getEdge(EdgeIndex edge) const
+  {
+    return indexToE_.at(edge);
+  }
+
+  // /@}
+
+  /** @name Topology exploration
+   *  These methodes of the graph concern the topology exploration.
+   */
+  // /@{
+
+  /**
+   * @name Iterators on Nodes
+   *
+   */
+
+  template<class GraphIterator, bool is_const>
+  class NodeIteratorClass :
+    virtual public AssociationGraphObserver<N, E>::NodeIterator
+  {
+private:
+    NodesIteratorClass<GraphIterator, is_const> it_;
+    const AssociationGraphImplObserver<N, E, GraphImpl>& agio_;
+
+public:
+    NodeIteratorClass<GraphIterator, is_const>(AssociationGraphImplObserver<N, E, GraphImpl> &agio) : it_(*agio.getGraph()),
+      agio_(agio) { start(); };
+
+    NodeIteratorClass<GraphIterator, is_const>(const AssociationGraphImplObserver<N, E, GraphImpl> &agio) : it_(*agio.getGraph()),
+      agio_(agio) { start(); };
+
+    NodeIteratorClass<GraphIterator, is_const>(AssociationGraphImplObserver<N, E, GraphImpl> &agio, std::shared_ptr<N> n) : it_(*agio.getGraph(), agio.getNodeGraphid(n)),
+      agio_(agio) {start(); };
+
+    NodeIteratorClass<GraphIterator, is_const>(const AssociationGraphImplObserver<N, E, GraphImpl> &agio, std::shared_ptr<N> n) : it_(*agio.getGraph(), agio.getNodeGraphid(n)),
+      agio_(agio) {start(); };
+
+    ~NodeIteratorClass<GraphIterator, is_const>() {}
+
+    void next() {it_.next(); while (!it_.end() && agio_.getNodeFromGraphid(*it_) == 0) it_.next(); }
+
+    bool end() const {return it_.end(); }
+
+    void start() { it_.start(); while (!it_.end() && (agio_.getNodeFromGraphid(*it_) == 0)) it_.next(); }
+
+    std::shared_ptr<N> operator*() {return agio_.getNodeFromGraphid(*it_); }
+  };
+
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::NodeIterator> allNodesIterator()
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::ALLGRAPHITER, false> >(new AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::ALLGRAPHITER, false>(*this));
+  }
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::NodeIterator> allNodesIterator() const
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::ALLGRAPHITER, true> >(new AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::ALLGRAPHITER, true>(*this));
+  }
+
+
+  /*
+   * @brief builds iterator on the neighbor nodes of a Node
+   *
+   */
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::NodeIterator> outgoingNeighborNodesIterator(std::shared_ptr<N> node)
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::OUTGOINGNEIGHBORITER, false> >(new AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::OUTGOINGNEIGHBORITER, false>(*this, node));
+  }
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::NodeIterator> outgoingNeighborNodesIterator(std::shared_ptr<N> node) const
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::OUTGOINGNEIGHBORITER, true> >(new AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::OUTGOINGNEIGHBORITER, true>(*this, node));
+  }
+
+
+  /*
+   * @brief builds iterator on the neighbor nodes of a Node
+   *
+   */
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::NodeIterator> incomingNeighborNodesIterator(std::shared_ptr<N> node)
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::INCOMINGNEIGHBORITER, false> >(new AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::INCOMINGNEIGHBORITER, false>(*this, node));
+  }
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::NodeIterator> incomingNeighborNodesIterator(std::shared_ptr<N> node) const
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::INCOMINGNEIGHBORITER, true> >(new AssociationGraphImplObserver<N, E, GraphImpl>::NodeIteratorClass<Graph::INCOMINGNEIGHBORITER, true>(*this, node));
+  }
+
+
+  /**
+   * Get all the neighbors of a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the neighbors
+   */
+  std::vector<std::shared_ptr<N> > getNeighbors(const std::shared_ptr<N>  node) const
+  {
+    return getNeighbors_(node, BOTH);
+  }
+
+  std::vector<NodeIndex> getNeighbors(NodeIndex node) const
+  {
+    return getNodeIndexes(getNeighbors(getNode(node)));
+  }
+
+  /**
+   * Get all the edges of a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the edges
+   */
+
+  std::vector<std::shared_ptr<E> > getEdges(const std::shared_ptr<N>  node) const
+  {
+    return getEdges_(node, BOTH);
+  }
+
+  std::vector<EdgeIndex> getEdges(NodeIndex node) const
+  {
+    return getEdgeIndexes(getEdges(getNode(node)));
+  }
+
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the outgoing neighbors
+   */
+  std::vector<std::shared_ptr<N> > getOutgoingNeighbors(const std::shared_ptr<N>  node) const
+  {
+    return getNeighbors_(node, OUTGOING);
+  }
+
+  std::vector<NodeIndex> getOutgoingNeighbors(NodeIndex node) const
+  {
+    return getNodeIndexes(getOutgoingNeighbors(getNode(node)));
+  }
+
+  /**
+   * In an directed graph, get all the edges which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the outgoing edges
+   */
+  std::vector<std::shared_ptr<E> > getOutgoingEdges(const std::shared_ptr<N>  node) const
+  {
+    return getEdges_(node, OUTGOING);
+  }
+
+  std::vector<EdgeIndex> getOutgoingEdges(NodeIndex node) const
+  {
+    return getEdgeIndexes(getOutgoingEdges(getNode(node)));
+  }
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the incoming neighbors
+   */
+
+  std::vector<std::shared_ptr<N> > getIncomingNeighbors(const std::shared_ptr<N>  node) const
+  {
+    return getNeighbors_(node, INCOMING);
+  }
+
+  std::vector<NodeIndex> getIncomingNeighbors(NodeIndex node) const
+  {
+    return getNodeIndexes(getIncomingNeighbors(getNode(node)));
+  }
+
+
+  /**
+   * In an directed graph, get all the edges which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the incoming edges
+   */
+
+  std::vector<std::shared_ptr<E> > getIncomingEdges(const std::shared_ptr<N>  node) const
+  {
+    return getEdges_(node, INCOMING);
+  }
+
+  std::vector<EdgeIndex> getIncomingEdges(NodeIndex node) const
+  {
+    return getEdgeIndexes(getIncomingEdges(getNode(node)));
+  }
+
+  /**
+   * Get the leaves of a graph, ie, nodes with only one neighbor,
+   * starting from a peculiar node, with maxDepth recursion depths.
+   *
+   * @param node the starting node
+   * @param maxDepth the max recursion depth
+   * @return a vector containing the leaves
+   */
+
+  std::vector<std::shared_ptr<N> > getLeavesFromNode(std::shared_ptr<N>  node, unsigned int maxDepth) const
+  {
+    return getNodesFromGraphid(getGraph()->getLeavesFromNode(getNodeGraphid(node), maxDepth));
+  }
+
+  /**
+   * Get all the leaves objects of a graph, ie, nodes with only one neighbor,
+   * @return a vector containing the leaves
+   */
+
+  std::vector<std::shared_ptr<N> > getAllLeaves() const
+  {
+    std::vector<std::shared_ptr<N> > leavesToReturn;
+    // fetching all the graph Leaves
+    std::vector<NodeGraphid> graphLeaves = getGraph()->getAllLeaves();
+    // testing if they are defined in this observer
+    for (typename std::vector<NodeGraphid>::iterator currGraphLeave = graphLeaves.begin(); currGraphLeave != graphLeaves.end(); currGraphLeave++)
+    {
+      std::shared_ptr<N>  foundLeafObject = graphidToN_.at(*currGraphLeave);
+      if (foundLeafObject != 00)
+        leavesToReturn.push_back(foundLeafObject);
+    }
+    return leavesToReturn;
+  }
+
+  /**
+   * Get all the inner nodes of a graph, ie, nodes with degree >= 2.
+   * @return a vector containing the inner nodes.
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getAllInnerNodes() const
+  {
+    std::vector<std::shared_ptr<N> > nodesToReturn;
+    // fetching all the graph Leaves
+    std::vector<NodeGraphid> graphNodes = getGraph()->getAllInnerNodes();
+    // testing if they are defined in this observer
+    for (typename std::vector<NodeGraphid>::iterator currGraphNode = graphNodes.begin(); currGraphNode != graphNodes.end(); currGraphNode++)
+    {
+      std::shared_ptr<N>  foundNodeObject = graphidToN_.at(*currGraphNode);
+      if (foundNodeObject != 00)
+        nodesToReturn.push_back(foundNodeObject);
+    }
+    return nodesToReturn;
+  }
+
+  /**
+   * Get all the defined nodes of a graph,
+   * @return a vector containing the nodesObjects
+   */
+
+  std::vector<std::shared_ptr<N> > getAllNodes() const
+  {
+    std::vector<std::shared_ptr<N> > nodesToReturn;
+    for (typename std::vector<std::shared_ptr<N> >::const_iterator currNodeObject = graphidToN_.begin(); currNodeObject != graphidToN_.end(); currNodeObject++)
+    {
+      if (*currNodeObject != 00)
+      {
+        nodesToReturn.push_back(*currNodeObject);
+      }
+    }
+    return nodesToReturn;
+  }
+
+  std::vector<NodeIndex> getAllNodesIndexes() const
+  {
+    std::vector<typename AssociationGraphObserver<N, E>::NodeIndex > indexesToReturn;
+    for (typename std::vector<std::shared_ptr<N> >::const_iterator currNodeObject = graphidToN_.begin(); currNodeObject != graphidToN_.end(); currNodeObject++)
+    {
+      if (*currNodeObject != 00)
+      {
+        indexesToReturn.push_back(getNodeIndex(*currNodeObject));
+      }
+    }
+    return indexesToReturn;
+  }
+
+
+  template<class GraphIterator, bool is_const>
+  class EdgeIteratorClass :
+    public AssociationGraphObserver<N, E>::EdgeIterator
+  {
+private:
+    EdgesIteratorClass<GraphIterator, is_const> it_;
+    const AssociationGraphImplObserver<N, E, GraphImpl>& agio_;
+
+public:
+    EdgeIteratorClass<GraphIterator, is_const>(AssociationGraphImplObserver<N, E, GraphImpl> &agio) : it_(*agio.getGraph()),
+      agio_(agio) { start(); };
+
+    EdgeIteratorClass<GraphIterator, is_const>(AssociationGraphImplObserver<N, E, GraphImpl> &agio, std::shared_ptr<N> n) : it_(*agio.getGraph(), agio.getNodeGraphid(n)),
+      agio_(agio) { start(); };
+
+    EdgeIteratorClass<GraphIterator, is_const>(const AssociationGraphImplObserver<N, E, GraphImpl> &agio) : it_(*agio.getGraph()),
+      agio_(agio) { start(); };
+
+    EdgeIteratorClass<GraphIterator, is_const>(const AssociationGraphImplObserver<N, E, GraphImpl> &agio, std::shared_ptr<N> n) : it_(*agio.getGraph(), agio.getNodeGraphid(n)),
+      agio_(agio) { start(); };
+
+    ~EdgeIteratorClass<GraphIterator, is_const>() {}
+
+    void next() {it_.next(); while (!it_.end() && (agio_.getEdgeFromGraphid(*it_) == 0)) it_.next(); }
+
+    bool end() const {return it_.end(); }
+
+    void start() { it_.start(); while (!it_.end() && (agio_.getEdgeFromGraphid(*it_) == 0)) it_.next(); }
+
+    std::shared_ptr<E> operator*() {return agio_.getEdgeFromGraphid(*it_); }
+  };
+
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::EdgeIterator> allEdgesIterator()
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::ALLGRAPHITER, false> >(new AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::ALLGRAPHITER, false>(*this));
+  }
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::EdgeIterator> allEdgesIterator() const
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::ALLGRAPHITER, true> >(new AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::ALLGRAPHITER, true>(*this));
+  }
+
+  /*
+   * @brief builds iterator on the outgoing neighbor nodes of a Edge
+   *
+   */
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::EdgeIterator> outgoingEdgesIterator(std::shared_ptr<N> node)
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::OUTGOINGNEIGHBORITER, false> >(new AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::OUTGOINGNEIGHBORITER, false>(*this, node));
+  }
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::EdgeIterator> outgoingEdgesIterator(std::shared_ptr<N> node) const
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::OUTGOINGNEIGHBORITER, true> >(new AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::OUTGOINGNEIGHBORITER, true>(*this, node));
+  }
+
+  /*
+   * @brief builds iterator on the incoming neighbor nodes of a Edge
+   *
+   */
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::EdgeIterator> incomingEdgesIterator(std::shared_ptr<N> node)
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::INCOMINGNEIGHBORITER, false> >(new AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::INCOMINGNEIGHBORITER, false>(*this, node));
+  }
+
+  std::unique_ptr<typename AssociationGraphObserver<N, E>::EdgeIterator> incomingEdgesIterator(std::shared_ptr<N> node) const
+  {
+    return std::unique_ptr<AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::INCOMINGNEIGHBORITER, true> >(new AssociationGraphImplObserver<N, E, GraphImpl>::EdgeIteratorClass<Graph::INCOMINGNEIGHBORITER, true>(*this, node));
+  }
+
+  /**
+   * Get all the defined branches of a graph,
+   * @return a vector containing the branchesObjects
+   */
+
+  std::vector<std::shared_ptr<E> > getAllEdges() const
+  {
+    std::vector<std::shared_ptr<E> > branchesToReturn;
+    for (typename std::vector<std::shared_ptr<E> >::const_iterator currBrObject = graphidToE_.begin(); currBrObject != graphidToE_.end(); currBrObject++)
+    {
+      if (*currBrObject != 00)
+      {
+        branchesToReturn.push_back(*currBrObject);
+      }
+    }
+    return branchesToReturn;
+  }
+
+  /**
+   * @brief Is  the node a leaf?
+   */
+  bool isLeaf(const std::shared_ptr<N>  node) const
+  {
+    return getGraph()->isLeaf(this->getNodeGraphid(node));
+  }
+
+  /**
+   * Get nodes located at the extremities of an edge
+   * @param edge an edge
+   * @return a pair of the Nodes at each extremity of the edge
+   *        example : N1--E1-->N2; getNodes(E1) will return (N1,N2);
+   */
+
+  std::pair<std::shared_ptr<N>, std::shared_ptr<N> > getNodes(std::shared_ptr<E>  edge) const
+  {
+    std::pair<NodeGraphid, NodeGraphid> nodes = getGraph()->getNodes(getEdgeGraphid(edge));
+    return std::pair<std::shared_ptr<N>, std::shared_ptr<N> >(getNodeFromGraphid(nodes.first), getNodeFromGraphid(nodes.second));
+  }
+
+  /**
+   * Returns the Edge between two nodes nodeA -> nodeB
+   * @param nodeA source node (if directed)
+   * @param nodeB destination node (if directed)
+   * @return the edge between these two nodes
+   */
+
+  std::shared_ptr<E>  getEdgeLinking(std::shared_ptr<N>  nodeA, std::shared_ptr<N>  nodeB) const
+  {
+    return getEdgeFromGraphid(getGraph()->getEdge(getNodeGraphid(nodeA), getNodeGraphid(nodeB)));
+  }
+
+  /**
+   * Sets the Edge between two nodes nodeA -> nodeB
+   * @param nodeA source node (if directed)
+   * @param nodeB destination node (if directed)
+   * @param edge the edge between these two nodes
+   */
+  void setEdgeLinking(std::shared_ptr<N>  nodeA, std::shared_ptr<N>  nodeB, std::shared_ptr<E> edge)
+  {
+    associateEdge(edge, getGraph()->getEdge(getNodeGraphid(nodeA), getNodeGraphid(nodeB)));
+  }
+
+  // /@}
+
+
+  /** @name Function called by the subjectGraph
+   *  These methodes are called by the subject graph to make this observer so fit the subject graph
+   */
+  // /@{
+
+  /**
+   * Delete unused object edges, since they have been deleted in the graph
+   * @param edgesToDelete a vector of Edges to delete
+   */
+  void deletedEdgesUpdate(const std::vector< unsigned int >& edgesToDelete)
+  {
+    for (typename std::vector<EdgeGraphid>::const_iterator currEdge = edgesToDelete.begin(); currEdge != edgesToDelete.end(); currEdge++)
+    {
+      if (graphidToE_.size() > *currEdge)
+      {
+        std::shared_ptr<E>  edgeObject = graphidToE_.at(*currEdge);
+        graphidToE_.at(*currEdge) = 00;
+
+        EToGraphid_.erase(edgeObject);
+      }
+    }
+  }
+
+  /**
+   * Delete unused object nodes, since they have been deleted in the graph
+   * @param nodesToDelete a vector of N to delete
+   */
+  void deletedNodesUpdate(const std::vector< unsigned int >& nodesToDelete)
+  {
+    for (typename std::vector<EdgeGraphid>::const_iterator currNode = nodesToDelete.begin(); currNode != nodesToDelete.end(); currNode++)
+    {
+      if (graphidToN_.size() > *currNode)
+      {
+        std::shared_ptr<N>  nodeObject = graphidToN_.at(*currNode);
+        graphidToN_.at(*currNode) = 00;
+
+        NToGraphid_.erase(nodeObject);
+      }
+    }
+  }
+
+  // /@}
+
+  /** @name General Info
+   *  General information about the graph
+   */
+  // /@{
+
+  /**
+   * Return the number of defined nodes, ie nodes that have a corresponding object
+   * in this GraphObserver
+   * @return the number of nodes
+   */
+  size_t getNumberOfNodes() const
+  {
+    return NToGraphid_.size();
+  }
+
+  /**
+   * Return the number of defined edges, ie edges that have a corresponding object
+   * in this GraphObserver
+   * @return the number of edges
+   */
+  size_t getNumberOfEdges() const
+  {
+    return EToGraphid_.size();
+  }
+
+
+  /**
+   * Return the number of defined leaves, ie leaves that have a corresponding object
+   * in this GraphObserver
+   * @return the number of leaves
+   */
+  size_t getNumberOfLeaves() const
+  {
+    size_t nb = 0;
+    for (typename std::vector<std::shared_ptr<N> >::const_iterator currNodeObject = graphidToN_.begin(); currNodeObject != graphidToN_.end(); currNodeObject++)
+    {
+      if ((*currNodeObject != 00) && (isLeaf(*currNodeObject)))
+        nb++;
+    }
+
+    return nb;
+  }
+
+  /**
+   * Return the number of neighbors of a node
+   * @param node the concerned node
+   * @return the number of neighbors
+   */
+  size_t getDegree(const std::shared_ptr<N>  node) const
+  {
+    return getGraph()->getDegree(getNodeGraphid(node));
+  }
+
+  // /@}
+
+  template<typename N2, typename E2, typename G2> friend class AssociationGraphImplObserver;
+};
+
+/***************/
+
+template<class N, class E>
+using AssociationGlobalGraphObserver = AssociationGraphImplObserver<N, E, GlobalGraph>;
+}
+
+#endif
diff --git a/src/Bpp/Graph/AssociationGraphObserver.h b/src/Bpp/Graph/AssociationGraphObserver.h
new file mode 100644
index 0000000..1788f3f
--- /dev/null
+++ b/src/Bpp/Graph/AssociationGraphObserver.h
@@ -0,0 +1,483 @@
+//
+// File AssociationGraphObserver.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ASSOCIATIONGRAPHOBSERVER_HPP_
+#define _ASSOCIATIONGRAPHOBSERVER_HPP_
+
+#include "GraphObserver.h"
+
+#include "../Exceptions.h"
+#include "../Clonable.h"
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
+#include <memory>
+#include <type_traits>
+
+namespace bpp
+{
+/**
+ * @brief Defines a Graph Associator. It is a template which follows
+ * (subscribed to) a Graph.
+ *
+ * @author Thomas Bigot, Laurent Guéguen
+ */
+
+template<class N, class E>
+class AssociationGraphObserver :
+  public virtual GraphObserver
+{
+private:
+  typedef Graph::NodeId NodeGraphid;
+  typedef Graph::EdgeId EdgeGraphid;
+
+public:
+  typedef unsigned int NodeIndex;
+  typedef unsigned int EdgeIndex;
+
+  /**
+   * Specific copy of A and B objects, if clonable or not.
+   *
+   */
+
+  template<class A, class B>
+  static B* copy(const A& a, typename std::enable_if< !std::is_base_of<B, A>::value&& !std::is_abstract<B>::value>::type* = 0)
+  {
+    return new B(a);
+  }
+
+  template<class A, class B>
+  static B* copy(const A& a, typename std::enable_if< std::is_base_of<B, A>::value&& !std::is_abstract<A>::value>::type* = 0)
+  {
+    return dynamic_cast<B*>(new A(a));
+  }
+
+  template<class A, class B>
+  static B* copy(const A& a, typename std::enable_if< std::is_base_of<B, A>::value&& std::is_abstract<A>::value&& std::is_base_of<Clonable, A>::value>::type* = 0)
+  {
+    return dynamic_cast<B*>(a.clone());
+  }
+
+
+  /** @name Graph Relations Management
+   *  Modificating the structure of the graph.
+   */
+  // /@{
+
+  /**
+   * Creates an orphaned node from a NodeClass object.
+   * @param newNodeObject the N object associated to the node in the graph.
+   *
+   */
+  virtual void createNode(std::shared_ptr<N>  newNodeObject) = 0;
+
+
+  /**
+   * Creates an node linked to an existing node. Order of parameters match
+   * the link method.
+   * @param newNodeObject the N object associated to the node in the graph.
+   * @param objectOriginNode existing node. In a directed graph:
+   * origin -> newNode.
+   * @param newEdgeObject optional edge between nodes (default = 00)
+   */
+
+  virtual void createNode(std::shared_ptr<N>  objectOriginNode, std::shared_ptr<N>  newNodeObject, std::shared_ptr<E>  newEdgeObject = 00) = 0;
+
+  /**
+   * Creates a link between two existing nodes.
+   * If directed graph: nodeA -> nodeB.
+   * @param nodeObjectA source node (or first node if undirected)
+   * @param nodeObjectB target node (or second node if undirected)
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+
+  virtual void link(std::shared_ptr<N>  nodeObjectA, std::shared_ptr<N>  nodeObjectB, std::shared_ptr<E>  edgeObject = 00) = 0;
+
+  /**
+   * Detroys a link between two existing nodes in the graph.
+   * If directed graph: nodeA -> nodeB.
+   * @param nodeObjectA source node (or first node if undirected)
+   * @param nodeObjectB target node (or second node if undirected)
+   */
+
+  virtual void unlink(std::shared_ptr<N>  nodeObjectA, std::shared_ptr<N>  nodeObjectB) = 0;
+
+  /**
+   * Deletes a node
+   * @param nodeObject node to be deleted
+   */
+  virtual void deleteNode(std::shared_ptr<N>  nodeObject) = 0;
+
+  // /@}
+
+  /** @name Object Association
+   *  Associate or dissociate N and E objects to pre-existing Graph Nodes and Graph Edges
+   */
+  // /@{
+
+  /**
+   * Associate a N object to a node in the graph.
+   * @param nodeObject object to associate
+   * @param node existing node to be associated
+   */
+
+  virtual void associateNode(std::shared_ptr<N>  nodeObject, NodeGraphid node) = 0;
+
+  /**
+   * Associate a E object to an edge in the graph.
+   * @param edgeObject object to associate
+   * @param edge existing edge to be associated
+   */
+
+  virtual void associateEdge(std::shared_ptr<E>  edgeObject, EdgeGraphid edge) = 0;
+
+  /**
+   * Dissociate a N or E object to a node or an edge in the graph.
+   * Graph is not changed.
+   *
+   * @param nodeObject object to dissociate
+   */
+
+  virtual void dissociateNode(std::shared_ptr<N>  nodeObject) = 0;
+  virtual void dissociateEdge(std::shared_ptr<E>  edgeObject) = 0;
+
+
+  /**
+   * Return the associated Node ID
+   * @param nodeObject object which to return the node ID
+   * @return a node ID
+   */
+  virtual NodeGraphid getNodeGraphid(const std::shared_ptr<N>  nodeObject) const = 0;
+
+  /**
+   * Return the associated Node ID
+   * @param edgeObject object which to return the node ID
+   * @return a node ID
+   */
+  virtual EdgeGraphid getEdgeGraphid(const std::shared_ptr<E>  edgeObject) const = 0;
+
+  /**
+   * Transforms an (a list of) id(s) into an (a list of) object(s)
+   */
+  virtual const std::shared_ptr<N>  getNodeFromGraphid(NodeGraphid) const = 0;
+  virtual std::shared_ptr<N>  getNodeFromGraphid(NodeGraphid) = 0;
+
+  virtual std::vector<std::shared_ptr<N> > getNodesFromGraphid(std::vector<NodeGraphid> ) const = 0;
+  virtual std::shared_ptr<E>  getEdgeFromGraphid(EdgeGraphid) = 0;
+  virtual const std::shared_ptr<E>  getEdgeFromGraphid(EdgeGraphid) const = 0;
+  virtual std::vector<std::shared_ptr<E> > getEdgesFromGraphid(std::vector<EdgeGraphid> ) const = 0;
+
+
+  /**
+   * @return the root
+   */
+
+  virtual std::shared_ptr<N> getRoot() const = 0;
+
+  virtual NodeIndex getRootIndex() const = 0;
+
+  // /@}
+
+
+  /** @name Object Indexation
+   *  Get or set indexes to nodes and edges
+   */
+  // /@{
+
+  /**
+   * @brief return if the object has an index.
+   */
+
+  virtual bool hasIndex(const std::shared_ptr<N> nodeObject) const = 0;
+  virtual bool hasIndex(const std::shared_ptr<E> edgeObject) const = 0;
+
+  /**
+   * Return the associated Node index
+   * @param nodeObject object which to return the node index
+   * @return a node index
+   */
+
+  virtual NodeIndex getNodeIndex(const std::shared_ptr<N>  nodeObject) const = 0;
+  virtual std::vector<NodeIndex> getNodeIndexes(std::vector<std::shared_ptr<N> > nodeObjects) const = 0;
+
+
+  /**
+   * Return the associated Node index
+   * @param edgeObject object which to return the node index
+   * @return a node index
+   */
+  virtual EdgeIndex getEdgeIndex(const std::shared_ptr<E>  edgeObject) const = 0;
+  virtual std::vector<EdgeIndex> getEdgeIndexes(std::vector<std::shared_ptr<E> > edgeObjects) const = 0;
+
+  /**
+   * Set an index associated to a node
+   * @param nodeObject object to which one want to set the index
+   * @param index intex to be given, 0 to get the first free index
+   * @return the given index
+   */
+  virtual NodeIndex setNodeIndex(const std::shared_ptr<N>  nodeObject, NodeIndex index) = 0;
+
+  /**
+   * Set an index associated to an edge
+   * @param edgeObject object to which one want to set the index
+   * @param index intex to be given, 0 to get the first free index
+   * @return the given index
+   */
+  virtual EdgeIndex setEdgeIndex(const std::shared_ptr<E>  edgeObject, EdgeIndex index) = 0;
+
+  /**
+   * Return the associated Node, querying with an index
+   * @param nodeIndex the index of the wanted node
+   * @return N, a node object
+   */
+
+  virtual std::shared_ptr<N>  getNode(NodeIndex nodeIndex) const = 0;
+
+  /**
+   * Return the associated Node index
+   * @param edgeIndex the index of the wanted edge
+   * @return E, an edge object
+   */
+  virtual std::shared_ptr<E>  getEdge(EdgeIndex edgeIndex) const = 0;
+
+  // /@}
+
+  /** @name Topology exploration
+   *  These methodes of the graph concern the topology exploration.
+   */
+  // /@{
+
+  /**
+   * @name Iterator interface on Nodes
+   *
+   */
+
+  class NodeIterator
+  {
+public:
+    virtual ~NodeIterator() {}
+
+    virtual void next() = 0;
+    virtual bool end() const = 0;
+    virtual void start() = 0;
+
+    virtual std::shared_ptr<N> operator*() = 0;
+  };
+
+
+  /*
+   * @brief builds iterator on all Nodes of the graph
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> allNodesIterator() = 0;
+
+  virtual std::unique_ptr<NodeIterator> allNodesIterator() const = 0;
+
+  /*
+   * @brief builds iterator on the outgoing neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> outgoingNeighborNodesIterator(std::shared_ptr<N> node) = 0;
+
+  virtual std::unique_ptr<NodeIterator> outgoingNeighborNodesIterator(std::shared_ptr<N> node) const = 0;
+
+  /*
+   * @brief builds iterator on the incoming neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> incomingNeighborNodesIterator(std::shared_ptr<N> node) = 0;
+
+  virtual std::unique_ptr<NodeIterator> incomingNeighborNodesIterator(std::shared_ptr<N> node) const = 0;
+
+  /**
+   * Get all the neighbors of a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the neighbors
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getNeighbors(const std::shared_ptr<N>  node) const = 0;
+  virtual std::vector<NodeIndex> getNeighbors(NodeIndex node) const = 0;
+
+  /**
+   * Get all the edges from/to a node in the graph.
+   * @param node the node one wants to get its neighbor edges
+   * @return a vector containing the edges
+   */
+  virtual std::vector<std::shared_ptr<E> > getEdges(const std::shared_ptr<N>  node) const = 0;
+  virtual std::vector<EdgeIndex> getEdges(NodeIndex node) const = 0;
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the outgoing neighbors
+   */
+  virtual std::vector<std::shared_ptr<N> > getOutgoingNeighbors(const std::shared_ptr<N>  node) const = 0;
+  virtual std::vector<NodeIndex> getOutgoingNeighbors(NodeIndex node) const = 0;
+
+  /**
+   * In an directed graph, get all the edges which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the outgoing edges
+   */
+  virtual std::vector<std::shared_ptr<E> > getOutgoingEdges(const std::shared_ptr<N>  node) const = 0;
+  virtual std::vector<EdgeIndex> getOutgoingEdges(NodeIndex node) const = 0;
+
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the incoming neighbors
+   */
+  virtual std::vector<std::shared_ptr<N> > getIncomingNeighbors(const std::shared_ptr<N>  node) const = 0;
+  virtual std::vector<NodeIndex> getIncomingNeighbors(NodeIndex node) const = 0;
+
+  /**
+   * In an directed graph, get all the edges which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the incoming edges
+   */
+  virtual std::vector<std::shared_ptr<E> > getIncomingEdges(const std::shared_ptr<N>  node) const = 0;
+  virtual std::vector<EdgeIndex> getIncomingEdges(NodeIndex node) const = 0;
+
+
+  /**
+   * Get the leaves of a graph, ie, nodes with only one neighbor,
+   * starting from a peculiar node, up to a specific depth.
+   * @param node the starting node
+   * @param maxDepth the max recursion depth
+   * @return a vector containing the leaves
+   */
+  virtual std::vector<std::shared_ptr<N> > getLeavesFromNode(std::shared_ptr<N>  node, unsigned int maxDepth) const = 0;
+
+  /**
+   * Get all the leaves objects of a graph, ie, nodes with only one neighbor,
+   * @return a vector containing the leaves
+   */
+  virtual std::vector<std::shared_ptr<N> > getAllLeaves() const = 0;
+
+  /**
+   * Get all the inner nodes of a graph, ie, nodes with degree >= 2.
+   * @return a vector containing the inner nodes.
+   */
+  virtual std::vector<std::shared_ptr<N> > getAllInnerNodes() const = 0;
+
+  /**
+   * Get all the defined nodes of a graphO,
+   * @return a vector containing the nodesObjects
+   */
+  virtual std::vector<std::shared_ptr<N> > getAllNodes() const = 0;
+  virtual std::vector<NodeIndex> getAllNodesIndexes() const = 0;
+
+  /**
+   * @name Iterator interface on Edges
+   *
+   */
+
+  class EdgeIterator
+  {
+public:
+    virtual ~EdgeIterator() {}
+
+    virtual void next() = 0;
+    virtual bool end() const = 0;
+    virtual void start() = 0;
+
+    virtual std::shared_ptr<E> operator*() = 0;
+  };
+
+
+  /*
+   * @brief builds iterator on all Nodes of the graph
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> allEdgesIterator() = 0;
+
+  /*
+   * @brief builds iterator on the outgoing neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> outgoingEdgesIterator(std::shared_ptr<N> node) = 0;
+
+  /*
+   * @brief builds iterator on the incoming neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> incomingEdgesIterator(std::shared_ptr<N> node) = 0;
+
+  /**
+   * Get all the defined edges of a graphO,
+   * @return a vector containing the branchesObjects
+   */
+
+  virtual std::vector<std::shared_ptr<E> > getAllEdges() const = 0;
+
+  /**
+   * Returns the Edge between two nodes nodeA -> nodeB
+   * @param nodeA source node (if directed)
+   * @param nodeB destination node (if directed)
+   * @return the edge between these two nodes
+   */
+  virtual std::shared_ptr<E>  getEdgeLinking(std::shared_ptr<N>  nodeA, std::shared_ptr<N>  nodeB) const = 0;
+
+  /**
+   * Sets the Edge between two nodes nodeA -> nodeB
+   * @param nodeA source node (if directed)
+   * @param nodeB destination node (if directed)
+   * @param edge the edge between these two nodes
+   */
+  virtual void setEdgeLinking(std::shared_ptr<N>  nodeA, std::shared_ptr<N>  nodeB, std::shared_ptr<E>  edge) = 0;
+
+  // /@}
+};
+}
+
+#endif
diff --git a/src/Bpp/Graph/AssociationTreeGraphImplObserver.h b/src/Bpp/Graph/AssociationTreeGraphImplObserver.h
new file mode 100644
index 0000000..48cb98c
--- /dev/null
+++ b/src/Bpp/Graph/AssociationTreeGraphImplObserver.h
@@ -0,0 +1,397 @@
+//
+// File AssociationTreeGraphImplObserver.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ASSOCIATION_TREEGRAPH_IMPL_OBSERVER_HPP_
+#define _ASSOCIATION_TREEGRAPH_IMPL_OBSERVER_HPP_
+
+#include "TreeGraphImpl.h"
+#include "AssociationTreeGraphObserver.h"
+#include "AssociationGraphImplObserver.h"
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
+#include <memory>
+
+namespace bpp
+{
+template<class N, class E, class TreeGraphImpl>
+class AssociationTreeGraphImplObserver :
+  public AssociationTreeGraphObserver<N, E>,
+  public AssociationGraphImplObserver<N, E, TreeGraphImpl>
+{
+public:
+  typedef typename AssociationGraphObserver<N, E>::NodeIndex NodeIndex;
+  typedef typename AssociationGraphObserver<N, E>::EdgeIndex EdgeIndex;
+
+  typedef typename Graph::NodeId NodeGraphid;
+  typedef typename Graph::EdgeId EdgeGraphid;
+
+public:
+  /**
+   * Constructor
+   * @param rooted if the graph rooted
+   */
+  AssociationTreeGraphImplObserver(bool rooted = false) :
+    AssociationGraphImplObserver<N, E, TreeGraphImpl>(rooted)
+  {}
+
+  /**
+   * Constructor
+   * @param subjectTreeGraph the graph which is observed
+   */
+  AssociationTreeGraphImplObserver(std::shared_ptr<TreeGraphImpl> subjectTreeGraph = 00) :
+    AssociationGraphImplObserver<N, E, TreeGraphImpl>(subjectTreeGraph)
+  {}
+
+  /**
+   * Copy Constructor
+   * @param treeGraphObserver the treeGraphObserver to be copied
+   */
+
+  AssociationTreeGraphImplObserver(bpp::AssociationTreeGraphImplObserver<N, E, TreeGraphImpl> const& treeGraphObserver) :
+    AssociationGraphImplObserver<N, E, TreeGraphImpl>(treeGraphObserver)
+  {}
+
+  /**
+   * Copy Constructor
+   * @param treeGraphObserver the treeGraphObserver to be copied
+   */
+
+  template<class N2, class E2>
+  AssociationTreeGraphImplObserver(bpp::AssociationTreeGraphImplObserver<N2, E2, TreeGraphImpl> const& treeGraphObserver) :
+    AssociationGraphImplObserver<N, E, TreeGraphImpl>::AssociationGraphImplObserver(treeGraphObserver)
+  {}
+
+
+  /**
+   * = Operator
+   * @param treeGraphObserver the treeGraphObserver we want to copy the values
+   */
+
+  AssociationTreeGraphImplObserver<N, E, TreeGraphImpl>& operator=(bpp::AssociationTreeGraphImplObserver<N, E, TreeGraphImpl> const& treeGraphObserver)
+  {
+    AssociationGraphImplObserver<N, E, TreeGraphImpl>::operator=(treeGraphObserver);
+    return *this;
+  }
+
+
+  /**
+   * Destructor
+   */
+
+  ~AssociationTreeGraphImplObserver()
+  {}
+
+
+  /**
+   * clone function
+   */
+  AssociationTreeGraphImplObserver<N, E, TreeGraphImpl>* clone() const { return new AssociationTreeGraphImplObserver<N, E, TreeGraphImpl>(*this); }
+
+
+  /**
+   * Is the graph a tree? A tree must be acyclic and with no isolated node.
+   * @return true if valid tree
+   */
+  bool isValid() const
+  {
+    return this->getGraph()->isValid();
+  }
+
+  /**
+   * Return, in a rooted tree, the branch leading to the father
+   * @param nodeObject the concerned node
+   * @return an Edge which is the branch to the father
+   */
+  std::shared_ptr<E>  getEdgeToFather(const std::shared_ptr<N>  nodeObject) const
+  {
+    return this->getEdgeFromGraphid(this->getGraph()->getEdgeToFather(this->getNodeGraphid(nodeObject)));
+  }
+
+  std::shared_ptr<E>  getEdgeToFather(const NodeIndex index) const
+  {
+    return this->getEdgeFromGraphid(this->getGraph()->getEdgeToFather(this->getNodeGraphid(this->getNode(index))));
+  }
+
+
+  /**
+   * @brief Sets the root and make the tree directed from root to leaves
+   *
+   */
+  void rootAt(const std::shared_ptr<N> root)
+  {
+    this->getGraph()->rootAt(this->getNodeGraphid(root));
+  }
+
+  /*
+   * @brief check if rooted, ie directed
+   *
+   */
+  bool isRooted() const
+  {
+    return this->getGraph()->isRooted();
+  }
+
+  /**
+   * Return, in a rooted tree, the father node
+   * @param nodeObject the concerned node
+   * @return the father
+   */
+
+  std::shared_ptr<N>  getFather(const std::shared_ptr<N>  nodeObject) const
+  {
+    return this->getNodeFromGraphid(this->getGraph()->getFather(this->getNodeGraphid(nodeObject)));
+  }
+
+  /**
+   * Has the node a father?
+   */
+  bool hasFather(const std::shared_ptr<N>  nodeObject) const
+  {
+    return this->getGraph()->hasFather(this->getNodeGraphid(nodeObject));
+  }
+
+  bool hasFather(const NodeIndex index) const
+  {
+    return this->getGraph()->hasFather(this->getNodeGraphid(this->getNode(index)));
+  }
+
+  /**
+   * Return, in a rooted tree, the sons of a node
+   * @param node the concerned node
+   * @return a vector of son Nodes
+   */
+
+  std::vector<std::shared_ptr<N> > getSons(const std::shared_ptr<N>  node) const
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getSons(this->getNodeGraphid(node)));
+  }
+
+  std::vector<NodeIndex> getSons(const NodeIndex node) const
+  {
+    return this->getNodeIndexes(this->getNodesFromGraphid(this->getGraph()->getSons(this->getNodeGraphid(this->getNode(node)))));
+  }
+
+  /**
+   * Return, in a rooted tree, the branches to the sons of a node
+   * @param node the concerned node
+   * @return a vector of branch Nodes
+   */
+
+  std::vector<std::shared_ptr<E> > getBranches(const std::shared_ptr<N>  node) const
+  {
+    return this->getEdgesFromGraphid(this->getGraph()->getBranches(this->getNodeGraphid(node)));
+  }
+
+  std::vector<EdgeIndex> getBranches(const NodeIndex node) const
+  {
+    return this->getEdgeIndexes(this->getEdgesFromGraphid(this->getGraph()->getBranches(this->getNodeGraphid(this->getNode(node)))));
+  }
+
+  /**
+   * Return, in a rooted tree, the son of an edge
+   * @param edge the concerned edge
+   * @return the son Node
+   */
+
+  std::shared_ptr<N> getSon(const std::shared_ptr<E>  edge) const
+  {
+    return this->getNodeFromGraphid(this->getGraph()->getBottom(this->getEdgeGraphid(edge)));
+  }
+
+  NodeIndex getSon(const EdgeIndex edge) const
+  {
+    return this->getNodeIndex(this->getNode(this->getGraph()->getBottom(this->getEdgeGraphid(this->getEdge(edge)))));
+  }
+
+  /**
+   * Return, in a rooted tree, the father of an edge
+   * @param edge the concerned edge
+   * @return the father Node
+   */
+
+  std::shared_ptr<N> getFather(const std::shared_ptr<E>  edge) const
+  {
+    return this->getNodeFromGraphid(this->getGraph()->getTop(this->getEdgeGraphid(edge)));
+  }
+
+  NodeIndex getFather(const EdgeIndex edge) const
+  {
+    return this->getNodeIndex(this->getNode(this->getGraph()->getTop(this->getEdgeGraphid(this->getEdge(edge)))));
+  }
+
+
+  /**
+   * Return, in a rooted tree, the number of sons
+   * @param node the concerned node
+   * @return the number of sons
+   */
+  size_t getNumberOfSons(const std::shared_ptr<N>  node) const
+  {
+    return this->getGraph()->getNumberOfSons(this->getNodeGraphid(node));
+  }
+
+  /**
+   * Get the leaves of a tree under a peculiar node.
+   *
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  std::vector<std::shared_ptr<N> > getLeavesUnderNode(std::shared_ptr<N>  node) const
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getLeavesUnderNode(this->getNodeGraphid(node)));
+  }
+
+
+  /**
+   * Remove the sons of a node
+   * @return a vector containing the removed nodes
+   */
+
+  std::vector<std::shared_ptr<N> > removeSons(const std::shared_ptr<N>  node)
+  {
+    return this->getNodesFromGraphid(this->getGraph()->removeSons(this->getNodeGraphid(node)));
+  }
+
+  /**
+   * Remove a son of a node
+   */
+  void removeSon(const std::shared_ptr<N> node, const std::shared_ptr<N> son)
+  {
+    this->getGraph()->removeSon(this->getNodeGraphid(node), this->getNodeGraphid(son));
+  }
+
+  /**
+   * Change / set the father of a node
+   * @param nodeObject the concerned node
+   * @param fatherNodeObject the node to be the father
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+  void setFather(const std::shared_ptr<N>  nodeObject, const std::shared_ptr<N> fatherNodeObject, const std::shared_ptr<E> edgeObject = 0)
+  {
+    if (edgeObject)
+      this->getGraph()->setFather(this->getNodeGraphid(nodeObject), this->getNodeGraphid(fatherNodeObject), this->getEdgeGraphid(edgeObject));
+    else
+      this->getGraph()->setFather(this->getNodeGraphid(nodeObject), this->getNodeGraphid(fatherNodeObject));
+  }
+
+
+  /**
+   * Add a son to a node
+   * @param nodeObject the concerned node
+   * @param sonNodeObject the node to be added as a son to the father
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+  void addSon(const std::shared_ptr<N>  nodeObject, const std::shared_ptr<N> sonNodeObject, const std::shared_ptr<E> edgeObject = 0)
+  {
+    if (edgeObject)
+      this->getGraph()->addSon(this->getNodeGraphid(nodeObject), this->getNodeGraphid(sonNodeObject), this->getEdgeGraphid(edgeObject));
+    else
+      this->getGraph()->addSon(this->getNodeGraphid(nodeObject), this->getNodeGraphid(sonNodeObject));
+  }
+
+  /**
+   * Iterators
+   *
+   */
+
+  /*
+   * @brief builds iterator on the sons of a Node
+   *
+   */
+
+  std::unique_ptr<typename AssociationTreeGraphObserver<N, E>::NodeIterator> sonsIterator(std::shared_ptr<N> node)
+  {
+    return this->outgoingNeighborNodesIterator(node);
+  }
+
+  /*
+   * @brief builds iterator on the branches to sons of a Node
+   *
+   */
+
+  std::unique_ptr<typename AssociationTreeGraphObserver<N, E>::EdgeIterator> branchesIterator(std::shared_ptr<N> node)
+  {
+    return this->outgoingEdgesIterator(node);
+  }
+
+  /**
+   * @brief Get a vector of ancestor nodes between to nodes.
+   *
+   * @param nodeA first node.
+   * @param nodeB second node.
+   * @param includeAncestor Tell if the common ancestor must be included in the vector.
+   * @return A vector of ancestor nodes ids.
+   * @throw PhyloNodeNotFoundException If a node is not found.
+   */
+
+  std::vector<std::shared_ptr<N> > getNodePathBetweenTwoNodes(const std::shared_ptr<N>  nodeA, const std::shared_ptr<N>  nodeB, bool includeAncestor = true) const
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getNodePathBetweenTwoNodes(this->getNodeGraphid(nodeA), this->getNodeGraphid(nodeB), includeAncestor));
+  }
+
+  std::vector<std::shared_ptr<E> > getEdgePathBetweenTwoNodes(const std::shared_ptr<N>  nodeA, const std::shared_ptr<N>  nodeB) const
+  {
+    return this->getEdgesFromGraphid(this->getGraph()->getEdgePathBetweenTwoNodes(this->getNodeGraphid(nodeA), this->getNodeGraphid(nodeB)));
+  }
+
+  std::vector<std::shared_ptr<N> > getSubtreeNodes(const std::shared_ptr<N> localRoot)
+  {
+    return this->getNodesFromGraphid(this->getGraph()->getSubtreeNodes(this->getNodeGraphid(localRoot)));
+  }
+
+  std::vector<std::shared_ptr<E> > getSubtreeEdges(const std::shared_ptr<N> localRoot)
+  {
+    return AssociationGraphImplObserver<N, E, TreeGraphImpl>::getEdgesFromGraphid(this->getGraph()->getSubtreeEdges(this->getNodeGraphid(localRoot)));
+  }
+};
+
+/********************/
+
+template<class N, class E>
+using AssociationTreeGlobalGraphObserver =  AssociationTreeGraphImplObserver<N, E, TreeGlobalGraph>;
+}
+
+
+#endif
diff --git a/src/Bpp/Graph/AssociationTreeGraphObserver.h b/src/Bpp/Graph/AssociationTreeGraphObserver.h
new file mode 100644
index 0000000..e748ed0
--- /dev/null
+++ b/src/Bpp/Graph/AssociationTreeGraphObserver.h
@@ -0,0 +1,255 @@
+//
+// File AssociationTreeGraphObserver.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ASSOCIATION_TREE_GRAPHOBSERVER_HPP_
+#define _ASSOCIATION_TREE_GRAPHOBSERVER_HPP_
+
+#include "TreeGraph.h"
+#include "AssociationGraphObserver.h"
+
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
+#include <memory>
+
+namespace bpp
+{
+/**
+ * @brief Defines a Tree Graph Associator. It is a template which follows
+ * (subscribed to) a Graph.
+ *
+ * @author Thomas Bigot
+ */
+
+template<class N, class E>
+class AssociationTreeGraphObserver :
+  public virtual AssociationGraphObserver<N, E>
+{
+public:
+  typedef typename AssociationTreeGraphObserver<N, E>::NodeIndex NodeIndex;
+  typedef typename AssociationTreeGraphObserver<N, E>::EdgeIndex EdgeIndex;
+
+  typedef typename TreeGraph::NodeId NodeGraphid;
+  typedef typename TreeGraph::EdgeId EdgeGraphid;
+
+public:
+  /**
+   * Is the graph a tree? A tree must be acyclic and with no isolated node.
+   * @return true if valid tree
+   */
+
+  virtual bool isValid() const = 0;
+
+  /**
+   * Return, in a rooted tree, the branch leading to the father
+   * @param nodeObject the concerned node
+   * @return an Edge which is the branch to the father
+   */
+
+  virtual std::shared_ptr<E>  getEdgeToFather(const std::shared_ptr<N>  nodeObject) const = 0;
+
+  virtual std::shared_ptr<E>  getEdgeToFather(const NodeIndex nodeIndex) const = 0;
+
+  /**
+   * @brief Sets the root and make the tree directed from root to leaves
+   *
+   */
+
+  virtual void rootAt(const std::shared_ptr<N> root) = 0;
+
+  /*
+   * @brief check if rooted, ie directed
+   *
+   */
+
+  virtual bool isRooted() const = 0;
+
+  /**
+   * Return, in a rooted tree, the father node
+   * @param nodeObject the concerned node
+   * @return the father
+   */
+
+  virtual std::shared_ptr<N>  getFather(const std::shared_ptr<N>  nodeObject) const = 0;
+
+  /**
+   * Has the node a father?
+   */
+
+  virtual bool hasFather(const std::shared_ptr<N>  nodeObject) const = 0;
+  virtual bool hasFather(const NodeIndex node) const = 0;
+
+  /**
+   * Return, in a rooted tree, the sons of a node
+   * @param node the concerned node
+   * @return a vector of son Nodes
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getSons(const std::shared_ptr<N>  node) const = 0;
+
+  virtual std::vector<NodeIndex> getSons(const NodeIndex node) const = 0;
+
+  /**
+   * Return the branches to the sons of a node
+   * @param node the concerned node
+   * @return a vector of branch Nodes
+   */
+
+  virtual std::vector<std::shared_ptr<E> > getBranches(const std::shared_ptr<N>  node) const = 0;
+
+  virtual std::vector<EdgeIndex> getBranches(const NodeIndex node) const = 0;
+
+  /**
+   * Return, in a rooted tree, the son of an edge
+   * @param edge the concerned edge
+   * @return the son Node
+   */
+
+  virtual std::shared_ptr<N> getSon(const std::shared_ptr<E>  edge) const = 0;
+  virtual NodeIndex getSon(const EdgeIndex edge) const = 0;
+
+  /**
+   * Return, in a rooted tree, the father of an edge
+   * @param edge the concerned edge
+   * @return the father Node
+   */
+
+  virtual std::shared_ptr<N> getFather(const std::shared_ptr<E>  edge) const = 0;
+  virtual NodeIndex getFather(const EdgeIndex edge) const = 0;
+
+  /**
+   * Return, in a rooted tree, the number of sons
+   * @param node the concerned node
+   * @return the number of sons
+   */
+
+  virtual size_t getNumberOfSons(const std::shared_ptr<N>  node) const = 0;
+
+  /**
+   * Get the leaves of a tree under a peculiar node.
+   *
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getLeavesUnderNode(std::shared_ptr<N>  node) const = 0;
+
+  /**
+   * Remove the sons of a node
+   * @return a vector containing the removed nodes
+   */
+
+  virtual std::vector<std::shared_ptr<N> > removeSons(const std::shared_ptr<N>  node) = 0;
+
+  /**
+   * Remove a son of a node
+   */
+
+  virtual void removeSon(const std::shared_ptr<N> node, const std::shared_ptr<N> son) = 0;
+
+  /**
+   * Change / set the father of a node
+   * @param nodeObject the concerned node
+   * @param fatherNodeObject the node to be the father
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+
+  virtual void setFather(const std::shared_ptr<N>  nodeObject, const std::shared_ptr<N>  fatherNodeObject, const std::shared_ptr<E> edgeObject = 0) = 0;
+
+  /**
+   * Add a son to a node
+   * @param nodeObject the concerned node
+   * @param sonNodeObject the node to be added as a son to the father
+   * @param edgeObject the optional edge  between the nodes (default
+   * = 00)
+   */
+
+  virtual void addSon(const std::shared_ptr<N>  nodeObject, const std::shared_ptr<N>  sonNodeObject, const std::shared_ptr<E> edgeObject = 0) = 0;
+
+  /**
+   * Iterators
+   *
+   */
+
+  /*
+   * @brief builds iterator on the neighbor nodes of a Node
+   *
+   */
+
+  typedef typename AssociationGraphObserver<N, E>::NodeIterator NodeIterator;
+  typedef typename AssociationGraphObserver<N, E>::EdgeIterator EdgeIterator;
+
+
+  /*
+   * @brief builds iterator on the sons of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> sonsIterator(std::shared_ptr<N> node) = 0;
+
+  /*
+   * @brief builds iterator on the branches to sons of a Node
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> branchesIterator(std::shared_ptr<N> node) = 0;
+
+  /**
+   * @brief Get a vector of ancestor nodes between to nodes.
+   *
+   * @param nodeA first node.
+   * @param nodeB second node.
+   * @param includeAncestor Tell if the common ancestor must be included in the vector.
+   * @return A vector of ancestor nodes ids.
+   * @throw PhyloNodeNotFoundException If a node is not found.
+   */
+
+  virtual std::vector<std::shared_ptr<N> > getNodePathBetweenTwoNodes(const std::shared_ptr<N>  nodeA, const std::shared_ptr<N>  nodeB, bool includeAncestor = true) const = 0;
+
+  virtual std::vector<std::shared_ptr<E> > getEdgePathBetweenTwoNodes(const std::shared_ptr<N>  nodeA, const std::shared_ptr<N>  nodeB) const = 0;
+
+  virtual std::vector<std::shared_ptr<N> > getSubtreeNodes(const std::shared_ptr<N> localRoot) = 0;
+
+  virtual std::vector<std::shared_ptr<E> > getSubtreeEdges(const std::shared_ptr<N> localRoot) = 0;
+};
+}
+
+#endif
diff --git a/src/Bpp/Graph/DAGraph.h b/src/Bpp/Graph/DAGraph.h
new file mode 100644
index 0000000..fe5ae8f
--- /dev/null
+++ b/src/Bpp/Graph/DAGraph.h
@@ -0,0 +1,174 @@
+//
+// File DAGraph.h
+// Created by: Laurent  Guéguen
+// Last modification : lundi 19 décembre 2016, à 22h 46
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _DA_GRAPH_H_
+#define _DA_GRAPH_H_
+
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <ostream>
+
+
+#include "Graph.h"
+
+#include "../Exceptions.h"
+#include "../Numeric/VectorTools.h"
+
+namespace bpp
+{
+class DAGraph :
+  public virtual Graph
+{
+public:
+  /**
+   * Is the graph a directed acyclic?
+   * @return true if valid DAG
+   */
+  virtual bool isValid() const = 0;
+
+  /**
+   * Is the DAG rooted?
+   *
+   * @return true if rooted, ie has only one node with no father.
+   */
+
+  virtual bool isRooted() const = 0;
+
+  /**
+   * Check if node has a father
+   */
+
+  virtual bool hasFather(Graph::NodeId node) const = 0;
+
+  /**
+   * Get the fathers node of a node
+   */
+
+  virtual std::vector<Graph::NodeId> getFathers(Graph::NodeId node) const = 0;
+
+  /**
+   * @brief Get the number of fathers nodes
+   */
+
+  virtual size_t getNumberOfFathers(Graph::NodeId node) const = 0;
+
+  /**
+   * Add a father to a node
+   */
+
+  virtual void addFather(Graph::NodeId node, Graph::NodeId father) = 0;
+
+  virtual void addFather(Graph::NodeId node, Graph::NodeId father, Graph::EdgeId edgeId) = 0;
+
+  /**
+   * Remove one father
+   */
+
+  virtual void removeFather(Graph::NodeId node, Graph::NodeId father) = 0;
+
+  /**
+   * Remove all the fathers
+   */
+
+  virtual std::vector<Graph::NodeId> removeFathers(Graph::NodeId node) = 0;
+
+  /**
+   * Get the leaves under a node
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  virtual std::vector<Graph::NodeId> getLeavesUnderNode(Graph::NodeId node) const = 0;
+
+  /**
+   * Get the sons node of a node
+   */
+
+  virtual std::vector<Graph::NodeId> getSons(Graph::NodeId node) const = 0;
+
+  /**
+   * @brief Get the number of sons node
+   */
+
+  virtual size_t getNumberOfSons(Graph::NodeId node) const = 0;
+
+  /**
+   * Add a son to a node
+   */
+
+  void addSon(Graph::NodeId node, Graph::NodeId sonNode);
+
+  void addSon(Graph::NodeId node, Graph::NodeId sonNode, Graph::EdgeId edge);
+
+  /**
+   * Remove all the sons
+   */
+
+  virtual std::vector<Graph::NodeId> removeSons(Graph::NodeId node) = 0;
+
+  /**
+   * Remove one son
+   */
+
+  virtual void removeSon(Graph::NodeId node, Graph::NodeId son) = 0;
+
+  /**
+   * Re-root the DA with the new root
+   */
+
+  virtual void rootAt(Graph::NodeId newRoot) = 0;
+
+  /**
+   * Get all the nodes below a node
+   */
+
+  virtual std::vector<Graph::NodeId> getBelowNodes(Graph::NodeId localRoot) const = 0;
+
+  /**
+   * Get all the branches below a node
+   */
+
+  virtual std::vector<Graph::EdgeId> getBelowEdges(Graph::NodeId localRoot) const = 0;
+};
+}
+
+
+#endif
diff --git a/src/Bpp/Graph/DAGraphImpl.h b/src/Bpp/Graph/DAGraphImpl.h
new file mode 100644
index 0000000..7f5bc2d
--- /dev/null
+++ b/src/Bpp/Graph/DAGraphImpl.h
@@ -0,0 +1,525 @@
+//
+// File DAGraphImpl.h
+// Created by: Laurent Guéguen
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _DA_GRAPH_IMPL_H_
+#define _DA_GRAPH_IMPL_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <ostream>
+
+
+#include "DAGraph.h"
+#include "GlobalGraph.h"
+
+#include "../Exceptions.h"
+#include "../Numeric/VectorTools.h"
+
+namespace bpp
+{
+template<class GraphImpl>
+class DAGraphImpl :
+  public virtual DAGraph,
+  public GraphImpl
+{
+protected:
+  /**
+   * Is the graph a DAG? Set to false when structure is modified, true after validation.
+   */
+
+  mutable bool isValid_;
+
+  /**
+   * Is the graph rooted? Set to false when structure is modified,
+   * true after validation.
+   */
+
+  mutable bool isRooted_;
+
+  // unvalidate the DAG
+  virtual void topologyHasChanged_() const;
+
+  // will throw an exception if the DA is not valid
+  void mustBeValid_() const;
+
+  // will throw an exception if the DA is not rooted, ie as more
+  // than one node with no father.
+
+  void mustBeRooted_() const;
+
+  // test the validity of the DAG
+  bool validate_() const;
+
+  /**
+   * Reorient at mimina all the edges starting from a node: the
+   * father nodes become sons, and so on.
+   *
+   * The Graph must already be rooted
+   */
+
+  void propagateDirection_(Graph::NodeId node);
+
+  /**
+   * Reorient all the graph so that localRoot is ahead the other
+   * sons, with the exception of the nodes already met
+   *
+   */
+
+  void orientGraphFrom_(std::set<Graph::NodeId>& metNodes, Graph::NodeId localRoot);
+
+public:
+  /**
+   * bool is only for inheritance from observers, useless.
+   *
+   */
+
+  DAGraphImpl(bool b = true);
+
+  /**
+   * Is the graph a DAG?
+   * @return true if valid DAG
+   */
+  bool isValid() const;
+
+  /**
+   * Is the DAG rooted?
+   *
+   * @return true if rooted, ie has only one node with no father.
+   */
+
+  bool isRooted() const;
+
+  /**
+   * Says if  a node is a leaf (ie has at most one neighbor).
+   */
+
+  bool isLeaf(Graph::NodeId node) const;
+
+  /**
+   * Check if node has a father
+   */
+
+  bool hasFather(Graph::NodeId node) const;
+
+  /**
+   * Get the father nodes of a node
+   * @return the father node
+   */
+
+  std::vector<Graph::NodeId> getFathers(Graph::NodeId nodeid) const;
+
+  /**
+   * @brief Get the number of fathers nodes
+   */
+
+  size_t getNumberOfFathers(Graph::NodeId node) const;
+
+  /**
+   * Add a father to a node
+   */
+
+  void addFather(Graph::NodeId node, Graph::NodeId father);
+
+  void addFather(Graph::NodeId node, Graph::NodeId father, Graph::EdgeId edgeId);
+
+  /**
+   * Remove one father
+   */
+
+  void removeFather(Graph::NodeId node, Graph::NodeId father);
+
+  /**
+   * Remove all the fathers
+   */
+
+  std::vector<Graph::NodeId> removeFathers(Graph::NodeId node);
+
+  /**
+   * Get the leaves under a node
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  std::vector<Graph::NodeId> getLeavesUnderNode(Graph::NodeId node) const;
+
+  /**
+   * Get the sons node of a node
+   */
+
+  std::vector<Graph::NodeId> getSons(Graph::NodeId node) const;
+
+  /**
+   * @brief Get the number of sons node
+   */
+
+  size_t getNumberOfSons(Graph::NodeId node) const;
+
+  /**
+   * Add a son to a node
+   */
+
+  void addSon(Graph::NodeId node, Graph::NodeId sonNode);
+
+  void addSon(Graph::NodeId node, Graph::NodeId sonNode, Graph::EdgeId edge);
+
+  /**
+   * Remove all the sons
+   */
+
+  std::vector<Graph::NodeId> removeSons(Graph::NodeId node);
+
+  /**
+   * Remove one son
+   */
+
+  void removeSon(Graph::NodeId node, Graph::NodeId son);
+
+  /**
+   * Re-root the DA with the new root (and make the graph a DA if it is not)
+   */
+
+  void rootAt(Graph::NodeId newRoot);
+
+  /**
+   * Get all the nodes below a node
+   */
+
+  std::vector<Graph::NodeId> getBelowNodes(Graph::NodeId localRoot) const;
+
+  /**
+   * Get all the branches below a node
+   */
+
+  std::vector<Graph::EdgeId> getBelowEdges(Graph::NodeId localRoot) const;
+
+  // recursive function for getSubtreeNodes
+  void fillSubtreeMetNodes_(std::vector<Graph::NodeId>& metNodes, Graph::NodeId localRoot) const;
+
+  // recursive function for getSubtreeEdges
+  void fillSubtreeMetEdges_(std::vector<Graph::EdgeId>& metEdges, Graph::NodeId localRoot) const;
+
+  // recursive function for getLeavesUnderNode
+  void fillListOfLeaves_(Graph::NodeId startingNode, std::vector<Graph::NodeId>& foundLeaves) const;
+};
+
+
+/******************/
+
+typedef DAGraphImpl<GlobalGraph> DAGlobalGraph;
+
+/*****************/
+
+
+template<class GraphImpl>
+DAGraphImpl<GraphImpl>::DAGraphImpl(bool b) :
+  GraphImpl(true),
+  isValid_(false),
+  isRooted_(false)
+{}
+
+
+template<class GraphImpl>
+bool DAGraphImpl<GraphImpl>::isValid() const
+{
+  return isValid_ || validate_();
+}
+
+
+template<class GraphImpl>
+bool DAGraphImpl<GraphImpl>::isRooted() const
+{
+  if (isRooted_)
+    return true;
+
+  std::unique_ptr<Graph::NodeIterator> allIt = allNodesIterator();
+  bool seen = false;
+
+  for ( ; !allIt->end(); allIt->next())
+  {
+    if (getNumberOfFathers(**allIt) == 0)
+    {
+      if (seen)
+        return false;
+      seen = true;
+    }
+  }
+
+  isRooted_ = seen;
+  return true;
+}
+
+template<class GraphImpl>
+bool DAGraphImpl<GraphImpl>::isLeaf(Graph::NodeId node) const
+{
+  return GraphImpl::isLeaf(node) == 0;
+}
+
+template<class GraphImpl>
+bool DAGraphImpl<GraphImpl>::hasFather(Graph::NodeId node) const
+{
+  return GraphImpl::getNumberOfIncomingNeighbors(node) >= 1;
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> DAGraphImpl<GraphImpl>::getFathers(Graph::NodeId node) const
+{
+  return getIncomingNeighbors(node);
+}
+
+template<class GraphImpl>
+size_t DAGraphImpl<GraphImpl>::getNumberOfFathers(Graph::NodeId node) const
+{
+  return GraphImpl::getNumberOfIncomingNeighbors(node);
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::addFather(Graph::NodeId node, Graph::NodeId fatherNode)
+{
+  GraphImpl::link(fatherNode, node);
+  topologyHasChanged_();
+  isRooted_ = false;
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::addFather(Graph::NodeId node, Graph::NodeId fatherNode, Graph::EdgeId edge)
+{
+  GraphImpl::link(fatherNode, node, edge);
+  topologyHasChanged_();
+  isRooted_ = false;
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> DAGraphImpl<GraphImpl>::removeFathers(Graph::NodeId node)
+{
+  std::vector<Graph::NodeId> fathers = getFathers(node);
+  for (std::vector<Graph::NodeId>::iterator currFather = fathers.begin(); currFather != fathers.end(); currFather++)
+  {
+    removeFather(node, *currFather);
+  }
+  return fathers;
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::removeFather(Graph::NodeId node, Graph::NodeId father)
+{
+  if (getNumberOfIncomingNeighbors(node) == 1)
+    isRooted_ = false;
+
+  GraphImpl::unlink(father, node);
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> DAGraphImpl<GraphImpl>::getLeavesUnderNode(Graph::NodeId node) const
+{
+  std::vector<Graph::NodeId> foundLeaves;
+  fillListOfLeaves_(node, foundLeaves);
+
+  return foundLeaves;
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::fillListOfLeaves_(Graph::NodeId startingNode, std::vector<Graph::NodeId>& foundLeaves) const
+{
+  const std::vector<Graph::NodeId> sons = getSons(startingNode);
+  if (sons.size() > 1)
+  {
+    for (std::vector<Graph::NodeId>::const_iterator currNeighbor = sons.begin(); currNeighbor != sons.end(); currNeighbor++)
+    {
+      fillListOfLeaves_(*currNeighbor, foundLeaves);
+    }
+  }
+  else
+  {
+    foundLeaves.push_back(startingNode);
+  }
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::mustBeRooted_() const
+{
+  if (!isRooted())
+    throw Exception("DAGraphImpl<GraphImpl>: The DAG must be rooted.");
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::mustBeValid_() const
+{
+  if (!isValid())
+    throw Exception("DAGraphImpl<GraphImpl>: The DAG is not valid.");
+}
+
+
+template<class GraphImpl>
+bool DAGraphImpl<GraphImpl>::validate_() const
+{
+  isValid_ = GraphImpl::isDA();
+  return isValid_;
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::topologyHasChanged_() const
+{
+  isValid_ = false;
+}
+
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> DAGraphImpl<GraphImpl>::getSons(Graph::NodeId node) const
+{
+  return GraphImpl::getOutgoingNeighbors(node);
+}
+
+template<class GraphImpl>
+size_t DAGraphImpl<GraphImpl>::getNumberOfSons(Graph::NodeId node) const
+{
+  return GraphImpl::getNumberOfOutgoingNeighbors(node);
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::addSon(Graph::NodeId node, Graph::NodeId sonNode)
+{
+  GraphImpl::link(node, sonNode);
+  topologyHasChanged_();
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::addSon(Graph::NodeId node, Graph::NodeId sonNode, Graph::EdgeId edge)
+{
+  GraphImpl::link(node, sonNode, edge);
+  topologyHasChanged_();
+}
+
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> DAGraphImpl<GraphImpl>::removeSons(Graph::NodeId node)
+{
+  std::vector<Graph::NodeId> sons = getSons(node);
+  for (std::vector<Graph::NodeId>::iterator currSon = sons.begin(); currSon != sons.end(); currSon++)
+  {
+    removeSon(node, *currSon);
+  }
+  return sons;
+}
+
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::removeSon(Graph::NodeId node, Graph::NodeId son)
+{
+  GraphImpl::unlink(node, son);
+}
+
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::rootAt(Graph::NodeId newRoot)
+{
+  GraphImpl::setRoot(newRoot);
+
+  // change edge direction between the new node and the former fathers
+  if (isRooted() && isValid())
+    propagateDirection_(newRoot);
+  else
+  {
+    GraphImpl::orientate();
+    isRooted_ = true;
+  }
+}
+
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::propagateDirection_(Graph::NodeId node)
+{
+  std::vector<Graph::NodeId> vFat = getFathers(node);
+
+  for (size_t i = 0; i < vFat.size(); i++)
+  {
+    propagateDirection_(vFat[i]);
+  }
+
+  for (size_t i = 0; i < vFat.size(); i++)
+  {
+    GraphImpl::switchNodes(vFat[i], node);
+  }
+}
+
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> DAGraphImpl<GraphImpl>::getBelowNodes(Graph::NodeId localRoot) const
+{
+  mustBeValid_();
+  std::vector<Graph::EdgeId> metNodes;
+  fillSubtreeMetNodes_(metNodes, localRoot);
+  return metNodes;
+}
+
+template<class GraphImpl>
+std::vector<Graph::EdgeId> DAGraphImpl<GraphImpl>::getBelowEdges(Graph::NodeId localRoot) const
+{
+  mustBeValid_();
+  std::vector<Graph::EdgeId> metEdges;
+  fillSubtreeMetEdges_(metEdges, localRoot);
+  return metEdges;
+}
+
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::fillSubtreeMetNodes_(std::vector<Graph::NodeId>& metNodes, Graph::NodeId localRoot) const
+{
+  metNodes.push_back(localRoot);
+  std::vector<Graph::NodeId> sons = GraphImpl::getOutgoingNeighbors(localRoot);
+  for (std::vector<Graph::NodeId>::iterator currSon = sons.begin(); currSon != sons.end(); currSon++)
+  {
+    fillSubtreeMetNodes_(metNodes, *currSon);
+  }
+}
+
+template<class GraphImpl>
+void DAGraphImpl<GraphImpl>::fillSubtreeMetEdges_(std::vector<Graph::EdgeId>& metEdges, Graph::NodeId localRoot) const
+{
+  std::vector<Graph::EdgeId> edgesToSons = GraphImpl::getOutgoingEdges(localRoot);
+  for (std::vector<Graph::EdgeId>::iterator currEdgeToSon = edgesToSons.begin(); currEdgeToSon != edgesToSons.end(); currEdgeToSon++)
+  {
+    metEdges.push_back(*currEdgeToSon);
+    fillSubtreeMetEdges_(metEdges, GraphImpl::getBottom(*currEdgeToSon));
+  }
+}
+}
+
+
+#endif
diff --git a/src/Bpp/Graph/GlobalGraph.cpp b/src/Bpp/Graph/GlobalGraph.cpp
new file mode 100644
index 0000000..ab8f2df
--- /dev/null
+++ b/src/Bpp/Graph/GlobalGraph.cpp
@@ -0,0 +1,990 @@
+//
+// File GlobalGraph.cpp
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 22
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+#include <string>
+#include <vector>
+#include <sstream>
+#include <algorithm>
+
+#include "GraphObserver.h"
+#include "GlobalGraph.h"
+#include "../Exceptions.h"
+
+using namespace bpp;
+using namespace std;
+
+GlobalGraph::GlobalGraph(bool directed_p) :
+  directed_(directed_p),
+  observers_(set<GraphObserver*>()),
+  highestNodeID_(0),
+  highestEdgeID_(0),
+  nodeStructure_(nodeStructureType()),
+  edgeStructure_(edgeStructureType()),
+  root_(0)
+{}
+
+
+GlobalGraph::GlobalGraph(const GlobalGraph& gg) :
+  directed_(gg.directed_),
+  observers_(gg.observers_),
+  highestNodeID_(gg.highestNodeID_),
+  highestEdgeID_(gg.highestEdgeID_),
+  nodeStructure_(gg.nodeStructure_),
+  edgeStructure_(gg.edgeStructure_),
+  root_(gg.root_)
+{}
+
+GlobalGraph& GlobalGraph::operator=(const GlobalGraph& gg)
+{
+  directed_ = gg.directed_;
+  observers_ = gg.observers_;
+  highestNodeID_ = gg.highestNodeID_;
+  highestEdgeID_ = gg.highestEdgeID_;
+  nodeStructure_ = gg.nodeStructure_;
+  edgeStructure_ = gg.edgeStructure_;
+  root_ = gg.root_;
+
+  return *this;
+}
+
+
+void GlobalGraph::nodeMustExist_(const GlobalGraph::Node& node, string name) const
+{
+  if (nodeStructure_.find(node) == nodeStructure_.end())
+  {
+    ostringstream errMessage;
+    errMessage << "This node must exist: " << node << " as " << name << ".";
+    throw (Exception(errMessage.str()));
+  }
+}
+
+void GlobalGraph::edgeMustExist_(const GlobalGraph::Edge& edge, string name) const
+{
+  if (edgeStructure_.find(edge) == edgeStructure_.end())
+  {
+    ostringstream errMessage;
+    errMessage << "This edge must exist: " << edge << " as " << name << ".";
+    throw (Exception(errMessage.str()));
+  }
+}
+
+
+GlobalGraph::Edge GlobalGraph::link(Graph::NodeId nodeA, Graph::NodeId nodeB)
+{
+  // which ID is available?
+  GlobalGraph::Edge edgeID = ++highestEdgeID_;
+
+  // writing the new relation to the structure
+  linkInNodeStructure_(nodeA, nodeB, edgeID);
+  if (!directed_)
+  {
+    linkInNodeStructure_(nodeB, nodeA, edgeID);
+  }
+  linkInEdgeStructure_(nodeA, nodeB, edgeID);
+  return edgeID;
+}
+
+void GlobalGraph::link(Graph::NodeId nodeA, Graph::NodeId nodeB, GlobalGraph::Edge edgeID)
+{
+  if (edgeStructure_.find(edgeID) != edgeStructure_.end())
+    throw Exception("GlobalGraph::link : already existing edgeId " + TextTools::toString(edgeID));
+
+  // writing the new relation to the structure
+  linkInNodeStructure_(nodeA, nodeB, edgeID);
+  if (!directed_)
+  {
+    linkInNodeStructure_(nodeB, nodeA, edgeID);
+  }
+  linkInEdgeStructure_(nodeA, nodeB, edgeID);
+}
+
+vector<GlobalGraph::Edge> GlobalGraph::unlink(Graph::NodeId nodeA, Graph::NodeId nodeB)
+{
+  // unlinking in the structure
+  vector<GlobalGraph::Edge> deletedEdges; // what edges ID are affected by this unlinking
+  deletedEdges.push_back(unlinkInNodeStructure_(nodeA, nodeB));
+
+  for (vector<GlobalGraph::Edge>::iterator currEdgeToDelete = deletedEdges.begin(); currEdgeToDelete != deletedEdges.end(); currEdgeToDelete++)
+  {
+    unlinkInEdgeStructure_(*currEdgeToDelete);
+  }
+
+  // telling the observers
+  notifyDeletedEdges(deletedEdges);
+
+  return deletedEdges;
+}
+
+void GlobalGraph::switchNodes(Graph::NodeId nodeA, Graph::NodeId nodeB)
+{
+  Graph::NodeId father, son;
+
+  nodeStructureType::iterator nodeARow = nodeStructure_.find(nodeA);
+  nodeStructureType::iterator nodeBRow = nodeStructure_.find(nodeB);
+  nodeStructureType::iterator nodeSonRow, nodeFatherRow;
+
+  // Forwards
+  map<GlobalGraph::Node, GlobalGraph::Edge>::iterator foundForwardRelation = nodeARow->second.first.find(nodeB);
+  if (foundForwardRelation == nodeARow->second.first.end())
+  {
+    foundForwardRelation = nodeBRow->second.first.find(nodeA);
+    if (foundForwardRelation == nodeBRow->second.first.end())
+      throw Exception("GlobalGraph::exchangeNodes : no edge between nodes " + TextTools::toString(nodeA) + " and " + TextTools::toString(nodeB));
+    father = nodeB;
+    son = nodeA;
+    nodeFatherRow = nodeBRow;
+    nodeSonRow = nodeARow;
+  }
+  else
+  {
+    father = nodeA;
+    son = nodeB;
+    nodeFatherRow = nodeARow;
+    nodeSonRow = nodeBRow;
+  }
+
+  // Edge
+  GlobalGraph::Edge& foundEdge = foundForwardRelation->second;
+
+  // Backwards
+  map<GlobalGraph::Node, GlobalGraph::Edge>::iterator foundBackwardsRelation = nodeSonRow->second.second.find(father);
+
+
+  // Exchange
+  nodeFatherRow->second.first.erase(foundForwardRelation);
+  nodeSonRow->second.second.erase(foundBackwardsRelation);
+
+
+  nodeSonRow->second.first[father] = foundEdge;
+
+  nodeFatherRow->second.second[son] = foundEdge;
+
+
+//    std::map<GlobalGraph::Node, std::pair<std::map<GlobalGraph::Node, GlobalGraph::Edge>, std::map<GlobalGraph::Node, GlobalGraph::Edge> > >::iterator ita = nodeStructure_.find(nodeA);
+
+  edgeStructure_[foundEdge] = pair<Node, Node>(son, father);
+
+  this->topologyHasChanged_();
+}
+
+
+GlobalGraph::Node GlobalGraph::getHighestNodeID() const
+{
+  return highestNodeID_;
+}
+
+
+GlobalGraph::Edge GlobalGraph::getHighestEdgeID() const
+{
+  return highestEdgeID_;
+}
+
+void GlobalGraph::unlinkInEdgeStructure_(const GlobalGraph::Edge& edge)
+{
+  edgeStructureType::iterator foundEdge = edgeStructure_.find(edge);
+  if (foundEdge == edgeStructure_.end())
+    throw Exception("GlobalGraph::unlinkInEdgeStructure_ : no edge to erase " + TextTools::toString(edge));
+
+  edgeStructure_.erase(foundEdge);
+  this->topologyHasChanged_();
+}
+
+void GlobalGraph::linkInEdgeStructure_(const GlobalGraph::Node& nodeA, const GlobalGraph::Node& nodeB, const GlobalGraph::Edge& edge)
+{
+  edgeStructure_[edge] = pair<Node, Node>(nodeA, nodeB);
+  this->topologyHasChanged_();
+}
+
+
+unsigned int GlobalGraph::unlinkInNodeStructure_(const GlobalGraph::Node& nodeA, const GlobalGraph::Node& nodeB)
+{
+  // Forward
+  nodeStructureType::iterator nodeARow = nodeStructure_.find(nodeA);
+  map<GlobalGraph::Node, GlobalGraph::Edge>::iterator foundForwardRelation = nodeARow->second.first.find(nodeB);
+  if (foundForwardRelation == nodeARow->second.first.end())
+    throw Exception("GlobalGraph::unlinkInNodeStructure_ : no edge to erase " + TextTools::toString(nodeA) + "->" + TextTools::toString(nodeB));
+
+  GlobalGraph::Edge& foundEdge = foundForwardRelation->second;
+  nodeARow->second.first.erase(foundForwardRelation);
+
+  // Backwards
+  nodeStructureType::iterator nodeBRow = nodeStructure_.find(nodeB);
+  map<GlobalGraph::Node, GlobalGraph::Edge>::iterator foundBackwardsRelation = nodeBRow->second.second.find(nodeA);
+  if (foundBackwardsRelation == nodeBRow->second.first.end())
+    throw Exception("GlobalGraph::unlinkInNodeStructure_ : no edge to erase " + TextTools::toString(nodeB) + "<-" + TextTools::toString(nodeA));
+
+  nodeBRow->second.second.erase(foundBackwardsRelation);
+
+  this->topologyHasChanged_();
+  return foundEdge;
+}
+
+void GlobalGraph::linkInNodeStructure_(const GlobalGraph::Node& nodeA, const GlobalGraph::Node& nodeB, const GlobalGraph::Edge& edge)
+{
+  std::map<GlobalGraph::Node, std::pair<std::map<GlobalGraph::Node, GlobalGraph::Edge>, std::map<GlobalGraph::Node, GlobalGraph::Edge> > >::iterator ita = nodeStructure_.find(nodeA);
+
+  if (ita != nodeStructure_.end())
+    ita->second.first.insert( pair<GlobalGraph::Node, GlobalGraph::Edge>(nodeB, edge));
+
+  std::map<GlobalGraph::Node, std::pair<std::map<GlobalGraph::Node, GlobalGraph::Edge>, std::map<GlobalGraph::Node, GlobalGraph::Edge> > >::iterator itb = nodeStructure_.find(nodeB);
+
+  if (itb != nodeStructure_.end())
+    nodeStructure_.find(nodeB)->second.second.insert( pair<GlobalGraph::Node, GlobalGraph::Edge>(nodeA, edge));
+
+  this->topologyHasChanged_();
+}
+
+Graph::NodeId GlobalGraph::createNode()
+{
+  GlobalGraph::Node newNode = highestNodeID_++;
+  nodeStructure_[newNode] = std::pair<std::map<GlobalGraph::Node, GlobalGraph::Edge>, std::map<GlobalGraph::Node, GlobalGraph::Edge> >();
+  this->topologyHasChanged_();
+
+  return newNode;
+}
+
+Graph::NodeId GlobalGraph::createNodeFromNode(Graph::NodeId origin)
+{
+  Graph::NodeId newNode = createNode();
+  link(origin, newNode);
+  this->topologyHasChanged_();
+  return newNode;
+}
+
+Graph::NodeId GlobalGraph::createNodeOnEdge(Graph::EdgeId edge)
+{
+  // origin must be an existing edge
+  edgeMustExist_(edge, "");
+
+  Graph::NodeId newNode = createNode();
+
+  // determining the nodes on the border of the edge
+  pair<GlobalGraph::Node, GlobalGraph::Node> nodes = edgeStructure_[edge];
+  GlobalGraph::Node nodeA = nodes.first;
+  GlobalGraph::Node nodeB = nodes.second;
+
+  unlink(nodeA, nodeB);
+  link(nodeA, newNode);
+  link(newNode, nodeB);
+  this->topologyHasChanged_();
+  return newNode;
+}
+
+
+Graph::NodeId GlobalGraph::createNodeFromEdge(Graph::NodeId origin)
+{
+  // origin must be an existing edge
+  edgeMustExist_(origin, "origin edge");
+
+  // splitting the edge
+  Graph::NodeId anchor = createNodeOnEdge(origin);
+
+  Graph::NodeId newNode = createNodeFromNode(anchor);
+  this->topologyHasChanged_();
+  return newNode;
+}
+
+/*********************************************/
+
+void GlobalGraph::registerObserver(GraphObserver* observer)
+{
+  if (!observers_.insert(observer).second)
+    throw (Exception("This GraphObserver was already an observer of this Graph"));
+  ;
+}
+
+void GlobalGraph::unregisterObserver(GraphObserver* observer)
+{
+  if (!observers_.erase(observer))
+    throw (Exception("This GraphObserver was not an observer of this Graph"));
+}
+
+
+/**********************************************/
+
+std::vector< GlobalGraph::Node > GlobalGraph::getNeighbors_(const GlobalGraph::Node& node, bool outgoing) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw (Exception("The requested node is not in the structure."));
+  const std::map<GlobalGraph::Node, GlobalGraph::Edge>& forOrBack = (outgoing ? foundNode->second.first : foundNode->second.second);
+  vector<GlobalGraph::Node> result;
+  for (map<GlobalGraph::Node, GlobalGraph::Edge>::const_iterator currNeighbor = forOrBack.begin(); currNeighbor != forOrBack.end(); currNeighbor++)
+  {
+    result.push_back(currNeighbor->first);
+  }
+
+  return result;
+}
+
+std::vector< GlobalGraph::Edge > GlobalGraph::getEdges_(const GlobalGraph::Node& node, bool outgoing) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw (Exception("The requested node is not in the structure."));
+  const std::map<GlobalGraph::Node, GlobalGraph::Edge>& forOrBack = (outgoing ? foundNode->second.first : foundNode->second.second);
+  vector<GlobalGraph::Edge> result;
+  for (map<GlobalGraph::Node, GlobalGraph::Edge>::const_iterator currNeighbor = forOrBack.begin(); currNeighbor != forOrBack.end(); currNeighbor++)
+  {
+    result.push_back(currNeighbor->second);
+  }
+
+  return result;
+}
+
+vector< Graph::NodeId > GlobalGraph::getIncomingNeighbors(Graph::NodeId node) const
+{
+  return getNeighbors_(node, false);
+}
+
+vector< Graph::EdgeId > GlobalGraph::getIncomingEdges(const Graph::NodeId node) const
+{
+  return getEdges_(node, false);
+}
+
+vector< Graph::NodeId > GlobalGraph::getOutgoingNeighbors(const Graph::NodeId node) const
+{
+  return getNeighbors_(node, true);
+}
+
+vector< Graph::EdgeId > GlobalGraph::getOutgoingEdges(const Graph::NodeId node) const
+{
+  return getEdges_(node, true);
+}
+
+std::unique_ptr<Graph::NodeIterator> GlobalGraph::allNodesIterator()
+{
+  return std::unique_ptr<Graph::NodeIterator>(new NodesIteratorClass<Graph::ALLGRAPHITER, false>(*this));
+}
+
+std::unique_ptr<Graph::NodeIterator> GlobalGraph::allNodesIterator() const
+{
+  return std::unique_ptr<Graph::NodeIterator>(new NodesIteratorClass<Graph::ALLGRAPHITER, true>(*this));
+}
+
+
+std::unique_ptr<Graph::NodeIterator> GlobalGraph::outgoingNeighborNodesIterator(Graph::NodeId node)
+{
+  return std::unique_ptr<Graph::NodeIterator>(new NodesIteratorClass<Graph::OUTGOINGNEIGHBORITER, false>(*this, node));
+}
+
+
+std::unique_ptr<Graph::NodeIterator> GlobalGraph::incomingNeighborNodesIterator(Graph::NodeId node)
+{
+  return std::unique_ptr<Graph::NodeIterator>(new NodesIteratorClass<Graph::INCOMINGNEIGHBORITER, false>(*this, node));
+}
+
+std::unique_ptr<Graph::NodeIterator> GlobalGraph::outgoingNeighborNodesIterator(Graph::NodeId node) const
+{
+  return std::unique_ptr<Graph::NodeIterator>(new NodesIteratorClass<Graph::OUTGOINGNEIGHBORITER, true>(*this, node));
+}
+
+
+std::unique_ptr<Graph::NodeIterator> GlobalGraph::incomingNeighborNodesIterator(Graph::NodeId node) const
+{
+  return std::unique_ptr<Graph::NodeIterator>(new NodesIteratorClass<Graph::INCOMINGNEIGHBORITER, true>(*this, node));
+}
+
+
+size_t GlobalGraph::getNumberOfNodes() const
+{
+  return nodeStructure_.size();
+}
+
+
+size_t GlobalGraph::getNumberOfEdges() const
+{
+  return edgeStructure_.size();
+}
+
+
+size_t GlobalGraph::getDegree(const Graph::NodeId node) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw Exception("GlobalGraph::getDegree : Node " + TextTools::toString(node) + " does not exist.");
+
+  return isDirected() ? foundNode->second.first.size() + foundNode->second.second.size() : foundNode->second.first.size();
+}
+
+
+bool GlobalGraph::isLeaf(const Graph::NodeId node) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw Exception("GlobalGraph::isLeaf : Node " + TextTools::toString(node) + " does not exist.");
+
+  return (!isDirected() && (foundNode->second.first.size() <= 1))
+         || (isDirected() && (
+               (foundNode->second.first.size() + foundNode->second.second.size() <= 1)
+               || (foundNode->second.first.size() == 1 &&  foundNode->second.second.size() == 1 && foundNode->second.first.begin()->first == foundNode->second.second.begin()->first)));
+}
+
+
+size_t GlobalGraph::getNumberOfNeighbors(const Graph::NodeId node) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw (Exception("The requested node is not in the structure."));
+
+  if (isDirected())
+    return foundNode->second.first.size() + foundNode->second.second.size();
+  else
+    return foundNode->second.first.size();
+}
+
+size_t GlobalGraph::getNumberOfOutgoingNeighbors(const Graph::NodeId node) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw (Exception("The requested node is not in the structure."));
+  return foundNode->second.first.size();
+}
+
+size_t GlobalGraph::getNumberOfIncomingNeighbors(const Graph::NodeId node) const
+{
+  nodeStructureType::const_iterator foundNode = nodeStructure_.find(node);
+  if (foundNode == nodeStructure_.end())
+    throw (Exception("The requested node is not in the structure."));
+  return foundNode->second.second.size();
+}
+
+vector< Graph::NodeId > GlobalGraph::getNeighbors(const Graph::NodeId node) const
+{
+  vector<Graph::NodeId> result;
+  vector<Graph::NodeId> neighborsToInsert;
+  neighborsToInsert = getNeighbors_(node, false);
+  result.insert(result.end(), neighborsToInsert.begin(), neighborsToInsert.end());
+  neighborsToInsert = getNeighbors_(node, true);
+  result.insert(result.end(), neighborsToInsert.begin(), neighborsToInsert.end());
+  return result;
+}
+
+std::pair<Graph::NodeId, Graph::NodeId> GlobalGraph::getNodes(Graph::EdgeId edge) const
+{
+  edgeMustExist_(edge);
+  edgeStructureType::const_iterator found = edgeStructure_.find(edge);
+  // TODO Except if not found
+  return found->second;
+}
+
+Graph::NodeId GlobalGraph::getTop(Graph::EdgeId edge) const
+{
+  return std::get<0>(getNodes(edge));
+}
+
+Graph::NodeId GlobalGraph::getBottom(Graph::EdgeId edge) const
+{
+  return std::get<1>(getNodes(edge));
+}
+
+void GlobalGraph::deleteNode(Graph::NodeId node)
+{
+  // checking the node
+  nodeMustExist_(node, "node to delete");
+  isolate_(node);
+
+  nodeStructureType::iterator found = nodeStructure_.find(node);
+  if (found == nodeStructure_.end())
+    throw Exception("GlobalGraph::deleteNode : no node to erase " + TextTools::toString(node));
+
+  nodeStructure_.erase(found);
+
+  this->topologyHasChanged_();
+}
+
+void GlobalGraph::isolate_(GlobalGraph::Node& node)
+{
+  vector<Graph::NodeId> oneighbors = getOutgoingNeighbors(node);
+  for (vector<Graph::NodeId>::iterator currNeighbor = oneighbors.begin(); currNeighbor != oneighbors.end(); currNeighbor++)
+  {
+    unlink(node, *currNeighbor);
+  }
+
+  vector<Graph::NodeId> ineighbors = getIncomingNeighbors(node);
+  for (vector<Graph::NodeId>::iterator currNeighbor = ineighbors.begin(); currNeighbor != ineighbors.end(); currNeighbor++)
+  {
+    unlink(*currNeighbor, node);
+  }
+}
+
+vector<Graph::EdgeId> GlobalGraph::getAllEdges() const
+{
+  vector<Graph::EdgeId> listOfEdges;
+  for (edgeStructureType::const_iterator it = edgeStructure_.begin(); it != edgeStructure_.end(); it++)
+  {
+    listOfEdges.push_back(it->first);
+  }
+
+  return listOfEdges;
+}
+
+Graph::EdgeId GlobalGraph::getAnyEdge(Graph::NodeId nodeA, Graph::NodeId nodeB) const
+{
+  try
+  {
+    // trying in the given order A->B
+    return getEdge(nodeA, nodeB);
+  }
+  catch (Exception e)
+  {
+    // didn’t work, hence trying in the opposite order B->A
+    return getEdge(nodeB, nodeA);
+  }
+}
+
+vector<Graph::NodeId> GlobalGraph::getAllLeaves() const
+{
+  vector<Graph::NodeId> listOfLeaves;
+  for (nodeStructureType::const_iterator it = nodeStructure_.begin(); it != nodeStructure_.end(); it++)
+  {
+    if (this->isLeaf(it->first))
+      listOfLeaves.push_back(it->first);
+  }
+
+  return listOfLeaves;
+}
+
+set<Graph::NodeId> GlobalGraph::getSetOfAllLeaves() const
+{
+  set<Graph::NodeId> listOfLeaves;
+  for (nodeStructureType::const_iterator it = nodeStructure_.begin(); it != nodeStructure_.end(); it++)
+  {
+    if (this->isLeaf(it->first))
+      listOfLeaves.insert(it->first);
+  }
+
+  return listOfLeaves;
+}
+
+vector<Graph::NodeId> GlobalGraph::getAllNodes() const
+{
+  vector<Graph::NodeId> listOfNodes;
+  for (nodeStructureType::const_iterator it = nodeStructure_.begin(); it != nodeStructure_.end(); it++)
+  {
+    listOfNodes.push_back(it->first);
+  }
+
+  return listOfNodes;
+}
+
+vector<Graph::NodeId> GlobalGraph::getAllInnerNodes() const
+{
+  vector<Graph::NodeId> listOfInNodes;
+  for (nodeStructureType::const_iterator it = nodeStructure_.begin(); it != nodeStructure_.end(); it++)
+  {
+    if (this->getDegree(it->first) >= 2)
+      listOfInNodes.push_back(it->first);
+  }
+
+  return listOfInNodes;
+}
+
+
+void GlobalGraph::fillListOfLeaves_(const GlobalGraph::Node& startingNode, vector<GlobalGraph::Node>& foundLeaves, const GlobalGraph::Node& originNode, unsigned int maxRecursions) const
+{
+  const vector<Graph::NodeId> neighbors = getNeighbors(startingNode);
+  if (neighbors.size() > 1)
+  {
+    if (maxRecursions > 0)
+      for (vector<Node>::const_iterator currNeighbor = neighbors.begin(); currNeighbor != neighbors.end(); currNeighbor++)
+      {
+        if (*currNeighbor != originNode)
+          fillListOfLeaves_(*currNeighbor, foundLeaves, startingNode, maxRecursions - 1);
+      }
+  }
+  else
+  {
+    foundLeaves.push_back(startingNode);
+  }
+}
+
+
+std::vector<Graph::NodeId> GlobalGraph::getLeavesFromNode(const Graph::NodeId node, unsigned int maxDepth) const
+{
+  vector<Graph::NodeId> listOfLeaves;
+  fillListOfLeaves_(node, listOfLeaves, node, maxDepth);
+  return listOfLeaves;
+}
+
+void GlobalGraph::nodeToDot_(const GlobalGraph::Node& node, ostream& out,  std::set<std::pair<Node, Node> >& alreadyFigured) const
+{
+  bool theEnd = true;
+  const std::map<Node, Edge>& children = nodeStructure_.at(node).first;
+  for (map<Node, Edge>::const_iterator currChild = children.begin(); currChild != children.end(); currChild++)
+  {
+    if (alreadyFigured.find(pair<Node, Node>(node, currChild->first)) != alreadyFigured.end() || (!directed_ && alreadyFigured.find(pair<Node, Node>(currChild->first, node)) != alreadyFigured.end()))
+      continue;
+    alreadyFigured.insert(pair<Node, Node>(node, currChild->first));
+    theEnd = false;
+    out << node << (directed_ ? " -> " : " -- ");
+    nodeToDot_(currChild->first, out, alreadyFigured);
+  }
+
+  const std::map<Node, Edge>& fathers = nodeStructure_.at(node).second;
+  for (map<Node, Edge>::const_iterator currFath = fathers.begin(); currFath != fathers.end(); currFath++)
+  {
+    if (alreadyFigured.find(pair<Node, Node>(currFath->first, node)) != alreadyFigured.end() || (!directed_ && alreadyFigured.find(pair<Node, Node>(node, currFath->first)) != alreadyFigured.end()))
+      continue;
+    alreadyFigured.insert(pair<Node, Node>(currFath->first, node));
+    theEnd = false;
+    out << node << (directed_ ? " <- " : " -- ");
+    nodeToDot_(currFath->first, out, alreadyFigured);
+  }
+  if (theEnd)
+    out << node << ";\n    ";
+}
+
+bool GlobalGraph::isTree() const
+{
+  set<GlobalGraph::Node> metNodes;
+  bool nodesAreMetOnlyOnce = nodesAreMetOnlyOnce_(root_, metNodes, root_);
+
+  if (!nodesAreMetOnlyOnce)
+    return false;
+  // now they have only been met at most once, they have to be met at least once
+  bool noNodeMissing = true;
+  for (nodeStructureType::const_iterator currNode = nodeStructure_.begin(); noNodeMissing && currNode != nodeStructure_.end(); currNode++)
+  {
+    noNodeMissing = (metNodes.find(currNode->first) != metNodes.end());
+  }
+  return noNodeMissing;
+}
+
+
+bool GlobalGraph::nodesAreMetOnlyOnce_(const GlobalGraph::Node& node, set< GlobalGraph::Node >& metNodes, const GlobalGraph::Node& originNode) const
+{
+  // insert().second <=> not yet in the set
+  bool neverMetANodeMoreThanOnce = metNodes.insert(node).second;
+  vector<Graph::NodeId> neighbors = getOutgoingNeighbors(node);
+  for (vector<Graph::NodeId>::iterator currNeighbor = neighbors.begin(); neverMetANodeMoreThanOnce && currNeighbor != neighbors.end(); currNeighbor++)
+  {
+    if (*currNeighbor == originNode)
+      continue;
+    neverMetANodeMoreThanOnce = nodesAreMetOnlyOnce_(*currNeighbor, metNodes, node);
+  }
+  return neverMetANodeMoreThanOnce;
+}
+
+bool GlobalGraph::isDA() const
+{
+  GlobalGraph gg(*this);
+
+  // Algo: remove recursively all nodes with no sons from graph
+
+  std::vector<Graph::NodeId> vL;
+
+  std::unique_ptr<Graph::NodeIterator> it = gg.allNodesIterator();
+  for ( ; !it->end(); it->next())
+  {
+    if (gg.getNumberOfOutgoingNeighbors(**it) == 0)
+      vL.push_back(**it);
+  }
+
+  while (vL.size() != 0)
+  {
+    for (std::vector<Graph::NodeId>::iterator it2(vL.begin()); it2 != vL.end(); it2++)
+    {
+      gg.deleteNode(*it2);
+    }
+
+    if (gg.getNumberOfNodes() == 0)
+      return true;
+
+    vL.clear();
+
+    it = gg.allNodesIterator();
+    for ( ; !it->end(); it->next())
+    {
+      if (gg.getNumberOfOutgoingNeighbors(**it) == 0)
+        vL.push_back(**it);
+    }
+  }
+
+  return false;
+}
+
+
+void GlobalGraph::orientate()
+{
+  if (!isDirected())
+    makeDirected();
+
+  GlobalGraph gg(*this);
+
+  // Algo: remove recursively all nodes from graph, starting with
+  // root_
+
+  Graph::NodeId node = root_;
+  std::set<Graph::NodeId> nextNodes;
+  nextNodes.insert(node);
+
+  while (gg.getNumberOfNodes() != 0)
+  {
+    // look for the next node to be treated
+    Graph::NodeId nbgg = 0;
+
+    // first node with one neighbor (ie no choice on orientation)
+
+    std::set<Graph::NodeId>::iterator it = nextNodes.begin();
+    for ( ; it != nextNodes.end(); it++)
+    {
+      if (gg.getNumberOfNeighbors(*it) <= 1)
+        break;
+    }
+
+    // if none, look for node wih minimum number of fathers
+    if (it == nextNodes.end())
+    {
+      size_t nbF = numeric_limits<size_t>::infinity();
+      it = nextNodes.begin();
+
+      for ( ; it != nextNodes.end(); it++)
+      {
+        size_t nbFi = gg.getNumberOfIncomingNeighbors(*it);
+        if (nbF == 0)
+        {
+          nbgg = *it;
+          break;
+        }
+        else
+        {
+          if (nbFi < nbF)
+          {
+            nbgg = *it;
+            nbF = nbFi;
+          }
+        }
+      }
+    }
+    else
+      nbgg = *it;
+
+    // next orient edges from this node and catch neighbors
+    std::vector<Graph::NodeId> vL = gg.getIncomingNeighbors(nbgg);
+    for (std::vector<Graph::NodeId>::iterator it2(vL.begin()); it2 != vL.end(); it2++)
+    {
+      switchNodes(nbgg, *it2);
+
+      nextNodes.insert(*it2);
+    }
+
+    vL = gg.getOutgoingNeighbors(nbgg);
+    for (std::vector<Graph::NodeId>::iterator it2(vL.begin()); it2 != vL.end(); it2++)
+    {
+      nextNodes.insert(*it2);
+    }
+
+    gg.deleteNode(nbgg);
+    nextNodes.erase(nbgg);
+  }
+}
+
+void GlobalGraph::setRoot(Graph::NodeId newRoot)
+{
+  nodeMustExist_(newRoot, "new root");
+  root_ = newRoot;
+}
+
+Graph::NodeId GlobalGraph::getRoot() const
+{
+  return root_;
+}
+
+
+bool GlobalGraph::isDirected() const
+{
+  return directed_;
+}
+
+void GlobalGraph::makeDirected()
+{
+  if (directed_)
+    return;
+  // save and clean the undirectedStructure
+  nodeStructureType undirectedStructure = nodeStructure_;
+  for (nodeStructureType::iterator it = nodeStructure_.begin(); it != nodeStructure_.end(); it++)
+  {
+    it->second = std::pair<std::map<Node, Edge>, std::map<Node, Edge> >();
+  }
+  // copy each relation once, without the reciprocal link
+  // (first met, first kept)
+  // eg: A - B in undirected is represented as A->B and B->A
+  //     in directed, becomes A->B only
+  std::set<pair<Node, Node> > alreadyConvertedRelations;
+  for (nodeStructureType::iterator currNodeRow = undirectedStructure.begin(); currNodeRow != undirectedStructure.end(); currNodeRow++)
+  {
+    Node nodeA = currNodeRow->first;
+
+    for (map<Node, Edge>::iterator currRelation = currNodeRow->second.first.begin(); currRelation != currNodeRow->second.first.end(); currRelation++)
+    {
+      Node nodeB = currRelation->first;
+      Edge edge = currRelation->second;
+      if (alreadyConvertedRelations.insert(pair<Node, Node>(min(nodeA, nodeB), max(nodeA, nodeB))).second)
+        linkInNodeStructure_(nodeA, nodeB, edge);
+    }
+  }
+  directed_ = true;
+  this->topologyHasChanged_();
+}
+
+void GlobalGraph::makeUndirected()
+{
+  if (!directed_)
+    return;
+  if (containsReciprocalRelations())
+    throw Exception("Cannot make an undirected graph from a directed one containing reciprocal relations.");
+  // save and clean the undirectedStructure
+  nodeStructureType directedStructure = nodeStructure_;
+  for (nodeStructureType::iterator it = nodeStructure_.begin(); it != nodeStructure_.end(); it++)
+  {
+    it->second = std::pair<std::map<Node, Edge>, std::map<Node, Edge> >();
+  }
+  // copy each relation twice, making the reciprocal link
+  // eg: A - B in directed is represented as A->B
+  //     in undirected, becomes A->B and B->A
+  for (nodeStructureType::iterator currNodeRow = directedStructure.begin(); currNodeRow != directedStructure.end(); currNodeRow++)
+  {
+    Node nodeA = currNodeRow->first;
+    for (map<Node, Edge>::iterator currRelation = currNodeRow->second.first.begin(); currRelation != currNodeRow->second.first.end(); currRelation++)
+    {
+      Node nodeB = currRelation->first;
+      Edge edge = currRelation->second;
+      linkInNodeStructure_(nodeA, nodeB, edge);
+      linkInNodeStructure_(nodeB, nodeA, edge);
+    }
+  }
+  directed_ = false;
+  this->topologyHasChanged_();
+}
+
+bool GlobalGraph::containsReciprocalRelations() const
+{
+  if (!directed_)
+    throw Exception("Cannot state reciprocal link in an undirected graph.");
+  std::set<pair<Node, Node> > alreadyMetRelations;
+  for (nodeStructureType::const_iterator currNodeRow = nodeStructure_.begin(); currNodeRow != nodeStructure_.end(); currNodeRow++)
+  {
+    Node nodeA = currNodeRow->first;
+    for (map<Node, Edge>::const_iterator currRelation = currNodeRow->second.first.begin(); currRelation != currNodeRow->second.first.end(); currRelation++)
+    {
+      Node nodeB = currRelation->first;
+      if (!alreadyMetRelations.insert(pair<Node, Node>(min(nodeA, nodeB), max(nodeA, nodeB))).second)
+        return true;
+    }
+  }
+  return false;
+}
+
+std::unique_ptr<Graph::EdgeIterator> GlobalGraph::allEdgesIterator()
+{
+  return std::unique_ptr<Graph::EdgeIterator>(new EdgesIteratorClass<Graph::ALLGRAPHITER, false>(*this));
+}
+
+std::unique_ptr<Graph::EdgeIterator> GlobalGraph::outgoingEdgesIterator(Graph::NodeId node)
+{
+  return std::unique_ptr<Graph::EdgeIterator>(new EdgesIteratorClass<Graph::OUTGOINGNEIGHBORITER, false>(*this, node));
+}
+
+std::unique_ptr<Graph::EdgeIterator> GlobalGraph::incomingEdgesIterator(Graph::NodeId node)
+{
+  return std::unique_ptr<Graph::EdgeIterator>(new EdgesIteratorClass<Graph::INCOMINGNEIGHBORITER, false>(*this, node));
+}
+
+std::unique_ptr<Graph::EdgeIterator> GlobalGraph::allEdgesIterator() const
+{
+  return std::unique_ptr<Graph::EdgeIterator>(new EdgesIteratorClass<Graph::ALLGRAPHITER, true>(*this));
+}
+
+std::unique_ptr<Graph::EdgeIterator> GlobalGraph::outgoingEdgesIterator(Graph::NodeId node) const
+{
+  return std::unique_ptr<Graph::EdgeIterator>(new EdgesIteratorClass<Graph::OUTGOINGNEIGHBORITER, true>(*this, node));
+}
+
+std::unique_ptr<Graph::EdgeIterator> GlobalGraph::incomingEdgesIterator(Graph::NodeId node) const
+{
+  return std::unique_ptr<Graph::EdgeIterator>(new EdgesIteratorClass<Graph::INCOMINGNEIGHBORITER, true>(*this, node));
+}
+
+Graph::EdgeId GlobalGraph::getEdge(Graph::NodeId nodeA, Graph::NodeId nodeB) const
+{
+  nodeStructureType::const_iterator firstNodeFound = nodeStructure_.find(nodeA);
+  if (firstNodeFound == nodeStructure_.end())
+    throw (Exception("The fist node was not the origin of an edge."));
+  map<Node, Edge>::const_iterator secondNodeFound = firstNodeFound->second.first.find(nodeB);
+  if (secondNodeFound == firstNodeFound->second.first.end())
+    throw (Exception("The second node was not in a relation with the first one."));
+  return secondNodeFound->second;
+}
+
+vector<Graph::EdgeId> GlobalGraph::getEdges(Graph::NodeId node) const
+{
+  vector<Graph::EdgeId> result;
+  vector<Graph::EdgeId> edgesToInsert;
+  edgesToInsert = getEdges_(node, false);
+  result.insert(result.end(), edgesToInsert.begin(), edgesToInsert.end());
+  edgesToInsert = getEdges_(node, true);
+  result.insert(result.end(), edgesToInsert.begin(), edgesToInsert.end());
+  return result;
+}
+
+void GlobalGraph::outputToDot(ostream& out, const std::string& name) const
+{
+  out << (directed_ ? "digraph" : "graph") << " " << name << " {\n    ";
+  set<pair<Node, Node> > alreadyFigured;
+  nodeToDot_(root_, out, alreadyFigured);
+  out << "\r}" << endl;
+}
+
+void GlobalGraph::notifyDeletedEdges(const vector<Graph::EdgeId>& edgesToDelete) const
+{
+  for (set<GraphObserver*>::iterator currObserver = observers_.begin(); currObserver != observers_.end(); currObserver++)
+  {
+    (*currObserver)->deletedEdgesUpdate(edgesToDelete);
+  }
+}
+
+void GlobalGraph::notifyDeletedNodes(const vector<Graph::NodeId>& nodesToDelete) const
+{
+  for (set<GraphObserver*>::iterator currObserver = observers_.begin(); currObserver != observers_.end(); currObserver++)
+  {
+    (*currObserver)->deletedNodesUpdate(nodesToDelete);
+  }
+}
diff --git a/src/Bpp/Graph/GlobalGraph.h b/src/Bpp/Graph/GlobalGraph.h
new file mode 100644
index 0000000..98c7189
--- /dev/null
+++ b/src/Bpp/Graph/GlobalGraph.h
@@ -0,0 +1,956 @@
+//
+// File GlobalGraph.h
+// Created by: Thomas Bigot
+//             Laurent Gueguen
+// Last modification : vendredi 4 novembre 2016, à 10h 19
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _GLOBAL_GRAPH_H_
+#define _GLOBAL_GRAPH_H_
+
+#include "../Clonable.h"
+
+#include <set>
+#include <map>
+#include <string>
+#include "Graph.h"
+
+namespace bpp
+{
+class GlobalGraph :
+  public virtual Graph,
+  public virtual Clonable
+{
+public:
+  typedef Graph::NodeId Node;
+  typedef Graph::EdgeId Edge;
+
+  /**
+   * The node structure type
+   * Node -> ("toNodes" [DestNode,Edge],"fromNodes" [DestNode,Edge])
+   * directed example: (N1)-E1->(N2)-E2->(N3) is coded as
+   *     N1 -> ((N2:E1),())
+   *     N2 -> ((N3:E3),(N1:E1))
+   *     N3 -> ((),(N2:E2))
+   * undirected example: (N1)-E1-(N2)-E2->(N3) is coded as
+   *     N1 -> ((N2:E1),(N2:E1))
+   *     N2 -> ((N1:E1, N3:E3),(N1:E1, N3:E3))
+   *     N3 -> ((N2:E2),(N2:E2))
+   */
+  typedef std::map<Node, std::pair<std::map<Node, Edge>, std::map<Node, Edge> > > nodeStructureType;
+
+  /**
+   * The edge structure type
+   * directed example: N1--E1-->N2 is coded as E1 -> (N1,N2)
+   * undirected example: N1--E1--N2 is coded as E1 -> (N1,N2)
+   */
+  typedef std::map<Edge, std::pair<Node, Node> > edgeStructureType;
+
+private:
+  /**
+   * is the graph directed
+   */
+  bool directed_;
+
+  /**
+   * List of all the subscribers.
+   */
+  std::set<GraphObserver*> observers_;
+
+  /**
+   * Highest used available ID for a Node.
+   */
+  Node highestNodeID_;
+  /**
+   * Highest used available ID for an Edge.
+   */
+  Edge highestEdgeID_;
+
+  /**
+   * Nodes and their relations.
+   * see nodeStructureType documentation
+   */
+
+  nodeStructureType nodeStructure_;
+
+  /**
+   * Edges and their relations in the forward direction..
+   * see edgeStructureType documentation
+   */
+  edgeStructureType edgeStructure_;
+
+  /**
+   * Usualy the first node of a graph. Used for algorithmic purposes.
+   */
+  Node root_;
+
+  /**
+   * Some types of Graphs need to know if they have been modified
+   * But for a Graph, it does nothing.
+   */
+  virtual void topologyHasChanged_() const
+  {
+    // do nothing: a Graph does not care to be modified
+  }
+
+  /**
+   * Tell all the observers to get the last updates.
+   * Calls the method update of all the subscribers.
+   */
+  void notify_();
+
+  /**
+   * Creates a link between two existing nodes. If directed graph: nodeA -> nodeB.
+   * Private version of link, does not check for the reciprocity.
+   * Mainly called by link().
+   * @param nodeA source node
+   * @param nodeB target node
+   * @param edge the ID of the relation
+   */
+  void linkInNodeStructure_(const Node& nodeA, const Node& nodeB, const Edge& edge);
+
+  /**
+   * Creates a link between two existing nodes in the edge structure.
+   * If directed graph: nodeA -> nodeB.
+   * Mainly called by link().
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @param edge the ID of the relation
+   */
+  void linkInEdgeStructure_(const Node& nodeA, const Node& nodeB, const Edge& edge);
+
+
+  /**
+   * Erase a link between two existing nodes. If directed graph: nodeA -> nodeB.
+   * Private version of unLink, does not check for the reciprocity.
+   * Mainly called by unLink().
+   * @param nodeA source node
+   * @param nodeB target node
+   * @return the ID of the erased relation
+   */
+
+  Edge unlinkInNodeStructure_(const Node& nodeA, const Node& nodeB);
+
+  /**
+   * Erase a link between two existing nodes in the Edge structure.
+   * Mainly called by unLink().
+   * @param edge the edge to unregister
+   */
+
+  void unlinkInEdgeStructure_(const Edge& edge);
+
+protected:
+  /**
+   * get the Highest Node ID (for vector sizing)
+   */
+  Node getHighestNodeID() const;
+
+  /**
+   * get the Highest Node ID (for vector sizing)
+   */
+  Edge getHighestEdgeID() const;
+
+
+  /**
+   * Check that a node exists. If not, throw an exception.
+   * @param node node that has to be checked
+   * @param name common name to give to the user in case of failure (eg: "first node")
+   */
+  void nodeMustExist_(const Node& node, std::string name = "") const;
+
+  /**
+   * Check that a edge exists. If not, throw an exception.
+   * @param edge edge that has to be checked
+   * @param name common name to give to the user in case of failure (eg: "first node")
+   */
+  void edgeMustExist_(const Edge& edge, std::string name = "") const;
+
+private:
+  /**
+   * Private version of getIncomingNeighbors or getOutgoingNeighbors.
+   * Common code of these function shared here.
+   * @param node node to  in or outgoing neighbors
+   * @param outgoing boolean: if true, outgoing; else incoming
+   */
+  std::vector<Node> getNeighbors_(const Node& node, bool outgoing = true) const;
+
+  /**
+   * Private version of getIncomingEdges or getOutgoingEdges.
+   * Common code of these function shared here.
+   * @param node node to  in or outgoing edges
+   * @param outgoing boolean: if true, outgoing; else incoming
+   */
+  std::vector<Edge> getEdges_(const Node& node, bool outgoing = true) const;
+
+  /**
+   * Separate a node from all its neighbors.
+   * @param node node to isolate
+   */
+
+  void isolate_(Node& node);
+
+  /**
+   * Get leaves from a starting node, filling a vector (private version).
+   * @param startingNode root node
+   * @param foundLeaves a vector containing all the found leaves
+   * @param originNode the node where we come from, not to explore
+   * @param maxRecursions  maximum number of recursion steps
+   */
+
+  void fillListOfLeaves_(const Node& startingNode, std::vector<Node>& foundLeaves, const Node& originNode, unsigned int maxRecursions) const;
+
+  /**
+   * Check that nodes are only met once to define if the graph is cyclic.
+   * @param node the node to explore
+   * @param metNodes a set containing all the nodes we met
+   * @param originNode the node where we come from, not to explore
+   */
+  bool nodesAreMetOnlyOnce_(const Node& node, std::set<Node>& metNodes, const Node& originNode) const;
+
+  /**
+   * output a node to DOT format (recursive)
+   */
+
+  void nodeToDot_(const Node& node, std::ostream& out, std::set<std::pair<Node, Node> >& alreadyFigured) const;
+
+public:
+  /** @name General Management
+   *  Misc & constructors
+   */
+  // /@{
+
+
+  /**
+   * Constructor
+   * @param directed true if the graph is directed.
+   */
+  GlobalGraph(bool directed = false);
+
+  GlobalGraph(const GlobalGraph& gg);
+
+  GlobalGraph& operator=(const GlobalGraph& gg);
+
+  GlobalGraph* clone() const {return new GlobalGraph(*this); }
+
+  ~GlobalGraph() {}
+
+protected:
+  /**
+   * set the root node to an existing node. Will not affect the topology.
+   * @param newRoot the new root
+   */
+
+  void setRoot(Graph::NodeId newRoot);
+
+public:
+  /**
+   * get the root node
+   */
+
+  Graph::NodeId getRoot() const;
+
+  /**
+   * Make the graph directed
+   * - changes the property
+   * - de-duplicate the relations:
+   *  eg: A - B in undirected is represented as A->B and B->A
+   *  in directed, becomes A->B only
+   *
+   * Please note that the resulting directions are totaly arbritrary.
+   * One might consider to use the makeLocalRoot method.
+   */
+  void makeDirected();
+
+  /**
+   * Make the graph directed
+   * - changes the property
+   * - de-duplicate the relations:
+   *    eg: A - B in directed is represented as A->B
+   *        in undirected, becomes A->B and B->A
+   * If the directed graph already contains reciprocal relations,
+   * such as A->B and B->A, the method will throw an exception.
+   */
+  void makeUndirected();
+
+  // /@}
+
+
+  /** @name Relations management
+   *  Modificating the structure of the graph.
+   */
+  // /@{
+
+  /**
+   * Creates an orphaned node.
+   * @return the new node
+   */
+
+  Graph::NodeId createNode();
+
+  /**
+   * Creates a node linked to an existing node.
+   * @param origin existing node. In a directed graph: origin -> newNode.
+   * @return the new node
+   */
+
+  Graph::NodeId createNodeFromNode(Graph::NodeId origin);
+
+  /**
+   * Creates new node on an existing Edge. A -> B will be A -> N -> B
+   * @param edge existing edge.
+   * @return the new node
+   */
+
+  Graph::NodeId createNodeOnEdge(Graph::EdgeId edge);
+
+  /**
+   * Creates a node linked to new node, splitting an edge.
+   * @param origin existing edge. In a directed graph: origin -> newNode.
+   * @return the new node
+   */
+
+  Graph::NodeId createNodeFromEdge(Graph::NodeId origin);
+
+protected:
+  /**
+   * Creates a link between two existing nodes. If directed graph: nodeA -> nodeB.
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @return the new edge
+   */
+
+  Graph::EdgeId link(Graph::NodeId nodeA, Graph::NodeId nodeB);
+
+  /**
+   * Sets a link between two existing nodes, using existing edge. If
+   * directed graph: nodeA -> nodeB.
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @param edgeID the used edge
+   */
+
+  void link(Graph::NodeId nodeA, Graph::NodeId nodeB, GlobalGraph::Edge edgeID);
+
+  /**
+   * Switch the edge  between two existing nodes.
+   *
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   */
+
+  void switchNodes(Graph::NodeId nodeA, Graph::NodeId nodeB);
+
+
+  /**
+   * Remove all links between two existing nodes. If directed graph: nodeA -> nodeB.
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @return vector of deleted edges
+   */
+
+  std::vector<Graph::EdgeId> unlink(Graph::NodeId nodeA, Graph::NodeId nodeB);
+
+public:
+  /**
+   * Delete one node
+   * @param node node to be deleted
+   */
+
+  void deleteNode(Graph::NodeId node);
+
+  // /@}
+
+
+  /** @name Observers Management
+   *  Managing communication with the observers: subscribe, unsubscribe.
+   */
+  // /@{
+
+  /**
+   * Attach a new observer to this Graph.
+   * As a subscriber, the observer will be warned of all the changes.
+   */
+  void registerObserver(GraphObserver* observer);
+  /**
+   * Detach an observer from this Graph.
+   * The observer will not be warned of changes anymore.
+   */
+  void unregisterObserver(GraphObserver* observer);
+  // /@}
+
+
+  /** @name Nodes Functions
+   *  These methodes of the graph concern the node management.
+   */
+  // /@{
+
+  template<typename T, bool is_const>
+  friend class NodesIteratorClass;
+
+  template<typename T, bool is_const>
+  friend class EdgesIteratorClass;
+
+  /*
+   * @brief builds iterator on all Nodes of the graph
+   *
+   */
+
+  std::unique_ptr<Graph::NodeIterator> allNodesIterator();
+  std::unique_ptr<Graph::NodeIterator> allNodesIterator() const;
+
+
+  /*
+   * @brief builds iterator on the neighbor nodes of a Node
+   *
+   */
+
+  std::unique_ptr<Graph::NodeIterator> outgoingNeighborNodesIterator(NodeId node);
+  std::unique_ptr<Graph::NodeIterator> outgoingNeighborNodesIterator(NodeId node) const;
+
+  /*
+   * @brief builds iterator on the neighbor nodes of a Node
+   *
+   */
+
+  std::unique_ptr<Graph::NodeIterator> incomingNeighborNodesIterator(NodeId node);
+  std::unique_ptr<Graph::NodeIterator> incomingNeighborNodesIterator(NodeId node) const;
+
+  /**
+   * Get the number of nodes in the graph.
+   */
+
+  size_t getNumberOfNodes() const;
+
+  /**
+   * Get the number of edges in the graph.
+   */
+
+  size_t getNumberOfEdges() const;
+
+  /**
+   * Get the degree of a node (ie the number of neighbors) in the graph.
+   * @param node the node one wants to count its neighbors
+   * @return the number of neighbors
+   */
+
+  size_t getDegree(Graph::NodeId node) const;
+
+  /**
+   * Says if  a node is a leaf (ie has at most one neighbor).
+   */
+
+  bool isLeaf(Graph::NodeId node) const;
+
+  /**
+   * Get the number of  neighbors  of a node in the graph.
+   * @param node the node one wants to count its neighbors
+   * @return the number of neighbors
+   */
+
+  size_t getNumberOfNeighbors(Graph::NodeId node) const;
+
+  /**
+   * Get the number of outgoing neighbors  of a node (ie the number of sons) in the graph.
+   * @param node the node one wants to count its sons
+   * @return the number of outgoing neighbors
+   */
+
+  size_t getNumberOfOutgoingNeighbors(Graph::NodeId node) const;
+
+  /**
+   * Get the number of incoming neighbors  of a node (ie the number of fathers) in the graph.
+   * @param node the node one wants to count its fathers
+   * @return the number of incoming neighbors
+   */
+
+  size_t getNumberOfIncomingNeighbors(Graph::NodeId node) const;
+
+  /**
+   * Get all the neighbors of a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the neighbors
+   */
+
+  std::vector<Graph::NodeId> getNeighbors(Graph::NodeId node) const;
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the outgoing neighbors
+   */
+  std::vector<Graph::NodeId> getOutgoingNeighbors(Graph::NodeId node) const;
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the incoming neighbors
+   */
+  std::vector<Graph::NodeId> getIncomingNeighbors(Graph::NodeId node) const;
+
+  /**
+   * Get the leaves of a graph, ie, nodes with only one neighbor,
+   * starting from a peculiar node.
+   * @param node the starting node
+   * @param maxDepth the maximum number of allowed depth.
+   * @return a vector containing the leaves
+   */
+  std::vector<Graph::NodeId> getLeavesFromNode(Graph::NodeId node, unsigned int maxDepth) const;
+
+  /**
+   * Get all leaves of a graph, ie, nodes with no son (or only one
+   * neighbor is not directet).
+   * @return a vector containing the leaves
+   */
+
+  std::vector<Graph::NodeId> getAllLeaves() const;
+  std::set<NodeId> getSetOfAllLeaves() const;
+
+  /**
+   * Get all the nodes.
+   * @return a vector containing the  nodes
+   */
+
+  std::vector<Graph::NodeId> getAllNodes() const;
+
+  /**
+   * Get all the inner nodes, ie, nodes with degree > 1.
+   * @return a vector containing the inner nodes
+   */
+
+  std::vector<Graph::NodeId> getAllInnerNodes() const;
+
+  /**
+   * Get nodes located at the extremities of an edge
+   *
+   * @return a pair of the IDs of the Nodes at each extremity of the edge
+   *        example : N1--E1-->N2; getNodes(E1) will return (N1,N2);
+   */
+  std::pair<Graph::NodeId, Graph::NodeId> getNodes(Graph::EdgeId edge) const;
+
+  /**
+   * Get node located at the top of an edge
+   *
+   * @return  the Node at the top the edge
+   *        example : N1--E1-->N2; getTop(E1) will return N1;
+   */
+
+  Graph::NodeId getTop(Graph::EdgeId edge) const;
+
+  /**
+   * Get node located at the bottom of an edge
+   *
+   * @return  the Node at the bottom the edge
+   *        example : N1--E1-->N2; getBottom(E1) will return N2;
+   */
+
+  Graph::NodeId getBottom(Graph::EdgeId edge) const;
+
+
+  // /@}
+
+  /** @name Topological Properties
+   *  These methodes check some topological properties.
+   */
+  // /@{
+
+  /**
+   * Is the graph a tree?
+   * @return false if a node is met more than one time browsing the graph
+   */
+
+  bool isTree() const;
+
+  /**
+   * Is the graph directed acyclic?
+   * @return true if an edge is met more than one time browsing the graph
+   */
+
+  bool isDA() const;
+
+  /**
+   * Orientates the graph hanging from the root
+   */
+
+  void orientate();
+
+  /**
+   * Is the graph directed?
+   * @return true the type of the graph is directed
+   */
+  bool isDirected() const;
+
+
+  /**
+   * Does the graph contain reciprocal relations such as A->B and B->A?
+   * @return true if one of them is seen in the structure
+   */
+  bool containsReciprocalRelations() const;
+
+
+  // /@}
+
+  /*
+   * @brief builds iterator on all Nodes of the graph
+   *
+   */
+
+  std::unique_ptr<EdgeIterator> allEdgesIterator();
+  std::unique_ptr<EdgeIterator> allEdgesIterator() const;
+
+  /*
+   * @brief builds iterator on the outgoing neighbor nodes of a Node
+   *
+   */
+
+  std::unique_ptr<EdgeIterator> outgoingEdgesIterator(NodeId node);
+  std::unique_ptr<EdgeIterator> outgoingEdgesIterator(NodeId node) const;
+
+  /*
+   * @brief builds iterator on the incoming neighbor nodes of a Node
+   *
+   */
+
+  std::unique_ptr<EdgeIterator> incomingEdgesIterator(NodeId node);
+  std::unique_ptr<EdgeIterator> incomingEdgesIterator(NodeId node) const;
+
+  /**
+   * Get all the edges to/from a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the edges
+   */
+
+  std::vector<Graph::EdgeId> getEdges(Graph::NodeId node) const;
+
+  /**
+   * In an directed graph, get all the edges which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the outgoing edges
+   */
+  std::vector<Graph::EdgeId> getOutgoingEdges(Graph::NodeId node) const;
+
+  /**
+   * In an directed graph, get all the edges which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the incoming edges
+   */
+  std::vector<Graph::EdgeId> getIncomingEdges(Graph::NodeId node) const;
+
+  /**
+   * Returns the Edge between two nodes
+   * @param nodeA if directed, origin node
+   * @param nodeB if directed, destination node
+   * @return the edge between these two nodes
+   */
+
+  Graph::EdgeId getEdge(Graph::NodeId nodeA, Graph::NodeId nodeB) const;
+
+  /**
+   * Returns the Edge between two nodes, trying both directions
+   * @param nodeA any node implied in the relation
+   * @param nodeB any other node implied in the relation
+   * @return the edge between these two nodes
+   */
+
+  Graph::EdgeId getAnyEdge(Graph::NodeId nodeA, Graph::NodeId nodeB) const;
+
+  /**
+   * Get all edges of a graph.
+   * @return a vector containing the edges
+   */
+
+  std::vector<Graph::EdgeId> getAllEdges() const;
+
+  // /@}
+
+
+  /** @name Updating the changes on the observers
+   *  These methodes aim to trigger some changes to the observers
+   */
+  // /@{
+
+  /**
+   * Trigger E objects deleting on the observers
+   * @param edgesToDelete list of edges to delete
+   */
+
+  void notifyDeletedEdges(const std::vector<Graph::EdgeId>& edgesToDelete) const;
+
+  /**
+   * Trigger N objects deleting on the observers
+   * @param nodesToDelete list of edges to delete
+   */
+  void notifyDeletedNodes(const std::vector<Graph::NodeId>& nodesToDelete) const;
+
+
+  // /@}
+
+  /**
+   * Output the graph in DOT format
+   * @param out a ostream where the DOT format will be output
+   * @param name a string naming the graph
+   */
+
+  void outputToDot(std::ostream& out, const std::string& name) const;
+
+  template<class N, class E, class GraphImpl>
+  friend class AssociationGraphImplObserver;
+};
+
+
+/************************************************/
+/************************************************/
+/************************************************/
+/* ITERATORS */
+/************************************************/
+
+/************************************************/
+/* NODES ITERATORS */
+/************************************************/
+
+template<class T, bool is_const>
+class NodesIteratorClass :
+  virtual public Graph::NodeIterator
+{
+  ~NodesIteratorClass<T, is_const>(){}
+};
+
+
+template<bool is_const>
+class NodesIteratorClass<Graph::ALLGRAPHITER, is_const> :
+  virtual public Graph::NodeIterator
+{
+private:
+  typedef typename std::conditional<is_const,
+                                    GlobalGraph::nodeStructureType::const_iterator,
+                                    GlobalGraph::nodeStructureType::iterator >::type itType;
+
+  itType it_,  begin_, end_;
+
+public:
+  template<bool B = is_const>
+  NodesIteratorClass<Graph::ALLGRAPHITER, is_const>(const GlobalGraph &gg, typename std::enable_if<B>::type * = 0) : it_(gg.nodeStructure_.begin()),
+    begin_(gg.nodeStructure_.begin()),
+    end_(gg.nodeStructure_.end()) {}
+
+  template<bool B = is_const>
+  NodesIteratorClass<Graph::ALLGRAPHITER, is_const>(GlobalGraph & gg, typename std::enable_if<!B>::type * = 0) : it_(gg.nodeStructure_.begin()),
+    begin_(gg.nodeStructure_.begin()),
+    end_(gg.nodeStructure_.end()) {}
+
+  ~NodesIteratorClass<Graph::ALLGRAPHITER, is_const>(){}
+
+  void next() { it_++; }
+  bool end() const { return it_ == end_;  }
+  void start() { it_ = begin_; }
+
+  Graph::NodeId operator*() {return it_->first; }
+};
+
+
+/**
+ * @brief Abstract class for neighbor iterators
+ *
+ **/
+
+template<bool is_const>
+class NeighborIteratorClass
+{
+protected:
+  typedef typename std::conditional<is_const,
+                                    const std::map<GlobalGraph::Node, GlobalGraph::Edge>&,
+                                    std::map<GlobalGraph::Node, GlobalGraph::Edge>&>::type mapType;
+
+  mapType map_;
+
+  typedef typename std::conditional<is_const,
+                                    std::map<GlobalGraph::Node, GlobalGraph::Edge>::const_iterator,
+                                    std::map<GlobalGraph::Node, GlobalGraph::Edge>::iterator>::type itType;
+
+  itType it_, begin_, end_;
+
+public:
+  virtual ~NeighborIteratorClass<is_const>(){}
+
+  template<bool B = is_const>
+  NeighborIteratorClass<is_const>(const std::map<GlobalGraph::Node, GlobalGraph::Edge> &map, typename std::enable_if<B>::type * = 0) :
+    map_(map),
+    it_(map_.begin()),
+    begin_(map_.begin()),
+    end_(map_.end()) {}
+
+  template<bool B = is_const>
+  NeighborIteratorClass<is_const>(std::map<GlobalGraph::Node, GlobalGraph::Edge> &map, typename std::enable_if<!B>::type * = 0) :
+    map_(map),
+    it_(map_.begin()),
+    begin_(map_.begin()),
+    end_(map_.end()) {}
+
+  void next() { it_++; }
+  bool end() const { return it_ == end_;  }
+  void start() { it_ = begin_; }
+};
+
+
+/**
+ * @brief
+ *
+ **/
+
+template<bool is_const>
+class NodesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const> :
+  virtual public NeighborIteratorClass<is_const>,
+  virtual public Graph::NodeIterator
+{
+public:
+  NodesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const>(const GlobalGraph &gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.first) {}
+
+  NodesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const>(GlobalGraph & gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.first) {}
+
+  ~NodesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const>(){}
+
+  void next() { NeighborIteratorClass<is_const>::next(); }
+  bool end() const { return NeighborIteratorClass<is_const>::end(); }
+  void start() { NeighborIteratorClass<is_const>::start(); }
+
+  Graph::NodeId operator*() {return NeighborIteratorClass<is_const>::it_->first; }
+};
+
+
+template<bool is_const>
+class NodesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const> :
+  virtual public NeighborIteratorClass<is_const>,
+  virtual public Graph::NodeIterator
+{
+public:
+  NodesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const>(const GlobalGraph &gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.second) {}
+
+  NodesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const>(GlobalGraph & gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.second) {}
+
+  ~NodesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const>(){}
+
+  void next() { NeighborIteratorClass<is_const>::next(); }
+  bool end() const { return NeighborIteratorClass<is_const>::end(); }
+  void start() { NeighborIteratorClass<is_const>::start(); }
+
+  Graph::NodeId operator*() {return NeighborIteratorClass<is_const>::it_->first; }
+};
+
+
+/************************************************/
+/* EDGES ITERATORS */
+/************************************************/
+
+template<class T, bool is_const>
+class EdgesIteratorClass :
+  virtual public Graph::EdgeIterator
+{};
+
+template<bool is_const>
+class EdgesIteratorClass<Graph::ALLGRAPHITER, is_const> :
+  virtual public Graph::EdgeIterator
+{
+private:
+  typedef typename std::conditional<is_const,
+                                    GlobalGraph::edgeStructureType::const_iterator,
+                                    GlobalGraph::edgeStructureType::iterator >::type itType;
+
+  itType it_, begin_, end_;
+
+public:
+  template<bool B = is_const>
+  EdgesIteratorClass<Graph::ALLGRAPHITER, is_const>(const GlobalGraph &gg, typename std::enable_if<B>::type * = 0) : it_(gg.edgeStructure_.begin()),
+    begin_(gg.edgeStructure_.begin()),
+    end_(gg.edgeStructure_.end()) {}
+
+  template<bool B = is_const>
+  EdgesIteratorClass<Graph::ALLGRAPHITER, is_const>(GlobalGraph & gg, typename std::enable_if<!B>::type * = 0) : it_(gg.edgeStructure_.begin()),
+    begin_(gg.edgeStructure_.begin()),
+    end_(gg.edgeStructure_.end()) {}
+
+  ~EdgesIteratorClass<Graph::ALLGRAPHITER, is_const>(){}
+
+  void next() { it_++; }
+  bool end() const { return it_ == end_;  }
+  void start() { it_ = begin_; }
+
+  Graph::EdgeId operator*() {return it_->first; }
+};
+
+
+template<bool is_const>
+class EdgesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const> :
+  public NeighborIteratorClass<is_const>,
+  public Graph::EdgeIterator
+{
+public:
+  EdgesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const>(const GlobalGraph &gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.first) {}
+
+  EdgesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const>(GlobalGraph & gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.first) {}
+
+  ~EdgesIteratorClass<Graph::OUTGOINGNEIGHBORITER, is_const>(){}
+
+  void next() { NeighborIteratorClass<is_const>::next(); }
+  bool end() const { return NeighborIteratorClass<is_const>::end(); }
+  void start() { NeighborIteratorClass<is_const>::start(); }
+
+  Graph::EdgeId operator*() {return NeighborIteratorClass<is_const>::it_->second; }
+};
+
+template<bool is_const>
+class EdgesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const> :
+  public NeighborIteratorClass<is_const>,
+  public Graph::EdgeIterator
+{
+public:
+  EdgesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const>(const GlobalGraph &gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.second) {}
+
+  EdgesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const>(GlobalGraph & gg, GlobalGraph::NodeId node) : NeighborIteratorClass<is_const>(gg.nodeStructure_.find(node)->second.second) {}
+
+  ~EdgesIteratorClass<Graph::INCOMINGNEIGHBORITER, is_const>(){}
+
+  void next() { NeighborIteratorClass<is_const>::next(); }
+  bool end() const { return NeighborIteratorClass<is_const>::end(); }
+  void start() { NeighborIteratorClass<is_const>::start(); }
+
+  Graph::EdgeId operator*() {return NeighborIteratorClass<is_const>::it_->second; }
+};
+}
+
+#endif
diff --git a/src/Bpp/Graph/Graph.h b/src/Bpp/Graph/Graph.h
new file mode 100644
index 0000000..23301a6
--- /dev/null
+++ b/src/Bpp/Graph/Graph.h
@@ -0,0 +1,582 @@
+//
+// File Graph.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _GRAPH_H_
+#define _GRAPH_H_
+
+#include <set>
+#include <map>
+#include <string>
+#include <vector>
+#include <utility>
+#include <iostream>
+#include <algorithm>
+#include <memory>
+
+
+// forward declaration to avoid circular dependancies.
+// since we do not need its size in this header file (only using pointers to it)
+namespace bpp
+{
+class GraphObserver;
+}
+
+namespace bpp
+{
+class Graph
+{
+public:
+  typedef unsigned int NodeId;
+  typedef unsigned int EdgeId;
+
+
+  virtual ~Graph(){}
+
+protected:
+  /**
+   * set the root node to an existing node. Will not affect the topology.
+   * @param newRoot the new root
+   */
+
+  virtual void setRoot(NodeId newRoot) = 0;
+
+public:
+  /**
+   * get the root node
+   */
+
+  virtual NodeId getRoot() const = 0;
+
+  /**
+   * Make the graph directed
+   * - changes the property
+   * - de-duplicate the relations:
+   *  eg: A - B in undirected is represented as A->B and B->A
+   *  in directed, becomes A->B only
+   *
+   * Please note that the resulting directions are totaly arbritrary.
+   * One might consider to use the makeLocalRoot method.
+   */
+
+  virtual void makeDirected() = 0;
+
+  /**
+   * Make the graph directed
+   * - changes the property
+   * - de-duplicate the relations:
+   *    eg: A - B in directed is represented as A->B
+   *        in undirected, becomes A->B and B->A
+   * If the directed graph already contains reciprocal relations,
+   * such as A->B and B->A, the method will throw an exception.
+   */
+
+  virtual void makeUndirected() = 0;
+
+  // /@}
+
+
+  /** @name Relations management
+   *  Modificating the structure of the graph.
+   */
+  // /@{
+
+  /**
+   * Creates an orphaned node.
+   * @return the index of the new node
+   */
+
+  virtual NodeId createNode() = 0;
+
+  /**
+   * Creates a node linked to an existing node.
+   * @param origin existing node. In a directed graph: origin -> newNode.
+   * @return the index of the new node
+   */
+
+  virtual NodeId createNodeFromNode(NodeId origin) = 0;
+
+  /**
+   * Creates new node on an existing Edge. A -> B will be A -> N -> B
+   * @param edge existing edge.
+   * @return the index of the new node
+   */
+  virtual NodeId createNodeOnEdge(NodeId edge) = 0;
+
+
+  /**
+   * Creates a node linked to new node, splitting an edge.
+   * @param origin existing edge. In a directed graph: origin -> newNode.
+   * @return the index of the new node
+   */
+
+  virtual NodeId createNodeFromEdge(NodeId origin) = 0;
+
+protected:
+  /**
+   * Creates a link between two existing nodes. If directed graph: nodeA -> nodeB.
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @return the index of the new edge
+   */
+
+  virtual EdgeId link(NodeId nodeA, NodeId nodeB) = 0;
+
+  /**
+   * Sets a link between two existing nodes, using existing edge. If
+   * directed graph: nodeA -> nodeB.
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @param edgeID the used edge
+   */
+
+  virtual void link(Graph::NodeId nodeA, Graph::NodeId nodeB, Graph::EdgeId edgeID) = 0;
+
+  /**
+   * Remove all links between two existing nodes. If directed graph: nodeA -> nodeB.
+   * @param nodeA source node (or first node if undirected)
+   * @param nodeB target node (or second node if undirected)
+   * @return vector of IDs to de-assigned edges
+   */
+
+  virtual std::vector<EdgeId> unlink(NodeId nodeA, NodeId nodeB) = 0;
+
+public:
+  /**
+   * Delete one node
+   * @param node node to be deleted
+   */
+
+  virtual void deleteNode(NodeId node) = 0;
+
+  // /@}
+
+  /** @name Observers Management
+   *  Managing communication with the observers: subscribe, unsubscribe.
+   */
+  // /@{
+
+  /**
+   * Attach a new observer to this Graph.
+   * As a subscriber, the observer will be warned of all the changes.
+   */
+
+  virtual void registerObserver(GraphObserver* observer) = 0;
+
+  /**
+   * Detach an observer from this Graph.
+   * The observer will not be warned of changes anymore.
+   */
+
+  virtual void unregisterObserver(GraphObserver* observer) = 0;
+
+// /@}
+
+  /** @name Nodes Functions
+   *  These methodes of the graph concern the node management.
+   */
+  // /@{
+
+  /**
+   * @name Iterator interface on Nodes
+   *
+   */
+
+  class NodeIterator
+  {
+public:
+    virtual ~NodeIterator() {}
+
+    virtual void next() = 0;
+    virtual bool end() const = 0;
+    virtual void start() = 0;
+
+    virtual NodeId operator*() = 0;
+  };
+
+  /**
+   * @brief define categories of iterators
+   *
+   */
+
+  struct ALLGRAPHITER {};
+  struct OUTGOINGNEIGHBORITER {};
+  struct INCOMINGNEIGHBORITER {};
+
+  /*
+   * @brief builds iterator on all Nodes of the graph
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> allNodesIterator() = 0;
+
+  virtual std::unique_ptr<NodeIterator> allNodesIterator() const = 0;
+
+  /*
+   * @brief builds iterator on the outgoing neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> outgoingNeighborNodesIterator(NodeId node) = 0;
+
+  /*
+   * @brief builds iterator on the incoming neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<NodeIterator> incomingNeighborNodesIterator(NodeId node) = 0;
+
+
+  /**
+   * Get the number of nodes in the graph.
+   */
+
+  virtual size_t getNumberOfNodes() const = 0;
+
+  /**
+   * Get the number of edges in the graph.
+   */
+
+  virtual size_t getNumberOfEdges() const = 0;
+
+  /**
+   * Get the degree of a node (ie the number of neighbors) in the graph.
+   * @param node the node one wants to count its neighbors
+   * @return the number of neighbors
+   */
+
+  virtual size_t getDegree(NodeId node) const = 0;
+
+  /**
+   * Says if  a node is a leaf (ie has at most one neighbor).
+   */
+
+  virtual bool isLeaf(NodeId node) const = 0;
+
+  /**
+   * Get the number of neighbors  of a node in the graph.
+   * @param node the node one wants to count its sons
+   * @return the number of neighbors
+   */
+
+  virtual size_t getNumberOfNeighbors(NodeId node) const = 0;
+
+  /**
+   * Get the number of outgoing neighbors  of a node (ie the number of sons) in the graph.
+   * @param node the node one wants to count its sons
+   * @return the number of outgoing neighbors
+   */
+
+  virtual size_t getNumberOfOutgoingNeighbors(NodeId node) const = 0;
+
+  /**
+   * Get the number of incoming neighbors  of a node (ie the number of fathers) in the graph.
+   * @param node the node one wants to count its fathers
+   * @return the number of incoming neighbors
+   */
+
+  virtual size_t getNumberOfIncomingNeighbors(const NodeId node) const = 0;
+
+  /**
+   * Get all the neighbors of a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the ID of the  neighbors
+   */
+
+  virtual std::vector<NodeId> getNeighbors(const NodeId node) const = 0;
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the ID of the  outgoing neighbors
+   */
+
+  virtual std::vector<NodeId> getOutgoingNeighbors(const NodeId node) const = 0;
+
+  /**
+   * In an directed graph, get all the neighbors which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its neighbors
+   * @return a vector containing the incoming neighbors
+   */
+
+  virtual std::vector<NodeId> getIncomingNeighbors(NodeId node) const = 0;
+
+  /**
+   * Get the leaves of a graph, ie, nodes with only one neighbor,
+   * starting from a peculiar node.
+   * @param node the starting node
+   * @param maxDepth the maximum number of allowed depth.
+   * @return a vector containing the leaves
+   */
+
+  virtual std::vector<NodeId> getLeavesFromNode(NodeId node, unsigned int maxDepth) const = 0;
+
+  /**
+   * Get all leaves of a graph, ie, nodes with no son (or only one
+   * neighbor is not directet).
+   * @return a vector containing the leaves
+   */
+
+  virtual std::vector<NodeId> getAllLeaves() const = 0;
+
+  virtual std::set<NodeId> getSetOfAllLeaves() const = 0;
+
+  /**
+   * Get all the inner nodes, ie, nodes with degree > 1.
+   * @return a vector containing the nodes
+   */
+
+  virtual std::vector<NodeId> getAllInnerNodes() const = 0;
+
+  /**
+   * Get all the nodes.
+   * @return a vector containing the nodes
+   */
+
+  virtual std::vector<NodeId> getAllNodes() const = 0;
+
+  /**
+   * Get nodes located at the extremities of an edge
+   *
+   * @return a pair of the Nodes at each extremity of the edge
+   *        example : N1--E1-->N2; getNodes(E1) will return (N1,N2);
+   */
+
+  virtual std::pair<NodeId, NodeId> getNodes(EdgeId edge) const = 0;
+
+  /**
+   * Get node located at the top of an edge
+   *
+   * @return  the Node at the top the edge
+   *        example : N1--E1-->N2; getTop(E1) will return N1;
+   */
+
+  virtual NodeId getTop(EdgeId edge) const = 0;
+
+  /**
+   * Get node located at the bottom of an edge
+   *
+   * @return  the Node at the bottom the edge
+   *        example : N1--E1-->N2; getBottom(E1) will return N2;
+   */
+
+  virtual NodeId getBottom(EdgeId edge) const = 0;
+
+  // /@}
+
+  /** @name Topological Properties
+   *  These methodes check some topological properties.
+   */
+  // /@{
+
+  /**
+   * Is the graph a tree?
+   * @return false if a node is met more than one time browsing the graph
+   */
+
+  virtual bool isTree() const = 0;
+
+  /**
+   * Is the graph directed acyclic?
+   * @return true if an edge is met more than one time browsing the graph
+   */
+
+  virtual bool isDA() const = 0;
+
+
+  /**
+   * Orientates the graph hanging from the root
+   */
+
+  virtual void orientate() = 0;
+
+  /**
+   * Is the graph directed?
+   * @return true the type of the graph is directed
+   */
+
+  virtual bool isDirected() const = 0;
+
+
+  /**
+   * Does the graph contain reciprocal relations such as A->B and B->A?
+   * @return true if one of them is seen in the structure
+   */
+
+  virtual bool containsReciprocalRelations() const = 0;
+
+
+  // /@}
+
+
+  /** @name Edge Functions
+   *  These methodes of the graph concern the edges.
+   */
+  // /@{
+
+  /**
+   * @name Iterator interface on Nodes
+   *
+   */
+
+  class EdgeIterator
+  {
+public:
+    virtual ~EdgeIterator() {}
+
+    virtual void next() = 0;
+    virtual bool end() const = 0;
+    virtual void start() = 0;
+
+    virtual EdgeId operator*() = 0;
+  };
+
+
+  /*
+   * @brief builds iterator on all Nodes of the graph
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> allEdgesIterator() = 0;
+
+  /*
+   * @brief builds iterator on the outgoing neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> outgoingEdgesIterator(NodeId node) = 0;
+
+  /*
+   * @brief builds iterator on the incoming neighbor nodes of a Node
+   *
+   */
+
+  virtual std::unique_ptr<EdgeIterator> incomingEdgesIterator(NodeId node) = 0;
+
+  /**
+   * Get all the edges to/from a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the ID of the  edges
+   */
+
+  virtual std::vector<EdgeId> getEdges(const NodeId node) const = 0;
+
+  /**
+   * In an directed graph, get all the edges which
+   * are leaving a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the ID of the outgoing edges
+   */
+
+  virtual std::vector<EdgeId> getOutgoingEdges(const NodeId node) const = 0;
+
+  /**
+   * In an directed graph, get all the edges which
+   * are coming to a node in the graph.
+   * @param node the node one wants to get its edges
+   * @return a vector containing the incoming edges
+   */
+
+  virtual std::vector<EdgeId> getIncomingEdges(NodeId node) const = 0;
+
+  /**
+   * Get all edges of a graph.
+   * @return a vector containing the edges
+   */
+
+  virtual std::vector<EdgeId> getAllEdges() const = 0;
+
+  /**
+   * Returns the Edge between two nodes
+   * @param nodeA if directed, origin node
+   * @param nodeB if directed, destination node
+   * @return the edge between these two nodes
+   */
+
+  virtual EdgeId getEdge(NodeId nodeA, NodeId nodeB) const = 0;
+
+  /**
+   * Returns the Edge between two nodes, trying both directions
+   * @param nodeA any node implied in the relation
+   * @param nodeB any other node implied in the relation
+   * @return the edge between these two nodes
+   */
+
+  virtual EdgeId getAnyEdge(NodeId nodeA, NodeId nodeB) const = 0;
+
+  // /@}
+
+protected:
+  /** @name Updating the changes on the observers
+   *  These methodes aim to trigger some changes to the observers
+   */
+
+  // /@{
+
+  /**
+   * Trigger E objects deleting on the observers
+   * @param edgesToDelete list of edges to delete
+   */
+  virtual void notifyDeletedEdges(const std::vector<EdgeId>& edgesToDelete) const = 0;
+
+  /**
+   * Trigger N objects deleting on the observers
+   * @param nodesToDelete list of edges to delete
+   */
+  virtual void notifyDeletedNodes(const std::vector<NodeId>& nodesToDelete) const = 0;
+
+
+  // /@}
+
+public:
+  /**
+   * Output the graph in DOT format
+   * @param out a ostream where the DOT format will be output
+   * @param name a string naming the graph
+   */
+
+  virtual void outputToDot(std::ostream& out, const std::string& name) const = 0;
+
+  template<class N, class E, class GraphImpl>
+  friend class AssociationGraphImplObserver;
+};
+}
+
+#endif
diff --git a/src/Bpp/Seq/AlphabetIndex/AlphabetIndex1.h b/src/Bpp/Graph/GraphObserver.h
similarity index 56%
rename from src/Bpp/Seq/AlphabetIndex/AlphabetIndex1.h
rename to src/Bpp/Graph/GraphObserver.h
index 8eb2602..c1b8180 100644
--- a/src/Bpp/Seq/AlphabetIndex/AlphabetIndex1.h
+++ b/src/Bpp/Graph/GraphObserver.h
@@ -1,16 +1,14 @@
 //
-// File: AlphabetIndex1.h
-// Created by: Julien Dutheil
-// Created on: Mon Feb 21 17:42 2005
+// File GraphObserver.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
 //
 
 /*
    Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-   Julien.Dutheil at univ-montp2.fr
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
 
    This software is governed by the CeCILL  license under French law and
    abiding by the rules of distribution of free software.  You can  use,
@@ -39,61 +37,62 @@
    knowledge of the CeCILL license and that you accept its terms.
  */
 
-#ifndef _ALPHABETINDEX1_H_
-#define _ALPHABETINDEX1_H_
+#ifndef _GRAPHOBSERVER_HPP_
+#define _GRAPHOBSERVER_HPP_
+
+#include "Graph.h"
+
+#include "../Exceptions.h"
+#include "../Clonable.h"
 
-#include "../Alphabet/Alphabet.h"
-#include <Bpp/Clonable.h>
+#include <vector>
+#include <map>
+#include <iostream>
+#include <ostream>
 
-// From the STL:
-#include <string>
 
 namespace bpp
 {
 /**
- * @brief One dimensionnal alphabet index interface.
+ * @brief Defines a Graph Observer. It is a template which follows
+ * (subscribed to) a Graph.
+ * The graph and the graph observer communicate to keep them up-to-date
+ * each other. The observer is also an actor, since it can change
+ * the structure of the observed Graph.
  *
- * Derivatives of this interface implement properties for a single state.
+ * @author Thomas Bigot
  */
-class AlphabetIndex1 :
+
+// interface
+
+class GraphObserver :
   public virtual Clonable
 {
 public:
-  AlphabetIndex1() {}
-  virtual ~AlphabetIndex1() {}
-
-public:
-  virtual AlphabetIndex1* clone() const = 0;
-  
-  /**
-   * @brief Get the index associated to a state.
-   *
-   * @param state The state to consider, as a int value.
-   * @return The index associated to the state
+  /** @name Function called by the subjectGraph
+   *  Methods called by the subject graph to make this observer so fit the subject graph
    */
-  virtual double getIndex(int state) const = 0;
+  // /@{
 
   /**
-   * @brief Get the index associated to a state.
-   *
-   * @param state The state to consider, as a string value.
-   * @return The index associated to the state
+   * Delete unused object edges, since they have been deleted in the graph
+   * @param edgesToDelete a vector of Edges to delete
    */
-  virtual double getIndex(const std::string& state) const = 0;
+  virtual void deletedEdgesUpdate(const std::vector< unsigned int >& edgesToDelete) = 0;
 
   /**
-   * @brief Get the alphabet associated to this index.
-   *
-   * @return Alphabet The alphabet associated to this index.
+   * Delete unused object nodes, since they have been deleted in the graph
+   * @param nodesToDelete a vector of N to delete
    */
-  virtual const Alphabet* getAlphabet() const = 0;
+  virtual void deletedNodesUpdate(const std::vector< unsigned int >& nodesToDelete) = 0;
 
-  /**
-   * @return A vector object with all indices.
-   */
-  virtual std::vector<double>* getIndexVector() const = 0;
+  // /@}
 };
-} // end of namespace bpp.
+}
+
+#else
 
-#endif // _ALPHABETINDEX1_H_
+namespace bpp
+{class GraphObserver; }
 
+#endif
diff --git a/src/Bpp/Graph/TreeGraph.h b/src/Bpp/Graph/TreeGraph.h
new file mode 100644
index 0000000..c791507
--- /dev/null
+++ b/src/Bpp/Graph/TreeGraph.h
@@ -0,0 +1,201 @@
+//
+// File TreeGraph.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 25
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+#ifndef _TREEGRAPH_H_
+#define _TREEGRAPH_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <ostream>
+
+
+#include "Graph.h"
+
+#include "../Exceptions.h"
+#include "../Numeric/VectorTools.h"
+
+namespace bpp
+{
+class TreeGraph :
+  public virtual Graph
+{
+public:
+  /**
+   * Is the graph a tree? A tree must be acyclic and with no isolated node.
+   * @return true if valid tree
+   */
+  virtual bool isValid() const = 0;
+
+  /**
+   * Get the father node of a node in a rooted tree
+   * @return the father node
+   */
+
+  virtual Graph::NodeId getFather(Graph::NodeId nodeid) const = 0;
+
+  /**
+   * Get the branch leading to the father in a rooted tree
+   * @return the branch between a node and its father
+   */
+
+  virtual Graph::EdgeId getEdgeToFather(Graph::NodeId node) const = 0;
+
+  /**
+   * Check if node has a father
+   */
+
+  virtual bool hasFather(Graph::NodeId node) const = 0;
+
+  /**
+   * Says if  a node is a leaf (ie has at most one neighbor).
+   */
+
+  virtual bool isLeaf(Graph::NodeId node) const = 0;
+
+  /**
+   * Get the leaves under a node
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  virtual std::vector<Graph::NodeId> getLeavesUnderNode(Graph::NodeId node) const = 0;
+
+  /**
+   * Get the sons node of a node
+   */
+
+  virtual std::vector<Graph::NodeId> getSons(Graph::NodeId node) const = 0;
+
+  /**
+   * Get the branches to the sons of a node
+   */
+
+  virtual std::vector<Graph::EdgeId> getBranches(Graph::NodeId node) const = 0;
+
+  /**
+   * Get a iterator on the sons node of a node
+   */
+
+  virtual std::unique_ptr<Graph::NodeIterator> sonsIterator(Graph::NodeId node) = 0;
+
+  /**
+   * Get a iterator on the branches to sons of a node
+   */
+
+  virtual std::unique_ptr<Graph::EdgeIterator> branchesIterator(Graph::NodeId node) = 0;
+
+  /**
+   * @brief Get the number of sons node
+   */
+
+  virtual size_t getNumberOfSons(Graph::NodeId node) const = 0;
+
+  /**
+   * set the father node of a node in a rooted tree
+   */
+
+  virtual void setFather(Graph::NodeId node, Graph::NodeId fatherNode) = 0;
+
+  virtual void setFather(Graph::NodeId node, Graph::NodeId fatherNode, Graph::EdgeId edgeId) = 0;
+
+  /**
+   * Add a son to a node in a rooted tree
+   */
+
+  virtual void addSon(Graph::NodeId node, Graph::NodeId sonNode) = 0;
+
+  virtual void addSon(Graph::NodeId node, Graph::NodeId sonNode, Graph::EdgeId edgeId) = 0;
+
+  /**
+   * Remove all the sons
+   */
+
+  std::vector<Graph::NodeId> removeSons(Graph::NodeId node);
+
+  /**
+   * Remove one son
+   */
+
+  virtual void removeSon(Graph::NodeId node, Graph::NodeId son) = 0;
+
+  /**
+   * Re-root the tree with the new root
+   */
+
+  virtual void rootAt(Graph::NodeId newRoot) = 0;
+
+  /**
+   * Set the tree to its flat unrooted version.
+   * As an algorithmical convenience, a root node is kept, but it has
+   * no logical significance.
+   */
+
+  virtual void unRoot(bool joinRootSons) = 0;
+
+  /**
+   * Set a node as a new outgroup in a rooted tree, will make a root between
+   * the given node and its father.
+   */
+
+  virtual void setOutGroup(Graph::NodeId newOutGroup) = 0;
+
+  /**
+   * Get all the nodes of a subtree
+   */
+
+  virtual std::vector<Graph::NodeId> getSubtreeNodes(Graph::NodeId localRoot) const = 0;
+
+  /**
+   * Get all the branches of a subtree
+   */
+
+  virtual std::vector<Graph::EdgeId> getSubtreeEdges(Graph::NodeId localRoot) const = 0;
+
+  // ///FROM TREETOOLS & TREETOOLS COMPAT
+
+
+  virtual std::vector<Graph::NodeId> getNodePathBetweenTwoNodes(Graph::NodeId nodeA, Graph::NodeId nodeB, bool includeAncestor = true) const = 0;
+  virtual std::vector<Graph::EdgeId> getEdgePathBetweenTwoNodes(Graph::NodeId nodeA, Graph::NodeId nodeB) const = 0;
+};
+}
+
+
+#endif
diff --git a/src/Bpp/Graph/TreeGraphImpl.h b/src/Bpp/Graph/TreeGraphImpl.h
new file mode 100644
index 0000000..c51bf1e
--- /dev/null
+++ b/src/Bpp/Graph/TreeGraphImpl.h
@@ -0,0 +1,593 @@
+//
+// File TreeGraphImpl.h
+// Created by: Thomas Bigot
+// Last modification : vendredi 4 novembre 2016, à 10h 21
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _TREEGRAPH_IMPL_H_
+#define _TREEGRAPH_IMPL_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <ostream>
+
+
+#include "TreeGraph.h"
+#include "GlobalGraph.h"
+
+#include "../Exceptions.h"
+#include "../Numeric/VectorTools.h"
+
+namespace bpp
+{
+template<class GraphImpl>
+class TreeGraphImpl :
+  public virtual TreeGraph,
+  public GraphImpl
+{
+private:
+  /**
+   * Is the graph a tree? Set to false when structure is modified, true after validation.
+   */
+  mutable bool isValid_;
+
+  // unvalidate the tree
+  void topologyHasChanged_() const;
+
+  // will throw an exception if the tree is not valid
+  void mustBeValid_() const;
+
+  // will throw an exception if the tree is not rooted
+  void mustBeRooted_() const;
+
+  // test the validity of the tree
+  bool validate_() const;
+
+  /**
+   * Reorient all the edges starting from a node:
+   * the father node becomes a son, and so on.
+   */
+  void propagateDirection_(Graph::NodeId node);
+
+  // recursive function for getSubtreeNodes
+  void fillSubtreeMetNodes_(std::vector<Graph::NodeId>& metNodes, Graph::NodeId localRoot) const;
+
+  // recursive function for getSubtreeEdges
+  void fillSubtreeMetEdges_(std::vector<Graph::EdgeId>& metEdges, Graph::NodeId localRoot) const;
+
+  // recursive function for getLeavesUnderNode
+  void fillListOfLeaves_(Graph::NodeId startingNode, std::vector<Graph::NodeId>& foundLeaves) const;
+
+public:
+  TreeGraphImpl();
+
+  TreeGraphImpl(bool rooted = true);
+
+  /**
+   * Is the graph a tree? A tree must be acyclic and with no isolated node.
+   * @return true if valid tree
+   */
+  bool isValid() const;
+
+  /**
+   * Is the tree rooted?
+   *
+   * @return true if rooted, ie is directed.
+   */
+
+  bool isRooted() const;
+
+  /**
+   * Get the father node of a node in a rooted tree
+   * @return the father node
+   */
+
+  Graph::NodeId getFather(Graph::NodeId nodeid) const;
+
+  /**
+   * Get the branch leading to the father in a rooted tree
+   * @return the branch between a node and its father
+   */
+
+  Graph::EdgeId getEdgeToFather(Graph::NodeId node) const;
+
+  /**
+   * Check if node has a father
+   */
+
+  bool hasFather(Graph::NodeId node) const;
+
+  /**
+   * Says if  a node is a leaf (ie has at most one neighbor).
+   */
+
+  bool isLeaf(Graph::NodeId node) const;
+
+  /**
+   * Get the leaves under a node
+   * @param node the starting node
+   * @return a vector containing the leaves
+   */
+
+  std::vector<Graph::NodeId> getLeavesUnderNode(Graph::NodeId node) const;
+
+  /**
+   * Get the sons node of a node
+   */
+
+  std::vector<Graph::NodeId> getSons(Graph::NodeId node) const;
+
+  /**
+   * Get the branches to the sons node of a node
+   */
+
+  std::vector<Graph::EdgeId> getBranches(Graph::NodeId node) const;
+
+  /**
+   * Get a iterator on the sons node of a node
+   */
+
+  std::unique_ptr<Graph::NodeIterator> sonsIterator(Graph::NodeId node);
+
+  /**
+   * Get a iterator on the branches to sons of a node
+   */
+
+  std::unique_ptr<Graph::EdgeIterator> branchesIterator(Graph::NodeId node);
+
+  /**
+   * @brief Get the number of sons node
+   */
+
+  size_t getNumberOfSons(Graph::NodeId node) const;
+
+  /**
+   * set the father node of a node in a rooted tree
+   */
+
+  void setFather(Graph::NodeId node, Graph::NodeId fatherNode);
+  void setFather(Graph::NodeId node, Graph::NodeId fatherNode, Graph::EdgeId edgeId);
+
+  /**
+   * Add a son to a node in a rooted tree
+   */
+
+  void addSon(Graph::NodeId node, Graph::NodeId sonNode);
+
+  void addSon(Graph::NodeId node, Graph::NodeId sonNode, Graph::EdgeId edgeId);
+
+  /**
+   * Remove all the sons
+   */
+
+  std::vector<Graph::NodeId> removeSons(Graph::NodeId node);
+
+  /**
+   * Remove one son
+   */
+
+  void removeSon(Graph::NodeId node, Graph::NodeId son);
+
+  /**
+   * Re-root the tree with the new root
+   */
+
+  void rootAt(Graph::NodeId newRoot);
+
+  /**
+   * Set the tree to its flat unrooted version.
+   * As an algorithmical convenience, a root node is kept, but it has
+   * no logical significance.
+   */
+
+  void unRoot(bool joinRootSons);
+
+  /**
+   * Set a node as a new outgroup in a rooted tree, will make a root between
+   * the given node and its father.
+   */
+
+  void setOutGroup(Graph::NodeId newOutGroup);
+
+  /**
+   * Get all the nodes of a subtree
+   */
+
+  std::vector<Graph::NodeId> getSubtreeNodes(Graph::NodeId localRoot) const;
+
+  /**
+   * Get all the branches of a subtree
+   */
+
+  std::vector<Graph::EdgeId> getSubtreeEdges(Graph::NodeId localRoot) const;
+
+  // ///FROM TREETOOLS & TREETOOLS COMPAT
+
+
+  std::vector<Graph::NodeId> getNodePathBetweenTwoNodes(Graph::NodeId nodeA, Graph::NodeId nodeB, bool includeAncestor = true) const;
+  std::vector<Graph::EdgeId> getEdgePathBetweenTwoNodes(Graph::NodeId nodeA, Graph::NodeId nodeB) const;
+};
+
+
+/******************/
+
+typedef TreeGraphImpl<GlobalGraph> TreeGlobalGraph;
+
+/*****************/
+
+
+template<class GraphImpl>
+TreeGraphImpl<GraphImpl>::TreeGraphImpl(bool rooted) :
+  GraphImpl(rooted),
+  isValid_(false)
+{}
+
+
+template<class GraphImpl>
+bool TreeGraphImpl<GraphImpl>::isValid() const
+{
+  return isValid_ || validate_();
+}
+
+template<class GraphImpl>
+Graph::NodeId TreeGraphImpl<GraphImpl>::getFather(Graph::NodeId node) const
+{
+  std::vector<Graph::NodeId> incomers = getIncomingNeighbors(node);
+  if (incomers.size() > 1)
+    throw Exception("TreeGraphImpl<GraphImpl>::getFather: more than one father for Node " + TextTools::toString(node) + " : " + VectorTools::paste(incomers, ",") + ". Should never happen since validity has been controled. Please report this bug.");
+  if (incomers.size() == 0)
+    throw Exception("TreeGraphImpl<GraphImpl>::getFather: node " + TextTools::toString(node) + " has no father.");
+  return *incomers.begin();
+}
+
+template<class GraphImpl>
+Graph::EdgeId TreeGraphImpl<GraphImpl>::getEdgeToFather(Graph::NodeId node) const
+{
+  Graph::NodeId father = getFather(node);
+  return GraphImpl::getEdge(father, node);
+}
+
+template<class GraphImpl>
+bool TreeGraphImpl<GraphImpl>::hasFather(Graph::NodeId node) const
+{
+  return GraphImpl::getNumberOfIncomingNeighbors(node) >= 1;
+}
+
+template<class GraphImpl>
+bool TreeGraphImpl<GraphImpl>::isLeaf(Graph::NodeId node) const
+{
+  return (!GraphImpl::isDirected() && GraphImpl::getNumberOfOutgoingNeighbors(node) <= 1)
+         || (GraphImpl::isDirected() && GraphImpl::getNumberOfOutgoingNeighbors(node) == 0);
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::fillListOfLeaves_(Graph::NodeId startingNode, std::vector<Graph::NodeId>& foundLeaves) const
+{
+  const std::vector<Graph::NodeId> sons = getSons(startingNode);
+  if (sons.size() > 1)
+  {
+    for (std::vector<Graph::NodeId>::const_iterator currNeighbor = sons.begin(); currNeighbor != sons.end(); currNeighbor++)
+    {
+      fillListOfLeaves_(*currNeighbor, foundLeaves);
+    }
+  }
+  else
+  {
+    foundLeaves.push_back(startingNode);
+  }
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> TreeGraphImpl<GraphImpl>::getLeavesUnderNode(Graph::NodeId node) const
+{
+  std::vector<Graph::NodeId> foundLeaves;
+  fillListOfLeaves_(node, foundLeaves);
+
+  return foundLeaves;
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::mustBeRooted_() const
+{
+  if (!isRooted())
+    throw Exception("TreeGraphImpl<GraphImpl>: The tree must be rooted.");
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::mustBeValid_() const
+{
+  if (!isValid())
+    throw Exception("TreeGraphImpl<GraphImpl>: The tree is not valid.");
+}
+
+template<class GraphImpl>
+bool TreeGraphImpl<GraphImpl>::isRooted() const
+{
+  return GraphImpl::isDirected();
+}
+
+template<class GraphImpl>
+bool TreeGraphImpl<GraphImpl>::validate_() const
+{
+  isValid_ = GraphImpl::isTree();
+  return isValid_;
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::topologyHasChanged_() const
+{
+  isValid_ = false;
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::rootAt(Graph::NodeId newRoot)
+{
+  if (!isValid())
+    throw Exception("TreeGraphImpl::rootAt: Tree is not Valid.");
+
+  GraphImpl::makeDirected();
+  // set the new root on the Graph
+  GraphImpl::setRoot(newRoot);
+  // change edge direction between the new node and the former one
+  propagateDirection_(newRoot);
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::propagateDirection_(Graph::NodeId node)
+{
+  if (hasFather(node))
+  {
+    NodeId father = getFather(node);
+    propagateDirection_(father);
+    GraphImpl::switchNodes(father, node);
+  }
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::setFather(Graph::NodeId node, Graph::NodeId fatherNode)
+{
+  if (hasFather(node))
+    GraphImpl::unlink(getFather(node), node);
+  GraphImpl::link(fatherNode, node);
+  topologyHasChanged_();
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::setFather(Graph::NodeId node, Graph::NodeId fatherNode, Graph::EdgeId edgeId)
+{
+  if (hasFather(node))
+    GraphImpl::unlink(getFather(node), node);
+  GraphImpl::link(fatherNode, node, edgeId);
+  topologyHasChanged_();
+}
+
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::addSon(Graph::NodeId node, Graph::NodeId sonNode)
+{
+  GraphImpl::link(node, sonNode);
+  topologyHasChanged_();
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::addSon(Graph::NodeId node, Graph::NodeId sonNode, Graph::EdgeId edgeId)
+{
+  GraphImpl::link(node, sonNode, edgeId);
+  topologyHasChanged_();
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::unRoot(bool joinRootSons)
+{
+  if (joinRootSons)
+  {
+    // the root must have exactly two joinRootSons
+    std::vector<Graph::NodeId> sons = getSons(GraphImpl::getRoot());
+    if (sons.size() != 2)
+      throw Exception("The root must have two sons to join them.");
+    GraphImpl::unlink(GraphImpl::getRoot(), sons.at(0));
+    GraphImpl::unlink(GraphImpl::getRoot(), sons.at(1));
+    GraphImpl::link(sons.at(0), sons.at(1));
+    GraphImpl::setRoot(sons.at(0));
+  }
+  GraphImpl::makeUndirected();
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> TreeGraphImpl<GraphImpl>::getSons(Graph::NodeId node) const
+{
+  return GraphImpl::getOutgoingNeighbors(node);
+}
+
+template<class GraphImpl>
+std::vector<Graph::EdgeId> TreeGraphImpl<GraphImpl>::getBranches(Graph::NodeId node) const
+{
+  return GraphImpl::getOutgoingEdges(node);
+}
+
+template<class GraphImpl>
+std::unique_ptr<Graph::NodeIterator> TreeGraphImpl<GraphImpl>::sonsIterator(Graph::NodeId node)
+{
+  return GraphImpl::outgoingNeighborNodesIterator(node);
+}
+
+template<class GraphImpl>
+std::unique_ptr<Graph::EdgeIterator> TreeGraphImpl<GraphImpl>::branchesIterator(Graph::NodeId node)
+{
+  return GraphImpl::outgoingEdgesIterator(node);
+}
+
+template<class GraphImpl>
+size_t TreeGraphImpl<GraphImpl>::getNumberOfSons(Graph::NodeId node) const
+{
+  return GraphImpl::getNumberOfOutgoingNeighbors(node);
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> TreeGraphImpl<GraphImpl>::removeSons(Graph::NodeId node)
+{
+  std::vector<Graph::NodeId> sons = getSons(node);
+  for (std::vector<Graph::NodeId>::iterator currSon = sons.begin(); currSon != sons.end(); currSon++)
+  {
+    removeSon(node, *currSon);
+  }
+  return sons;
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::removeSon(Graph::NodeId node, Graph::NodeId son)
+{
+  GraphImpl::unlink(node, son);
+  topologyHasChanged_();
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::setOutGroup(Graph::NodeId newOutGroup)
+{
+  mustBeRooted_();
+  deleteNode(GraphImpl::getRoot());
+
+  Graph::NodeId newRoot = GraphImpl::createNodeFromEdge(getEdge(getFather(newOutGroup), newOutGroup));
+  rootAt(newRoot);
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> TreeGraphImpl<GraphImpl>::getNodePathBetweenTwoNodes(Graph::NodeId nodeA, Graph::NodeId nodeB, bool includeAncestor) const
+{
+  GraphImpl::nodeMustExist_(nodeA);
+  GraphImpl::nodeMustExist_(nodeB);
+  std::vector<Graph::NodeId> path;
+  std::vector<Graph::NodeId> pathMatrix1;
+  std::vector<Graph::NodeId> pathMatrix2;
+
+  Graph::NodeId nodeUp = nodeA;
+  while (hasFather(nodeUp))
+  {
+    pathMatrix1.push_back(nodeUp);
+    nodeUp = getFather(nodeUp);
+  }
+  pathMatrix1.push_back(nodeUp); // The root.
+
+  nodeUp = nodeB;
+  while (hasFather(nodeUp))
+  {
+    pathMatrix2.push_back(nodeUp);
+    nodeUp = getFather(nodeUp);
+  }
+  pathMatrix2.push_back(nodeUp); // The root.
+  // Must check that the two nodes have the same root!!!
+
+  size_t tmp1 = pathMatrix1.size();
+  size_t tmp2 = pathMatrix2.size();
+
+  while ((tmp1 > 0) && (tmp2 > 0))
+  {
+    if (pathMatrix1[tmp1 - 1] != pathMatrix2[tmp2 - 1])
+      break;
+    tmp1--; tmp2--;
+  }
+  // (tmp1 - 1) and (tmp2 - 1) now point toward the first non-common nodes
+
+  for (size_t y = 0; y < tmp1; ++y)
+  {
+    path.push_back(pathMatrix1[y]);
+  }
+  if (includeAncestor) // FIXME: one of the extremities may be the ancestor!!!
+    path.push_back(pathMatrix1[tmp1]);                                            // pushing once, the Node that was common to both.
+  for (size_t j = tmp2; j > 0; --j)
+  {
+    path.push_back(pathMatrix2[j - 1]);
+  }
+  return path;
+}
+
+template<class GraphImpl>
+std::vector<Graph::EdgeId> TreeGraphImpl<GraphImpl>::getEdgePathBetweenTwoNodes(Graph::NodeId nodeA, Graph::NodeId nodeB) const
+{
+  std::vector<Graph::EdgeId> path;
+  std::vector<Graph::NodeId> pathNodes = getNodePathBetweenTwoNodes(nodeA, nodeB, true);
+  for (size_t currNodeNr = 0; currNodeNr + 1 < pathNodes.size(); currNodeNr++)
+  {
+    path.push_back(GraphImpl::getAnyEdge(pathNodes.at(currNodeNr), pathNodes.at(currNodeNr + 1)));
+  }
+  return path;
+}
+
+template<class GraphImpl>
+std::vector<Graph::NodeId> TreeGraphImpl<GraphImpl>::getSubtreeNodes(Graph::NodeId localRoot) const
+{
+  mustBeValid_();
+  std::vector<Graph::EdgeId> metNodes;
+  fillSubtreeMetNodes_(metNodes, localRoot);
+  return metNodes;
+}
+
+template<class GraphImpl>
+std::vector<Graph::EdgeId> TreeGraphImpl<GraphImpl>::getSubtreeEdges(Graph::NodeId localRoot) const
+{
+  mustBeValid_();
+  std::vector<Graph::EdgeId> metEdges;
+  fillSubtreeMetEdges_(metEdges, localRoot);
+  return metEdges;
+}
+
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::fillSubtreeMetNodes_(std::vector<Graph::NodeId>& metNodes, Graph::NodeId localRoot) const
+{
+  metNodes.push_back(localRoot);
+  std::vector<Graph::NodeId> sons = GraphImpl::getOutgoingNeighbors(localRoot);
+  for (std::vector<Graph::NodeId>::iterator currSon = sons.begin(); currSon != sons.end(); currSon++)
+  {
+    fillSubtreeMetNodes_(metNodes, *currSon);
+  }
+}
+
+template<class GraphImpl>
+void TreeGraphImpl<GraphImpl>::fillSubtreeMetEdges_(std::vector<Graph::EdgeId>& metEdges, Graph::NodeId localRoot) const
+{
+  std::vector<Graph::EdgeId> edgesToSons = GraphImpl::getOutgoingEdges(localRoot);
+  for (std::vector<Graph::EdgeId>::iterator currEdgeToSon = edgesToSons.begin(); currEdgeToSon != edgesToSons.end(); currEdgeToSon++)
+  {
+    metEdges.push_back(*currEdgeToSon);
+    fillSubtreeMetEdges_(metEdges, GraphImpl::getBottom(*currEdgeToSon));
+  }
+}
+}
+
+
+#endif
diff --git a/src/Bpp/Graphics/AbstractGraphicDevice.h b/src/Bpp/Graphics/AbstractGraphicDevice.h
new file mode 100644
index 0000000..6f2e629
--- /dev/null
+++ b/src/Bpp/Graphics/AbstractGraphicDevice.h
@@ -0,0 +1,112 @@
+//
+// File: AbstractGraphicDevice.h
+// Created by: Julien Dutheil
+// Created on: Fri Jul 24 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 16, 2006)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ABSTRACTGRAPHICDEVICE_H_
+#define _ABSTRACTGRAPHICDEVICE_H_
+
+#include "GraphicDevice.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Partial implementation of the GraphicDevice interface.
+ *
+ * Implement this interface to support new formats.
+ */
+class AbstractGraphicDevice:
+  public virtual GraphicDevice
+{
+  private:
+    double xUnit_;
+    double yUnit_;
+    RGBColor fgColor_;
+    RGBColor bgColor_;
+    Font font_;
+    unsigned int pointSize_;
+    short lineType_;
+    int currentLayer_;
+
+  public:
+    AbstractGraphicDevice(): xUnit_(1.), yUnit_(1.),
+        fgColor_(0, 0, 0), bgColor_(0, 0, 0), font_(), pointSize_(1), lineType_(LINE_SOLID), currentLayer_(-1) 
+    {}
+
+    virtual ~AbstractGraphicDevice() {}
+
+  public:
+    void setXUnit(double xu) { xUnit_ = xu; }
+    void setYUnit(double yu) { yUnit_ = yu; }
+    double getXUnit() const { return xUnit_; }
+    double getYUnit() const { return yUnit_; }
+
+    void setCurrentForegroundColor(const RGBColor& color) { fgColor_ = color; }
+    void setCurrentBackgroundColor(const RGBColor& color) { bgColor_ = color; }
+    void setCurrentFont(const Font& font) { font_ = font; }
+    void setCurrentPointSize(unsigned int size) { pointSize_ = size; }
+    void setCurrentLineType(short type) throw (Exception)
+    { 
+      if       (type == LINE_SOLID) lineType_ = type;
+      else if (type == LINE_DASHED) lineType_ = type;
+      else if (type == LINE_DOTTED) lineType_ = type;
+      else throw Exception("AbstractGraphicDevice::setCurrentLineType. Unknown line type: " + TextTools::toString(type));
+    }
+    void setCurrentLayer(int layerIndex) { currentLayer_ = layerIndex; }
+
+    const RGBColor& getCurrentForegroundColor() const { return fgColor_; }
+    const RGBColor& getCurrentBackgroundColor() const { return bgColor_; }
+    const Font& getCurrentFont() const { return font_; }
+    unsigned int getCurrentPointSize() const { return pointSize_; }
+    short getCurrentLineType() const { return lineType_; }
+    int getCurrentLayer() const { return currentLayer_; }
+ 
+
+  protected:
+    double x_(double x) const { return x * xUnit_; }
+    double y_(double y) const { return y * yUnit_; }
+
+    double revx_(double x) const { return x / xUnit_; }
+    double revy_(double y) const { return y / yUnit_; }
+
+};
+
+} //end of namespace bpp;
+
+#endif //_ABSTRACTGRAPHICDEVICE_H_
+
diff --git a/src/Bpp/Graphics/ColorManager.h b/src/Bpp/Graphics/ColorManager.h
new file mode 100644
index 0000000..7666026
--- /dev/null
+++ b/src/Bpp/Graphics/ColorManager.h
@@ -0,0 +1,191 @@
+//
+// File: ColorManager.h
+// Created by: Julien Dutheil
+// Created on: Mon May 08 2006
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _COLORMANAGER_H_
+#define _COLORMANAGER_H_
+
+#include "RgbColor.h"
+#include "ColorTools.h"
+#include "../Text/TextTools.h"
+
+// From the STL:
+#include <vector>
+
+namespace bpp
+{
+
+  /**
+   * @brief Associate special colors to a code.
+   *
+   * Instances of this interface are used in some vector format.
+   */
+  template<class CodeType>
+    class ColorManager
+    {
+      public:
+        ColorManager() {}
+        virtual ~ColorManager() {}
+
+      public:
+
+        /**
+         * @param color The color to look for.
+         * @return The code associated to a given color.
+         */
+        virtual CodeType getCode(const RGBColor& color) = 0;
+
+        /**
+         * @param code The code to look for.
+         * @return The color associated to a given code.
+         * @throw exception if the code is not valid.
+         */
+        virtual const RGBColor& getColor(CodeType& code) const throw (Exception) = 0;
+
+        /**
+         * @return All valid codes.
+         */
+        virtual const std::vector<CodeType>& getCodes() const = 0;
+
+        /**
+         * @return All available colors.
+         */
+        virtual const std::vector<RGBColor>& getColors() const = 0;
+
+        /**
+         * @return The total number of colors available.
+         */
+        virtual size_t getNumberOfColors() const = 0;
+    };
+
+
+
+
+
+  /**
+   * @brief Color manager for the XFig format.
+   *
+   * Default colors are coded from 0 to 31.
+   * New colors may be added from code 32.
+   */
+  class XFigColorManager:
+    public ColorManager<unsigned int>
+  {
+    protected:
+      unsigned int currentCode_;
+      std::vector<RGBColor> colors_;
+      std::vector<unsigned int> codes_;
+
+    public:
+      XFigColorManager():
+        currentCode_(31),
+        colors_(),
+        codes_()
+    {
+      // Add "official" color codes, from 0 to 31:
+      codes_.push_back(0); colors_.push_back(ColorTools::BLACK);
+      codes_.push_back(1); colors_.push_back(ColorTools::BLUE);
+      codes_.push_back(2); colors_.push_back(ColorTools::GREEN);
+      codes_.push_back(3); colors_.push_back(ColorTools::CYAN);
+      codes_.push_back(4); colors_.push_back(ColorTools::RED);
+      codes_.push_back(5); colors_.push_back(ColorTools::MAGENTA);
+      codes_.push_back(6); colors_.push_back(ColorTools::YELLOW);
+      codes_.push_back(7); colors_.push_back(ColorTools::WHITE);
+      codes_.push_back(8); colors_.push_back(RGBColor(0,0,140));
+      codes_.push_back(9); colors_.push_back(RGBColor(0,0,173));
+      codes_.push_back(10); colors_.push_back(RGBColor(0,0,206));
+      codes_.push_back(11); colors_.push_back(RGBColor(132,207,205));
+      codes_.push_back(12); colors_.push_back(RGBColor(0,142,0));
+      codes_.push_back(13); colors_.push_back(RGBColor(0,174,0));
+      codes_.push_back(14); colors_.push_back(RGBColor(0,207,0));
+      codes_.push_back(15); colors_.push_back(RGBColor(0,142,140));
+      codes_.push_back(16); colors_.push_back(RGBColor(0,174,173));
+      codes_.push_back(17); colors_.push_back(RGBColor(0,207,206));
+      codes_.push_back(18); colors_.push_back(RGBColor(140,0,0));
+      codes_.push_back(19); colors_.push_back(RGBColor(173,0,0));
+      codes_.push_back(20); colors_.push_back(RGBColor(206,0,0));
+      codes_.push_back(21); colors_.push_back(RGBColor(140,0,140));
+      codes_.push_back(22); colors_.push_back(RGBColor(173,0,173));
+      codes_.push_back(23); colors_.push_back(RGBColor(206,0,206));
+      codes_.push_back(24); colors_.push_back(RGBColor(132,48,0));
+      codes_.push_back(25); colors_.push_back(RGBColor(156,65,0));
+      codes_.push_back(26); colors_.push_back(RGBColor(189,97,0));
+      codes_.push_back(27); colors_.push_back(RGBColor(255,130,132));
+      codes_.push_back(28); colors_.push_back(RGBColor(255,158,156));
+      codes_.push_back(29); colors_.push_back(RGBColor(255,190,189));
+      codes_.push_back(30); colors_.push_back(RGBColor(255,223,222));
+      codes_.push_back(31); colors_.push_back(RGBColor(255,215,0));
+    }
+      virtual ~XFigColorManager() {}
+
+    public:
+      unsigned int getCode(const RGBColor & color)
+      {
+        for (unsigned int i = 0; i < colors_.size(); i++)
+        {
+          if (colors_[i] == color)
+          {
+            return codes_[i];
+          }
+        }
+        currentCode_++;
+        colors_.push_back(color);
+        codes_.push_back(currentCode_);
+        return currentCode_;
+      }
+      const RGBColor& getColor(unsigned int &code) const throw (Exception)
+      {
+        for(unsigned int i = 0; i < codes_.size(); i++)
+        {
+          if(codes_[i] == code)
+          {
+            return colors_[i];
+          }
+        }
+        throw Exception("XFigColorManager::getColor. No color associated to this code: " + TextTools::toString(code));
+      }
+      const std::vector<unsigned int>& getCodes() const { return codes_; }
+      const std::vector<RGBColor>& getColors() const { return colors_; }
+      size_t getNumberOfColors() const { return colors_.size(); }
+
+  };
+
+} // end of namespace bpp;
+
+#endif //_COLORMANAGER_H_
+
diff --git a/src/Bpp/Graphics/ColorSet.h b/src/Bpp/Graphics/ColorSet.h
new file mode 100644
index 0000000..df880c1
--- /dev/null
+++ b/src/Bpp/Graphics/ColorSet.h
@@ -0,0 +1,132 @@
+//
+// File: ColorSet.h
+// Created by: Julien Dutheil
+// Created on: Mon Apr 14 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2008)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _COLORSET_H_
+#define _COLORSET_H_
+
+#include "RgbColor.h"
+#include "../Utils/MapTools.h"
+
+// From the STL:
+#include <vector>
+
+namespace bpp
+{
+
+/**
+ * @brief Specify a set of color definitions.
+ */
+class ColorSet
+{
+  public:
+    ColorSet() {}
+    virtual ~ColorSet() {}
+
+  public:
+
+    /**
+     * @brief Get the color object corresponding to a given name.
+     *
+     * @param name The name of the color to look for.
+     * @return The color associated to the given name.
+     * @throw Exception if the name is not assigned to any color.
+     */
+    virtual const RGBColor& getColor(const std::string& name) const throw (Exception) = 0;
+
+    /**
+     * @brief Get the ith color object in the set.
+     *
+     * @param index The index of the color to look for.
+     * @return The color associated to the given index.
+     * @throw IndexOutOfBoundsException if the index is not assigned to any color.
+     */
+    virtual const RGBColor& getColor(unsigned int index) const throw (IndexOutOfBoundsException) = 0;
+
+    /**
+     * @return All valid color names.
+     */
+    virtual std::vector<std::string> getColorNames() const = 0;
+  
+    /**
+     * @return The total number of colors available.
+     */
+    virtual size_t getNumberOfColors() const = 0;
+};
+
+
+/**
+ * @brief Partial implementation of the ColorSet interface.
+ *
+ * Derivative classes just have to fill the colors_ map in the constructor of the class.
+ */
+class AbstractColorSet:
+  public ColorSet
+{
+  protected:
+    std::map<std::string, RGBColor> colors_;
+
+  public:
+    AbstractColorSet(): colors_() {}
+    virtual ~AbstractColorSet() {}
+
+  public:
+    const RGBColor& getColor(const std::string& name) const throw (Exception)
+    {
+      std::map<std::string, RGBColor>::const_iterator it = colors_.find(name);
+      if (it != colors_.end()) return it->second;
+      else throw Exception("AbstractColorSet::getColor(name): no color with name " + name);
+    }
+
+    const RGBColor& getColor(unsigned int index) const throw (IndexOutOfBoundsException)
+    {
+      if (index >= colors_.size()) throw IndexOutOfBoundsException("AbstractColorSet::getColor(index): invalid index.", index, 0, colors_.size() - 1);
+      std::map<std::string, RGBColor>::const_iterator it = colors_.begin();
+      for (unsigned int i = 0; i < index; i++) it++;
+      return it->second;
+    }
+    
+    std::vector<std::string> getColorNames() const { return MapTools::getKeys(colors_); }
+    
+    size_t getNumberOfColors() const { return colors_.size(); }
+};
+
+} // end of namespace bpp;
+
+#endif //_COLORSET_H_
+
diff --git a/src/Bpp/Graphics/ColorTools.cpp b/src/Bpp/Graphics/ColorTools.cpp
new file mode 100644
index 0000000..87cb73a
--- /dev/null
+++ b/src/Bpp/Graphics/ColorTools.cpp
@@ -0,0 +1,101 @@
+//
+// File: ColorTools.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Mar 16 2006
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "ColorTools.h"
+
+using namespace std;
+using namespace bpp;
+
+const RGBColor ColorTools::RED    = RGBColor(255,0,0);
+const RGBColor ColorTools::GREEN  = RGBColor(0,255,0);
+const RGBColor ColorTools::BLUE   = RGBColor(0,0,255);
+const RGBColor ColorTools::BLACK  = RGBColor(0,0,0);
+const RGBColor ColorTools::WHITE  = RGBColor(255,255,255);
+const RGBColor ColorTools::YELLOW = RGBColor(255,255,0);
+const RGBColor ColorTools::CYAN   = RGBColor(0,255,255);
+const RGBColor ColorTools::MAGENTA = RGBColor(255,0,255);
+const RGBColor ColorTools::ORANGE = RGBColor(255,127,0);
+
+/******************************************************************************/
+
+std::vector<RGBColor> ColorTools::gradient(unsigned int n, const RGBColor& low, const RGBColor& high) 
+{
+  vector<RGBColor> colors(n);
+  for (unsigned int i = 0; i < n - 1; ++i)
+  {
+    colors[i][0] = low[0] + static_cast<unsigned int>(
+        floor(
+          static_cast<double>(i) * static_cast<double>(static_cast<int>(high[0]) - static_cast<int>(low[0]))
+          / static_cast<double>(n - 1)
+          )
+        );
+    colors[i][1] = low[1] + static_cast<unsigned int>(
+        floor(
+          static_cast<double>(i) * static_cast<double>(static_cast<int>(high[1]) - static_cast<int>(low[1]))
+          / static_cast<double>(n - 1)
+          )
+        );
+    colors[i][2] = low[2] + static_cast<unsigned int>(
+        floor(
+          static_cast<double>(i) * static_cast<double>(static_cast<int>(high[2]) - static_cast<int>(low[2]))
+          / static_cast<double>(n - 1)
+          )
+        );
+  }
+  colors[n-1] = high;
+  return colors;
+}
+
+/******************************************************************************/
+
+std::vector<RGBColor> ColorTools::gradient(unsigned int n, const RGBColor & low, const RGBColor & mid, const RGBColor & high)
+{
+  unsigned int lower = n / 2;
+  unsigned int upper = n - lower;
+  vector<RGBColor> colors1 = gradient(lower, low, mid);
+  vector<RGBColor> colors2 = gradient(upper + 1, mid, high);
+  for (size_t i = 1; i < colors2.size(); i++)
+  {
+    colors1.push_back(colors2[i]);
+  }
+  return colors1;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Graphics/ColorTools.h b/src/Bpp/Graphics/ColorTools.h
new file mode 100644
index 0000000..79c8c30
--- /dev/null
+++ b/src/Bpp/Graphics/ColorTools.h
@@ -0,0 +1,133 @@
+//
+// File: ColorTools.h
+// Created by: Julien Dutheil
+// Created on: Thu Mar 16 2006
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _COLORTOOLS_H_
+#define _COLORTOOLS_H_
+
+#include "../Text/TextTools.h"
+#include "../Exceptions.h"
+#include "RgbColor.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Provide tools to deal with color objects.
+ */
+class ColorTools
+{
+  public:
+    ColorTools() {}
+    virtual ~ColorTools() {}
+
+  public:
+    /**
+     * @brief Create a set of colors according to a gradient defined by two extrema.
+     *
+     * @param n Number of colors to output.
+     * @param low First color in gradient.
+     * @param high Last color in gradient.
+     * @return A set of ordered colors defining a gradient.
+     */
+    static std::vector<RGBColor> gradient(unsigned int n, const RGBColor & low, const RGBColor & high);
+ 
+    /**
+     * @brief Create a set of colors according to a gradient defined by two extrema and a midpoint.
+     *
+     * @param n Number of colors to output.
+     * @param low First color in gradient.
+     * @param mid Midpoint color.
+     * @param high Last color in gradient.
+     * @return A set of ordered colors defining a gradient.
+     */
+    static std::vector<RGBColor> gradient(unsigned int n, const RGBColor & low, const RGBColor & mid, const RGBColor & high);
+    
+    /**
+     * @return A gray color.
+     * @param level Gray intensity ([0,1]).
+     */
+    static RGBColor gray(double level)
+    { 
+      unsigned int i = (unsigned int)round(255*level);
+      return RGBColor(i, i, i);
+    }
+
+    /**
+     * @brief Get a RGBColor from a cyan-magenta-yellow-key description.
+     *
+     * The following formula are used for the transformation:
+     * @f[
+     * \begin{array}{rcl}
+     * r &=& 255 * (1 - c)(1 - k)\\
+     * g &=& 255 * (1 - m)(1 - k)\\
+     * b &=& 255 * (1 - y)(1 - k)
+     * \end{array}
+     * @f]
+     *
+     * @param c Cyan proportion.
+     * @param m Magenta proportion.
+     * @param y Yellow proportion.
+     * @param k Black proportion.
+     * @return A RGBColor object.
+     */
+    static RGBColor cmyk2rgb(double c, double m, double y, double k)
+    {
+      unsigned int r = static_cast<unsigned int>(round(255 * (1. - c) * (1. - k)));
+      unsigned int g = static_cast<unsigned int>(round(255 * (1. - m) * (1. - k)));
+      unsigned int b = static_cast<unsigned int>(round(255 * (1. - y) * (1. - k)));
+      return RGBColor(r, g, b);
+    }
+ 
+  public:
+    static const RGBColor RED;
+    static const RGBColor GREEN;
+    static const RGBColor BLUE;
+    static const RGBColor BLACK;
+    static const RGBColor WHITE;
+    static const RGBColor YELLOW;
+    static const RGBColor CYAN;
+    static const RGBColor MAGENTA;
+    static const RGBColor ORANGE;
+    
+};
+
+} // end of namespace bpp.
+
+#endif //_COLORTOOLS_H_
+
diff --git a/src/Bpp/Seq/SiteIterator.h b/src/Bpp/Graphics/DefaultColorSet.h
similarity index 64%
copy from src/Bpp/Seq/SiteIterator.h
copy to src/Bpp/Graphics/DefaultColorSet.h
index efb427a..f7a60d3 100644
--- a/src/Bpp/Seq/SiteIterator.h
+++ b/src/Bpp/Graphics/DefaultColorSet.h
@@ -1,14 +1,14 @@
 //
-// File: SiteIterator.h
+// File: DefaultColorSet.h
 // Created by: Julien Dutheil
-// Created on: Sun Oct 19 12:47:16 2003
+// Created on: Mon Apr 14 2008
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2008)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,44 +37,38 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SITEITERATOR_H_
-#define _SITEITERATOR_H_
+#ifndef _DEFAULTCOLORSET_H_
+#define _DEFAULTCOLORSET_H_
 
-#include "Site.h"
+#include "ColorSet.h"
+#include "ColorTools.h"
 
 namespace bpp
 {
 
 /**
- * @brief Generic site iterator interface, allowing to loop over sites.
+ * @brief Default color definitions.
  */
-class SiteIterator
+class DefaultColorSet:
+  public AbstractColorSet
 {
-	public:
-		SiteIterator() {}
-		virtual ~SiteIterator() {}
-	
-	public:
-		virtual Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
-};
+  public:
+    DefaultColorSet()
+    {
+      colors_["black"]   = ColorTools::BLACK;
+      colors_["red"]     = ColorTools::RED;
+      colors_["green"]   = ColorTools::GREEN;
+      colors_["blue"]    = ColorTools::BLUE;
+      colors_["yellow"]  = ColorTools::YELLOW;
+      colors_["magenta"] = ColorTools::MAGENTA;
+      colors_["cyan"]    = ColorTools::CYAN;
+      colors_["white"]   = ColorTools::WHITE;
+    }
+    virtual ~DefaultColorSet() {}
 
-/**
- * @brief Generic const site iterator interface, allowing to loop over const sites.
- */
-class ConstSiteIterator
-{
-	public:
-		ConstSiteIterator() {}
-		virtual ~ConstSiteIterator() {}
-	
-	public:
-		virtual const Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
 };
 
+} // end of namespace bpp;
 
-} //end of namespace bpp.
-
-#endif	//_SITEITERATOR_H_
+#endif //_DEFAULTCOLORSET_H_
 
diff --git a/src/Bpp/Graphics/Fig/XFigGraphicDevice.cpp b/src/Bpp/Graphics/Fig/XFigGraphicDevice.cpp
new file mode 100644
index 0000000..fc0ce44
--- /dev/null
+++ b/src/Bpp/Graphics/Fig/XFigGraphicDevice.cpp
@@ -0,0 +1,194 @@
+//
+// File: XFigGraphicDevice.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Mar 03 2008
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "XFigGraphicDevice.h"
+
+using namespace bpp;
+using namespace std;
+
+const unsigned int XFigGraphicDevice::FONTFLAG_LATEX = 0;
+const unsigned int XFigGraphicDevice::FONTFLAG_POSTSCRIPT = 4;
+
+void XFigGraphicDevice::begin()
+{
+  content_.clear();
+}
+
+void XFigGraphicDevice::end()
+{
+  //Print to file:
+  //Header:
+  out_ << "#FIG 3.2 Produced by the Bio++ Graphic Device System" << endl;
+  out_ << "Portrait" << endl;
+  out_ << "Flush left" << endl;
+  out_ << "Metric" << endl;
+  out_ << "A4" << endl;
+  out_ << "100" << endl;
+  out_ << "Single" << endl;
+  out_ << "0" << endl;
+  //out << "254 2" << endl; // 1fig unit = 0.1mm
+  out_ << "72 2" << endl; // 1fig unit = 1pt
+
+  // Color definitions:
+  out_ << "#Color definitions:" << endl; 
+  vector<unsigned int> codes = colorManager_.getCodes();
+  vector<RGBColor> colors    = colorManager_.getColors();
+  for(unsigned int i = 32; i < colorManager_.getNumberOfColors(); i++)
+  {
+    string hexCode = colors[i].toHex();
+    out_ << "0 " << codes[i] << " " << hexCode << endl;
+  }
+
+  // Print content:
+  out_ << "#Drawing content:" << endl; 
+  for(unsigned int i = 0; i < content_.size(); i++)
+  {
+    out_ << content_[i] << endl;
+  }
+}
+
+void XFigGraphicDevice::setCurrentForegroundColor(const RGBColor& color)
+{
+  fgColorCode_ = colorManager_.getCode(color);
+  AbstractGraphicDevice::setCurrentForegroundColor(color);
+}
+
+void XFigGraphicDevice::setCurrentBackgroundColor(const RGBColor& color)
+{
+  bgColorCode_ = colorManager_.getCode(color);
+  AbstractGraphicDevice::setCurrentBackgroundColor(color);
+}
+
+void XFigGraphicDevice::setCurrentFont(const Font& font)
+{
+  if (fontFlag_ == FONTFLAG_LATEX)
+    fontCode_ = latexFontManager_.getCode(font);
+  else if (fontFlag_ == FONTFLAG_POSTSCRIPT)
+    fontCode_ = postscriptFontManager_.getCode(font);
+  else
+    fontCode_ = 0;
+  fontSize_ = font.getSize();
+  AbstractGraphicDevice::setCurrentFont(font); 
+}
+
+void XFigGraphicDevice::drawLine(double x1, double y1, double x2, double y2)
+{
+  ostringstream oss;
+  oss << "2 1 " << lineTypeCode_ << " " << getCurrentPointSize()
+      << " " << fgColorCode_
+      << " " << bgColorCode_
+      << " " << getCurrentLayer()
+      << " " << "-1 -1 -1 0 0 0 0 0 2" << endl;
+  oss << round(x_(x1)) << " " << round(y_(y1)) << endl;
+  oss << round(x_(x2)) << " " << round(y_(y2));
+  content_.push_back(oss.str());
+}
+ 
+void XFigGraphicDevice::drawRect(double x, double y, double width, double height, short fill)
+{
+  ostringstream oss;
+  oss << "2 2 0 " << getCurrentPointSize()
+      << " " << fgColorCode_
+      << " " << bgColorCode_
+      << " " << getCurrentLayer()
+      << " " << "-1"
+      << " " << getFillCode(fill) << " -1 0 0 0 0 0 5" << endl;
+  oss << round(x) << " " << round(y) << endl;
+  oss << round(x_(x + width)) << " " << round(y_(y)) << endl;
+  oss << round(x_(x + width)) << " " << round(y_(y + height)) << endl;
+  oss << round(x_(x)) << " " << round(y_(y + height)) << endl;
+  oss << round(x_(x)) << " " << round(y_(y));
+  content_.push_back(oss.str());
+}
+
+void XFigGraphicDevice::drawCircle(double x, double y, double radius, short fill)
+{
+  ostringstream oss;
+  oss << "1 3 0 " << getCurrentPointSize()
+      << " " << fgColorCode_
+      << " " << bgColorCode_
+      << " " << getCurrentLayer()
+      << " " << "-1"
+      << " " << getFillCode(fill) << " -1 1 0 "
+      << round(x_(x)) << " " << round(y_(y)) << " "
+      << round(x_(radius)) << " " << round(y_(radius)) << " "
+      << round(x_(x + radius)) << " " << round(y_(y)) << " "
+      << round(x_(x + radius)) << " " << round(y_(y)) << endl;
+  content_.push_back(oss.str());
+}
+
+void XFigGraphicDevice::drawText(double x, double y, const std::string& text, short hpos, short vpos, double angle) throw (UnvalidFlagException)
+{
+  int xrel = static_cast<int>(round(x_(x)));
+  short sub = 0;
+  if (hpos == TEXT_HORIZONTAL_LEFT)
+    sub = 0;
+  else if (hpos == TEXT_HORIZONTAL_CENTER) 
+    sub = 1;
+  else if (hpos == TEXT_HORIZONTAL_RIGHT)
+    sub = 2;
+  else throw UnvalidFlagException("XFigGraphicDevice::drawText(). Bad horizontal text alignment flag: " + TextTools::toString(hpos));
+  
+  int yrel = 0;
+  if (vpos == TEXT_VERTICAL_BOTTOM)
+    yrel = static_cast<int>(round(y_(y - 1.)));
+  else if (vpos == TEXT_VERTICAL_CENTER)
+    yrel = static_cast<int>(round(y + fontSize_ / 2 - 1)); 
+  else if (vpos == TEXT_VERTICAL_TOP)
+    yrel = static_cast<int>(round(y - fontSize_)); 
+  else throw UnvalidFlagException("XFigGraphicDevice::drawText(). Bad vertical text alignment flag: " + TextTools::toString(vpos));
+
+  ostringstream oss;
+  oss << "4 " << sub << " " << fgColorCode_ << " " << 50 << " " << -1 << " " << fontCode_ << " " << fontSize_ << " " 
+      << angle << " " << fontFlag_ << " " << -1 << " " << -1 << " " << xrel << " " << yrel << " " << text << "\\001";
+  content_.push_back(oss.str());
+}
+
+int XFigGraphicDevice::getFillCode(short fill)
+{
+  if (fill == FILL_EMPTY) return -1;
+  if (fill == FILL_FILLED) return 20;
+  if (fill == FILL_PATTERN)
+  {
+    //TODO: define a field names currentPattern_, etc.
+  }
+  //Temp:
+  return 20;
+}
+
diff --git a/src/Bpp/Graphics/Fig/XFigGraphicDevice.h b/src/Bpp/Graphics/Fig/XFigGraphicDevice.h
new file mode 100644
index 0000000..de91f69
--- /dev/null
+++ b/src/Bpp/Graphics/Fig/XFigGraphicDevice.h
@@ -0,0 +1,133 @@
+//
+// File: XFigGraphicDevice.h
+// Created by: Julien Dutheil
+// Created on: Mon Mar 03 2008
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _XFIGGRAPHICDEVICE_H_
+#define _XFIGGRAPHICDEVICE_H_
+
+#include "../AbstractGraphicDevice.h"
+#include "../ColorManager.h"
+#include "XFigLaTeXFontManager.h"
+#include "XFigPostscriptFontManager.h"
+
+// From the STL:
+#include <map>
+#include <iostream>
+
+namespace bpp
+{
+
+/**
+ * @brief XFig plotting format.
+ */
+class XFigGraphicDevice:
+  public AbstractGraphicDevice
+{
+  private:
+    std::ostream& out_;
+    std::vector<std::string> content_;
+    XFigColorManager colorManager_;
+    XFigLaTeXFontManager latexFontManager_;
+    XFigPostscriptFontManager postscriptFontManager_;
+    unsigned int fgColorCode_;
+    unsigned int bgColorCode_;
+    int fontCode_; 
+    unsigned int fontSize_;
+    unsigned int fontFlag_;
+    short lineTypeCode_;
+
+  public:
+    XFigGraphicDevice(std::ostream& out):
+      out_(out),
+      content_(),
+      colorManager_(),
+      latexFontManager_(),
+      postscriptFontManager_(),
+      fgColorCode_(0),
+      bgColorCode_(0),
+      fontCode_(-1),
+      fontSize_(12),
+      fontFlag_(FONTFLAG_POSTSCRIPT),
+      lineTypeCode_(LINE_SOLID)
+    {
+      setCurrentLayer(0);
+    }
+
+    virtual ~XFigGraphicDevice() {}
+
+  public:
+    void begin();
+    void end();
+
+    void setCurrentForegroundColor(const RGBColor& color);
+    void setCurrentBackgroundColor(const RGBColor& color);
+    void setCurrentFont(const Font& font);
+    void setCurrentLineType(short type) throw (Exception)
+    { 
+      if(type == LINE_SOLID) lineTypeCode_ = 0;
+      else if(type == LINE_DASHED) lineTypeCode_ = 1;
+      else if(type == LINE_DOTTED) lineTypeCode_ = 2;
+      else throw Exception("XFigGraphicDevice::setCurrentLineType. Unknown line type: " + TextTools::toString(type));
+      AbstractGraphicDevice::setCurrentLineType(type);
+    }
+    void drawLine(double x1, double y1, double x2, double y2);
+    void drawRect(double x, double y, double width, double height, short fill = FILL_EMPTY);
+    void drawCircle(double x, double y, double radius, short fill = FILL_EMPTY);
+    void drawText(double x, double y, const std::string& text, short hpos = TEXT_HORIZONTAL_LEFT, short vpos = TEXT_VERTICAL_BOTTOM, double angle = 0) throw (UnvalidFlagException);
+    void comment(const std::string& text)
+    {
+      content_.push_back("#" + text);
+    }
+
+    //Specific:
+    void setFontFlag(unsigned int flag) { fontFlag_ = flag; }
+
+  protected:
+    int getFillCode(short fill);
+
+  public:
+    static const unsigned int FONTFLAG_LATEX;
+    static const unsigned int FONTFLAG_POSTSCRIPT;
+
+};
+
+} // end of namespace bpp;
+
+#endif //_XFIGGRAPHICDEVICE_H_
+
+
diff --git a/test/test_alphabets.cpp b/src/Bpp/Graphics/Fig/XFigLaTeXFontManager.cpp
similarity index 65%
copy from test/test_alphabets.cpp
copy to src/Bpp/Graphics/Fig/XFigLaTeXFontManager.cpp
index bf5b346..05c7c53 100644
--- a/test/test_alphabets.cpp
+++ b/src/Bpp/Graphics/Fig/XFigLaTeXFontManager.cpp
@@ -1,14 +1,15 @@
 //
-// File: test_alphabets.cpp
+// File: XFigLaTeXFontManager.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Wed Dec 30 2009
+// From file: FontManager.h
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,29 +38,18 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
-#include <iostream>
+#include "XFigLaTeXFontManager.h"
 
 using namespace bpp;
-using namespace std;
 
-int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
-
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
-
-  return (0);
+XFigLaTeXFontManager::XFigLaTeXFontManager()
+{
+  // Add "official" font codes, from 0 to 5:
+  registerFont_(Font("Default", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 0);
+  registerFont_(Font("Roman", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 1);
+  registerFont_(Font("Bold", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 2);
+  registerFont_(Font("Italic", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 3);
+  registerFont_(Font("Sans Serif", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 4);
+  registerFont_(Font("Typewriter", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 5);
 }
+
diff --git a/src/Bpp/Seq/Io/IoSequenceStream.h b/src/Bpp/Graphics/Fig/XFigLaTeXFontManager.h
similarity index 72%
copy from src/Bpp/Seq/Io/IoSequenceStream.h
copy to src/Bpp/Graphics/Fig/XFigLaTeXFontManager.h
index 94e3af4..be73ba8 100644
--- a/src/Bpp/Seq/Io/IoSequenceStream.h
+++ b/src/Bpp/Graphics/Fig/XFigLaTeXFontManager.h
@@ -1,14 +1,15 @@
 //
-// File IOSequenceStream.h
-// Author: Sylvain Gaillard
-// Created: 19/08/2009
+// File: XFigLaTeXFontManager.h
+// Created by: Julien Dutheil
+// Created on: Wed Dec 30 2009
+// From file: FontManager.h
 //
 
 /*
-Copyright or © or Copr. CNRS, (August 19, 2009)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,30 +38,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCESTREAM_H_
-#define _IOSEQUENCESTREAM_H_
+#ifndef _XFIGLATEXFONTMANAGER_H_
+#define _XFIGLATEXFONTMANAGER_H_
 
-#include <Bpp/Io/IoFormat.h>
+#include "../Font/FontManager.h"
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequenceStream interface.
- *
- * Interface for streaming sequences.
- *
- * @author Sylvain Gaillard
+ * @brief LaTeX font manager for the XFig format.
  */
-class IOSequenceStream: public virtual IOFormat
+class XFigLaTeXFontManager:
+  public AbstractFontManager<int>
 {
-	public:
-		IOSequenceStream() {}
-		virtual ~IOSequenceStream() {}
+
+public:
+  XFigLaTeXFontManager();
+
+  virtual ~XFigLaTeXFontManager() {}
 
 };
 
-} //end of namespace bpp.
+} //end of namespace bpp;
 
-#endif	// _IOSEQUENCESTREAM_H_
+#endif //_XFIGLATEXFONTMANAGER_H_
 
diff --git a/src/Bpp/Graphics/Fig/XFigPostscriptFontManager.cpp b/src/Bpp/Graphics/Fig/XFigPostscriptFontManager.cpp
new file mode 100644
index 0000000..2bf11de
--- /dev/null
+++ b/src/Bpp/Graphics/Fig/XFigPostscriptFontManager.cpp
@@ -0,0 +1,85 @@
+//
+// File: XFigPostscriptFontManager.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Dec 30 2009
+// From file: FontManager.h
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "XFigPostscriptFontManager.h"
+
+using namespace bpp;
+
+XFigPostscriptFontManager::XFigPostscriptFontManager()
+{
+  // Add "official" font codes, from 0 to 34:
+  registerFont_(Font("Default", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), -1);
+  registerFont_(Font("Times", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 0); //Roman
+  registerFont_(Font("Times", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 1);
+  registerFont_(Font("Times", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 2);
+  registerFont_(Font("Times", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 3);
+  registerFont_(Font("AvantGarde", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 4); //Book
+  registerFont_(Font("AvantGarde", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 5); //Book Oblique
+  registerFont_(Font("AvantGarde", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 6); //Demi
+  registerFont_(Font("AvantGarde", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 7); //Demi Oblique
+  registerFont_(Font("Bookman", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 8); //Light
+  registerFont_(Font("Bookman", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 9); //Light Italic
+  registerFont_(Font("Bookman", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 10); //Demi
+  registerFont_(Font("Bookman", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 11); //Demi Italic
+  registerFont_(Font("Courier", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 12);
+  registerFont_(Font("Courier", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 13); //Oblique
+  registerFont_(Font("Courier", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 14); //Bold
+  registerFont_(Font("Courier", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 15); //Bold Oblique
+  registerFont_(Font("Helvetica", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 16);
+  registerFont_(Font("Helvetica", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 17); //Oblique
+  registerFont_(Font("Helvetica", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 18); //Bold
+  registerFont_(Font("Helvetica", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 19); //Bold Oblique
+  registerFont_(Font("Helvetica", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 20); //Narrow
+  registerFont_(Font("Helvetica", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 21); //Narrow Oblique
+  registerFont_(Font("Helvetica", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 22); //Narrow Bold
+  registerFont_(Font("Helvetica", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 23); //Narrow Bold Oblique
+  registerFont_(Font("New Century Schoolbook", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 24); //Roman
+  registerFont_(Font("New Century Schoolbook", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 25); //Italic
+  registerFont_(Font("New Century Schoolbook", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 26); //Bold
+  registerFont_(Font("New Century Schoolbook", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 27); //Bold Italic
+  registerFont_(Font("Palatino", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 28); //Roman
+  registerFont_(Font("Palatino", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 29); //Italic
+  registerFont_(Font("Palatino", Font::STYLE_NORMAL, Font::WEIGHT_BOLD, 12), 30); //Bold
+  registerFont_(Font("Palatino", Font::STYLE_ITALIC, Font::WEIGHT_BOLD, 12), 31); //Bold Italic
+  registerFont_(Font("Symbol", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 32);
+  registerFont_(Font("Zapf Chancery Medium", Font::STYLE_ITALIC, Font::WEIGHT_NORMAL, 12), 33); //Italic
+  registerFont_(Font("Zapf Dingbats", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12), 34);
+}
+
diff --git a/src/Bpp/Seq/Io/IoSequenceStream.h b/src/Bpp/Graphics/Fig/XFigPostscriptFontManager.h
similarity index 71%
copy from src/Bpp/Seq/Io/IoSequenceStream.h
copy to src/Bpp/Graphics/Fig/XFigPostscriptFontManager.h
index 94e3af4..d0ee0db 100644
--- a/src/Bpp/Seq/Io/IoSequenceStream.h
+++ b/src/Bpp/Graphics/Fig/XFigPostscriptFontManager.h
@@ -1,14 +1,15 @@
 //
-// File IOSequenceStream.h
-// Author: Sylvain Gaillard
-// Created: 19/08/2009
+// File: XFigPostscriptFontManager.h
+// Created by: Julien Dutheil
+// Created on: Wed Dec 30 2009
+// From file: FontManager.h
 //
 
 /*
-Copyright or © or Copr. CNRS, (August 19, 2009)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,30 +38,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCESTREAM_H_
-#define _IOSEQUENCESTREAM_H_
+#ifndef _XFIGPOSTSCRIPTFONTMANAGER_H_
+#define _XFIGPOSTSCRIPTFONTMANAGER_H_
 
-#include <Bpp/Io/IoFormat.h>
+#include "../Font/FontManager.h"
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequenceStream interface.
- *
- * Interface for streaming sequences.
- *
- * @author Sylvain Gaillard
+ * @brief Postscript font manager for the XFig format.
  */
-class IOSequenceStream: public virtual IOFormat
+class XFigPostscriptFontManager:
+  public AbstractFontManager<int>
 {
-	public:
-		IOSequenceStream() {}
-		virtual ~IOSequenceStream() {}
+
+public:
+  XFigPostscriptFontManager();
+  
+  virtual ~XFigPostscriptFontManager() {}
 
 };
 
-} //end of namespace bpp.
+} //end of namespace bpp;
 
-#endif	// _IOSEQUENCESTREAM_H_
+#endif //_XFIGPOSTSCRIPTFONTMANAGER_H_
 
diff --git a/src/Bpp/Seq/DistanceMatrix.cpp b/src/Bpp/Graphics/Font/Font.cpp
similarity index 73%
copy from src/Bpp/Seq/DistanceMatrix.cpp
copy to src/Bpp/Graphics/Font/Font.cpp
index c485203..3cfa410 100644
--- a/src/Bpp/Seq/DistanceMatrix.cpp
+++ b/src/Bpp/Graphics/Font/Font.cpp
@@ -1,13 +1,14 @@
 //
-// File: DistanceMatrix.cpp
-// Created on: Sat Feb 17 15:25 2007
+// File: Font.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Dec 30 2009
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for phylogenetic data analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -36,18 +37,20 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "DistanceMatrix.h"
-
-using namespace std;
+#include "Font.h"
 
 using namespace bpp;
 
-size_t DistanceMatrix::getNameIndex(const std::string& name) const throw (Exception)
+const short int Font::STYLE_NORMAL  = 0;
+const short int Font::STYLE_ITALIC  = 1;
+    
+const short int Font::WEIGHT_NORMAL = 0;
+const short int Font::WEIGHT_BOLD   = 1;
+
+void Font::init_()
 {
-  for (size_t i = 0; i < names_.size(); ++i)
-  {
-    if (names_[i] == name) return i;
-  }
-  throw Exception("DistanceMatrix::getNameIndex. Name not found: '" + name + "'.");
+  styleDesc_[STYLE_NORMAL] = "normal";
+  styleDesc_[STYLE_ITALIC] = "italic";
+  weightDesc_[WEIGHT_NORMAL] = "normal";
+  weightDesc_[WEIGHT_BOLD] = "bold";
 }
-
diff --git a/src/Bpp/Graphics/Font/Font.h b/src/Bpp/Graphics/Font/Font.h
new file mode 100644
index 0000000..2e8b8f8
--- /dev/null
+++ b/src/Bpp/Graphics/Font/Font.h
@@ -0,0 +1,174 @@
+//
+// File: Font.h
+// Created by: Julien Dutheil
+// Created on: Mon Mar 03 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FONT_H_
+#define _FONT_H_
+
+#include "../../Clonable.h"
+#include "../../Text/TextTools.h"
+
+//From the STL:
+#include <map>
+#include <string>
+
+namespace bpp
+{
+
+/**
+ * @brief Data structure for fonts.
+ */
+class Font:
+  public virtual Clonable
+{
+  private:
+    std::string family_;
+    short int style_;
+    short int weight_;
+    unsigned int size_;
+    mutable std::map<short int, std::string> styleDesc_;
+    mutable std::map<short int, std::string> weightDesc_;
+
+  public:
+    Font(const std::string& family = "Default", short int style = STYLE_NORMAL, short int weight = WEIGHT_NORMAL, unsigned int size = 12):
+      family_(family), style_(style), weight_(weight), size_(size), styleDesc_(), weightDesc_()
+    {
+      init_();
+    }
+
+    virtual ~Font() {}
+
+    Font* clone() const { return new Font(*this); }
+
+  private:
+    void init_();
+
+  public:
+    bool operator==(const Font& font) const
+    {
+      return family_ == font.family_
+          &&  style_ == font.style_
+          && weight_ == font.weight_;
+    }
+
+    /**
+     * @return The family component of this font.
+     */
+    const std::string& getFamily() const { return family_; }
+
+    /**
+     * @return The style component of this font.
+     */
+    const short int getStyle() const { return style_; }
+
+    /**
+     * @brief Alias function for getStyle.
+     * @return The shape component of this font.
+     */
+    const short int getShape() const { return style_; }
+
+    /**
+     * @return The weight component of this font.
+     */
+    const short int getWeight() const { return weight_; }
+
+    /**
+     * @brief Alias function for getWeight
+     * @return The series component of this font.
+     */
+    const short int getSeries() const { return weight_; }
+
+    /**
+     * @return The size component of this font.
+     */
+    const unsigned int& getSize() const { return size_; }
+
+    /**
+     * @param family The family component of this font.
+     */
+    void setFamily(const std::string& family) { family_ = family; }
+
+    /**
+     * @param style The style component of this font.
+     */
+    void setStyle(short int style) { style_ = style; }
+
+    /**
+     * @brief Alias function for setStyle.
+     * @param shape The shape component of this font.
+     */
+    void setShape(short int shape) { style_ = shape; }
+
+
+    /**
+     * @param weight The weight component of this font.
+     */
+    void setWeight(short int weight) { weight_ = weight; }
+
+    /**
+     * @brief Alias function for setWeight.
+     * @param series The series component of this font.
+     */
+    void setSeries(short int series) { weight_ = series; }
+
+    /**
+     * @param size The size component of this font.
+     */
+    void setSize(unsigned int size) { size_ = size; }
+
+    /**
+     * @return A text description of this font (family type size).
+     */
+    std::string toString() const
+    {
+      return family_ + "/" + styleDesc_[style_] + "/" + weightDesc_[weight_] + "/" + TextTools::toString(size_);
+    }
+
+  public:
+    static const short int STYLE_NORMAL;
+    static const short int STYLE_ITALIC;
+    
+    static const short int WEIGHT_NORMAL;
+    static const short int WEIGHT_BOLD;
+};
+
+} // end of namespace bpp.
+
+#endif //_FONT_H_
+
+
diff --git a/src/Bpp/Graphics/Font/FontManager.h b/src/Bpp/Graphics/Font/FontManager.h
new file mode 100644
index 0000000..6f8889c
--- /dev/null
+++ b/src/Bpp/Graphics/Font/FontManager.h
@@ -0,0 +1,150 @@
+//
+// File: FontManager.h
+// Created by: Julien Dutheil
+// Created on: Sat Mar 08 2008
+//
+
+/*
+Copyright or © or Copr. Bio++ Developement Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FONTMANAGER_H_
+#define _FONTMANAGER_H_
+
+#include "Font.h"
+
+// From the STL:
+#include <vector>
+
+#include "../../Text/TextTools.h"
+#include "../../Exceptions.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Associate special fonts to a code.
+ *
+ * Instances of this interface are used in some vector format.
+ */
+template<class CodeType>
+class FontManager
+{
+public:
+  FontManager() {}
+  virtual ~FontManager() {}
+
+public:
+
+  /**
+   * @param font The font to look for.
+   * @return The code associated to a given font.
+   */
+  virtual CodeType getCode(const Font& font) const throw (Exception) = 0;
+
+  /**
+   * @param code The code to look for.
+   * @return The font associated to a given code.
+   * @throw exception if the code is not valid.
+   */
+  virtual const Font& getFont(CodeType& code) const throw (Exception) = 0;
+
+  /**
+   * @return All valid codes.
+   */
+  virtual std::vector<CodeType> getCodes() const = 0;
+
+  /**
+   * @return All available fonts.
+   */
+  virtual std::vector<Font> getFonts() const = 0;
+
+  /**
+   * @return The total number of fonts available.
+   */
+  virtual size_t getNumberOfFonts() const = 0;
+};
+
+
+
+template<class CodeType>
+class AbstractFontManager :
+  public virtual FontManager<CodeType>
+{
+private:
+  std::vector<Font> fonts_;
+  std::vector<CodeType> codes_;
+
+public:
+  AbstractFontManager() : fonts_(), codes_() {}
+
+public:
+  CodeType getCode(const Font& font) const throw (Exception)
+  {
+    for (unsigned int i = 0; i < fonts_.size(); i++)
+    {
+      if (fonts_[i] == font)
+      {
+        return codes_[i];
+      }
+    }
+    throw Exception("AbstractFontManager::getCode. Unknown font: " + font.toString());
+  }
+
+  const Font& getFont(int &code) const throw (Exception)
+  {
+    for (unsigned int i = 0; i < codes_.size(); i++)
+    {
+      if (codes_[i] == code)
+      {
+        return fonts_[i];
+      }
+    }
+    throw Exception("AbstractFontManager::getColor. No font associated to this code: " + TextTools::toString(code));
+  }
+  std::vector<CodeType> getCodes() const { return codes_; }
+  std::vector<Font> getFonts() const { return fonts_; }
+  size_t getNumberOfFonts() const { return fonts_.size(); }
+
+protected:
+  void registerFont_(const Font& font, int code)
+  {
+    codes_.push_back(code);
+    fonts_.push_back(font);
+  }
+
+};
+
+} // end of namespace.
+
+#endif //_FONTMANAGER_H_
+
diff --git a/test/test_alphabets.cpp b/src/Bpp/Graphics/GraphicDevice.cpp
similarity index 62%
copy from test/test_alphabets.cpp
copy to src/Bpp/Graphics/GraphicDevice.cpp
index bf5b346..455d744 100644
--- a/test/test_alphabets.cpp
+++ b/src/Bpp/Graphics/GraphicDevice.cpp
@@ -1,14 +1,14 @@
 //
-// File: test_alphabets.cpp
+// File: GraphicDevice.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Mon Mar 03 2008
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
+This software is a computer program whose purpose is to map data onto
+a sequence or a phylogenetic tree.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,29 +37,22 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
-#include <iostream>
+#include "GraphicDevice.h"
 
 using namespace bpp;
-using namespace std;
 
-int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
+short GraphicDevice::TEXT_HORIZONTAL_CENTER = 0;
+short GraphicDevice::TEXT_HORIZONTAL_LEFT   = 1;
+short GraphicDevice::TEXT_HORIZONTAL_RIGHT  = 2;
+short GraphicDevice::TEXT_VERTICAL_CENTER   = 3;
+short GraphicDevice::TEXT_VERTICAL_BOTTOM   = 4;
+short GraphicDevice::TEXT_VERTICAL_TOP      = 5;
 
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
+short GraphicDevice::FILL_EMPTY             = 10;
+short GraphicDevice::FILL_FILLED            = 11;
+short GraphicDevice::FILL_PATTERN           = 12;
+
+short GraphicDevice::LINE_SOLID             = 20;
+short GraphicDevice::LINE_DASHED            = 21;
+short GraphicDevice::LINE_DOTTED            = 22;
 
-  return (0);
-}
diff --git a/src/Bpp/Graphics/GraphicDevice.h b/src/Bpp/Graphics/GraphicDevice.h
new file mode 100644
index 0000000..6715cda
--- /dev/null
+++ b/src/Bpp/Graphics/GraphicDevice.h
@@ -0,0 +1,199 @@
+//
+// File: GraphicDevice.h
+// Created by: Julien Dutheil
+// Created on: Mon Mar 03 2008
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 16, 2006)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _GRAPHICDEVICE_H_
+#define _GRAPHICDEVICE_H_
+
+#include "RgbColor.h"
+#include "Font/Font.h"
+
+namespace bpp
+{
+
+  class UnvalidFlagException: public virtual Exception
+  {
+    public:
+      UnvalidFlagException(const std::string& message): Exception(message) {}
+  };
+
+
+
+  /**
+   * @brief Interface for all plotting devices.
+   *
+   * Implement this interface to support new formats.
+   */
+  class GraphicDevice
+  {
+    public:
+      GraphicDevice() {}
+      virtual ~GraphicDevice() {}
+
+    public:
+      /**
+       * @brief Start the painting.
+       */
+      virtual void begin() = 0;
+
+      /**
+       * @brief End the painting.
+       *
+       * Depending on the implementation of the device,
+       * the call of this method might be required before
+       * the plotting commands become visible.
+       */
+      virtual void end() = 0;
+
+      /**
+       * @param xu The x expansion factor. The actual unit actually depends on the implementation.
+       */
+      virtual void setXUnit(double xu) = 0;
+
+      /**
+       * @param yu The y expansion factor. The actual unit actually depends on the implementation.
+       */
+      virtual void setYUnit(double yu) = 0;
+
+      /**
+       * @return The x expansion factor. The actual unit actually depends on the implementation.
+       */
+      virtual double getXUnit() const = 0;
+
+      /**
+       * @return The y expansion factor. The actual unit actually depends on the implementation.
+       */
+      virtual double getYUnit() const = 0;
+
+      virtual void setCurrentForegroundColor(const RGBColor& color) = 0;
+      virtual void setCurrentBackgroundColor(const RGBColor& color) = 0;
+      virtual void setCurrentFont(const Font& font) = 0;
+      virtual void setCurrentPointSize(unsigned int size) = 0;
+      virtual void setCurrentLineType(short type) = 0;
+      virtual void setCurrentLayer(int layerIndex) = 0;
+
+      virtual const RGBColor& getCurrentForegroundColor() const = 0;
+      virtual const RGBColor& getCurrentBackgroundColor() const = 0;
+      virtual const Font& getCurrentFont() const = 0;
+      virtual unsigned int getCurrentPointSize() const = 0;
+      virtual short getCurrentLineType() const = 0;
+      virtual int getCurrentLayer() const = 0;
+
+
+      /**
+       * @brief Draw a line between two points.
+       *
+       * This method uses the current foreground color and the current line type.
+       *
+       * @param x1 x coordinate 1
+       * @param y1 y coordinate 1
+       * @param x2 x coordinate 2
+       * @param y2 y coordinate 2
+       */
+      virtual void drawLine(double x1, double y1, double x2, double y2) = 0;
+
+      /**
+       * @brief Draw a rectangle.
+       *
+       * This method uses the current foreground color and the current line type for drawing the stroke of the rectangle,
+       * and the current background color for filling the rectangle.
+       *
+       * @param x x coordinate
+       * @param y y coordinate
+       * @param width The rectangle width
+       * @param height The rectangle height
+       * @param fill Filling type (one of FILL_EMPTY, FILL_FILLED or FILL_PATTERN).
+       */
+      virtual void drawRect(double x, double y, double width, double height, short fill = FILL_EMPTY) = 0;
+
+      /**
+       * @brief Draw a circle.
+       *
+       * This method uses the current foreground color and the current line type for drawing the stroke of the circle,
+       * and the current background color for filling the circle.
+       *
+       * @param x x coordinate of the center
+       * @param y y coordinate of the center
+       * @param radius The circle radius
+       * @param fill Filling type (one of FILL_EMPTY, FILL_FILLED or FILL_PATTERN).
+       */
+      virtual void drawCircle(double x, double y, double radius, short fill = FILL_EMPTY) = 0;
+
+      /**
+       * @brief Draw some characters.
+       *
+       * This method uses the current foreground color.
+       *
+       * @param x x coordinate
+       * @param y y coordinate
+       * @param text The characters to draw
+       * @param hpos Horizontal adjustment, one of TEXT_HORIZONTAL_LEFT, TEXT_HORIZONTAL_CENTER or TEXT_HORIZONTAL_RIGHT.
+       * @param vpos Vertical adjustment, one of TEXT_VERTICAL_LEFT, TEXT_VERTICAL_CENTER or TEXT_VERTICAL_RIGHT.
+       * @param angle Angle i radian to rotate the text.
+       */
+      virtual void drawText(double x, double y, const std::string& text, short hpos = TEXT_HORIZONTAL_LEFT, short vpos = TEXT_VERTICAL_BOTTOM, double angle = 0) throw (UnvalidFlagException) = 0;
+
+      /**
+       * @brief Add a comment in the output.
+       *
+       * @param comment Comment text.
+       */
+      virtual void comment(const std::string & comment) = 0;
+
+    public:
+      static short TEXT_HORIZONTAL_CENTER;
+      static short TEXT_HORIZONTAL_LEFT;
+      static short TEXT_HORIZONTAL_RIGHT;
+      static short TEXT_VERTICAL_CENTER;
+      static short TEXT_VERTICAL_BOTTOM;
+      static short TEXT_VERTICAL_TOP;
+
+      static short FILL_EMPTY;
+      static short FILL_FILLED;
+      static short FILL_PATTERN;
+
+      static short LINE_SOLID;
+      static short LINE_DASHED;
+      static short LINE_DOTTED;
+  };
+
+} // end of namespace bpp.
+
+#endif //_GRAPHICDEVICE_H_
+
+
diff --git a/src/Bpp/Graphics/Latex/DvipsColorSet.cpp b/src/Bpp/Graphics/Latex/DvipsColorSet.cpp
new file mode 100644
index 0000000..5327cc7
--- /dev/null
+++ b/src/Bpp/Graphics/Latex/DvipsColorSet.cpp
@@ -0,0 +1,115 @@
+//
+// File: DvipsColorSet.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Apr 14 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2008)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "DvipsColorSet.h"
+
+using namespace bpp;
+
+DvipsColorSet::DvipsColorSet()
+{
+  colors_["GreenYellow"] = RGBColor(217, 255, 79);
+  colors_["Yellow"] = RGBColor(255, 255, 0);
+  colors_["Goldenrod"] = RGBColor(255, 230, 41);
+  colors_["Dandelion"] = RGBColor(255, 181, 41);
+  colors_["Apricot"] = RGBColor(255, 173, 122);
+  colors_["Peach"] = RGBColor(255, 128, 77);
+  colors_["Melon"] = RGBColor(255, 138, 128);
+  colors_["YellowOrange"] = RGBColor(255, 148, 0);
+  colors_["Orange"] = RGBColor(255, 99, 33);
+  colors_["BurntOrange"] = RGBColor(255, 125, 0);
+  colors_["Bittersweet"] = RGBColor(194, 48, 0);
+  colors_["RedOrange"] = RGBColor(255, 59, 33);
+  colors_["Mahogany"] = RGBColor(166, 25, 22);
+  colors_["Maroon"] = RGBColor(173, 23, 55);
+  colors_["BrickRed"] = RGBColor(184, 20, 11);
+  colors_["Red"] = RGBColor(255, 0, 0);
+  colors_["OrangeRed"] = RGBColor(255, 0, 128);
+  colors_["RubineRed"] = RGBColor(255, 0, 222);
+  colors_["WildStrawberry"] = RGBColor(255, 10, 156);
+  colors_["Salmon"] = RGBColor(255, 120, 158);
+  colors_["CarnationPink"] = RGBColor(255, 94, 255);
+  colors_["Magenta"] = RGBColor(255, 0, 255);
+  colors_["VioletRed"] = RGBColor(255, 48, 255);
+  colors_["Rhodamine"] = RGBColor(255, 46, 255);
+  colors_["Mulberry"] = RGBColor(165, 25, 250);
+  colors_["RedViolet"] = RGBColor(157, 17, 168);
+  colors_["Fuchsia"] = RGBColor(124, 21, 235);
+  colors_["Lavender"] = RGBColor(255, 133, 255);
+  colors_["Thistle"] = RGBColor(224, 105, 255);
+  colors_["Orchid"] = RGBColor(173, 92, 255);
+  colors_["DarkOrchid"] = RGBColor(153, 51, 204);
+  colors_["Purple"] = RGBColor(140, 36, 255);
+  colors_["Plum"] = RGBColor(128, 0, 255);
+  colors_["Violet"] = RGBColor(54, 31, 255);
+  colors_["RoyalPurple"] = RGBColor(64, 25, 255);
+  colors_["BlueViolet"] = RGBColor(34, 22, 245);
+  colors_["Periwinkle"] = RGBColor(110, 115, 255);
+  colors_["CadetBlue"] = RGBColor(97, 110, 196);
+  colors_["CornflowerBlue"] = RGBColor(89, 222, 255);
+  colors_["MidnightBlue"] = RGBColor(3, 126, 145);
+  colors_["NavyBlue"] = RGBColor(15, 117, 255);
+  colors_["RoyalBlue"] = RGBColor(0, 128, 255);
+  colors_["Blue"] = RGBColor(0, 0, 255);
+  colors_["Cerulean"] = RGBColor(15, 227, 255);
+  colors_["Cyan"] = RGBColor(0, 255, 255);
+  colors_["ProcessBlue"] = RGBColor(10, 255, 255);
+  colors_["SkyBlue"] = RGBColor(97, 255, 224);
+  colors_["Turquoise"] = RGBColor(38, 255, 204);
+  colors_["TealBlue"] = RGBColor(35, 250, 165);
+  colors_["Aquamarine"] = RGBColor(46, 255, 178);
+  colors_["BlueGreen"] = RGBColor(38, 255, 171);
+  colors_["Emerald"] = RGBColor(0, 255, 128);
+  colors_["JungleGreen"] = RGBColor(3, 255, 122);
+  colors_["SeaGreen"] = RGBColor(79, 255, 128);
+  colors_["Green"] = RGBColor(0, 255, 0);
+  colors_["ForestGreen"] = RGBColor(20, 224, 27);
+  colors_["PineGreen"] = RGBColor(15, 191, 78);
+  colors_["LimeGreen"] = RGBColor(128, 255, 0);
+  colors_["YellowGreen"] = RGBColor(143, 255, 66);
+  colors_["SpringGreen"] = RGBColor(189, 255, 61);
+  colors_["OliveGreen"] = RGBColor(55, 153, 8);
+  colors_["RawSienna"] = RGBColor(140, 39, 0);
+  colors_["Sepia"] = RGBColor(77, 13, 0);
+  colors_["Brown"] = RGBColor(102, 19, 0);
+  colors_["Tan"] = RGBColor(219, 148, 112);
+  colors_["Gray"] = RGBColor(128, 128, 128);
+  colors_["Black"] = RGBColor(0, 0, 0);
+  colors_["White"] = RGBColor(255, 255, 255);
+}
+
diff --git a/src/Bpp/Seq/Io/IoSequenceStream.h b/src/Bpp/Graphics/Latex/DvipsColorSet.h
similarity index 73%
copy from src/Bpp/Seq/Io/IoSequenceStream.h
copy to src/Bpp/Graphics/Latex/DvipsColorSet.h
index 94e3af4..73a4fd7 100644
--- a/src/Bpp/Seq/Io/IoSequenceStream.h
+++ b/src/Bpp/Graphics/Latex/DvipsColorSet.h
@@ -1,14 +1,14 @@
 //
-// File IOSequenceStream.h
-// Author: Sylvain Gaillard
-// Created: 19/08/2009
+// File: DvipsColorSet.h
+// Created by: Julien Dutheil
+// Created on: Mon Apr 14 2008
 //
 
 /*
-Copyright or © or Copr. CNRS, (August 19, 2009)
+Copyright or © or Copr. CNRS, (November 17, 2008)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,30 +37,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCESTREAM_H_
-#define _IOSEQUENCESTREAM_H_
+#ifndef _DVIPSCOLORSET_H_
+#define _DVIPSCOLORSET_H_
 
-#include <Bpp/Io/IoFormat.h>
+#include "../ColorSet.h"
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequenceStream interface.
+ * @brief The dvips color definitions.
  *
- * Interface for streaming sequences.
- *
- * @author Sylvain Gaillard
+ * Source: dvipsnam.def, from the TeXlive LaTeX distribution. 
  */
-class IOSequenceStream: public virtual IOFormat
+class DvipsColorSet:
+  public AbstractColorSet
 {
-	public:
-		IOSequenceStream() {}
-		virtual ~IOSequenceStream() {}
+  public:
+    DvipsColorSet();
+    virtual ~DvipsColorSet() {}
 
 };
 
-} //end of namespace bpp.
+} // end of namespace bpp;
 
-#endif	// _IOSEQUENCESTREAM_H_
+#endif //_MOLSCRIPTCOLORSET_H_
 
diff --git a/src/Bpp/Graphics/Latex/PgfGraphicDevice.cpp b/src/Bpp/Graphics/Latex/PgfGraphicDevice.cpp
new file mode 100644
index 0000000..0b72269
--- /dev/null
+++ b/src/Bpp/Graphics/Latex/PgfGraphicDevice.cpp
@@ -0,0 +1,299 @@
+//
+// File: PgfGraphicDevice.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Jun 19 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "PgfGraphicDevice.h"
+using namespace bpp;
+
+#include<algorithm>
+using namespace std;
+
+
+PgfGraphicDevice::PgfGraphicDevice(std::ostream& out, double unit) :
+  out_(out),
+  fgColorStr_("black"),
+  bgColorStr_("white"),
+  content_(),
+  layers_(),
+  colorIndex_(),
+  colorCount_(0),
+  useLayers_(false),
+  contentStarted_(false),
+  fontShapes_(),
+  fontSeries_()
+{
+  colorIndex_[ColorTools::BLACK]   = "black";
+  colorIndex_[ColorTools::WHITE]   = "white";
+  colorIndex_[ColorTools::BLUE]    = "blue";
+  colorIndex_[ColorTools::RED]     = "red";
+  colorIndex_[ColorTools::GREEN]   = "green";
+  colorIndex_[ColorTools::YELLOW]  = "yellow";
+  colorIndex_[ColorTools::CYAN]    = "cyan";
+  colorIndex_[ColorTools::MAGENTA] = "magenta";
+
+  fontShapes_[Font::STYLE_NORMAL]  = "n";
+  fontShapes_[Font::STYLE_ITALIC]  = "it";
+  fontSeries_[Font::WEIGHT_NORMAL] = "m";
+  fontSeries_[Font::WEIGHT_BOLD]   = "bx";
+
+  setCurrentFont(Font("cmtt", Font::STYLE_NORMAL, Font::WEIGHT_NORMAL, 12));
+  setXUnit(unit);
+  setYUnit(unit);
+}
+
+void PgfGraphicDevice::begin()
+{
+  content_.clear();
+  layers_.clear();
+  colorIndex_.clear();
+  colorCount_ = 0;
+  useLayers_ = false;
+  contentStarted_ = false;
+}
+
+bool comp( int a, int b ) { return a > b; } ;
+void PgfGraphicDevice::end()
+{
+  ostringstream oss;
+  if (useLayers_)
+    oss << "\\end{pgfonlayer}{" << TextTools::toString(getCurrentLayer()) << "}" << endl;
+  content_.push_back(oss.str());
+
+  //Header:
+  out_ << "\\documentclass{article}" << endl;
+  out_ << "% This figure was generated by the Bio++ Pgf Graphic Device." << endl;
+  out_ << "% Althought this file can be compiled 'as is' it may not be displayed correctly, depending on the size of the picture." << endl;
+  out_ << "% You may consider copying the pgfpicture environment to your own LaTeX file and play with pgf settings (e.g. the pgfpages module)." << endl;
+  out_ << "% You can also use the geometry package, for instance:" << endl;
+  out_ << "% \\usepackage[a3paper]{geometry}" << endl;
+  out_ << "\\usepackage{pgf}" << endl;
+  for(map<const RGBColor, string>::iterator it = colorIndex_.begin(); it != colorIndex_.end(); it++)
+  {
+    if(it->second.substr(0,3) == "use")
+      out_ << "\\definecolor{" << it->second << "}{rgb}{" << it->first[0]/255. << "," << it->first[1]/255. << "," << it->first[2]/255. << "}" << endl;    
+  }
+  out_ << "\\begin{document}" << endl;
+
+  //Declare and set layers:
+  if (useLayers_)
+  {
+    string tmp;
+    sort(layers_.begin(), layers_.end(), comp);
+    for(unsigned int i = 0; i < layers_.size(); i++)
+    {
+      if(i > 0) tmp += ",";
+      tmp += TextTools::toString(layers_[i]);
+      out_ << "\\pgfdeclarelayer{" << layers_[i] << "}" << endl;
+    }
+    out_ << "\\pgfsetlayers{" << tmp << "}" << endl;
+  }
+
+  //Start picture:
+  out_ << "\\begin{pgfpicture}" << endl;
+  out_ << "\\pgfsetxvec{\\pgfpoint{" << getXUnit() << "cm}{0cm}}" << endl;
+  out_ << "\\pgfsetyvec{\\pgfpoint{0cm}{-" << getYUnit() << "cm}}" << endl;
+  
+  for(unsigned int i = 0; i < content_.size(); i++)
+  {
+    out_ << content_[i] << endl;
+  }
+  
+  out_ << "\\end{pgfpicture}" << endl;
+  out_ << "\\end{document}" << endl;
+}
+
+void PgfGraphicDevice::setCurrentForegroundColor(const RGBColor& color)
+{
+  map<const RGBColor, string>::iterator it = colorIndex_.find(color);
+  if(it != colorIndex_.end())
+  {
+    fgColorStr_ = it->second;
+  }
+  else
+  {
+    colorCount_++;
+    fgColorStr_ = "usercolor" + TextTools::toString(colorCount_);
+    colorIndex_[color] = fgColorStr_;
+  }
+  AbstractGraphicDevice::setCurrentForegroundColor(color);
+  ostringstream oss;
+  oss << "\\pgfsetstrokecolor{" << fgColorStr_ << "}" << endl;
+  content_.push_back(oss.str());
+}
+
+void PgfGraphicDevice::setCurrentBackgroundColor(const RGBColor& color)
+{
+  map<const RGBColor, string>::iterator it = colorIndex_.find(color);
+  if (it != colorIndex_.end())
+  {
+    bgColorStr_ = it->second;
+  }
+  else
+  {
+    colorCount_++;
+    bgColorStr_ = "usercolor" + TextTools::toString(colorCount_);
+    colorIndex_[color] = bgColorStr_;
+  }
+  AbstractGraphicDevice::setCurrentBackgroundColor(color);
+  ostringstream oss;
+  oss << "\\pgfsetfillcolor{" << bgColorStr_ << "}" << endl;
+  content_.push_back(oss.str());
+}
+
+void PgfGraphicDevice::setCurrentFont(const Font& font)
+{
+  AbstractGraphicDevice::setCurrentFont(font);
+  ostringstream oss;
+  oss << "\\fontfamily{" << font.getFamily() << "}" << endl;
+  oss << "\\fontseries{" << fontSeries_[font.getSeries()] << "}" << endl;
+  oss << "\\fontshape{"  << fontShapes_[font.getShape()] << "}"  << endl;
+  oss << "\\fontsize{"   << font.getSize() << "}{" << font.getSize() << "}" << endl;
+  oss << "\\selectfont"  << endl;
+  content_.push_back(oss.str());
+}
+
+void PgfGraphicDevice::setCurrentPointSize(unsigned int size)
+{
+  AbstractGraphicDevice::setCurrentPointSize(size);
+  ostringstream oss;
+  oss << "\\pgfsetlinewidth{" << x_(size) << "}" << endl;
+  content_.push_back(oss.str());
+}
+
+void PgfGraphicDevice::setCurrentLineType(short type) throw (Exception)
+{ 
+  AbstractGraphicDevice::setCurrentLineType(type);
+  if(type == LINE_SOLID)
+  {
+    ostringstream oss;
+    oss << "\\pgfsetdash{}{0pt}" << endl;
+    content_.push_back(oss.str());
+  }
+  else if(type == LINE_DASHED)
+  {
+    ostringstream oss;
+    oss << "\\pgfsetdash{{3mm}{2mm}}{0pt}" << endl;
+    content_.push_back(oss.str());
+  }
+  else if(type == LINE_DOTTED)
+  {
+    ostringstream oss;
+    oss << "\\pgfsetdash{{" << (x_(getCurrentPointSize())) << "}{" << (x_(getCurrentPointSize())) << "}}{0pt}" << endl;
+    content_.push_back(oss.str());
+  }
+  else throw Exception("PgfGraphicDevice::setCurrentLineType. Unknown line type: " + TextTools::toString(type));
+}
+
+void PgfGraphicDevice::setCurrentLayer(int layerIndex)
+{
+  if (!useLayers_ && contentStarted_)
+    throw Exception("PgfGraphicDevice::setCurrentLayer. A layer is specified after some content has been already added, this would result in a corrupted display.");
+  ostringstream oss;
+  if (useLayers_)
+    oss << "\\end{pgfonlayer}{" << TextTools::toString(getCurrentLayer()) << "}" << endl;
+  oss << "\\begin{pgfonlayer}{" << TextTools::toString(layerIndex) << "}" << endl;
+  //We have to recall the current color values for this layer:
+  oss << "\\pgfsetstrokecolor{" << fgColorStr_ << "}" << endl;
+  oss << "\\pgfsetfillcolor{" << bgColorStr_ << "}" << endl;
+  content_.push_back(oss.str());
+  AbstractGraphicDevice::setCurrentLayer(layerIndex);
+  if (find(layers_.begin(), layers_.end(), layerIndex) == layers_.end())
+    layers_.push_back(layerIndex);
+  useLayers_ = true;
+}
+
+void PgfGraphicDevice::drawLine(double x1, double y1, double x2, double y2)
+{
+  ostringstream oss;
+  oss << "\\pgfpathmoveto{\\pgfpointxy{" << x1 << "}{" << y1 << "}}" << endl;
+  oss << "\\pgfpathlineto{\\pgfpointxy{" << x2 << "}{" << y2 << "}}" << endl;
+  oss << "\\pgfpathclose" << endl;
+  oss << "\\pgfusepath{stroke}" << endl;
+  content_.push_back(oss.str());
+  contentStarted_ = true;
+}
+ 
+void PgfGraphicDevice::drawRect(double x, double y, double width, double height, short fill)
+{
+  ostringstream oss;
+  oss << "\\pgfpathrectangle{\\pgfpointxy{" << x << "}{" << y << "}}{\\pgfpointxy{" << width << "}{" << height << "}}" << endl;
+  if(fill == FILL_FILLED)
+    oss << "\\pgfusepath{stroke,fill}" << endl;
+  else
+    oss << "\\pgfusepath{stroke}" << endl;
+  content_.push_back(oss.str());
+  contentStarted_ = true;
+}
+
+void PgfGraphicDevice::drawCircle(double x, double y, double radius, short fill)
+{
+  ostringstream oss;
+  oss << "\\pgfpathcircle{\\pgfpointxy{" << x << "}{" << y << "}}{" << radius << "}" << endl;
+  if(fill == FILL_FILLED)
+    oss << "\\pgfusepath{stroke,fill}" << endl;
+  else
+    oss << "\\pgfusepath{stroke}" << endl;
+  content_.push_back(oss.str());
+  contentStarted_ = true;
+}
+
+void PgfGraphicDevice::drawText(double x, double y, const std::string& text, short hpos, short vpos, double angle) throw (UnvalidFlagException)
+{
+  string anchor;
+  if(vpos == TEXT_VERTICAL_BOTTOM)
+    anchor = "bottom";
+  else if(vpos == TEXT_VERTICAL_TOP)
+    anchor = "top";
+  else if(vpos == TEXT_VERTICAL_CENTER)
+    anchor = "base";
+  else throw UnvalidFlagException("PgfGraphicDevice::drawText. Invalid vertical alignment option.");
+  if(hpos == TEXT_HORIZONTAL_LEFT)
+    anchor += ",left";
+  else if(hpos == TEXT_HORIZONTAL_RIGHT)
+    anchor += ",right";
+  else if(hpos == TEXT_HORIZONTAL_CENTER)
+    anchor += "";
+  else throw UnvalidFlagException("PgfGraphicDevice::drawText. Invalid horizontal alignment option.");
+
+  ostringstream oss;
+  oss << "\\pgftransformrotate{" << angle << "}" << endl;
+  oss << "\\pgftext[" << anchor << ",at=\\pgfpointxy{" << x << "}{" << y << "}]{\\textcolor{" << fgColorStr_ << "}" << text << "}" << endl;
+  content_.push_back(oss.str());
+  contentStarted_ = true;
+}
+
diff --git a/src/Bpp/Graphics/Latex/PgfGraphicDevice.h b/src/Bpp/Graphics/Latex/PgfGraphicDevice.h
new file mode 100644
index 0000000..aecb9ed
--- /dev/null
+++ b/src/Bpp/Graphics/Latex/PgfGraphicDevice.h
@@ -0,0 +1,117 @@
+//
+// File: PgfGraphicDevice.h
+// Created by: Julien Dutheil
+// Created on: Thu Jun 19 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 16, 2006)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _PGFGRAPHICDEVICE_H_
+#define _PGFGRAPHICDEVICE_H_
+
+#include "../AbstractGraphicDevice.h"
+#include "../ColorTools.h"
+
+// From the STL:
+#include <map>
+#include <vector>
+#include <string>
+
+namespace bpp
+{
+
+/**
+ * @brief LaTeX Portable Graphic Format (Pgf) plotting format.
+ */
+class PgfGraphicDevice:
+  public AbstractGraphicDevice
+{
+  private:
+    std::ostream& out_;
+    std::string fgColorStr_;
+    std::string bgColorStr_;
+    std::vector<std::string> content_;
+    std::vector<int> layers_;
+    std::map<const RGBColor, std::string> colorIndex_;
+    unsigned int colorCount_;
+    bool useLayers_;
+    bool contentStarted_;
+    mutable std::map<short int, std::string> fontShapes_;
+    mutable std::map<short int, std::string> fontSeries_;
+
+  public:
+    /**
+     * @brief Build a new Pgf device object.
+     *
+     * Coordinates in Pgf are the same as in LaTeX, so it can be any of cm, mm, in, pt, px, etc.
+     * For compatibility with other devices, the constructor takes as input the scale of the drawing, as cm per points.
+     * All coordinates and widths will be multiplied by the factor in the output file.
+     *
+     * @param out The output stream.
+     * @param unit The unit length.
+     */
+    PgfGraphicDevice(std::ostream& out, double unit);
+
+    virtual ~PgfGraphicDevice() {}
+
+  public:
+    void begin();
+    void end();
+
+    void setCurrentForegroundColor(const RGBColor& color);
+    void setCurrentBackgroundColor(const RGBColor& color);
+    void setCurrentFont(const Font& font);
+    void setCurrentPointSize(unsigned int size);
+    void setCurrentLineType(short type) throw (Exception);
+    void setCurrentLayer(int layerIndex);
+   
+    void drawLine(double x1, double y1, double x2, double y2);
+    void drawRect(double x, double y, double width, double height, short fill = FILL_EMPTY);
+    void drawCircle(double x, double y, double radius, short fill = FILL_EMPTY);
+    void drawText(double x, double y, const std::string & text, short hpos = TEXT_HORIZONTAL_LEFT, short vpos = TEXT_VERTICAL_BOTTOM, double angle = 0) throw (UnvalidFlagException);
+    void comment(const std::string& text)
+    {
+      content_.push_back("%" + text);
+    }
+
+  public:
+    const std::string& getFontShape(const Font& font);
+
+};
+
+} // end of namespace bpp.
+
+#endif //_PGFGRAPHICDEVICE_H_
+
+
diff --git a/src/Bpp/Graphics/Molscript/MolscriptColorSet.cpp b/src/Bpp/Graphics/Molscript/MolscriptColorSet.cpp
new file mode 100644
index 0000000..b5331e2
--- /dev/null
+++ b/src/Bpp/Graphics/Molscript/MolscriptColorSet.cpp
@@ -0,0 +1,210 @@
+//
+// File: MolscriptColorSet.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Apr 14 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2008)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "MolscriptColorSet.h"
+
+using namespace bpp;
+
+MolscriptColorSet::MolscriptColorSet()
+{
+  colors_["aliceblue"] = RGBColor(240, 248, 255);
+  colors_["antiquewhite"] = RGBColor(250, 235, 215);
+  colors_["aquamarine"] = RGBColor(127, 255, 212);
+  colors_["azure"] = RGBColor(240, 255, 255);
+  colors_["beige"] = RGBColor(245, 245, 220);
+  colors_["bisque"] = RGBColor(255, 228, 196);
+  colors_["black"] = RGBColor(0, 0, 0);
+  colors_["blanchedalmond"] = RGBColor(255, 235, 205);
+  colors_["blue"] = RGBColor(0, 0, 255);
+  colors_["blueviolet"] = RGBColor(138, 43, 226);
+  colors_["brown"] = RGBColor(165, 42, 42);
+  colors_["burlywood"] = RGBColor(222, 184, 135);
+  colors_["cadetblue"] = RGBColor(95, 158, 160);
+  colors_["chartreuse"] = RGBColor(127, 255, 0);
+  colors_["chocolate"] = RGBColor(210, 105, 30);
+  colors_["coral"] = RGBColor(255, 127, 80);
+  colors_["cornflowerblue"] = RGBColor(100, 149, 237);
+  colors_["cornsilk"] = RGBColor(255, 248, 220);
+  colors_["crimson"] = RGBColor(220, 20, 60);
+  colors_["cyan"] = RGBColor(0, 255, 255);
+  colors_["darkblue"] = RGBColor(0, 0, 139);
+  colors_["darkcyan"] = RGBColor(0, 139, 139);
+  colors_["darkgoldenrod"] = RGBColor(184, 134, 11);
+  colors_["darkgray"] = RGBColor(169, 169, 169);
+  colors_["darkgreen"] = RGBColor(0, 100, 0);
+  colors_["darkgrey"] = RGBColor(169, 169, 169);
+  colors_["darkkhaki"] = RGBColor(189, 183, 107);
+  colors_["darkmagenta"] = RGBColor(139, 0, 139);
+  colors_["darkolivegreen"] = RGBColor(85, 107, 47);
+  colors_["darkorange"] = RGBColor(255, 140, 0);
+  colors_["darkorchid"] = RGBColor(153, 50, 204);
+  colors_["darkred"] = RGBColor(139, 0, 0);
+  colors_["darksalmon"] = RGBColor(233, 150, 122);
+  colors_["darkseagreen"] = RGBColor(143, 188, 143);
+  colors_["darkslateblue"] = RGBColor(72, 61, 139);
+  colors_["darkslategray"] = RGBColor(47, 79, 79);
+  colors_["darkslategrey"] = RGBColor(47, 79, 79);
+  colors_["darkturquoise"] = RGBColor(0, 206, 209);
+  colors_["darkviolet"] = RGBColor(148, 0, 211);
+  colors_["deeppink"] = RGBColor(255, 20, 147);
+  colors_["deepskyblue"] = RGBColor(0, 191, 255);
+  colors_["dimgray"] = RGBColor(105, 105, 105);
+  colors_["dimgrey"] = RGBColor(105, 105, 105);
+  colors_["dodgerblue"] = RGBColor(30, 144, 255);
+  colors_["firebrick"] = RGBColor(178, 34, 34);
+  colors_["floralwhite"] = RGBColor(255, 250, 240);
+  colors_["forestgreen"] = RGBColor(34, 139, 34);
+  colors_["gainsboro"] = RGBColor(220, 220, 220);
+  colors_["ghostwhite"] = RGBColor(248, 248, 255);
+  colors_["gold"] = RGBColor(255, 215, 0);
+  colors_["goldenrod"] = RGBColor(218, 165, 32);
+  colors_["gray"] = RGBColor(190, 190, 190);
+  colors_["green"] = RGBColor(0, 255, 0);
+  colors_["greenyellow"] = RGBColor(173, 255, 47);
+  colors_["grey"] = RGBColor(190, 190, 190);
+  colors_["honeydew"] = RGBColor(240, 255, 240);
+  colors_["hotpink"] = RGBColor(255, 105, 180);
+  colors_["indianred"] = RGBColor(205, 92, 92);
+  colors_["indigo"] = RGBColor(75, 0, 130);
+  colors_["ivory"] = RGBColor(255, 255, 240);
+  colors_["khaki"] = RGBColor(240, 230, 140);
+  colors_["lavender"] = RGBColor(230, 230, 250);
+  colors_["lavenderblush"] = RGBColor(255, 240, 245);
+  colors_["lawngreen"] = RGBColor(124, 252, 0);
+  colors_["lemonchiffon"] = RGBColor(255, 250, 205);
+  colors_["lightblue"] = RGBColor(173, 216, 230);
+  colors_["lightcoral"] = RGBColor(240, 128, 128);
+  colors_["lightcyan"] = RGBColor(224, 255, 255);
+  colors_["lightgoldenrod"] = RGBColor(238, 221, 130);
+  colors_["lightgoldenrodyellow"] = RGBColor(250, 250, 210);
+  colors_["lightgray"] = RGBColor(211, 211, 211);
+  colors_["lightgreen"] = RGBColor(144, 238, 144);
+  colors_["lightgrey"] = RGBColor(211, 211, 211);
+  colors_["lightpink"] = RGBColor(255, 182, 193);
+  colors_["lightsalmon"] = RGBColor(255, 160, 122);
+  colors_["lightseagreen"] = RGBColor(32, 178, 170);
+  colors_["lightskyblue"] = RGBColor(135, 206, 250);
+  colors_["lightslateblue"] = RGBColor(132, 112, 255);
+  colors_["lightslategray"] = RGBColor(119, 136, 153);
+  colors_["lightslategrey"] = RGBColor(119, 136, 153);
+  colors_["lightsteelblue"] = RGBColor(176, 196, 222);
+  colors_["lightyellow"] = RGBColor(255, 255, 224);
+  colors_["limegreen"] = RGBColor(50, 205, 50);
+  colors_["linen"] = RGBColor(250, 240, 230);
+  colors_["magenta"] = RGBColor(255, 0, 255);
+  colors_["maroon"] = RGBColor(176, 48, 96);
+  colors_["mediumaquamarine"] = RGBColor(102, 205, 170);
+  colors_["mediumblue"] = RGBColor(0, 0, 205);
+  colors_["mediumorchid"] = RGBColor(186, 85, 211);
+  colors_["mediumpurple"] = RGBColor(147, 112, 219);
+  colors_["mediumseagreen"] = RGBColor(60, 179, 113);
+  colors_["mediumslateblue"] = RGBColor(123, 104, 238);
+  colors_["mediumspringgreen"] = RGBColor(0, 250, 154);
+  colors_["mediumturquoise"] = RGBColor(72, 209, 204);
+  colors_["mediumvioletred"] = RGBColor(199, 21, 133);
+  colors_["midnightblue"] = RGBColor(25, 25, 112);
+  colors_["mintcream"] = RGBColor(245, 255, 250);
+  colors_["mistyrose"] = RGBColor(255, 228, 225);
+  colors_["moccasin"] = RGBColor(255, 228, 181);
+  colors_["navajowhite"] = RGBColor(255, 222, 173);
+  colors_["navy"] = RGBColor(0, 0, 128);
+  colors_["navyblue"] = RGBColor(0, 0, 128);
+  colors_["oldlace"] = RGBColor(253, 245, 230);
+  colors_["olivedrab"] = RGBColor(107, 142, 35);
+  colors_["orange"] = RGBColor(255, 165, 0);
+  colors_["orangered"] = RGBColor(255, 69, 0);
+  colors_["orchid"] = RGBColor(218, 112, 214);
+  colors_["palegoldenrod"] = RGBColor(238, 232, 170);
+  colors_["palegreen"] = RGBColor(152, 251, 152);
+  colors_["paleturquoise"] = RGBColor(175, 238, 238);
+  colors_["palevioletred"] = RGBColor(219, 112, 147);
+  colors_["papayawhip"] = RGBColor(255, 239, 213);
+  colors_["peachpuff"] = RGBColor(255, 218, 185);
+  colors_["peru"] = RGBColor(205, 133, 63);
+  colors_["pink"] = RGBColor(255, 192, 203);
+  colors_["plum"] = RGBColor(221, 160, 221);
+  colors_["powderblue"] = RGBColor(176, 224, 230);
+  colors_["purple"] = RGBColor(160, 32, 240);
+  colors_["red"] = RGBColor(255, 0, 0);
+  colors_["rosybrown"] = RGBColor(188, 143, 143);
+  colors_["royalblue"] = RGBColor(65, 105, 225);
+  colors_["saddlebrown"] = RGBColor(139, 69, 19);
+  colors_["salmon"] = RGBColor(250, 128, 114);
+  colors_["sandybrown"] = RGBColor(244, 164, 96);
+  colors_["seagreen"] = RGBColor(46, 139, 87);
+  colors_["seashell"] = RGBColor(255, 245, 238);
+  colors_["sgibeet"] = RGBColor(142, 56, 142);
+  colors_["sgibrightgray"] = RGBColor(197, 193, 170);
+  colors_["sgibrightgrey"] = RGBColor(197, 193, 170);
+  colors_["sgichartreuse"] = RGBColor(113, 198, 113);
+  colors_["sgidarkgray"] = RGBColor(85, 85, 85);
+  colors_["sgidarkgrey"] = RGBColor(85, 85, 85);
+  colors_["sgilightblue"] = RGBColor(125, 158, 192);
+  colors_["sgilightgray"] = RGBColor(170, 170, 170);
+  colors_["sgilightgrey"] = RGBColor(170, 170, 170);
+  colors_["sgimediumgray"] = RGBColor(132, 132, 132);
+  colors_["sgimediumgrey"] = RGBColor(132, 132, 132);
+  colors_["sgiolivedrab"] = RGBColor(142, 142, 56);
+  colors_["sgisalmon"] = RGBColor(198, 113, 113);
+  colors_["sgislateblue"] = RGBColor(113, 113, 198);
+  colors_["sgiteal"] = RGBColor(56, 142, 142);
+  colors_["sgiverydarkgray"] = RGBColor(40, 40, 40);
+  colors_["sgiverydarkgrey"] = RGBColor(40, 40, 40);
+  colors_["sgiverylightgray"] = RGBColor(214, 214, 214);
+  colors_["sgiverylightgrey"] = RGBColor(214, 214, 214);
+  colors_["sienna"] = RGBColor(160, 82, 45);
+  colors_["skyblue"] = RGBColor(135, 206, 235);
+  colors_["slateblue"] = RGBColor(106, 90, 205);
+  colors_["slategray"] = RGBColor(112, 128, 144);
+  colors_["slategrey"] = RGBColor(112, 128, 144);
+  colors_["snow"] = RGBColor(255, 250, 250);
+  colors_["springgreen"] = RGBColor(0, 255, 127);
+  colors_["steelblue"] = RGBColor(70, 130, 180);
+  colors_["tan"] = RGBColor(210, 180, 140);
+  colors_["thistle"] = RGBColor(216, 191, 216);
+  colors_["tomato"] = RGBColor(255, 99, 71);
+  colors_["turquoise"] = RGBColor(64, 224, 208);
+  colors_["violet"] = RGBColor(238, 130, 238);
+  colors_["violetred"] = RGBColor(208, 32, 144);
+  colors_["wheat"] = RGBColor(245, 222, 179);
+  colors_["white"] = RGBColor(255, 255, 255);
+  colors_["whitesmoke"] = RGBColor(245, 245, 245);
+  colors_["yellow"] = RGBColor(255, 255, 0);
+  colors_["yellowgreen"] = RGBColor(154, 205, 50);
+}
diff --git a/src/Bpp/Seq/Io/IoSequenceStream.h b/src/Bpp/Graphics/Molscript/MolscriptColorSet.h
similarity index 74%
rename from src/Bpp/Seq/Io/IoSequenceStream.h
rename to src/Bpp/Graphics/Molscript/MolscriptColorSet.h
index 94e3af4..f34aba0 100644
--- a/src/Bpp/Seq/Io/IoSequenceStream.h
+++ b/src/Bpp/Graphics/Molscript/MolscriptColorSet.h
@@ -1,14 +1,14 @@
 //
-// File IOSequenceStream.h
-// Author: Sylvain Gaillard
-// Created: 19/08/2009
+// File: MolscriptColorSet.h
+// Created by: Julien Dutheil
+// Created on: Mon Apr 14 2008
 //
 
 /*
-Copyright or © or Copr. CNRS, (August 19, 2009)
+Copyright or © or Copr. CNRS, (November 17, 2008)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,30 +37,27 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCESTREAM_H_
-#define _IOSEQUENCESTREAM_H_
+#ifndef _MOLSCRIPTCOLORSET_H_
+#define _MOLSCRIPTCOLORSET_H_
 
-#include <Bpp/Io/IoFormat.h>
+#include "../ColorSet.h"
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequenceStream interface.
- *
- * Interface for streaming sequences.
- *
- * @author Sylvain Gaillard
+ * @brief Molscript color definitions.
  */
-class IOSequenceStream: public virtual IOFormat
+class MolscriptColorSet:
+  public AbstractColorSet
 {
-	public:
-		IOSequenceStream() {}
-		virtual ~IOSequenceStream() {}
+  public:
+    MolscriptColorSet();
+    virtual ~MolscriptColorSet() {}
 
 };
 
-} //end of namespace bpp.
+} // end of namespace bpp;
 
-#endif	// _IOSEQUENCESTREAM_H_
+#endif //_MOLSCRIPTCOLORSET_H_
 
diff --git a/src/Bpp/Graphics/Point2D.h b/src/Bpp/Graphics/Point2D.h
new file mode 100644
index 0000000..5def49d
--- /dev/null
+++ b/src/Bpp/Graphics/Point2D.h
@@ -0,0 +1,146 @@
+//
+// File Point2D.h (from file Coord.h)
+// Author : Sylvain Gaillard
+//          Julien Dutheil
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for population genetics analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use, 
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info". 
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability. 
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or 
+   data to be ensured and,  more generally, to use and operate it in the 
+   same conditions as regards security. 
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+   */
+
+#ifndef _POINT2D_H_
+#define _POINT2D_H_
+
+#include "../Clonable.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief The Point2D class.
+   *
+   * This is a simple class designed to store the coordinates of a point.
+   * The type of the two coordinates is defined as a template.
+   *
+   * @author Sylvain Gaillard, Julien Dutheil
+   */
+  template<class T> class Point2D:
+    public virtual Clonable
+  {
+    private:
+      T x_;
+      T y_;
+
+    public: // Constructors and destructor :
+
+      /**
+       * @brief Build a new Point2D from two values.
+       * 
+       * The two values are set to 0 if no parametre is given to the constructor.
+       *
+       * @param x The longitude or abscissa.
+       * @param y The latitude or ordinate.
+       */
+      Point2D<T>(const T x = 0, const T y = 0): x_(x), y_(y) {}
+
+      /**
+       * @brief Destroy the Point2D object.
+       */
+      virtual ~Point2D() {}
+
+    public: // Methodes
+
+      /**
+       * @brief Implement the Clonable interface.
+       */
+      Point2D<T>* clone() const { return new Point2D(*this); }
+
+      /**
+       * @brief Set the two values.
+       */
+      void setCoord(const T x, const T y);
+
+      /**
+       * @brief Set only the longitude.
+       */
+      void setX(const T x) { x_ = x; }
+
+      /**
+       * @brief Set only the latitude.
+       */
+      void setY(const T y) { y_ = y; }
+
+      /**
+       * @brief Get the longitude.
+       */
+      const T& getX() const { return x_; }
+
+      /**
+       * @brief Get the latitude.
+       */
+      const T& getY() const { return y_; }
+
+      /**
+       * @brief Compares two Point2D objets.
+       *
+       * Return true if the coordinates of the 2 Point2D are equals.
+       */
+      bool hasSameCoordsAs(const Point2D<T>& coord) const
+      {
+        return x_ == coord.x_ && y_ == coord.y_;
+      }
+
+      /**
+       * @brief The == operator.
+       *
+       * Return true if the coordinates of the 2 Point2Ds are equals.
+       * Does the same as the asSameCoords() methode.
+       */
+      virtual bool operator== (const Point2D<T>& coord) const
+      {
+        return hasSameCoordsAs(coord);
+      }
+
+      /**
+       * @brief The != operator.
+       */
+      virtual bool operator!= (const Point2D<T>& coord) const
+      {
+        return !hasSameCoordsAs(coord);
+      }
+
+  };
+
+} //end of namespace bpp;
+
+#endif // _POINT2D_H_
+
diff --git a/src/Bpp/Seq/Alphabet/IntegerAlphabet.cpp b/src/Bpp/Graphics/Point2DTools.h
similarity index 55%
rename from src/Bpp/Seq/Alphabet/IntegerAlphabet.cpp
rename to src/Bpp/Graphics/Point2DTools.h
index ba07f72..bda32b0 100644
--- a/src/Bpp/Seq/Alphabet/IntegerAlphabet.cpp
+++ b/src/Bpp/Graphics/Point2DTools.h
@@ -1,26 +1,25 @@
 //
-// File: BinaryAlphabet.cpp
-// Authors: Laurent Gueguen
-// Created on: vendredi 20 septembre 2013, � 23h 10
+// File Point2DTools.h (from CoordsTools.h)
+// Author : Sylvain Gaillard
 //
 
 /*
-   Copyright or � or Copr. Bio++ Development Team, (November 17, 2004)
+   Copyright or © or Copr. CNRS, (November 17, 2004)
 
    This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
+   for population genetics analysis.
 
    This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
+   abiding by the rules of distribution of free software.  You can  use, 
    modify and/ or redistribute the software under the terms of the CeCILL
    license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
+   "http://www.cecill.info". 
 
    As a counterpart to the access to the source code and  rights to copy,
    modify and redistribute granted by the license, users are provided only
    with a limited warranty  and the software's author,  the holder of the
    economic rights,  and the successive licensors  have only  limited
-   liability.
+   liability. 
 
    In this respect, the user's attention is drawn to the risks associated
    with loading,  using,  modifying and/or developing or reproducing the
@@ -29,34 +28,52 @@
    therefore means  that it is reserved for developers  and  experienced
    professionals having in-depth computer knowledge. Users are therefore
    encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
+   requirements in conditions enabling the security of their systems and/or 
+   data to be ensured and,  more generally, to use and operate it in the 
+   same conditions as regards security. 
 
    The fact that you are presently reading this means that you have had
    knowledge of the CeCILL license and that you accept its terms.
- */
+   */
 
+#ifndef _POINT2DTOOLS_H_
+#define _POINT2DTOOLS_H_
 
-#include "IntegerAlphabet.h"
-#include "AlphabetState.h"
+// From local
+#include "Point2D.h"
 
-// From Utils:
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-IntegerAlphabet::IntegerAlphabet(unsigned int max) : MAX_(max)
+namespace bpp
 {
-  // Alphabet size definition
-  resize(MAX_);
 
-  // Alphabet content definition
-  registerState(new AlphabetState(-1, "-", "Gap"));
+  /**
+   * @brief Some functions to deal with Point2D.
+   *
+   * @author Sylvain Gaillard
+   */
 
-  for (int i = 0; i < static_cast<int>(MAX_); i++)
+  class CoordsTools
   {
-    registerState(new AlphabetState(i, TextTools::toString(i), ""));
-  }
-}
+    public:
+      /**
+       * @brief Get the distance between two Coord objects.
+       *
+       * @param co1 A Point2D object.
+       * @param co2 An other Point2D object.
+       * @return the distance between the 2 points as a double
+       */
+      template<class T> static double getDistanceBetween(const Point2D<T>& co1, const Point2D<T>& co2)
+      {
+        T base, height;
+        base = co1.getX() - co2.getX();
+        height = co1.getY() - co2.getY();
+        base = base * base;
+        height = height * height;
+        return sqrt((double)base + (double)height);
+      }
+
+  };
+
+} //end of namespace bpp;
+
+#endif // _POINT2DTOOLS_H_
 
diff --git a/src/Bpp/Graphics/R/RColorSet.cpp b/src/Bpp/Graphics/R/RColorSet.cpp
new file mode 100644
index 0000000..96c2ba1
--- /dev/null
+++ b/src/Bpp/Graphics/R/RColorSet.cpp
@@ -0,0 +1,704 @@
+//
+// File: RColorSet.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Apr 14 2008
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2008)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "RColorSet.h"
+
+using namespace bpp;
+
+RColorSet::RColorSet()
+{
+  colors_["white"] = RGBColor(255, 255, 255);
+  colors_["aliceblue"] = RGBColor(240, 248, 255);
+  colors_["antiquewhite"] = RGBColor(250, 235, 215);
+  colors_["antiquewhite1"] = RGBColor(255, 239, 219);
+  colors_["antiquewhite2"] = RGBColor(238, 223, 204);
+  colors_["antiquewhite3"] = RGBColor(205, 192, 176);
+  colors_["antiquewhite4"] = RGBColor(139, 131, 120);
+  colors_["aquamarine"] = RGBColor(127, 255, 212);
+  colors_["aquamarine1"] = RGBColor(127, 255, 212);
+  colors_["aquamarine2"] = RGBColor(118, 238, 198);
+  colors_["aquamarine3"] = RGBColor(102, 205, 170);
+  colors_["aquamarine4"] = RGBColor(69, 139, 116);
+  colors_["azure"] = RGBColor(240, 255, 255);
+  colors_["azure1"] = RGBColor(240, 255, 255);
+  colors_["azure2"] = RGBColor(224, 238, 238);
+  colors_["azure3"] = RGBColor(193, 205, 205);
+  colors_["azure4"] = RGBColor(131, 139, 139);
+  colors_["beige"] = RGBColor(245, 245, 220);
+  colors_["bisque"] = RGBColor(255, 228, 196);
+  colors_["bisque1"] = RGBColor(255, 228, 196);
+  colors_["bisque2"] = RGBColor(238, 213, 183);
+  colors_["bisque3"] = RGBColor(205, 183, 158);
+  colors_["bisque4"] = RGBColor(139, 125, 107);
+  colors_["black"] = RGBColor(0, 0, 0);
+  colors_["blanchedalmond"] = RGBColor(255, 235, 205);
+  colors_["blue"] = RGBColor(0, 0, 255);
+  colors_["blue1"] = RGBColor(0, 0, 255);
+  colors_["blue2"] = RGBColor(0, 0, 238);
+  colors_["blue3"] = RGBColor(0, 0, 205);
+  colors_["blue4"] = RGBColor(0, 0, 139);
+  colors_["blueviolet"] = RGBColor(138, 43, 226);
+  colors_["brown"] = RGBColor(165, 42, 42);
+  colors_["brown1"] = RGBColor(255, 64, 64);
+  colors_["brown2"] = RGBColor(238, 59, 59);
+  colors_["brown3"] = RGBColor(205, 51, 51);
+  colors_["brown4"] = RGBColor(139, 35, 35);
+  colors_["burlywood"] = RGBColor(222, 184, 135);
+  colors_["burlywood1"] = RGBColor(255, 211, 155);
+  colors_["burlywood2"] = RGBColor(238, 197, 145);
+  colors_["burlywood3"] = RGBColor(205, 170, 125);
+  colors_["burlywood4"] = RGBColor(139, 115, 85);
+  colors_["cadetblue"] = RGBColor(95, 158, 160);
+  colors_["cadetblue1"] = RGBColor(152, 245, 255);
+  colors_["cadetblue2"] = RGBColor(142, 229, 238);
+  colors_["cadetblue3"] = RGBColor(122, 197, 205);
+  colors_["cadetblue4"] = RGBColor(83, 134, 139);
+  colors_["chartreuse"] = RGBColor(127, 255, 0);
+  colors_["chartreuse1"] = RGBColor(127, 255, 0);
+  colors_["chartreuse2"] = RGBColor(118, 238, 0);
+  colors_["chartreuse3"] = RGBColor(102, 205, 0);
+  colors_["chartreuse4"] = RGBColor(69, 139, 0);
+  colors_["chocolate"] = RGBColor(210, 105, 30);
+  colors_["chocolate1"] = RGBColor(255, 127, 36);
+  colors_["chocolate2"] = RGBColor(238, 118, 33);
+  colors_["chocolate3"] = RGBColor(205, 102, 29);
+  colors_["chocolate4"] = RGBColor(139, 69, 19);
+  colors_["coral"] = RGBColor(255, 127, 80);
+  colors_["coral1"] = RGBColor(255, 114, 86);
+  colors_["coral2"] = RGBColor(238, 106, 80);
+  colors_["coral3"] = RGBColor(205, 91, 69);
+  colors_["coral4"] = RGBColor(139, 62, 47);
+  colors_["cornflowerblue"] = RGBColor(100, 149, 237);
+  colors_["cornsilk"] = RGBColor(255, 248, 220);
+  colors_["cornsilk1"] = RGBColor(255, 248, 220);
+  colors_["cornsilk2"] = RGBColor(238, 232, 205);
+  colors_["cornsilk3"] = RGBColor(205, 200, 177);
+  colors_["cornsilk4"] = RGBColor(139, 136, 120);
+  colors_["cyan"] = RGBColor(0, 255, 255);
+  colors_["cyan1"] = RGBColor(0, 255, 255);
+  colors_["cyan2"] = RGBColor(0, 238, 238);
+  colors_["cyan3"] = RGBColor(0, 205, 205);
+  colors_["cyan4"] = RGBColor(0, 139, 139);
+  colors_["darkblue"] = RGBColor(0, 0, 139);
+  colors_["darkcyan"] = RGBColor(0, 139, 139);
+  colors_["darkgoldenrod"] = RGBColor(184, 134, 11);
+  colors_["darkgoldenrod1"] = RGBColor(255, 185, 15);
+  colors_["darkgoldenrod2"] = RGBColor(238, 173, 14);
+  colors_["darkgoldenrod3"] = RGBColor(205, 149, 12);
+  colors_["darkgoldenrod4"] = RGBColor(139, 101, 8);
+  colors_["darkgray"] = RGBColor(169, 169, 169);
+  colors_["darkgreen"] = RGBColor(0, 100, 0);
+  colors_["darkgrey"] = RGBColor(169, 169, 169);
+  colors_["darkkhaki"] = RGBColor(189, 183, 107);
+  colors_["darkmagenta"] = RGBColor(139, 0, 139);
+  colors_["darkolivegreen"] = RGBColor(85, 107, 47);
+  colors_["darkolivegreen1"] = RGBColor(202, 255, 112);
+  colors_["darkolivegreen2"] = RGBColor(188, 238, 104);
+  colors_["darkolivegreen3"] = RGBColor(162, 205, 90);
+  colors_["darkolivegreen4"] = RGBColor(110, 139, 61);
+  colors_["darkorange"] = RGBColor(255, 140, 0);
+  colors_["darkorange1"] = RGBColor(255, 127, 0);
+  colors_["darkorange2"] = RGBColor(238, 118, 0);
+  colors_["darkorange3"] = RGBColor(205, 102, 0);
+  colors_["darkorange4"] = RGBColor(139, 69, 0);
+  colors_["darkorchid"] = RGBColor(153, 50, 204);
+  colors_["darkorchid1"] = RGBColor(191, 62, 255);
+  colors_["darkorchid2"] = RGBColor(178, 58, 238);
+  colors_["darkorchid3"] = RGBColor(154, 50, 205);
+  colors_["darkorchid4"] = RGBColor(104, 34, 139);
+  colors_["darkred"] = RGBColor(139, 0, 0);
+  colors_["darksalmon"] = RGBColor(233, 150, 122);
+  colors_["darkseagreen"] = RGBColor(143, 188, 143);
+  colors_["darkseagreen1"] = RGBColor(193, 255, 193);
+  colors_["darkseagreen2"] = RGBColor(180, 238, 180);
+  colors_["darkseagreen3"] = RGBColor(155, 205, 155);
+  colors_["darkseagreen4"] = RGBColor(105, 139, 105);
+  colors_["darkslateblue"] = RGBColor(72, 61, 139);
+  colors_["darkslategray"] = RGBColor(47, 79, 79);
+  colors_["darkslategray1"] = RGBColor(151, 255, 255);
+  colors_["darkslategray2"] = RGBColor(141, 238, 238);
+  colors_["darkslategray3"] = RGBColor(121, 205, 205);
+  colors_["darkslategray4"] = RGBColor(82, 139, 139);
+  colors_["darkslategrey"] = RGBColor(47, 79, 79);
+  colors_["darkturquoise"] = RGBColor(0, 206, 209);
+  colors_["darkviolet"] = RGBColor(148, 0, 211);
+  colors_["deeppink"] = RGBColor(255, 20, 147);
+  colors_["deeppink1"] = RGBColor(255, 20, 147);
+  colors_["deeppink2"] = RGBColor(238, 18, 137);
+  colors_["deeppink3"] = RGBColor(205, 16, 118);
+  colors_["deeppink4"] = RGBColor(139, 10, 80);
+  colors_["deepskyblue"] = RGBColor(0, 191, 255);
+  colors_["deepskyblue1"] = RGBColor(0, 191, 255);
+  colors_["deepskyblue2"] = RGBColor(0, 178, 238);
+  colors_["deepskyblue3"] = RGBColor(0, 154, 205);
+  colors_["deepskyblue4"] = RGBColor(0, 104, 139);
+  colors_["dimgray"] = RGBColor(105, 105, 105);
+  colors_["dimgrey"] = RGBColor(105, 105, 105);
+  colors_["dodgerblue"] = RGBColor(30, 144, 255);
+  colors_["dodgerblue1"] = RGBColor(30, 144, 255);
+  colors_["dodgerblue2"] = RGBColor(28, 134, 238);
+  colors_["dodgerblue3"] = RGBColor(24, 116, 205);
+  colors_["dodgerblue4"] = RGBColor(16, 78, 139);
+  colors_["firebrick"] = RGBColor(178, 34, 34);
+  colors_["firebrick1"] = RGBColor(255, 48, 48);
+  colors_["firebrick2"] = RGBColor(238, 44, 44);
+  colors_["firebrick3"] = RGBColor(205, 38, 38);
+  colors_["firebrick4"] = RGBColor(139, 26, 26);
+  colors_["floralwhite"] = RGBColor(255, 250, 240);
+  colors_["forestgreen"] = RGBColor(34, 139, 34);
+  colors_["gainsboro"] = RGBColor(220, 220, 220);
+  colors_["ghostwhite"] = RGBColor(248, 248, 255);
+  colors_["gold"] = RGBColor(255, 215, 0);
+  colors_["gold1"] = RGBColor(255, 215, 0);
+  colors_["gold2"] = RGBColor(238, 201, 0);
+  colors_["gold3"] = RGBColor(205, 173, 0);
+  colors_["gold4"] = RGBColor(139, 117, 0);
+  colors_["goldenrod"] = RGBColor(218, 165, 32);
+  colors_["goldenrod1"] = RGBColor(255, 193, 37);
+  colors_["goldenrod2"] = RGBColor(238, 180, 34);
+  colors_["goldenrod3"] = RGBColor(205, 155, 29);
+  colors_["goldenrod4"] = RGBColor(139, 105, 20);
+  colors_["gray"] = RGBColor(190, 190, 190);
+  colors_["gray0"] = RGBColor(0, 0, 0);
+  colors_["gray1"] = RGBColor(3, 3, 3);
+  colors_["gray2"] = RGBColor(5, 5, 5);
+  colors_["gray3"] = RGBColor(8, 8, 8);
+  colors_["gray4"] = RGBColor(10, 10, 10);
+  colors_["gray5"] = RGBColor(13, 13, 13);
+  colors_["gray6"] = RGBColor(15, 15, 15);
+  colors_["gray7"] = RGBColor(18, 18, 18);
+  colors_["gray8"] = RGBColor(20, 20, 20);
+  colors_["gray9"] = RGBColor(23, 23, 23);
+  colors_["gray10"] = RGBColor(26, 26, 26);
+  colors_["gray11"] = RGBColor(28, 28, 28);
+  colors_["gray12"] = RGBColor(31, 31, 31);
+  colors_["gray13"] = RGBColor(33, 33, 33);
+  colors_["gray14"] = RGBColor(36, 36, 36);
+  colors_["gray15"] = RGBColor(38, 38, 38);
+  colors_["gray16"] = RGBColor(41, 41, 41);
+  colors_["gray17"] = RGBColor(43, 43, 43);
+  colors_["gray18"] = RGBColor(46, 46, 46);
+  colors_["gray19"] = RGBColor(48, 48, 48);
+  colors_["gray20"] = RGBColor(51, 51, 51);
+  colors_["gray21"] = RGBColor(54, 54, 54);
+  colors_["gray22"] = RGBColor(56, 56, 56);
+  colors_["gray23"] = RGBColor(59, 59, 59);
+  colors_["gray24"] = RGBColor(61, 61, 61);
+  colors_["gray25"] = RGBColor(64, 64, 64);
+  colors_["gray26"] = RGBColor(66, 66, 66);
+  colors_["gray27"] = RGBColor(69, 69, 69);
+  colors_["gray28"] = RGBColor(71, 71, 71);
+  colors_["gray29"] = RGBColor(74, 74, 74);
+  colors_["gray30"] = RGBColor(77, 77, 77);
+  colors_["gray31"] = RGBColor(79, 79, 79);
+  colors_["gray32"] = RGBColor(82, 82, 82);
+  colors_["gray33"] = RGBColor(84, 84, 84);
+  colors_["gray34"] = RGBColor(87, 87, 87);
+  colors_["gray35"] = RGBColor(89, 89, 89);
+  colors_["gray36"] = RGBColor(92, 92, 92);
+  colors_["gray37"] = RGBColor(94, 94, 94);
+  colors_["gray38"] = RGBColor(97, 97, 97);
+  colors_["gray39"] = RGBColor(99, 99, 99);
+  colors_["gray40"] = RGBColor(102, 102, 102);
+  colors_["gray41"] = RGBColor(105, 105, 105);
+  colors_["gray42"] = RGBColor(107, 107, 107);
+  colors_["gray43"] = RGBColor(110, 110, 110);
+  colors_["gray44"] = RGBColor(112, 112, 112);
+  colors_["gray45"] = RGBColor(115, 115, 115);
+  colors_["gray46"] = RGBColor(117, 117, 117);
+  colors_["gray47"] = RGBColor(120, 120, 120);
+  colors_["gray48"] = RGBColor(122, 122, 122);
+  colors_["gray49"] = RGBColor(125, 125, 125);
+  colors_["gray50"] = RGBColor(127, 127, 127);
+  colors_["gray51"] = RGBColor(130, 130, 130);
+  colors_["gray52"] = RGBColor(133, 133, 133);
+  colors_["gray53"] = RGBColor(135, 135, 135);
+  colors_["gray54"] = RGBColor(138, 138, 138);
+  colors_["gray55"] = RGBColor(140, 140, 140);
+  colors_["gray56"] = RGBColor(143, 143, 143);
+  colors_["gray57"] = RGBColor(145, 145, 145);
+  colors_["gray58"] = RGBColor(148, 148, 148);
+  colors_["gray59"] = RGBColor(150, 150, 150);
+  colors_["gray60"] = RGBColor(153, 153, 153);
+  colors_["gray61"] = RGBColor(156, 156, 156);
+  colors_["gray62"] = RGBColor(158, 158, 158);
+  colors_["gray63"] = RGBColor(161, 161, 161);
+  colors_["gray64"] = RGBColor(163, 163, 163);
+  colors_["gray65"] = RGBColor(166, 166, 166);
+  colors_["gray66"] = RGBColor(168, 168, 168);
+  colors_["gray67"] = RGBColor(171, 171, 171);
+  colors_["gray68"] = RGBColor(173, 173, 173);
+  colors_["gray69"] = RGBColor(176, 176, 176);
+  colors_["gray70"] = RGBColor(179, 179, 179);
+  colors_["gray71"] = RGBColor(181, 181, 181);
+  colors_["gray72"] = RGBColor(184, 184, 184);
+  colors_["gray73"] = RGBColor(186, 186, 186);
+  colors_["gray74"] = RGBColor(189, 189, 189);
+  colors_["gray75"] = RGBColor(191, 191, 191);
+  colors_["gray76"] = RGBColor(194, 194, 194);
+  colors_["gray77"] = RGBColor(196, 196, 196);
+  colors_["gray78"] = RGBColor(199, 199, 199);
+  colors_["gray79"] = RGBColor(201, 201, 201);
+  colors_["gray80"] = RGBColor(204, 204, 204);
+  colors_["gray81"] = RGBColor(207, 207, 207);
+  colors_["gray82"] = RGBColor(209, 209, 209);
+  colors_["gray83"] = RGBColor(212, 212, 212);
+  colors_["gray84"] = RGBColor(214, 214, 214);
+  colors_["gray85"] = RGBColor(217, 217, 217);
+  colors_["gray86"] = RGBColor(219, 219, 219);
+  colors_["gray87"] = RGBColor(222, 222, 222);
+  colors_["gray88"] = RGBColor(224, 224, 224);
+  colors_["gray89"] = RGBColor(227, 227, 227);
+  colors_["gray90"] = RGBColor(229, 229, 229);
+  colors_["gray91"] = RGBColor(232, 232, 232);
+  colors_["gray92"] = RGBColor(235, 235, 235);
+  colors_["gray93"] = RGBColor(237, 237, 237);
+  colors_["gray94"] = RGBColor(240, 240, 240);
+  colors_["gray95"] = RGBColor(242, 242, 242);
+  colors_["gray96"] = RGBColor(245, 245, 245);
+  colors_["gray97"] = RGBColor(247, 247, 247);
+  colors_["gray98"] = RGBColor(250, 250, 250);
+  colors_["gray99"] = RGBColor(252, 252, 252);
+  colors_["gray100"] = RGBColor(255, 255, 255);
+  colors_["green"] = RGBColor(0, 255, 0);
+  colors_["green1"] = RGBColor(0, 255, 0);
+  colors_["green2"] = RGBColor(0, 238, 0);
+  colors_["green3"] = RGBColor(0, 205, 0);
+  colors_["green4"] = RGBColor(0, 139, 0);
+  colors_["greenyellow"] = RGBColor(173, 255, 47);
+  colors_["grey"] = RGBColor(190, 190, 190);
+  colors_["grey0"] = RGBColor(0, 0, 0);
+  colors_["grey1"] = RGBColor(3, 3, 3);
+  colors_["grey2"] = RGBColor(5, 5, 5);
+  colors_["grey3"] = RGBColor(8, 8, 8);
+  colors_["grey4"] = RGBColor(10, 10, 10);
+  colors_["grey5"] = RGBColor(13, 13, 13);
+  colors_["grey6"] = RGBColor(15, 15, 15);
+  colors_["grey7"] = RGBColor(18, 18, 18);
+  colors_["grey8"] = RGBColor(20, 20, 20);
+  colors_["grey9"] = RGBColor(23, 23, 23);
+  colors_["grey10"] = RGBColor(26, 26, 26);
+  colors_["grey11"] = RGBColor(28, 28, 28);
+  colors_["grey12"] = RGBColor(31, 31, 31);
+  colors_["grey13"] = RGBColor(33, 33, 33);
+  colors_["grey14"] = RGBColor(36, 36, 36);
+  colors_["grey15"] = RGBColor(38, 38, 38);
+  colors_["grey16"] = RGBColor(41, 41, 41);
+  colors_["grey17"] = RGBColor(43, 43, 43);
+  colors_["grey18"] = RGBColor(46, 46, 46);
+  colors_["grey19"] = RGBColor(48, 48, 48);
+  colors_["grey20"] = RGBColor(51, 51, 51);
+  colors_["grey21"] = RGBColor(54, 54, 54);
+  colors_["grey22"] = RGBColor(56, 56, 56);
+  colors_["grey23"] = RGBColor(59, 59, 59);
+  colors_["grey24"] = RGBColor(61, 61, 61);
+  colors_["grey25"] = RGBColor(64, 64, 64);
+  colors_["grey26"] = RGBColor(66, 66, 66);
+  colors_["grey27"] = RGBColor(69, 69, 69);
+  colors_["grey28"] = RGBColor(71, 71, 71);
+  colors_["grey29"] = RGBColor(74, 74, 74);
+  colors_["grey30"] = RGBColor(77, 77, 77);
+  colors_["grey31"] = RGBColor(79, 79, 79);
+  colors_["grey32"] = RGBColor(82, 82, 82);
+  colors_["grey33"] = RGBColor(84, 84, 84);
+  colors_["grey34"] = RGBColor(87, 87, 87);
+  colors_["grey35"] = RGBColor(89, 89, 89);
+  colors_["grey36"] = RGBColor(92, 92, 92);
+  colors_["grey37"] = RGBColor(94, 94, 94);
+  colors_["grey38"] = RGBColor(97, 97, 97);
+  colors_["grey39"] = RGBColor(99, 99, 99);
+  colors_["grey40"] = RGBColor(102, 102, 102);
+  colors_["grey41"] = RGBColor(105, 105, 105);
+  colors_["grey42"] = RGBColor(107, 107, 107);
+  colors_["grey43"] = RGBColor(110, 110, 110);
+  colors_["grey44"] = RGBColor(112, 112, 112);
+  colors_["grey45"] = RGBColor(115, 115, 115);
+  colors_["grey46"] = RGBColor(117, 117, 117);
+  colors_["grey47"] = RGBColor(120, 120, 120);
+  colors_["grey48"] = RGBColor(122, 122, 122);
+  colors_["grey49"] = RGBColor(125, 125, 125);
+  colors_["grey50"] = RGBColor(127, 127, 127);
+  colors_["grey51"] = RGBColor(130, 130, 130);
+  colors_["grey52"] = RGBColor(133, 133, 133);
+  colors_["grey53"] = RGBColor(135, 135, 135);
+  colors_["grey54"] = RGBColor(138, 138, 138);
+  colors_["grey55"] = RGBColor(140, 140, 140);
+  colors_["grey56"] = RGBColor(143, 143, 143);
+  colors_["grey57"] = RGBColor(145, 145, 145);
+  colors_["grey58"] = RGBColor(148, 148, 148);
+  colors_["grey59"] = RGBColor(150, 150, 150);
+  colors_["grey60"] = RGBColor(153, 153, 153);
+  colors_["grey61"] = RGBColor(156, 156, 156);
+  colors_["grey62"] = RGBColor(158, 158, 158);
+  colors_["grey63"] = RGBColor(161, 161, 161);
+  colors_["grey64"] = RGBColor(163, 163, 163);
+  colors_["grey65"] = RGBColor(166, 166, 166);
+  colors_["grey66"] = RGBColor(168, 168, 168);
+  colors_["grey67"] = RGBColor(171, 171, 171);
+  colors_["grey68"] = RGBColor(173, 173, 173);
+  colors_["grey69"] = RGBColor(176, 176, 176);
+  colors_["grey70"] = RGBColor(179, 179, 179);
+  colors_["grey71"] = RGBColor(181, 181, 181);
+  colors_["grey72"] = RGBColor(184, 184, 184);
+  colors_["grey73"] = RGBColor(186, 186, 186);
+  colors_["grey74"] = RGBColor(189, 189, 189);
+  colors_["grey75"] = RGBColor(191, 191, 191);
+  colors_["grey76"] = RGBColor(194, 194, 194);
+  colors_["grey77"] = RGBColor(196, 196, 196);
+  colors_["grey78"] = RGBColor(199, 199, 199);
+  colors_["grey79"] = RGBColor(201, 201, 201);
+  colors_["grey80"] = RGBColor(204, 204, 204);
+  colors_["grey81"] = RGBColor(207, 207, 207);
+  colors_["grey82"] = RGBColor(209, 209, 209);
+  colors_["grey83"] = RGBColor(212, 212, 212);
+  colors_["grey84"] = RGBColor(214, 214, 214);
+  colors_["grey85"] = RGBColor(217, 217, 217);
+  colors_["grey86"] = RGBColor(219, 219, 219);
+  colors_["grey87"] = RGBColor(222, 222, 222);
+  colors_["grey88"] = RGBColor(224, 224, 224);
+  colors_["grey89"] = RGBColor(227, 227, 227);
+  colors_["grey90"] = RGBColor(229, 229, 229);
+  colors_["grey91"] = RGBColor(232, 232, 232);
+  colors_["grey92"] = RGBColor(235, 235, 235);
+  colors_["grey93"] = RGBColor(237, 237, 237);
+  colors_["grey94"] = RGBColor(240, 240, 240);
+  colors_["grey95"] = RGBColor(242, 242, 242);
+  colors_["grey96"] = RGBColor(245, 245, 245);
+  colors_["grey97"] = RGBColor(247, 247, 247);
+  colors_["grey98"] = RGBColor(250, 250, 250);
+  colors_["grey99"] = RGBColor(252, 252, 252);
+  colors_["grey100"] = RGBColor(255, 255, 255);
+  colors_["honeydew"] = RGBColor(240, 255, 240);
+  colors_["honeydew1"] = RGBColor(240, 255, 240);
+  colors_["honeydew2"] = RGBColor(224, 238, 224);
+  colors_["honeydew3"] = RGBColor(193, 205, 193);
+  colors_["honeydew4"] = RGBColor(131, 139, 131);
+  colors_["hotpink"] = RGBColor(255, 105, 180);
+  colors_["hotpink1"] = RGBColor(255, 110, 180);
+  colors_["hotpink2"] = RGBColor(238, 106, 167);
+  colors_["hotpink3"] = RGBColor(205, 96, 144);
+  colors_["hotpink4"] = RGBColor(139, 58, 98);
+  colors_["indianred"] = RGBColor(205, 92, 92);
+  colors_["indianred1"] = RGBColor(255, 106, 106);
+  colors_["indianred2"] = RGBColor(238, 99, 99);
+  colors_["indianred3"] = RGBColor(205, 85, 85);
+  colors_["indianred4"] = RGBColor(139, 58, 58);
+  colors_["ivory"] = RGBColor(255, 255, 240);
+  colors_["ivory1"] = RGBColor(255, 255, 240);
+  colors_["ivory2"] = RGBColor(238, 238, 224);
+  colors_["ivory3"] = RGBColor(205, 205, 193);
+  colors_["ivory4"] = RGBColor(139, 139, 131);
+  colors_["khaki"] = RGBColor(240, 230, 140);
+  colors_["khaki1"] = RGBColor(255, 246, 143);
+  colors_["khaki2"] = RGBColor(238, 230, 133);
+  colors_["khaki3"] = RGBColor(205, 198, 115);
+  colors_["khaki4"] = RGBColor(139, 134, 78);
+  colors_["lavender"] = RGBColor(230, 230, 250);
+  colors_["lavenderblush"] = RGBColor(255, 240, 245);
+  colors_["lavenderblush1"] = RGBColor(255, 240, 245);
+  colors_["lavenderblush2"] = RGBColor(238, 224, 229);
+  colors_["lavenderblush3"] = RGBColor(205, 193, 197);
+  colors_["lavenderblush4"] = RGBColor(139, 131, 134);
+  colors_["lawngreen"] = RGBColor(124, 252, 0);
+  colors_["lemonchiffon"] = RGBColor(255, 250, 205);
+  colors_["lemonchiffon1"] = RGBColor(255, 250, 205);
+  colors_["lemonchiffon2"] = RGBColor(238, 233, 191);
+  colors_["lemonchiffon3"] = RGBColor(205, 201, 165);
+  colors_["lemonchiffon4"] = RGBColor(139, 137, 112);
+  colors_["lightblue"] = RGBColor(173, 216, 230);
+  colors_["lightblue1"] = RGBColor(191, 239, 255);
+  colors_["lightblue2"] = RGBColor(178, 223, 238);
+  colors_["lightblue3"] = RGBColor(154, 192, 205);
+  colors_["lightblue4"] = RGBColor(104, 131, 139);
+  colors_["lightcoral"] = RGBColor(240, 128, 128);
+  colors_["lightcyan"] = RGBColor(224, 255, 255);
+  colors_["lightcyan1"] = RGBColor(224, 255, 255);
+  colors_["lightcyan2"] = RGBColor(209, 238, 238);
+  colors_["lightcyan3"] = RGBColor(180, 205, 205);
+  colors_["lightcyan4"] = RGBColor(122, 139, 139);
+  colors_["lightgoldenrod"] = RGBColor(238, 221, 130);
+  colors_["lightgoldenrod1"] = RGBColor(255, 236, 139);
+  colors_["lightgoldenrod2"] = RGBColor(238, 220, 130);
+  colors_["lightgoldenrod3"] = RGBColor(205, 190, 112);
+  colors_["lightgoldenrod4"] = RGBColor(139, 129, 76);
+  colors_["lightgoldenrodyellow"] = RGBColor(250, 250, 210);
+  colors_["lightgray"] = RGBColor(211, 211, 211);
+  colors_["lightgreen"] = RGBColor(144, 238, 144);
+  colors_["lightgrey"] = RGBColor(211, 211, 211);
+  colors_["lightpink"] = RGBColor(255, 182, 193);
+  colors_["lightpink1"] = RGBColor(255, 174, 185);
+  colors_["lightpink2"] = RGBColor(238, 162, 173);
+  colors_["lightpink3"] = RGBColor(205, 140, 149);
+  colors_["lightpink4"] = RGBColor(139, 95, 101);
+  colors_["lightsalmon"] = RGBColor(255, 160, 122);
+  colors_["lightsalmon1"] = RGBColor(255, 160, 122);
+  colors_["lightsalmon2"] = RGBColor(238, 149, 114);
+  colors_["lightsalmon3"] = RGBColor(205, 129, 98);
+  colors_["lightsalmon4"] = RGBColor(139, 87, 66);
+  colors_["lightseagreen"] = RGBColor(32, 178, 170);
+  colors_["lightskyblue"] = RGBColor(135, 206, 250);
+  colors_["lightskyblue1"] = RGBColor(176, 226, 255);
+  colors_["lightskyblue2"] = RGBColor(164, 211, 238);
+  colors_["lightskyblue3"] = RGBColor(141, 182, 205);
+  colors_["lightskyblue4"] = RGBColor(96, 123, 139);
+  colors_["lightslateblue"] = RGBColor(132, 112, 255);
+  colors_["lightslategray"] = RGBColor(119, 136, 153);
+  colors_["lightslategrey"] = RGBColor(119, 136, 153);
+  colors_["lightsteelblue"] = RGBColor(176, 196, 222);
+  colors_["lightsteelblue1"] = RGBColor(202, 225, 255);
+  colors_["lightsteelblue2"] = RGBColor(188, 210, 238);
+  colors_["lightsteelblue3"] = RGBColor(162, 181, 205);
+  colors_["lightsteelblue4"] = RGBColor(110, 123, 139);
+  colors_["lightyellow"] = RGBColor(255, 255, 224);
+  colors_["lightyellow1"] = RGBColor(255, 255, 224);
+  colors_["lightyellow2"] = RGBColor(238, 238, 209);
+  colors_["lightyellow3"] = RGBColor(205, 205, 180);
+  colors_["lightyellow4"] = RGBColor(139, 139, 122);
+  colors_["limegreen"] = RGBColor(50, 205, 50);
+  colors_["linen"] = RGBColor(250, 240, 230);
+  colors_["magenta"] = RGBColor(255, 0, 255);
+  colors_["magenta1"] = RGBColor(255, 0, 255);
+  colors_["magenta2"] = RGBColor(238, 0, 238);
+  colors_["magenta3"] = RGBColor(205, 0, 205);
+  colors_["magenta4"] = RGBColor(139, 0, 139);
+  colors_["maroon"] = RGBColor(176, 48, 96);
+  colors_["maroon1"] = RGBColor(255, 52, 179);
+  colors_["maroon2"] = RGBColor(238, 48, 167);
+  colors_["maroon3"] = RGBColor(205, 41, 144);
+  colors_["maroon4"] = RGBColor(139, 28, 98);
+  colors_["mediumaquamarine"] = RGBColor(102, 205, 170);
+  colors_["mediumblue"] = RGBColor(0, 0, 205);
+  colors_["mediumorchid"] = RGBColor(186, 85, 211);
+  colors_["mediumorchid1"] = RGBColor(224, 102, 255);
+  colors_["mediumorchid2"] = RGBColor(209, 95, 238);
+  colors_["mediumorchid3"] = RGBColor(180, 82, 205);
+  colors_["mediumorchid4"] = RGBColor(122, 55, 139);
+  colors_["mediumpurple"] = RGBColor(147, 112, 219);
+  colors_["mediumpurple1"] = RGBColor(171, 130, 255);
+  colors_["mediumpurple2"] = RGBColor(159, 121, 238);
+  colors_["mediumpurple3"] = RGBColor(137, 104, 205);
+  colors_["mediumpurple4"] = RGBColor(93, 71, 139);
+  colors_["mediumseagreen"] = RGBColor(60, 179, 113);
+  colors_["mediumslateblue"] = RGBColor(123, 104, 238);
+  colors_["mediumspringgreen"] = RGBColor(0, 250, 154);
+  colors_["mediumturquoise"] = RGBColor(72, 209, 204);
+  colors_["mediumvioletred"] = RGBColor(199, 21, 133);
+  colors_["midnightblue"] = RGBColor(25, 25, 112);
+  colors_["mintcream"] = RGBColor(245, 255, 250);
+  colors_["mistyrose"] = RGBColor(255, 228, 225);
+  colors_["mistyrose1"] = RGBColor(255, 228, 225);
+  colors_["mistyrose2"] = RGBColor(238, 213, 210);
+  colors_["mistyrose3"] = RGBColor(205, 183, 181);
+  colors_["mistyrose4"] = RGBColor(139, 125, 123);
+  colors_["moccasin"] = RGBColor(255, 228, 181);
+  colors_["navajowhite"] = RGBColor(255, 222, 173);
+  colors_["navajowhite1"] = RGBColor(255, 222, 173);
+  colors_["navajowhite2"] = RGBColor(238, 207, 161);
+  colors_["navajowhite3"] = RGBColor(205, 179, 139);
+  colors_["navajowhite4"] = RGBColor(139, 121, 94);
+  colors_["navy"] = RGBColor(0, 0, 128);
+  colors_["navyblue"] = RGBColor(0, 0, 128);
+  colors_["oldlace"] = RGBColor(253, 245, 230);
+  colors_["olivedrab"] = RGBColor(107, 142, 35);
+  colors_["olivedrab1"] = RGBColor(192, 255, 62);
+  colors_["olivedrab2"] = RGBColor(179, 238, 58);
+  colors_["olivedrab3"] = RGBColor(154, 205, 50);
+  colors_["olivedrab4"] = RGBColor(105, 139, 34);
+  colors_["orange"] = RGBColor(255, 165, 0);
+  colors_["orange1"] = RGBColor(255, 165, 0);
+  colors_["orange2"] = RGBColor(238, 154, 0);
+  colors_["orange3"] = RGBColor(205, 133, 0);
+  colors_["orange4"] = RGBColor(139, 90, 0);
+  colors_["orangered"] = RGBColor(255, 69, 0);
+  colors_["orangered1"] = RGBColor(255, 69, 0);
+  colors_["orangered2"] = RGBColor(238, 64, 0);
+  colors_["orangered3"] = RGBColor(205, 55, 0);
+  colors_["orangered4"] = RGBColor(139, 37, 0);
+  colors_["orchid"] = RGBColor(218, 112, 214);
+  colors_["orchid1"] = RGBColor(255, 131, 250);
+  colors_["orchid2"] = RGBColor(238, 122, 233);
+  colors_["orchid3"] = RGBColor(205, 105, 201);
+  colors_["orchid4"] = RGBColor(139, 71, 137);
+  colors_["palegoldenrod"] = RGBColor(238, 232, 170);
+  colors_["palegreen"] = RGBColor(152, 251, 152);
+  colors_["palegreen1"] = RGBColor(154, 255, 154);
+  colors_["palegreen2"] = RGBColor(144, 238, 144);
+  colors_["palegreen3"] = RGBColor(124, 205, 124);
+  colors_["palegreen4"] = RGBColor(84, 139, 84);
+  colors_["paleturquoise"] = RGBColor(175, 238, 238);
+  colors_["paleturquoise1"] = RGBColor(187, 255, 255);
+  colors_["paleturquoise2"] = RGBColor(174, 238, 238);
+  colors_["paleturquoise3"] = RGBColor(150, 205, 205);
+  colors_["paleturquoise4"] = RGBColor(102, 139, 139);
+  colors_["palevioletred"] = RGBColor(219, 112, 147);
+  colors_["palevioletred1"] = RGBColor(255, 130, 171);
+  colors_["palevioletred2"] = RGBColor(238, 121, 159);
+  colors_["palevioletred3"] = RGBColor(205, 104, 137);
+  colors_["palevioletred4"] = RGBColor(139, 71, 93);
+  colors_["papayawhip"] = RGBColor(255, 239, 213);
+  colors_["peachpuff"] = RGBColor(255, 218, 185);
+  colors_["peachpuff1"] = RGBColor(255, 218, 185);
+  colors_["peachpuff2"] = RGBColor(238, 203, 173);
+  colors_["peachpuff3"] = RGBColor(205, 175, 149);
+  colors_["peachpuff4"] = RGBColor(139, 119, 101);
+  colors_["peru"] = RGBColor(205, 133, 63);
+  colors_["pink"] = RGBColor(255, 192, 203);
+  colors_["pink1"] = RGBColor(255, 181, 197);
+  colors_["pink2"] = RGBColor(238, 169, 184);
+  colors_["pink3"] = RGBColor(205, 145, 158);
+  colors_["pink4"] = RGBColor(139, 99, 108);
+  colors_["plum"] = RGBColor(221, 160, 221);
+  colors_["plum1"] = RGBColor(255, 187, 255);
+  colors_["plum2"] = RGBColor(238, 174, 238);
+  colors_["plum3"] = RGBColor(205, 150, 205);
+  colors_["plum4"] = RGBColor(139, 102, 139);
+  colors_["powderblue"] = RGBColor(176, 224, 230);
+  colors_["purple"] = RGBColor(160, 32, 240);
+  colors_["purple1"] = RGBColor(155, 48, 255);
+  colors_["purple2"] = RGBColor(145, 44, 238);
+  colors_["purple3"] = RGBColor(125, 38, 205);
+  colors_["purple4"] = RGBColor(85, 26, 139);
+  colors_["red"] = RGBColor(255, 0, 0);
+  colors_["red1"] = RGBColor(255, 0, 0);
+  colors_["red2"] = RGBColor(238, 0, 0);
+  colors_["red3"] = RGBColor(205, 0, 0);
+  colors_["red4"] = RGBColor(139, 0, 0);
+  colors_["rosybrown"] = RGBColor(188, 143, 143);
+  colors_["rosybrown1"] = RGBColor(255, 193, 193);
+  colors_["rosybrown2"] = RGBColor(238, 180, 180);
+  colors_["rosybrown3"] = RGBColor(205, 155, 155);
+  colors_["rosybrown4"] = RGBColor(139, 105, 105);
+  colors_["royalblue"] = RGBColor(65, 105, 225);
+  colors_["royalblue1"] = RGBColor(72, 118, 255);
+  colors_["royalblue2"] = RGBColor(67, 110, 238);
+  colors_["royalblue3"] = RGBColor(58, 95, 205);
+  colors_["royalblue4"] = RGBColor(39, 64, 139);
+  colors_["saddlebrown"] = RGBColor(139, 69, 19);
+  colors_["salmon"] = RGBColor(250, 128, 114);
+  colors_["salmon1"] = RGBColor(255, 140, 105);
+  colors_["salmon2"] = RGBColor(238, 130, 98);
+  colors_["salmon3"] = RGBColor(205, 112, 84);
+  colors_["salmon4"] = RGBColor(139, 76, 57);
+  colors_["sandybrown"] = RGBColor(244, 164, 96);
+  colors_["seagreen"] = RGBColor(46, 139, 87);
+  colors_["seagreen1"] = RGBColor(84, 255, 159);
+  colors_["seagreen2"] = RGBColor(78, 238, 148);
+  colors_["seagreen3"] = RGBColor(67, 205, 128);
+  colors_["seagreen4"] = RGBColor(46, 139, 87);
+  colors_["seashell"] = RGBColor(255, 245, 238);
+  colors_["seashell1"] = RGBColor(255, 245, 238);
+  colors_["seashell2"] = RGBColor(238, 229, 222);
+  colors_["seashell3"] = RGBColor(205, 197, 191);
+  colors_["seashell4"] = RGBColor(139, 134, 130);
+  colors_["sienna"] = RGBColor(160, 82, 45);
+  colors_["sienna1"] = RGBColor(255, 130, 71);
+  colors_["sienna2"] = RGBColor(238, 121, 66);
+  colors_["sienna3"] = RGBColor(205, 104, 57);
+  colors_["sienna4"] = RGBColor(139, 71, 38);
+  colors_["skyblue"] = RGBColor(135, 206, 235);
+  colors_["skyblue1"] = RGBColor(135, 206, 255);
+  colors_["skyblue2"] = RGBColor(126, 192, 238);
+  colors_["skyblue3"] = RGBColor(108, 166, 205);
+  colors_["skyblue4"] = RGBColor(74, 112, 139);
+  colors_["slateblue"] = RGBColor(106, 90, 205);
+  colors_["slateblue1"] = RGBColor(131, 111, 255);
+  colors_["slateblue2"] = RGBColor(122, 103, 238);
+  colors_["slateblue3"] = RGBColor(105, 89, 205);
+  colors_["slateblue4"] = RGBColor(71, 60, 139);
+  colors_["slategray"] = RGBColor(112, 128, 144);
+  colors_["slategray1"] = RGBColor(198, 226, 255);
+  colors_["slategray2"] = RGBColor(185, 211, 238);
+  colors_["slategray3"] = RGBColor(159, 182, 205);
+  colors_["slategray4"] = RGBColor(108, 123, 139);
+  colors_["slategrey"] = RGBColor(112, 128, 144);
+  colors_["snow"] = RGBColor(255, 250, 250);
+  colors_["snow1"] = RGBColor(255, 250, 250);
+  colors_["snow2"] = RGBColor(238, 233, 233);
+  colors_["snow3"] = RGBColor(205, 201, 201);
+  colors_["snow4"] = RGBColor(139, 137, 137);
+  colors_["springgreen"] = RGBColor(0, 255, 127);
+  colors_["springgreen1"] = RGBColor(0, 255, 127);
+  colors_["springgreen2"] = RGBColor(0, 238, 118);
+  colors_["springgreen3"] = RGBColor(0, 205, 102);
+  colors_["springgreen4"] = RGBColor(0, 139, 69);
+  colors_["steelblue"] = RGBColor(70, 130, 180);
+  colors_["steelblue1"] = RGBColor(99, 184, 255);
+  colors_["steelblue2"] = RGBColor(92, 172, 238);
+  colors_["steelblue3"] = RGBColor(79, 148, 205);
+  colors_["steelblue4"] = RGBColor(54, 100, 139);
+  colors_["tan"] = RGBColor(210, 180, 140);
+  colors_["tan1"] = RGBColor(255, 165, 79);
+  colors_["tan2"] = RGBColor(238, 154, 73);
+  colors_["tan3"] = RGBColor(205, 133, 63);
+  colors_["tan4"] = RGBColor(139, 90, 43);
+  colors_["thistle"] = RGBColor(216, 191, 216);
+  colors_["thistle1"] = RGBColor(255, 225, 255);
+  colors_["thistle2"] = RGBColor(238, 210, 238);
+  colors_["thistle3"] = RGBColor(205, 181, 205);
+  colors_["thistle4"] = RGBColor(139, 123, 139);
+  colors_["tomato"] = RGBColor(255, 99, 71);
+  colors_["tomato1"] = RGBColor(255, 99, 71);
+  colors_["tomato2"] = RGBColor(238, 92, 66);
+  colors_["tomato3"] = RGBColor(205, 79, 57);
+  colors_["tomato4"] = RGBColor(139, 54, 38);
+  colors_["turquoise"] = RGBColor(64, 224, 208);
+  colors_["turquoise1"] = RGBColor(0, 245, 255);
+  colors_["turquoise2"] = RGBColor(0, 229, 238);
+  colors_["turquoise3"] = RGBColor(0, 197, 205);
+  colors_["turquoise4"] = RGBColor(0, 134, 139);
+  colors_["violet"] = RGBColor(238, 130, 238);
+  colors_["violetred"] = RGBColor(208, 32, 144);
+  colors_["violetred1"] = RGBColor(255, 62, 150);
+  colors_["violetred2"] = RGBColor(238, 58, 140);
+  colors_["violetred3"] = RGBColor(205, 50, 120);
+  colors_["violetred4"] = RGBColor(139, 34, 82);
+  colors_["wheat"] = RGBColor(245, 222, 179);
+  colors_["wheat1"] = RGBColor(255, 231, 186);
+  colors_["wheat2"] = RGBColor(238, 216, 174);
+  colors_["wheat3"] = RGBColor(205, 186, 150);
+  colors_["wheat4"] = RGBColor(139, 126, 102);
+  colors_["whitesmoke"] = RGBColor(245, 245, 245);
+  colors_["yellow"] = RGBColor(255, 255, 0);
+  colors_["yellow1"] = RGBColor(255, 255, 0);
+  colors_["yellow2"] = RGBColor(238, 238, 0);
+  colors_["yellow3"] = RGBColor(205, 205, 0);
+  colors_["yellow4"] = RGBColor(139, 139, 0);
+  colors_["yellowgreen"] = RGBColor(154, 205, 50);
+}
+
diff --git a/src/Bpp/Seq/SiteIterator.h b/src/Bpp/Graphics/R/RColorSet.h
similarity index 65%
copy from src/Bpp/Seq/SiteIterator.h
copy to src/Bpp/Graphics/R/RColorSet.h
index efb427a..970c151 100644
--- a/src/Bpp/Seq/SiteIterator.h
+++ b/src/Bpp/Graphics/R/RColorSet.h
@@ -1,14 +1,14 @@
 //
-// File: SiteIterator.h
+// File: RColorSet.h
 // Created by: Julien Dutheil
-// Created on: Sun Oct 19 12:47:16 2003
+// Created on: Mon Apr 14 2008
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2008)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,44 +37,42 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SITEITERATOR_H_
-#define _SITEITERATOR_H_
+#ifndef _RCOLORSET_H_
+#define _RCOLORSET_H_
 
-#include "Site.h"
+#include "../ColorSet.h"
 
 namespace bpp
 {
 
 /**
- * @brief Generic site iterator interface, allowing to loop over sites.
+ * @brief R color definitions.
  */
-class SiteIterator
+class RColorSet:
+  public AbstractColorSet
 {
-	public:
-		SiteIterator() {}
-		virtual ~SiteIterator() {}
-	
-	public:
-		virtual Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
-};
+  public:
+    /**
+     * The following R code has been used to generate this code:
+     * @code
+     * c<-colors()
+     * file<-"Rcolors.cpp"
+     * unlink(file)
+     * for(i in c)
+     * {
+     *   r<-col2rgb(i)["red",1]
+     *   g<-col2rgb(i)["green",1]
+     *   b<-col2rgb(i)["blue",1]
+     *   cat(file=file, append=TRUE, paste("  _colors[\"",i,"\"] = RGBColor(",r ,", ",g,", ", b, ");\n",sep="")); 
+     * }
+     * @endcode
+     */
+    RColorSet();
+    virtual ~RColorSet() {}
 
-/**
- * @brief Generic const site iterator interface, allowing to loop over const sites.
- */
-class ConstSiteIterator
-{
-	public:
-		ConstSiteIterator() {}
-		virtual ~ConstSiteIterator() {}
-	
-	public:
-		virtual const Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
 };
 
+} // end of namespace bpp;
 
-} //end of namespace bpp.
-
-#endif	//_SITEITERATOR_H_
+#endif //_RCOLORSET_H_
 
diff --git a/src/Bpp/Graphics/RgbColor.h b/src/Bpp/Graphics/RgbColor.h
new file mode 100644
index 0000000..7ba3215
--- /dev/null
+++ b/src/Bpp/Graphics/RgbColor.h
@@ -0,0 +1,152 @@
+//
+// File: RGBColor.h
+// Created by: Julien Dutheil
+// Created on: Thu Mar 16 2006
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _RGBCOLOR_H_
+#define _RGBCOLOR_H_
+
+// From the STL:
+#include <cmath>
+
+#include "../Text/TextTools.h"
+#include "../Exceptions.h"
+#include "../Clonable.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Describe a color according to its red, green and blue componants.
+ */
+class RGBColor:
+  public virtual Clonable
+{
+  protected:
+    unsigned int red_;
+    unsigned int green_;
+    unsigned int blue_;
+
+  public:
+    RGBColor(unsigned int red, unsigned int green, unsigned int blue): red_(red), green_(green), blue_(blue) {} 
+    RGBColor(): red_(0), green_(0), blue_(0) {} 
+    virtual ~RGBColor() {}
+
+    RGBColor* clone() const { return new RGBColor(*this); }
+
+  public:
+    bool operator==(const RGBColor & color) const
+    {
+      return red_ == color.red_ && green_ == color.green_ && blue_ == color.blue_;
+    }
+
+    /**
+     * @brief Comparison operator (for sorting purposes).
+     *
+     * The hexadecimal string representation is used for comparison.
+     *
+     * @param color The color to compare with.
+     */
+    bool operator<(const RGBColor & color) const
+    {
+      return toHex() < color.toHex();
+    }
+
+    /**
+     * @brief Get the HTML-like, hexadecimal description of this color.
+     */
+    std::string toHex() const
+    {
+      std::string hex = "#";
+      hex += decToHex(red_);
+      hex += decToHex(green_);
+      hex += decToHex(blue_);
+      return hex;
+    }
+
+    /**
+     * @brief Access to each color componant: 0=red, 1=green, 2=blue.
+     */
+    const unsigned int & operator[](unsigned int i) const
+    {
+      if(i == 0) return red_;
+      if(i == 1) return green_;
+      if(i == 2) return blue_;
+      throw Exception("Invalid color index");
+    }
+
+    /**
+     * @brief Access to each color componant: 0=red, 1=green, 2=blue.
+     */
+    unsigned int & operator[](unsigned int i)
+    {
+      if(i == 0) return red_;
+      if(i == 1) return green_;
+      if(i == 2) return blue_;
+      throw Exception("Invalid color index");
+    }
+
+    /**
+     * @brief Get a string description of the color, e.g. [R255,G0,B255].
+     */
+    std::string toString() const
+    {
+      return "[R" + TextTools::toString(red_) + ",G" + TextTools::toString(green_) + ",B" + TextTools::toString(blue_) + "]"; 
+    }
+
+  protected:
+    static std::string decToHex(unsigned int dec)
+    {
+      std::string hexa = "0123456789ABCDEF";
+      std::string hex = "";
+      while (dec > 15)
+      {
+        unsigned int tmp = dec - static_cast<unsigned int>(floor(static_cast<double>(dec)/16.)*16);
+        hex = hexa[tmp] + hex;
+        dec = static_cast<unsigned int>(floor(static_cast<double>(dec)/16.));
+      }
+      hex = hexa[dec] + hex;
+      if (hex.size() == 1) hex = "0" + hex;
+      return hex;
+    }
+
+};
+
+} // end of namespace bpp;
+
+#endif //_RGBCOLOR_H_
+
diff --git a/src/Bpp/Graphics/Svg/SvgGraphicDevice.cpp b/src/Bpp/Graphics/Svg/SvgGraphicDevice.cpp
new file mode 100644
index 0000000..0c68013
--- /dev/null
+++ b/src/Bpp/Graphics/Svg/SvgGraphicDevice.cpp
@@ -0,0 +1,171 @@
+//
+// File: SvgGraphicDevice.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Mar 10 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "SvgGraphicDevice.h"
+
+using namespace bpp;
+using namespace std;
+
+void SvgGraphicDevice::begin()
+{
+  layers_.clear();
+  minx_ = maxx_ = miny_ = maxy_ = 0;
+}
+
+void SvgGraphicDevice::end()
+{
+  //Header:
+  out_ << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" << endl;
+  out_ << "<!DOCTYPE svg PUBLIC \"-//W3C//DTD Svg 1.1//EN\"" << endl;
+  out_ << "\"http://www.w3.org/Graphics/Svg/1.1/DTD/svg11.dtd\">" << endl;
+  out_ << "<svg width=\"" << (maxx_ - minx_) << "\" height=\"" << (maxy_ - miny_) << "\" version=\"1.1\"" << endl;
+  out_ << " xmlns=\"http://www.w3.org/2000/svg\"" << endl;
+  if (inkscapeEnabled_)
+    out_ << " xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"";
+  out_ << " >" << endl;
+  
+  out_ << "<g transform=\"translate(" << (-minx_) << "," << (-miny_) << ")\">" << endl;
+
+  for(map<int, vector<string> >::iterator it = layers_.begin(); it != layers_.end(); it++)
+  {
+    out_ << "<g id=\"layer" << it->first << "\"";
+    if(inkscapeEnabled_)
+    {
+      out_ << " inkscape:groupmode=\"layer\"";
+    }
+    out_ << " >" << endl;
+    vector<string> * v = &it->second;
+    for(unsigned int i = 0; i < v->size(); i++)
+    {
+      out_ << (*v)[i] << endl;
+    }
+    out_ << "</g>" << endl;
+  }
+  out_ << "</g>" << endl;
+  
+  out_ << "</svg>" << endl;
+}
+
+void SvgGraphicDevice::drawLine(double x1, double y1, double x2, double y2)
+{
+  x1 = x_(x1);
+  x2 = x_(x2);
+  y1 = y_(y1);
+  y2 = y_(y2);
+  string style = "stroke:" + colorToText(getCurrentForegroundColor()) + ";stroke-width:" + TextTools::toString(getCurrentPointSize());
+  if(getCurrentLineType() == LINE_DASHED)
+    style += ";stroke-dasharray:4,4";
+  else if(getCurrentLineType() == LINE_DOTTED)
+    style += ";stroke-dasharray:1,2";
+  ostringstream oss;
+  oss << "<line x1=\"" << x1 << "\" y1=\"" << y1 << "\" x2=\"" << x2 << "\" y2=\"" << y2 << "\" style=\"" << style << "\" />";
+  layers_[getCurrentLayer()].push_back(oss.str());
+  if (x1 < minx_) minx_ = x1;
+  if (x2 < minx_) minx_ = x2;
+  if (y1 < miny_) miny_ = y1;
+  if (y2 < miny_) miny_ = y2;
+  if (x1 > maxx_) maxx_ = x1;
+  if (x2 > maxx_) maxx_ = x2;
+  if (y1 > maxy_) maxy_ = y1;
+  if (y2 > maxy_) maxy_ = y2;
+}
+ 
+void SvgGraphicDevice::drawRect(double x, double y, double width, double height, short fill)
+{
+  x = x_(x);
+  y = y_(y);
+  width = x_(width);
+  height = y_(height);
+  string style = "stroke:" + colorToText(getCurrentForegroundColor()) + ";stroke-width:" + TextTools::toString(getCurrentPointSize());
+  if(fill == FILL_FILLED)
+  {
+    style += ";fill:" + colorToText(getCurrentBackgroundColor());
+  }
+  ostringstream oss;
+  oss << "<rect x=\"" << x << "\" y=\"" << y << "\" width=\"" << width << "\" height=\"" << height << "\" style=\"" << style << "\" />";
+  layers_[getCurrentLayer()].push_back(oss.str());
+  if (x < minx_) minx_ = x;
+  if (y < miny_) miny_ = y;
+  if (x + width > maxx_) maxx_ = x + width;
+  if (y + height > maxy_) maxx_ = y + height;
+}
+
+void SvgGraphicDevice::drawCircle(double x, double y, double radius, short fill)
+{
+  x = x_(x);
+  y = y_(y);
+  radius = x_(radius);
+  string style = "stroke:" + colorToText(getCurrentForegroundColor()) + ";stroke-width:" + TextTools::toString(getCurrentPointSize());
+  if(fill == FILL_FILLED)
+  {
+    style += ";fill:" + colorToText(getCurrentBackgroundColor());
+  }
+  ostringstream oss;
+  oss << "<rect cx=\"" << x << "\" cy=\"" << y << "\" cr=\"" << radius << "\" style=\"" << style << "\" />";
+  layers_[getCurrentLayer()].push_back(oss.str());
+}
+
+void SvgGraphicDevice::drawText(double x, double y, const std::string & text, short hpos, short vpos, double angle) throw (UnvalidFlagException)
+{
+  x = x_(x);
+  y = y_(y);
+  string style = "font-family:" + getCurrentFont().getFamily() + ";font-style:" + fontStyles_[getCurrentFont().getStyle()] + ";font-weight:" + fontWeights_[getCurrentFont().getWeight()] + ";font-size:" + TextTools::toString(getCurrentFont().getSize()) + "px";
+  style += ";dominant-baseline:";
+  if (vpos == TEXT_VERTICAL_BOTTOM)
+    style += "before-edge";
+  else if (vpos == TEXT_VERTICAL_TOP)
+    style += "after-edge";
+  else if (vpos == TEXT_VERTICAL_CENTER)
+    style += "middle";
+  else throw UnvalidFlagException("SvgGraphicDevice::drawText. Invalid vertical alignment option.");
+  style += ";text-anchor:";
+  if (hpos == TEXT_HORIZONTAL_LEFT)
+    style += "start";
+  else if (hpos == TEXT_HORIZONTAL_RIGHT)
+    style += "end";
+  else if (hpos == TEXT_HORIZONTAL_CENTER)
+    style += "middle";
+  else throw UnvalidFlagException("SvgGraphicDevice::drawText. Invalid horizontal alignment option.");
+  style += ";fill:" + colorToText(getCurrentForegroundColor());
+
+  ostringstream oss;
+  oss << "<text x=\"" << x << "\" y=\"" << y << "\" rotate=\"" << angle << "\" style=\"" << style << "\" >" << text << "</text>";
+  layers_[getCurrentLayer()].push_back(oss.str());
+}
+
diff --git a/src/Bpp/Graphics/Svg/SvgGraphicDevice.h b/src/Bpp/Graphics/Svg/SvgGraphicDevice.h
new file mode 100644
index 0000000..24fc012
--- /dev/null
+++ b/src/Bpp/Graphics/Svg/SvgGraphicDevice.h
@@ -0,0 +1,107 @@
+//
+// File: SvgGraphicDevice.h
+// Created by: Julien Dutheil
+// Created on: Mon Mar 10 2008
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 16, 2006)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _SVGGRAPHICDEVICE_H_
+#define _SVGGRAPHICDEVICE_H_
+
+#include "../AbstractGraphicDevice.h"
+#include "../ColorTools.h"
+
+// From the STL:
+#include <map>
+
+namespace bpp
+{
+
+/**
+ * @brief SVG plotting format.
+ */
+class SvgGraphicDevice:
+  public AbstractGraphicDevice
+{
+  private:
+    std::ostream& out_;
+    std::map<int, std::vector<std::string>, std::greater<int> > layers_; //Layer display as in xfig
+    bool inkscapeEnabled_;
+    double minx_, maxx_, miny_, maxy_;
+    std::map<short int, std::string> fontStyles_;
+    std::map<short int, std::string> fontWeights_;
+
+  public:
+    SvgGraphicDevice(std::ostream& out, bool inkscapeEnabled = false):
+      out_(out),
+      layers_(),
+      inkscapeEnabled_(inkscapeEnabled),
+      minx_(0), maxx_(0), miny_(0), maxy_(0),
+      fontStyles_(), fontWeights_()
+    {
+      fontStyles_[Font::STYLE_NORMAL] = "";
+      fontStyles_[Font::STYLE_ITALIC] = "italic";
+      fontWeights_[Font::WEIGHT_NORMAL] = "";
+      fontWeights_[Font::WEIGHT_BOLD] = "bold";
+    }
+
+    virtual ~SvgGraphicDevice() {}
+
+  public:
+    void begin();
+    void end();
+
+    void drawLine(double x1, double y1, double x2, double y2);
+    void drawRect(double x, double y, double width, double height, short fill = FILL_EMPTY);
+    void drawCircle(double x, double y, double radius, short fill = FILL_EMPTY);
+    void drawText(double x, double y, const std::string& text, short hpos = TEXT_HORIZONTAL_LEFT, short vpos = TEXT_VERTICAL_BOTTOM, double angle = 0) throw (UnvalidFlagException);
+    void comment(const std::string& text)
+    {
+      layers_[getCurrentLayer()].push_back("<!-- " + text + " -->");
+    }
+
+  public:
+    static std::string colorToText(const RGBColor& color)
+    {
+      return "rgb(" + TextTools::toString(color[0]) + "," + TextTools::toString(color[1]) + "," + TextTools::toString(color[2]) + ")";
+    }
+
+};
+
+} // end of namespace bpp.
+
+#endif //_SVGGRAPHICDEVICE_H_
+
+
diff --git a/src/Bpp/Io/BppODiscreteDistributionFormat.cpp b/src/Bpp/Io/BppODiscreteDistributionFormat.cpp
new file mode 100644
index 0000000..7fdbc2a
--- /dev/null
+++ b/src/Bpp/Io/BppODiscreteDistributionFormat.cpp
@@ -0,0 +1,455 @@
+//
+// File: BppODiscreteDistributionFormatFormat.cpp
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 14h 48
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "BppODiscreteDistributionFormat.h"
+
+#include "../Io/FileTools.h"
+#include "../Text/TextTools.h"
+#include "../Text/StringTokenizer.h"
+#include "../Text/KeyvalTools.h"
+
+#include "../Numeric/Prob/DiscreteDistribution.h"
+#include "../Numeric/Prob/InvariantMixedDiscreteDistribution.h"
+#include "../Numeric/Prob/ConstantDistribution.h"
+#include "../Numeric/Prob/SimpleDiscreteDistribution.h"
+#include "../Numeric/Prob/MixtureOfDiscreteDistributions.h"
+#include "../Numeric/Prob/GammaDiscreteDistribution.h"
+#include "../Numeric/Prob/GaussianDiscreteDistribution.h"
+#include "../Numeric/Prob/BetaDiscreteDistribution.h"
+#include "../Numeric/Prob/ExponentialDiscreteDistribution.h"
+#include "../Numeric/Prob/TruncatedExponentialDiscreteDistribution.h"
+#include "../Numeric/Prob/UniformDiscreteDistribution.h"
+#include "../Numeric/AutoParameter.h"
+#include "BppOParametrizableFormat.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <iomanip>
+
+using namespace std;
+
+
+DiscreteDistribution* BppODiscreteDistributionFormat::read(
+    const std::string& distDescription,
+    bool parseArguments)
+{
+  unparsedArguments_.clear();
+  string distName;
+  unique_ptr<DiscreteDistribution> rDist;
+  map<string, string> args;
+  KeyvalTools::parseProcedure(distDescription, distName, args);
+
+  if ((distName == "InvariantMixed") || (distName == "Invariant"))
+  {
+    // We have to parse the nested distribution first:
+    string nestedDistDescription = args["dist"];
+    if (TextTools::isEmpty(nestedDistDescription))
+      throw Exception("BppODiscreteDistributionFormat::read. Missing argument 'dist' for distribution 'Invariant'.");
+    if (verbose_)
+      ApplicationTools::displayResult("Invariant Mixed distribution", distName );
+    BppODiscreteDistributionFormat nestedReader(verbose_);
+    DiscreteDistribution* nestedDistribution = nestedReader.read(nestedDistDescription, true);
+    map<string, string> unparsedArgumentsNested(nestedReader.getUnparsedArguments());
+
+    // Now we create the Invariant rate distribution:
+    rDist.reset(new InvariantMixedDiscreteDistribution(nestedDistribution, 0.1, 0.000001));
+
+    // Then we update the parameter set:
+    for (map<string, string>::iterator it = unparsedArgumentsNested.begin();
+         it != unparsedArgumentsNested.end(); it++)
+    {
+      unparsedArguments_["Invariant." + it->first] = it->second;
+    }
+
+    if (args.find("p") != args.end())
+      unparsedArguments_["Invariant.p"] = args["p"];
+  }
+  else if (distName == "Constant")
+  {
+    if (args.find("value") == args.end())
+      throw Exception("Missing argument 'value' in Constant distribution");
+    rDist.reset(new ConstantDistribution(TextTools::to<double>(args["value"])));
+    unparsedArguments_["Constant.value"] = args["value"];
+  }
+  else if (distName == "Simple")
+  {
+    if (args.find("values") == args.end())
+      throw Exception("Missing argument 'values' in Simple distribution");
+    if (args.find("probas") == args.end())
+      throw Exception("Missing argument 'probas' in Simple distribution");
+    vector<double> probas, values;
+
+    string rf = args["values"];
+    StringTokenizer strtok(rf.substr(1, rf.length() - 2), ",");
+    while (strtok.hasMoreToken())
+      values.push_back(TextTools::toDouble(strtok.nextToken()));
+
+    rf = args["probas"];
+    StringTokenizer strtok2(rf.substr(1, rf.length() - 2), ",");
+    while (strtok2.hasMoreToken())
+      probas.push_back(TextTools::toDouble(strtok2.nextToken()));
+
+    std::map<size_t, std::vector<double> > ranges;
+
+    if (args.find("ranges") != args.end())
+    {
+      string rr = args["ranges"];
+      StringTokenizer strtok3(rr.substr(1, rr.length() - 2), ",");
+      string desc;
+      double deb, fin;
+      unsigned int num;
+      size_t po, pf, ppv;
+      while (strtok3.hasMoreToken())
+      {
+        desc = strtok3.nextToken();
+        po = desc.find("[");
+        ppv = desc.find(";");
+        pf = desc.find("]");
+        num = (unsigned int)(TextTools::toInt(desc.substr(1, po - 1)));
+        deb = TextTools::toDouble(desc.substr(po + 1, ppv - po - 1));
+        fin = TextTools::toDouble(desc.substr(ppv + 1, pf - ppv - 1));
+        vector<double> vd;
+        vd.push_back(deb);
+        vd.push_back(fin);
+        ranges[num] = vd;
+      }
+    }
+    if (ranges.size() == 0)
+      rDist.reset(new SimpleDiscreteDistribution(values, probas));
+    else
+      rDist.reset(new SimpleDiscreteDistribution(values, ranges, probas));
+
+    vector<string> v = rDist->getParameters().getParameterNames();
+
+    for (unsigned int i = 0; i < v.size(); i++)
+    {
+      unparsedArguments_[v[i]] = TextTools::toString(rDist->getParameterValue(rDist->getParameterNameWithoutNamespace(v[i])));
+    }
+  }
+  else if (distName == "Mixture")
+  {
+    if (args.find("probas") == args.end())
+      throw Exception("Missing argument 'probas' in Mixture distribution");
+    vector<double> probas;
+    vector<DiscreteDistribution*> v_pdd;
+    DiscreteDistribution* pdd;
+    string rf = args["probas"];
+    StringTokenizer strtok2(rf.substr(1, rf.length() - 2), ",");
+    while (strtok2.hasMoreToken())
+      probas.push_back(TextTools::toDouble(strtok2.nextToken()));
+
+    vector<string> v_nestedDistrDescr;
+
+    unsigned int nbd = 0;
+    while (args.find("dist" + TextTools::toString(++nbd)) != args.end())
+      v_nestedDistrDescr.push_back(args["dist" + TextTools::toString(nbd)]);
+
+    if (v_nestedDistrDescr.size() != probas.size())
+      throw Exception("Number of distributions (keyword 'dist" + TextTools::toString(probas.size()) + "') do not fit the number of probabilities");
+
+    BppODiscreteDistributionFormat nestedReader;
+
+    for (unsigned i = 0; i < v_nestedDistrDescr.size(); i++)
+    {
+      pdd = nestedReader.read(v_nestedDistrDescr[i], true);
+      map<string, string> unparsedArgumentsNested(nestedReader.getUnparsedArguments());
+
+      for (map<string, string>::iterator it = unparsedArgumentsNested.begin(); it != unparsedArgumentsNested.end(); it++)
+      {
+        unparsedArguments_[distName + "." + TextTools::toString(i + 1) + "_" + it->first] = it->second;
+      }
+      v_pdd.push_back(pdd);
+    }
+    rDist.reset(new MixtureOfDiscreteDistributions(v_pdd, probas));
+  }
+  else
+  {
+    if (args.find("n") == args.end())
+      throw Exception("Missing argument 'n' (number of classes) in " + distName
+                      + " distribution");
+    unsigned int nbClasses = TextTools::to<unsigned int>(args["n"]);
+
+    if (distName == "Gamma")
+    {
+      double offset=0;
+
+      if (args.find("offset") != args.end())
+        try
+        {
+          offset=TextTools::toDouble(args["offset"]);
+        }
+        catch (Exception& e) {}
+      
+      if (args.find("ParamOffset") != args.end())        
+        rDist.reset(new GammaDiscreteDistribution(nbClasses, 1, 1, true, offset));
+      else
+        rDist.reset(new GammaDiscreteDistribution(nbClasses, 1, 1, false, offset));
+      
+      if (args.find("alpha") != args.end())
+        unparsedArguments_["Gamma.alpha"] = args["alpha"];
+      if (args.find("beta") != args.end())
+        unparsedArguments_["Gamma.beta"] = args["beta"];
+      if (args.find("offset") != args.end())
+        unparsedArguments_["Gamma.offset"] = args["offset"];
+    }
+    else if (distName == "Gaussian")
+    {
+      rDist.reset(new GaussianDiscreteDistribution(nbClasses, 0, 1));
+      if (args.find("mu") != args.end())
+        unparsedArguments_["Gaussian.mu"] = args["mu"];
+      if (args.find("sigma") != args.end())
+        unparsedArguments_["Gaussian.sigma"] = args["sigma"];
+    }
+    else if (distName == "Beta")
+    {
+      rDist.reset(new BetaDiscreteDistribution(nbClasses, 1, 1));
+      if (args.find("alpha") != args.end())
+        unparsedArguments_["Beta.alpha"] = args["alpha"];
+      if (args.find("beta") != args.end())
+        unparsedArguments_["Beta.beta"] = args["beta"];
+    }
+    else if (distName == "Exponential")
+    {
+      rDist.reset(new ExponentialDiscreteDistribution(nbClasses, 1));
+      if (args.find("lambda") != args.end())
+        unparsedArguments_["Exponential.lambda"] = args["lambda"];
+      if (args.find("median") != args.end())
+        rDist->setMedian(true);
+    }
+    else if (distName == "TruncExponential")
+    {
+      rDist.reset(new TruncatedExponentialDiscreteDistribution(nbClasses, 1, 0));
+
+      if (args.find("median") != args.end())
+        rDist->setMedian(true);
+      if (args.find("lambda") != args.end())
+        unparsedArguments_["TruncExponential.lambda"] = args["lambda"];
+      if (args.find("tp") != args.end())
+        unparsedArguments_["TruncExponential.tp"] = args["tp"];
+    }
+    else if (distName == "Uniform")
+    {
+      if (args.find("begin") == args.end())
+        throw Exception("Missing argument 'begin' in Uniform distribution");
+      if (args.find("end") == args.end())
+        throw Exception("Missing argument 'end' in Uniform distribution");
+      rDist.reset(new UniformDiscreteDistribution(
+          nbClasses,
+          TextTools::to<double>(args["begin"]),
+          TextTools::to<double>(args["end"])));
+    }
+    else
+    {
+      throw Exception("Unknown distribution: " + distName + ".");
+    }
+  }
+  if (verbose_)
+  {
+    ApplicationTools::displayResult("Distribution", distName);
+    ApplicationTools::displayResult("Number of classes", TextTools::toString(rDist->getNumberOfCategories()));
+  }
+
+  if (parseArguments)
+    initialize_(*rDist);
+
+  return rDist.release();
+}
+
+
+void BppODiscreteDistributionFormat::write(const DiscreteDistribution& dist,
+                                           OutputStream& out,
+                                           std::map<std::string, std::string>& globalAliases,
+                                           std::vector<std::string>& writtenNames) const
+{
+  bool comma = false;
+
+  const DiscreteDistribution* pd;
+
+  out << dist.getName() + "(";
+
+  const InvariantMixedDiscreteDistribution* invar = dynamic_cast<const InvariantMixedDiscreteDistribution*>(&dist);
+  if (invar)
+  {
+    pd = invar->getVariableSubDistribution();
+    out << "dist=";
+    write(*pd, out, globalAliases, writtenNames);
+    comma = true;
+  }
+  else
+  {
+    const MixtureOfDiscreteDistributions* mix = dynamic_cast<const MixtureOfDiscreteDistributions*>(&dist);
+    if (mix)
+    {
+      size_t nd = mix->getNumberOfDistributions();
+      for (unsigned int i = 0; i < nd; i++)
+      {
+        if (comma)
+          out << ",";
+        out << "dist" + TextTools::toString(i + 1) + "=";
+        write(*mix->getNDistribution(i), out, globalAliases, writtenNames);
+        comma = true;
+      }
+      out << ",probas=(";
+      for (unsigned int i = 0; i < nd; i++)
+      {
+        out << mix->getNProbability(i);
+        if (i != nd - 1)
+          out << ",";
+      }
+      out << ")";
+      for (unsigned int i = 1; i < nd; i++)
+      {
+        writtenNames.push_back(mix->getNamespace() + "theta" + TextTools::toString(i));
+      }
+    }
+  }
+
+  if (dynamic_cast<const BetaDiscreteDistribution*>(&dist) ||
+      dynamic_cast<const ExponentialDiscreteDistribution*>(&dist) ||
+      dynamic_cast<const GammaDiscreteDistribution*>(&dist) ||
+      dynamic_cast<const GaussianDiscreteDistribution*>(&dist) ||
+      dynamic_cast<const TruncatedExponentialDiscreteDistribution*>(&dist) ||
+      dynamic_cast<const UniformDiscreteDistribution*>(&dist))
+  {
+    if (comma)
+      out << ",";
+    out << "n="  << dist.getNumberOfCategories();
+    comma = true;
+  }
+
+  const ConstantDistribution* pc = dynamic_cast<const ConstantDistribution*>(&dist);
+  if (pc && dist.getNumberOfParameters() == 0)
+  {
+    if (comma)
+      out << ",";
+    out << "value="  << pc->getLowerBound();
+    comma = true;
+  }
+
+  const SimpleDiscreteDistribution* ps = dynamic_cast<const SimpleDiscreteDistribution*>(&dist);
+  if (ps)
+  {
+    size_t nd = ps->getNumberOfCategories();
+    if (comma)
+      out << ",";
+    out << "values=(";
+    for (unsigned int i = 0; i < nd; i++)
+    {
+      out << ps->getCategory(i);
+      if (i != nd - 1)
+        out << ",";
+    }
+    out << "),probas=(";
+    for (size_t i = 0; i < nd; i++)
+    {
+      out << ps->getProbability(i);
+      if (i != nd - 1)
+        out << ",";
+    }
+    out << ")";
+
+    const std::map<size_t, std::vector<double> > range = ps->getRanges();
+    if (range.size() != 0)
+    {
+      out << ",ranges=(";
+      std::map<size_t, std::vector<double> >::const_iterator it(range.begin());
+      while (it != range.end())
+      {
+        out << "V" << TextTools::toString(it->first);
+        out << "[" << TextTools::toString(it->second[0]) << ";" << TextTools::toString(it->second[1]) << "]";
+        it++;
+        if (it != range.end())
+          out << ",";
+      }
+    }
+    out << ")";
+
+    for (size_t i = 1; i < nd; i++)
+    {
+      writtenNames.push_back(ps->getNamespace() + "theta" + TextTools::toString(i));
+    }
+    for (size_t i = 1; i < nd + 1; i++)
+    {
+      writtenNames.push_back(ps->getNamespace() + "V" + TextTools::toString(i));
+    }
+    comma = true;
+  }
+
+  // Writing the parameters
+  BppOParametrizableFormat bOP;
+  bOP.write(dynamic_cast<const ParameterAliasable*>(&dist), out, globalAliases, dist.getIndependentParameters().getParameterNames(), writtenNames, true, comma);
+  out << ")";
+}
+
+void BppODiscreteDistributionFormat::initialize_(
+  DiscreteDistribution& rDist) throw (Exception)
+{
+  ParameterList pl = rDist.getIndependentParameters();
+
+  for (size_t i = 0; i < pl.size(); ++i)
+  {
+    AutoParameter ap(pl[i]);
+    ap.setMessageHandler(ApplicationTools::warning);
+    pl.setParameter(i, ap);
+  }
+
+  for (size_t i = 0; i < pl.size(); ++i)
+  {
+    const string pName = pl[i].getName();
+    double value = ApplicationTools::getDoubleParameter(pName, unparsedArguments_, pl[i].getValue());
+    pl[i].setValue(value);
+    if (verbose_)
+      ApplicationTools::displayResult("Parameter found", pName + "=" + TextTools::toString(pl[i].getValue()));
+  }
+  
+  rDist.matchParametersValues(pl);
+  if (verbose_)
+  {
+    for (size_t c = 0; c < rDist.getNumberOfCategories(); ++c)
+    {
+      ApplicationTools::displayResult("- Category " + TextTools::toString(c)
+        + " (Pr = " + TextTools::toString(rDist.getProbability(c)) + ") rate",
+        TextTools::toString(rDist.getCategory(c)));
+    }
+  }
+}
+
+
+
diff --git a/src/Bpp/Io/BppODiscreteDistributionFormat.h b/src/Bpp/Io/BppODiscreteDistributionFormat.h
new file mode 100644
index 0000000..ecd8ec4
--- /dev/null
+++ b/src/Bpp/Io/BppODiscreteDistributionFormat.h
@@ -0,0 +1,96 @@
+//
+// File: Bpp0DiscreteDistributionFormat.h
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 14h 42
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _BPPODISCRETEDISTRIBUTIONFORMAT_H_
+#define _BPPODISCRETEDISTRIBUTIONFORMAT_H_
+
+#include "IoDiscreteDistributionFactory.h"
+
+namespace bpp
+{
+/**
+ * @brief Discrete Distribution I/O in BppO format.
+ *
+ * Creates a new discrete distribution object according to
+ * distribution description syntax (see the Bio++ Progam Suite
+ * manual for a detailed description of this syntax).
+ *
+ */
+class BppODiscreteDistributionFormat :
+  public virtual IDiscreteDistribution,
+  public virtual ODiscreteDistribution
+{
+protected:
+  bool verbose_;
+  std::map<std::string, std::string> unparsedArguments_;
+
+public:
+  BppODiscreteDistributionFormat(bool verbose = true) : verbose_(verbose), unparsedArguments_() {}
+  virtual ~BppODiscreteDistributionFormat() {}
+
+public:
+  const std::string getFormatName() const { return "BppO"; }
+
+  const std::string getFormatDescription() const { return "Bpp Options format."; }
+
+  DiscreteDistribution* read(const std::string& distDescription, bool parseArguments = true);
+
+  const std::map<std::string, std::string>& getUnparsedArguments() const { return unparsedArguments_; }
+
+  void write(const DiscreteDistribution& dist,
+             OutputStream& out,
+             std::map<std::string, std::string>& globalAliases,
+             std::vector<std::string>& writtenNames) const;
+
+protected:
+  /**
+   * @brief Set parameter initial values of a given distribution according to options.
+   *
+   * Parameters actually depends on the distribution passed as argument.
+   *
+   * @param rDist The distribution to set up.
+   * @throw Exception if an error occured.
+   */
+  void initialize_(DiscreteDistribution& rDist) throw (Exception);
+};
+
+} // end of namespace bpp.
+
+#endif // _BPPODISCRETEDISTRIBUTIONFORMAT_H_
+
diff --git a/src/Bpp/Io/BppOParametrizableFormat.cpp b/src/Bpp/Io/BppOParametrizableFormat.cpp
new file mode 100644
index 0000000..10fb470
--- /dev/null
+++ b/src/Bpp/Io/BppOParametrizableFormat.cpp
@@ -0,0 +1,120 @@
+//
+// File: BppOParametrizableFormat.cpp
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 15h 37
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "BppOParametrizableFormat.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <iomanip>
+#include <algorithm>
+
+
+using namespace std;
+
+void BppOParametrizableFormat::write(const Parametrizable* parametrizable,
+                                     OutputStream& out,
+                                     std::vector<std::string>& writtenNames,
+                                     bool printComma) const
+{
+  ParameterList pl = parametrizable->getParameters();
+  int p = out.getPrecision();
+  out.setPrecision(12);
+  bool flag = printComma;
+  for (size_t i = 0; i < pl.size(); ++i)
+  {
+    if (find(writtenNames.begin(), writtenNames.end(), pl[i].getName()) == writtenNames.end())
+    {
+      if (flag)
+        out << ",";
+      else
+        flag = true;
+      string pname = parametrizable->getParameterNameWithoutNamespace(pl[i].getName());
+        
+      (out << pname << "=").enableScientificNotation(false) << pl[i].getValue();
+        
+    }
+  }
+  out.setPrecision(p);
+}
+
+void BppOParametrizableFormat::write(const ParameterAliasable* parametrizable,
+                                     OutputStream& out,
+                                     std::map<std::string, std::string>& globalAliases,
+                                     const std::vector<std::string>& names,
+                                     std::vector<std::string>& writtenNames,
+                                     bool printLocalAliases,
+                                     bool printComma) const
+{
+  ParameterList pl = parametrizable->getIndependentParameters().subList(names);
+  int p = out.getPrecision();
+  out.setPrecision(12);
+  bool flag = printComma;
+  for (size_t i = 0; i < pl.size(); ++i)
+  {
+    if (find(writtenNames.begin(), writtenNames.end(), pl[i].getName()) == writtenNames.end())
+    {
+      if (flag)
+        out << ",";
+      else
+        flag = true;
+      string pname = parametrizable->getParameterNameWithoutNamespace(pl[i].getName());
+      
+      // Check for global aliases:
+      if (globalAliases.find(pl[i].getName()) == globalAliases.end())
+      {
+        (out << pname << "=").enableScientificNotation(false) << pl[i].getValue();
+      }
+      else
+        out << pname << "=" << globalAliases[pl[i].getName()];
+      
+      // Now check for local aliases:
+      if (printLocalAliases)
+      {
+        vector<string> aliases = parametrizable->getAlias(pname);
+        for (size_t j = 0; j < aliases.size(); ++j)
+        {
+          out << ", " << aliases[j] << "=" << pname;
+        }
+      }
+      writtenNames.push_back(pl[i].getName());
+    }
+  }
+  out.setPrecision(p);
+}
diff --git a/src/Bpp/Io/BppOParametrizableFormat.h b/src/Bpp/Io/BppOParametrizableFormat.h
new file mode 100644
index 0000000..946afb5
--- /dev/null
+++ b/src/Bpp/Io/BppOParametrizableFormat.h
@@ -0,0 +1,110 @@
+//
+// File: Bpp0ParametrizableFormat.h
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 15h 30
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _BPPOPARAMETRIZABLEFORMAT_H_
+#define _BPPOPARAMETRIZABLEFORMAT_H_
+
+#include "IoParametrizable.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Parametrizable output in BppO format.
+   *
+   * Writes a new parametrizable object according to BppO description
+   * syntax (see the Bio++ Progam Suite manual for a detailed
+   * description of this syntax).
+   *
+   */
+  class BppOParametrizableFormat:
+    public OParametrizable
+  {
+  public:
+    BppOParametrizableFormat() {}
+    virtual ~BppOParametrizableFormat() {}
+
+  public:
+    const std::string getFormatName() const { return "BppO"; }
+
+    const std::string getFormatDescription() const { return "Bpp Options format."; }
+
+    /**
+     * @brief Write a Parametrizable to a stream.
+     *
+     * @param parametrizable A pointer to a Parametrizable object;
+     * @param out The output stream;
+     * @param writtenNames is the vector of the written
+     *        parameters so far [in, out];
+     * @param printComma boolean if a comma should be written at the
+     *        beginning of the description.
+     */
+    
+    void write(const Parametrizable* parametrizable,
+               OutputStream& out,
+               std::vector<std::string>& writtenNames,
+               bool printComma = false) const;
+    
+    /**
+     * @brief Write a ParameterAliasable to a stream.
+     *
+     * @param parametrizable A pointer to a Parametrizable object;
+     * @param out The output stream;
+     * @param globalAliases parameters linked to global alias; 
+     * @param names the names of the parameters to be written;
+     * @param writtenNames is the vector of the written
+     *        parameters so far [in, out];
+     * @param printLocalAliases boolean if local aliases should be written;
+     * @param printComma boolean if a comma should be written at the
+     *        beginning of the description.
+     */
+    
+    void write(const ParameterAliasable* parametrizable,
+               OutputStream& out,
+               std::map<std::string, std::string>& globalAliases,
+               const std::vector<std::string>& names,
+               std::vector<std::string>& writtenNames,
+               bool printLocalAliases = true,
+               bool printComma = false) const;
+  };
+
+} //end of namespace bpp.
+
+#endif //_BPPOPARAMETRIZABLEFORMAT_H_
+
diff --git a/src/Bpp/Seq/Alphabet/CodonAlphabet.cpp b/src/Bpp/Io/FileTools.cpp
similarity index 50%
rename from src/Bpp/Seq/Alphabet/CodonAlphabet.cpp
rename to src/Bpp/Io/FileTools.cpp
index 9072c02..9dbf2f9 100644
--- a/src/Bpp/Seq/Alphabet/CodonAlphabet.cpp
+++ b/src/Bpp/Io/FileTools.cpp
@@ -1,14 +1,15 @@
 //
-// File: CodonAlphabet.cpp
-// Created by: Julien Dutheil
-// Created on: Sun Oct 12 17:41:56 2003
+// File FileTools.cpp
+// Author : Guillaume Deuchst
+//          Julien Dutheil
+// Last modification : Tuesday August 23 2005
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,85 +38,116 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "CodonAlphabet.h"
-#include <Bpp/Text/TextTools.h>
+#include "FileTools.h" // class's header file
+#include "../Text/TextTools.h"
+#include <sys/stat.h>
 
 using namespace bpp;
+using namespace std;
 
-// From the STL:
-#include <iostream>
+/******************************************************************************/
 
-using namespace std;
+char FileTools::DIR_SEP = '/';
 
 /******************************************************************************/
 
-int CodonAlphabet::getCodon(int pos1, int pos2, int pos3) const
-throw (BadIntException)
+bool FileTools::fileExists(const std::string& filename)
 {
-  vector<int> vint;
-  vint.push_back(pos1);
-  vint.push_back(pos2);
-  vint.push_back(pos3);
-  
-  return getWord(vint);
+  ifstream file(filename.c_str());
+  bool test = file ? true : false; //needed for CLang.
+  file.close();
+  return test;
 }
 
 /******************************************************************************/
 
-string CodonAlphabet::getCodon(const string & pos1, const string & pos2, const string & pos3) const
-throw (BadCharException)
+bool FileTools::directoryExists(const std::string& path)
 {
-  vector<string> vint;
-  vint.push_back(pos1);
-  vint.push_back(pos2);
-  vint.push_back(pos3);
-  
-  return getWord(vint);
+  ifstream file(path.c_str());
+  bool test = file ? true : false; //needed for CLang.
+  file.close();
+  return test;
 }
 
 /******************************************************************************/
 
-int CodonAlphabet::getFirstPosition (int codon) const throw (BadIntException)
+std::string FileTools::getFileName(const std::string& path, char dirSep)
 {
-  return getNPosition(codon,0);
+  ptrdiff_t end = static_cast<ptrdiff_t>(path.find_last_of("."));
+  ptrdiff_t begin = static_cast<ptrdiff_t>(path.find_last_of(dirSep) + 1);
+
+  // Return an empty string if specified string isn't a path
+  if (begin > end) return "";
+
+  // Copy path and deletion of directories and extension
+  string result(path);
+  result.erase(result.begin() + end, result.end());
+  result.erase(result.begin(), result.begin() + begin);
+
+  // Send file name
+  return result;
 }
 
 /******************************************************************************/
 
-int CodonAlphabet::getSecondPosition(int codon) const throw (BadIntException)
+streampos FileTools::getFileSize(const std::string& filename)
 {
-  return getNPosition(codon,1);
+  std::ifstream stream;
+  streampos size;
+  stream.open(filename.c_str(), std::ios::ate);
+  size = stream.tellg();
+  stream.close();
+  return size;
 }
 
 /******************************************************************************/
 
-int CodonAlphabet::getThirdPosition (int codon) const throw (BadIntException)
+std::string FileTools::getParent(const std::string& path, char dirSep)
 {
-  return getNPosition(codon,2);
+  // Position of file name:
+  ptrdiff_t begin = static_cast<ptrdiff_t>(path.find_last_of(dirSep));
+
+  // Copy string and delte filename:
+  string result(path);
+  result.erase(result.begin() + begin, result.end());
+
+  // Send directories
+  return result;
 }
 
 /******************************************************************************/
 
-string CodonAlphabet::getFirstPosition (const string & codon) const
-throw (BadCharException)
+std::string FileTools::getExtension(const std::string& path)
 {
-  return getNPosition(codon,0);
+  size_t end = path.find_last_of(".");
+  return path.substr(end + 1);
 }
 
 /******************************************************************************/
 
-string CodonAlphabet::getSecondPosition(const string & codon) const
-throw (BadCharException)
+std::vector<std::string> FileTools::putStreamIntoVectorOfStrings(std::istream& input)
 {
-  return getNPosition(codon,1);
+  vector<string> vs;
+  string s = "";
+  while(input)
+  {
+    getline(input, s, '\n');
+    vs.push_back(s);
+  }
+  return vs;
 }
 
 /******************************************************************************/
 
-string CodonAlphabet::getThirdPosition (const string & codon) const
-throw (BadCharException)
+std::string FileTools::getNextLine(std::istream& in)
 {
-  return getNPosition(codon,2);
+  if(in.eof()) return string("");
+  string temp("");
+  while(!in.eof() && TextTools::isEmpty(temp)) {
+    getline(in, temp, '\n');
+  }
+  return temp;
 }
 
 /******************************************************************************/
+
diff --git a/src/Bpp/Io/FileTools.h b/src/Bpp/Io/FileTools.h
new file mode 100644
index 0000000..c8e7dd7
--- /dev/null
+++ b/src/Bpp/Io/FileTools.h
@@ -0,0 +1,162 @@
+//
+// File FileTools.h
+// Created by: Guillaume Deuchst
+//             Julien Dutheil
+// Last modification : Monday August 4 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FILETOOLS_H_
+#define _FILETOOLS_H_
+
+// From the STL:
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <cstdio>
+//#include <io.h>  // required for directoryExists method
+
+namespace bpp
+{
+
+/**
+ * @brief Some utilitary functions to deal with files.
+ *
+ * File paths default to unix, i.e. the directory seprator if '/'.
+ * This character is stored in the variable 'DIR_SEP', and hence may be changed by
+ * @code
+ * FileTools::DIR_SEP='\\';
+ * @endcode
+ * for windows programs.
+ * 
+ * Methods dealing with pathes have an optional dirSep argument, which default to DIR_SEP.
+ */
+class FileTools
+{
+	public:
+		static char DIR_SEP;
+	
+	public:
+		FileTools() {}
+		virtual ~FileTools() {}
+
+	public:
+		
+		/**
+		 * @brief Tells if a file exist.
+		 *
+		 * @param filename The path toward the file.
+		 * @return True if the file exists.
+		 */
+		static bool fileExists(const std::string& filename);
+		
+		/**
+		 * @brief Tells if a directory exist.
+		 *
+		 * NB: this is an alias for fileExists.
+		 * 
+		 * @param path The path toward the file.
+		 * @return True if the file exists.
+		 */
+		static bool directoryExists(const std::string& path);
+
+		/**
+		 * @brief Get the name of of a file, without extension.
+		 *
+		 * Example:
+		 * FileTools::getFileName("/path/file.ext") returns "file".
+		 * This method is not recursive, hence
+		 * FileTools::getfileName("/home/me/archive.tar.gz") returns "archive".
+		 * 
+		 * An empty string is returned if 'path' is not a valid path toward a file.
+		 *
+		 * @param path A file path.
+		 * @param dirSep The directory separator.
+		 * @return The filename of the file specified by path.
+		 */
+		static std::string getFileName(const std::string& path, char dirSep = DIR_SEP);
+
+    /**
+     * @brief Get the size of a file.
+     *
+     * @param filename The path toward the file.
+     * @return The size of the file.
+     * @author Sylvain Gaillard
+     */
+    static std::streampos getFileSize(const std::string& filename);
+
+		/**
+		 * @brief Get the path of the parent directry of the given file/dir.
+		 * 
+		 * @param path A file/directory path.
+		 * @param dirSep The directory separator.
+		 * @return The path towar dthe parent directory.
+		 */
+		static std::string getParent(const std::string& path, char dirSep = DIR_SEP);
+
+		/**
+		 * @brief Get the extension of a file.
+		 * 
+		 * Example:
+		 * FileTools::getExtension("/path/file.ext") returns "ext".
+		 * This method is not recursive, hence
+		 * FileTools::getExtension("/home/me/archive.tar.gz") returns "gz".
+		 * 
+		 * @param path A file path.
+		 * @return The extension of the file specified by path.
+		 */
+		static std::string getExtension(const std::string& path);
+	
+		/**
+		 * @brief Reads a stream and write each line in a vector.
+		 *
+		 * @param input Input stream.
+		 * @return A vector of strings.
+		 */
+		static std::vector<std::string> putStreamIntoVectorOfStrings(std::istream& input);
+
+		/**
+		 * @brief Get the next non-blanck line of a stream.
+		 *
+		 * @param in Input stream.
+		 */
+		static std::string getNextLine(std::istream& in);
+};
+
+} //end of namespace bpp.
+
+#endif	// _FILETOOLS_H_
+
diff --git a/src/Bpp/Io/IoDiscreteDistribution.h b/src/Bpp/Io/IoDiscreteDistribution.h
new file mode 100644
index 0000000..8c96b31
--- /dev/null
+++ b/src/Bpp/Io/IoDiscreteDistribution.h
@@ -0,0 +1,125 @@
+//
+// File: IoDiscreteDistribution.h
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 14h 35
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _IODISCRETEDISTRIBUTION_H_
+#define _IODISCRETEDISTRIBUTION_H_
+
+#include "../Numeric/Prob/DiscreteDistribution.h"
+#include "../Exceptions.h"
+#include "IoFormat.h"
+#include "OutputStream.h"
+
+namespace bpp
+{
+  /**
+   * @brief General interface for model I/O.
+   */
+  class IoDiscreteDistribution:
+    public virtual IOFormat
+  {
+  public:
+    IoDiscreteDistribution() {}
+    virtual ~IoDiscreteDistribution() {}
+
+  public:
+    virtual const std::string getDataType() const { return "Discrete Distribution"; }
+  };
+
+  /**
+   * @brief General interface for distance matrix readers.
+   */
+  class IDiscreteDistribution:
+    public virtual IoDiscreteDistribution
+  {
+  public:
+    IDiscreteDistribution() {}
+    virtual ~IDiscreteDistribution() {}
+
+  public:
+    /**
+     * @brief Read a discrete distribution from a string.
+     *
+     * @param distrDescription A string describing the distribution in the format.
+     * @param parseArguments Attempt to parse function arguments. If not, only store them and use default values instead.
+     * @return A new DiscreteDistribution object according to options specified.
+     * @throw Exception if an error occured.
+     */
+    virtual DiscreteDistribution* read(
+        const std::string& distrDescription,
+        bool parseArguments = true) = 0;
+
+    /**
+     * @return The arguments and their unparsed values from the last call of the read function, if there are any.
+     */
+    virtual const std::map<std::string, std::string>& getUnparsedArguments() const = 0;
+
+  };
+
+  /**
+   * @brief General interface writers.
+   */
+  class ODiscreteDistribution:
+    public virtual IoDiscreteDistribution
+  {
+  public:
+    ODiscreteDistribution() {}
+    virtual ~ODiscreteDistribution() {}
+
+  public:
+    /**
+     * @brief Write a discrete distribution to a stream.
+     *
+     * @param dist A discrete distribution object;
+     * @param out The output stream;
+     * @param globalAliases parameters linked to global alias. 
+     * @param writtenNames is the vector of the written
+     *        parameters so far [in, out];
+     * @throw Exception if an error occured.
+     */
+    virtual void write(const DiscreteDistribution& dist,
+                       OutputStream& out,
+                       std::map<std::string, std::string>& globalAliases,
+                       std::vector<std::string>& writtenNames) const = 0;
+  };
+
+
+} //end of namespace bpp.
+
+#endif //_IODISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Seq/Container/SiteContainerExceptions.cpp b/src/Bpp/Io/IoDiscreteDistributionFactory.cpp
similarity index 64%
rename from src/Bpp/Seq/Container/SiteContainerExceptions.cpp
rename to src/Bpp/Io/IoDiscreteDistributionFactory.cpp
index d28f9b6..7fb3346 100644
--- a/src/Bpp/Seq/Container/SiteContainerExceptions.cpp
+++ b/src/Bpp/Io/IoDiscreteDistributionFactory.cpp
@@ -1,8 +1,8 @@
 //
-// File SiteContainerExceptions.cpp
-// Author: Julien Dutheil
-// Created on: mer mar 31 2004
-// 
+// File IoDiscreteDistributionFactory.cpp
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 14h 44
+//
 
 /*
 Copyright or © or Copr. CNRS, (November 17, 2004)
@@ -37,24 +37,21 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SiteContainerExceptions.h"
+#include "BppODiscreteDistributionFormat.h"
 
 using namespace bpp;
-using namespace std;
-
-/*******************************************************************************
- *                       Site containers exceptions                            *
- *******************************************************************************/
-
-SiteNotFoundException::SiteNotFoundException(const char *   text, const char * sId) :
-	Exception("SequenceNotFoundException: " + string(text) + "(" + sId + ")"),
-	id(sId) {};
-
-SiteNotFoundException::SiteNotFoundException(const string & text, const string & sId) :
-	Exception("SequenceNotFoundException: " + text + "(" + sId + ")"),
-	id(sId) {};
-
-SiteNotFoundException::~SiteNotFoundException() throw() {};
 
-const string SiteNotFoundException::getSiteId() const { return id; }
+const std::string IoDiscreteDistributionFactory::BPPO_FORMAT = "Bpp0"; 
+
+IDiscreteDistribution* IoDiscreteDistributionFactory::createReader(const std::string& format) throw (Exception)
+{
+  if(format == BPPO_FORMAT) return new BppODiscreteDistributionFormat();
+  else throw Exception("Format " + format + " is not supported for input.");
+}
+  
+ODiscreteDistribution* IoDiscreteDistributionFactory::createWriter(const std::string& format) throw (Exception)
+{
+  if(format == BPPO_FORMAT) return new BppODiscreteDistributionFormat();
+  else throw Exception("Format " + format + " is not supported for output.");
+}
 
diff --git a/src/Bpp/Io/IoDiscreteDistributionFactory.h b/src/Bpp/Io/IoDiscreteDistributionFactory.h
new file mode 100644
index 0000000..e18d12b
--- /dev/null
+++ b/src/Bpp/Io/IoDiscreteDistributionFactory.h
@@ -0,0 +1,99 @@
+//
+// File IODiscreteDistributionFactory.h
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 14h 45
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for sequences analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _IODISCRETEDISTRIBUTIONFACTORY_H_
+#define _IODISCRETEDISTRIBUTIONFACTORY_H_
+
+#include "../Numeric/Prob/DiscreteDistribution.h"
+#include "../Exceptions.h"
+#include "IoDiscreteDistribution.h"
+
+//From the STL:
+#include <string>
+
+namespace bpp
+{
+
+/**
+ * @brief Utilitary class for creating discrete distribution readers and
+ * writers.
+ */
+class IoDiscreteDistributionFactory
+{
+public:
+  static const std::string BPPO_FORMAT;  
+
+public:
+
+  /**
+   * @brief Creates a new factory object.
+   *
+   * Example:
+   * @code
+   * IDiscreteDistribution* distReader = IoDiscreteDistributionFactory().createReader(IoDiscreteDistributionFactory::BPP_FORMAT);
+   * DiscreteDistribution* dist = distReader->read(...);
+   * delete distReader;
+   * @endcode
+   */
+  IoDiscreteDistributionFactory() {}
+  virtual ~IoDiscreteDistributionFactory() {}
+  
+  /**
+   * @brief Get a new dynamically created IDiscreteDistribution object.
+   *
+   * @param format The input file format.
+   * @return A pointer toward a new IDiscreteDistribution object.
+   * @throw Exception If the format name do not match any available format.
+   */
+  virtual IDiscreteDistribution* createReader(const std::string& format) throw (Exception);
+  
+  /**
+   * @brief Get a new dynamically created ODiscreteDistribution object.
+   *
+   * @param format The output file format.
+   * @return A pointer toward a new ODiscreteDistribution object.
+   * @throw Exception If the format name do not match any available format.
+   */
+  virtual ODiscreteDistribution* createWriter(const std::string& format) throw (Exception);
+};
+
+} //end of namespace bpp.
+
+#endif //_IODISCRETEDISTRIBUTIONFACTORY_H_
+
diff --git a/src/Bpp/Seq/Alphabet/AlphabetNumericState.h b/src/Bpp/Io/IoFormat.h
similarity index 57%
rename from src/Bpp/Seq/Alphabet/AlphabetNumericState.h
rename to src/Bpp/Io/IoFormat.h
index 83b40ef..fbbbd42 100644
--- a/src/Bpp/Seq/Alphabet/AlphabetNumericState.h
+++ b/src/Bpp/Io/IoFormat.h
@@ -1,98 +1,89 @@
-// 
-// File:    AlphabetState.h
-// Author:  Laurent Guéguen
-// Created: 03/2010
-// 
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (March, 2010)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ALPHABETNUMERICSTATE_H_
-#define _ALPHABETNUMERICSTATE_H_
-
-// From the STL
-#include <string>
-
-// From bpp-core
-#include <Bpp/Clonable.h>
-
-// From bpp-seq
-
-#include "AlphabetState.h"
-
-namespace bpp {
-  /**
-   * @brief States that do have a double value
-   *
-   * @author Laurent Guéguen
-   */
-  class AlphabetNumericState: public AlphabetState {
-  private:
-    double value_;
-    
-  public:
-    AlphabetNumericState(int num, double value, const std::string& letter, const std::string& name): AlphabetState(num, letter, name), value_(value) {}
-    
-    // Class destructor
-    virtual ~AlphabetNumericState() {}
-
-  public:
-    /**
-     * @name The Clonable interface.
-     * @{
-     */
-#ifdef NO_VIRTUAL_COV
-    Clonable*
-#else
-    AlphabetNumericState*
-#endif
-    clone() const { return new AlphabetNumericState(* this); }
-    /** @} */
-    /**
-     * @brief Get the state value.
-     *
-     * @return The state value
-     */
-    double getValue() const { return value_; }
-
-    /**
-     * @brief Set the state value.
-     * @param value The given state value.
-     */
-    void setValue(double value) { value_ = value; }
-
-  };
-}
-
-#endif // _ALPHABETNUMERICSTATE_H_
-
+//
+// File IoFormat.h
+// Author : Julien Dutheil
+// Created on: 2005
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide utilitary
+  classes. This file belongs to the Bio++ Project.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _IOFORMAT_H_
+#define _IOFORMAT_H_
+
+#include "../Exceptions.h"
+
+// From STL:
+#include <string>
+
+namespace bpp
+{
+
+  /**
+   * @brief The IOFormat interface.
+   *
+   * This is the most basal class of any format I/O implementation.
+   */
+  class IOFormat
+  {
+  public:
+    IOFormat() {}
+    virtual ~IOFormat() {}
+
+  public:
+
+    /**
+     * @brief Get the type of data this format deals with.
+     *
+     * @return The type of data.
+     */
+    virtual const std::string getDataType() const = 0;
+		
+    /**
+     * @brief Get the name of the file format.
+     *
+     * @return The name of the format implemented.
+     */
+    virtual const std::string getFormatName() const = 0;
+		
+    /**
+     * @brief Get a description of the file format.
+     *
+     * @return A description of the format implemented.
+     */
+    virtual const std::string getFormatDescription() const = 0;
+  };
+
+} //end of namespace bpp.
+
+#endif	// _IOFORMAT_H_
+
diff --git a/src/Bpp/Io/IoParametrizable.h b/src/Bpp/Io/IoParametrizable.h
new file mode 100644
index 0000000..aaf0bef
--- /dev/null
+++ b/src/Bpp/Io/IoParametrizable.h
@@ -0,0 +1,117 @@
+//
+// File: IOParametrizable.h
+// Created by: Laurent Guéguen
+// Created on: lundi 3 septembre 2012, à 14h 35
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _IOPARAMETRIZABLE_H_
+#define _IOPARAMETRIZABLE_H_
+
+#include "../Numeric/ParameterAliasable.h"
+
+#include "IoFormat.h"
+#include "OutputStream.h"
+
+#include <map>
+namespace bpp
+{
+  /**
+   * @brief General interface for parametrizable Output.
+   */
+  class IOParametrizable:
+    public virtual IOFormat
+  {
+  public:
+    IOParametrizable() {}
+    virtual ~IOParametrizable() {}
+
+  public:
+    virtual const std::string getDataType() const { return "Parametrizable"; }
+  };
+
+  /**
+   * @brief General interface writers.
+   */
+  class OParametrizable:
+    public virtual IOParametrizable
+  {
+  public:
+    OParametrizable() {}
+    virtual ~OParametrizable() {}
+
+  public:
+    /**
+     * @brief Write a Parametrizable to a stream.
+     *
+     * @param parametrizable A pointer to a Parametrizable object;
+     * @param out The output stream;
+     * @param writtenNames is the vector of the written
+     *        parameters so far [in, out];
+     * @param printComma boolean if a comma should be written at the
+     *        beginning of the description.
+     */
+    virtual void write(const Parametrizable* parametrizable,
+                       OutputStream& out,
+                       std::vector<std::string>& writtenNames,
+                       bool printComma=false) const = 0;
+ 
+    /**
+     * @brief Write a ParameterAliasable to a stream.
+     *
+     * @param parametrizable A pointer to a Parametrizable object;
+     * @param out The output stream;
+     * @param globalAliases parameters linked to global alias; 
+     * @param names the names of the parameters to be written;
+     * @param writtenNames is the vector of the written
+     *        parameters so far [in, out];
+     * @param printLocalAliases boolean if local aliases should be written;
+     * @param printComma boolean if a comma should be written at the
+     *        beginning of the description.
+     */
+    virtual void write(const ParameterAliasable* parametrizable,
+                       OutputStream& out,
+                       std::map<std::string, std::string>& globalAliases,
+                       const std::vector<std::string>& names,
+                       std::vector<std::string>& writtenNames,
+                       bool printLocalAliases = true,
+                       bool printComma=false) const = 0;
+  };
+
+
+} //end of namespace bpp.
+
+#endif //_IOPARAMETRIZABLE_H_
+
diff --git a/src/Bpp/Io/OutputStream.h b/src/Bpp/Io/OutputStream.h
new file mode 100644
index 0000000..6c1aaef
--- /dev/null
+++ b/src/Bpp/Io/OutputStream.h
@@ -0,0 +1,350 @@
+//
+// File: OutputStream.h
+// Created by: Julien Dutheil
+// Created on: Mon Jan 25 17:41 2010
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _OUTPUTSTREAM_H_
+#define _OUTPUTSTREAM_H_
+
+#include "../Clonable.h"
+
+//From the STL:
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <memory>
+#include <iomanip>
+
+namespace bpp
+{
+
+/**
+ * @brief OutputStream interface.
+ *
+ * This interface define several << operators for outputing messages.
+ * Wrapper classes for the STL streams are available as special
+ * implementations, but this interface can be used to redirect the output to
+ * files or to graphical components for instance.
+ */
+class OutputStream :
+  public virtual Clonable
+{
+public:
+  virtual OutputStream& operator<<(const std::string& message) = 0;
+  virtual OutputStream& operator<<(const char* message) = 0;
+  virtual OutputStream& operator<<(const char& message) = 0;
+  virtual OutputStream& operator<<(const int& message) = 0;
+  virtual OutputStream& operator<<(const unsigned int& message) = 0;
+  virtual OutputStream& operator<<(const long int& message) = 0;
+  virtual OutputStream& operator<<(const unsigned long int& message) = 0;
+  virtual OutputStream& operator<<(const double& message) = 0;
+  virtual OutputStream& operator<<(const long double& message) = 0;
+  virtual OutputStream& operator<<(const bool& message) = 0;
+  virtual OutputStream& endLine() = 0;
+  virtual OutputStream& flush() = 0;
+  virtual OutputStream& setPrecision(int digit) = 0;
+  virtual int getPrecision() const = 0;
+  virtual OutputStream& enableScientificNotation(bool yn) = 0;
+  virtual bool isScientificNotationEnabled() const = 0;
+
+  /**
+   * @name The Clonable interface.
+   *
+   * @{
+   */
+  OutputStream* clone() const = 0;
+  /** @} */
+
+};
+
+
+
+
+
+/**
+ * @brief Helper implementation of the OutputStream interface.
+ */
+class AbstractOutputStream :
+  public virtual OutputStream
+{
+private:
+  int precision_;
+  bool scienceNotation_;
+
+public:
+  AbstractOutputStream() : precision_(6), scienceNotation_(false) {}
+
+public:
+  OutputStream& setPrecision(int digit)
+  {
+    precision_ = digit;
+    return *this;
+  }
+  int getPrecision() const { return precision_; }
+
+  virtual OutputStream& enableScientificNotation(bool yn) { scienceNotation_ = yn; return *this; }
+  virtual bool isScientificNotationEnabled() const { return scienceNotation_; }
+};
+
+
+
+
+
+/**
+ * @brief Null output stream (swich off output).
+ */
+class NullOutputStream :
+  public AbstractOutputStream
+{
+public:
+  NullOutputStream& operator<<(const std::string& message) { return *this; }
+  NullOutputStream& operator<<(const char* message) { return *this; }
+  NullOutputStream& operator<<(const char& message) { return *this; }
+  NullOutputStream& operator<<(const int& message) { return *this; }
+  NullOutputStream& operator<<(const unsigned int& message) { return *this; }
+  NullOutputStream& operator<<(const long int& message) { return *this; }
+  NullOutputStream& operator<<(const unsigned long int& message) { return *this; }
+  NullOutputStream& operator<<(const double& message) { return *this; }
+  NullOutputStream& operator<<(const long double& message) { return *this; }
+  NullOutputStream& operator<<(const bool& message) { return *this; }
+  NullOutputStream& endLine() { return *this; }
+  NullOutputStream& flush() { return *this; }
+
+  NullOutputStream* clone() const { return new NullOutputStream(*this); }
+
+};
+
+
+
+
+
+
+/**
+ * @brief STL output stream.
+ *
+ * This class wraps the std::ostream class.
+ * It takes as input a pointer toward an existing stream that will then be
+ * owned by the wrapper, as a smart pointer.
+ * Any copy of this class will then result in an inactivation of the original
+ * version (in other word, you can't have two wrappers for the same stream).
+ */
+class StlOutputStream :
+  public AbstractOutputStream
+{
+private:
+  mutable std::unique_ptr<std::ostream> stream_;
+
+public:
+  StlOutputStream(std::ostream* stream): stream_(stream) {}
+  StlOutputStream(const StlOutputStream& stlos) : stream_() { stream_ = std::move(stlos.stream_); }
+  StlOutputStream& operator=(const StlOutputStream& stlos)
+  {
+    stream_ = std::move(stlos.stream_);
+    return *this;
+  }
+
+public:
+  StlOutputStream& operator<<(const std::string& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const char* message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const char& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const int& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const unsigned int& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const long int& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const unsigned long int& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& operator<<(const double& message)
+  {
+    if (stream_.get())
+      *stream_ << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  StlOutputStream& operator<<(const long double& message)
+  {
+    if (stream_.get())
+      *stream_ << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  StlOutputStream& operator<<(const bool& message) { if (stream_.get()) *stream_ << message; return *this; }
+  StlOutputStream& endLine() { if (stream_.get()) *stream_ << std::endl; return *this; }
+  StlOutputStream& flush() { if (stream_.get()) stream_->flush(); return *this; }
+
+  StlOutputStream* clone() const { return new StlOutputStream(*this); }
+
+};
+
+
+
+
+
+/**
+ * @brief STL wrapper for output stream.
+ *
+ * This class wraps the std::ostream class, by forwarding to the STL class.
+ * It does not own the STL stream and won't delete it.
+ */
+class StlOutputStreamWrapper :
+  public AbstractOutputStream
+{
+protected:
+  std::ostream* stream_;
+
+public:
+  StlOutputStreamWrapper(std::ostream* stream): stream_(stream) {}
+  StlOutputStreamWrapper(const StlOutputStreamWrapper& stlos) : stream_(stlos.stream_) {}
+  StlOutputStreamWrapper& operator=(const StlOutputStreamWrapper& stlos) { stream_ = stlos.stream_; return *this; }
+
+public:
+  StlOutputStreamWrapper& operator<<(const std::string& message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& operator<<(const char* message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& operator<<(const char& message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& operator<<(const int& message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& operator<<(const unsigned int& message) { if (stream_) *stream_ << message; return *this; }
+
+  StlOutputStreamWrapper& operator<<(const long int& message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& operator<<(const unsigned long int& message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& operator<<(const double& message)
+  {
+    if (stream_)
+      *stream_ << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  StlOutputStreamWrapper& operator<<(const long double& message)
+  {
+    if (stream_)
+      *stream_ << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  } 
+  StlOutputStreamWrapper& operator<<(const bool& message) { if (stream_) *stream_ << message; return *this; }
+  StlOutputStreamWrapper& endLine() { if (stream_) *stream_ << std::endl; return *this; }
+  StlOutputStreamWrapper& flush() { if (stream_) stream_->flush(); return *this; }
+
+  StlOutputStreamWrapper* clone() const { return new StlOutputStreamWrapper(*this); }
+
+};
+
+/**
+ * @brief Standard output stream.
+ *
+ * This class wraps the std::cout stream.
+ */
+class StdOut :
+  public AbstractOutputStream
+{
+public:
+  OutputStream& operator<<(const std::string& message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const char* message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const char& message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const int& message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const unsigned int& message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const long int& message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const unsigned long int& message) { std::cout << message; return *this; }
+  OutputStream& operator<<(const double& message)
+  {
+    std::cout << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  OutputStream& operator<<(const long double& message)
+  {
+    std::cout << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  OutputStream& operator<<(const bool& message) { std::cout << message; return *this; }
+  OutputStream& endLine() { std::cout << std::endl; return *this; }
+  OutputStream& flush() { std::cout.flush(); return *this; }
+
+  StdOut* clone() const { return new StdOut(*this); }
+
+};
+
+
+
+
+
+/**
+ * @brief Standard error stream.
+ *
+ * This class wraps the std::cerr stream.
+ */
+class StdErr :
+  public AbstractOutputStream
+{
+public:
+  OutputStream& operator<<(const std::string& message) { std::cerr << message; return *this; }
+  OutputStream& operator<<(const char* message) { std::cerr << message; return *this; }
+  OutputStream& operator<<(const char& message) { std::cerr << std::setprecision(getPrecision()) << message; return *this; }
+  OutputStream& operator<<(const int& message) { std::cerr << std::setprecision(getPrecision()) << message; return *this; }
+  OutputStream& operator<<(const unsigned int& message) { std::cerr << message; return *this; }
+  OutputStream& operator<<(const long int& message) { std::cerr << std::setprecision(getPrecision()) << message; return *this; }
+  OutputStream& operator<<(const unsigned long int& message) { std::cerr << message; return *this; }
+  OutputStream& operator<<(const double& message)
+  {
+    std::cerr << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  OutputStream& operator<<(const long double& message)
+  {
+    std::cerr << std::setprecision(getPrecision()) << (isScientificNotationEnabled() ? std::scientific : std::fixed) << message;
+    return *this;
+  }
+  OutputStream& operator<<(const bool& message) { std::cerr << message; return *this; }
+  OutputStream& endLine() { std::cerr << std::endl; return *this; }
+  OutputStream& flush() { std::cerr.flush(); return *this; }
+
+  StdErr* clone() const { return new StdErr(*this); }
+
+};
+
+/**
+ * @brief String output stream.
+ *
+ * This class wraps the std::ostringstream stream.
+ */
+class StdStr :
+  public StlOutputStreamWrapper
+{
+public:
+  StdStr(): StlOutputStreamWrapper(new std::ostringstream()){}
+  
+  std::string str() const { return dynamic_cast<const std::ostringstream*>(stream_)->str();}
+
+  ~StdStr() { delete stream_;}
+};
+
+} // end of namespace bpp;
+
+#endif //_OUTPUTSTREAM_H_
+
diff --git a/src/Bpp/Numeric/AbstractParameterAliasable.cpp b/src/Bpp/Numeric/AbstractParameterAliasable.cpp
new file mode 100644
index 0000000..ce7c5ba
--- /dev/null
+++ b/src/Bpp/Numeric/AbstractParameterAliasable.cpp
@@ -0,0 +1,397 @@
+//
+// File: AbstractParameterAliasable.cpp
+// Created by: Julien Dutheil
+// Created on: Sun Mar 29 09:10 2009
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "AbstractParameterAliasable.h"
+#include "VectorTools.h"
+
+using namespace bpp;
+using namespace std;
+
+AbstractParameterAliasable::AbstractParameterAliasable(const AbstractParameterAliasable& ap) :
+  AbstractParametrizable(ap),
+  independentParameters_(),
+  aliasListenersRegister_()
+{
+  for (size_t i=0; i<ap.independentParameters_.size(); i++)
+    independentParameters_.shareParameter(getSharedParameter(getParameterNameWithoutNamespace(ap.independentParameters_[i].getName())));
+  
+  // Actualize the register with adequate pointers:
+  for (map<string, AliasParameterListener*>::const_iterator it = ap.aliasListenersRegister_.begin();
+       it != ap.aliasListenersRegister_.end();
+       it++)
+  {
+    AliasParameterListener* listener = it->second->clone();
+    listener->setParameterList(&getParameters_());
+    aliasListenersRegister_[it->first] = listener;
+    // Now correct parameters with appropriate pointers:
+    for (unsigned int i = 0; i < getNumberOfParameters(); ++i)
+    {
+      if (getParameters_()[i].hasParameterListener(it->first))
+      {
+        getParameters_()[i].removeParameterListener(it->first);
+        getParameters_()[i].addParameterListener(listener, false);
+      }
+    }
+  }
+}
+
+AbstractParameterAliasable& AbstractParameterAliasable::operator=(const AbstractParameterAliasable& ap)
+{
+  AbstractParametrizable::operator=(ap);
+  
+  for (size_t i=0; i<ap.independentParameters_.size(); i++)
+    independentParameters_.shareParameter(getSharedParameter(getParameterNameWithoutNamespace(ap.independentParameters_[i].getName())));
+
+  // Actualize the register with adequate pointers:
+  for (map<string, AliasParameterListener*>::const_iterator it = ap.aliasListenersRegister_.begin();
+       it != ap.aliasListenersRegister_.end();
+       it++)
+  {
+    AliasParameterListener* listener = it->second->clone();
+    listener->setParameterList(&getParameters_());
+    aliasListenersRegister_[it->first] = listener;
+    // Now correct parameters with appropriate pointers:
+    for (unsigned int i = 0; i < getNumberOfParameters(); ++i)
+    {
+      if (getParameters_()[i].hasParameterListener(it->first))
+      {
+        getParameters_()[i].removeParameterListener(it->first);
+        getParameters_()[i].addParameterListener(listener, false);
+      }
+    }
+  }
+  return *this;
+}
+
+AbstractParameterAliasable::~AbstractParameterAliasable()
+{
+  // Delete the registry content:
+  for (map<string, AliasParameterListener*>::iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    delete it->second;
+  }
+}
+
+void AbstractParameterAliasable::aliasParameters(const std::string& p1, const std::string& p2)
+throw (ParameterNotFoundException, Exception)
+{
+  // In case this is the first time we call this method:
+  if (getNumberOfParameters() > 0 && independentParameters_.size() == 0)
+    independentParameters_.shareParameters(getParameters());
+
+  if (!hasParameter(p1))
+    throw ParameterNotFoundException("AbstractParameterAliasable::aliasParameters", p1);
+  if (!hasParameter(p2))
+    throw ParameterNotFoundException("AbstractParameterAliasable::aliasParameters", p2);
+  if (!independentParameters_.hasParameter(getNamespace() + p2))
+    throw Exception("AbstractParameterAliasable::aliasParameters. Parameter " + p2 + " is already aliased to a parameter and can't be aliased twice.");
+
+  string id = "__alias_" + p2 + "_to_" + p1;
+  string idCheck = "__alias_" + p1 + "_to_" + p2;
+
+  if (aliasListenersRegister_.find(idCheck) != aliasListenersRegister_.end())
+    throw Exception("AbstractParameterAliasable::aliasParameters. Trying to alias parameter " + p2 + " to " + p1 + ", but parameter " + p1 + " is already aliased to parameter " + p2 + ".");
+  Parameter* param1 = &getParameter_(p1);
+  Parameter* param2 = &getParameter_(p2);
+
+  if (!param1->hasConstraint())
+  {
+    if (param2->hasConstraint())
+    {
+      ApplicationTools::displayWarning("Aliasing parameter " + p2 + " to " + p1 + ". " + p1 + " gets the constraints of " + p2 + ": " + param2->getConstraint()->getDescription());
+      param1->setConstraint(param2->getConstraint());    
+    }
+  }
+  else
+    // We use a small trick here, we test the constraints on the basis of their string description (C++ does not provide a default operator==() :( ).
+    if (param2->hasConstraint() && (param1->getConstraint()->getDescription() != param2->getConstraint()->getDescription()))
+    {
+      Constraint* nc = *param2->getConstraint() & *param1->getConstraint();
+      ApplicationTools::displayWarning("Aliasing parameter " + p2 + " to " + p1 + " with different constraints. They get the intersection of both constraints : " + nc->getDescription());
+      
+      param2->setConstraint(nc, true);
+      param1->setConstraint(nc->clone(), true);
+    }
+  
+  // Every thing seems ok, let's create the listener and register it:
+
+  AliasParameterListener* aliasListener = new AliasParameterListener(id, getParameters().whichParameterHasName(getNamespace() + p2), &getParameters_(), p1);
+
+  aliasListenersRegister_[id] = aliasListener;
+
+  // Now we add it to the appropriate parameter, that is p1.
+  // The parameter will not own the listener, the bookkeeping being achieved by the register:
+  param1->addParameterListener(aliasListener, false);
+  
+  // Finally we remove p2 from the list of independent parameters:
+  independentParameters_.deleteParameter(getNamespace() + p2);
+}
+
+void AbstractParameterAliasable::aliasParameters(map<string, string>& unparsedParams, bool verbose)
+{
+  const ParameterList& pl = getParameters();
+  ParameterList plpars;
+
+  for (size_t i = 0; i < pl.size(); i++)
+  {
+    if (unparsedParams.find(pl[i].getName()) == unparsedParams.end())
+      plpars.addParameter(*pl[i].clone());
+  }
+
+  size_t unp_s = unparsedParams.size();
+  while (unp_s != 0)
+  {
+    map<string, string>::iterator it;
+    for (it = unparsedParams.begin(); it != unparsedParams.end(); it++)
+    {
+      Parameter* pp = 0;
+      try
+      {
+        pp = &plpars.getParameter(it->second);
+      }
+      catch (ParameterNotFoundException& e)
+      {
+        if (!pl.hasParameter(it->second))
+          throw ParameterNotFoundException("Unknown aliasing parameter", it->first + "->" + it->second);
+        continue;
+      }
+      unique_ptr<Parameter> p2(pp->clone());
+      p2->setName(it->first);
+      plpars.addParameter(p2.release());
+      plpars.getParameter(it->first);
+      aliasParameters(it->second, it->first);
+      if (verbose)
+        ApplicationTools::displayResult("Parameter alias found", it->first + " -> " + it->second + " = " + TextTools::toString(pp->getValue()));
+      unparsedParams.erase(it);
+    }
+
+    if (unparsedParams.size() == unp_s)
+      throw Exception("Error, there is a cycle in aliasing starting with " + unparsedParams.begin()->first);
+    else
+      unp_s = unparsedParams.size();
+  }
+
+  matchParametersValues(plpars);
+}
+
+
+void AbstractParameterAliasable::unaliasParameters(const std::string& p1, const std::string& p2)
+throw (ParameterNotFoundException, Exception)
+{
+  if (!hasParameter(p1))
+    throw ParameterNotFoundException("AbstractParameterAliasable::unaliasParameters", p1);
+  if (!hasParameter(p2))
+    throw ParameterNotFoundException("AbstractParameterAliasable::unaliasParameters", p2);
+
+  string id = "__alias_" + p2 + "_to_" + p1;
+  map<string, AliasParameterListener*>::iterator it = aliasListenersRegister_.find(id);
+  if (it == aliasListenersRegister_.end())
+    throw Exception("AbstractParameterAliasable::unaliasParameters. Parameter " + p2 + " is not aliased to parameter " + p1 + ".");
+  // Remove the listener:
+  getParameter_(p1).removeParameterListener(id);
+  delete it->second;
+  aliasListenersRegister_.erase(it);
+  // Finally we re-add p2 to the list of independent parameters:
+  independentParameters_.shareParameter(getSharedParameter(p2));
+}
+
+void AbstractParameterAliasable::setNamespace(const std::string& prefix)
+{
+  string currentName;
+
+  // We modify all the listeners
+  for (map<string, AliasParameterListener*>::iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    currentName = it->second->getName();
+    if (TextTools::startsWith(currentName, getNamespace()))
+      it->second->rename(prefix + currentName.substr(getNamespace().size()));
+    else
+      it->second->rename(prefix + currentName);
+  }
+
+// Finally we notify the mother class:
+  AbstractParametrizable::setNamespace(prefix);
+}
+
+vector<string> AbstractParameterAliasable::getAlias(const string& name) const
+{
+  vector<string> aliases;
+
+  for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    if (it->second->getFrom() == name)
+    {
+      string alias = it->second->getAlias();
+      aliases.push_back(alias);
+      if (alias != name)
+      {
+        vector<string> chainAliases = getAlias(alias);
+        VectorTools::append(aliases, chainAliases);
+      }
+    }
+  }
+  return aliases;
+}
+
+
+std::map<std::string, std::string> AbstractParameterAliasable::getAliases() const
+{
+  map<string, string> aliases;
+
+  for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    string name = it->second->getFrom();
+
+    vector<string> alias = getAlias(name);
+
+    for (size_t i = 0; i < alias.size(); i++)
+    {
+      aliases[alias[i]] = name;
+    }
+  }
+
+  return aliases;
+}
+
+ParameterList AbstractParameterAliasable::getAliasedParameters(const ParameterList& pl) const
+{
+  ParameterList aliases;
+  bool b = false;
+
+  for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    if ((pl.hasParameter(it->second->getFrom()) ||
+         aliases.hasParameter(it->second->getFrom()))
+        && !(aliases.hasParameter(it->second->getAlias()) ||
+             pl.hasParameter(it->second->getAlias())))
+    {
+      b = true;
+      aliases.addParameter(getParameter(it->second->getAlias()));
+    }
+  }
+
+  while (b)
+  {
+    b = false;
+
+    for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+         it != aliasListenersRegister_.end();
+         it++)
+    {
+      if (aliases.hasParameter(it->second->getFrom())
+          && !(aliases.hasParameter(it->second->getAlias()) ||
+               pl.hasParameter(it->second->getAlias())))
+      {
+        b = true;
+        aliases.addParameter(getParameter(it->second->getAlias()));
+      }
+    }
+  }
+
+  return aliases;
+}
+
+string AbstractParameterAliasable::getFrom(const string& name) const
+{
+  string from = "";
+
+  for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    if (it->second->getName() == name)
+    {
+      from = it->second->getFrom();
+      break;
+    }
+  }
+
+  return from;
+}
+
+
+ParameterList AbstractParameterAliasable::getFromParameters(const ParameterList& pl) const
+{
+  ParameterList from;
+  bool b = false;
+
+  for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+       it != aliasListenersRegister_.end();
+       it++)
+  {
+    if ((pl.hasParameter(it->second->getAlias()) ||
+         from.hasParameter(it->second->getAlias()))
+        && !(from.hasParameter(it->second->getFrom()) ||
+             pl.hasParameter(it->second->getFrom())))
+    {
+      b = true;
+      from.addParameter(getParameter(it->second->getFrom()));
+    }
+  }
+
+  while (b)
+  {
+    b = false;
+
+    for (map<string, AliasParameterListener*>::const_iterator it = aliasListenersRegister_.begin();
+         it != aliasListenersRegister_.end();
+         it++)
+    {
+      if (from.hasParameter(it->second->getAlias())
+          && !(from.hasParameter(it->second->getFrom()) ||
+               pl.hasParameter(it->second->getFrom())))
+      {
+        b = true;
+        from.addParameter(getParameter(it->second->getFrom()));
+      }
+    }
+  }
+
+  return from;
+}
diff --git a/src/Bpp/Numeric/AbstractParameterAliasable.h b/src/Bpp/Numeric/AbstractParameterAliasable.h
new file mode 100644
index 0000000..4db3441
--- /dev/null
+++ b/src/Bpp/Numeric/AbstractParameterAliasable.h
@@ -0,0 +1,281 @@
+//
+// File: AbstractParameterAliasable.h
+// Created by: Julien Dutheil
+// Created on: Thu May 14 17:08 2009
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ABSTRACTPARAMETERALIASABLE_H_
+#define _ABSTRACTPARAMETERALIASABLE_H_
+
+#include "AbstractParametrizable.h"
+#include "ParameterAliasable.h"
+
+// From the STL:
+#include <map>
+
+namespace bpp
+{
+/**
+ * @brief Inner listener class used by AbstractParameterAliasable.
+ */
+class AliasParameterListener :
+  public ParameterListener
+{
+private:
+  std::string id_;
+  size_t alias_;
+  ParameterList* pl_;
+  std::string name_;
+  std::string from_;
+
+public:
+  AliasParameterListener(const std::string& id, size_t alias, ParameterList* pl, const std::string& from) :
+    id_(id),
+    alias_(alias),
+    pl_(pl),
+    name_(),
+    from_(from)
+  {
+    // This allow us to check if the parameter position have changed at some point...
+    name_ = (*pl_)[alias].getName();
+  }
+
+  AliasParameterListener(const AliasParameterListener& apl) :
+    id_(apl.id_),
+    alias_(apl.alias_),
+    pl_(apl.pl_),
+    name_(apl.name_),
+    from_(apl.from_)
+  {}
+
+  AliasParameterListener& operator=(const AliasParameterListener& apl)
+  {
+    id_    = apl.id_;
+    alias_ = apl.alias_;
+    pl_    = apl.pl_;
+    name_  = apl.name_;
+    from_  = apl.from_;
+    return *this;
+  }
+
+  AliasParameterListener* clone() const { return new AliasParameterListener(*this); }
+
+public:
+  const std::string& getId() const { return id_; }
+
+  const std::string& getFrom() const { return from_; }
+
+  void setParameterList(ParameterList* pl) { pl_ = pl; }
+
+  void parameterNameChanged(ParameterEvent& event) throw (Exception) {}
+
+  void parameterValueChanged(ParameterEvent& event) throw (Exception)
+  {
+    Parameter* p = &(*pl_)[alias_];
+    if (p->getName() != name_)
+      throw Exception("AbstractParameterAliasable::AliasParameterListener::parameterValueChanged. Error, aliased parameter have change, maybe because it was renamed, or a parameter was removed?");
+    p->setValue(event.getParameter()->getValue());
+  }
+
+  const std::string& getName() const { return name_; }
+
+  void rename(const std::string& name) { name_ = name; }
+
+  const std::string& getAlias() const { return (*pl_)[alias_].getName(); }
+};
+
+/**
+ * @brief A partial implementation of the Parametrizable interface.
+ *
+ * Parameters are stored in a protected ParameterList object.
+ *
+ * The abstract fireParameterChanged() method is provided so that the derived class
+ * know when a parameter has changed, and can be updated.
+ * All methods call the corresponding method in ParameterList and then call the
+ * fireParameterChanged() method.
+ */
+class AbstractParameterAliasable :
+  public AbstractParametrizable,
+  public virtual ParameterAliasable
+{
+private:
+  mutable ParameterList independentParameters_;
+
+  /**
+   * Contains all parameter listeners for maintening alias relationships.
+   * The registry will be updated appropriately upon cloning and deleting.
+   */
+  std::map<std::string, AliasParameterListener*> aliasListenersRegister_;
+
+public:
+  AbstractParameterAliasable(const std::string& prefix) :
+    AbstractParametrizable(prefix),
+    independentParameters_(),
+    aliasListenersRegister_()
+  {}
+
+  AbstractParameterAliasable(const AbstractParameterAliasable& ap);
+
+  AbstractParameterAliasable& operator=(const AbstractParameterAliasable& ap);
+
+  virtual ~AbstractParameterAliasable();
+
+public:
+  void setNamespace(const std::string& prefix);
+
+  bool hasIndependentParameter(const std::string& name) const { return independentParameters_.hasParameter(getNamespace() + name); }
+
+  const ParameterList& getIndependentParameters() const { return independentParameters_; }
+
+  size_t getNumberOfIndependentParameters() const { return independentParameters_.size(); }
+
+  void aliasParameters(const std::string& p1, const std::string& p2) throw (ParameterNotFoundException, Exception);
+
+  void unaliasParameters(const std::string& p1, const std::string& p2) throw (ParameterNotFoundException, Exception);
+
+  /**
+   * @brief alias the parameters following the links described in a
+   * map, and update the object accordingly. Cycles in aliasing are
+   * detected and forbidden.
+   *
+   * @param unparsedParams the map of the links : <A,B> matches for A->B aliasing.
+   * @param verbose verbosity
+   *
+   **/
+
+  void aliasParameters(std::map<std::string, std::string>& unparsedParams, bool verbose);
+
+  /**
+   * @brief Return the list of the names of the parameters that are
+   * aliased (directly or not) to one of the parameters of the list.
+   *
+   */
+
+  ParameterList getAliasedParameters(const ParameterList& pl) const;
+
+  /**
+   * @brief Return the list of the names of the parameters from which
+   * the parameters of the list are aliased  (directly or not). 
+   *
+   */
+
+  ParameterList getFromParameters(const ParameterList& pl) const;
+
+
+  /**
+   * @return The list of names of the parameters that are aliased with a given parameter.
+   * The implementation is recursive, which means that in the case of A->B->C, getalias(C) will return both A and B.
+   * @param name The name of the parameter to look for.
+   */
+
+  virtual std::vector<std::string> getAlias(const std::string& name) const;
+
+  /**
+   * @return the map of the aliases.
+   *
+   **/
+
+  virtual std::map<std::string, std::string> getAliases() const;
+
+  /**
+   * @return The name of the parameter from which a given parameter is aliased.
+   * @param name The name of the parameter to look for.
+   */
+
+  std::string getFrom(const std::string& name) const;
+
+  // void fireParameterChanged(const ParameterList& parameters)
+  // {
+  //   independentParameters_.matchParametersValues(getParameters());
+  // }
+
+protected:
+  void addParameter_(Parameter* parameter)
+  {
+    AbstractParametrizable::addParameter_(parameter);
+    independentParameters_.shareParameter(getSharedParameter(getParameterNameWithoutNamespace(parameter->getName())));
+  }
+
+  void addParameters_(const ParameterList& parameters)
+  {
+    AbstractParametrizable::addParameters_(parameters);
+
+    for (size_t i=0; i<parameters.size(); i++)
+      independentParameters_.shareParameter(getSharedParameter(getParameterNameWithoutNamespace(parameters[i].getName())));
+  }
+
+  void includeParameters_(const ParameterList& parameters)
+  {
+    AbstractParametrizable::includeParameters_(parameters);
+    for (size_t i=0; i<parameters.size(); i++)
+      independentParameters_.shareParameter(getSharedParameter(getParameterNameWithoutNamespace(parameters[i].getName())));
+  }
+
+
+  void deleteParameter_(size_t index) throw (IndexOutOfBoundsException)
+  {
+    std::string name = getParameterNameWithoutNamespace(getParameter_(index).getName());
+    AbstractParametrizable::deleteParameter_(index);
+    if (independentParameters_.hasParameter(name))
+      independentParameters_.deleteParameter(name);
+  }
+
+  void deleteParameter_(std::string& name) throw (IndexOutOfBoundsException)
+  {
+    AbstractParametrizable::deleteParameter_(name);
+    if (independentParameters_.hasParameter(name))
+      independentParameters_.deleteParameter(name);
+  }
+
+  void deleteParameters_(const std::vector<std::string>& names)
+  {
+    std::string x;
+    for (size_t i = 0; i < names.size(); i++)
+    {
+      x = names[i];
+      deleteParameter_(x);
+    }
+  }
+
+  void resetParameters_()
+  {
+    AbstractParametrizable::resetParameters_();
+    independentParameters_.reset();
+  }
+};
+} // end of namespace bpp.
+
+#endif // _ABSTRACTPARAMETERALIASABLE_H_
diff --git a/test/test_alphabets.cpp b/src/Bpp/Numeric/AbstractParametrizable.cpp
similarity index 62%
copy from test/test_alphabets.cpp
copy to src/Bpp/Numeric/AbstractParametrizable.cpp
index bf5b346..d8b6142 100644
--- a/test/test_alphabets.cpp
+++ b/src/Bpp/Numeric/AbstractParametrizable.cpp
@@ -1,14 +1,14 @@
 //
-// File: test_alphabets.cpp
+// File: AbstractParametrizable.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Sun Mar 29 09:10 2009
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 19, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,29 +37,34 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
-#include <iostream>
+#include "AbstractParametrizable.h"
 
 using namespace bpp;
 using namespace std;
 
-int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
+void AbstractParametrizable::setNamespace(const std::string& prefix)
+{
+  //We need to update all parameter names!
+  //First correct the global parameter list
+  string currentName;
+  for(unsigned int i = 0; i < parameters_.size(); i++)
+  {
+    currentName = parameters_[i].getName();
+    if (TextTools::startsWith(currentName, prefix_))
+      parameters_[i].setName(prefix + currentName.substr(prefix_.size()));
+    else
+      parameters_[i].setName(prefix + currentName);
+  }
 
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
+  //Then we store the new namespace:
+  prefix_ = prefix;
+}
 
-  return (0);
+std::string AbstractParametrizable::getParameterNameWithoutNamespace(const std::string& name) const
+{
+  if(TextTools::startsWith(name, prefix_))
+    return name.substr(prefix_.size());
+  else
+    return name;
 }
+
diff --git a/src/Bpp/Numeric/AbstractParametrizable.h b/src/Bpp/Numeric/AbstractParametrizable.h
new file mode 100644
index 0000000..4aa989f
--- /dev/null
+++ b/src/Bpp/Numeric/AbstractParametrizable.h
@@ -0,0 +1,259 @@
+//
+// File: AbstractParametrizable.h
+// Created by: Julien Dutheil
+// Created on: Sun Mar 29 09:10 2009
+// Created from file Parametrizable.h
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ABSTRACTPARAMETRIZABLE_H_
+#define _ABSTRACTPARAMETRIZABLE_H_
+
+#include "Parametrizable.h"
+
+//From the STL:
+#include <map>
+
+namespace bpp
+{
+
+/**
+ * @brief A partial implementation of the Parametrizable interface.
+ *
+ * Parameters are stored in a protected ParameterList object.
+ *
+ * The abstract fireParameterChanged() method is provided so that the derived class
+ * know when a parameter has changed, and can be updated.
+ * All methods call the corresponding method in ParameterList and then call the
+ * fireParameterChanged() method.
+ */
+class AbstractParametrizable:
+  public virtual Parametrizable
+{
+  private:
+    ParameterList parameters_;
+    std::string prefix_;
+
+  public:
+    AbstractParametrizable(const std::string& prefix) : parameters_(), prefix_(prefix) {}
+
+    virtual ~AbstractParametrizable() {}
+
+  public:
+    bool hasParameter(const std::string& name) const { return parameters_.hasParameter(prefix_ + name); }
+
+    const ParameterList& getParameters() const { return parameters_; }
+    
+    const Parameter& getParameter(const std::string& name) const throw (ParameterNotFoundException)
+    {
+      return parameters_.getParameter(prefix_ + name);
+    }
+
+  const std::shared_ptr<Parameter>& getSharedParameter(const std::string& name) const throw (ParameterNotFoundException)
+  {
+    return parameters_.getSharedParameter(prefix_ + name);
+  }
+
+    double getParameterValue(const std::string& name) const
+      throw (ParameterNotFoundException)
+    { 
+      return getParameter(name).getValue();
+    }
+
+    void setAllParametersValues(const ParameterList & parameters) 
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      parameters_.setAllParametersValues(parameters);
+      fireParameterChanged(parameters);
+    }
+
+    void setParameterValue(const std::string& name, double value) 
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      parameters_.setParameterValue(prefix_ + name, value);
+      fireParameterChanged(parameters_.subList(prefix_ + name));
+    }
+
+    void setParametersValues(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    { 
+      parameters_.setParametersValues(parameters);
+      fireParameterChanged(parameters);
+    }
+
+    bool matchParametersValues(const ParameterList& parameters)
+      throw (ConstraintException)
+    {
+      std::unique_ptr< std::vector<size_t> >updatedParameters(new std::vector<size_t>());
+      bool test = parameters_.matchParametersValues(parameters, updatedParameters.get());
+      if (test) 
+        fireParameterChanged(parameters.subList(*updatedParameters));
+      return test;
+    }
+
+    size_t getNumberOfParameters() const { return parameters_.size(); }
+     
+    void setNamespace(const std::string& prefix);
+    
+    std::string getNamespace() const { return prefix_; }
+    
+    std::string getParameterNameWithoutNamespace(const std::string& name) const;
+
+    /**
+     * @brief Notify the class when one or several parameters have changed.
+     *
+     * @param parameters A ParameterList object with parameters that changed.
+     */
+  
+  virtual void fireParameterChanged(const ParameterList& parameters) {};
+  
+  
+
+  protected:
+  
+  virtual void addParameter_(Parameter* parameter)
+  {
+    if (parameter)
+      parameters_.addParameter(parameter);
+  }
+  
+  virtual void addParameters_(const ParameterList& parameters)
+  {
+    parameters_.addParameters(parameters);
+  }
+
+  void shareParameter_(const std::shared_ptr<Parameter>& parameter)
+  {
+    parameters_.shareParameter(parameter);
+  }
+
+  void shareParameters_(const ParameterList& parameters)
+  {
+    parameters_.shareParameters(parameters);
+  }
+
+  virtual void includeParameters_(const ParameterList& parameters)
+  {
+    parameters_.includeParameters(parameters);
+  }
+
+  virtual void deleteParameter_(size_t index) throw (IndexOutOfBoundsException)
+  {
+    if (index >= parameters_.size())
+      throw IndexOutOfBoundsException("AbstractParametrizable::deleteParameter_.", index, 0, parameters_.size() - 1);
+    parameters_.deleteParameter(index);
+  }
+
+  virtual void deleteParameter_(std::string& name)
+  {
+    parameters_.deleteParameter(name);
+  }
+
+  virtual void deleteParameters_(const std::vector<std::string>& names)
+  {
+     parameters_.deleteParameters(names);
+  }
+
+  void resetParameters_()
+  {
+    parameters_.reset();
+  }
+
+    /**
+     * @param name The name of the parameter.
+     * @return A reference toward the corresponding parameter.
+     * @throw ParameterNotFoundException If no parameter with that name is found in the list.
+     */
+    Parameter& getParameter_(const std::string& name) throw (ParameterNotFoundException)
+    {
+      return parameters_.getParameter(prefix_ + name);
+    }
+  
+    /**
+     * @param name The name of the parameter, including its namespace.
+     * @return A reference toward the corresponding parameter.
+     * @throw ParameterNotFoundException If no parameter with that name is found in the list.
+     */
+    Parameter& getParameterWithNamespace_(const std::string& name) throw (ParameterNotFoundException)
+    {
+      return getParameter_(name);
+    }
+    /**
+     * @param name The name of the parameter, including its namespace.
+     * @return A reference toward the corresponding parameter.
+     * @throw ParameterNotFoundException If no parameter with that name is found in the list.
+     */
+    const Parameter& getParameterWithNamespace_(const std::string& name) const throw (ParameterNotFoundException)
+    {
+      return getParameter(name);
+    }
+
+    Parameter& getParameter_(size_t index) throw (IndexOutOfBoundsException)
+    {
+      if (index >= parameters_.size())
+        throw IndexOutOfBoundsException("AbstractParametrizable::getParameter_.", index, 0, parameters_.size() - 1);
+      return parameters_[index];
+    }
+
+  const Parameter& getParameter_(size_t index) const throw (IndexOutOfBoundsException)
+    {
+      if(index >= parameters_.size())
+        throw IndexOutOfBoundsException("AbstractParametrizable::getParameter_.", index, 0, parameters_.size() - 1);
+      return parameters_[index];
+    }
+
+
+  ParameterList& getParameters_() { return parameters_; }
+
+  /**
+   * @return The shared_ptr parameter at a given position.
+   * @warning No check is performed on the validity of the index given as input!
+   */ 
+  const std::shared_ptr<Parameter>& getSharedParameter(size_t i) const
+  {
+    return parameters_.getSharedParameter(i);
+  }
+  
+  std::shared_ptr<Parameter>& getSharedParameter(size_t i)
+  {
+    return parameters_.getSharedParameter(i);
+  }
+
+};
+
+} //end of namespace bpp.
+
+#endif //_ABSTRACTPARAMETRIZABLE_H_
+
diff --git a/src/Bpp/Numeric/AdaptiveKernelDensityEstimation.cpp b/src/Bpp/Numeric/AdaptiveKernelDensityEstimation.cpp
new file mode 100644
index 0000000..86608e1
--- /dev/null
+++ b/src/Bpp/Numeric/AdaptiveKernelDensityEstimation.cpp
@@ -0,0 +1,141 @@
+//
+// File: AdaptiveKernelDensityEstimation.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Nov 05 13:25:07 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "AdaptiveKernelDensityEstimation.h"
+#include "Matrix/MatrixTools.h"
+#include "NumConstants.h"
+
+using namespace bpp;
+using namespace std;
+
+void AdaptiveKernelDensityEstimation::init_()
+{
+  //Compute the covariance matrix of the sample:
+  MatrixTools::covar(x_, covar_);
+
+  //Compute the mean vector
+  sampleMean_(x_, xMean_);
+  
+  //Compute the inverse of the square root of the covariance matrix:
+  MatrixTools::pow<double>(covar_, -0.5, invSqrtCovar_);   
+
+  //Compute the bandwidth:
+  h_ = std::pow(4. / ((2 * static_cast<double>(r_) + 1.) * static_cast<double>(n_)), 1. / (static_cast<double>(r_) + 4.));
+  //Compute as much as we can in advance to simplify the density calculation:
+  c1_ = 1. / (std::sqrt(MatrixTools::det(covar_)) * static_cast<double>(n_) * std::pow(h_, static_cast<int>(r_)));
+  
+  //Now compute the local tuning of the bandwidth.
+  //First estimate the pilot density:
+  vector<double> xi(r_);
+  LinearMatrix<double> diff_xi(r_, 1);
+  LinearMatrix<double>  std_xi(r_, 1);
+  for (unsigned int i = 0; i < n_; i++)
+  {
+    //Get the current xi point to evaluate:
+    for(unsigned int k = 0; k < r_; k++)
+      xi[k] = x_(k, i);
+     
+    //Sum loop, over all xi's:
+    double sum = 0;
+    for (unsigned int j = 0; j < n_; j++)
+    {
+      for (unsigned int k = 0; k < r_; k++)
+        diff_xi(k, 0) = xi[k] - x_(k, j);
+      MatrixTools::mult(invSqrtCovar_, diff_xi, std_xi);
+      MatrixTools::scale(std_xi, 1. / h_);
+      sum += kernel_(std_xi);
+    }
+    pilot_[i] = c1_ * sum;
+  }
+
+  //Compute the tuning parameters:
+  double g = 0;
+  for (unsigned int i = 0; i < n_; i++)
+    g += std::log(pilot_[i]);
+  g = std::exp(g / static_cast<double>(n_));
+  for (unsigned int i = 0; i < n_; i++)
+    lambda_[i] = std::pow(g / pilot_[i], gamma_);
+
+  //Compute as much as we can in advance to simplify the density calculation:
+  for (unsigned int i = 0; i < n_; i++)
+    c2_[i] = std::pow(lambda_[i], - static_cast<double>(r_));
+}
+
+void AdaptiveKernelDensityEstimation::sampleMean_(const Matrix<double>& x, std::vector<double>& mean)
+{
+  size_t nc = x.getNumberOfColumns();
+  size_t nr = x.getNumberOfRows();
+  mean.resize(nr);
+  for (size_t i = 0; i < nr; i++)
+  {
+    mean[i] = 0;
+    for (size_t j = 0; j < nc; j++)
+      mean[i] += x(i, j);
+    mean[i] /= static_cast<double>(nc);
+  }
+}
+
+double AdaptiveKernelDensityEstimation::kernel_(const Matrix<double>& x)
+{
+  //x is supposed to have only one column and r_ rows.
+  //We compute the scalar product of the column with itself:
+  double scalar = 0;
+  for (size_t i = 0; i < r_; i++)
+    scalar += std::pow(x(i, 0), 2.);
+
+  return std::pow(2. * NumConstants::PI(), -static_cast<double>(r_) / 2.) * std::exp(-0.5 * scalar);
+}
+
+double AdaptiveKernelDensityEstimation::kDensity(const std::vector<double>& x)
+{
+  LinearMatrix<double> diff_xi(r_, 1);
+  LinearMatrix<double> std_xi(r_, 1);
+  //Sum loop, over all xi's:
+  double sum = 0;
+  for(unsigned int j = 0; j < n_; j++)
+  {
+    for(unsigned int k = 0; k < r_; k++)
+      diff_xi(k, 0) = x[k] - x_(k, j);
+    MatrixTools::mult(invSqrtCovar_, diff_xi, std_xi);
+    MatrixTools::scale(std_xi, 1. / (h_ * lambda_[j]));
+    sum += kernel_(std_xi) * c2_[j];
+  }
+  return c1_ * sum;  
+}
+
diff --git a/src/Bpp/Numeric/AdaptiveKernelDensityEstimation.h b/src/Bpp/Numeric/AdaptiveKernelDensityEstimation.h
new file mode 100644
index 0000000..4abf2e8
--- /dev/null
+++ b/src/Bpp/Numeric/AdaptiveKernelDensityEstimation.h
@@ -0,0 +1,122 @@
+//
+// File: AdaptiveKernelDensityEstimation.h
+// Created by: Julien Dutheil
+// Created on: Thu Nov 05 13:25:07 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ADAPTIVEKERNELDENSITYESTIMATION_H_
+#define _ADAPTIVEKERNELDENSITYESTIMATION_H_
+
+#include "Matrix/Matrix.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Density estimation using the adaptive kernel method.
+ *
+ * For now this implementation is quite restricted, more options may be implemented later...
+ *
+ * The source for this method can be found is the appendix of the following paper:
+ * Ivan Kojadinovic, _Computational Statistics and Data Analaysis_ (2004), 46:269-294 
+ *
+ * @author Julien Dutheil
+ */
+class AdaptiveKernelDensityEstimation
+{
+  private:
+    RowMatrix<double> x_; //The original sample
+    size_t n_;
+    size_t r_;
+    RowMatrix<double> covar_; //The covariance matrix, used for the linear transformation
+    RowMatrix<double> invSqrtCovar_; //The inverse of the square root of the covariance matrix, used for the linear transformation
+    std::vector<double> xMean_;
+    double gamma_; //Tune the effect of the pilot density.
+    double c1_;
+    std::vector<double> c2_;
+    double h_; //The bandwidth.
+    std::vector<double> lambda_; //The local tuning coefficient of the bandwidth.
+    std::vector<double> pilot_; //The pilot density
+
+  public:
+    /**
+     * @brief Build a new AdaptiveKernelDensityEstimation object.
+     * @param x A mtrix contianing the sample point, one point per column.
+     * The row of the matrix are the dimension of the sampled vectors, wich can be 1.
+     * @param gamma Controls the influence of the pilot density. A value of 0
+     * maximizes the impact of the pilot density, and hence corresponds to the standard
+     * Kernel Density Estimation method. A value in ]0,1] allows a local adjustement of
+     * the bandwith. The 0.5 value is commonly used.
+     */
+    AdaptiveKernelDensityEstimation(const Matrix<double>& x, double gamma = 0.5):
+      x_(x), n_(x.getNumberOfColumns()), r_(x.getNumberOfRows()),
+      covar_(), invSqrtCovar_(), xMean_(), gamma_(gamma),
+      c1_(0), c2_(x.getNumberOfColumns()), h_(0),
+      lambda_(x.getNumberOfColumns()), pilot_(x.getNumberOfColumns())
+    {
+      init_();
+    }
+    virtual ~AdaptiveKernelDensityEstimation() {}
+
+  public:
+
+    /**
+     * @return The value of the estimated density for point x.
+     * @param x The point where to estimate the density.
+     */
+    double kDensity(const std::vector<double>& x);
+
+  private:
+    void init_();
+
+    void sampleMean_(const Matrix<double>& x, std::vector<double>& mean);
+    
+    /**
+     * @brief The kernel function.
+     *
+     * For now a standard normal density is used, further options may be added later,
+     * including the possibility to use your own function.
+     *
+     * @param x The point for which to compute the density, as a matrix with 1 column and r_ rows.
+     * @return The value of the kernel function at the corresponding point.
+     */
+    double kernel_(const Matrix<double>& x);
+
+};
+
+} //End of namespace bpp.
+
+#endif //_ADAPTIVEKERNELDENSITYESTIMATION_H_
diff --git a/src/Bpp/Numeric/AutoParameter.cpp b/src/Bpp/Numeric/AutoParameter.cpp
new file mode 100644
index 0000000..7093a3b
--- /dev/null
+++ b/src/Bpp/Numeric/AutoParameter.cpp
@@ -0,0 +1,120 @@
+//
+// File: AutoParameter.cpp
+// Created by: Julien Dutheil
+// Created on: Tue Nov 11 22:15:16 2003
+//
+
+/*
+ *  Copyright or © or Copr. CNRS, (November 17, 2004)
+ * 
+ *  This software is a computer program whose purpose is to provide classes
+ *  for numerical calculus.
+ * 
+ *  This software is governed by the CeCILL  license under French law and
+ *  abiding by the rules of distribution of free software.  You can  use, 
+ *  modify and/ or redistribute the software under the terms of the CeCILL
+ *  license as circulated by CEA, CNRS and INRIA at the following URL
+ *  "http://www.cecill.info". 
+ * 
+ *  As a counterpart to the access to the source code and  rights to copy,
+ *  modify and redistribute granted by the license, users are provided only
+ *  with a limited warranty  and the software's author,  the holder of the
+ *  economic rights,  and the successive licensors  have only  limited
+ *  liability. 
+ * 
+ *  In this respect, the user's attention is drawn to the risks associated
+ *  with loading,  using,  modifying and/or developing or reproducing the
+ *  software by the user in light of its specific status of free software,
+ *  that may mean  that it is complicated to manipulate,  and  that  also
+ *  therefore means  that it is reserved for developers  and  experienced
+ *  professionals having in-depth computer knowledge. Users are therefore
+ *  encouraged to load and test the software's suitability as regards their
+ *  requirements in conditions enabling the security of their systems and/or 
+ *  data to be ensured and,  more generally, to use and operate it in the 
+ *  same conditions as regards security. 
+ * 
+ *  The fact that you are presently reading this means that you have had
+ *  knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "AutoParameter.h"
+#include "NumConstants.h"
+
+#include <iostream>
+
+using namespace std;
+
+// Utils:
+#include "../Text/TextTools.h"
+#include "../App/ApplicationTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+string AutoParameter::CONSTRAINTS_AUTO   = "auto";
+string AutoParameter::CONSTRAINTS_IGNORE = "ignore";
+string AutoParameter::CONSTRAINTS_KEEP   = "keep";
+
+/** Constructors: *************************************************************/
+
+AutoParameter::AutoParameter(const std::string& name, double value, Constraint* constraint, bool attachConstraint) throw (ConstraintException):
+Parameter(name, value, constraint, attachConstraint), messageHandler_(ApplicationTools::message) {}
+
+AutoParameter::AutoParameter(const Parameter& p): Parameter(p), messageHandler_(ApplicationTools::message) {}
+
+AutoParameter::AutoParameter(const AutoParameter& p): Parameter(p), messageHandler_(p.messageHandler_) {}
+
+AutoParameter& AutoParameter::operator=(const AutoParameter& p)
+{
+  Parameter::operator=(p);
+  messageHandler_ = p.messageHandler_;
+  return *this;
+}
+
+/******************************************************************************/
+
+void AutoParameter::setValue(double value) throw (ConstraintException)
+{
+  try
+  { 
+    // First we try to assign this value:
+    Parameter::setValue(value);
+  }
+  catch (ConstraintException& ce)
+  { 
+    // Aie, there's a pb here...
+    if (messageHandler_)
+    {
+      (*messageHandler_) << "Constraint match at parameter ";
+      (*messageHandler_) << name_;
+      (*messageHandler_) << ", badValue = ";
+      (*messageHandler_) << ce.getBadValue();
+      (*messageHandler_) << " ";
+      (*messageHandler_ << constraint_->getDescription()).endLine();
+    }
+    double limit = constraint_->getAcceptedLimit(value);
+    try
+    { // We try to assign the limit then.
+      Parameter::setValue(limit);
+    }
+    catch(ConstraintException& ce2)
+    { 
+      // Aie, the limit is not reachable, so we perform a smaller step...
+      //Parameter::setValue((getValue() + limit) / 2);
+      try
+      {
+	// Try on the right:
+	Parameter::setValue(limit + NumConstants::TINY());
+      }
+      catch(ConstraintException& ce3)
+      {
+	// Try on the left:
+	Parameter::setValue(limit - NumConstants::TINY());
+      }
+    }
+  }
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/AutoParameter.h b/src/Bpp/Numeric/AutoParameter.h
new file mode 100644
index 0000000..3343232
--- /dev/null
+++ b/src/Bpp/Numeric/AutoParameter.h
@@ -0,0 +1,146 @@
+//
+// File: AutoParameter.h
+// Created by: Julien Dutheil
+// Created on: Tue Nov 11 22:15:16 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _AUTOPARAMETER_H_
+#define _AUTOPARAMETER_H_
+
+#include "Parameter.h"
+
+//From Utils:
+#include "../Io/OutputStream.h"
+
+namespace bpp
+{
+
+/**
+ * @brief The AutoParameter class.
+ *
+ * This class overides the setValue() method of class Parameter so that no
+ * Exception is thrown. This allows to perform optimization under constraint.
+ */ 
+
+class AutoParameter:
+  public Parameter
+{
+	private:
+    OutputStream* messageHandler_;
+	
+	public:
+		
+		/**
+		 * @brief Build a new AutoParameter.
+		 *
+		 * @param name The parameter name.
+		 * @param value The parameter value.
+		 * @param constraint An optional pointer toward a Constraint object.
+     * @param attachConstraint Tell if the constraint must be attached to this parameter, or shared
+     * between different objects. See Parameter.
+		 * @throw ConstraintException If the parameter value does not match the contraint.
+		 */
+		AutoParameter(const std::string& name = "", double value = 0, Constraint* constraint = 0, bool attachConstraint = false) throw (ConstraintException);
+
+		/**
+		 * @brief Copy constructor.
+		 *
+		 * @param param The parameter to copy.
+		 */
+		AutoParameter(const Parameter& param);
+	
+		/**
+		 * @brief Copy constructor.
+		 *
+		 * @param param The parameter to copy.
+		 */
+		AutoParameter(const AutoParameter& param);
+
+		/**
+		 * @brief Assignment operator.
+		 *
+		 * @param param The parameter to copy.
+		 */
+		AutoParameter& operator=(const AutoParameter& param);
+	
+		virtual ~AutoParameter() {}
+	
+		AutoParameter* clone() const { return new AutoParameter(* this); }
+	
+  public:	
+	
+		/**
+		 * @brief Set the value of this parameter.
+		 *
+		 * This method is redefined so that no constraintException is thrown!
+		 * When a Constraint is match, we automatically apply a correct value instead.
+		 * This correct value is the nearest limit reached by the value, or a value next to
+		 * the limit if the limit is not reachable.
+		 *
+		 * This allow to perform optimization under constraint whith algorithms that are not
+		 * initially built for this.
+		 *
+		 * @param value the new parameter value.
+		 * @throw ConstraintException Never thrown!
+		 */
+		virtual void setValue(double value) throw (ConstraintException);
+	
+	public: //Specific method:
+		
+		/**
+		 * @brief Set the message handler for this AutoParameter.
+		 *
+		 * The message handler keeps all messages that the parameter may send.
+		 * The default handler is set to standard output, but you can pass any
+		 * ostream object (cerr, ofstream, etc.).
+		 *
+		 * A NULL pointer disable message output.
+		 * 
+		 * @param mh The message handler to use.
+		 */
+		virtual void setMessageHandler(OutputStream* mh) { messageHandler_ = mh; }
+		
+	public:
+	
+		static std::string CONSTRAINTS_AUTO;
+		static std::string CONSTRAINTS_IGNORE;
+		static std::string CONSTRAINTS_KEEP;
+};
+
+} //end of namespace bpp.
+
+#endif	//_AUTOPARAMETER_H_
+
diff --git a/src/Bpp/Numeric/Constraints.h b/src/Bpp/Numeric/Constraints.h
new file mode 100644
index 0000000..0202cbe
--- /dev/null
+++ b/src/Bpp/Numeric/Constraints.h
@@ -0,0 +1,438 @@
+//
+// File: Constraints.h
+// Created by: Julien Dutheil
+// Created on: Thu Dec 25 19:35:17 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _CONSTRAINTS_H_
+#define _CONSTRAINTS_H_
+
+// From the STL:
+#include <string>
+#include <iostream>
+#include <typeinfo>
+
+// From Utils:
+#include "../Clonable.h"
+#include "../Text/TextTools.h"
+#include "../Exceptions.h"
+
+#include "NumConstants.h"
+
+namespace bpp
+{
+/**
+ * @brief The constraint interface.
+ *
+ * It provides a method that tells if a given value is correct.
+ */
+class Constraint : public Clonable
+{
+public:
+  Constraint() {}
+  virtual ~Constraint() {}
+
+  Constraint* clone() const = 0;
+
+public:
+  /**
+   * @brief Tell if a given value is correct.
+   *
+   * @param value The value to test.
+   * @return True is the value is correct.
+   */
+  virtual bool isCorrect(double value) const = 0;
+
+  /**
+   * @brief Tell if all the values in a given interval are correct.
+   *
+   * @param min, max  The bounds of the interval.
+   * @return True is the value is correct.
+   */
+  virtual bool includes(double min, double max) const = 0;
+
+  /**
+   * @brief Give the nearest limit for a bad value.
+   *
+   * @param value The bad value.
+   * @return The nearer limit.
+   */
+  virtual double getLimit(double value) const = 0;
+
+  /**
+   * @brief Give the nearest accepted limit for a bad value.
+   *
+   * The difference with getLimit() is when the Constraint is open at
+   * the limit, in which case the retruned value is the limit +- 1e-12.
+   *
+   * @param value The bad value.
+   * @return The nearer limit.
+   */
+  virtual double getAcceptedLimit(double value) const = 0;
+
+  /**
+   * @brief Give a short description on the type of constraint.
+   *
+   * @return A string which describes the constraint.
+   */
+  virtual std::string getDescription() const = 0;
+
+  /**
+   * @brief Intersect this Constraint with another one
+   *
+   * @param c the intersected Constraint
+   * @return the intersection
+   */
+  virtual Constraint* operator&(const Constraint& c) const = 0;
+
+  /**
+   * @brief Tells if this constraints defines an empty set
+   */
+  
+  virtual bool isEmpty() const = 0;
+};
+
+/**
+ * @brief An interval, either bounded or not, which can also have infinite bounds.
+ *
+ * The upper and lower bound can be included or not (strict bound), finite or infinite (in that case, equal to a very large value).
+ * Despite the mathematical non-sense, and infinite bound can be either excluded or included.
+ */
+
+class IntervalConstraint : public Constraint
+{
+protected:
+  /**
+   * @brief The boundaries of the interval
+   *
+   **/
+  double lowerBound_, upperBound_;
+
+  /**
+   * @brief Boolean flags are true if the boundaries are included
+   *
+   **/
+  bool inclLowerBound_, inclUpperBound_;
+  /**
+   *
+   * @brief the accepted precision on the boundary (default: 1e-12)
+   **/
+
+  double precision_;
+  
+
+public:
+  IntervalConstraint() :  lowerBound_(NumConstants::MINF()),
+                upperBound_(NumConstants::PINF()),
+                inclLowerBound_(true),
+                inclUpperBound_(true),
+                precision_(NumConstants::TINY()) {}
+
+  IntervalConstraint(double lowerBound, double upperBound, bool inclLower, bool inclUpper, double precision = NumConstants::TINY()) :
+    lowerBound_(lowerBound),
+    upperBound_(upperBound),
+    inclLowerBound_(inclLower),
+    inclUpperBound_(inclUpper),
+    precision_(precision) {}
+ 
+  /**
+   * @brief Create an interval with an infinite lower/upper bound.
+   *
+   * The infinite bound will not be included, following mathematical conventions.
+   *
+   * @param isPositive Tell if the infinite bound is positive or negative.
+   * @param bound The finite bound.
+   * @param incl Tell if the finite bound is included or not.
+   * @param precision Parameter precision.
+   */
+
+  IntervalConstraint(bool isPositive, double bound, bool incl, double precision = NumConstants::TINY()) :
+    lowerBound_(isPositive ? bound : NumConstants::MINF()),
+    upperBound_(isPositive ? NumConstants::PINF() : bound),
+    inclLowerBound_(isPositive ? incl : false),
+    inclUpperBound_(isPositive ? false : incl),
+    precision_(precision) {}
+
+  /**
+   * @brief Create an interval from a string description, using
+   * readDescription method.
+   *
+   **/
+
+  IntervalConstraint(std::string& desc) :
+    lowerBound_(NumConstants::MINF()),
+    upperBound_(NumConstants::PINF()),
+    inclLowerBound_(true),
+    inclUpperBound_(true),
+    precision_(NumConstants::TINY())
+  {
+    readDescription(desc);
+  }
+  
+  virtual ~IntervalConstraint() {}
+
+  IntervalConstraint* clone() const { return new IntervalConstraint(*this); }
+
+public:
+  void setLowerBound(double lowerBound, bool strict) { lowerBound_ = lowerBound; inclLowerBound_ = !strict; }
+  void setUpperBound(double upperBound, bool strict) { upperBound_ = upperBound; inclUpperBound_ = !strict; }
+
+  double getLowerBound() const { return lowerBound_; }
+  double getUpperBound() const { return upperBound_; }
+
+  bool strictLowerBound() const { return !inclLowerBound_; }
+  bool strictUpperBound() const { return !inclUpperBound_; }
+
+  bool finiteLowerBound() const { return lowerBound_ > NumConstants::MINF(); }
+  bool finiteUpperBound() const { return upperBound_ < NumConstants::PINF(); }
+
+  bool includes(double min, double max) const
+  {
+    return (inclLowerBound_ ? min >= getLowerBound() : min > getLowerBound()) &&
+           (inclUpperBound_ ? max <= getUpperBound() : max < getUpperBound());
+  }
+
+  virtual bool isCorrect(double value) const
+  {
+    return (inclLowerBound_ ? value >= getLowerBound() : value > getLowerBound()) &&
+           (inclUpperBound_ ? value <= getUpperBound() : value < getUpperBound());
+  }
+
+  bool operator<(double value) const
+  {
+    return inclUpperBound_ ? upperBound_ < value : upperBound_ <= value;
+  }
+
+  bool operator>(double value) const
+  {
+    return inclLowerBound_ ? lowerBound_ > value : lowerBound_ >= value;
+  }
+
+  bool operator<=(double value) const
+  {
+    return upperBound_ <= value;
+  }
+
+  bool operator>=(double value) const
+  {
+    return lowerBound_ >= value;
+  }
+
+  double getLimit(double value) const
+  {
+    return isCorrect(value) ? value :
+           (*this >= value ? lowerBound_ : upperBound_);
+  }
+
+  double getAcceptedLimit(double value) const
+  {
+    return isCorrect(value) ? value :
+           (*this >= value ?
+            strictLowerBound() ? lowerBound_ + precision_ : lowerBound_ :
+            strictUpperBound() ? upperBound_ - precision_ : upperBound_);
+  }
+
+  double getPrecision() const
+  {
+    return precision_;
+  }
+  
+  std::string getDescription() const
+  {
+    return (inclLowerBound_ ? "[ " : "]")
+           + (finiteLowerBound() ? TextTools::toString(lowerBound_) : "-inf")
+           + "; "
+           + (finiteUpperBound() ? TextTools::toString(upperBound_) : "+inf")
+           + (inclUpperBound_ ? "] " : "[");
+  }
+
+  /**
+   *
+   * @brief Sets the bounds of the interval from a string.
+   *
+   * @param desc the description in interval-like syntax, with signs
+   * "[", ";", "]" as well as floats and "-inf" and "inf".
+   *
+   **/
+  
+  void readDescription(std::string& desc)
+  {
+    size_t pdp=desc.find(";");
+    size_t dc=desc.find_first_of("[]",1);
+
+    if (dc==std::string::npos || pdp==std::string::npos ||
+        (desc[0]!=']' && desc[0]!='[') || (pdp >=dc))
+      throw Exception("Constraints::readDescription. Wrong description:" + desc);
+
+    std::string deb=desc.substr(1,pdp-1);
+    std::string fin=desc.substr(pdp+1, dc-pdp-1);
+
+    inclLowerBound_=(desc[0]=='[');
+    inclUpperBound_=(desc[dc]==']');
+
+    lowerBound_ =  (deb=="-inf")?NumConstants::MINF():TextTools::toDouble(deb);
+    upperBound_ =  ((fin=="+inf") || (fin=="inf"))?NumConstants::PINF():TextTools::toDouble(fin);
+    
+  }
+  
+  /**
+   * @brief Intersect this IntervalConstraint with another one
+   *
+   * @param c the intersected IntervalConstraint
+   * @return the intersection, or NULL if c is not an IntervalConstraint. The
+   * resulting precision is the maximum of both precisions.
+   */
+  Constraint* operator&(const Constraint& c) const
+  {
+    double lowerBound, upperBound;
+    bool inclLowerBound, inclUpperBound;
+
+    const IntervalConstraint* pi = dynamic_cast<const IntervalConstraint*>(&c);
+
+    if (pi)
+    {
+      if (lowerBound_ <= pi->lowerBound_)
+      {
+        lowerBound = pi->lowerBound_;
+        inclLowerBound = pi->inclLowerBound_;
+      }
+      else
+      {
+        lowerBound = lowerBound_;
+        inclLowerBound = inclLowerBound_;
+      }
+
+      if (upperBound_ >= pi->upperBound_)
+      {
+        upperBound = pi->upperBound_;
+        inclUpperBound = pi->inclUpperBound_;
+      }
+      else
+      {
+        upperBound = upperBound_;
+        inclUpperBound = inclUpperBound_;
+      }
+      return new IntervalConstraint(lowerBound, upperBound, inclLowerBound, inclUpperBound, (precision_>pi->getPrecision())?precision_:pi->getPrecision());
+    }
+    else
+      return 0;
+  }
+
+  /**
+   * @brief Intersect this IntervalConstraint with another constraint
+   *
+   * @param c the intersected constraint
+   * @return this IntervalConstraint modified, or not modified if c is not an
+   * IntervalConstraint. The precision is set to the maximum of bith precisions.
+   */
+  IntervalConstraint& operator&=(const Constraint& c)
+  {
+    try {
+      const IntervalConstraint& pi = dynamic_cast<const IntervalConstraint&>(c);
+
+      if (lowerBound_ <= pi.lowerBound_)
+      {
+        lowerBound_ = pi.lowerBound_;
+        inclLowerBound_ = pi.inclLowerBound_;
+      }
+
+      if (upperBound_ >= pi.upperBound_)
+      {
+        upperBound_ = pi.upperBound_;
+        inclUpperBound_ = pi.inclUpperBound_;
+      }
+      if (pi.getPrecision() > precision_)
+        precision_ = pi.getPrecision();
+    } catch(std::bad_cast&) {}
+
+    return *this;
+  }
+
+  /**
+   * @brief Tells if this interval equals another one
+   *
+   * @param i the compared IntervalConstraint
+   */
+  bool operator==(const IntervalConstraint& i) const
+  {
+    return lowerBound_ == i.lowerBound_
+      && inclLowerBound_ == i.inclLowerBound_
+      && upperBound_ == i.upperBound_
+      && inclUpperBound_ == i.inclUpperBound_;
+  }
+
+  /**
+   * @brief Tells if this interval is different from another one
+   *
+   * @param i the compared IntervalConstraint
+   */
+  bool operator!=(const IntervalConstraint& i) const
+  {
+    return lowerBound_ != i.lowerBound_
+      || inclLowerBound_ != i.inclLowerBound_
+      || upperBound_ != i.upperBound_
+      || inclUpperBound_ != i.inclUpperBound_;
+  }
+
+  /**
+   * @brief Tells if this interval is included or equal in another one
+   *
+   * @param i the compared IntervalConstraint
+   */
+  bool operator<=(const IntervalConstraint& i) const
+  {
+    return lowerBound_ >= i.lowerBound_
+           && upperBound_ <= i.upperBound_;
+  }
+
+  /**
+   * @brief Tells if this interval is empty 
+   */
+  
+  bool isEmpty() const
+  {
+    return ((lowerBound_ > upperBound_) ||
+            ((lowerBound_ > upperBound_) &&
+             inclUpperBound_ && inclLowerBound_));
+  }
+
+};
+
+
+} // end of namespace bpp.
+
+#endif  // _CONSTRAINTS_H_
+
diff --git a/src/Bpp/Numeric/DataTable.cpp b/src/Bpp/Numeric/DataTable.cpp
new file mode 100644
index 0000000..5049655
--- /dev/null
+++ b/src/Bpp/Numeric/DataTable.cpp
@@ -0,0 +1,716 @@
+//
+// File: DataTable.cpp
+// Created by: Julien Dutheil
+// Created on: Aug 2005
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "DataTable.h"
+#include "VectorTools.h"
+#include "../Io/FileTools.h"
+#include "../Text/TextTools.h"
+#include "../Text/StringTokenizer.h"
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************/
+
+DataTable::DataTable(size_t nRow, size_t nCol) :
+  nRow_(nRow),
+  nCol_(nCol),
+  data_(nCol),
+  rowNames_(0),
+  colNames_(0)
+{
+  for (size_t i = 0; i < nCol; i++)
+  {
+    data_[i].resize(nRow);
+  }
+}
+
+DataTable::DataTable(size_t nCol) :
+  nRow_(0),
+  nCol_(nCol),
+  data_(nCol),
+  rowNames_(0),
+  colNames_(0)
+{}
+
+DataTable::DataTable(const std::vector<std::string>& colNames) throw (DuplicatedTableColumnNameException) :
+  nRow_(0),
+  nCol_(colNames.size()),
+  data_(colNames.size()),
+  rowNames_(0),
+  colNames_(0)
+
+{
+  setColumnNames(colNames); // May throw an exception.
+}
+
+DataTable::DataTable(const DataTable& table) :
+  nRow_(table.nRow_),
+  nCol_(table.nCol_),
+  data_(table.data_),
+  rowNames_(0),
+  colNames_(0)
+{
+  if (table.rowNames_)
+    rowNames_ = new vector<string>(*table.rowNames_);
+  if (table.colNames_)
+    colNames_ = new vector<string>(*table.colNames_);
+}
+
+DataTable& DataTable::operator=(const DataTable& table)
+{
+  nRow_ = table.nRow_;
+  nCol_ = table.nCol_;
+  data_ = table.data_;
+  if (rowNames_)
+    delete rowNames_;
+  if (colNames_)
+    delete colNames_;
+  rowNames_ = 0;
+  colNames_ = 0;
+  if (table.rowNames_)
+    rowNames_ = new vector<string>(*table.rowNames_);
+  if (table.colNames_)
+    colNames_ = new vector<string>(*table.colNames_);
+  return *this;
+}
+
+/******************************************************************************/
+
+DataTable::~DataTable()
+{
+  if (rowNames_ != NULL)
+    delete rowNames_;
+  if (colNames_ != NULL)
+    delete colNames_;
+}
+
+/******************************************************************************/
+/*                             Cell access                                    */
+/******************************************************************************/
+
+string& DataTable::operator()(size_t rowIndex, size_t colIndex) throw (IndexOutOfBoundsException)
+{
+  if (colIndex >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::operator(size_t, size_t).", colIndex, 0, nCol_ - 1);
+  if (rowIndex >= data_[colIndex].size())
+    throw IndexOutOfBoundsException("DataTable::operator(size_t, size_t).", rowIndex, 0, data_[colIndex].size() - 1);
+  return data_[colIndex][rowIndex];
+}
+
+const string& DataTable::operator()(size_t rowIndex, size_t colIndex) const throw (IndexOutOfBoundsException)
+{
+  if (colIndex >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::operator(size_t, size_t).", colIndex, 0, nCol_ - 1);
+  if (rowIndex >= data_[colIndex].size())
+    throw IndexOutOfBoundsException("DataTable::operator(size_t, size_t).", rowIndex, 0, data_[colIndex].size() - 1);
+  return data_[colIndex][rowIndex];
+}
+
+/******************************************************************************/
+
+string& DataTable::operator()(const string& rowName, const string& colName)
+throw (NoTableRowNamesException, NoTableColumnNamesException, TableNameNotFoundException)
+{
+  if (rowNames_ == NULL)
+    throw NoTableRowNamesException("DataTable::operator(const string &, const string &).");
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::operator(const string &, const string &).");
+  try
+  {
+    size_t rowIndex = VectorTools::which(*rowNames_, rowName);
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    return (*this)(rowIndex, colIndex);
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableNameNotFoundException("DataTable::operator(const string &, const string &).", *ex.getElement());
+  }
+}
+
+const string& DataTable::operator()(const string& rowName, const string& colName) const
+throw (NoTableRowNamesException, NoTableColumnNamesException, TableNameNotFoundException)
+{
+  if (rowNames_ == NULL)
+    throw NoTableRowNamesException("DataTable::operator(const string &, const string &).");
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::operator(const string &, const string &).");
+  try
+  {
+    size_t rowIndex = VectorTools::which(*rowNames_, rowName);
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    return (*this)(rowIndex, colIndex);
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableNameNotFoundException("DataTable::operator(const string &, const string &).", *ex.getElement());
+  }
+}
+
+/******************************************************************************/
+
+string& DataTable::operator()(const string& rowName, size_t colIndex)
+throw (NoTableRowNamesException, TableNameNotFoundException, IndexOutOfBoundsException)
+{
+  if (rowNames_ == NULL)
+    throw NoTableRowNamesException("DataTable::operator(const string &, size_t).");
+  if (colIndex >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::operator(const string &, size_t).", colIndex, 0, nCol_ - 1);
+  try
+  {
+    size_t rowIndex = VectorTools::which(*rowNames_, rowName);
+    return (*this)(rowIndex, colIndex);
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableNameNotFoundException("DataTable::operator(const string &, size_t).", *ex.getElement());
+  }
+}
+
+const string& DataTable::operator()(const string& rowName, size_t colIndex) const
+throw (NoTableRowNamesException, TableNameNotFoundException, IndexOutOfBoundsException)
+{
+  if (rowNames_ == NULL)
+    throw NoTableRowNamesException("DataTable::operator(const string &, size_t).");
+  if (colIndex >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::operator(const string &, size_t).", colIndex, 0, nCol_ - 1);
+  try
+  {
+    size_t rowIndex = VectorTools::which(*rowNames_, rowName);
+    return (*this)(rowIndex, colIndex);
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableNameNotFoundException("DataTable::operator(const string &, size_t).", *ex.getElement());
+  }
+}
+
+/******************************************************************************/
+
+string& DataTable::operator()(size_t rowIndex, const string& colName)
+throw (IndexOutOfBoundsException, NoTableColumnNamesException, TableNameNotFoundException)
+{
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::operator(size_t, const string &).");
+  try
+  {
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    if (rowIndex >= data_[colIndex].size())
+      throw IndexOutOfBoundsException("DataTable::operator(size_t, const string &).", rowIndex, 0, data_[colIndex].size() - 1);
+    return (*this)(rowIndex, colIndex);
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableNameNotFoundException("DataTable::operator(const string &, const string &).", *ex.getElement());
+  }
+}
+
+const string& DataTable::operator()(size_t rowIndex, const string& colName) const
+throw (IndexOutOfBoundsException, NoTableColumnNamesException, TableNameNotFoundException)
+{
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::operator(size_t, const string &).");
+  try
+  {
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    if (rowIndex >= data_[colIndex].size())
+      throw IndexOutOfBoundsException("DataTable::operator(size_t, const string &).", rowIndex, 0, data_[colIndex].size() - 1);
+    return (*this)(rowIndex, colIndex);
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableNameNotFoundException("DataTable::operator(const string &, const string &).", *ex.getElement());
+  }
+}
+
+/******************************************************************************/
+/*                             Work with names                                */
+/******************************************************************************/
+
+void DataTable::setRowNames(const vector<string>& rowNames)
+throw (DimensionException, DuplicatedTableRowNameException)
+{
+  if (!VectorTools::isUnique(rowNames))
+  {
+    throw DuplicatedTableRowNameException("DataTable::setRowNames(...). Row names must be unique.");
+  }
+  if (rowNames.size() != nRow_)
+    throw DimensionException("DataTable::setRowNames.", rowNames.size(), nRow_);
+  else
+  {
+    if (rowNames_ != NULL)
+      delete rowNames_;
+    rowNames_ = new vector<string>(rowNames.begin(), rowNames.end());
+  }
+}
+
+vector<string> DataTable::getRowNames() const throw (NoTableRowNamesException)
+{
+  if (rowNames_ == NULL)
+    throw NoTableRowNamesException("DataTable::getRowNames().");
+  return *rowNames_;
+}
+
+string DataTable::getRowName(size_t index) const throw (NoTableRowNamesException, IndexOutOfBoundsException)
+{
+  if (rowNames_ == NULL)
+    throw NoTableRowNamesException("DataTable::getRowName(size_t).");
+  if (index >= nRow_)
+    throw IndexOutOfBoundsException("DataTable::getRowName(size_t).", index, 0, nRow_ - 1);
+  return (*rowNames_)[index];
+}
+
+/******************************************************************************/
+
+void DataTable::setColumnNames(const vector<string>& colNames)
+throw (DimensionException, DuplicatedTableColumnNameException)
+{
+  if (!VectorTools::isUnique(colNames))
+    throw DuplicatedTableColumnNameException("DataTable::setColumnNames(...). Column names must be unique.");
+  if (colNames.size() != nCol_)
+    throw DimensionException("DataTable::setColumnNames.", colNames.size(), nCol_);
+  else
+  {
+    if (colNames_ != NULL)
+      delete colNames_;
+    colNames_ = new vector<string>(colNames.begin(), colNames.end());
+  }
+}
+
+vector<string> DataTable::getColumnNames() const throw (NoTableColumnNamesException)
+{
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::getColumnNames().");
+  return *colNames_;
+}
+
+string DataTable::getColumnName(size_t index) const throw (NoTableColumnNamesException, IndexOutOfBoundsException)
+{
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::getColumnName(size_t).");
+  if (index >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::getColumnName(size_t).", index, 0, nCol_ - 1);
+  return (*colNames_)[index];
+}
+
+/******************************************************************************/
+/*                               Work on columns                              */
+/******************************************************************************/
+
+vector<string>& DataTable::getColumn(size_t index)
+throw (IndexOutOfBoundsException)
+{
+  if (index >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::getColumn(size_t).", index, 0, nCol_ - 1);
+  return data_[index];
+}
+
+const vector<string>& DataTable::getColumn(size_t index) const
+throw (IndexOutOfBoundsException)
+{
+  if (index >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::getColumn(size_t).", index, 0, nCol_ - 1);
+  return data_[index];
+}
+
+vector<string>& DataTable::getColumn(const string& colName)
+throw (NoTableColumnNamesException, TableColumnNameNotFoundException)
+{
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::getColumn(const string &).");
+  try
+  {
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    return data_[colIndex];
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableColumnNameNotFoundException("DataTable::getColumn(const string &).", colName);
+  }
+}
+
+const vector<string>& DataTable::getColumn(const string& colName) const
+throw (NoTableColumnNamesException, TableColumnNameNotFoundException)
+{
+  if (colNames_ == NULL)
+    throw NoTableColumnNamesException("DataTable::getColumn(const string &).");
+  try
+  {
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    return data_[colIndex];
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableColumnNameNotFoundException("DataTable::getColumn(const string &).", colName);
+  }
+}
+
+bool DataTable::hasColumn(const string& colName) const
+{
+  if (colNames_ == NULL)
+    return false;
+  for (size_t i = 0; i < colNames_->size(); i++)
+  {
+    if ((*colNames_)[i] == colName)
+      return true;
+  }
+  return false;
+}
+
+void DataTable::deleteColumn(size_t index)
+throw (IndexOutOfBoundsException)
+{
+  if (index >= nCol_)
+    throw IndexOutOfBoundsException("DataTable::deleteColumn(size_t).", index, 0, nCol_ - 1);
+  data_.erase(data_.begin() + static_cast<ptrdiff_t>(index));
+  if (colNames_)
+    colNames_->erase(colNames_->begin() + static_cast<ptrdiff_t>(index));
+  nCol_--;
+}
+
+void DataTable::deleteColumn(const string& colName)
+throw (NoTableColumnNamesException, TableColumnNameNotFoundException)
+{
+  if (!colNames_)
+    throw NoTableColumnNamesException("DataTable::deleteColumn(const string &).");
+  try
+  {
+    size_t colIndex = VectorTools::which(*colNames_, colName);
+    data_.erase(data_.begin() + static_cast<ptrdiff_t>(colIndex));
+    colNames_->erase(colNames_->begin() + static_cast<ptrdiff_t>(colIndex));
+    nCol_--;
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableColumnNameNotFoundException("DataTable::deleteColumn(const string &).", colName);
+  }
+}
+
+void DataTable::addColumn(const vector<string>& newColumn)
+throw (DimensionException, TableColumnNamesException)
+{
+  if (colNames_)
+    throw TableColumnNamesException("DataTable::addColumn. Table has column names.");
+  if (newColumn.size() != nRow_)
+    throw DimensionException("DataTable::addColumn.", newColumn.size(), nRow_);
+  data_.push_back(newColumn);
+  nCol_++;
+}
+
+void DataTable::addColumn(const string& colName, const vector<string>& newColumn)
+throw (DimensionException, NoTableColumnNamesException, DuplicatedTableColumnNameException)
+{
+  if (!colNames_)
+  {
+    if (nCol_ == 0)
+      colNames_ = new vector<string>();
+    else
+      throw NoTableColumnNamesException("DataTable::addColumn. Table has column names.");
+  }
+  if (newColumn.size() != nRow_)
+    throw DimensionException("DataTable::addColumn.", newColumn.size(), nRow_);
+  if (nCol_ > 0 && find(colNames_->begin(), colNames_->end(), colName) != colNames_->end())
+    throw DuplicatedTableColumnNameException("DataTable::addColumn(const string &, const vector<string> &). Column names must be unique.");
+  colNames_->push_back(colName);
+  data_.push_back(newColumn);
+  nCol_++;
+}
+
+/******************************************************************************/
+/*                               Work on rows                                 */
+/******************************************************************************/
+
+vector<string> DataTable::getRow(size_t index) const
+throw (IndexOutOfBoundsException)
+{
+  if (index >= nRow_)
+    throw IndexOutOfBoundsException("DataTable::getRow(size_t).", index, 0, nRow_ - 1);
+  vector<string> row;
+  for (size_t i = 0; i < nCol_; i++)
+  {
+    row.push_back(data_[i][index]);
+  }
+  return row;
+}
+
+vector<string> DataTable::getRow(const string& rowName) const
+throw (NoTableRowNamesException, TableRowNameNotFoundException)
+{
+  if (!rowNames_)
+    throw NoTableRowNamesException("DataTable::getRow(const string &).");
+  try
+  {
+    size_t rowIndex = VectorTools::which(*rowNames_, rowName);
+    vector<string> row;
+    for (size_t i = 0; i < nCol_; i++)
+    {
+      row.push_back(data_[i][rowIndex]);
+    }
+    return row;
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableRowNameNotFoundException("DataTable::getRow(const string &).", rowName);
+  }
+}
+
+bool DataTable::hasRow(const string& rowName) const
+{
+  if (rowNames_ == NULL)
+    return false;
+  for (size_t i = 0; i < rowNames_->size(); i++)
+  {
+    if ((*rowNames_)[i] == rowName)
+      return true;
+  }
+  return false;
+}
+
+void DataTable::deleteRow(size_t index)
+throw (IndexOutOfBoundsException)
+{
+  for (size_t j = 0; j < nCol_; j++)
+  {
+    vector<string>* column = &data_[j];
+    if (index >= column->size())
+      throw IndexOutOfBoundsException("DataTable::deleteRow(size_t).", index, 0, column->size() - 1);
+    column->erase(column->begin() + static_cast<ptrdiff_t>(index));
+  }
+  if (rowNames_)
+    rowNames_->erase(rowNames_->begin() + static_cast<ptrdiff_t>(index));
+  nRow_--;
+}
+
+void DataTable::deleteRow(const string& rowName)
+throw (NoTableRowNamesException, TableRowNameNotFoundException)
+{
+  if (!rowNames_)
+    throw NoTableRowNamesException("DataTable::deleteRow(const string &).");
+  try
+  {
+    size_t rowIndex = VectorTools::which(*rowNames_, rowName);
+    for (size_t j = 0; j < nCol_; j++)
+    {
+      vector<string>* column = &data_[j];
+      column->erase(column->begin() + static_cast<ptrdiff_t>(rowIndex));
+    }
+    rowNames_->erase(rowNames_->begin() + static_cast<ptrdiff_t>(rowIndex));
+    nRow_--;
+  }
+  catch (ElementNotFoundException<string>& ex)
+  {
+    throw TableRowNameNotFoundException("DataTable::deleteRow(const string &).", rowName);
+  }
+}
+
+void DataTable::addRow(const vector<string>& newRow)
+throw (DimensionException, TableRowNamesException)
+{
+  if (rowNames_)
+    throw TableRowNamesException("DataTable::addRow. Table has row names.");
+  if (newRow.size() != nCol_)
+    throw DimensionException("DataTable::addRow.", newRow.size(), nCol_);
+  for (size_t j = 0; j < nCol_; j++)
+  {
+    data_[j].push_back(newRow[j]);
+  }
+  nRow_++;
+}
+
+void DataTable::addRow(const string& rowName, const vector<string>& newRow)
+throw (DimensionException, NoTableRowNamesException, DuplicatedTableRowNameException)
+{
+  if (!rowNames_)
+  {
+    if (nRow_ == 0)
+      rowNames_ = new vector<string>();
+    else
+      throw NoTableRowNamesException("DataTable::addRow. Table has row names.");
+  }
+  if (newRow.size() != nCol_)
+    throw DimensionException("DataTable::addRow.", newRow.size(), nCol_);
+  if (nRow_ > 0 && find(rowNames_->begin(), rowNames_->end(), rowName) != rowNames_->end())
+    throw DuplicatedTableRowNameException("DataTable::addRow(const string &, const vector<string> &). Row names must be unique.");
+  rowNames_->push_back(rowName);
+  for (size_t j = 0; j < nCol_; j++)
+  {
+    data_[j].push_back(newRow[j]);
+  }
+  nRow_++;
+}
+
+/******************************************************************************/
+/*                               Read from a CSV file                         */
+/******************************************************************************/
+
+DataTable* DataTable::read(istream& in, const string& sep, bool header, int rowNames)
+throw (DimensionException, IndexOutOfBoundsException, DuplicatedTableRowNameException)
+{
+  string firstLine  = FileTools::getNextLine(in);
+  StringTokenizer st1(firstLine, sep, false, true);
+  vector<string> row1(st1.getTokens().begin(), st1.getTokens().end());
+  string secondLine = FileTools::getNextLine(in);
+  StringTokenizer st2(secondLine, sep, false, true);
+  vector<string> row2(st2.getTokens().begin(), st2.getTokens().end());
+  size_t nCol = row1.size();
+  bool hasRowNames;
+  DataTable* dt;
+  if (row1.size() == row2.size())
+  {
+    dt = new DataTable(nCol);
+    if (header)
+    { // Use first line as header.
+      dt->setColumnNames(row1);
+    }
+    else
+    {
+      dt->addRow(row1);
+    }
+    dt->addRow(row2);
+    hasRowNames = false;
+  }
+  else if (row1.size() == row2.size() - 1)
+  {
+    dt = new DataTable(nCol);
+    dt->setColumnNames(row1);
+    string rowName = *row2.begin();
+    dt->addRow(rowName, vector<string>(row2.begin() + 1, row2.end()));
+    hasRowNames = true;
+  }
+  else
+    throw DimensionException("DataTable::read(...). Row 2 has not the correct number of columns.", row2.size(), nCol);
+
+  // Now read each line:
+  string line = FileTools::getNextLine(in);
+  while (!TextTools::isEmpty(line))
+  {
+    StringTokenizer st(line, sep, false, true);
+    if (hasRowNames)
+    {
+      string rowName = *st.getTokens().begin();
+      vector<string> row(st.getTokens().begin() + 1, st.getTokens().end());
+      dt->addRow(rowName, row);
+    }
+    else
+    {
+      vector<string> row(st.getTokens().begin(), st.getTokens().end());
+      dt->addRow(row);
+    }
+    line = FileTools::getNextLine(in);
+  }
+
+  // Row names:
+  if (rowNames > -1)
+  {
+    if (static_cast<size_t>(rowNames) >= nCol)
+      throw IndexOutOfBoundsException("DataTable::read(...). Invalid column specified for row names.", static_cast<size_t>(rowNames), 0, nCol - 1);
+    vector<string> col = dt->getColumn(static_cast<size_t>(rowNames));
+    dt->setRowNames(col);
+    dt->deleteColumn(static_cast<size_t>(rowNames));
+  }
+
+  return dt;
+}
+
+/******************************************************************************/
+
+void DataTable::write(const DataTable& data, ostream& out, const string& sep, bool alignHeaders)
+{
+  size_t n = data.getNumberOfColumns();
+  if (n == 0)
+    return;
+  if (data.hasColumnNames())
+  { // Write header
+    vector<string> colNames = data.getColumnNames();
+    if (alignHeaders && data.hasRowNames())
+      out << sep;
+    out << colNames[0];
+    for (size_t i = 1; i < n; i++)
+    {
+      out << sep << colNames[i];
+    }
+    out << endl;
+  }
+  // Now write each row:
+  for (size_t i = 0; i < data.getNumberOfRows(); i++)
+  {
+    if (data.hasRowNames())
+      out << data.getRowName(i) << sep;
+    out << data(i, 0);
+    for (size_t j = 1; j < n; j++)
+    {
+      out << sep << data(i, j);
+    }
+    out << endl;
+  }
+}
+
+void DataTable::write(const DataTable& data, bpp::OutputStream& out, const string& sep, bool alignHeaders)
+{
+  size_t n = data.getNumberOfColumns();
+  if (n == 0)
+    return;
+  if (data.hasColumnNames())
+  { // Write header
+    vector<string> colNames = data.getColumnNames();
+    if (alignHeaders && data.hasRowNames())
+      out << sep;
+    out << colNames[0];
+    for (size_t i = 1; i < n; i++)
+    {
+      out << sep << colNames[i];
+    }
+    out.endLine();
+  }
+  // Now write each row:
+  for (size_t i = 0; i < data.getNumberOfRows(); i++)
+  {
+    if (data.hasRowNames())
+      out << data.getRowName(i) << sep;
+    out << data(i, 0);
+    for (size_t j = 1; j < n; j++)
+    {
+      out << sep << data(i, j);
+    }
+    out.endLine();
+  }
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/DataTable.h b/src/Bpp/Numeric/DataTable.h
new file mode 100644
index 0000000..ce30784
--- /dev/null
+++ b/src/Bpp/Numeric/DataTable.h
@@ -0,0 +1,437 @@
+//
+// File: DataTable.h
+// Created by: Julien Dutheil
+// Created on: Aug 2005
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _DataTable_H_
+#define _DataTable_H_
+
+#include "VectorTools.h"
+#include "TableExceptions.h"
+#include "../Text/TextTools.h"
+#include "../Clonable.h"
+
+// From the STL:
+#include <string>
+#include <vector>
+#include <map>
+
+namespace bpp
+{
+/**
+ * @brief This class corresponds to a 'dataset', <i>i.e.</i> a table with data by rows
+ * and variable by columns.
+ *
+ * Data are stored as string objects, by column.
+ * A DataTable object is hence similar to a ColMatrix<string>.object.
+ * (NB: actually, ColMatrix does not exist yet...)
+ */
+class DataTable :
+  public Clonable
+{
+protected:
+  size_t nRow_, nCol_;
+  std::vector< std::vector<std::string> > data_;
+  std::vector<std::string>* rowNames_;
+  std::vector<std::string>* colNames_;
+
+public:
+  /**
+   * @brief Build a new void DataTable object with nRow rows and nCol columns.
+   *
+   * @param nRow The number of rows of the DataTable.
+   * @param nCol The number of columns of the DataTable.
+   */
+  DataTable(size_t nRow, size_t nCol);
+
+  /**
+   * @brief Build a new void DataTable object with nCol columns.
+   *
+   * @param nCol The number of columns of the DataTable.
+   */
+  DataTable(size_t nCol);
+
+  /**
+   * @brief Build a new void DataTable object with named columns.
+   *
+   * @param colNames The names of the columns of the DataTable.
+   * @throw DuplicatedTableColumnNameException If colnames contains identical names.
+   */
+  DataTable(const std::vector<std::string>& colNames) throw (DuplicatedTableColumnNameException);
+
+  DataTable(const DataTable& table);
+
+  DataTable& operator=(const DataTable& table);
+
+  DataTable* clone() const { return new DataTable(*this); }
+
+  virtual ~DataTable();
+
+public:
+  /**
+   * @return The element at a given position.
+   * @param rowIndex Row number.
+   * @param colIndex Column number.
+   * @throw IndexOutOfBoundsException If one of the index is greater or equal to the corresponding number of columns/rows.
+   */
+  std::string& operator()(size_t rowIndex, size_t colIndex) throw (IndexOutOfBoundsException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowIndex Row number.
+   * @param colIndex Column number.
+   * @throw IndexOutOfBoundsException If one of the index is greater or equal to the corresponding number of columns/rows.
+   */
+  const std::string& operator()(size_t rowIndex, size_t colIndex) const throw (IndexOutOfBoundsException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowName Row name.
+   * @param colName Column name.
+   * @throw NoTableRowNamesException If the table does not have names associated to rows.
+   * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+   * @throw TableNameNotFoundException If one of rowName or colName do not match existing names.
+   */
+  std::string& operator()(const std::string& rowName, const std::string& colName)
+  throw (NoTableRowNamesException, NoTableColumnNamesException, TableNameNotFoundException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowName Row name.
+   * @param colName Column name.
+   * @throw NoTableRowNamesException If the table does not have names associated to rows.
+   * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+   * @throw TableNameNotFoundException If one of rowName or colName do not match existing names.
+   */
+  const std::string& operator()(const std::string& rowName, const std::string& colName) const
+  throw (NoTableRowNamesException, NoTableColumnNamesException, TableNameNotFoundException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowName Row name.
+   * @param colIndex Column number.
+   * @throw NoTableRowNamesException If the table does not have names associated to rows.
+   * @throw IndexOutOfBoundsException If the index is greater or equal to the number of columns.
+   * @throw TableNameNotFoundException If rowName do not match existing names.
+   */
+  std::string& operator()(const std::string& rowName, size_t colIndex)
+  throw (NoTableRowNamesException, TableNameNotFoundException, IndexOutOfBoundsException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowName Row name.
+   * @param colIndex Column number.
+   * @throw NoTableRowNamesException If the table does not have names associated to rows.
+   * @throw IndexOutOfBoundsException If the index is greater or equal to the number of columns.
+   * @throw TableNameNotFoundException If rowName do not match existing names.
+   */
+  const std::string& operator()(const std::string& rowName, size_t colIndex) const
+  throw (NoTableRowNamesException, TableNameNotFoundException, IndexOutOfBoundsException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowIndex Row number.
+   * @param colName Column name.
+   * @throw IndexOutOfBoundsException If the index is greater or equal to the number of rows.
+   * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+   * @throw TableNameNotFoundException If colName do not match existing names.
+   */
+  std::string& operator()(size_t rowIndex, const std::string& colName)
+  throw (IndexOutOfBoundsException, NoTableColumnNamesException, TableNameNotFoundException);
+
+  /**
+   * @return The element at a given position.
+   * @param rowIndex Row number.
+   * @param colName Column name.
+   * @throw IndexOutOfBoundsException If the index is greater or equal to the number of rows.
+   * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+   * @throw TableNameNotFoundException If colName do not match existing names.
+   */
+  const std::string& operator()(size_t rowIndex, const std::string& colName) const
+  throw (IndexOutOfBoundsException, NoTableColumnNamesException, TableNameNotFoundException);
+
+  /**
+   * @name Work on columns.
+   *
+   * @{
+   */
+
+  /**
+   * @return The number of columns in this table.
+   */
+  size_t getNumberOfColumns() const { return nCol_; }
+
+  /**
+   * @brief Set the column names of this table.
+   *
+   * @param colNames The row names.
+   * @throw DimensionException If the number of names do not match the number of columns in the table.
+   * @throw DuplicatedTableColumnNameException If names are not unique.
+   */
+  void setColumnNames(const std::vector<std::string>& colNames) throw (DimensionException, DuplicatedTableColumnNameException);
+  /**
+   * @brief Get the column names of this table.
+   *
+   * @return The column names of this table.
+   * @throw NoTableColumnNamesException If no column names are associated to this table.
+   */
+  std::vector<std::string> getColumnNames() const throw (NoTableColumnNamesException);
+  /**
+   * @brief Get a given column name.
+   *
+   * @param index The index of the column.
+   * @return The column name associated to the given column.
+   * @throw NoTableColumnNamesException If no column names are associated to this table.
+   * @throw IndexOutOfBoundsException If index is >= number of columns.
+   */
+  std::string getColumnName(size_t index) const throw (NoTableColumnNamesException, IndexOutOfBoundsException);
+
+  /**
+   * @return true If column names are associated to this table.
+   */
+  bool hasColumnNames() const { return colNames_ != 0; }
+
+  /**
+   * @return The values in the given column.
+   * @param index The index of the column.
+   * @throw IndexOutOfBoundsException If index is >= number of columns.
+   */
+  std::vector<std::string>& getColumn(size_t index) throw (IndexOutOfBoundsException);
+  /**
+   * @return The values in the given column.
+   * @param index The index of the column.
+   * @throw IndexOutOfBoundsException If index is >= number of columns.
+   */
+  const std::vector<std::string>& getColumn(size_t index) const throw (IndexOutOfBoundsException);
+
+  /**
+   * @return The values in the given column.
+   * @param colName The name of the column.
+   * @throw NoTableColumnNamesException If no column names are associated to this table.
+   * @throw TableColumnNameNotFoundException If colName do not match existing column names.
+   */
+  std::vector<std::string>& getColumn(const std::string& colName) throw (NoTableColumnNamesException, TableColumnNameNotFoundException);
+  /**
+   * @return The values in the given column.
+   * @param colName The name of the column.
+   * @throw NoTableColumnNamesException If no column names are associated to this table.
+   * @throw TableColumnNameNotFoundException If colName do not match existing column names.
+   */
+  const std::vector<std::string>& getColumn(const std::string& colName) const throw (NoTableColumnNamesException, TableColumnNameNotFoundException);
+
+  /**
+   * @brief Tell is a given column exists.
+   *
+   * @param colName The name of the column to look for.
+   * @return true if the column was found, false if not or if there are no column names.
+   */
+  bool hasColumn(const std::string& colName) const;
+
+  /**
+   * @brief Delete the given column.
+   *
+   * @param index The index of the column.
+   * @throw IndexOutOfBoundsException If index is >= number of columns.
+   */
+  void deleteColumn(size_t index) throw (IndexOutOfBoundsException);
+
+  /**
+   * @brief Delete the given column.
+   *
+   * @param colName The name of the column.
+   * @throw NoTableColumnNamesException If no column names are associated to this table.
+   * @throw TableColumnNameNotFoundException If colName do not match existing column names.
+   */
+  void deleteColumn(const std::string& colName) throw (NoTableColumnNamesException, TableColumnNameNotFoundException);
+
+  /**
+   * @brief Add a new column.
+   *
+   * @param newColumn The new column values.
+   * @throw DimensionException If the number of values does not match the number of rows.
+   * @throw TableColumnNamesException If the table has row names.
+   */
+  void addColumn(const std::vector<std::string>& newColumn) throw (DimensionException, TableColumnNamesException);
+  /**
+   * @brief Add a new column.
+   *
+   * @param colName   The name of the column.
+   * @param newColumn The new column values.
+   * @throw DimensionException If the number of values does not match the number of rows.
+   * @throw NoTableColumnNamesException If the table does not have row names.
+   * @throw DuplicatedTableColumnNameException If colName is already used.
+   */
+  void addColumn(const std::string& colName, const std::vector<std::string>& newColumn) throw (DimensionException, NoTableColumnNamesException, DuplicatedTableColumnNameException);
+  /** @} */
+
+  /**
+   * @name Work on rows.
+   *
+   * @{
+   */
+
+  /**
+   * @return The number of rows in this table.
+   */
+  size_t getNumberOfRows() const { return nRow_; }
+
+  /**
+   * @brief Set the row names of this table.
+   *
+   * @param rowNames The row names.
+   * @throw DimensionException If the number of names do not match the number of rows in the table.
+   * @throw DuplicatedTableRowNameException If names are not unique.
+   */
+  void setRowNames(const std::vector<std::string>& rowNames) throw (DimensionException, DuplicatedTableRowNameException);
+
+  /**
+   * @brief Get the row names of this table.
+   *
+   * @return The row names of this table.
+   * @throw NoTableRowNamesException If no row names are associated to this table.
+   */
+  std::vector<std::string> getRowNames() const throw (NoTableRowNamesException);
+
+  /**
+   * @brief Tell is a given row exists.
+   *
+   * @param rowName The name of the row to look for.
+   * @return true if the row was found, false if not or if there are no row names.
+   */
+  bool hasRow(const std::string& rowName) const;
+
+  /**
+   * @brief Get a given row name.
+   *
+   * @param index The index of the row.
+   * @return The row name associated to the given row.
+   * @throw NoTableRowNamesException If no row names are associated to this table.
+   * @throw IndexOutOfBoundsException If index is >= number of rows.
+   */
+  std::string getRowName(size_t index) const throw (NoTableRowNamesException, IndexOutOfBoundsException);
+
+  /**
+   * @return true If row names are associated to this table.
+   */
+  bool hasRowNames() const { return rowNames_ != 0; }
+
+  /**
+   * @return A vector which contains a copy  in the given row.
+   * @param index The index of the row.
+   * @throw IndexOutOfBoundsException If index is >= number of rows.
+   */
+  std::vector<std::string> getRow(size_t index) const throw (IndexOutOfBoundsException);
+
+  /**
+   * @return A vector which contains a copy  in the given row.
+   * @param rowName The name of the row.
+   * @throw NoTableRowNamesException If no row names are associated to this table.
+   * @throw TableRowNameNotFoundException If rowName do not match existing row names.
+   */
+  std::vector<std::string> getRow(const std::string& rowName) const throw (NoTableRowNamesException, TableRowNameNotFoundException);
+
+  /**
+   * @brief Delete the given row.
+   *
+   * @param index The index of the row.
+   * @throw IndexOutOfBoundsException If index is >= number of row.
+   */
+  void deleteRow(size_t index) throw (IndexOutOfBoundsException);
+
+  /**
+   * @brief Delete the given row.
+   *
+   * @param rowName The name of the row.
+   * @throw NoTableRowNamesException If no row names are associated to this table.
+   * @throw TableRowNameNotFoundException If rowName do not match existing column names.
+   */
+  void deleteRow(const std::string& rowName) throw (NoTableRowNamesException, TableRowNameNotFoundException);
+
+  /**
+   * @brief Add a new row.
+   *
+   * @param newRow The new row values.
+   * @throw DimensionException If the number of values does not match the number of columns.
+   * @throw TableRowNamesException If the table has column names.
+   */
+  void addRow(const std::vector<std::string>& newRow) throw (DimensionException, TableRowNamesException);
+  /**
+   * @brief Add a new row.
+   *
+   * @param rowName   The name of the row.
+   * @param newRow    The new row values.
+   * @throw DimensionException If the number of values does not match the number of columns.
+   * @throw NoTableRowNamesException If the table does not have column names.
+   * @throw DuplicatedTableRowNameException If rowName is already used.
+   */
+  void addRow(const std::string& rowName, const std::vector<std::string>& newRow) throw (DimensionException, NoTableRowNamesException, DuplicatedTableRowNameException);
+  /** @} */
+
+public:
+  /**
+   * @brief Read a table form a stream in CSV-like format.
+   *
+   * The number of rows is given by the second line in the file.
+   * By default, if the first line as one column less than the second one,
+   * the first line is taken as column names, and the first column as row names.
+   * Otherwise, no column names and no row names are specified, unless
+   * explicitely precised by the user.
+   *
+   * @param in       The input stream.
+   * @param sep      The column delimiter.
+   * @param header   Tell if the first line must be used as column names, otherwise use default.
+   * @param rowNames Use a column as rowNames. If positive, use the specified column to compute rownames, otherwise use default;
+   * @return         A pointer toward a new DataTable object.
+   */
+  static DataTable* read(std::istream& in, const std::string& sep = "\t", bool header = true, int rowNames = -1)
+  throw (DimensionException, IndexOutOfBoundsException, DuplicatedTableRowNameException);
+
+  /**
+   * @brief Write a DataTable object to stream in CVS-like format.
+   *
+   * @param data         The table to write.
+   * @param out          The output stream.
+   * @param sep          The column delimiter.
+   * @param alignHeaders If true, add a delimiter before the first column header if there is row names.
+   */
+  static void write(const DataTable& data, std::ostream& out, const std::string& sep = "\t", bool alignHeaders = false);
+  static void write(const DataTable& data, bpp::OutputStream& out, const std::string& sep = "\t", bool alignHeaders = false);
+};
+} // end of namespace bpp.
+
+#endif // _DataTable_H_
+
diff --git a/src/Bpp/Numeric/Function/AbstractNumericalDerivative.h b/src/Bpp/Numeric/Function/AbstractNumericalDerivative.h
new file mode 100644
index 0000000..70e9b4e
--- /dev/null
+++ b/src/Bpp/Numeric/Function/AbstractNumericalDerivative.h
@@ -0,0 +1,276 @@
+//
+// File: AbstractNumericalDerivative.h
+// Created by: Julien Dutheil
+// Created on: Thu Aug 17 15:00 2006
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ABSTRACTNUMERICALDERIVATIVE_H_
+#define _ABSTRACTNUMERICALDERIVATIVE_H_
+
+#include "Functions.h"
+#include "../Matrix/Matrix.h"
+
+//From the STL:
+#include <map>
+#include <vector>
+#include <string>
+
+namespace bpp
+{
+
+/**
+ * @brief Numerical derivative function wrapper, partial implementation.
+ *
+ * This class provides a wrapper for Function object, implementing the DerivableSecondOrder interface
+ * (Although no cross derivative is implemented for now).
+ * Derivations of this class can be used as full DerivableSecondOrder objects, with derivative functions.
+ * 
+ * Three kinds of constructors are provided: one with a Function object, another with a DerivableFirstOrder object, and one with a DerivableSecondOrder object.
+ * In the first case, all derivatives will be computed numerically.
+ * In the second case, first order derivative will be computed numerically only if no appropriate analytical derivative is available, second order derivative will always be computed numerically.
+ * In the last case, first and second order derivative will be computed numerically only if no appropriate analytical derivative is available.
+ */
+class AbstractNumericalDerivative:
+  public DerivableSecondOrder,
+  public FunctionWrapper
+{
+  protected:
+    DerivableFirstOrder *function1_;
+    DerivableSecondOrder *function2_;
+    double h_;
+    std::vector<std::string> variables_;
+    mutable std::map<std::string, size_t> index_; //Store positions in array corresponding to variable names.
+    std::vector<double> der1_;
+    std::vector<double> der2_;
+    RowMatrix<double> crossDer2_;
+    bool computeD1_, computeD2_, computeCrossD2_;
+    
+  public:
+    AbstractNumericalDerivative(Function* function):
+      FunctionWrapper(function), function1_(0), function2_(0),
+      h_(0.0001), variables_(), index_(), der1_(), der2_(), crossDer2_(),
+      computeD1_(true), computeD2_(true), computeCrossD2_(false) {}
+
+    AbstractNumericalDerivative(DerivableFirstOrder* function):
+      FunctionWrapper(function), function1_(function), function2_(0),
+      h_(0.0001), variables_(), index_(), der1_(), der2_(), crossDer2_(),
+      computeD1_(true), computeD2_(true), computeCrossD2_(false) {}
+
+    AbstractNumericalDerivative(DerivableSecondOrder* function):
+      FunctionWrapper(function), function1_(function), function2_(function),
+      h_(0.0001), variables_(), index_(), der1_(), der2_(), crossDer2_(),
+      computeD1_(true), computeD2_(true), computeCrossD2_(false) {}
+
+    AbstractNumericalDerivative(const AbstractNumericalDerivative& ad):
+      FunctionWrapper(ad), function1_(ad.function1_), function2_(ad.function2_),
+      h_(ad.h_), variables_(ad.variables_), index_(ad.index_), der1_(ad.der1_), der2_(ad.der2_), crossDer2_(ad.crossDer2_),
+      computeD1_(ad.computeD1_), computeD2_(ad.computeD2_), computeCrossD2_(ad.computeCrossD2_) {}
+
+    AbstractNumericalDerivative& operator=(const AbstractNumericalDerivative& ad)
+    {
+      FunctionWrapper::operator=(ad);
+      function1_ = ad.function1_;
+      function2_ = ad.function2_;
+      h_ = ad.h_;
+      variables_ = ad.variables_;
+      index_ = ad.index_;
+      der1_ = ad.der1_;
+      der2_ = ad.der2_;
+      crossDer2_ = ad.crossDer2_;
+      computeD1_ = ad.computeD1_;
+      computeD2_ = ad.computeD2_;
+      computeCrossD2_ = ad.computeCrossD2_;
+      return *this;
+    }
+
+    virtual ~AbstractNumericalDerivative() {}
+
+    AbstractNumericalDerivative* clone() const = 0;
+
+  public:
+    /**
+     * @brief Set the interval value used in numerical approximation.
+     *
+     * Default value is 0.0001.
+     *
+     * @param h Interval value.
+     */
+    void setInterval(double h) { h_ = h; }
+    
+    /**
+     * @return The interval value used in numerical approximation.
+     */
+    double getInterval() const { return h_; }
+    
+    /**
+     * @brief Set the list of parameters to derivate numerically.
+     *
+     * @param variables A list of all parameter names.
+     */
+    void setParametersToDerivate(const std::vector<std::string>& variables)
+    {
+      variables_ = variables;
+      index_.clear();
+      for(size_t i = 0; i < variables_.size(); i++)
+        index_[variables_[i]] = i;
+      der1_.resize(variables_.size());
+      der2_.resize(variables_.size());
+      crossDer2_.resize(variables_.size(), variables_.size());
+    }
+    
+    /**
+     * @name The DerivableFirstOrder interface
+     *
+     * @{
+     */
+    void enableFirstOrderDerivatives(bool yn) { computeD1_ = yn; }
+    bool enableFirstOrderDerivatives() const { return computeD1_; }
+    
+    double getFirstOrderDerivative(const std::string& variable) const
+      throw (Exception)
+    {
+      std::map<std::string, size_t>::iterator it = index_.find(variable);
+      if (computeD1_ && it != index_.end())
+        return der1_[it->second];
+
+      if (function1_)
+        return function1_->getFirstOrderDerivative(variable);
+
+      throw Exception("First order derivative not computed for variable " + variable + "."); 
+    }
+    /** @} */
+    
+    /**
+     * @name The DerivableSecondOrder interface
+     *
+     * @{
+     */
+
+    void enableSecondOrderDerivatives(bool yn) { computeD2_ = yn; }
+    bool enableSecondOrderDerivatives() const { return computeD2_; }
+
+    double getSecondOrderDerivative(const std::string& variable) const
+      throw (Exception)
+    {
+      std::map<std::string, size_t>::iterator it = index_.find(variable);
+      if(computeD2_ && it != index_.end())
+        return der2_[it->second];
+
+      if (function2_)
+        return function2_->getSecondOrderDerivative(variable);
+
+      throw Exception("Second order derivative not computed for variable " + variable + "."); 
+    }
+
+    double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const
+      throw (Exception)
+    {
+      std::map<std::string, size_t>::iterator it1 = index_.find(variable1);
+      std::map<std::string, size_t>::iterator it2 = index_.find(variable2);
+      if(computeCrossD2_ && it1 != index_.end() && it2 != index_.end()) return crossDer2_(it1->second, it2->second);
+
+      if (function2_)
+        return function2_->getSecondOrderDerivative(variable1, variable2);
+
+      throw Exception("Cross second order derivative not computed for variables " + variable1 + " and " + variable2 + "."); 
+    }
+  
+    /** @} */
+     
+    /**
+     * @name The Parametrizable interface.
+     *
+     * @{
+     */
+    double f(const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getValue();
+    }
+    void setParameters(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setParameters(parameters);
+      updateDerivatives(parameters);
+    }
+    void setAllParametersValues(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setAllParametersValues(parameters);
+      updateDerivatives(parameters);
+    }
+    
+    void setParameterValue(const std::string& name, double value)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setParameterValue(name, value);
+      updateDerivatives(function_->getParameters().subList(name));
+    }
+    
+    void setParametersValues(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setParametersValues(parameters);
+      updateDerivatives(parameters);
+    }
+    
+    bool matchParametersValues(const ParameterList& parameters)
+      throw (ConstraintException)
+    {
+      bool test = function_->matchParametersValues(parameters);
+      updateDerivatives(parameters);
+      return test;
+    }
+    /** @} */
+
+    void enableSecondOrderCrossDerivatives(bool yn) { computeCrossD2_ = yn; }
+    bool enableSecondOrderCrossDerivatives() const { return computeCrossD2_; }
+
+  protected:
+    /**
+     * @brief Compute derivatives.
+     *
+     * @param parameters The point where to compute derivatives. It is NOT passed as references,
+     * as the inner parameters of the function will be changed when computing the numerical derivatives.
+     */
+    virtual void updateDerivatives(const ParameterList parameters) = 0;
+    
+};
+
+} //end of namespace bpp.
+
+#endif //_ABSTRACTNUMERICALDERIVATIVE_H_
+
diff --git a/src/Bpp/Numeric/Function/AbstractOptimizer.cpp b/src/Bpp/Numeric/Function/AbstractOptimizer.cpp
new file mode 100644
index 0000000..0bfd823
--- /dev/null
+++ b/src/Bpp/Numeric/Function/AbstractOptimizer.cpp
@@ -0,0 +1,344 @@
+//
+// File: AbstractOptimizer.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Dec 22 12:18:09 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "AbstractOptimizer.h"
+#include "../AutoParameter.h"
+#include "../../Text/TextTools.h"
+#include "../../App/ApplicationTools.h"
+
+// From the STL:
+#include <iomanip>
+#include <time.h>
+
+using namespace std;
+using namespace bpp;
+
+/******************************************************************************/
+
+AbstractOptimizer::AbstractOptimizer(Function* function):
+  function_(function),
+  parameters_(),
+  messageHandler_(ApplicationTools::message),
+  profiler_(ApplicationTools::message),
+  constraintPolicy_(AutoParameter::CONSTRAINTS_KEEP),
+  stopCondition_(0), defaultStopCondition_(0),
+  verbose_(true), isInitialized_(false), startTime_(), listeners_(),
+  updateParameters_(false), stepChar_("*"),
+  nbEvalMax_(1000000), nbEval_(0),
+  currentValue_(0), tolIsReached_(false)
+{
+}
+
+/******************************************************************************/
+
+AbstractOptimizer::AbstractOptimizer(const AbstractOptimizer& opt):
+  function_(opt.function_),
+  parameters_(opt.parameters_),
+  messageHandler_(opt.messageHandler_),
+  profiler_(opt.profiler_),
+  constraintPolicy_(opt.constraintPolicy_),
+  stopCondition_(0), defaultStopCondition_(0),
+  verbose_(opt.verbose_),
+  isInitialized_(opt.isInitialized_),
+  startTime_(opt.startTime_),
+  listeners_(), //We do not copy listeners!
+  updateParameters_(opt.updateParameters_),
+  stepChar_(opt.stepChar_),
+  nbEvalMax_(opt.nbEvalMax_),
+  nbEval_(opt.nbEval_),
+  currentValue_(opt.currentValue_),
+  tolIsReached_(opt.tolIsReached_)
+{
+  if (opt.stopCondition_)
+    {
+      stopCondition_        = dynamic_cast<OptimizationStopCondition *>(opt.stopCondition_->clone());
+      stopCondition_->setOptimizer(this);
+    }
+  else
+    stopCondition_        = 0;
+  if (opt.defaultStopCondition_)
+    {
+      defaultStopCondition_ = dynamic_cast<OptimizationStopCondition *>(opt.defaultStopCondition_->clone());
+      defaultStopCondition_->setOptimizer(this);
+    }
+  else
+    defaultStopCondition_ = 0;
+  //In case of AutoParameter instances, we must actualize the pointers toward _messageHandler:
+  if (isInitialized_)
+    {
+      if(constraintPolicy_ == AutoParameter::CONSTRAINTS_AUTO)   autoParameter();
+      else if(constraintPolicy_ == AutoParameter::CONSTRAINTS_IGNORE) ignoreConstraints();
+    }
+}
+
+/******************************************************************************/
+
+AbstractOptimizer& AbstractOptimizer::operator=(const AbstractOptimizer& opt)
+{
+  function_               = opt.function_;
+  parameters_             = opt.parameters_;
+  messageHandler_         = opt.messageHandler_;
+  profiler_               = opt.profiler_;
+  constraintPolicy_       = opt.constraintPolicy_;
+  tolIsReached_           = opt.tolIsReached_;
+  if (opt.stopCondition_)
+  {
+    stopCondition_        = dynamic_cast<OptimizationStopCondition *>(opt.stopCondition_->clone());
+    stopCondition_->setOptimizer(this);
+  }
+  else
+    stopCondition_        = 0;
+  if (opt.defaultStopCondition_)
+  {
+    defaultStopCondition_ = dynamic_cast<OptimizationStopCondition *>(opt.defaultStopCondition_->clone());
+    defaultStopCondition_->setOptimizer(this);
+  }
+  else
+    defaultStopCondition_ = 0;
+  nbEvalMax_              = opt.nbEvalMax_;
+  nbEval_                 = opt.nbEval_;
+  verbose_                = opt.verbose_;
+  isInitialized_          = opt.isInitialized_;
+  //In case of AutoParameter instances, we must actualize the pointers toward messageHandler_:
+  if (isInitialized_)
+  {
+    if (constraintPolicy_ == AutoParameter::CONSTRAINTS_AUTO)   autoParameter();
+    else if (constraintPolicy_ == AutoParameter::CONSTRAINTS_IGNORE) ignoreConstraints();
+  }
+  startTime_              = opt.startTime_;
+  listeners_.resize(0); //Reset listener list, do not copy it!
+  updateParameters_       = opt.updateParameters_;
+  stepChar_               = opt.stepChar_;
+  return *this;
+}
+
+/******************************************************************************/
+	
+void AbstractOptimizer::init(const ParameterList& params) throw (Exception)
+{
+  if (!function_) throw Exception("AbstractOptimizer::init. Optimizer currently has no function.");
+  //We do this in order to keep original constraints:
+  parameters_ = params;
+  //More secure, but too slow:
+  //parameters_ = function_->getParameters().subList(params.getParameterNames());
+  //parameters_.matchParametersValues(params);
+  if (constraintPolicy_ == AutoParameter::CONSTRAINTS_AUTO) autoParameter();
+  else if (constraintPolicy_ == AutoParameter::CONSTRAINTS_IGNORE) ignoreConstraints();
+  doInit(params);
+  nbEval_ = 0;
+  tolIsReached_ = false;
+  isInitialized_ = true;
+  time(&startTime_);
+  currentValue_ = function_->getValue();
+
+  profile("Step\t");
+  for (unsigned int i = 0; i < parameters_.size(); i++)
+  {
+    profile(parameters_[i].getName() + "\t"); 
+  }
+  profileln("Function\tTime");
+
+  //Parameters must be assigned by doInit:
+
+  printPoint(parameters_, currentValue_);
+  
+  // Initialize the StopCondition:
+  stopCondition_->init();
+  fireOptimizationInitializationPerformed(OptimizationEvent(this));
+}
+
+/******************************************************************************/
+
+double AbstractOptimizer::step() throw (Exception)
+{
+  currentValue_ = doStep();
+  printPoint(parameters_, currentValue_);
+  fireOptimizationStepPerformed(OptimizationEvent(this));
+  if (listenerModifiesParameters())
+  {
+    if (!updateParameters_)
+      parameters_.matchParametersValues(function_->getParameters());
+    //else already done!
+     //_currentValue = function_->getValue();
+    //Often useless, but avoid some bizare behaviour in particular cases:
+    currentValue_ = function_->f(parameters_);
+  }
+  tolIsReached_ = tolIsReached_ || stopCondition_->isToleranceReached();
+  return currentValue_;
+}
+
+/**************************************************************************/
+
+double AbstractOptimizer::optimize() throw (Exception)
+{
+  if (!isInitialized_)
+    throw Exception("AbstractOptimizer::optimize. Optimizer not initialized: call the 'init' method first!");
+  tolIsReached_ = false;
+  for (nbEval_ = 1; nbEval_ < nbEvalMax_ && ! tolIsReached_; nbEval_++)
+  {
+    if (verbose_)
+      ApplicationTools::displayUnlimitedGauge(nbEval_, "Optimizing... ");
+    step();
+  }
+  return currentValue_;
+}
+
+/******************************************************************************/
+
+void AbstractOptimizer::profile(double v)
+{
+  if (profiler_) *profiler_ << v;
+}	
+
+/******************************************************************************/
+
+void AbstractOptimizer::profileln(double v)
+{
+  if (profiler_) (*profiler_ << v).endLine();
+}
+	
+/******************************************************************************/
+
+void AbstractOptimizer::profile(unsigned int v)
+{
+  if (profiler_) *profiler_ << v;
+}
+/******************************************************************************/
+
+void AbstractOptimizer::profileln(unsigned int v)
+{
+  if (profiler_) (*profiler_ << v).endLine();
+}
+	
+/******************************************************************************/
+
+void AbstractOptimizer::profile(const std::string& s)
+{
+  if (profiler_) *profiler_ << s;
+}	
+
+/******************************************************************************/
+
+void AbstractOptimizer::profileln(const std::string& s)
+{
+  if (profiler_) (*profiler_ << s).endLine();
+}
+	
+/******************************************************************************/
+
+void AbstractOptimizer::printPoint(const ParameterList& params, double value)
+{
+  size_t ndim = params.size();
+  profile(nbEval_);
+  profile("\t");
+  for (size_t j = 0; j < ndim; j++)
+  {
+    profile(TextTools::toString(params[j].getValue()));
+    profile("\t"); 
+  }
+  profile(value);
+  profile("\t");
+  time_t seconds;
+  time(&seconds);
+  profileln(difftime(seconds, startTime_));
+}
+
+/******************************************************************************/
+
+void AbstractOptimizer::printMessage(const std::string& message)
+{
+  if (messageHandler_) (*messageHandler_ << message).endLine();
+}
+
+/******************************************************************************/
+
+void AbstractOptimizer::autoParameter()
+{
+  for (unsigned int i = 0; i < parameters_.size(); i++)
+  {
+    AutoParameter ap(parameters_[i]);
+    ap.setMessageHandler(messageHandler_);
+    parameters_.setParameter(i, ap);
+  }
+}
+
+/******************************************************************************/
+
+void AbstractOptimizer::ignoreConstraints()
+{
+  for (unsigned int i = 0; i < parameters_.size(); i++)
+  {
+    parameters_[i].removeConstraint();
+  }
+}
+
+/******************************************************************************/
+
+void AbstractOptimizer::fireOptimizationInitializationPerformed(const OptimizationEvent& event)
+{
+  for (unsigned int i = 0; i < listeners_.size(); i++)
+  {
+    listeners_[i]->optimizationInitializationPerformed(event);
+  }
+}
+
+/******************************************************************************/
+
+void AbstractOptimizer::fireOptimizationStepPerformed(const OptimizationEvent& event)
+{
+  for (unsigned int i = 0; i < listeners_.size(); i++)
+  {
+    listeners_[i]->optimizationStepPerformed(event);
+  }
+}
+
+/******************************************************************************/
+
+bool AbstractOptimizer::listenerModifiesParameters() const
+{
+  for (unsigned int i = 0; i < listeners_.size(); i++)
+  {
+    if (listeners_[i]->listenerModifiesParameters())
+      return true;
+  }
+  return false;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/AbstractOptimizer.h b/src/Bpp/Numeric/Function/AbstractOptimizer.h
new file mode 100644
index 0000000..a7564d6
--- /dev/null
+++ b/src/Bpp/Numeric/Function/AbstractOptimizer.h
@@ -0,0 +1,391 @@
+//
+// File: AbstractOptimizer.h
+// Created by: Julien Dutheil
+// Created on: Mon Dec 22 12:18:09 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ABSTRACTOPTIMIZER_H_
+#define _ABSTRACTOPTIMIZER_H_
+
+#include "Optimizer.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Partial implementation of the Optimizer interface.
+ *
+ * This implementation is designed for unconstrained or simple-bounded optimization.
+ * You should not use it with global contraints.
+ * It also enables the gestion of listeners by maintaining a vector of pointers toward the listener.
+ * Important note: this list of listener is not duplicated in cas of copy of the Optimizer, as 
+ * listeners are expected to be bounded ot a particular instance.:if expand("%") == ""|browse confirm w|else|confirm w|endif
+ * 
+ *
+ */
+class AbstractOptimizer:
+  public virtual Optimizer
+{
+  private:
+    
+    /**
+     * @brief The function to optimize.
+     */
+    Function* function_;
+  
+    /**
+     * @brief The parameters that will be optimized.
+     */
+    ParameterList parameters_;
+  
+    /**
+     * @brief The message handler.
+     */
+    OutputStream* messageHandler_;
+  
+    /**
+     * @brief The profiler.
+     */
+    OutputStream* profiler_;
+    
+    /**
+     * @brief The constraint policy.
+     *
+     * Must be one the following:
+     * - CONSTRAINTS_KEEP: keep the constraint associated to the parameters (default).
+     * - CONSTRAINTS_IGNORE: remove all constraints.
+     * - CONSTRAINTS_AUTO: use AutoParameters to deal with constraints.
+     *
+     * @see AutoParameter
+     */      
+    std::string constraintPolicy_;
+    
+    /**
+     * @brief The stoping condition to use while optimizing.
+     */
+    OptimizationStopCondition* stopCondition_;
+    
+    /**
+     * @brief The default stoping condition to use while optimizing.
+     */
+    OptimizationStopCondition* defaultStopCondition_;
+
+    /**
+     * @brief State of the verbose mode: > 0 = enabled.
+     *
+     * This may not be used by the Optimizer.
+     */
+    unsigned int verbose_;
+
+    /**
+     * @brief Check if the optimizer have been feeded with initial parameters values.
+     */
+    bool isInitialized_;
+
+    time_t startTime_;
+
+    std::vector<OptimizationListener*> listeners_;
+
+    bool updateParameters_;
+
+    std::string stepChar_;
+
+  protected:
+
+    /**
+     * @brief The maximum number of function evaluations allowed.
+     */
+    unsigned int nbEvalMax_;
+    
+    /**
+     * @brief The current number of function evaluations achieved.
+     */
+    unsigned int nbEval_;
+
+    /**
+     * @brief The current value of the function.
+     */
+    double currentValue_;
+
+    /**
+     * @brief Tell if the tolerance level has been reached.
+     *
+     * This field is initilaised by the init() method, maintained by the
+     * step() method and used in the optimize() method.
+     */
+    bool tolIsReached_;
+
+  public:
+    AbstractOptimizer(Function* function = 0);
+
+    AbstractOptimizer(const AbstractOptimizer& opt);
+    
+    AbstractOptimizer& operator=(const AbstractOptimizer& opt);
+
+    virtual ~AbstractOptimizer()
+    {
+      delete stopCondition_;
+      delete defaultStopCondition_;
+    }
+  
+  public:
+    
+    /**
+     * @name The Optimizer interface.
+     *
+     * @{
+     */
+    /**
+     * @brief Basic implementation.
+     *
+     * Store all parameters, call the doInit method, print to profiler, initialize timer and notify all listeners.
+     */
+    void init(const ParameterList& params) throw (Exception);
+    /**
+     * @brief Basic implementation.
+     *
+     * Check if the optimizer is initialized, check if parameters need update because of listeners, call the doStep method, print the current point to the profiler, notify all listeners and return the current value of the function.
+     */
+    double step() throw (Exception);
+    /**
+     * @brief Basic implementation.
+     *
+     * Call the step method untill tolerance is reached.
+     */
+    double optimize() throw (Exception);
+    bool isInitialized() const { return isInitialized_; }
+    const ParameterList& getParameters() const { return parameters_; }
+  double getParameterValue(const std::string& name) const { return parameters_.getParameterValue(name); }
+    void setFunction(Function* function)
+    { 
+      function_ = function;
+      if (function) stopCondition_->init();
+    }
+    const Function* getFunction() const { return function_; }
+    Function* getFunction() { return function_; }
+    bool hasFunction() const { return function_ != 0; }
+    double getFunctionValue() const throw (NullPointerException)
+    {
+      if (!function_) throw NullPointerException("AbstractOptimizer::getFunctionValue. No function associated to this optimizer.");
+      return currentValue_;
+    }
+    
+    void setMessageHandler(OutputStream* mh) { messageHandler_ = mh; }
+    OutputStream* getMessageHandler() const { return messageHandler_; }
+    void setProfiler(OutputStream* profiler) { profiler_ = profiler; }
+    OutputStream* getProfiler() const { return profiler_; }
+
+    unsigned int getNumberOfEvaluations() const { return nbEval_; }
+    void setStopCondition(const OptimizationStopCondition& stopCondition)
+    {
+      stopCondition_ = dynamic_cast<OptimizationStopCondition*>(stopCondition.clone());
+    }
+    OptimizationStopCondition* getStopCondition() { return stopCondition_; }
+    const OptimizationStopCondition* getStopCondition() const { return stopCondition_; }
+    OptimizationStopCondition* getDefaultStopCondition() { return defaultStopCondition_; }
+    const OptimizationStopCondition* getDefaultStopCondition() const { return defaultStopCondition_; }
+    bool isToleranceReached() const { return tolIsReached_; }
+    bool isMaximumNumberOfEvaluationsReached() const { return nbEval_ >= nbEvalMax_; }
+    void setMaximumNumberOfEvaluations(unsigned int max) { nbEvalMax_ = max; }
+    void setVerbose(unsigned int v) { verbose_ = v; }
+    unsigned int getVerbose() const { return verbose_; }
+    void setConstraintPolicy(const std::string& constraintPolicy) { constraintPolicy_ = constraintPolicy; }
+    std::string getConstraintPolicy() const { return constraintPolicy_; }
+    void addOptimizationListener(OptimizationListener* listener)
+    {
+      if (listener)
+        listeners_.push_back(listener);
+    }
+    /** @} */
+
+    /**
+     * @brief Tell if we shall update all parameters after one optimization step.
+     *
+     * This is required only for functions that have non-independent parameters,
+     * which means that setting one parameter value may modify one or several other parameters.
+     * Depending on the optimizer, this may have no effect.
+     *
+     * @param yn true/false
+     */
+    void updateParameters(bool yn) { updateParameters_ = yn; }
+
+    /**
+     * @brief Tell if we shall update all parameters after one optimization step.
+     *
+     * This is required only for functions that have non-independent parameters,
+     * which means that setting one parameter value may modify one or several other parameters.
+     * Depending on the optimizer, this may have no effect.
+     *
+     * @return yn true/false
+     */
+    bool updateParameters() const { return updateParameters_; }
+
+    /**
+     * @brief Set the character to be displayed during optimization.
+     *
+     * @param c A character.
+     */
+    void setOptimizationProgressCharacter(const std::string& c) { stepChar_ = c; }
+    /**
+     * @return The character to be displayed during optimization.
+     */
+    const std::string& getOptimizationProgressCharacter() const { return stepChar_; }
+  
+  protected:
+
+    /**
+     * @brief This function is called by the init() method and contains all calculations.
+     *
+     * @param params The parameters to use for initialization.
+     */
+    virtual void doInit(const ParameterList& params) throw (Exception) = 0;
+    
+    /**
+     * @brief This function is called by the step() method and contains all calculations.
+     *
+     * @return The value of the function after the optimization step.
+     */
+    virtual double doStep() throw (Exception) = 0;
+    
+    /**
+     * @name Inner utilitary functions
+     *
+     * @{
+     */
+    
+    /**
+     * @brief Build a list of AutoParameter instead of Parameter.
+     */
+    void autoParameter();
+  
+    /**
+     * @brief Remove the constraints of all the arguments.
+     */
+    void ignoreConstraints();
+  
+    /**
+     * @brief Print to the profile if there is one.
+     *
+     * @param v The double value to print.
+     */
+    void profile(double v);
+  
+    /**
+     * @brief Print to the profile if there is one.
+     *
+     * @param v The unsigned int value to print.
+     */
+    void profile(unsigned int v);
+ 
+    /**
+     * @brief Print to the profile if there is one.
+     *
+     * @param s The string to print to the profile.
+     */
+    void profile(const std::string& s);
+  
+    /**
+     * @brief Print to the profile if there is one and end line.
+     *
+     * @param v The double value to print.
+     */
+    void profileln(double v);
+  
+    /**
+     * @brief Print to the profile if there is one and end line.
+     *
+     * @param v The unsigned int value to print.
+     */
+    void profileln(unsigned int v);
+ 
+    /**
+     * @brief Print to the profile if there is one and end line.
+     *
+     * @param s The string to print to the profile.
+     */
+    void profileln(const std::string& s);
+  
+    /**
+     * @brief Print parameters and corresponding function evaluation to profiler.
+     *
+     * @param params The parameters to print.
+     * @param value  The function evaluation.
+     */
+    void printPoint(const ParameterList& params, double value);
+    
+    /**
+     * @brief Give a message to print to the message handler.
+     *
+     * @param message The message to print.
+     */
+    void printMessage(const std::string& message);
+
+    /**
+     * @brief Notify all listeners that optimizer initialization was performed.
+     *
+     * This method should be called by the init method.
+     *
+     * @param event An OptimizationEvent object.
+     */
+    void fireOptimizationInitializationPerformed(const OptimizationEvent& event);
+
+    /**
+     * @brief Notify all listeners that an optimization step was performed.
+     *
+     * This method should be called by the step method.
+     *
+     * @param event An OptimizationEvent object.
+     */
+    void fireOptimizationStepPerformed(const OptimizationEvent& event);
+
+    bool listenerModifiesParameters() const;
+    /** @} */
+
+  protected:
+    ParameterList& getParameters_() { return parameters_; }
+    Parameter& getParameter_(size_t i) { return parameters_[i]; }
+    Function* getFunction_() { return function_; }
+    void setDefaultStopCondition_(OptimizationStopCondition* osc)
+    {
+      defaultStopCondition_ = osc;
+    }
+  
+};
+
+} //end of namespace bpp.
+
+#endif  //_ABSTRACTOPTIMIZER_H_
+
diff --git a/src/Bpp/Numeric/Function/BfgsMultiDimensions.cpp b/src/Bpp/Numeric/Function/BfgsMultiDimensions.cpp
new file mode 100644
index 0000000..c3035f8
--- /dev/null
+++ b/src/Bpp/Numeric/Function/BfgsMultiDimensions.cpp
@@ -0,0 +1,300 @@
+//
+// File: BfgsMultiDimensions.cpp
+// Created by: Laurent Guéguen
+// Created on: Dec 16 13:49 2010
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "BfgsMultiDimensions.h"
+#include "OneDimensionOptimizationTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+BfgsMultiDimensions::BfgsMultiDimensions(DerivableFirstOrder* function) :
+  AbstractOptimizer(function),
+  //gtol_(gtol),
+  slope_(0),
+  Up_(),
+  Lo_(),
+  p_(),
+  gradient_(),
+  xi_(),
+  dg_(),
+  hdg_(),
+  hessian_(),
+  f1dim_(function)
+{
+  setDefaultStopCondition_(new FunctionStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  setOptimizationProgressCharacter(".");
+}
+
+/******************************************************************************/
+
+void BfgsMultiDimensions::doInit(const ParameterList& params) throw (Exception)
+{
+  size_t nbParams = params.size();
+  p_.resize(nbParams);
+  gradient_.resize(nbParams);
+  xi_.resize(nbParams);
+  dg_.resize(nbParams);
+  hdg_.resize(nbParams);
+  Up_.resize(nbParams);
+  Lo_.resize(nbParams);
+
+  hessian_.resize(nbParams);
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    hessian_[i].resize(nbParams);
+  }
+
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    const Constraint* cp = params[i].getConstraint();
+    if (!cp)
+    {
+      Up_[i] = NumConstants::VERY_BIG();
+      Lo_[i] = -NumConstants::VERY_BIG();
+    }
+    else
+    {
+      Up_[i] = cp->getAcceptedLimit(NumConstants::VERY_BIG()) - NumConstants::TINY();
+      Lo_[i] = cp->getAcceptedLimit(-NumConstants::VERY_BIG()) + NumConstants::TINY();
+    }
+  }
+
+  getFunction_()->enableFirstOrderDerivatives(true);
+  getFunction_()->setParameters(params);
+
+  getGradient(gradient_);
+
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    p_[i] = getParameters()[i].getValue();
+
+    for (unsigned int j = 0; j < nbParams; j++)
+    {
+      hessian_[i][j] = 0.0;
+    }
+    hessian_[i][i] = 1.0;
+  }
+
+
+  double sum = 0;
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    sum += p_[i] * p_[i];
+  }
+}
+
+/******************************************************************************/
+
+double BfgsMultiDimensions::doStep() throw (Exception)
+{
+  double f;
+  size_t n = getParameters().size();
+  // Loop over iterations.
+
+  unsigned int i;
+
+  for (i = 0; i < n; i++)
+  {
+    p_[i] = getParameters()[i].getValue();
+  }
+
+  setDirection();
+
+  getFunction()->enableFirstOrderDerivatives(false);
+  nbEval_ += OneDimensionOptimizationTools::lineSearch(f1dim_,
+                                                       getParameters_(), xi_,
+                                                       gradient_,
+                                                       // getStopCondition()->getTolerance(),
+                                                       0, 0,
+                                                       getVerbose() > 0 ? getVerbose() - 1 : 0);
+  getFunction()->enableFirstOrderDerivatives(true);
+
+  for (i = 0; i < n; i++)
+  {
+    xi_[i] = getParameters_()[i].getValue() - p_[i];
+  }
+
+  f = getFunction()->f(getParameters());
+  if (f > currentValue_) {
+    printMessage("!!! Function increase !!!");
+    printMessage("!!! Optimization might have failed. Try to reparametrize your function to remove constraints.");
+    tolIsReached_ = true;
+    return f;
+  }
+
+  if (tolIsReached_)
+  {
+    return f;
+  }
+
+  //double temp, test = 0.0;
+  //for (i = 0; i < n; i++)
+  //{
+  //  temp = xi_[i];
+  //  if (p_[i] > 1.0)
+  //    temp /= p_[i];
+  //  if (temp > test)
+  //    test = temp;
+  //}
+
+  //if (test < 1e-7)
+  //{
+  //  tolIsReached_ = true;
+  //  return f;
+  //}
+
+  for (i = 0; i < n; i++)
+  {
+    dg_[i] = gradient_[i];
+  }
+
+  getGradient(gradient_);
+  //test = 0.0;
+
+  //for (i = 0; i < n; i++)
+  //{
+  //  temp = abs(gradient_[i]);
+  //  if (abs(p_[i]) > 1.0)
+  //    temp /= p_[i];
+  //  if (temp > test)
+  //    test = temp;
+  //}
+
+  //if (f > 1.0)
+  //  test /= f;
+
+  //if (test < gtol_)
+  //{
+  //  tolIsReached_ = true;
+  //  return f;
+  //}
+
+  for (i = 0; i < n; i++)
+  {
+    dg_[i] = gradient_[i] - dg_[i];
+  }
+
+  for (i = 0; i < n; i++)
+  {
+    hdg_[i] = 0;
+    for (unsigned int j = 0; j < n; j++)
+    {
+      hdg_[i] += hessian_[i][j] * dg_[j];
+    }
+  }
+
+  double fae(0), fac(0), sumdg(0), sumxi(0);
+
+  for (i = 0; i < n; i++)
+  {
+    fac += dg_[i] * xi_[i];
+    fae += dg_[i] * hdg_[i];
+    sumdg += dg_[i] * dg_[i];
+    sumxi += xi_[i] * xi_[i];
+  }
+
+  if (fac > sqrt(1e-7 * sumdg * sumxi))
+  {
+    fac = 1.0 / fac;
+    double fad = 1.0 / fae;
+    for (i = 0; i < n; i++)
+    {
+      dg_[i] = fac * xi_[i] - fad * hdg_[i];
+    }
+    for (i = 0; i < n; i++)
+    {
+      for (unsigned int j = i; j < n; j++)
+      {
+        hessian_[i][j] += fac * xi_[i] * xi_[j] - fad * hdg_[i] * hdg_[j] + fae * dg_[i] * dg_[j];
+        hessian_[j][i] = hessian_[i][j];
+      }
+    }
+  }
+
+  return f;
+}
+
+/******************************************************************************/
+
+void BfgsMultiDimensions::getGradient(std::vector<double>& gradient) const
+{
+  for (unsigned int i = 0; i < gradient.size(); i++)
+  {
+    gradient[i] = getFunction()->getFirstOrderDerivative(getParameters()[i].getName());
+  }
+}
+
+/******************************************************************************/
+
+void BfgsMultiDimensions::setDirection()
+{
+  size_t nbParams = getParameters().size();
+
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    xi_[i] = 0;
+    for (unsigned int j = 0; j < nbParams; j++)
+    {
+      xi_[i] -= hessian_[i][j] * gradient_[j];
+    }
+  }
+
+  double v = 1, alpmax = 1;
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    if ((xi_[i] > 0) && (p_[i] + NumConstants::TINY() * xi_[i] < Up_[i]))
+      v = (Up_[i] - p_[i]) / xi_[i];
+    else if ((xi_[i] < 0) && (p_[i] + NumConstants::TINY() * xi_[i] > Lo_[i]))
+      v = (Lo_[i] - p_[i]) / xi_[i];
+    if (v < alpmax)
+      alpmax = v;
+  }
+
+  for (size_t i = 0; i < nbParams; i++)
+  {
+    if (p_[i] + NumConstants::TINY() * xi_[i] >= Up_[i])
+      xi_[i] = Up_[i] - p_[i];
+    else if (p_[i] + NumConstants::TINY() * xi_[i] <= Lo_[i])
+      xi_[i] = Lo_[i] - p_[i];
+    else
+      xi_[i] *= alpmax;
+  }
+}
diff --git a/src/Bpp/Numeric/Function/BfgsMultiDimensions.h b/src/Bpp/Numeric/Function/BfgsMultiDimensions.h
new file mode 100644
index 0000000..ab8c7c7
--- /dev/null
+++ b/src/Bpp/Numeric/Function/BfgsMultiDimensions.h
@@ -0,0 +1,123 @@
+//
+// File: BfgsMultiDimensions.h
+// Created by: Laurent Guéguen
+// Created on: Dec 16 13:49 2010
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _BFGSMULTIDIMENSIONS_H_
+#define _BFGSMULTIDIMENSIONS_H_
+
+#include "AbstractOptimizer.h"
+#include "DirectionFunction.h"
+#include "../VectorTools.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Broyden–Fletcher–Goldfarb–Shanno (BFGS) optimization method.
+   *
+   * with a modification on the bounds taken from:
+   *  An active set limited memory BFGS algorithm for large-scale bound
+   *    constrained optimization, Yunhai Xiao & Dong-Hui Li. Math Meth
+   *    Oper Res (2008) 67:443­454
+   */
+  
+  class BfgsMultiDimensions:
+    public AbstractOptimizer
+  {
+  protected:
+    //double gtol_;
+    double slope_;
+
+    // vectors of the Lower & Upper bounds of the parameters
+    Vdouble Up_, Lo_;
+
+    mutable Vdouble p_, gradient_, xi_, dg_, hdg_;
+    mutable VVdouble hessian_;
+
+    mutable DirectionFunction f1dim_;
+
+    
+  public:
+
+    BfgsMultiDimensions(DerivableFirstOrder* function);
+
+    virtual ~BfgsMultiDimensions() {}
+
+    BfgsMultiDimensions* clone() const { return new BfgsMultiDimensions(*this); }
+
+  public:
+
+    /**
+     * @name From AbstractOptimizer.
+     *
+     * @{
+     */
+    const DerivableFirstOrder* getFunction() const
+    {
+      return dynamic_cast<const DerivableFirstOrder*>(AbstractOptimizer::getFunction());
+    }
+    DerivableFirstOrder* getFunction()
+    {
+      return dynamic_cast<DerivableFirstOrder*>(AbstractOptimizer::getFunction());
+    }
+    void doInit(const ParameterList& params) throw (Exception);
+
+    double doStep() throw (Exception);
+    /** @} */
+
+    void getGradient(std::vector<double>& gradient) const;
+
+  protected:
+    DerivableFirstOrder* getFunction_()
+    {
+      return dynamic_cast<DerivableFirstOrder*>(AbstractOptimizer::getFunction_());
+    }
+
+  private:
+    /**
+     * Sets the direction for linesearch in case of bounds
+     * To be used after gradient_ & pi_ are computed
+     */ 
+    void setDirection();
+    
+  };
+
+} //end of namespace bpp.
+
+#endif //_BFGSMULTIDIMENSIONS_H_
+
diff --git a/src/Bpp/Numeric/Function/BrentOneDimension.cpp b/src/Bpp/Numeric/Function/BrentOneDimension.cpp
new file mode 100644
index 0000000..1203ce3
--- /dev/null
+++ b/src/Bpp/Numeric/Function/BrentOneDimension.cpp
@@ -0,0 +1,216 @@
+//
+// File: BrentOneDimension.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Nov 17 11:45:58 2003
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "BrentOneDimension.h"
+#include "OneDimensionOptimizationTools.h"
+#include "../NumTools.h"
+#include "../NumConstants.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+bool BrentOneDimension::BODStopCondition::isToleranceReached() const
+{
+  callCount_++;
+  if (callCount_ <= burnin_) return false;
+  const BrentOneDimension* bod = dynamic_cast<const BrentOneDimension *>(optimizer_);
+  return getCurrentTolerance() <= (bod->tol2 - 0.5 * (bod->b - bod->a));
+}
+    
+/******************************************************************************/
+
+double BrentOneDimension::BODStopCondition::getCurrentTolerance() const
+{
+  // NRC Test for done:
+  const BrentOneDimension* bod = dynamic_cast<const BrentOneDimension *>(optimizer_);
+  return NumTools::abs(bod->x - bod->xm);
+}
+ 
+/******************************************************************************/
+
+BrentOneDimension::BrentOneDimension(Function* function) :
+  AbstractOptimizer(function),
+  a(0), b(0), d(0), e(0), etemp(0), fu(0), fv(0), fw(0), fx(0), p(0), q(0), r(0), tol1(0), tol2(0),
+  u(0), v(0), w(0), x(0), xm(0), _xinf(0), _xsup(0), isInitialIntervalSet_(false)
+{
+  setDefaultStopCondition_(new BODStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  setMaximumNumberOfEvaluations(10000);
+}
+
+/******************************************************************************/
+  
+double BrentOneDimension::ZEPS  = 1.0e-10;
+  
+/******************************************************************************/
+  
+void BrentOneDimension::doInit(const ParameterList& params) throw (Exception)
+{
+  if (params.size() != 1)
+    throw Exception("BrentOneDimension::init(). This optimizer only deals with one parameter.");
+
+  // Bracket the minimum.
+  Bracket bracket = OneDimensionOptimizationTools::bracketMinimum(_xinf, _xsup, getFunction(), getParameters());
+  if (getVerbose() > 0)
+  {
+    printMessage("Initial bracketing:");
+    printMessage("A: x = " + TextTools::toString(bracket.a.x) + ", f = " + TextTools::toString(bracket.a.f));
+    printMessage("B: x = " + TextTools::toString(bracket.b.x) + ", f = " + TextTools::toString(bracket.b.f));
+    printMessage("C: x = " + TextTools::toString(bracket.c.x) + ", f = " + TextTools::toString(bracket.c.f));
+  }
+  
+  // This will be the distance moved on the step before last.
+  e = 0.0;
+
+  // a and b must be in ascending order, but input abscissa need not be.
+  a = (bracket.a.x < bracket.c.x ? bracket.a.x : bracket.c.x);
+  b = (bracket.a.x > bracket.c.x ? bracket.a.x : bracket.c.x);
+  // Initializations...
+  fw = fv = fx = getFunction()->f(getParameters());
+  if (fx < bracket.b.f)
+  {
+    //We don't want to lose our initial guess!
+    x = w = v = bracket.b.x = getParameters()[0].getValue();
+  }
+  else
+  {
+    x = w = v = bracket.b.x;
+    getParameter_(0).setValue(x);
+    fw = fv = fx = getFunction()->f(getParameters());
+  }
+}
+
+/******************************************************************************/
+  
+void BrentOneDimension::setInitialInterval(double inf, double sup)
+{
+  if(sup > inf)
+  {
+    _xinf = inf; _xsup = sup;
+  }
+  else
+  {
+    _xinf = sup; _xsup = inf;
+  }
+  isInitialIntervalSet_ = true;
+}
+
+/******************************************************************************/
+
+double BrentOneDimension::doStep() throw (Exception)
+{
+  xm   = 0.5 * (a + b);
+  tol2 = 2.0 * (tol1 = getStopCondition()->getTolerance() * NumTools::abs(x) + ZEPS);
+  
+  if(NumTools::abs(e) > tol1)
+  {
+    r = (x - w) * (fx - fv);
+    q = (x - v) * (fx - fw);
+    p = (x - v) * q - (x - w) * r;
+    q = 2.0 * (q - r);
+    if (q > 0.0) p = -p;
+    q = NumTools::abs(q);
+    etemp = e;
+    e = d;
+    if (NumTools::abs(p) >= NumTools::abs(0.5 * q * etemp) || p <= q * (a - x) || p >= q * (b - x))
+      d = NumConstants::GOLDEN_RATIO_C() * (e = (x >= xm ? a - x : b - x));
+    else
+    {
+      d = p / q;
+      u = x + d;
+      if (u - a < tol2 || b - u < tol2)
+        d = NumTools::sign(tol1, xm - x);
+    }
+  }
+  else
+  {
+    d = NumConstants::GOLDEN_RATIO_C() * (e = (x >= xm ? a - x : b - x));
+  }
+  u = (NumTools::abs(d) >= tol1 ? x + d : x + NumTools::sign(tol1, d));
+
+  // Function evaluaton:
+  ParameterList pl = getParameters();
+  pl[0].setValue(u);
+
+  fu = getFunction()->f(pl);
+
+  if (fu <= fx)
+  {
+    if (u >= x) a = x; else b = x;
+    NumTools::shift(v, w, x, u);
+    NumTools::shift(fv, fw, fx, fu);
+  }
+  else
+  {
+    if (u < x) a = u; else b = u;
+    if (fu <= fw || w == x)
+    {
+      v  = w;
+      w  = u;
+      fv = fw;
+      fw = fu;
+    }
+    else if (fu <= fv || v == x || v == w)
+    {
+      v  = u;
+      fv = fu;
+    }
+  }
+
+  // Store results for this step:
+  getParameter_(0).setValue(x);
+  return fx;
+}
+
+/******************************************************************************/
+  
+double BrentOneDimension::optimize() throw (Exception)
+{
+  if (!isInitialIntervalSet_)
+    throw Exception("BrentOneDimension::optimize. Initial interval not set: call the 'setInitialInterval' method first!");
+  AbstractOptimizer::optimize();
+  // Apply parameters and evaluate function at minimum point:
+  currentValue_ = getFunction()->f(getParameters());
+  return currentValue_;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/BrentOneDimension.h b/src/Bpp/Numeric/Function/BrentOneDimension.h
new file mode 100644
index 0000000..21250e6
--- /dev/null
+++ b/src/Bpp/Numeric/Function/BrentOneDimension.h
@@ -0,0 +1,150 @@
+//
+// File: BrentOneDimension.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 17 11:45:58 2003
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _BRENTONEDIMENSION_H_
+#define _BRENTONEDIMENSION_H_
+
+#include "AbstractOptimizer.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Brent's optimization for one parameter.
+ *
+ * A description of the algorithm can be found in:
+ * <pre>
+ * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+ * (ISBN 0-521-43108-5)
+ * </pre>
+ * or there: <a href="http://en.wikipedia.org/wiki/Brent's_method">http://en.wikipedia.org/wiki/Brent's_method</a>.
+ */
+class BrentOneDimension:
+  public AbstractOptimizer
+{
+	public:
+		class BODStopCondition:
+      public AbstractOptimizationStopCondition
+		{
+      public:
+				BODStopCondition(BrentOneDimension* bod):
+          AbstractOptimizationStopCondition(bod) {
+            tolerance_ = bod->tol2;
+            burnin_ = 3;
+          }
+				virtual ~BODStopCondition() {}
+
+        BODStopCondition* clone() const { return new BODStopCondition(*this); } 
+			
+			public:
+				bool isToleranceReached() const;
+				double getCurrentTolerance() const;
+		};
+	
+	friend class BODStopCondition;
+	
+	protected:
+		double a, b, d, e, etemp, fu, fv, fw, fx, p, q, r, tol1, tol2, u, v, w, x, xm;
+		double _xinf, _xsup;
+    bool isInitialIntervalSet_;
+
+	public:
+		BrentOneDimension(Function* function = 0);
+		virtual ~BrentOneDimension() {}
+
+    BrentOneDimension* clone() const { return new BrentOneDimension(*this); }
+	
+	public:		
+		
+		/**
+		 * @name The Optimizer interface.
+		 *
+		 * @{
+		 */
+		
+		/**
+		 * @brief Initialize optimizer.
+		 *
+		 * Brent's algorithm needs 2 initial guesses, so you must call the
+		 * setInitialInterval() method first. This function actually performs:
+     * <ul>
+		 * <li>Parameter list actualisation;</li>
+		 * <li>Initial bracketting;</li>
+		 * <li>Function evaluation count reseting.</li>
+     * </ul>
+		 */
+    double optimize() throw (Exception); //redefinition
+		/** @} */
+		
+    void doInit(const ParameterList& params) throw (Exception);
+		
+    double doStep() throw (Exception);
+	
+	public:
+
+		/**
+		 * @name Specific method
+		 *
+		 * @{
+		 */
+		
+		/**
+		 * @brief Set intial search interval.
+		 *
+		 * @param inf Minimum value.
+		 * @param sup Maximum value.
+		 */
+		void setInitialInterval(double inf, double sup);
+		/** @} */
+
+    /**
+     * @return 'true' if the initial interval has been correctly set.
+     */
+    bool isInitialIntervalSet() const { return isInitialIntervalSet_; }
+	
+	public:
+		
+	static double ZEPS;
+
+};
+
+} //end of namespace bpp.
+
+#endif	//_BRENTONEDIMENSION_H_
+
diff --git a/src/Bpp/Numeric/Function/ConjugateGradientMultiDimensions.cpp b/src/Bpp/Numeric/Function/ConjugateGradientMultiDimensions.cpp
new file mode 100644
index 0000000..bdfb3aa
--- /dev/null
+++ b/src/Bpp/Numeric/Function/ConjugateGradientMultiDimensions.cpp
@@ -0,0 +1,134 @@
+//
+// File: ConjugateGradientMultiDimensions.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Apr 11 16:51 2007
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "ConjugateGradientMultiDimensions.h"
+#include "OneDimensionOptimizationTools.h"
+
+#include "../VectorTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+ConjugateGradientMultiDimensions::ConjugateGradientMultiDimensions(DerivableFirstOrder* function):
+  AbstractOptimizer(function), optimizer_(function),
+  xi_(), h_(), g_(), f1dim_(function)
+{
+  setDefaultStopCondition_(new FunctionStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+}
+
+/******************************************************************************/
+
+void ConjugateGradientMultiDimensions::doInit(const ParameterList & params) throw (Exception)
+{
+  size_t nbParams = params.size();
+  g_.resize(nbParams);
+  h_.resize(nbParams);
+  xi_.resize(nbParams);
+  getFunction_()->enableFirstOrderDerivatives(true);
+  getFunction_()->setParameters(params);
+  getGradient(xi_);
+  for(size_t i = 0; i < nbParams; i++)
+  {
+    g_[i]  = -xi_[i];
+    xi_[i] = h_[i] = g_[i];
+  }
+}
+
+/******************************************************************************/
+
+double ConjugateGradientMultiDimensions::doStep() throw (Exception)
+{
+  double gg, gam, f, dgg;
+  size_t n = getParameters().size();
+  //Loop over iterations.
+  getFunction_()->enableFirstOrderDerivatives(false);
+  nbEval_ += OneDimensionOptimizationTools::lineMinimization(f1dim_,
+      getParameters_(), xi_, getStopCondition()->getTolerance(),
+      0, 0, getVerbose() > 0 ? getVerbose() - 1 : 0);
+
+  getFunction_()->enableFirstOrderDerivatives(true);
+  f = getFunction()->f(getParameters());
+
+  if (tolIsReached_)
+  {
+    return f;
+  }
+  getGradient(xi_);
+
+  dgg = gg = 0.0;
+  for (unsigned j = 0; j < n; j++)
+  {
+    gg += g_[j] * g_[j];
+    /* dgg += xi[j] * xi[j]; */ //This statement for Fletcher-Reeves.
+    dgg += (xi_[j] + g_[j]) * xi_[j]; //This statement for Polak-Ribiere.
+  }
+  
+  if (gg == 0.0)
+  { 
+    //Unlikely. If gradient is exactly zero then
+    return f;
+  }
+  gam = dgg / gg;
+
+  if (!(std::isnan(gam) || std::isinf(gam)))
+  {
+    for(unsigned int j = 0; j < n; j++)
+    {
+      g_[j] = -xi_[j];
+      xi_[j] = h_[j] = g_[j] + gam * h_[j];
+    }
+  }
+  
+  return f;
+}
+
+/******************************************************************************/
+
+void ConjugateGradientMultiDimensions::getGradient(std::vector<double>& gradient) const
+{
+  for (size_t i = 0; i < gradient.size(); ++i)
+  {
+    gradient[i] = getFunction()->getFirstOrderDerivative(getParameters()[i].getName());
+  }
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/ConjugateGradientMultiDimensions.h b/src/Bpp/Numeric/Function/ConjugateGradientMultiDimensions.h
new file mode 100644
index 0000000..3c1925d
--- /dev/null
+++ b/src/Bpp/Numeric/Function/ConjugateGradientMultiDimensions.h
@@ -0,0 +1,110 @@
+//
+// File: ConjugateGradientMultiDimensions.h
+// Created by: Julien Dutheil
+// Created on: Wed Apr 11 16:51 2007
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 19, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _CONJUGATEGRADIENTMULTIDIMENSIONS_H_
+#define _CONJUGATEGRADIENTMULTIDIMENSIONS_H_
+
+#include "AbstractOptimizer.h"
+#include "BrentOneDimension.h"
+#include "DirectionFunction.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Conjugate gradient optimization method.
+   *
+   * A description of the algorithm can be found in:
+   * <pre>
+   * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+   * (ISBN 0-521-43108-5)
+   * </pre>
+   * or there:
+   * <a href="http://en.wikipedia.org/wiki/Conjugate_gradient">http://en.wikipedia.org/wiki/Conjugate_gradient</a>.
+   */
+  class ConjugateGradientMultiDimensions:
+    public AbstractOptimizer
+  {
+  protected:
+    BrentOneDimension optimizer_; //One dimensional optimizer.
+    std::vector<double> xi_, h_, g_;
+    DirectionFunction f1dim_;
+
+  public:
+
+    ConjugateGradientMultiDimensions(DerivableFirstOrder* function);
+
+    virtual ~ConjugateGradientMultiDimensions() {}
+
+    ConjugateGradientMultiDimensions* clone() const { return new ConjugateGradientMultiDimensions(*this); }
+
+  public:
+
+    /**
+     * @name From AbstractOptimizer.
+     *
+     * @{
+     */
+    const DerivableFirstOrder* getFunction() const
+    {
+      return dynamic_cast<const DerivableFirstOrder*>(AbstractOptimizer::getFunction());
+    }
+    DerivableFirstOrder* getFunction()
+    {
+      return dynamic_cast<DerivableFirstOrder*>(AbstractOptimizer::getFunction());
+    }
+    void doInit(const ParameterList& params) throw (Exception);
+
+    double doStep() throw (Exception);
+    /** @} */
+
+    void getGradient(std::vector<double>& gradient) const;
+
+  protected:
+    DerivableFirstOrder* getFunction_()
+    {
+      return dynamic_cast<DerivableFirstOrder*>(AbstractOptimizer::getFunction_());
+    }
+    
+  };
+
+} //end of namespace bpp.
+
+#endif //_CONJUGATEGRADIENTMULTIDIMENSIONS_H_
+
diff --git a/src/Bpp/Numeric/Function/DirectionFunction.cpp b/src/Bpp/Numeric/Function/DirectionFunction.cpp
new file mode 100644
index 0000000..65828df
--- /dev/null
+++ b/src/Bpp/Numeric/Function/DirectionFunction.cpp
@@ -0,0 +1,109 @@
+//
+// File: DirectionFunction.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Apr 11 17:28 2007
+// From file PowellMultiDimensions.cpp
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "DirectionFunction.h"
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************/
+
+void DirectionFunction::setParameters(const ParameterList & params)
+  throw (ParameterNotFoundException, ConstraintException)
+{
+  params_ = params;
+  double x = params_[0].getValue();
+  for(unsigned int j = 0; j < p_.size(); j++)
+    {
+      //      cout << p_[j].getValue() << " " << x << " " << xi_[j] << endl;
+      xt_[j].setValue((p_[j].getValue()) + x * xi_[j]);
+    }
+  function_->setParameters(xt_);
+}
+
+/******************************************************************************/
+
+double DirectionFunction::getValue() const throw (Exception)
+{
+  return function_->getValue();
+}
+
+/******************************************************************************/
+
+const ParameterList & DirectionFunction::getParameters() const throw (Exception)
+{
+  return params_;
+}
+
+/******************************************************************************/
+
+void DirectionFunction::init(const ParameterList & p, const vector<double> & xi)
+{
+  p_ = p;
+  xi_ = xi;
+  if(constraintPolicy_ == AutoParameter::CONSTRAINTS_AUTO)   autoParameter();
+  else if(constraintPolicy_ == AutoParameter::CONSTRAINTS_IGNORE) ignoreConstraints();
+  xt_ = p_;
+}
+
+/******************************************************************************/
+
+void DirectionFunction::autoParameter()
+{
+  for(unsigned int i = 0; i < p_.size(); i++)
+    {
+      AutoParameter ap(p_[i]);
+      ap.setMessageHandler(messenger_);
+      p_.setParameter(i, ap);
+    }
+}
+
+/******************************************************************************/
+
+void DirectionFunction::ignoreConstraints()
+{
+  for(unsigned int i = 0; i < p_.size(); i++)
+    {
+      p_[i].removeConstraint();
+    }
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/DirectionFunction.h b/src/Bpp/Numeric/Function/DirectionFunction.h
new file mode 100644
index 0000000..0363f60
--- /dev/null
+++ b/src/Bpp/Numeric/Function/DirectionFunction.h
@@ -0,0 +1,116 @@
+//
+// File: DirectionFunction.h
+// Created by: Julien Dutheil
+// Created on: Wed Apr 11 17:28 2007
+// From file PowellMultiDimensions.h
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _DIRECTIONFUNCTION_H_
+#define _DIRECTIONFUNCTION_H_
+
+#include "Functions.h"
+#include "../Parametrizable.h"
+#include "../AutoParameter.h"
+#include "../../App/ApplicationTools.h"
+#include "../../Io/OutputStream.h"
+
+namespace bpp
+{
+
+class DirectionFunction:
+  public Function,
+  public ParametrizableAdapter
+{
+  private:
+    mutable ParameterList params_, p_, xt_;
+    std::vector<double> xi_;
+    Function* function_;
+    std::string constraintPolicy_;
+    OutputStream* messenger_;
+      
+  public:
+    DirectionFunction(Function* function = 0) :
+      params_(), p_(), xt_(), xi_(),
+      function_(function), constraintPolicy_(AutoParameter::CONSTRAINTS_KEEP),
+      messenger_(ApplicationTools::message) {}
+
+    DirectionFunction(const DirectionFunction& df) :
+      ParametrizableAdapter(df), params_(df.params_), p_(df.p_), xt_(df.p_), xi_(df.xi_),
+      function_(df.function_), constraintPolicy_(df.constraintPolicy_), messenger_(df.messenger_) {}
+
+    DirectionFunction& operator=(const DirectionFunction& df)
+    {
+      ParametrizableAdapter::operator=(df);
+      params_ = df.params_;
+      p_ = df.p_;
+      xt_ = df.p_;
+      xi_ = df.xi_;
+      function_ = df.function_;
+      constraintPolicy_ = df.constraintPolicy_;
+      messenger_ = df.messenger_;
+      return *this;
+    }
+
+    virtual ~DirectionFunction() {}
+
+    DirectionFunction* clone() const { return new DirectionFunction(*this); }
+
+  public: // Function interface implementation:
+    void setParameters(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException);
+    double getValue() const throw (Exception);
+    const ParameterList & getParameters() const throw (Exception);
+
+  public: // Specific methods:
+    void init(const ParameterList & p, const std::vector<double> & xi);
+    void autoParameter();
+    void ignoreConstraints();
+    void setConstraintPolicy(const std::string & constraintPolicy) { constraintPolicy_ = constraintPolicy; }
+    std::string getConstraintPolicy() const { return constraintPolicy_; }
+    void setMessageHandler(OutputStream* messenger) { messenger_ = messenger; }
+    Function * getFunction() const { return function_; }
+    /**
+     * @return The set of parameters associated to the function, as specified by the init() method.
+     */
+    ParameterList getFunctionParameters() const { return p_; }
+    size_t getNumberOfParameters() const { return p_.size(); }
+
+};
+
+} //end of namespace bpp.
+
+#endif //_DIRECTIONFUNCTION_H_
+
diff --git a/src/Bpp/Numeric/Function/DownhillSimplexMethod.cpp b/src/Bpp/Numeric/Function/DownhillSimplexMethod.cpp
new file mode 100644
index 0000000..b6df0d9
--- /dev/null
+++ b/src/Bpp/Numeric/Function/DownhillSimplexMethod.cpp
@@ -0,0 +1,243 @@
+//
+// File: DownhillSimplexMethod.cpp
+// Created by: Julien Dutheil
+// Created on: Tue Nov  4 17:10:05 2003
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "DownhillSimplexMethod.h"
+#include "../NumTools.h"
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************/
+
+double DownhillSimplexMethod::DSMStopCondition::getCurrentTolerance() const
+{
+	const DownhillSimplexMethod* dsm = dynamic_cast<const DownhillSimplexMethod *>(optimizer_);
+	double rTol = 2.0 * NumTools::abs(dsm->y_[dsm->iHighest_] - dsm->y_[dsm->iLowest_]) /
+		(NumTools::abs(dsm->y_[dsm->iHighest_]) + NumTools::abs(dsm->y_[dsm->iLowest_]));
+	return rTol;
+}
+	
+/******************************************************************************/
+			
+DownhillSimplexMethod::DownhillSimplexMethod(Function* function):
+  AbstractOptimizer(function), simplex_(), y_(), pSum_(), iHighest_(0), iNextHighest_(0), iLowest_(0)
+{
+	// Default values:
+	nbEvalMax_ = 5000;
+	setDefaultStopCondition_(new DSMStopCondition(this));
+	setStopCondition(*getDefaultStopCondition());
+}
+
+/******************************************************************************/
+
+void DownhillSimplexMethod::doInit(const ParameterList& params) throw (Exception)
+{
+	size_t nDim = getParameters().size();
+	nbEval_ = 0;
+
+	// Initialize the simplex:
+	simplex_.resize(nDim + 1);
+	y_.resize(nDim + 1);
+	double lambda = 0.2; //20% of the parameter value.
+  for(unsigned int i = 1; i < nDim + 1; i++)
+  {
+		// Copy the vector...
+		simplex_[i] = getParameters();
+		// ... and set the initial values.
+		for(unsigned int j = 0; j < nDim; j++)
+    {
+      //Hummm... that does not work when the first point is 0!!! where does this come from???
+			//simplex_[i][j].setValue(getParameters()[j].getValue() * (1. + (j == i - 1 ? lambda : 0.)));
+			simplex_[i][j].setValue(getParameters()[j].getValue() + (j == i - 1 ? lambda : 0.));
+    }
+		//Compute the corresponding f value:
+		y_[i] = getFunction()->f(simplex_[i]);
+    nbEval_++;
+	}
+  //Last function evaluation, setting current value:
+	simplex_[0] = getParameters();
+	y_[0] = getFunction()->f(simplex_[0]);
+  nbEval_++;
+	
+	pSum_ = getPSum();
+}
+	
+/******************************************************************************/
+
+double DownhillSimplexMethod::doStep() throw (Exception)
+{
+	// The number of dimensions of the parameter space:
+	size_t nDim = simplex_.getDimension();
+	size_t mpts = nDim + 1;
+
+	iLowest_ = 0;
+	// First we must determine which point is the highest (worst),
+	// next-highest, and lowest (best), by looping over the points
+	// in the simplex.
+	if(y_[0] > y_[1])
+  {
+		iHighest_ = 0;
+		iNextHighest_ = 1;
+	}
+  else
+  {
+		iHighest_ = 1;
+		iNextHighest_ = 0;
+	}
+	
+	for(unsigned int i = 0; i < mpts; i++)
+  {
+		if (y_[i] <= y_[iLowest_]) iLowest_ = i;
+		if (y_[i] > y_[iHighest_])
+    {
+			iNextHighest_ = iHighest_;
+			iHighest_ = i;
+		}
+    else if(y_[i] > y_[iNextHighest_] && i != iHighest_) iNextHighest_ = i;
+	}
+		
+  // Set current best point:
+	getParameters_() = simplex_[iLowest_];
+		
+	// Begin a new iteration.
+	// First extrapolate by a factor -1 through the face of the simplex
+	// across from high point, i.e., reflect the simplex from the high point.</p>
+
+	double yTry = tryExtrapolation(-1.0);
+	if (yTry <= y_[iLowest_])
+  {
+		// Expansion.
+		yTry = tryExtrapolation(2.0);
+	}
+  else if (yTry >= y_[iNextHighest_])
+  {
+		// Contraction.
+		double ySave = y_[iHighest_];
+		yTry = tryExtrapolation(0.5);
+		if (yTry >= ySave)
+    {
+			for (size_t i = 0; i < mpts; i++)
+      {
+				if (i != iLowest_)
+        {
+					for (size_t j = 0; j < nDim; j++)
+          {
+						pSum_[j].setValue(0.5 * (simplex_[i][j].getValue() + simplex_[iLowest_][j].getValue()));
+						simplex_[i][j].setValue(pSum_[j].getValue());
+					}
+					y_[i] = getFunction()->f(pSum_);
+	        nbEval_++;
+				}
+			}
+			nbEval_ += static_cast<unsigned int>(nDim);
+			pSum_ = getPSum();
+		}
+	}
+
+	return y_[iLowest_];
+}
+
+/******************************************************************************/
+
+double DownhillSimplexMethod::optimize() throw (Exception)
+{
+  AbstractOptimizer::optimize();
+
+	// set best shot:
+	return getFunction()->f(simplex_[iLowest_]);
+}
+
+/******************************************************************************/
+
+ParameterList DownhillSimplexMethod::getPSum()
+{
+	size_t ndim = simplex_.getDimension();
+	size_t mpts = ndim + 1;
+	
+	// Get a copy...
+	ParameterList pSum = getParameters();
+	// ... and initializes it.
+	for (size_t j = 0; j < ndim; j++)
+  {
+		double sum = 0.;
+		for (size_t i = 0; i < mpts; i++)
+    {
+			sum += simplex_[i][j].getValue();
+		}
+		pSum[j].setValue(sum);
+	}
+	return pSum;
+}
+
+/******************************************************************************/
+
+double DownhillSimplexMethod::tryExtrapolation(double fac)
+{
+	size_t ndim = simplex_.getDimension();
+	double fac1, fac2, yTry;
+
+	fac1 = (1.0 - fac) / static_cast<double>(ndim);
+	fac2 = fac1 - fac;
+	
+	// Get a copy...
+	ParameterList pTry = getParameters();
+	// and initialize it:
+	for (size_t j = 0; j < ndim; j++)
+  {
+		pTry[j].setValue(pSum_[j].getValue() * fac1 - simplex_[iHighest_][j].getValue() * fac2);
+	}
+	// Now compute the function for this new set of parameters:
+	yTry = getFunction()->f(pTry);
+  nbEval_++;
+	
+	// Then test this new point:
+	if (yTry < y_[iHighest_])
+  {
+		y_[iHighest_] = yTry;
+		for (size_t j = 0; j < ndim; j++)
+    {
+			pSum_[j].setValue(pSum_[j].getValue() + pTry[j].getValue() - simplex_[iHighest_][j].getValue());
+			simplex_[iHighest_][j].setValue(pTry[j].getValue());
+		}
+	}
+	return yTry;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/DownhillSimplexMethod.h b/src/Bpp/Numeric/Function/DownhillSimplexMethod.h
new file mode 100644
index 0000000..efb5f3f
--- /dev/null
+++ b/src/Bpp/Numeric/Function/DownhillSimplexMethod.h
@@ -0,0 +1,166 @@
+//
+// File: DownhillSimplexMethod.h
+// Created by: Julien Dutheil
+// Created on: Tue Nov  4 17:10:05 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _DOWNHILLSIMPLEXMETHOD_H_
+#define _DOWNHILLSIMPLEXMETHOD_H_
+
+#include "AbstractOptimizer.h"
+#include "../VectorTools.h"
+
+// From the STL:
+#include <cmath>
+
+namespace bpp
+{
+
+/**
+ * @brief This implements the Downhill Simplex method in multidimensions.
+ *
+ * A description of the algorithm can be found in:
+ * <pre>
+ * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+ * (ISBN 0-521-43108-5)
+ * </pre>
+ * or there:
+ * <a href="http://en.wikipedia.org/wiki/Nelder-Mead_method">http://en.wikipedia.org/wiki/Nelder-Mead_method</a>.
+ */
+class DownhillSimplexMethod:
+  public AbstractOptimizer
+{
+  public:
+    class DSMStopCondition:
+      public AbstractOptimizationStopCondition
+    {
+      public:
+        DSMStopCondition(DownhillSimplexMethod * dsm):
+          AbstractOptimizationStopCondition(dsm) {}
+        virtual ~DSMStopCondition() {}
+
+        DSMStopCondition* clone() const { return new DSMStopCondition(*this); }
+      
+      public:
+        bool isToleranceReached() const { return (getCurrentTolerance() < tolerance_); }
+        double getCurrentTolerance() const;
+    };
+  
+  friend class DSMStopCondition;
+  
+  private:
+    class Simplex
+    {
+      private:
+        std::vector<ParameterList> parameters_;
+
+      public: // Class constructor and destructor:
+        Simplex(): parameters_() {}
+        virtual ~Simplex() {}
+      
+      public: // Methods:
+        const ParameterList& operator[](size_t i) const { return parameters_[i]; }
+        ParameterList& operator[](size_t i) { return parameters_[i]; }
+        void resize(size_t size) { parameters_.resize(size); }
+        size_t getDimension() const { return parameters_[0].size(); }
+    };
+    
+  protected:
+    Simplex simplex_;
+    Vdouble y_;
+    ParameterList pSum_;
+    unsigned int iHighest_, iNextHighest_, iLowest_;
+  
+  public:
+
+    /**
+     * @brief Build a new Downhill Simplex optimizer.
+     *
+     * @param function A pointer toward an object implementing the Optimizable interface.
+     */
+    DownhillSimplexMethod(Function * function);
+  
+    virtual ~DownhillSimplexMethod() {}
+
+    DownhillSimplexMethod* clone() const { return new DownhillSimplexMethod(*this); }
+  
+  public:    
+    /**
+     * @name The Optimizer interface.
+     *
+     * @{
+     */
+    
+    /**
+     * @brief Multidimensional minimization of the function function_ by the
+     * downhill simplex method of Nelder and Mead.
+     */
+    double optimize() throw (Exception);
+    /** @} */
+
+    void doInit(const ParameterList& params) throw (Exception);
+    
+    double doStep() throw (Exception);
+  
+  protected:
+    
+    /**
+     * @name Specific inner methods
+     *
+     * @{
+     */
+    
+    /**
+     * @brief Update the pSum_ variable.
+     */
+    ParameterList getPSum();
+  
+    /**
+     * @brief Extrapolates by a factor fac through the face of the simplex from the high point.
+     * Try the new point and replaces the high point if it is better.
+     *
+     * @param fac Extrapolation factor.
+     * @return The value of the function for the new point.
+     */
+    double tryExtrapolation(double fac);
+
+    /** @} */
+};
+
+} //end of namespace bpp.
+
+#endif  //_DOWNHILLSIMPLEXMETHOD_H_
+
diff --git a/src/Bpp/Numeric/Function/FivePointsNumericalDerivative.cpp b/src/Bpp/Numeric/Function/FivePointsNumericalDerivative.cpp
new file mode 100644
index 0000000..ab6c02f
--- /dev/null
+++ b/src/Bpp/Numeric/Function/FivePointsNumericalDerivative.cpp
@@ -0,0 +1,147 @@
+//
+// File: FivePointsNumericalDerivative.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Aug 17 15:00 2006
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "FivePointsNumericalDerivative.h"
+using namespace bpp;
+using namespace std;
+
+void FivePointsNumericalDerivative::updateDerivatives(const ParameterList parameters)
+throw (ParameterNotFoundException, ConstraintException)
+{
+  if (computeD1_ && variables_.size() > 0)
+  {
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(false);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(false);
+    function_->setParameters(parameters);
+    f3_ = function_->getValue();
+    string lastVar;
+    bool functionChanged = false;
+    ParameterList p;
+    bool start = true;
+    for (unsigned int i = 0; i < variables_.size(); i++)
+    {
+      string var = variables_[i];
+      if (!parameters.hasParameter(var))
+        continue;
+      if (!start)
+      {
+        vector<string> vars(2);
+        vars[0] = var;
+        vars[1] = lastVar;
+        p = parameters.subList(vars);
+      }
+      else
+      {
+        p = parameters.subList(var);
+        start = true;
+      }
+      lastVar = var;
+      functionChanged = true;
+      double value = function_->getParameterValue(var);
+      double h = (1. + std::abs(value)) * h_;
+      // Compute four other points:
+      try
+      {
+        p[0].setValue(value - 2 * h);
+        function_->setParameters(p);
+        f1_ = function_->getValue();
+        try
+        {
+          p[0].setValue(value + 2 * h);
+          function_->setParameters(p);
+          f5_ = function_->getValue();
+          // No limit raised, use central approximation:
+          p[0].setValue(value - h);
+          function_->setParameters(p);
+          f2_ = function_->getValue();
+          p[0].setValue(value + h);
+          function_->setParameters(p);
+          f4_ = function_->getValue();
+          der1_[i] = (f1_ - 8. * f2_ + 8. * f4_ - f5_) / (12. * h);
+          der2_[i] = (-f1_ + 16. * f2_ - 30. * f3_ + 16. * f4_ - f5_) / (12. * h * h);
+        }
+        catch (ConstraintException& ce)
+        {
+          // Right limit raised, use backward approximation:
+          p[0].setValue(value - h);
+          function_->setParameters(p);
+          f2_ = function_->getValue();
+          p[0].setValue(value - 2 * h);
+          function_->setParameters(p);
+          f1_ = function_->getValue();
+          der1_[i] = (f3_ - f2_) / h;
+          der2_[i] = (f3_ - 2. * f2_ + f1_) / (h * h);
+        }
+      }
+      catch (ConstraintException& ce)
+      {
+        // Left limit raised, use forward approximation:
+        p[0].setValue(value + h);
+        function_->setParameters(p);
+        f4_ = function_->getValue();
+        p[0].setValue(value + 2 * h);
+        function_->setParameters(p);
+        f5_ = function_->getValue();
+        der1_[i] = (f4_ - f3_) / h;
+        der2_[i] = (f5_ - 2. * f4_ + f3_) / (h * h);
+      }
+    }
+    // Reset last parameter and compute analytical derivatives if any.
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(computeD1_);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(computeD2_);
+    if (functionChanged)
+      function_->setParameters(parameters.subList(lastVar));
+  }
+  else
+  {
+    // Reset initial value and compute analytical derivatives if any.
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(computeD1_);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(computeD2_);
+    function_->setParameters(parameters);
+    // Just in  case derivatives are not computed:
+    f3_ = function_->getValue();
+  }
+}
+
diff --git a/src/Bpp/Numeric/Function/FivePointsNumericalDerivative.h b/src/Bpp/Numeric/Function/FivePointsNumericalDerivative.h
new file mode 100644
index 0000000..30c8388
--- /dev/null
+++ b/src/Bpp/Numeric/Function/FivePointsNumericalDerivative.h
@@ -0,0 +1,136 @@
+//
+// File: FivePointsNumericalDerivative.h
+// Created by: Julien Dutheil
+// Created on: Thu Aug 17 15:00 2006
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _FIVEPOINTSNUMERICALDERIVATIVE_H_
+#define _FIVEPOINTSNUMERICALDERIVATIVE_H_
+
+#include "Functions.h"
+#include "AbstractNumericalDerivative.h"
+
+// From the STL:
+#include <map>
+#include <vector>
+#include <string>
+
+namespace bpp
+{
+/**
+ * @brief Five points numerical derivative function wrapper.
+ *
+ * Numerical derivatives use three points to compute the derivatives.
+ * @f$x_0 at f$ is the focus point, @f$x_{-2} = x_0-2h at f$, @f$x_{-1} = x_0-h at f$, @f$x_{+1}=x_0+h at f$ and @f$x_{+2} = x_0+2h at f$
+ * are other points, with function values @f$f_0 at f$, @f$f_{-2}@f$, @f$f_{-1}@f$, @f$f_{+1}@f$ and @f$f_{+2}@f$ respectively.
+ * The derivatives are then computed using the central formulas:
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_{-2}-8f_{-1}+8f_{+1}-f_{+2}}{12h}\\
+ * \dfrac{\partial^2 f}{\partial x^2} &=& \dfrac{-f_{-2}+16f_{-1}-30f_0+16f_{+1}-f_{+2}}{12h^2}\\
+ * @f}
+ * In case of border limit (when @f$x_{-2}@f$ or @f$x_{+2}@f$ are not computable),
+ * the foreward and backward three points computations are performed, respectively:
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_{+1}-f_0}{h}\\
+ * \dfrac{\partial^2 f}{\partial x^2} &=& \dfrac{f_{+2}-2f_{+1}+f_0}{h^2}\\
+ * @f}
+ * and
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_0-f_{-1}}{h}\\
+ * \dfrac{\partial^2 f}{\partial x^2} &=& \dfrac{f_0-2f_{-1}+f_{-2}}{h^2}\\
+ * @f}
+ *
+ * The @f$h at f$ parameter is computed in a parameter dependent manner:
+ * @f$ h = x \times e at f$, with @f$x \neq 0 at f$ being the current parameter value.
+ * If @f$x = 0 at f$, @f$h = e at f$.
+ * Default value is provided for @f$e at f$ and corresponds to the _h field.
+ * The default value works fine in most cases, but you may want to change it using the setInterval method.
+ *
+ * @warning cross second order derivatives are not implemented with the five points method.
+ * @see AbstractNumericalDerivative
+ */
+class FivePointsNumericalDerivative :
+  public AbstractNumericalDerivative
+{
+private:
+  double f1_, f2_, f3_, f4_, f5_;
+
+public:
+  FivePointsNumericalDerivative(Function* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_(),
+    f3_(),
+    f4_(),
+    f5_() {}
+  FivePointsNumericalDerivative(DerivableFirstOrder* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_(),
+    f3_(),
+    f4_(),
+    f5_() {}
+  FivePointsNumericalDerivative(DerivableSecondOrder* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_(),
+    f3_(),
+    f4_(),
+    f5_() {}
+  virtual ~FivePointsNumericalDerivative() {}
+
+  FivePointsNumericalDerivative* clone() const { return new FivePointsNumericalDerivative(*this); }
+
+public:
+  double getValue() const throw (Exception)
+  {
+    return f3_;
+  }
+
+  double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const
+  throw (Exception)
+  {
+    throw Exception("Unimplemented cross derivative.");
+  }
+
+protected:
+  void updateDerivatives(const ParameterList parameters)
+  throw (ParameterNotFoundException, ConstraintException);
+};
+} // end of namespace bpp.
+
+#endif // _FIVEPOINTSNUMERICALDERIVATIVE_H_
+
diff --git a/src/Bpp/Numeric/Function/FunctionTools.cpp b/src/Bpp/Numeric/Function/FunctionTools.cpp
new file mode 100644
index 0000000..fa16e5d
--- /dev/null
+++ b/src/Bpp/Numeric/Function/FunctionTools.cpp
@@ -0,0 +1,140 @@
+//
+// File: FunctionTools.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Apr 13 10:47 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "FunctionTools.h"
+#include "../../App/ApplicationTools.h"
+
+using namespace bpp;
+
+//From the STL;
+#include <algorithm>
+using namespace std;
+
+void ParameterGrid::addDimension(const std::string& name, const Vdouble& values) throw (Exception)
+{
+  if (find(names_.begin(), names_.end(), name) != names_.end()) throw Exception("ParameterGrid::addDimension(). A dimension with name '" + name + "' already exists in the grid.");
+  if (values.size() == 0) throw Exception("ParameterGrid::addDimension(). Empty vector given! The dimension should at least contain one point.");
+  names_.push_back(name);
+  grid_.push_back(values);
+}
+ 
+const Vdouble& ParameterGrid::getPointsForDimension(const std::string& name) const throw (Exception)
+{
+  for(unsigned int i = 0; i < names_.size(); i++)
+    if (names_[i] == name)
+      return grid_[i];
+  throw Exception("ParameterGrid::getPointsForDimension(). No dimension with name '" + name + "' was found in the grid.");
+}
+
+const Vdouble& ParameterGrid::getPointsForDimension(unsigned int i) const throw (IndexOutOfBoundsException)
+{
+  if (i >= names_.size()) throw IndexOutOfBoundsException("ParameterGrid::getPointsForDimension().", i, 0, names_.size() - 1);
+  return grid_[i];
+}
+
+size_t ParameterGrid::getTotalNumberOfPoints() const
+{
+  if (grid_.size() == 0) return 0;
+  size_t n = 1;
+  for (size_t i = 0; i < grid_.size(); i++)
+    n *= grid_[i].size();
+  return n;
+}
+
+VVdouble* FunctionTools::computeGrid(
+    Function& function,
+    const ParameterGrid& grid) throw (Exception)
+{
+  //Init stuff...
+  size_t n = grid.getNumberOfDimensions();
+  VVdouble* data = new VVdouble();
+  if(n == 0) return data; //Empty data table returned.
+
+  VVdouble points = grid.getPoints();
+
+  //Get the parameter list. this may throw an exception if the grid does not
+  //match the function parameters...
+  ParameterList pl = function.getParameters().subList(grid.getDimensionNames());
+  for(unsigned int i = 0; i < n; i++)
+    pl.setParameterValue(grid.getDimensionName(i), grid.getPointsForDimension(i)[0]);
+
+  //Iterate over all dimensions:
+  unsigned int currentDimension = 0;
+  vector<unsigned int> currentPointInDimension(n);
+  vector<double> row(n + 1);
+  size_t nbPoints = grid.getTotalNumberOfPoints();
+  ApplicationTools::displayMessage("Computing likelihood profile...");
+  for (unsigned int i = 0; true ; i++)
+  {
+    ApplicationTools::displayGauge(i, nbPoints - 1, '=');
+    //We start by adding the current point to the table:
+    for (unsigned int j = 0; j < n; j++)
+      row[j] = pl[j].getValue();
+    row[n] = function.f(pl);
+    data->push_back(row);
+
+    //Now increment iterator:
+    bool dimensionChanged = false;
+    while (currentDimension < n && currentPointInDimension[currentDimension] == points[currentDimension].size() - 1)
+    {
+      currentDimension++;
+      dimensionChanged = true;
+    }
+    //Stopping condition:
+    if (currentDimension == n) break;
+
+    currentPointInDimension[currentDimension]++;
+    if (dimensionChanged)
+    {
+      for (unsigned int j = 0; j < currentDimension; j++)
+        currentPointInDimension[j] = 0;
+      currentDimension = 0;
+    }
+   
+    //Set the new parameter value:
+    for (unsigned int j = 0; j < points.size(); j++)
+    {
+      pl.setParameterValue(grid.getDimensionName(j), points[j][currentPointInDimension[j]]);
+    }
+  }
+  ApplicationTools::displayMessage("\n");
+  //and we are done:
+  return data;
+}
+
diff --git a/src/Bpp/Numeric/Function/FunctionTools.h b/src/Bpp/Numeric/Function/FunctionTools.h
new file mode 100644
index 0000000..d406120
--- /dev/null
+++ b/src/Bpp/Numeric/Function/FunctionTools.h
@@ -0,0 +1,122 @@
+//
+// File: FunctionTools.h
+// Created by: Julien Dutheil
+// Created on: Mon Apr 13 10:00 2009
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FUNCTIONTOOLS_H_
+#define _FUNCTIONTOOLS_H_
+
+#include "Functions.h"
+#include "../VectorTools.h"
+
+namespace bpp
+{
+
+/**
+ * @brief This class is a data structure to specify a set of parameter values (most likely for evaluation by a Function)
+ *
+ * @see FunctionTools
+ */
+class ParameterGrid
+{
+  private:
+    std::vector<std::string> names_;
+    VVdouble grid_;
+
+  public:
+    ParameterGrid(): names_(), grid_() {}
+    virtual ~ParameterGrid() {}
+
+  public:
+    /**
+     * @brief Add a new dimension (parameter name + corresponding values).
+     *
+     * @param name The name of the dimension (parameter name).
+     * @param values The values the parameter will take.
+     * @throw Exception in case the dimension is note valid (duplicated parameter name for instance).
+     */
+    void addDimension(const std::string& name, const Vdouble& values) throw (Exception);
+
+    const std::vector<std::string>& getDimensionNames() const { return names_; }
+    
+    const std::string& getDimensionName(unsigned int i) const throw (IndexOutOfBoundsException)
+    {
+      if (i >= names_.size()) throw IndexOutOfBoundsException("ParameterGrid::getDimensionName().", i, 0, names_.size()-1);
+      return names_[i];
+    }
+
+    size_t getNumberOfDimensions() const { return names_.size(); }
+    
+    /**
+     * @return The total number of points in the grid, that is the product of all dimension sizes.
+     */
+    size_t getTotalNumberOfPoints() const;
+
+    const VVdouble& getPoints() const { return grid_; }
+    const Vdouble& getPointsForDimension(unsigned int i) const throw (IndexOutOfBoundsException);
+    const Vdouble& getPointsForDimension(const std::string& name) const throw (Exception);
+};
+
+/**
+ * @brief This class contains static methods to deal with Function objects.
+ */
+class FunctionTools
+{
+  public:
+    /**
+     * @brief Evaluates a function on all points in a given grid.
+     *
+     * @param function The function to use for the evaluation.
+     * @param grid     The grid defining the set of points to evaluate.
+     * @return A pointer toward a dynamically created vector of vector
+     * of doubles. Each row correpsonds to a combination of parameters
+     * and the corresponding function value. There is hence one column
+     * per parameter, and one additional column containing the
+     * corresponding function evaluations. When DataTable supports
+     * different column type, we will probably return a DataTable instead.
+     * @throw Exception If the parameter names in the grid do not match
+     * the ones in the function, or a constraint is matched, etc.
+     */
+    static VVdouble* computeGrid(
+        Function& function,
+        const ParameterGrid& grid) throw (Exception);
+};
+
+} //end of namespace bpp
+
+#endif //_FUNCTIONTOOLS_H_
+
diff --git a/src/Bpp/Numeric/Function/Functions.h b/src/Bpp/Numeric/Function/Functions.h
new file mode 100644
index 0000000..ed782c7
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Functions.h
@@ -0,0 +1,639 @@
+//
+// File: Functions.h
+// Created by: Julien Dutheil
+// Created on: Sun Nov  9 23:11:00 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FUNCTIONS_H_
+#define _FUNCTIONS_H_
+
+#include "../ParameterList.h"
+#include "../Parametrizable.h"
+#include "../AbstractParametrizable.h"
+#include "../ParameterExceptions.h"
+
+// From Utils:
+#include "../../Clonable.h"
+#include "../../Exceptions.h"
+
+// From the STL:
+#include <cmath>
+
+namespace bpp
+{
+
+/**
+ * @brief This is the function abstract class.
+ *
+ * This class provides the interface for function objet
+ * and a default implementation of the f() function.
+ *
+ * The f() function sends the value of the function according to a
+ * given set of parameters.
+ *
+ * However for complexe function like likelihood for instance,
+ * computing the function value takes some time, and one do not want
+ * to perform several times the computation for an identical set of 
+ * parameters.
+ * The setParameters() method hence allows to set the parameter value
+ * for which the function is to be computed, perform the computation
+ * and store the results.
+ * The getValue() methods send the result of the computation.
+ * One may hence access to the result of the computation by calling the
+ * getvalue() method without re-computating the function.
+ * The f(parameters) function is a shortcut for
+ * @code
+ * setParameters(parameters);
+ * return getValue();
+ * @endcode
+ * for convinience.
+ *
+ * @see Parameter, ParameterList
+ */
+class Function:
+  public virtual Parametrizable
+{    
+  public:
+    Function() {}
+    virtual ~Function() {}
+
+  public:
+
+    /**
+     * @brief Set the point where the function must be computed.
+     *
+     * @param parameters The parameter set to pass to the function.
+     */
+    virtual void setParameters(const ParameterList& parameters) throw (ParameterNotFoundException, ConstraintException, Exception) = 0;
+
+    /**
+     * @brief Get the value of the function at the current point.
+     *
+     * @return The value of the function.
+     * @throw Exception If no point is specified or if an error occured.
+     */
+    virtual double getValue() const throw (Exception) = 0;
+    
+    /**
+     * @brief Get the value of the function according to a given set of parameters.
+     * 
+     * @param parameters The parameter set to pass to the function.
+     * @return The value of the function with the given parameter set.
+     * @throw Exception If an error occured.
+     */
+    virtual double f(const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getValue();
+    }
+};
+
+/**
+ * @brief This is the abstract class for first order derivable functions.
+ *
+ * This class adds the getFirstOrderDerivative() and df() shortcut functions.
+ */
+class DerivableFirstOrder:
+  public virtual Function
+{
+ public:
+    DerivableFirstOrder() {}
+    virtual ~DerivableFirstOrder() {}
+
+    DerivableFirstOrder* clone() const = 0;
+
+  public:
+
+    /**
+     * @brief Tell if derivatives must be computed.
+     *
+     * @param yn yes/no
+     */
+    virtual void enableFirstOrderDerivatives(bool yn) = 0;
+    
+    /**
+     * @brief Tell if derivatives must be computed.
+     *
+     * @return yes/no
+     */
+    virtual bool enableFirstOrderDerivatives() const = 0;
+
+    /**
+     * @brief Get the derivative of the function at the current point.
+     *
+     * @param variable   The name of the @f$ x @f$ variable in @f$ \frac{df}{dx} @f$.
+     * @return The value of the function.
+     * @throw Exception If no point is specified or if an error occured.
+     */
+    virtual double getFirstOrderDerivative(const std::string& variable) const throw (Exception) = 0;
+    
+    /**
+     * @brief Get the value of the first derivative of the function
+     * according to a given set of parameters.
+     *
+     * @param variable   The name of the @f$ x @f$ variable in @f$ \frac{df}{dx} @f$.
+     * @param parameters The parameter set to pass to the function.
+     * @return The value of the function with the given parameter set.
+     * @throw Exception If an error occured.
+     */
+    virtual double df(const std::string& variable, const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getFirstOrderDerivative(variable);
+    }
+};
+
+/**
+ * @brief This is the abstract class for second order derivable functions.
+ * 
+ * This class adds the getSecondOrderDerivative() and d2f() shortcut functions.
+ * Cross derivative functions are also provided.
+ */
+class DerivableSecondOrder:
+  public virtual DerivableFirstOrder
+{
+  public:
+    DerivableSecondOrder() {}
+    virtual ~DerivableSecondOrder() {}
+
+    DerivableSecondOrder* clone() const = 0;
+
+  public:
+
+    /**
+     * @brief Tell if derivatives must be computed.
+     *
+     * @param yn yes/no
+     */
+    virtual void enableSecondOrderDerivatives(bool yn) = 0;
+    
+    /**
+     * @brief Tell if derivatives must be computed.
+     *
+     * @return yes/no
+     */
+    virtual bool enableSecondOrderDerivatives() const = 0;
+
+    /**
+     * @brief Get the second order derivative of the function at the current point.
+     *
+     * @param variable   The name of the @f$ x @f$ variable in @f$ \frac{\partial^2 f}{\partial x^2} @f$.
+     * @return The value of the function.
+     * @throw Exception If no point is specified or if an error occured.
+     */
+    virtual double getSecondOrderDerivative(const std::string& variable) const throw (Exception) = 0;
+  
+    /**
+     * @brief Get the value of the second order derivative of the function
+     * according to a given set of parameters.
+     *
+     * @param variable   The name of the @f$ x @f$ variable in @f$ \frac{\partial^2 f}{\partial x^2} @f$.
+     * @param parameters The parameter set to pass to the function.
+     * @return The value of the function with the given parameter set.
+     * @throw Exception If an error occured.
+     */
+    virtual double d2f(const std::string& variable, const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getSecondOrderDerivative(variable);
+    }    
+
+    /**
+     * @brief Get the value of the cross derivative of the function
+     * according to a given set of parameters.
+     *
+     * @param variable1  The name of the @f$ x @f$ variable in @f$ \frac{\partial^2 f}{\partial x \partial y} @f$.
+     * @param variable2  The name of the @f$ y @f$ variable in @f$ \frac{\partial^2 f}{\partial x \partial y} @f$.
+     * @return The value of the function with the given parameter set.
+     * @throw Exception If an error occured.
+     */
+    virtual double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const throw (Exception) = 0;  
+    
+    /**
+     * @brief Get the value of the cross derivative of the function
+     * according to a given set of parameters.
+     *
+     * @param variable1  The name of the @f$ x @f$ variable in @f$ \frac{\partial^2 f}{\partial x \partial y} @f$.
+     * @param variable2  The name of the @f$ y @f$ variable in @f$ \frac{\partial^2 f}{\partial x \partial y} @f$.
+     * @param parameters The parameter set to pass to the function.
+     * @return The value of the function with the given parameter set.
+     * @throw Exception If an error occured.
+     */
+    virtual double d2f(const std::string& variable1, const std::string& variable2, const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getSecondOrderDerivative(variable1, variable2);
+    }
+};
+
+/**
+ * @brief General class that wraps a function into another one.
+ * This class is meant to be derivated and just provides a general framework.
+ */
+class FunctionWrapper:
+  public virtual Function
+{
+  protected:
+    Function* function_;
+
+  public:
+    FunctionWrapper(Function* function) : function_(function) {}
+    FunctionWrapper(const FunctionWrapper& fw) : function_(fw.function_) {}
+    FunctionWrapper& operator=(const FunctionWrapper& fw)
+    {
+      function_ = fw.function_;
+      return *this;
+    }
+
+  public:
+    bool hasParameter(const std::string& name) const
+    {
+      return function_->hasParameter(name);
+    }
+
+    void setParameters(const ParameterList & parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setParameters(parameters);
+    }
+
+    const ParameterList& getParameters() const throw (Exception)
+    {
+      return function_->getParameters();  
+    }
+
+    const Parameter& getParameter(const std::string & name) const throw (ParameterNotFoundException)
+    {
+      return function_->getParameter(name);
+    }
+
+    double getValue() const throw (Exception)
+    {
+      return function_->getValue();
+    }
+    
+    double f(const ParameterList& parameters) throw (Exception)
+    {
+      return function_->f(parameters);
+    }
+    
+    double getParameterValue(const std::string& name) const throw (ParameterNotFoundException)
+    {
+      return function_->getParameterValue(name);
+    }
+      
+    void setAllParametersValues(const ParameterList & parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setAllParametersValues(parameters);
+    }
+    
+    void setParameterValue(const std::string& name, double value)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setParameterValue(name, value);
+    }
+    
+    void setParametersValues(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      function_->setParametersValues(parameters);
+    }
+    
+    bool matchParametersValues(const ParameterList& parameters)
+      throw (ConstraintException)
+    {
+      return function_->matchParametersValues(parameters);
+    }
+
+    size_t getNumberOfParameters() const
+    {
+      return function_->getNumberOfParameters();
+    }
+
+    void setNamespace(const std::string& prefix)
+    {
+      function_->setNamespace(prefix);
+    }
+
+    std::string getNamespace() const
+    {
+      return function_->getNamespace();
+    }
+
+    std::string getParameterNameWithoutNamespace(const std::string& name) const
+    {
+      return function_->getParameterNameWithoutNamespace(name);
+    }
+
+};
+
+
+
+/**
+ * @brief General class that wraps a function into another one.
+ * This class is meant to be derivated and just provides a general framework.
+ */
+class DerivableFirstOrderWrapper:
+  public FunctionWrapper,
+  public virtual DerivableFirstOrder
+{
+  public:
+    DerivableFirstOrderWrapper(DerivableFirstOrder* function) : FunctionWrapper(function) {}
+
+  public:
+    void enableFirstOrderDerivatives(bool yn) {
+      dynamic_cast<DerivableFirstOrder*>(function_)->enableFirstOrderDerivatives(yn);
+    }
+    
+    bool enableFirstOrderDerivatives() const {
+      return dynamic_cast<DerivableFirstOrder*>(function_)->enableFirstOrderDerivatives();
+    }
+
+    double getFirstOrderDerivative(const std::string& variable) const throw (Exception) {
+      return dynamic_cast<DerivableFirstOrder*>(function_)->getFirstOrderDerivative(variable);
+    }
+
+};
+
+
+
+/**
+ * @brief General class that wraps a function into another one.
+ * This class is meant to be derivated and just provides a general framework.
+ */
+class DerivableSecondOrderWrapper:
+  public DerivableFirstOrderWrapper,
+  public virtual DerivableSecondOrder
+{
+  public:
+    DerivableSecondOrderWrapper(DerivableSecondOrder* function) : DerivableFirstOrderWrapper(function) {}
+
+  public:
+    void enableSecondOrderDerivatives(bool yn) {
+      dynamic_cast<DerivableSecondOrder*>(function_)->enableSecondOrderDerivatives(yn);
+    }
+    
+    bool enableSecondOrderDerivatives() const {
+      return dynamic_cast<DerivableSecondOrder*>(function_)->enableSecondOrderDerivatives();
+    }
+
+    double getSecondOrderDerivative(const std::string& variable) const throw (Exception) {
+      return dynamic_cast<DerivableSecondOrder*>(function_)->getSecondOrderDerivative(variable);
+    }
+
+    double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const throw (Exception) {
+      return dynamic_cast<DerivableSecondOrder*>(function_)->getSecondOrderDerivative(variable1, variable2);
+    }
+
+};
+
+
+
+/**
+ * @brief Wrapper class for optimization under constraints.
+ *
+ * Catch any ConstraintException thrown and send +inf.
+ */
+class InfinityFunctionWrapper:
+  public FunctionWrapper
+{
+  protected:
+    mutable bool constraintMatch_;
+    
+  public:
+    InfinityFunctionWrapper(Function* function) :
+      FunctionWrapper(function),
+      constraintMatch_(false) {}
+    virtual ~InfinityFunctionWrapper() {}
+
+    InfinityFunctionWrapper* clone() const { return new InfinityFunctionWrapper(*this); }
+
+  public:
+
+    void setParameters(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      try
+      {
+        function_->setParameters(parameters);
+        constraintMatch_ = false;
+      }
+      catch(ConstraintException& ce)
+      {
+        constraintMatch_ = true;
+      }
+    }
+
+    double getValue() const throw (Exception)
+    {
+      return constraintMatch_ ? -log(0.) :  function_->getValue();
+    }
+    
+    double f(const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getValue();
+    }
+          
+    void setAllParametersValues(const ParameterList & parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      try
+      {
+        function_->setAllParametersValues(parameters);
+        constraintMatch_ = false;
+      }
+      catch(ConstraintException& ce)
+      {
+        constraintMatch_ = true;
+      }
+    }
+    
+    void setParameterValue(const std::string& name, double value)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      try
+      {
+        function_->setParameterValue(name, value);
+        constraintMatch_ = false;
+      }
+      catch(ConstraintException& ce)
+      {
+        constraintMatch_ = true;
+      }
+    }
+    
+    void setParametersValues(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+      try
+      {
+        function_->setParametersValues(parameters);
+        constraintMatch_ = false;
+      }
+      catch(ConstraintException& ce)
+      {
+        constraintMatch_ = true;
+      }
+    }
+    
+    bool matchParametersValues(const ParameterList& parameters)
+      throw (ConstraintException)
+    {
+      try
+      {
+        bool test = function_->matchParametersValues(parameters);
+        constraintMatch_ = false;
+        return test;
+      }
+      catch (ConstraintException& ce)
+      {
+        constraintMatch_ = true;
+        return false;
+      }
+    }
+
+};
+
+/**
+ * @brief Wrapper class for optimization under constraints.
+ *
+ * Catch any ConstraintException thrown and send +inf.
+ */
+class InfinityDerivableFirstOrderWrapper :
+  public virtual InfinityFunctionWrapper
+{
+  public:
+    InfinityDerivableFirstOrderWrapper(DerivableFirstOrder* function) : InfinityFunctionWrapper(function) {}
+    virtual ~InfinityDerivableFirstOrderWrapper() {}
+    
+    InfinityDerivableFirstOrderWrapper* clone() const { return new InfinityDerivableFirstOrderWrapper(*this); }
+
+  public:
+    
+    double getFirstOrderDerivative(const std::string& variable) const throw (Exception)
+    {
+      return constraintMatch_ ? -log(0.) :  (dynamic_cast<DerivableFirstOrder *>(function_)->getFirstOrderDerivative(variable));    
+    }
+    
+    double df(const std::string& variable, const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getFirstOrderDerivative(variable);
+    }
+};
+
+/**
+ * @brief Wrapper class for optimization under constraints.
+ *
+ * Catch any ConstraintException thrown and send +inf.
+ */
+class InfinityDerivableSecondOrderWrapper :
+  public virtual InfinityDerivableFirstOrderWrapper
+{
+  public:
+    InfinityDerivableSecondOrderWrapper(DerivableFirstOrder* function):
+      InfinityFunctionWrapper(function),
+      InfinityDerivableFirstOrderWrapper(function) {}
+    virtual ~InfinityDerivableSecondOrderWrapper() {}
+
+    InfinityDerivableSecondOrderWrapper* clone() const { return new InfinityDerivableSecondOrderWrapper(*this); }
+
+  public:
+
+    double getSecondOrderDerivative(const std::string& variable) const throw (Exception)
+    {
+      return constraintMatch_ ? -log(0.) :  (dynamic_cast<DerivableSecondOrder *>(function_)->getSecondOrderDerivative(variable));          
+    }
+  
+    double d2f(const std::string & variable, const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getSecondOrderDerivative(variable);
+    }    
+
+    double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const throw (Exception)
+    {
+      return constraintMatch_ ? -log(0.) :  (dynamic_cast<DerivableSecondOrder *>(function_)->getSecondOrderDerivative(variable1, variable2));      
+    }
+    
+    double d2f(const std::string & variable1, const std::string& variable2, const ParameterList& parameters) throw (Exception)
+    {
+      setParameters(parameters);
+      return getSecondOrderDerivative(variable1, variable2);
+    }
+};
+
+
+/**
+ * @brief A simple funciton with two parameters, mostly for testing and debugging :)
+ *
+ * @author Julien Dutheil.
+ */
+class TestFunction :
+  public virtual Function,
+  public AbstractParametrizable
+{
+  public:
+    TestFunction(double x = 0, double y = 0) :
+      AbstractParametrizable("")
+    {
+      addParameter_(new Parameter("x", x));
+      addParameter_(new Parameter("y", y));
+    }
+
+    Clonable* clone() const { return new TestFunction(*this); }
+
+    void setParameters(const ParameterList& parameters) throw (Exception) 
+    {
+      matchParametersValues(parameters);
+    }
+
+    double getValue() const throw (Exception)
+    {
+      double x = getParameter("x").getValue();
+      double y = getParameter("y").getValue();
+      return (x*x + y*y);
+    }
+
+    void fireParameterChanged(const ParameterList& parameters) {}
+};
+
+} //end of namespace bpp.
+
+#endif  //_FUNCTIONS_H_
+
diff --git a/src/Bpp/Numeric/Function/GoldenSectionSearch.cpp b/src/Bpp/Numeric/Function/GoldenSectionSearch.cpp
new file mode 100644
index 0000000..5ef7070
--- /dev/null
+++ b/src/Bpp/Numeric/Function/GoldenSectionSearch.cpp
@@ -0,0 +1,174 @@
+//
+// File: GoldenSectionSearch.cpp
+// Created by: Julien Dutheil 
+// Created on: Mon Nov 10 10:42:17 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "GoldenSectionSearch.h"
+#include "OneDimensionOptimizationTools.h"
+#include "../NumTools.h"
+#include "../NumConstants.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+bool GoldenSectionSearch::GSSStopCondition::isToleranceReached() const
+{
+  callCount_++;
+  if (callCount_ <= burnin_) return false;
+  return getTolerance() <= tolerance_;
+}
+    
+/******************************************************************************/
+
+double GoldenSectionSearch::GSSStopCondition::getCurrentTolerance() const
+{
+  // NRC Test for done:
+  const GoldenSectionSearch* gss = dynamic_cast<const GoldenSectionSearch*>(optimizer_);
+  return NumTools::abs(gss->x3 - gss->x0) / (NumTools::abs(gss->x1) + NumTools::abs(gss->x2));
+}
+  
+/******************************************************************************/
+
+GoldenSectionSearch::GoldenSectionSearch(Function* function) :
+  AbstractOptimizer(function),
+  f1(0), f2(0), x0(0), x1(0), x2(0), x3(0), xinf_(0), xsup_(0), isInitialIntervalSet_(false)
+{
+  nbEvalMax_ = 10000;
+  setDefaultStopCondition_(new GSSStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+}
+
+/******************************************************************************/
+
+void GoldenSectionSearch::doInit(const ParameterList& params) throw (Exception)
+{
+  // Set the initial value (no use here! Use setInitialValues() instead).
+  if(params.size() != 1) throw Exception("GoldenSectionSearch::init(). This optimizer only deals with one parameter.");
+
+  // Bracket the minimum.
+  Bracket bracket = OneDimensionOptimizationTools::bracketMinimum(xinf_, xsup_, getFunction(), getParameters());
+  if (getVerbose() > 0)
+  {
+    printMessage("Initial bracketing:");
+    printMessage("A: x = " + TextTools::toString(bracket.a.x) + ", f = " + TextTools::toString(bracket.a.f));
+    printMessage("B: x = " + TextTools::toString(bracket.b.x) + ", f = " + TextTools::toString(bracket.b.f));
+    printMessage("C: x = " + TextTools::toString(bracket.c.x) + ", f = " + TextTools::toString(bracket.c.f));
+  }
+  
+  // At any given time we will keep track of four points, x0, x1, x2 and x3.
+  x0 = bracket.a.x;
+  x3 = bracket.c.x;
+  if (NumTools::abs(bracket.c.x - bracket.b.x)
+      > NumTools::abs(bracket.b.x - bracket.a.x))
+  {
+    // Make x0 to x1 the smaller segment,
+    x1 = bracket.b.x;
+    // and fill in the new point to be tried.
+    x2 = bracket.b.x + NumConstants::GOLDEN_RATIO_C() * (bracket.c.x - bracket.b.x);
+  }
+  else
+  {
+    x2 = bracket.b.x;
+    x1 = bracket.b.x - NumConstants::GOLDEN_RATIO_C() * (bracket.b.x - bracket.a.x);
+  }
+  // The initial function evaluations.
+  // Note that we never need to evaluate the function at the original endpoints.
+  getParameter_(0).setValue(x1); f1 = getFunction()->f(getParameters());
+  getParameter_(0).setValue(x2); f2 = getFunction()->f(getParameters());
+}
+
+/******************************************************************************/
+
+void GoldenSectionSearch::setInitialInterval(double inf, double sup)
+{
+  if(sup > inf)
+  {
+    xinf_ = inf; xsup_ = sup;
+  }
+  else
+  {
+    xinf_ = sup; xsup_ = inf;
+  }
+  isInitialIntervalSet_ = true;
+}
+
+/******************************************************************************/
+
+double GoldenSectionSearch::doStep() throw (Exception)
+{
+  if (!isInitialIntervalSet_) throw Exception("GoldenSectionSearch::step. Initial interval not set: call the 'setInitialInterval' method first!");
+  
+  nbEval_++;
+
+  if (f2 < f1)
+  {
+    // One possible outcome, its housekeeping,
+    NumTools::shift<double>(x0, x1, x2);
+    x2 = NumConstants::GOLDEN_RATIO_R() * x1 + NumConstants::GOLDEN_RATIO_C() * x3;
+    // and a new function evaluation.
+    getParameter_(0).setValue(x2);
+    tolIsReached_ = nbEval_ > 2 && getStopCondition()->isToleranceReached();
+    NumTools::shift<double>(f1, f2, getFunction()->f(getParameters()));
+    return f2;
+  }
+  else
+  {
+    // The other outcome,
+    NumTools::shift<double>(x3, x2, x1);
+    x1 = NumConstants::GOLDEN_RATIO_R() * x2 + NumConstants::GOLDEN_RATIO_C() * x0;
+    // and its new function evaluation.
+    getParameter_(0).setValue(x1);
+    tolIsReached_ = nbEval_ > 2 && getStopCondition()->isToleranceReached();
+    NumTools::shift<double>(f2, f1, getFunction()->f(getParameters()));
+    return f1;
+  }
+}
+
+/******************************************************************************/
+
+double GoldenSectionSearch::getFunctionValue() const throw (NullPointerException)
+{
+  if (!hasFunction())
+    throw NullPointerException("GoldenSectionSearch::getFunctionValue. No function associated to this optimizer.");
+  //return NumTools::min(f1, f2); 
+  return currentValue_; 
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/GoldenSectionSearch.h b/src/Bpp/Numeric/Function/GoldenSectionSearch.h
new file mode 100644
index 0000000..be3ae33
--- /dev/null
+++ b/src/Bpp/Numeric/Function/GoldenSectionSearch.h
@@ -0,0 +1,145 @@
+//
+// File: GoldenSectionSearch.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 10 10:42:17 2003
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _GOLDENSECTIONSEARCH_H_
+#define _GOLDENSECTIONSEARCH_H_
+
+#include "AbstractOptimizer.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Golden Section Search optimization algorithm for one parameter.
+ *
+ * A description of the algorithm can be found in:
+ * <pre>
+ * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+ * (ISBN 0-521-43108-5)
+ * </pre>
+ * or there:
+ * <a href="http://en.wikipedia.org/wiki/Golden_section_search">http://en.wikipedia.org/wiki/Golden_section_search</a>.
+ */
+class GoldenSectionSearch:
+  public AbstractOptimizer
+{	
+	public:
+		class GSSStopCondition:
+      public AbstractOptimizationStopCondition
+		{
+			public:
+				GSSStopCondition(GoldenSectionSearch* gss):
+          AbstractOptimizationStopCondition(gss) {}
+				virtual ~GSSStopCondition() {}
+
+        GSSStopCondition* clone() const { return new GSSStopCondition(*this); }
+			
+			public:
+				bool isToleranceReached() const;
+        double getCurrentTolerance() const;
+		};
+	
+	friend class GSSStopCondition;
+
+	private:
+		double f1, f2, x0, x1, x2, x3;
+		double xinf_, xsup_;
+    bool isInitialIntervalSet_;
+	
+	public:
+		
+		GoldenSectionSearch(Function* function);
+		virtual ~GoldenSectionSearch() {}
+
+    GoldenSectionSearch* clone() const { return new GoldenSectionSearch(*this); }
+	
+	public:
+		
+		/**
+		 * @name The Optimizer interface.
+		 *
+		 * @{
+		 */
+		
+		/**
+		 * @brief Initialize optimizer.
+		 *
+		 * The golden section search needs 2 initial guesses, so you must call the
+		 * setInitialInterval() method first. This function actually performs:
+		 * <ul>
+		 * <li>Parameter list actualisation;</li>
+		 * <li>Initial bracketting;</li>
+		 * <li>Function evaluation count reseting.</li>
+		 * </ul>
+		 */
+		double getFunctionValue() const throw (NullPointerException);
+		/** @} */
+		
+    void doInit(const ParameterList & params) throw (Exception);
+
+		double doStep() throw (Exception);
+	
+		/**
+		 * @name Specific method
+		 *
+		 * @{
+		 */
+		
+		/**
+		 * @brief Set intial search interval.
+		 *
+		 * @param inf Minimum value.
+		 * @param sup Maximum value.
+		 */
+		void setInitialInterval(double inf, double sup);
+		/** @} */
+
+    /**
+     * @return 'true' if the initial interval has been correctly set.
+     */
+    bool isInitialIntervalSet() const { return isInitialIntervalSet_; }
+
+  protected:
+		
+};
+
+} //end of namespace bpp.
+
+#endif	//_GOLDENSECTIONSEARCH_H_
+
diff --git a/src/Bpp/Numeric/Function/MetaOptimizer.cpp b/src/Bpp/Numeric/Function/MetaOptimizer.cpp
new file mode 100644
index 0000000..6dad184
--- /dev/null
+++ b/src/Bpp/Numeric/Function/MetaOptimizer.cpp
@@ -0,0 +1,208 @@
+//
+// File: MetaOptimizer.cpp
+// Created by: Julien Dutheil
+// Created on: Fri Oct 12 16:05 2007
+// From file: NewtonBrentMetaOptimizer.cpp
+// Created on: Tue Nov 17 17:22 2004
+// 
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+/**************************************************************************/
+
+#include "MetaOptimizer.h"
+#include "../../App/ApplicationTools.h"
+
+using namespace bpp;
+using namespace std;
+
+/**************************************************************************/
+
+string MetaOptimizerInfos::IT_TYPE_STEP = "step";
+string MetaOptimizerInfos::IT_TYPE_FULL = "full";
+
+/**************************************************************************/
+
+MetaOptimizer::MetaOptimizer(
+    Function* function,
+    MetaOptimizerInfos* desc,
+    unsigned int n):
+  AbstractOptimizer(function),
+  optDesc_(desc), optParameters_(desc->getNumberOfOptimizers()),
+  nbParameters_(desc->getNumberOfOptimizers()), n_(n),
+  precisionStep_(-1.), stepCount_(0), initialValue_(-1.)
+{
+  setDefaultStopCondition_(new FunctionStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  precisionStep_ = log10(getStopCondition()->getTolerance()) / n_;
+  setOptimizationProgressCharacter("");
+}
+
+/**************************************************************************/
+
+MetaOptimizer::MetaOptimizer(
+    const MetaOptimizer& opt):
+  AbstractOptimizer(opt),
+  optDesc_(dynamic_cast<MetaOptimizerInfos *>(opt.optDesc_->clone())),
+  optParameters_(opt.optParameters_),
+  nbParameters_(opt.nbParameters_),
+  n_(opt.n_),
+  precisionStep_(opt.precisionStep_),
+  stepCount_(opt.stepCount_),
+  initialValue_(opt.initialValue_)
+{}
+
+/**************************************************************************/
+
+MetaOptimizer& MetaOptimizer::operator=(
+    const MetaOptimizer& opt)
+{
+  AbstractOptimizer::operator=(opt);
+  optDesc_       = dynamic_cast<MetaOptimizerInfos *>(opt.optDesc_->clone());
+  optParameters_ = opt.optParameters_;
+  nbParameters_  = opt.nbParameters_;
+  n_             = opt.n_;
+  precisionStep_ = opt.precisionStep_;
+  stepCount_     = opt.stepCount_;
+  initialValue_  = opt.initialValue_;
+  return *this;
+}
+
+/**************************************************************************/
+
+MetaOptimizer::~MetaOptimizer()
+{
+  // Delete all optimizers:
+  delete optDesc_;
+}
+
+/**************************************************************************/
+
+void MetaOptimizer::doInit(const ParameterList& parameters)
+  throw (Exception)
+{
+  optParameters_.resize(optDesc_->getNumberOfOptimizers());
+  for (unsigned int i = 0; i < optDesc_->getNumberOfOptimizers(); i++)
+  {
+    optParameters_[i].reset();
+    for (size_t j = 0; j < optDesc_->getParameterNames(i).size(); j++)
+    {
+      string pname = optDesc_->getParameterNames(i)[j];
+      if (parameters.hasParameter(pname))
+      {
+        optParameters_[i].addParameter(parameters.getParameter(pname));
+      }
+    }
+    nbParameters_[i] = optParameters_[i].size();
+  }
+
+  // Initialize optimizers:
+  for (unsigned int i = 0; i < optDesc_->getNumberOfOptimizers(); i++)
+  {
+    if (nbParameters_[i] > 0)
+    {
+      Optimizer * opt = optDesc_->getOptimizer(i);
+      dynamic_cast<AbstractOptimizer*>(opt)->updateParameters(updateParameters());
+      opt->setProfiler(getProfiler());
+      opt->setMessageHandler(getMessageHandler());
+      opt->setConstraintPolicy(getConstraintPolicy());
+      opt->setVerbose(getVerbose() > 0 ? getVerbose() - 1 : 0);
+    }
+  }
+  
+  // Actualize parameters:
+  getParameters_().matchParametersValues(getFunction()->getParameters());
+  
+  getFunction()->setParameters(getParameters());
+  initialValue_ = getFunction()->getValue();
+  // Reset counter:
+  stepCount_ = 1;
+  // Recompute step if precision has changed:
+  precisionStep_ = (log10(getStopCondition()->getTolerance()) - log10(initialValue_)) / n_;
+}
+
+/**************************************************************************/
+
+double MetaOptimizer::doStep() throw (Exception)
+{
+  stepCount_++;
+  
+  int tolTest = 0;
+  double tol = getStopCondition()->getTolerance();
+  if (stepCount_ <= n_)
+  {
+    tol = initialValue_ * pow(10, stepCount_ * precisionStep_);
+  }
+  
+  for (unsigned int i = 0; i < optDesc_->getNumberOfOptimizers(); i++)
+  {
+    if (nbParameters_[i] > 0)
+    {
+      if (getVerbose() > 1 && ApplicationTools::message)
+      {
+        (ApplicationTools::message->endLine() << optDesc_->getName(i)).endLine();
+        ApplicationTools::message->flush();
+      }
+      if (optDesc_->requiresFirstOrderDerivatives(i))
+        dynamic_cast<DerivableFirstOrder*>(getFunction())->enableFirstOrderDerivatives(true);
+      if (optDesc_->requiresSecondOrderDerivatives(i))  
+        dynamic_cast<DerivableSecondOrder*>(getFunction())->enableSecondOrderDerivatives(true);
+
+      optParameters_[i].matchParametersValues(getParameters());
+      Optimizer * opt = optDesc_->getOptimizer(i);
+      opt->getStopCondition()->setTolerance(tol);
+      opt->init(optParameters_[i]);
+      if (optDesc_->getIterationType(i) == MetaOptimizerInfos::IT_TYPE_STEP)
+        opt->step();
+      else if (optDesc_->getIterationType(i) == MetaOptimizerInfos::IT_TYPE_FULL)
+        opt->optimize();
+      else throw Exception("MetaOptimizer::step. Unknown iteration type specified.");
+      nbEval_ += opt->getNumberOfEvaluations();
+      if (optDesc_->requiresFirstOrderDerivatives(i))
+        dynamic_cast<DerivableFirstOrder*>(getFunction())->enableFirstOrderDerivatives(false);
+      if (optDesc_->requiresSecondOrderDerivatives(i))  
+        dynamic_cast<DerivableSecondOrder*>(getFunction())->enableSecondOrderDerivatives(false);
+      if (getVerbose() > 1) cout << endl;
+      getParameters_().matchParametersValues(opt->getParameters());
+    }
+    tolTest += nbParameters_[i] > 0 ? 1 : 0;
+  }
+  tolIsReached_ = (tolTest == 1);
+   
+  return getFunction()->getValue();
+}
+
+/**************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/MetaOptimizer.h b/src/Bpp/Numeric/Function/MetaOptimizer.h
new file mode 100644
index 0000000..6c50d70
--- /dev/null
+++ b/src/Bpp/Numeric/Function/MetaOptimizer.h
@@ -0,0 +1,246 @@
+//
+// File: MetaOptimizer.h
+// Created by: Julien Dutheil
+// Created on: Fri Oct 12 16:05 2007
+// From file: NewtonBrentMetaOptimizer.h
+// Created on: Tue Nov 17 17:22 2004
+// 
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef METAOPTIMIZER_H__
+#define METAOPTIMIZER_H__
+
+#include "AbstractOptimizer.h"
+
+// From the STL:
+#include <vector>
+
+namespace bpp
+{
+
+  /**
+   * @brief Provide a list of optimizer and corresponding options to be used with the MetaOptimizer class.
+   */
+  class MetaOptimizerInfos:
+    public virtual Clonable
+  {
+  public:
+    static std::string IT_TYPE_STEP;
+    static std::string IT_TYPE_FULL;
+
+  private:
+    std::vector<std::string> names_;
+    std::vector<Optimizer*> optimizers_;
+    std::vector< std::vector<std::string> > parameterNames_;
+    std::vector<unsigned short> derivatives_;
+    std::vector<std::string> itTypes_;
+
+  public:
+    MetaOptimizerInfos() : names_(), optimizers_(), parameterNames_(), derivatives_(), itTypes_() {}
+    MetaOptimizerInfos(const MetaOptimizerInfos& infos) :
+      names_(infos.names_),
+      optimizers_(infos.optimizers_),
+      parameterNames_(infos.parameterNames_),
+      derivatives_(infos.derivatives_),
+      itTypes_(infos.itTypes_)
+    {
+      for (unsigned int i = 0; i < optimizers_.size(); i++)
+        optimizers_[i] = dynamic_cast<Optimizer*>(infos.optimizers_[i]->clone());
+    }
+
+    MetaOptimizerInfos& operator=(const MetaOptimizerInfos& infos)
+    {
+      names_          = infos.names_;
+      optimizers_     = infos.optimizers_;
+      parameterNames_ = infos.parameterNames_;
+      derivatives_    = infos.derivatives_;
+      itTypes_        = infos.itTypes_;
+      for (unsigned int i = 0; i < optimizers_.size(); i++)
+        optimizers_[i] = dynamic_cast<Optimizer *>(infos.optimizers_[i]->clone());
+      return *this;
+    }
+
+    virtual ~MetaOptimizerInfos()
+    {
+      for(unsigned int i = 0; i < optimizers_.size(); i++)
+        delete optimizers_[i];
+    }
+
+  public:
+    MetaOptimizerInfos* clone() const { return new MetaOptimizerInfos(*this); }
+
+  public:
+    /**
+     * @brief Add a new optimizer to the set.
+     *
+     * @param name the name of the optimizer. It is used for display only.
+     * @param optimizer A pointer toward the optimizer to add. The set will own the underlying object, which will be destroyed together with the set.
+     * @param params A list of parameter names to optimize with this optimizer.
+     * @param derivatives 0, 1 or 2: does this parameter use no, first order or second order derivatives?
+     * @param type For each optimization step, shall we perform a full optimization with this optimizer or only one step?
+     */
+    virtual void addOptimizer(const std::string & name, Optimizer * optimizer, const std::vector<std::string> & params, unsigned short derivatives = 0, const std::string & type = IT_TYPE_STEP)
+    {
+      names_.push_back(name);
+      optimizers_.push_back(optimizer);
+      parameterNames_.push_back(params);
+      derivatives_.push_back(derivatives);
+      itTypes_.push_back(type);
+    }
+
+    /**
+     * @return The display name of the ith optimizer in the set.
+     */
+    virtual const std::string& getName(size_t i) const { return names_[i]; }
+    
+    /**
+     * @return The ith optimizer in the set.
+     */
+    virtual Optimizer* getOptimizer(size_t i) { return optimizers_[i]; }
+    /**
+     * @return The ith optimizer in the set.
+     */
+    virtual const Optimizer* getOptimizer(size_t i) const { return optimizers_[i]; }
+
+    /**
+     * @return The parameter names associated to the ith optimizer in the set.
+     */
+    virtual std::vector<std::string>& getParameterNames(size_t i) { return parameterNames_[i]; }
+    /**
+     * @return The parameter names associated to the ith optimizer in the set.
+     */
+    virtual const std::vector<std::string>& getParameterNames(size_t i) const { return parameterNames_[i]; }
+
+    /**
+     * @return The type of iteration to perform for the ith optimizer in the set.
+     */
+    virtual std::string& getIterationType(size_t i) { return itTypes_[i]; }
+    /**
+     * @return The type of iteration to perform for the ith optimizer in the set.
+     */
+    virtual const std::string& getIterationType(size_t i) const { return itTypes_[i]; }
+
+    /**
+     * @return True if the ith optimizer in the set requires first order derivatives.
+     */
+    virtual bool requiresFirstOrderDerivatives(size_t i) const { return derivatives_[i] > 0; }  
+    /**
+     * @return True if the ith optimizer in the set requires second order derivatives.
+     */
+    virtual bool requiresSecondOrderDerivatives(size_t i) const { return derivatives_[i] > 1; }  
+
+    /**
+     * @return The number of optimizers in the set.
+     */
+    virtual size_t getNumberOfOptimizers() const { return optimizers_.size(); }
+  };
+
+  /**
+   * @brief Meta-optimizer.
+   *
+   * This optimizer uses a set of optimizers to applyied sequentially on distinct parameters.
+   * The set of optimizers is fully specified by a MetaOptimizerInfos object.
+   * 
+   * To decrease the optimization time, the precision of the optimizers can be increased progressively:
+   * if @f$\varepsilon at f$ is the final precision required, one may consider using a precision increment of @f$\sigma=\log_10(\varepsilon/n)@f$, where @f$n at f$ is the number of progressive steps.
+   * During the first step optimization step, the precisions of type 1 and 2 optimizers are set to @f$10^{\sigma}@f$, @f$10^{2\sigma}@f$ for step 2, ... until precision @f$10^{n\sigma}=\varepsilon at f$ at step @f$n at f$ and later.
+   * This saves some time spending in the first steps of the estimation.
+   * The number of steps @f$n at f$ is set in the constructor of the optimizer.
+   *
+   * This optimizer can be used with numerical derivatives.
+   * 
+   * @see MetaOptimizerInfos.
+   */
+  class MetaOptimizer:
+    public AbstractOptimizer
+  {
+  private:
+    MetaOptimizerInfos* optDesc_;
+    std::vector<ParameterList> optParameters_;
+    std::vector<size_t> nbParameters_;
+    unsigned int n_;
+    double precisionStep_;
+    unsigned int stepCount_;
+    double initialValue_;
+		
+  public:
+    /**
+     * @brief Build a new MetaOptimizer object.
+     *
+     * @param function The function to be optimized.
+     * @param desc     A MetaOptimizerInfos object describing the optimizers to use.
+     *                 The optimizer will own the instance of the MetaOptimizerInfos object.
+     * @param n        The number of progressive steps to use in optimization).
+     */
+    MetaOptimizer(Function* function, MetaOptimizerInfos* desc, unsigned int n = 1);
+
+    virtual ~MetaOptimizer();
+
+    MetaOptimizer(const MetaOptimizer& opt);
+
+    MetaOptimizer& operator=(const MetaOptimizer& opt);
+
+    MetaOptimizer* clone() const { return new MetaOptimizer(*this); }
+
+  public:
+		
+    void setFunction(Function* function)
+    { 
+      AbstractOptimizer::setFunction(function);
+      for(unsigned int i = 0; i < optDesc_->getNumberOfOptimizers(); i++)
+        optDesc_->getOptimizer(i)->setFunction(function);
+    }
+
+    void doInit(const ParameterList& parameters) throw (Exception);
+    
+    double doStep() throw (Exception);
+
+    /**
+     * @return The MetaOptimizerInfos object associated to this optimizer.
+     */
+    MetaOptimizerInfos* getOptimizers() { return optDesc_; }
+    
+    /**
+     * @return The MetaOptimizerInfos object associated to this optimizer.
+     */
+    const MetaOptimizerInfos* getOptimizers() const { return optDesc_; }
+
+  };
+
+} //end of namespace bpp.
+
+#endif //METAOPTIMIZER_H__
+
diff --git a/src/Bpp/Numeric/Function/NewtonBacktrackOneDimension.cpp b/src/Bpp/Numeric/Function/NewtonBacktrackOneDimension.cpp
new file mode 100644
index 0000000..888d56f
--- /dev/null
+++ b/src/Bpp/Numeric/Function/NewtonBacktrackOneDimension.cpp
@@ -0,0 +1,124 @@
+//
+// File: NewtonBacktrackOneDimension.cpp
+// Created by: Laurent Guéguen
+// Created on: jeudi 16 décembre 2010, à 15h 45
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "NewtonBacktrackOneDimension.h"
+#include "../NumTools.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+NewtonBacktrackOneDimension::NewtonBacktrackOneDimension(Function* function, double slope, double test) :
+  AbstractOptimizer(function),
+  fold_(0), f_(0), a_(0), alam_(0), alamin_(0), alam2_(0), b_(0), disc_(0), f2_(0), rhs1_(0), rhs2_(0), slope_(slope), test_(test), tmplam_(0)
+    
+{
+  setDefaultStopCondition_(new NBODStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  setMaximumNumberOfEvaluations(10000);
+}
+
+/******************************************************************************/
+  
+void NewtonBacktrackOneDimension::doInit(const ParameterList& params) throw (Exception)
+{
+  // Set the initial value (no use here! Use setInitialValues() instead).
+  if(params.size() != 1) throw Exception("NewtonBacktrackOneDimension::init(). This optimizer only deals with one parameter.");
+  fold_ = getFunction()->f(getParameters());
+  getStopCondition()->setTolerance(getStopCondition()->getTolerance()/test_);
+  alamin_=getStopCondition()->getTolerance();
+  alam_=1;
+}
+
+/******************************************************************************/
+
+double NewtonBacktrackOneDimension::doStep() throw (Exception)
+{
+  if (alam_<alamin_){
+    getParameter_(0).setValue(0);
+    tolIsReached_=true;
+    return fold_;
+  }
+
+  getParameter_(0).setValue(alam_);
+  f_ = getFunction()->f(getParameters());
+
+  if (f_<=fold_+alam_*0.0001*slope_){
+    tolIsReached_=true;
+    return f_;
+  }
+
+  if (alam_==1){
+    tmplam_=-slope_/(2.0*(f_-fold_-slope_));
+    f2_=f_;
+    alam_=tmplam_>0.1?tmplam_:0.1;
+    return f_;
+  }
+  
+  rhs1_= f_-fold_-alam_*slope_;
+  rhs2_= f2_-fold_-alam2_*slope_;
+
+  a_=(rhs1_/(alam_*alam_)-rhs2_/(alam2_*alam2_))/(alam_-alam2_);
+  b_=(-alam2_*rhs1_/(alam_*alam_)+alam_*rhs2_/(alam2_*alam2_))/(alam_-alam2_);
+
+  if (a_==0.0)
+    tmplam_= -slope_/(2.0*b_);
+  else {
+    disc_=b_*b_-3.0*a_*slope_;
+    if (disc_<0.0)
+      tmplam_=0.5*alam_;
+    else
+      if (b_<=0)
+        tmplam_=(-b_+sqrt(disc_))/(3.0*a_);
+      else
+        tmplam_=-slope_/(b_+sqrt(disc_));
+  }
+  if (tmplam_> 0.5* alam_)
+    tmplam_=0.5*alam_;
+
+  alam2_=alam_;
+  f2_=f_;
+  alam_=tmplam_>0.1*alam_?tmplam_:0.1*alam_;
+
+  return f_;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/NewtonBacktrackOneDimension.h b/src/Bpp/Numeric/Function/NewtonBacktrackOneDimension.h
new file mode 100644
index 0000000..bfe2368
--- /dev/null
+++ b/src/Bpp/Numeric/Function/NewtonBacktrackOneDimension.h
@@ -0,0 +1,124 @@
+//
+// File: NewtonBacktrackOneDimension.h
+// Created by: Laurent Guéguen
+// Created on: jeudi 16 décembre 2010, à 15h 43
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _NEWTONBACKTRACKONEDIMENSION_H_
+#define _NEWTONBACKTRACKONEDIMENSION_H_
+
+#include "AbstractOptimizer.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Newton's backtrack nearly optimization for one parameter.
+   *
+   *
+   * This algorithm looks for a value that 'sufficiently low' enough
+   * near the minimum of the function, but does not look for the
+   * minimum. It needs the first derivative of a function.
+   *
+   *  Search a 'sufficiently low' value for a function in a given
+   *  direction.
+   *
+   * This function implements the algorithm described for example in page 385 of
+   *
+   * <pre>
+   * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+   * (ISBN 0-521-43108-5)
+   * </pre>
+   */
+
+  class NewtonBacktrackOneDimension:
+    public AbstractOptimizer
+  {
+  public:
+    class NBODStopCondition:
+      public AbstractOptimizationStopCondition
+    {
+    public:
+      NBODStopCondition(NewtonBacktrackOneDimension* bod):
+        AbstractOptimizationStopCondition(bod) {}
+      virtual ~NBODStopCondition() {}
+      
+      NBODStopCondition* clone() const { return new NBODStopCondition(*this); } 
+      
+    public:
+      void init() {}
+      bool isToleranceReached() const { return false; }
+      double getCurrentTolerance() const { return 0; }
+    };
+    
+    friend class NBODStopCondition;
+    
+  public:
+
+    /*
+     *@brief Constructor
+     @param function  a pointer to the function
+     @param slope the slope of the backtrack
+     @param test the inverse factor on the stop tolerance
+     *
+     */
+    
+    NewtonBacktrackOneDimension(Function* function, double slope, double test);
+    virtual ~NewtonBacktrackOneDimension() {}
+
+    NewtonBacktrackOneDimension* clone() const { return new NewtonBacktrackOneDimension(*this); }
+
+  private:
+    double fold_, f_, a_, alam_, alamin_, alam2_, b_, disc_, f2_, rhs1_, rhs2_, slope_, test_, tmplam_;
+    
+  public:
+		
+    void doInit(const ParameterList& params) throw (Exception);
+		
+    double doStep() throw (Exception);
+
+  protected:
+    DerivableFirstOrder* getFunction_()
+    {
+      return dynamic_cast<DerivableFirstOrder*>(AbstractOptimizer::getFunction_());
+    }
+    
+  };
+
+} //end of namespace bpp.
+
+#endif	//_NEWTONBACKTRACKONEDIMENSION_H_
+
diff --git a/src/Bpp/Numeric/Function/NewtonOneDimension.cpp b/src/Bpp/Numeric/Function/NewtonOneDimension.cpp
new file mode 100644
index 0000000..2887243
--- /dev/null
+++ b/src/Bpp/Numeric/Function/NewtonOneDimension.cpp
@@ -0,0 +1,122 @@
+//
+// File: NewtonOneDimension.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Apr 26 14:16 2007
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "NewtonOneDimension.h"
+#include "../NumTools.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+NewtonOneDimension::NewtonOneDimension(DerivableSecondOrder* function) :
+  AbstractOptimizer(function),
+  _param(),
+  _maxCorrection(10)
+{
+  setDefaultStopCondition_(new FunctionStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  nbEvalMax_ = 10000;
+}
+
+/******************************************************************************/
+  
+void NewtonOneDimension::doInit(const ParameterList& params) throw (Exception)
+{
+  // Set the initial value (no use here! Use setInitialValues() instead).
+  if (params.size() != 1)
+    throw Exception("NewtonOneDimension::init(). This optimizer only deals with one parameter.");
+  _param = params[0].getName();
+  currentValue_ = getFunction()->f(getParameters());  
+  getStopCondition()->init();
+}
+
+/******************************************************************************/
+
+double NewtonOneDimension::doStep() throw (Exception)
+{
+  double movement;  
+  ParameterList newPoint = getParameters();
+  ParameterList bckPoint = getFunction()->getParameters();
+  double newValue;
+  double  firstOrderDerivative = getFunction()->getFirstOrderDerivative(_param);
+  double secondOrderDerivative = getFunction()->getSecondOrderDerivative(_param);
+  if (secondOrderDerivative <= 0)
+  {
+    printMessage("!!! Second order derivative is negative (" + TextTools::toString(getParameters()[0].getValue()) + "). No move performed.");
+    //movements[i] = 0;  // We want to reach a minimum, not a maximum!
+    // My personnal improvement:
+    movement = -firstOrderDerivative / secondOrderDerivative;
+  }
+  else movement = firstOrderDerivative / secondOrderDerivative;
+  if (std::isnan(movement))
+  {
+    printMessage("!!! Non derivable point. No move performed. (f=" + TextTools::toString(currentValue_) + ", d1=" + TextTools::toString(firstOrderDerivative) + ", d2=" + TextTools::toString(secondOrderDerivative) + ").");
+    movement = 0; // Either first or second order derivative is infinity. This may happen when the function == inf at this point.
+  }
+  newPoint[0].setValue(getParameters()[0].getValue() - movement); 
+  newValue = getFunction()->f(newPoint);
+
+  // Check newValue:
+  unsigned int count = 0;
+  while (newValue > currentValue_)
+  {
+    //Restore previous point (all parameters in case of global constraint):
+    getFunction()->setParameters(bckPoint);
+
+    count++;
+    if (count >= _maxCorrection)
+    {
+      printMessage("!!! Felsenstein-Churchill correction applied too much time. Stopping here. Convergence probably not reached.");
+      tolIsReached_ = true;
+      return currentValue_;
+      //throw Exception("NewtonOneDimension::step(). Felsenstein-Churchill correction applied more than 10000 times.");
+    }
+    printMessage("!!! Function at new point is greater than at current point: " + TextTools::toString(newValue) + ">" + TextTools::toString(currentValue_) + ". Applying Felsenstein-Churchill correction, value = " + TextTools::toString(newPoint[0].getValue()));
+    movement = movement / 2;
+    newPoint[0].setValue(getParameters()[0].getValue() - movement);
+    newValue = getFunction()->f(newPoint);
+  }
+
+  getParameters_() = newPoint; // Function as been set to newPoint by the call of f(newPoint).
+  return newValue;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Seq/SequenceWalker.h b/src/Bpp/Numeric/Function/NewtonOneDimension.h
similarity index 57%
rename from src/Bpp/Seq/SequenceWalker.h
rename to src/Bpp/Numeric/Function/NewtonOneDimension.h
index d98cad4..18f27d4 100644
--- a/src/Bpp/Seq/SequenceWalker.h
+++ b/src/Bpp/Numeric/Function/NewtonOneDimension.h
@@ -1,14 +1,14 @@
 //
-// File: SequenceWalker.h
+// File: NewtonOneDimension.h
 // Created by: Julien Dutheil
-// Created on: Thu Nov 24 2011
+// Created on: Thu Apr 26 14:16 2007
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2011)
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,52 +37,56 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SEQUENCEWALKER_H_
-#define _SEQUENCEWALKER_H_
+#ifndef _NEWTONONEDIMENSION_H_
+#define _NEWTONONEDIMENSION_H_
 
-#include "Sequence.h"
+#include "AbstractOptimizer.h"
 
 namespace bpp
 {
 
 /**
- * @brief A helper class to easily convert coordinates between sequence and alignments.
- *
- * Coordinates are 0-based.
- * The walker will be more efficient if coordinates are called in pre-ordered way.
+ * @brief Newton's optimization for one parameter.
  */
-class SequenceWalker
+class NewtonOneDimension:
+  public AbstractOptimizer
 {
-  private:
-    const Sequence* seq_;
-    size_t seqPos_, alnPos_;
-    int gap_;
-
-  public:
-    SequenceWalker(const Sequence& seq):
-      seq_(&seq), seqPos_(0), alnPos_(0), gap_(seq.getAlphabet()->getGapCharacterCode()) {
-      if (seq_->size() > 0) {
-        while ((*seq_)[alnPos_] == gap_)
-          ++alnPos_;
-      }
+	private:
+    std::string _param;
+    unsigned int _maxCorrection;
+
+	public:
+		NewtonOneDimension(DerivableSecondOrder* function = 0);
+		virtual ~NewtonOneDimension() {}
+
+    NewtonOneDimension* clone() const { return new NewtonOneDimension(*this); }
+	
+	public:		
+		
+    const DerivableSecondOrder* getFunction() const
+    {
+      return dynamic_cast<const DerivableSecondOrder*>(AbstractOptimizer::getFunction());
     }
-    SequenceWalker(const SequenceWalker& walker):
-      seq_(walker.seq_), seqPos_(walker.seqPos_), alnPos_(walker.alnPos_), gap_(walker.gap_) {}
-    SequenceWalker& operator=(const SequenceWalker& walker) {
-      seq_    = walker.seq_;
-      seqPos_ = walker.seqPos_;
-      alnPos_ = walker.alnPos_;
-      gap_    = walker.gap_;
-      return *this;
+    DerivableSecondOrder* getFunction()
+    {
+      return dynamic_cast<DerivableSecondOrder*>(AbstractOptimizer::getFunction());
     }
-    virtual ~SequenceWalker() {}
 
-  public:
-    size_t getAlignmentPosition(size_t seqPos) throw (Exception);
-    size_t getSequencePosition(size_t alnPos) throw (Exception);
+    void doInit(const ParameterList& params) throw (Exception);
+		
+    double doStep() throw (Exception);
+
+    void setMaximumNumberOfCorrections(unsigned int mx) { _maxCorrection = mx; }
+	
+  protected:
+    DerivableSecondOrder* getFunction_()
+    {
+      return dynamic_cast<DerivableSecondOrder*>(AbstractOptimizer::getFunction_());
+    }
+    
 };
 
 } //end of namespace bpp.
 
-#endif //_SEQUENCEWALKER_H_
+#endif	//_NEWTONONEDIMENSION_H_
 
diff --git a/src/Bpp/Numeric/Function/OneDimensionOptimizationTools.cpp b/src/Bpp/Numeric/Function/OneDimensionOptimizationTools.cpp
new file mode 100644
index 0000000..b11a094
--- /dev/null
+++ b/src/Bpp/Numeric/Function/OneDimensionOptimizationTools.cpp
@@ -0,0 +1,267 @@
+//
+// File: OneDimensionOptimizationTools.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Nov 17 11:15:22 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus. This file is part of the Bio++ project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "NewtonBacktrackOneDimension.h"
+#include "BrentOneDimension.h"
+#include "OneDimensionOptimizationTools.h"
+#include "../NumTools.h"
+#include "../NumConstants.h"
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************
+*                              The Point class                               *
+******************************************************************************/
+inline void BracketPoint::set(double xval, double fval) { this->x = xval; this->f = fval; }
+
+/******************************************************************************
+*                             The Bracket class                              *
+******************************************************************************/
+inline void Bracket::setA(double xa, double fa) { a.set(xa, fa); }
+inline void Bracket::setB(double xb, double fb) { b.set(xb, fb); }
+inline void Bracket::setC(double xc, double fc) { c.set(xc, fc); }
+
+/******************************************************************************/
+
+Bracket OneDimensionOptimizationTools::bracketMinimum(
+  double a,
+  double b,
+  Function* function,
+  ParameterList parameters)
+{
+  Bracket bracket;
+  // Copy the parameter to use.
+  bracket.a.x = a;
+  parameters[0].setValue(bracket.a.x); bracket.a.f = function->f(parameters);
+  bracket.b.x = b;
+  parameters[0].setValue(bracket.b.x); bracket.b.f = function->f(parameters);
+
+  while (std::isnan(bracket.b.f)|| std::isinf(bracket.b.f))
+  {
+    bracket.b.x /= 1.1;
+    parameters[0].setValue(bracket.b.x); bracket.b.f = function->f(parameters);
+  }
+  
+  if (bracket.b.f > bracket.a.f)
+  {
+    // Switch roles of first and second point so that we can go downhill
+    // in the direction from a to b.
+    NumTools::swap<double>(bracket.a.x, bracket.b.x);
+    NumTools::swap<double>(bracket.a.f, bracket.b.f);
+  }
+
+  // First guess for third point:
+  bracket.c.x = bracket.b.x + NumConstants::GOLDEN_RATIO_PHI() * (bracket.b.x - bracket.a.x);
+  parameters[0].setValue(bracket.c.x); bracket.c.f = function->f(parameters);
+
+
+  // Keep returning here until we bracket:
+  while (bracket.b.f > bracket.c.f)
+  {
+    // Compute xu by parabolic extrapolation from a, b, c. TINY is used to prevent
+    // any possible division by 0.
+    double r = (bracket.b.x - bracket.a.x) * (bracket.b.f - bracket.c.f);
+    double q = (bracket.b.x - bracket.c.x) * (bracket.b.f - bracket.a.f);
+
+    double xu = bracket.b.x - ((bracket.b.x - bracket.c.x) * q - (bracket.b.x - bracket.a.x) * r) /
+                (2.0 * NumTools::sign(NumTools::max(NumTools::abs(q - r), NumConstants::VERY_TINY()), q - r));
+    double xulim = (bracket.b.x) + GLIMIT * (bracket.c.x - bracket.b.x);
+    double fu;
+
+    // We don't go farther than this.
+    // Test various possibilities:
+    if ((bracket.b.x - xu) * (xu - bracket.c.x) > 0.0)
+    {
+      parameters[0].setValue(xu); fu = function->f(parameters);
+      if (fu < bracket.c.f)
+      {
+        bracket.setA(bracket.b.x, bracket.b.f);
+        bracket.setB(xu, fu);
+        return bracket;
+      }
+      else if (fu > bracket.b.f)
+      {
+        bracket.setC(xu, fu);
+        return bracket;
+      }
+      // Parabolic fit was no use.
+      // Use default magnification.
+      xu = bracket.c.x + NumConstants::GOLDEN_RATIO_PHI() * (bracket.c.x - bracket.b.x);
+      parameters[0].setValue(xu); fu = function->f(parameters);
+    }
+    else if ((bracket.c.x - xu) * (xu - xulim) > 0.0)
+    {
+      // Parabolic fit is between point 3 and its allowed limit.
+      parameters[0].setValue(xu); fu = function->f(parameters);
+      if (fu < bracket.c.f)
+      {
+        NumTools::shift<double>(bracket.b.x, bracket.c.x, xu, bracket.c.x + NumConstants::GOLDEN_RATIO_PHI() * (bracket.c.x - bracket.b.x));
+        parameters[0].setValue(xu);
+        NumTools::shift<double>(bracket.b.f, bracket.c.f, fu, function->f(parameters));
+      }
+    }
+    else if ((xu - xulim) * (xulim - bracket.c.x) >= 0.0)
+    {
+      // Limit parabolic xu to maximum allowed value.
+      xu = xulim;
+      parameters[0].setValue(xu); fu = function->f(parameters);
+    }
+    else
+    {
+      // Reject parabolic xu, use default magnification.
+      xu = bracket.c.x + NumConstants::GOLDEN_RATIO_PHI() * (bracket.c.x - bracket.b.x);
+      parameters[0].setValue(xu); fu = function->f(parameters);
+    }
+    // Eliminate oldest point and continue.
+    NumTools::shift<double>(bracket.a.x, bracket.b.x, bracket.c.x, xu);
+    NumTools::shift<double>(bracket.a.f, bracket.b.f, bracket.c.f, fu);
+  }
+  return bracket;
+}
+
+/******************************************************************************/
+
+unsigned int OneDimensionOptimizationTools::lineMinimization(
+  DirectionFunction& f1dim,
+  ParameterList& parameters,
+  std::vector<double>& xi,
+  double tolerance,
+  OutputStream* profiler,
+  OutputStream* messenger,
+  unsigned int verbose)
+{
+  // Initial guess for brackets:
+  double ax = 0.;
+  double xx = 0.01;
+
+  f1dim.setConstraintPolicy(AutoParameter::CONSTRAINTS_AUTO);
+  f1dim.setMessageHandler(messenger);
+  f1dim.init(parameters, xi);
+  BrentOneDimension bod(&f1dim);
+  bod.setMessageHandler(messenger);
+  bod.setProfiler(profiler);
+  bod.setVerbose(verbose >= 1 ? 1 : 0);
+  bod.setOptimizationProgressCharacter(".");
+  bod.getStopCondition()->setTolerance(0.01);
+  bod.setInitialInterval(ax, xx);
+  bod.setConstraintPolicy(AutoParameter::CONSTRAINTS_KEEP);
+  ParameterList singleParameter;
+  singleParameter.addParameter(Parameter("x", 0.0));
+  bod.init(singleParameter);
+  bod.optimize();
+  // Update parameters:
+  // parameters.matchParametersValues(f1dim.getFunction()->getParameters());
+
+  double xmin = f1dim.getParameters()[0].getValue();
+  for (size_t j = 0; j < parameters.size(); j++)
+  {
+    xi[j] *= xmin;
+    parameters[j].setValue(parameters[j].getValue() + xi[j]);
+  }
+  return bod.getNumberOfEvaluations();
+}
+
+/******************************************************************************/
+
+unsigned int OneDimensionOptimizationTools::lineSearch(DirectionFunction& f1dim,
+                                                       ParameterList& parameters,
+                                                       std::vector<double>& xi,
+                                                       std::vector<double>& gradient,
+                                                       OutputStream* profiler,
+                                                       OutputStream* messenger,
+                                                       unsigned int verbose)
+{
+  size_t size = xi.size();
+
+  f1dim.setConstraintPolicy(AutoParameter::CONSTRAINTS_AUTO);
+  f1dim.setMessageHandler(messenger);
+  f1dim.init(parameters, xi);
+
+  double slope = 0;
+  for (size_t i = 0; i < size; i++)
+  {
+    slope += xi[i] * gradient[i];
+  }
+
+  //  if (slope>=0)
+  //  throw Exception("Slope problem in OneDimensionOptimizationTools::lineSearch. Slope="+TextTools::toString(slope));
+
+  double x, temp, test = 0;
+  for (size_t i = 0; i < size; ++i)
+  {
+    x = abs(parameters[i].getValue());
+    temp = abs(xi[i]);
+    if (x > 1.0)
+      temp /= x;
+    if (temp > test)
+      test = temp;
+  }
+
+  NewtonBacktrackOneDimension nbod(&f1dim, slope, test);
+
+  nbod.setMessageHandler(messenger);
+  nbod.setProfiler(profiler);
+  nbod.setVerbose(verbose >= 1 ? 1 : 0);
+  nbod.setOptimizationProgressCharacter(".");
+  nbod.getStopCondition()->setTolerance(0.0001);
+  //  nbod.setInitialInterval(ax, xx);
+  nbod.setConstraintPolicy(AutoParameter::CONSTRAINTS_KEEP);
+  ParameterList singleParameter;
+  singleParameter.addParameter(Parameter("x", 0.0));
+  nbod.init(singleParameter);
+  nbod.optimize();
+  // Update parameters:
+  // parameters.matchParametersValues(f1dim.getFunction()->getParameters());
+
+  double xmin = f1dim.getParameters()[0].getValue();
+  for (unsigned int j = 0; j < parameters.size(); j++)
+  {
+    xi[j] *= xmin;
+    parameters[j].setValue(parameters[j].getValue() + xi[j]);
+  }
+
+  return nbod.getNumberOfEvaluations();
+}
+
+/******************************************************************************/
+
+double OneDimensionOptimizationTools::GLIMIT = 100.0;
+
+/******************************************************************************/
diff --git a/src/Bpp/Numeric/Function/OneDimensionOptimizationTools.h b/src/Bpp/Numeric/Function/OneDimensionOptimizationTools.h
new file mode 100644
index 0000000..a064853
--- /dev/null
+++ b/src/Bpp/Numeric/Function/OneDimensionOptimizationTools.h
@@ -0,0 +1,138 @@
+//
+// File: OneDimensionOptimizationTools.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 17 11:15:22 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus. This file is part of the Bio++ project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ONEDIMENSIONOPTIMIZATIONTOOLS_H_
+#define _ONEDIMENSIONOPTIMIZATIONTOOLS_H_
+
+#include "Functions.h"
+#include "DirectionFunction.h"
+#include "../../Io/OutputStream.h"
+
+namespace bpp
+{
+class BracketPoint
+{
+public:
+  double x;
+  double f;
+
+public:
+  // Constructor and destructor:
+  BracketPoint() : x(0),
+    f(0) {}
+  BracketPoint(double xval, double fval) : x(xval),
+    f(fval) {}
+  virtual ~BracketPoint() {}
+
+public:
+  void set(double x, double f);
+};
+
+class Bracket
+{
+public:
+  // Constructor and destructor::
+  Bracket() : a(),
+    b(),
+    c() {}
+  virtual ~Bracket() {}
+
+public:
+  // Methods:
+  void setA(double xa, double fa);
+  void setB(double xb, double fb);
+  void setC(double xc, double fc);
+
+public:
+  BracketPoint a, b, c;
+};
+
+/**
+ * @brief Tools of one parameter-functions optimizations.
+ *
+ * For now, contains only one method to bracket a minimum.
+ */
+class OneDimensionOptimizationTools
+{
+public:
+  OneDimensionOptimizationTools() {}
+  virtual ~OneDimensionOptimizationTools() {}
+
+public:
+  /**
+   * @brief Bracket a minimum.
+   *
+   * Given a function func, and given distinct initial points x1 and x2,
+   * this routine searches in the downhill direction (defined by the function as
+   * evaluated at the initial points) and returns a Bracket object with new points
+   * a.x, b.x and c.x that bracket a minimum of the function. Also returned are the
+   * function values at the three points, a.f, b.f and c.f.
+   *
+   * @param a, b       Two initial values for the parameter.
+   * @param function   The function to bracket.
+   * @param parameters The parameter to use as a variable.
+   * @return           A bracket object.
+   */
+  static Bracket bracketMinimum(double a, double b, Function* function, ParameterList parameters);
+
+  static unsigned int lineMinimization(DirectionFunction& f1dim, ParameterList& parameters, std::vector<double>& xi, double tolerance, OutputStream* profiler = 0, OutputStream* messenger = 0, unsigned int verbose = 2);
+
+  /**
+   * @brief Search a 'sufficiently low' value for a function in a given direction.
+   *
+   * This function performs a similar computation as the lnsrch function defined at page 385 of
+   *
+   * <pre>
+   * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+   * (ISBN 0-521-43108-5)
+   * </pre>
+   *
+   * without the stpmax argument, since the steps are bounded in another way.
+   */
+  static unsigned int lineSearch(DirectionFunction& f1dim, ParameterList& parameters, std::vector<double>& xi, std::vector<double>& gradient, OutputStream* profiler = 0, OutputStream* messenger = 0, unsigned int verbose = 2);
+
+public:
+  /**
+   * @brief Maximum magnification allowed for a parabolic-fit step.
+   */
+  static double GLIMIT;
+};
+} // end of namespace bpp.
+
+#endif  // _ONEDIMENSIONOPTIMIZATIONTOOLS_H_
diff --git a/src/Bpp/Numeric/Function/Operators/BinaryOperator.h b/src/Bpp/Numeric/Function/Operators/BinaryOperator.h
new file mode 100644
index 0000000..d1ff67e
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Operators/BinaryOperator.h
@@ -0,0 +1,168 @@
+//
+// File: BinaryOperator.h
+// Created by: Laurent Guéguen
+// Created on: lundi 5 décembre 2016, à 23h 05
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _BINARY_OPERATOR_H_
+#define _BINARY_OPERATOR_H_
+
+#include <memory>
+
+namespace bpp
+{
+
+/**
+ * @brief Binary arithmetic operator for numerical computation.
+ *
+ */
+
+  class BinaryOperator:
+    public Operator
+  {
+  private:
+    char symb_;
+
+    std::shared_ptr<Operator> left_, right_;
+    
+  public:
+
+    BinaryOperator(char symb, std::shared_ptr<Operator> left, std::shared_ptr<Operator> right) :
+      symb_(symb), left_(left), right_(right)
+    {
+    }
+
+    BinaryOperator* clone() const 
+    {
+      return new BinaryOperator(*this);
+    }
+
+    char getSymbol() const
+    {
+      return symb_;
+    }
+    
+    double getValue() const
+    {
+      switch(symb_)
+      {
+      case '+':
+        return left_->getValue() + right_->getValue();
+      case '-':
+        return left_->getValue() - right_->getValue();
+      case '/':
+        if (right_->getValue()==0)
+          return 0;
+        
+        return left_->getValue() / right_->getValue();
+      case '*':
+        return left_->getValue() * right_->getValue();
+      default:
+        return 0;
+      }
+    }
+
+    double getFirstOrderDerivative(const std::string& variable) const
+    {
+      double dl = left_->getFirstOrderDerivative(variable);
+      double dr = right_->getFirstOrderDerivative(variable);
+      double l = left_->getValue();
+      double r = right_->getValue();
+
+      switch(symb_)
+      {
+      case '+':
+        return dl + dr;
+      case '-':
+        return dl - dl;
+      case '/':
+        if (r==0)
+          return 0;
+        
+        return (dl * r - dr * l ) / (r * r);
+      case '*':
+        return dl * r + dr * l;
+      default:
+        return 0;
+      }
+      return 0;
+    }
+    
+    double getSecondOrderDerivative(const std::string& variable) const
+    {
+      double d2l = left_->getSecondOrderDerivative(variable);
+      double d2r = right_->getSecondOrderDerivative(variable);
+      double l = left_->getValue();
+      double r = right_->getValue();
+      double dl = left_->getFirstOrderDerivative(variable);
+      double dr = right_->getFirstOrderDerivative(variable);
+
+      double r2 = r*r;
+      double r3 = r*r2;
+      
+      switch(symb_)
+      {
+      case '+':
+        return d2l + d2r;
+      case '-':
+        return d2l - d2r;
+        
+      case '/':
+        if (r==0)
+          return 0;
+        
+        return (d2l * r - d2r * l ) / r2 - ( 2 * dl * ( dl * r - dr * l) ) / r3;
+        
+      case '*':
+        return d2l * r + d2r * l + 2 * dr * dl;
+      default:
+        return 0;
+      }
+    }
+
+    std::string output() const
+    {
+      return "(" + left_->output() + " " + symb_ + " " + right_->output() + ")";
+    }
+    
+
+  };
+  
+
+} //end of namespace bpp.
+
+#endif  //_BINARY_OPERATOR_H_
+
diff --git a/src/Bpp/Numeric/Function/Operators/ComputationTree.cpp b/src/Bpp/Numeric/Function/Operators/ComputationTree.cpp
new file mode 100644
index 0000000..368106f
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Operators/ComputationTree.cpp
@@ -0,0 +1,213 @@
+//
+// File: ComputationTree.cpp
+// Created by: Laurent Guéguen
+// Created on: mardi 6 décembre 2016, à 00h 07
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use,
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info".
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability.
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or
+  data to be ensured and,  more generally, to use and operate it in the
+  same conditions as regards security.
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "ComputationTree.h"
+
+#include "BinaryOperator.h"
+#include "FunctionOperator.h"
+#include "ConstantOperator.h"
+#include "MathOperator.h"
+
+#include <algorithm>
+
+using namespace std;
+using namespace bpp;
+
+ComputationTree::ComputationTree(const std::string& formula, const std::map<std::string, Function*>& functionNames):
+  AssociationTreeGlobalGraphObserver<Operator,short>(true)
+{
+  getGraph() ;
+
+  std::string str2 = formula;
+  
+  str2.erase(std::remove_if(str2.begin(), 
+                            str2.end(),
+                            [](char x){return std::isspace(x);}),
+             str2.end());
+
+  setRoot(readFormula_(str2, functionNames));
+}
+
+std::shared_ptr<Operator> ComputationTree::readFormula_(const std::string& formula, const std::map<std::string, Function*>& functionNames)
+{
+  unsigned int level = 0;
+  //inside parentheses check
+  //case + or -
+  //most right '+' or '-' (but not inside '()') search and split
+
+  for(size_t i=formula.size();i>0;--i){
+
+    char c = formula[i-1]; 
+
+    if(c == ')'){
+      ++level;
+      continue;
+    }
+    
+    if(c == '('){
+      --level;
+      continue;
+    }
+
+    if(level>0)
+      continue;
+
+    if ((c == '+' || c == '-') && !(i==1 || formula[i-2] == '*' || formula[i-2] == '/'
+                                  || formula[i-2] == '+' || formula[i-2] == '-'))
+    {
+
+      //if sign
+
+      std::shared_ptr<Operator> left=readFormula_(formula.substr(0,i-1), functionNames);
+      std::shared_ptr<Operator> right=readFormula_(formula.substr(i), functionNames);
+
+      shared_ptr<Operator> here(new BinaryOperator(c,left,right));
+      
+      createNode(here);
+      
+      setFather(left, here);
+      setFather(right, here);
+      
+      return here;
+    }
+  }
+
+  //case * or /
+  //most right '*' or '/' (but not inside '()') search and split
+  for(size_t i=formula.size();i>0;--i){
+     
+    char c = formula[i-1];
+
+    if(c == ')'){
+      ++level;
+      continue;
+    }
+    
+    if(c == '('){
+      --level;
+      continue;
+    }
+
+    if(level>0)
+      continue;
+
+    if(c == '*' || c == '/'){
+
+      std::shared_ptr<Operator> left=readFormula_(formula.substr(0,i-1), functionNames);
+      std::shared_ptr<Operator> right=readFormula_(formula.substr(i), functionNames);
+
+      shared_ptr<Operator> here(new BinaryOperator(c,left,right));
+      
+      createNode(here);
+      
+      setFather(left, here);
+      setFather(right, here);
+      
+      return here;
+    }
+
+  }
+
+
+  if(formula[0]=='(')
+    return readFormula_(formula.substr(1, formula.size()-2), functionNames);
+  
+  else
+    //case value
+  {
+    shared_ptr<Operator> here;
+    try
+    {
+      double v = TextTools::toDouble(formula);
+      here = shared_ptr<Operator>(new ConstantOperator(v));
+    }
+    catch (Exception e)
+    {
+      std::map<std::string, Function*>::const_iterator it(functionNames.find(formula));
+
+      if (it!=functionNames.end())
+      {
+        if (dynamic_cast<const DerivableSecondOrder*>(it->second))
+          here=shared_ptr<Operator>(new FunctionOperator<DerivableSecondOrder>(*dynamic_cast<DerivableSecondOrder*>(it->second),formula));
+        else
+          if (dynamic_cast<const DerivableFirstOrder*>(it->second))
+            here=shared_ptr<Operator>(new FunctionOperator<DerivableFirstOrder>(*dynamic_cast<DerivableFirstOrder*>(it->second),formula));
+        else
+          here=shared_ptr<Operator>(new FunctionOperator<Function>(*it->second,formula));
+      }
+      else
+      {
+        size_t posp=formula.find("(");
+        if (posp==string::npos)
+          throw Exception("ComputationTree::readFormula_ : unknown formula : "+ formula);
+        
+        std::shared_ptr<Operator> son=readFormula_(formula.substr(posp), functionNames);
+        string fonc=formula.substr(0,posp);
+        
+        if (fonc=="exp")
+          here=shared_ptr<Operator>(new MathOperator(&exp,"exp",son));
+        else if (fonc=="log")
+          here=shared_ptr<Operator>(new MathOperator(&log,"log",son));
+        else
+          throw Exception("ComputationTree::readFormula_ : unknown formula : "+ formula);
+      }
+    }
+    
+    this->getGraph();
+    createNode(here);
+    return here;
+  }
+  
+  return NULL;
+  //never
+}
+
+bool ComputationTree::isAllSum()
+{
+  std::unique_ptr<NodeIterator> it=allNodesIterator();
+
+  for (;it->end();it->next())
+  {
+    const BinaryOperator* op = dynamic_cast<const BinaryOperator*>((**it).get());
+    if (op && op->getSymbol()!='+' && op->getSymbol()!='-')
+      return false;
+  }
+  return true;
+  
+}
diff --git a/src/Bpp/Numeric/Function/Operators/ComputationTree.h b/src/Bpp/Numeric/Function/Operators/ComputationTree.h
new file mode 100644
index 0000000..38ed7ac
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Operators/ComputationTree.h
@@ -0,0 +1,113 @@
+//
+// File: ComputationTree.h
+// Created by: Laurent Guéguen
+// Created on: mardi 6 décembre 2016, à 00h 07
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use,
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info".
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability.
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or
+  data to be ensured and,  more generally, to use and operate it in the
+  same conditions as regards security.
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _COMPUTATION_TREE_H_
+#define _COMPUTATION_TREE_H_
+
+#include "../../../Graph/AssociationTreeGraphImplObserver.h"
+
+#include "Operator.h"
+#include "../Functions.h"
+#include <memory>
+
+namespace bpp
+{
+/**
+ * @brief Defines a Computation Tree based on Operators.
+ *
+ */  
+  
+  class ComputationTree:
+    public AssociationTreeGlobalGraphObserver<Operator,short>
+  {
+  private:
+    std::shared_ptr<Operator> readFormula_(const std::string& formula,const std::map<std::string, Function*>& functionNames);
+    
+  public:
+    /*
+     * @brief Tree for numerical computation given a formula (such as
+     * 2*f+g), and given a map from function name (f) to real
+     * function.
+     * 
+     */
+    
+    ComputationTree(const std::string& formula, const std::map<std::string, Function*>& functionNames);
+    
+    ComputationTree* clone() const
+    {
+      return new ComputationTree(*this);
+    }
+
+    double getValue() const
+    {
+      return getRoot()->getValue();
+    }
+
+    double getFirstOrderDerivative(const std::string& variable) const
+    {
+      return getRoot()->getFirstOrderDerivative(variable);
+    }
+
+    double getSecondOrderDerivative(const std::string& variable) const
+    {
+      return getRoot()->getSecondOrderDerivative(variable);
+    }
+
+    void readFormula(const std::string& formula,const std::map<std::string, Function*>& functionNames)
+    {
+      readFormula_(formula, functionNames);
+    }
+    
+    std::string output() const
+    {
+      return getRoot()->output();
+    }
+
+    /*
+     * Return true if all binary operators are '+' or '-'
+     *
+     */
+    
+    bool isAllSum();
+    
+  };
+    
+}
+
+#endif
diff --git a/src/Bpp/Seq/Io/IoSequence.h b/src/Bpp/Numeric/Function/Operators/ConstantOperator.h
similarity index 63%
copy from src/Bpp/Seq/Io/IoSequence.h
copy to src/Bpp/Numeric/Function/Operators/ConstantOperator.h
index 131c31a..df954b1 100644
--- a/src/Bpp/Seq/Io/IoSequence.h
+++ b/src/Bpp/Numeric/Function/Operators/ConstantOperator.h
@@ -1,14 +1,14 @@
 //
-// File IoSequence.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
+// File: ConstantOperator.h
+// Created by: Laurent Guéguen
+// Created on: lundi 5 décembre 2016, à 23h 21
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,36 +37,60 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCE_H_
-#define _IOSEQUENCE_H_
+#ifndef _CONSTANT_OPERATOR_H_
+#define _CONSTANT_OPERATOR_H_
 
-#include <Bpp/Exceptions.h>
-#include <Bpp/Io/IoFormat.h>
-
-// From STL:
-#include <string>
+#include <memory>
+#include "../../../Text/TextTools.h"
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequence interface.
+ * @brief Constant (ie leaf) operator.
  *
- * Interface for sequences input/ouput.
  */
-class IOSequence: public virtual IOFormat
-{
-	public:
-		IOSequence() {}
-		virtual ~IOSequence() {}
-
-	public:
-
-		const std::string getDataType() const { return "Sequence container"; }
 
-};
+  class ConstantOperator:
+    public Operator
+  {
+  private:
+    const double value_;
+    
+  public:
+
+    ConstantOperator(double value) :
+      value_(value) {}
+
+    ConstantOperator* clone() const 
+    {
+      return new ConstantOperator(*this);
+    }
+
+    double getValue() const
+    {
+      return value_;
+    }
+
+    double getFirstOrderDerivative(const std::string& variable) const
+    {
+      return 0;
+    }
+    
+    double getSecondOrderDerivative(const std::string& variable) const
+    {
+      return 0;
+    }
+
+    std::string output() const
+    {
+      return TextTools::toString(value_);
+    }
+        
+  };
+  
 
 } //end of namespace bpp.
 
-#endif	// _IOSEQUENCE_H_
+#endif  //_CONSTANT_OPERATOR_H_
 
diff --git a/src/Bpp/Numeric/Function/Operators/FunctionOperator.h b/src/Bpp/Numeric/Function/Operators/FunctionOperator.h
new file mode 100644
index 0000000..a97614d
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Operators/FunctionOperator.h
@@ -0,0 +1,133 @@
+//
+// File: FunctionOperator.h
+// Created by: Laurent Guéguen
+// Created on: lundi 5 décembre 2016, à 23h 05
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FUNCTION_OPERATOR_H_
+#define _FUNCTION_OPERATOR_H_
+
+#include <memory>
+#include "../Functions.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Implements a double operator (ie leaf in the computation
+ * tree) where value comes from a function.
+ *
+ */
+
+  template<class F>
+  class FunctionOperator:
+    public Operator
+  {
+  private:
+    F& func_;
+
+    std::string name_;
+
+    double getValue_(std::true_type) const 
+    {
+      return func_.getValue();
+    }
+
+    double getValue_(std::false_type) const
+    {
+      return 0;
+    }
+
+    double getFirstOrderDerivative_(const std::string& variable, std::true_type) const
+    {
+      return func_.getFirstOrderDerivative(variable);
+    }
+
+    double getFirstOrderDerivative_(const std::string& variable, std::false_type) const
+    {
+      return 0;
+    }
+
+    double getSecondOrderDerivative_(const std::string& variable, std::true_type) const
+    {
+      return func_.getSecondOrderDerivative(variable);
+    }
+
+    double getSecondOrderDerivative_(const std::string& variable, std::false_type) const
+    {
+      return 0;
+    }
+
+
+  public:
+
+    FunctionOperator(F& func, std::string name) :
+      func_(func), name_(name)
+    {
+    }
+                                
+    FunctionOperator* clone() const 
+    {
+      return new FunctionOperator(*this);
+    }
+
+    double getValue() const
+    {
+      return getValue_(std::integral_constant<bool, std::is_base_of<Function, F>::value>{});
+    }
+
+    double getFirstOrderDerivative(const std::string& variable) const
+    {
+      return getFirstOrderDerivative_(variable, std::integral_constant<bool, std::is_base_of<DerivableFirstOrder, F>::value>{});
+    }
+
+    double getSecondOrderDerivative(const std::string& variable) const
+    {
+      return getSecondOrderDerivative_(variable, std::integral_constant<bool, std::is_base_of<DerivableSecondOrder, F>::value>{});
+    }
+
+    std::string output() const
+    {
+      return name_;
+    }
+    
+  };
+
+
+} //end of namespace bpp.
+
+#endif  //_FUNCTION_OPERATOR_H_
+
diff --git a/src/Bpp/Numeric/Function/Operators/MathOperator.h b/src/Bpp/Numeric/Function/Operators/MathOperator.h
new file mode 100644
index 0000000..0fa05be
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Operators/MathOperator.h
@@ -0,0 +1,138 @@
+//
+// File: MathOperator.h
+// Created by: Laurent Guéguen
+// Created on: lundi 5 décembre 2016, à 23h 05
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _MATH_OPERATOR_H_
+#define _MATH_OPERATOR_H_
+
+#include <memory>
+#include <cmath>
+
+namespace bpp
+{
+
+/**
+ * @brief Implements a unary operator that applies a math (described
+ * in cmath) operator. 
+ *
+ */
+
+  class MathOperator:
+    public Operator
+  {
+  private:
+    /*
+     * @brief pointer to function.
+     *  If null, identity function is used.
+     */
+    
+    double (*func_)(double);
+
+    std::string name_;
+
+    std::shared_ptr<Operator> son_;
+    
+  public:
+
+    MathOperator(double (*func)(double), std::string name, std::shared_ptr<Operator> son) :
+      func_(func), name_(name), son_(son)
+    {
+    }
+
+    MathOperator* clone() const 
+    {
+      return new MathOperator(*this);
+    }
+    
+
+    double getValue() const
+    {
+      if (func_)
+        return (*func_)(son_->getValue());
+      else
+        return son_->getValue();
+    }
+
+    /**
+     * @brief 1st order derivative
+     *
+     */
+    
+    double getFirstOrderDerivative(const std::string& variable) const
+    {
+      double v = son_->getValue();
+      double d = son_->getFirstOrderDerivative(variable);
+
+      if (name_=="exp")
+        return d*exp(v);
+      else if (name_=="log")
+        return d/v;
+      else
+        throw Exception("MathOperator::getFirstOrderDerivative : unknown function " + name_);
+      
+    }
+    
+    double getSecondOrderDerivative(const std::string& variable) const
+    {
+      double v = son_->getValue();
+      double d = son_->getFirstOrderDerivative(variable);
+      double d2 = son_->getSecondOrderDerivative(variable);
+
+      if (name_=="exp")
+        return (d2+d*d)*exp(v);
+      else if (name_=="log")
+        return (d2*v-d*d)/(v*v);
+      else
+        throw Exception("MathOperator::getFirstOrderDerivative : unknown function " + name_);
+      return 0;
+    }
+
+
+    std::string output() const
+    {
+      return name_ + "(" + son_->output() + ")";
+    }
+    
+    
+  };
+  
+
+} //end of namespace bpp.
+
+#endif  //_MATH_OPERATOR_H_
+
diff --git a/src/Bpp/Seq/SiteIterator.h b/src/Bpp/Numeric/Function/Operators/Operator.h
similarity index 69%
copy from src/Bpp/Seq/SiteIterator.h
copy to src/Bpp/Numeric/Function/Operators/Operator.h
index efb427a..7151ef1 100644
--- a/src/Bpp/Seq/SiteIterator.h
+++ b/src/Bpp/Numeric/Function/Operators/Operator.h
@@ -1,14 +1,14 @@
 //
-// File: SiteIterator.h
-// Created by: Julien Dutheil
-// Created on: Sun Oct 19 12:47:16 2003
+// File: Operator.h
+// Created by: Laurent Guéguen
+// Created on: lundi 5 décembre 2016, à 23h 02
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,44 +37,37 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SITEITERATOR_H_
-#define _SITEITERATOR_H_
+#ifndef _OPERATOR_H_
+#define _OPERATOR_H_
 
-#include "Site.h"
+#include "../../../Clonable.h"
 
 namespace bpp
 {
 
 /**
- * @brief Generic site iterator interface, allowing to loop over sites.
+ * @brief Interface of operator for numerical computation.
+ *
  */
-class SiteIterator
-{
-	public:
-		SiteIterator() {}
-		virtual ~SiteIterator() {}
-	
-	public:
-		virtual Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
-};
 
-/**
- * @brief Generic const site iterator interface, allowing to loop over const sites.
- */
-class ConstSiteIterator
-{
-	public:
-		ConstSiteIterator() {}
-		virtual ~ConstSiteIterator() {}
-	
-	public:
-		virtual const Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
-};
+  class Operator :
+    public virtual Clonable
+  {
+  public:
+    virtual ~Operator() {};
+    
+    virtual double getValue() const = 0;
+
+    virtual double getFirstOrderDerivative(const std::string& variable) const = 0;
+
+    virtual double getSecondOrderDerivative(const std::string& variable) const = 0;
+
+    virtual std::string output() const = 0;
 
+  };
+  
 
 } //end of namespace bpp.
 
-#endif	//_SITEITERATOR_H_
+#endif  //_OPERATOR_H_
 
diff --git a/src/Bpp/Numeric/Function/OptimizationStopCondition.cpp b/src/Bpp/Numeric/Function/OptimizationStopCondition.cpp
new file mode 100644
index 0000000..9098c3c
--- /dev/null
+++ b/src/Bpp/Numeric/Function/OptimizationStopCondition.cpp
@@ -0,0 +1,241 @@
+//
+// File: OptimizationStopCondition.cpp
+// Created by: Julien Dutheil
+// Created on: Tue Dec 23 11:51:31 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "OptimizationStopCondition.h"
+#include "Optimizer.h"
+#include "../VectorTools.h"
+#include "../NumTools.h"
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************/
+
+ParametersStopCondition::ParametersStopCondition(
+  const Optimizer* optimizer) :
+  AbstractOptimizationStopCondition(optimizer),
+  lastParametersEstimates_(),
+  newParametersEstimates_()
+{
+  init();
+  if (newParametersEstimates_.size() == 0)
+  {
+    cout << "DEBUG: WARNING!!! No parameter passed to ParametersStopCondition constructor. "
+         << "Be sure to have initialized the Optimizer first!" << endl; 
+  }
+}
+
+ParametersStopCondition::ParametersStopCondition(
+  const Optimizer* optimizer,
+  double tolerance) :
+  AbstractOptimizationStopCondition(optimizer, tolerance),
+  lastParametersEstimates_(),
+  newParametersEstimates_()
+{
+  init();
+  if (newParametersEstimates_.size() == 0)
+  {
+    cout << "DEBUG: WARNING!!! No parameter passed to ParametersStopCondition constructor. "
+         << "Be sure to have initialized the Optimizer first!" << endl; 
+  }
+}
+
+ParametersStopCondition::ParametersStopCondition(
+  const Optimizer* optimizer,
+  int burnin) :
+  AbstractOptimizationStopCondition(optimizer, burnin),
+  lastParametersEstimates_(),
+  newParametersEstimates_()
+{
+  init();
+  if (newParametersEstimates_.size() == 0)
+  {
+    cout << "DEBUG: WARNING!!! No parameter passed to ParametersStopCondition constructor. "
+         << "Be sure to have initialized the Optimizer first!" << endl; 
+  }
+}
+
+ParametersStopCondition::ParametersStopCondition(
+  const Optimizer* optimizer,
+  double tolerance,
+  int burnin) :
+  AbstractOptimizationStopCondition(optimizer, tolerance, burnin),
+  lastParametersEstimates_(),
+  newParametersEstimates_()
+{
+  init();
+  if (newParametersEstimates_.size() == 0)
+  {
+    cout << "DEBUG: WARNING!!! No parameter passed to ParametersStopCondition constructor. "
+         << "Be sure to have initialized the Optimizer first!" << endl; 
+  }
+}
+
+/******************************************************************************/
+
+void ParametersStopCondition::init()
+{
+  AbstractOptimizationStopCondition::init();
+  if (optimizer_->getFunction() != 0)
+    newParametersEstimates_ = optimizer_->getParameters();
+}
+
+/******************************************************************************/
+
+bool ParametersStopCondition::isToleranceReached() const
+{
+  callCount_++;
+  lastParametersEstimates_ = newParametersEstimates_;
+  newParametersEstimates_  = optimizer_->getParameters();
+  if (callCount_ <= burnin_) return false;
+  for (unsigned int i = 0; i < newParametersEstimates_.size(); i++)
+  {
+    Parameter& p = newParametersEstimates_[i];
+    double lastEstimate = lastParametersEstimates_.getParameter(p.getName()).getValue();
+    double newEstimate = p.getValue();
+    double tol = NumTools::abs<double>(newEstimate - lastEstimate);
+    if (tol > tolerance_)
+    {
+      return false;
+    }
+  }
+  return true;
+}
+
+/******************************************************************************/
+
+double ParametersStopCondition::getCurrentTolerance() const
+{
+  if (callCount_ > burnin_) {
+    double maxTol = 0.;
+    for (unsigned int i = 0; i < newParametersEstimates_.size(); i++)
+    {
+      Parameter& p = newParametersEstimates_[i];
+      double lastEstimate = lastParametersEstimates_.getParameter(p.getName()).getValue();
+      double newEstimate = p.getValue();
+      double tol = NumTools::abs<double>(newEstimate - lastEstimate);
+      if (tol > maxTol)
+        maxTol = tol;
+    }
+    return maxTol;
+  } else {
+    return std::max(tolerance_, 1.);
+  }
+}
+
+/******************************************************************************/
+
+FunctionStopCondition::FunctionStopCondition(
+  const Optimizer* optimizer) :
+  AbstractOptimizationStopCondition(optimizer),
+  lastFunctionValue_(-log(0.)),
+  newFunctionValue_(-log(0.))
+{
+  init();
+}
+
+FunctionStopCondition::FunctionStopCondition(
+  const Optimizer* optimizer,
+  double tolerance) :
+  AbstractOptimizationStopCondition(optimizer, tolerance),
+  lastFunctionValue_(-log(0.)),
+  newFunctionValue_(-log(0.))
+{
+  init();
+}
+
+FunctionStopCondition::FunctionStopCondition(
+  const Optimizer* optimizer,
+  int burnin) :
+  AbstractOptimizationStopCondition(optimizer, burnin),
+  lastFunctionValue_(-log(0.)),
+  newFunctionValue_(-log(0.))
+{
+  init();
+}
+
+FunctionStopCondition::FunctionStopCondition(
+  const Optimizer* optimizer,
+  double tolerance,
+  int burnin) :
+  AbstractOptimizationStopCondition(optimizer, tolerance, burnin),
+  lastFunctionValue_(-log(0.)),
+  newFunctionValue_(-log(0.))
+{
+  init();
+}
+
+FunctionStopCondition::~FunctionStopCondition() {}
+
+/******************************************************************************/
+
+void FunctionStopCondition::init()
+{
+  AbstractOptimizationStopCondition::init();
+  newFunctionValue_ = -log(0.);
+  if (optimizer_->getFunction() != 0)
+  {
+    newFunctionValue_ = optimizer_->getFunctionValue();
+  }
+}
+
+/******************************************************************************/
+
+bool FunctionStopCondition::isToleranceReached() const
+{
+  callCount_++;
+  lastFunctionValue_ = newFunctionValue_;
+  newFunctionValue_  = optimizer_->getFunctionValue();
+  if (callCount_ <= burnin_) return false;
+  double tol = NumTools::abs<double>(newFunctionValue_ - lastFunctionValue_);
+  return tol < tolerance_;
+}
+
+/******************************************************************************/
+
+double FunctionStopCondition::getCurrentTolerance() const
+{
+  if (callCount_ > burnin_)
+    return NumTools::abs<double>(newFunctionValue_ - lastFunctionValue_);
+  else
+    return std::max(tolerance_, 1.);
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/OptimizationStopCondition.h b/src/Bpp/Numeric/Function/OptimizationStopCondition.h
new file mode 100644
index 0000000..9e0cf50
--- /dev/null
+++ b/src/Bpp/Numeric/Function/OptimizationStopCondition.h
@@ -0,0 +1,303 @@
+//
+// File: OptimizationStopCondition.h
+// Created by: Julien Dutheil
+// Created on: Tue Dec 23 11:51:31 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _OPTIMIZATIONSTOPCONDITION_H_
+#define _OPTIMIZATIONSTOPCONDITION_H_
+
+#include "../ParameterList.h"
+
+using namespace std;
+
+namespace bpp
+{
+
+  class Optimizer;
+	
+  /******************************************************************************/
+
+  /**
+   * @brief Interface for otimization stop condition objet.
+   *
+   * Classes implementing the OptimizationStopCondition interface
+   * provides the isToleranceReached() function that tells when
+   * the optimization process reached a given tolerance parameter.
+   * This parameter may be set or retrieve using the setTolerance()
+   * and getTolerance() functions.
+   *
+   * OptimizationStopCondition implementations may be general and work on
+   * parameter (@see ParametersStopCondition) or function (@see FunctionStopCondition) values,
+   * or be specific to a given optimization method.
+   */
+  class OptimizationStopCondition:
+    public virtual Clonable
+  {
+  public:
+    OptimizationStopCondition() {}
+    virtual ~OptimizationStopCondition() {}
+
+    OptimizationStopCondition * clone() const = 0;
+	
+  public:
+
+    /**
+     * @return The optimizer to which this instance belongs to. 
+     */
+    virtual const Optimizer* getOptimizer() const = 0;
+    /**
+     * @brief Set the optimizer attached to this instance.
+     *
+     * @param optimizer The optimizer to which this instance belongs to. 
+     */
+    virtual void setOptimizer(const Optimizer* optimizer) = 0;
+
+    /**
+     * @brief Initialize the condition.
+     */
+    virtual void init() = 0;
+
+    /**
+     * @brief Tell if the we reached the desired tolerance with a given 
+     * new set of estimates.
+     *
+     * The new parameter list is compared to the last estimates,
+     * and the lastParameterEstimates list is actulaized with the newParameters list.
+     *
+     * @return True if the tolerance level is reached.
+     */
+    virtual bool isToleranceReached() const = 0;
+		
+    /**
+     * @brief Set the tolerance parameter.
+     *
+     * @param tolerance The tolerance parameter.
+     */	
+    virtual void setTolerance(double tolerance) = 0;
+
+    /**
+     * @brief Get the tolerance parameter.
+     *
+     * @return The tolerance parameter.
+     */	
+    virtual double getTolerance() const = 0;
+    
+    /**
+     * @brief Get the current tolerance.
+     *
+     * This is computed from the last check performed.
+     * Initially, it is equal to the tolerance parameter.
+     *
+     * @return The current tolerance achieved.
+     */	
+    virtual double getCurrentTolerance() const = 0;
+  };
+
+  /******************************************************************************/
+
+  /**
+   * @brief Partial implementation of the OptimizationStopCondition interface.
+   *
+   * This class provides:
+   * - A pointer toward the Optimizer this objet deals with,
+   * - A tolerance value,
+   * - A counter of the number of calls toward the isToleranceReached() function,
+   * - A burnin function, that prohibe the optimization to stop prematurely.
+   */   
+  class AbstractOptimizationStopCondition:
+    public virtual OptimizationStopCondition
+  {
+  protected:
+    const Optimizer* optimizer_;
+    double tolerance_;
+
+    /**
+     * @brief Count the number of times the isToleranceReached() function
+     * has been called.
+     */
+    mutable double callCount_;
+	
+    int burnin_;
+	
+  public:
+    AbstractOptimizationStopCondition(const Optimizer* optimizer):
+        optimizer_(optimizer),
+        tolerance_(0.000001),
+        callCount_(0),
+        burnin_(0) {}
+    
+    AbstractOptimizationStopCondition(const Optimizer* optimizer, double tolerance):
+        optimizer_(optimizer),
+        tolerance_(tolerance),
+        callCount_(0),
+        burnin_(0) {}
+
+    AbstractOptimizationStopCondition(const Optimizer* optimizer, int burnin):
+        optimizer_(optimizer),
+        tolerance_(0.000001),
+        callCount_(0),
+        burnin_(burnin) {}
+
+    AbstractOptimizationStopCondition(const Optimizer* optimizer, double tolerance, int burnin):
+        optimizer_(optimizer),
+        tolerance_(tolerance),
+        callCount_(0),
+        burnin_(burnin) {}
+
+    AbstractOptimizationStopCondition(const AbstractOptimizationStopCondition& aosc):
+        optimizer_(aosc.optimizer_),
+        tolerance_(aosc.tolerance_),
+        callCount_(aosc.callCount_),
+        burnin_(aosc.burnin_) {}
+	
+    AbstractOptimizationStopCondition& operator=(const AbstractOptimizationStopCondition& aosc)
+    {
+      optimizer_ = aosc.optimizer_;
+      tolerance_ = aosc.tolerance_;
+      callCount_ = aosc.callCount_;
+      burnin_    = aosc.burnin_;
+      return *this;
+    }
+
+    virtual ~AbstractOptimizationStopCondition() {}
+
+  public:
+    const Optimizer* getOptimizer() const { return optimizer_; }
+    void setOptimizer(const Optimizer* optimizer) { optimizer_ = optimizer; }
+    void setTolerance(double tolerance) { tolerance_ = tolerance; }
+    double getTolerance() const { return tolerance_; }
+    void init() { resetCounter(); }
+    virtual void resetCounter() { callCount_ = 0; }
+    virtual void setBurnin(int burnin) { burnin_ = burnin; }
+    virtual int getBurnin() const { return burnin_; }
+
+  };
+	
+  /******************************************************************************/
+
+  /**
+   * @brief Stop condition on parameters.
+   *
+   * This stops the optimization when \f$\forall i\; |\lambda_{i,t}-\lambda_{i,t-1}| \leq \mbox{tolerance}\f$,
+   * where \f$\lambda_{i, t}\f$ is the value of the ith parameter at iteration \f$t\f$,
+   * and \f$\lambda_{i, t-1}\f$ is the value of the ith parameter at iteration \f$t-1\f$.
+   */
+  class ParametersStopCondition:
+    public AbstractOptimizationStopCondition
+  {
+  private:
+
+    /**
+     * @brief The last estimates of the parameters.
+     *
+     * This is used by the isToleranceReached() method.
+     */
+    mutable ParameterList lastParametersEstimates_;
+		
+    /**
+     * @brief The new estimates of the parameters.
+     *
+     * This is used by the isToleranceReached() method.
+     */
+    mutable ParameterList newParametersEstimates_;
+	
+  public:
+    ParametersStopCondition(const Optimizer* optimizer);
+    ParametersStopCondition(const Optimizer* optimizer, double tolerance);
+    ParametersStopCondition(const Optimizer* optimizer, int burnin);
+    ParametersStopCondition(const Optimizer* optimizer, double tolerance, int burnin);
+		
+    virtual ~ParametersStopCondition() {}
+
+    ParametersStopCondition* clone() const { return new ParametersStopCondition(*this); }
+	
+  public:
+    void init();
+
+    bool isToleranceReached() const;
+    
+    double getCurrentTolerance() const;
+  };
+
+  /******************************************************************************/
+
+  /**
+   * @brief Stop condition on function value.
+   *
+   * This stops the optimization when \f$|f\left(\left\{\lambda_{i,t}\right\}\right)-f\left(\left\{\lambda_{i,t-1}\right\}\right)| \leq \mbox{tolerance}\f$,
+   * where \f$f\left(\left\{\lambda_{i, t}\right\}\right)\f$ is the value of the function given the parameter values at iteration \f$t\f$,
+   * and \f$f\left(\left\{\lambda_{i, t-1}\right\}\right)\f$ is the value of the function given the parameter velues at iteration \f$t-1\f$.
+   */
+  class FunctionStopCondition:
+    public AbstractOptimizationStopCondition
+  {
+  private:
+    /**
+     * @brief The last value of the function.
+     *
+     * This is used by the isToleranceReached() method.
+     */
+    mutable double lastFunctionValue_;
+		
+    /**
+     * @brief The new value of the function.
+     *
+     * This is used by the isToleranceReached() method.
+     */
+    mutable double newFunctionValue_;
+	
+  public:
+    FunctionStopCondition(const Optimizer* optimizer);
+    FunctionStopCondition(const Optimizer* optimizer, double tolerance);
+    FunctionStopCondition(const Optimizer* optimizer, int burnin);
+    FunctionStopCondition(const Optimizer* optimizer, double tolerance, int burnin);
+		
+    virtual ~FunctionStopCondition();
+
+    FunctionStopCondition* clone() const { return new FunctionStopCondition(*this); }
+	
+  public:
+    void init();
+    bool isToleranceReached() const;
+    double getCurrentTolerance() const;
+
+  };
+
+} //end of namespace bpp.
+
+#endif	//_OPTIMIZATIONSTOPCONDITION_H_
+
diff --git a/src/Bpp/Numeric/Function/Optimizer.h b/src/Bpp/Numeric/Function/Optimizer.h
new file mode 100644
index 0000000..61278a1
--- /dev/null
+++ b/src/Bpp/Numeric/Function/Optimizer.h
@@ -0,0 +1,398 @@
+//
+// File: Optimizer.h
+// Created by: Julien Dutheil
+// Created on: Tue Nov  4 16:01:27 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _OPTIMIZER_H_
+#define _OPTIMIZER_H_
+
+#include "Functions.h"
+#include "../ParameterList.h"
+#include "OptimizationStopCondition.h"
+#include "../../Clonable.h"
+#include "../../Io/OutputStream.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief An event object which indicates that an optimization event occured.
+   */
+  class OptimizationEvent
+  {
+  private:
+    Optimizer* optimizer_;
+
+  public:
+
+    /**
+     * @param optimizer A pointer toward the optimizer that launched the event.
+     */
+    OptimizationEvent(Optimizer* optimizer): optimizer_(optimizer) {}
+    OptimizationEvent(const OptimizationEvent& oe): optimizer_(oe.optimizer_) {}
+    OptimizationEvent& operator=(const OptimizationEvent& oe)
+    {
+      optimizer_ = oe.optimizer_;
+      return *this;
+    }
+    virtual ~OptimizationEvent() {}
+
+  public:
+    
+    /**
+     * @return A pointer toward the optimizer that launched the event.
+     */
+    Optimizer* getOptimizer() { return optimizer_; }
+    
+    /**
+     * @return A pointer toward the optimizer that launched the event.
+     */
+    const Optimizer* getOptimizer() const { return optimizer_; }
+  };
+
+
+
+
+
+
+  /**
+   * @brief The listener interface for receiving optimization events.
+   * 
+   * The class that is interested in processing an optimization event implements this interface,
+   * and the object created with that class is registered with a component,
+   * using the component's addOptimizationListener method.
+   * More kinds of events may be processed in the future.
+   */
+  class OptimizationListener
+  {
+  public:
+    OptimizationListener() {}
+    virtual ~OptimizationListener() {}
+
+  public:
+    virtual void optimizationInitializationPerformed(const OptimizationEvent& event) = 0;
+    virtual void optimizationStepPerformed(const OptimizationEvent& event) = 0;
+    /**
+     * @return 'true' If this listener modifies the parameter set.
+     */
+    virtual bool listenerModifiesParameters() const = 0;
+  };
+
+
+  
+  
+
+  /**
+   * @brief This is the basal interface for all optimization methods.
+   * 
+   * An optimizer deals with Function objects.
+   * Optimizer objects are event-driven: they notify listeners when a step is performed.
+   */
+  class Optimizer:
+    public virtual Clonable
+  {
+  public:
+    Optimizer() {}
+    virtual ~Optimizer() {}
+
+    Optimizer* clone() const = 0;
+	
+  public:
+		
+    /**
+     * @brief Set the initial values of the parameters.
+     *
+     * @param params The initial values of parameters.
+     * @throw Exception If a problem occured during initialization.
+     */
+    virtual void init(const ParameterList& params) throw (Exception) = 0;
+
+    /**
+     * @return 'true' if this optimizer has been initialized.
+     */
+    virtual bool isInitialized() const = 0;
+
+    /**
+     * @brief Perform an optimization step.
+     *
+     * @return the value of the function after this step.
+     * @throw Exception If a problem occured during optimization or if the optimizer has not been initialized.
+     */
+    virtual double step() throw (Exception) = 0;
+
+    /**
+     * @return The parameters with their current values.
+     */
+    virtual const ParameterList& getParameters() const = 0;
+
+    /**
+     * @return The value associated with a given parameter name.
+     */
+    
+    virtual double getParameterValue(const std::string& name) const = 0;
+    /**
+     * @brief Get the current function value.
+     *
+     * @return The value of the function at the point specified by _parameters.
+     * @throw NullPointerException If no function is associated with this optimizer.
+     */
+      virtual double getFunctionValue() const throw (NullPointerException) = 0;
+		
+    /**
+     * @brief Perform as many optimization steps untill the stop condition is met.
+     *
+     * @return The value of the function after optimization is completed.
+     * @throw Exception If a problem occured during optimization or if the optimizer has not been initialized.
+     */
+    virtual double optimize() throw (Exception) = 0;
+	
+    /**
+     * @brief Set the function to optimize.
+     *
+     * @param function The function to optimize.
+     */
+    virtual void setFunction(Function* function) = 0;
+		
+    /**
+     * @brief Get the current function being optimized.
+     *
+     * @return A const pointer toward the function being optimized.
+     */
+    virtual const Function* getFunction() const = 0;
+
+    /**
+     * @brief Get the current function being optimized.
+     *
+     * @return A const pointer toward the function being optimized.
+     */
+    virtual Function* getFunction() = 0;
+
+    /**
+     * @brief Tell if a funciton is associatied to this optimizer.
+     *
+     * @return True if a function has been associated to this optimizer.
+     */
+    virtual bool hasFunction() const = 0;
+
+    /**
+     * @brief Set the message handler for this optimizer.
+     *
+     * The message handler keeps all messages that the optimizer may send.
+     * The default handler is set to standard output, but you can pass any
+     * ostream object (cerr, ofstream, etc.).
+     *
+     * A NULL pointer disables message output.
+     *
+     * @param mh The message handler to use.
+     */
+    virtual void setMessageHandler(OutputStream* mh) = 0;
+		
+    /**
+     * @return The stream used for handling messages, if any.
+     */
+    virtual OutputStream* getMessageHandler() const = 0;
+		
+    /**
+     * @brief Set the profiler for this optimizer.
+     *
+     * The profiler keeps all the intermediate values taken by the parameters.
+     * The default profiler is set to standard output, but you can pass any
+     * ostream object (cerr, ofstream, etc.).
+     *
+     * A NULL pointer disables message output.
+     * 
+     * @param profiler The profiler to use.
+     */
+    virtual void setProfiler(OutputStream* profiler) = 0;
+		
+    /**
+     * @return The stream used for profiling, if any.
+     */
+    virtual OutputStream* getProfiler() const = 0;
+		
+    /**
+     * @brief Get the number of function evaluations performed since the
+     * call of the init function.
+     *
+     * @return The number of function evaluations.
+     */
+    virtual	unsigned int getNumberOfEvaluations() const = 0;
+		
+    /**
+     * @brief Set the stop condition of the optimization algorithm.
+     *
+     * @param stopCondition The stop condition to use while optimizing.
+     * @see OptimizationStopCondition.
+     */
+    virtual void setStopCondition(const OptimizationStopCondition& stopCondition) = 0;
+
+    /**
+     * @brief Get the stop condition of the optimization algorithm.
+     *
+     * @return The stop condition used while optimizing.
+     */
+    virtual OptimizationStopCondition* getStopCondition() = 0;
+
+    /**
+     * @brief Get the stop condition of the optimization algorithm.
+     *
+     * @return The stop condition used while optimizing.
+     */
+    virtual const OptimizationStopCondition* getStopCondition() const = 0;
+
+    /**
+     * @brief Get the default stop condition of the optimization algorithm.
+     *
+     * @return The default stop condition used while optimizing.
+     */
+    virtual OptimizationStopCondition* getDefaultStopCondition() = 0;
+		
+    /**
+     * @brief Get the default stop condition of the optimization algorithm.
+     *
+     * @return The default stop condition used while optimizing.
+     */
+    virtual const OptimizationStopCondition* getDefaultStopCondition() const = 0;
+		
+    /**
+     * @brief Tell if the tolerance level is reached.
+     *
+     * @return Whether the tolerance is reached or not.
+     * @see OptimizationStopCondition
+     */
+    virtual bool isToleranceReached() const = 0;
+		
+    /**
+     * @brief Tell if the maximum number of function evaluations is reached.
+     *
+     * @return Whether the maximum number of function evaluations is reached or not.
+     */
+    virtual bool isMaximumNumberOfEvaluationsReached() const = 0;
+
+    /**
+     * @brief Set the maximum number of function evaluation to perform during optimization.
+     *
+     * @param max The maximum number of evaluations to perform.
+     */
+    virtual void setMaximumNumberOfEvaluations(unsigned int max) = 0;
+
+    /**
+     * @brief Set the verbose level.
+     *
+     * 0 = off
+     * 1 = on
+     * 2 = more verbose
+     * 3 = even more, etc.
+     *
+     * In most cases, only the 0 and 1 levels are implemented.
+     *
+     * @param v verbose level.
+     */
+    virtual void setVerbose(unsigned int v) = 0;
+
+    /**
+     * @brief Get the verbose level.
+     *
+     * @return verbose level.
+     */
+    virtual unsigned int getVerbose() const = 0;
+
+    /**
+     * @brief Set the constraint policy for this optimizer.
+     *
+     * @param constraintPolicy The constraint policy.
+     */
+    virtual void setConstraintPolicy(const std::string & constraintPolicy) = 0;
+
+    /**
+     * @brief Get the constraint policy for this optimizer.
+     *
+     * @return The constraint policy.
+     */
+    virtual std::string getConstraintPolicy() const = 0;
+
+    /**
+     * @brief Register a listener to this class.
+     *
+     * All registered listeners will be informed when an optimization event occur.
+     * See the documentation of the class to know what kind of events are supported.
+     *
+     * @param listener A listener to be registered with.
+     */
+    virtual void addOptimizationListener(OptimizationListener * listener) = 0; 
+
+  };
+
+
+
+
+
+  /**
+   * @brief Save intermediate optimization results to file.
+   */
+  class BackupListener:
+    public OptimizationListener
+  {
+  private:
+    std::string backupFile_;
+
+  public:
+    BackupListener(const string& backupFile):
+      backupFile_(backupFile) {}
+
+    virtual ~BackupListener() {}
+
+  public:
+    void optimizationInitializationPerformed(const OptimizationEvent& event) {}
+    
+    void optimizationStepPerformed(const OptimizationEvent& event) {
+      std::ofstream bck(backupFile_.c_str(), std::ios::out);
+      bck << "f(x)=" << setprecision(20) << event.getOptimizer()->getFunction()->getValue() << endl;
+      ParameterList pl = event.getOptimizer()->getFunction()->getParameters();
+      for (unsigned int i = 0; i < pl.size(); ++i) {
+        bck << pl[i].getName() << "=" <<  setprecision(20) << pl[i].getValue() << std::endl;
+      }
+      bck.close();
+    }
+    
+    bool listenerModifiesParameters() const { return false; };
+  };
+
+} //end of namespace bpp.
+
+#endif	//_OPTIMIZER_H_
+
diff --git a/src/Bpp/Numeric/Function/PowellMultiDimensions.cpp b/src/Bpp/Numeric/Function/PowellMultiDimensions.cpp
new file mode 100644
index 0000000..6f164f3
--- /dev/null
+++ b/src/Bpp/Numeric/Function/PowellMultiDimensions.cpp
@@ -0,0 +1,170 @@
+//
+// File: PowellMultiDimensions.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Nov 17 15:16:45 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "PowellMultiDimensions.h"
+#include "BrentOneDimension.h"
+#include "OneDimensionOptimizationTools.h"
+#include "../NumTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+bool PowellMultiDimensions::PMDStopCondition::isToleranceReached() const {
+  callCount_++;
+  if (callCount_ <= burnin_) return false;
+  return getCurrentTolerance() < tolerance_;
+}
+
+double PowellMultiDimensions::PMDStopCondition::getCurrentTolerance() const
+{
+  // NRC Test for done:
+  const PowellMultiDimensions* pmd = dynamic_cast<const PowellMultiDimensions*>(optimizer_);
+  double fp   = pmd->fp_;
+  double fret = pmd->fret_;
+  return 2.0 * NumTools::abs(fp - fret) / (NumTools::abs(fp) + NumTools::abs(fret));
+}
+    
+/******************************************************************************/
+
+PowellMultiDimensions::PowellMultiDimensions(Function* function) :
+AbstractOptimizer(function), fp_(0), fret_(0), pt_(), xi_(), ncom_(0), pcom_(), xicom_(), f1dim_(function)
+{
+  setDefaultStopCondition_(new PMDStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+}
+
+/******************************************************************************/
+
+void PowellMultiDimensions::doInit(const ParameterList& params) throw (Exception)
+{
+  // Build the initial matrix:
+  size_t n = params.size();
+  xi_.resize(n);
+  for (size_t i = 0; i < n; i++)
+  {
+    // Copy the parameter list:
+    xi_[i].resize(n);
+    for(unsigned int j = 0; j < n; j++)
+    {
+      // Set the directions to unit vectors:
+      xi_[i][j] = (j == i) ? 1 : 0;
+    }
+  }
+  
+  // Starting point:
+  fret_ = getFunction()->f(getParameters());
+  pt_   = getParameters();
+}
+  
+/******************************************************************************/
+  
+double PowellMultiDimensions::doStep() throw (Exception)
+{
+  size_t n = getParameters().size();
+  fp_ = fret_;
+  unsigned int ibig = 0;
+  double del = 0.0; // Will be the biggest function decrease
+  Vdouble xit(n);
+  
+  // In each iteration, loop over all directions in the set.
+  double fptt;
+  for(unsigned int i = 0; i < n; i++)
+  {
+    // Copy the direction:
+    for(unsigned int j = 0; j < n; j++)
+    {
+      xit[j] = xi_[j][i];
+    }
+    fptt = fret_;
+    nbEval_ += OneDimensionOptimizationTools::lineMinimization(f1dim_,
+        getParameters_(), xit, getStopCondition()->getTolerance(),
+        0, getMessageHandler(), getVerbose() > 0 ? getVerbose() - 1 : 0);
+    fret_ = getFunction()->f(getParameters());
+    if (getVerbose() > 2) printPoint(getParameters(), fret_);
+    if (fret_ > fp_) throw Exception("DEBUG: PowellMultiDimensions::doStep(). Line minimization failed!");
+    if (fptt - fret_ > del)
+    {
+      del = fptt - fret_;
+      ibig = i;
+    }
+  }
+
+  ParameterList ptt = getParameters();
+  for (unsigned int j = 0; j < n; j++)
+  {
+    ptt[j].setValue(2.0 * getParameters()[j].getValue() - pt_[j].getValue());
+    xit[j] = getParameters()[j].getValue() - pt_[j].getValue();
+    pt_[j].setValue(getParameters()[j].getValue());
+  }
+  fptt = getFunction()->f(ptt);
+  if (fptt < fp_)
+  {
+    double t = 2.0 * (fp_ - 2.0 * fret_ + fptt) * NumTools::sqr(fp_ - fret_ - del) - del * NumTools::sqr(fp_ - fptt);
+    if (t < 0.0)
+    {
+      //cout << endl << "New direction: drection " << ibig << " removed." << endl;
+      nbEval_ += OneDimensionOptimizationTools::lineMinimization(f1dim_,
+          getParameters_(), xit, getStopCondition()->getTolerance(),
+          0, getMessageHandler(), getVerbose() > 0 ? getVerbose() - 1 : 0);
+      fret_ = getFunction()->f(getParameters());
+      if (fret_ > fp_) throw Exception("DEBUG: PowellMultiDimensions::doStep(). Line minimization failed!");
+      for (unsigned int j = 0; j < n; j++)
+      {
+        xi_[j][ibig]  = xi_[j][n - 1];
+        xi_[j][n - 1] = xit[j];
+      }
+    }
+  }
+  else getFunction()->setParameters(getParameters());
+
+  return fret_;
+}
+
+/******************************************************************************/
+
+double PowellMultiDimensions::optimize() throw (Exception)
+{
+  AbstractOptimizer::optimize();
+  // Apply best parameter:
+  return getFunction()->f(getParameters());
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Function/PowellMultiDimensions.h b/src/Bpp/Numeric/Function/PowellMultiDimensions.h
new file mode 100644
index 0000000..f65897a
--- /dev/null
+++ b/src/Bpp/Numeric/Function/PowellMultiDimensions.h
@@ -0,0 +1,115 @@
+//
+// File: PowellMultiDimensions.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 17 15:16:45 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+zs a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef POWELLMULTIDIMENSIONS_H__
+#define POWELLMULTIDIMENSIONS_H__
+
+#include "DirectionFunction.h"
+#include "AbstractOptimizer.h"
+#include "../VectorTools.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Powell's multi-dimensions optimization algorithm for one parameter.
+ *
+ * A description of the algorithm can be found for example in:
+ * <pre>
+ * NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING
+ * (ISBN 0-521-43108-5)
+ * </pre>
+ */
+class PowellMultiDimensions:
+  public AbstractOptimizer
+{
+	public:
+		class PMDStopCondition:
+      public AbstractOptimizationStopCondition
+		{
+			public:
+				PMDStopCondition(PowellMultiDimensions* pmd):
+          AbstractOptimizationStopCondition(pmd) {}
+				virtual ~PMDStopCondition() {}
+
+        PMDStopCondition* clone() const { return new PMDStopCondition(*this); }
+			
+			public:
+				bool isToleranceReached() const;
+        double getCurrentTolerance() const;
+		};
+	
+	friend class PMDStopCondition;
+		
+	protected:
+		double fp_;
+		double fret_;
+		ParameterList pt_;
+		VVdouble xi_;
+		
+		unsigned int ncom_;
+		ParameterList pcom_, xicom_;
+		DirectionFunction f1dim_;
+		
+	public:
+		PowellMultiDimensions(Function* function);
+		virtual ~PowellMultiDimensions() {}
+
+    PowellMultiDimensions* clone() const { return new PowellMultiDimensions(*this); }
+	
+	public:		
+		
+		/**
+		 * @name The Optimizer interface.
+		 *
+		 * @{
+		 */		
+		double optimize() throw (Exception);
+		/** @} */
+
+		void doInit(const ParameterList & params) throw (Exception);
+		
+    double doStep() throw (Exception);	
+	
+};
+
+} //end of namespace bpp.
+
+#endif	//_POWELLMULTIDIMENSIONS_H_
+
diff --git a/src/Bpp/Numeric/Function/ReparametrizationFunctionWrapper.cpp b/src/Bpp/Numeric/Function/ReparametrizationFunctionWrapper.cpp
new file mode 100644
index 0000000..4b8753d
--- /dev/null
+++ b/src/Bpp/Numeric/Function/ReparametrizationFunctionWrapper.cpp
@@ -0,0 +1,194 @@
+//
+// File: ReparametrizationFunctionWrapper.h
+// Created by: Julien Dutheil
+// Created on: Fri Jan  30 09:30 2009
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "ReparametrizationFunctionWrapper.h"
+#include "../../App/ApplicationTools.h"
+#include <typeinfo>
+using namespace bpp;
+using namespace std;
+
+void ReparametrizationFunctionWrapper::init_(bool verbose)
+{
+  for (size_t i = 0; i < functionParameters_.size(); i++)
+  {
+    Parameter& p = functionParameters_[i];
+    Constraint* constraint = p.getConstraint();
+    const string name = p.getName();
+    double value = p.getValue();
+    if (!constraint)
+    {
+      if (verbose)
+        ApplicationTools::displayMessage("Parameter " + name + " does not need to be transformed.");
+      addParameter_(new PlaceboTransformedParameter(name, value));
+    }
+    else
+    {
+      IntervalConstraint* interval = dynamic_cast<IntervalConstraint*>(constraint);
+      if (interval) {
+        bool isInfinite = (!interval->finiteLowerBound()) || (!interval->finiteUpperBound());
+        if (!isInfinite)
+        {
+          if (!interval->strictLowerBound() && !interval->strictUpperBound())
+          {
+            // Case 1: [a,b]
+            // This solves an issue if the original value is at the bound.
+            double correctedValue = value;
+            if (abs(value - interval->getLowerBound()) < NumConstants::TINY())
+              correctedValue = interval->getLowerBound() + NumConstants::TINY();
+            if (abs(value - interval->getUpperBound()) < NumConstants::TINY())
+              correctedValue = interval->getUpperBound() - NumConstants::TINY();
+            IntervalTransformedParameter* pp = new IntervalTransformedParameter(name, correctedValue, interval->getLowerBound(), interval->getUpperBound());
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was tanh transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+          else if (interval->strictLowerBound() && interval->strictUpperBound())
+          {
+            // Case 2: ]a,b[
+            // We have to correct the bound in order to prevent numerical issues.
+            // It can happens that the original bound is matched because of rounding errors.
+            IntervalTransformedParameter* pp = new IntervalTransformedParameter(name, value, interval->getLowerBound() + NumConstants::TINY(), interval->getUpperBound() - NumConstants::TINY());
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was tanh transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+          else if (!interval->strictLowerBound() && interval->strictUpperBound())
+          {
+            // Case 3: [a,b[
+            // This solves an issue if the original value is at the bound.
+            double correctedValue = value;
+            if (abs(value - interval->getLowerBound()) < NumConstants::TINY())
+              correctedValue = interval->getLowerBound() + NumConstants::TINY();
+            IntervalTransformedParameter* pp = new IntervalTransformedParameter(name, correctedValue, interval->getLowerBound(), interval->getUpperBound() - NumConstants::TINY());
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was tanh transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+          else if (interval->strictLowerBound() && !interval->strictUpperBound())
+          {
+            // Case 4: ]a,b]
+            // This solve an issue if the original value is at the bound.
+            double correctedValue = value;
+            if (abs(value - interval->getUpperBound()) < NumConstants::TINY())
+              correctedValue = interval->getUpperBound() - NumConstants::TINY();
+            IntervalTransformedParameter* pp = new IntervalTransformedParameter(name, correctedValue, interval->getLowerBound() + NumConstants::TINY(), interval->getUpperBound());
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was tanh transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+        }
+        else
+        {
+          if (interval->strictLowerBound() && !interval->finiteUpperBound())
+          {
+            // Case 5: ]a, +inf[
+            RTransformedParameter* pp = new RTransformedParameter(name, value, interval->getLowerBound() + NumConstants::TINY(), true);
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was log transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+          else if (!interval->strictLowerBound() && !interval->finiteUpperBound())
+          {
+            // Case 6: [a, +inf[
+            // This solve an issue if the original value is at the bound.
+            double correctedValue = value;
+            if (abs(value - interval->getLowerBound()) < NumConstants::TINY())
+              correctedValue = interval->getLowerBound() + NumConstants::TINY();
+            RTransformedParameter* pp = new RTransformedParameter(name, correctedValue, interval->getLowerBound(), true);
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was log transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+          else if (!interval->finiteLowerBound() && interval->strictUpperBound())
+          {
+            // Case 7: ]-inf, a[
+            RTransformedParameter* pp = new RTransformedParameter(name, value, interval->getUpperBound() - NumConstants::TINY(), false);
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was log transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+          else if (!interval->finiteLowerBound() && !interval->strictUpperBound())
+          {
+            // Case 8: ]-inf, a]
+            // This solve an issue if the original value is at the bound.
+            double correctedValue = value;
+            if (abs(value - interval->getUpperBound()) < NumConstants::TINY())
+              correctedValue = interval->getUpperBound() - NumConstants::TINY();
+            RTransformedParameter* pp = new RTransformedParameter(name, correctedValue, interval->getUpperBound(), false);
+            addParameter_(pp);
+            if (verbose)
+              ApplicationTools::displayMessage("Parameter " + name + " was log transformed: " + TextTools::toString(value) + "->" + TextTools::toString(pp->getValue()));
+          }
+        }
+      }
+      else
+      {
+        // Nothing found
+        if (verbose)
+        {
+          ApplicationTools::displayWarning("No transformation found for this constraint '" + constraint->getDescription() + "'! Parameter " + p.getName());
+        }
+        addParameter_(new PlaceboTransformedParameter(name, value));
+      }
+    }
+  }
+}
+
+void ReparametrizationFunctionWrapper::fireParameterChanged(const ParameterList& parameters)
+{
+  // Recompute function parameters:
+  // We could update only the parameter that actually changed,
+  // but that would implied a quick sort on parameter names (nlog(n))
+  // whereas using a loop over the set is in o(n). It should hence be
+  // more efficient in most cases.
+  for (size_t i = 0; i < getNumberOfParameters(); ++i)
+  {
+    double x = dynamic_cast<TransformedParameter&>(getParameter_(i)).getOriginalValue();
+    try
+    {
+      functionParameters_[i].setValue(x);
+    }
+    catch (ConstraintException& ce)
+    {
+      (*ApplicationTools::error << "Oups, value " << x << " led to a constraint exception. The transformed value was " << getParameter_(i).getValue()).endLine();
+      throw ce;
+    }
+  }
+}
+
diff --git a/src/Bpp/Numeric/Function/ReparametrizationFunctionWrapper.h b/src/Bpp/Numeric/Function/ReparametrizationFunctionWrapper.h
new file mode 100644
index 0000000..05d9f96
--- /dev/null
+++ b/src/Bpp/Numeric/Function/ReparametrizationFunctionWrapper.h
@@ -0,0 +1,262 @@
+//
+// File: ReparametrizationFunctionWrapper.h
+// Created by: Julien Dutheil
+// Created on: Fri Jan  30 09:30 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _REPARAMETRIZATIONFUNCTIONWRAPPER_H_
+#define _REPARAMETRIZATIONFUNCTIONWRAPPER_H_
+
+#include "Functions.h"
+#include "../AbstractParametrizable.h"
+#include "../TransformedParameter.h"
+
+namespace bpp {
+
+/**
+ * @brief Function wrapper that remove simple constraints on parameters.
+ *
+ * This function takes as input another function and reparametrize it when possible.
+ * currently, only constraint of the type ]a, b[ where a and b can be +/- inf.
+ */
+class ReparametrizationFunctionWrapper:
+  public virtual Function,
+  public AbstractParametrizable
+{
+   private:
+    Function* function_;
+    ParameterList functionParameters_;
+    
+  public:
+    /**
+     * @brief Build a new reparametrization wrapper for the given function, using all available parameters.
+     *
+     * @param function The function to reparametrize.
+     * @param verbose Print some information.
+     */
+    ReparametrizationFunctionWrapper(Function* function, bool verbose=true) :
+      AbstractParametrizable(function->getNamespace()),
+      function_(function),
+      functionParameters_(function->getParameters())
+    {
+      init_(verbose);
+    }
+
+    /**
+     * @brief Build a new reparametrization wrapper for the given function, using only the specified parameters.
+     *
+     * @param function The function to reparametrize.
+     * @param parameters The list of parameters that will be reparametrized. The intersection with the
+     * list of function parameters will be used in the reparametrized function. Any other parameters
+     * (in the given list or in the original function) will be ignored.
+     * @param verbose Print some information.
+     */
+    ReparametrizationFunctionWrapper(Function* function, const ParameterList& parameters, bool verbose=true) :
+      AbstractParametrizable(function->getNamespace()),
+      function_(function),
+      functionParameters_(function->getParameters().getCommonParametersWith(parameters))
+    {
+      init_(verbose);
+    }
+    
+    ReparametrizationFunctionWrapper(const ReparametrizationFunctionWrapper& rfw) :
+      AbstractParametrizable(rfw),
+      function_(rfw.function_),
+      functionParameters_(rfw.functionParameters_) {}
+    
+    ReparametrizationFunctionWrapper& operator=(const ReparametrizationFunctionWrapper& rfw)
+    {
+      AbstractParametrizable::operator=(rfw),
+      function_ = rfw.function_;
+      functionParameters_ = rfw.functionParameters_;
+      return *this;
+    }
+
+    virtual ~ReparametrizationFunctionWrapper() {}
+
+    ReparametrizationFunctionWrapper* clone() const { return new ReparametrizationFunctionWrapper(*this); }
+
+  private:
+    void init_(bool verbose);
+
+  public:
+    virtual const Function& getFunction() const { return *function_; } 
+    
+    virtual Function& getFunction() { return *function_; } 
+
+    void setParameters(const ParameterList& parameters)
+      throw (ParameterNotFoundException, ConstraintException)
+    {
+//      parameters.printParameters(std::cout);
+      matchParametersValues(parameters);
+      //We only set parameters that have been changed:
+//      functionParameters_.printParameters(std::cout);
+      function_->setParameters(functionParameters_.subList(parameters.getParameterNames()));
+    }
+
+    double getValue() const throw (Exception)
+    {
+      return function_->getValue();
+    }
+
+    void fireParameterChanged (const ParameterList &parameters);
+
+};
+
+/**
+ * @brief Function wrapper that remove simple constraints on parameters. Also transform first order derivatives.
+ *
+ * This function takes as input another function and reparametrize it when possible.
+ * currently, only constraint of the type ]a, b[ where a and b can be +/- inf.
+ */
+class ReparametrizationDerivableFirstOrderWrapper:
+  public virtual DerivableFirstOrder,
+  public ReparametrizationFunctionWrapper
+{
+    
+  public:
+    /**
+     * @brief Build a new reparametrization wrapper for the given function, using all available parameters.
+     *
+     * @param function The function to reparametrize.
+     * @param verbose Print some information.
+     */
+    ReparametrizationDerivableFirstOrderWrapper(DerivableFirstOrder* function, bool verbose=true) :
+      ReparametrizationFunctionWrapper(function, verbose)
+    {}
+
+    /**
+     * @brief Build a new reparametrization wrapper for the given function, using only the specified parameters.
+     *
+     * @param function The function to reparametrize.
+     * @param parameters The list of parameters that will be reparametrized. The intersection with the
+     * list of function parameters will be used in the reparametrized function. Any other parameters
+     * (in the given list or in the original function) will be ignored.
+     * @param verbose Print some information.
+     */
+    ReparametrizationDerivableFirstOrderWrapper(DerivableFirstOrder* function, const ParameterList& parameters, bool verbose=true) :
+      ReparametrizationFunctionWrapper(function, parameters, verbose)
+    {}
+    
+    virtual ~ReparametrizationDerivableFirstOrderWrapper() {}
+
+    ReparametrizationDerivableFirstOrderWrapper* clone() const { return new ReparametrizationDerivableFirstOrderWrapper(*this); }
+
+  private:
+    void init_(bool verbose);
+
+  public:
+    void enableFirstOrderDerivatives(bool yn) { dynamic_cast<DerivableFirstOrder&>(getFunction()).enableFirstOrderDerivatives(yn); }
+    
+    bool enableFirstOrderDerivatives() const { return dynamic_cast<const DerivableFirstOrder&>(getFunction()).enableFirstOrderDerivatives(); }
+
+    double getFirstOrderDerivative(const std::string& variable) const throw (Exception)
+    {
+      return dynamic_cast<const DerivableFirstOrder&>(getFunction()).getFirstOrderDerivative(variable)
+           * dynamic_cast<const TransformedParameter&>(getParameter(variable)).getFirstOrderDerivative();
+    }
+
+};
+
+
+/**
+ * @brief Function wrapper that remove simple constraints on parameters. Also transform first and second order derivatives.
+ *
+ * This function takes as input another function and reparametrize it when possible.
+ * currently, only constraint of the type ]a, b[ where a and b can be +/- inf.
+ */
+class ReparametrizationDerivableSecondOrderWrapper:
+  public virtual DerivableSecondOrder,
+  public ReparametrizationDerivableFirstOrderWrapper
+{
+    
+  public:
+    /**
+     * @brief Build a new reparametrization wrapper for the given function, using all available parameters.
+     *
+     * @param function The function to reparametrize.
+     * @param verbose Print some information.
+     */
+    ReparametrizationDerivableSecondOrderWrapper(DerivableSecondOrder* function, bool verbose=true) :
+      ReparametrizationDerivableFirstOrderWrapper(function, verbose)
+    {}
+
+    /**
+     * @brief Build a new reparametrization wrapper for the given function, using only the specified parameters.
+     *
+     * @param function The function to reparametrize.
+     * @param parameters The list of parameters that will be reparametrized. The intersection with the
+     * list of function parameters will be used in the reparametrized function. Any other parameters
+     * (in the given list or in the original function) will be ignored.
+     * @param verbose Print some information.
+     */
+    ReparametrizationDerivableSecondOrderWrapper(DerivableSecondOrder* function, const ParameterList& parameters, bool verbose=true) :
+      ReparametrizationDerivableFirstOrderWrapper(function, parameters, verbose)
+    {}
+    
+    virtual ~ReparametrizationDerivableSecondOrderWrapper() {}
+
+    ReparametrizationDerivableSecondOrderWrapper* clone() const { return new ReparametrizationDerivableSecondOrderWrapper(*this); }
+
+  private:
+    void init_(bool verbose);
+
+  public:
+    void enableSecondOrderDerivatives(bool yn) { dynamic_cast<DerivableSecondOrder&>(getFunction()).enableSecondOrderDerivatives(yn); }
+    
+    bool enableSecondOrderDerivatives() const { return dynamic_cast<const DerivableSecondOrder&>(getFunction()).enableSecondOrderDerivatives(); }
+
+    double getSecondOrderDerivative(const std::string& variable) const throw (Exception)
+    {
+      return dynamic_cast<const DerivableSecondOrder&>(getFunction()).getSecondOrderDerivative(variable)
+           * pow(dynamic_cast<const TransformedParameter&>(getParameter(variable)).getFirstOrderDerivative(), 2)
+           + dynamic_cast<const DerivableSecondOrder&>(getFunction()).getFirstOrderDerivative(variable)
+           * dynamic_cast<const TransformedParameter&>(getParameter(variable)).getSecondOrderDerivative();
+    }
+
+    double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const throw (Exception)
+    {
+      return dynamic_cast<const DerivableSecondOrder&>(getFunction()).getSecondOrderDerivative(variable1, variable2)
+           * dynamic_cast<const TransformedParameter&>(getParameter(variable1)).getFirstOrderDerivative()
+           * dynamic_cast<const TransformedParameter&>(getParameter(variable2)).getFirstOrderDerivative();
+    }
+ 
+};
+
+} //end of namespace bpp.
+
+#endif //_REPARAMETRIZATIONFUNCTIONWRAPPER_H_
+
diff --git a/src/Bpp/Numeric/Function/SimpleMultiDimensions.cpp b/src/Bpp/Numeric/Function/SimpleMultiDimensions.cpp
new file mode 100644
index 0000000..a651f9d
--- /dev/null
+++ b/src/Bpp/Numeric/Function/SimpleMultiDimensions.cpp
@@ -0,0 +1,114 @@
+//
+// File: SimpleMultiDimensions.cpp
+// Created by: Julien Dutheil
+// Created on: Tue Nov 16 17:51 2004
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+/******************************************************************************/
+
+#include "SimpleMultiDimensions.h"
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************/
+
+SimpleMultiDimensions::SimpleMultiDimensions(Function* function):
+  AbstractOptimizer(function), nbParams_(0), optimizer_(function)
+{
+  setDefaultStopCondition_(new FunctionStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  setOptimizationProgressCharacter("");
+}
+
+/******************************************************************************/
+
+void SimpleMultiDimensions::setFunction(Function* function)
+{
+  AbstractOptimizer::setFunction(function);
+  optimizer_.setFunction(function);
+  getStopCondition()->init();
+}
+
+/******************************************************************************/
+
+void SimpleMultiDimensions::doInit(const ParameterList& params) throw (Exception)
+{
+  nbParams_ = params.size();
+  if (nbParams_ == 0) return;
+
+  // Initialize optimizers:
+  unsigned int nbEvalMax = nbEvalMax_ / static_cast<unsigned int>(nbParams_);
+  optimizer_.setMaximumNumberOfEvaluations(nbEvalMax);
+  optimizer_.setProfiler(getProfiler());
+  optimizer_.setMessageHandler(getMessageHandler());
+  optimizer_.getStopCondition()->setTolerance(getStopCondition()->getTolerance());
+  optimizer_.setConstraintPolicy(getConstraintPolicy());
+  optimizer_.setVerbose(getVerbose() > 0 ? getVerbose() - 1 : 0);
+  optimizer_.setInitialInterval(0., 1.);
+  getFunction()->setParameters(getParameters());
+}
+
+/******************************************************************************/
+
+double SimpleMultiDimensions::doStep() throw (Exception)
+{
+  double f = getFunction()->getValue();
+  for (unsigned int i = 0; i < nbParams_; i++)
+  {
+    if (getVerbose() > 0)
+    {
+      cout << getParameters()[i].getName() << ":";
+      cout.flush();
+    }
+    // Re-init optimizer according to new values:
+    double v = getParameters()[i].getValue();
+    double t = std::max(0.000001, std::min(std::abs(v), getStopCondition()->getTolerance()));
+    optimizer_.setInitialInterval(v - t, v + t);
+    optimizer_.init(getParameters().subList(i));
+
+    // Optimize through this dimension:
+    f = optimizer_.optimize();
+    if (getVerbose() > 0) cout << endl;
+    getParameters_().matchParametersValues(getFunction()->getParameters());
+    nbEval_ += optimizer_.getNumberOfEvaluations(); 
+  }
+  tolIsReached_ = nbParams_ <= 1;
+  return f;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Seq/Io/AbstractOAlignment.h b/src/Bpp/Numeric/Function/SimpleMultiDimensions.h
similarity index 53%
copy from src/Bpp/Seq/Io/AbstractOAlignment.h
copy to src/Bpp/Numeric/Function/SimpleMultiDimensions.h
index 2991063..2747f10 100644
--- a/src/Bpp/Seq/Io/AbstractOAlignment.h
+++ b/src/Bpp/Numeric/Function/SimpleMultiDimensions.h
@@ -1,14 +1,14 @@
 //
-// File: AbstractOAlignment.h
+// File: SimpleMultiDimensions.h
 // Created by: Julien Dutheil
-// Created on: ?
+// Created on: Tue Nov 16 17:51 2004
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,50 +37,63 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _ABSTRACTOALIGNMENT_H_
-#define _ABSTRACTOALIGNMENT_H_
+#ifndef _SIMPLEMULTIDIMENSIONS_H_
+#define _SIMPLEMULTIDIMENSIONS_H_
 
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Container/VectorSequenceContainer.h"
-
-// From the STL:
-#include <string>
-#include <fstream>
+#include "AbstractOptimizer.h"
+#include "BrentOneDimension.h"
 
 namespace bpp
 {
 
 /**
- * @brief Partial implementation of the OAlignment interface.
+ * @brief This Optimizer is a very simple multi-dimensions optimizer, calling
+ * a one dimensional optimizer on each parameter.
+ *
+ * The one-dimensional optimizer used is BrentOneDimension.
+ * Consider using PowellMultiDimensions optimizer for a more efficient modified version of the algorithm.
  */
-class AbstractOAlignment:
-  public virtual OAlignment
+class SimpleMultiDimensions:
+  public AbstractOptimizer
 {
+	private:
+
+		size_t nbParams_;
 
-	public: 
-		AbstractOAlignment() {}
-		virtual ~AbstractOAlignment() {}
+		BrentOneDimension optimizer_; // One dimensional optimizer.
 
 	public:
 
+		SimpleMultiDimensions(Function* function);
+
+		virtual ~SimpleMultiDimensions() {}
+
+    SimpleMultiDimensions* clone() const { return new SimpleMultiDimensions(*this); }
+
+	public:
 		/**
-		 * @name OAlignment methods:
+		 * @name The Optimizer interface.
 		 *
 		 * @{
-		 */ 
-		void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception) = 0;
-		void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-		{
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-			writeAlignment(output, sc);
-			output.close();
-		}
+		 */
+		void setFunction(Function * function);
 		/** @} */
+		
+		void doInit(const ParameterList& params) throw (Exception);
+
+    double doStep() throw (Exception);
+
+    /**
+     * @return The optimizer used to optimize each parameter.
+     */
+    Optimizer& getOneDimensionOptimizer() { return optimizer_; } 
+    /**
+     * @return The optimizer used to optimize each parameter.
+     */
+    const Optimizer& getOneDimensionOptimizer() const { return optimizer_; } 
 };
 
 } //end of namespace bpp.
 
-#endif //_ABSTRACTOALIGNMENT_H_
+#endif //_SIMPLEMULTIDIMENSIONS_H_
 
diff --git a/src/Bpp/Seq/Alphabet/AlphabetExceptions.cpp b/src/Bpp/Numeric/Function/SimpleNewtonMultiDimensions.cpp
similarity index 50%
rename from src/Bpp/Seq/Alphabet/AlphabetExceptions.cpp
rename to src/Bpp/Numeric/Function/SimpleNewtonMultiDimensions.cpp
index 05a36b1..12b3603 100644
--- a/src/Bpp/Seq/Alphabet/AlphabetExceptions.cpp
+++ b/src/Bpp/Numeric/Function/SimpleNewtonMultiDimensions.cpp
@@ -1,14 +1,14 @@
 //
-// File: AlphabetExceptions.cpp
+// File: SimpleNewtonMultiDimensions.cpp
 // Created by: Julien Dutheil
-// Created on: Mon Nov  3 16:41:53 2003
+// Created on: Thu Apr 26 15:29 2007
 //
 
 /*
-Copyright or © or Copr. CNRS, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 19, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,56 +37,74 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "AlphabetExceptions.h"
-#include "Alphabet.h"
-#include <Bpp/Text/TextTools.h>
+/******************************************************************************/
 
-using namespace bpp;
+#include "SimpleNewtonMultiDimensions.h"
 
+using namespace bpp;
 using namespace std;
 
-/******************************************************************************
- *                         Alphabet exceptions:                               *
- ******************************************************************************/
-
-AlphabetException::AlphabetException(const std::string& text, const Alphabet* alpha) :
-	Exception("AlphabetException: " + text + (alpha ? "(" + (alpha->getAlphabetType()) + ")" : string(""))),
-	alphabet_(alpha) {}
-		
 /******************************************************************************/
 
-BadCharException::BadCharException(const std::string& badChar, const std::string& text, const Alphabet* alpha) :
-	AlphabetException("BadCharException: " + badChar + ". " + text, alpha),
-	c_(badChar) {}
-		
-string BadCharException::getBadChar() const { return c_; }
+SimpleNewtonMultiDimensions::SimpleNewtonMultiDimensions(DerivableSecondOrder* function):
+  AbstractOptimizer(function), nbParams_(0), optimizer_(function)
+{
+  setDefaultStopCondition_(new FunctionStopCondition(this));
+  setStopCondition(*getDefaultStopCondition());
+  setOptimizationProgressCharacter("");
+}
 
 /******************************************************************************/
 
-BadIntException::BadIntException(int badInt, const std::string& text, const Alphabet* alpha) :
-	AlphabetException("BadIntException: " + TextTools::toString(badInt) + ". " + text, alpha),
-	i_(badInt) {}
-		
-int BadIntException::getBadInt() const { return i_; }
+void SimpleNewtonMultiDimensions::setFunction(Function* function)
+{
+  AbstractOptimizer::setFunction(function);
+  optimizer_.setFunction(function);
+}
 
 /******************************************************************************/
-		
-AlphabetMismatchException::AlphabetMismatchException(const std::string& text, const Alphabet* alpha1, const Alphabet* alpha2) :
-	Exception("AlphabetMismatchException: " + text + (alpha1 != 0 && alpha2 != 0 ? "(" + alpha1->getAlphabetType() + ", " + alpha2->getAlphabetType() + ")" : string(""))),
-	alphabet1_(alpha1),
-	alphabet2_(alpha2) {}
-		
-vector<const Alphabet*> AlphabetMismatchException::getAlphabets() const
+
+void SimpleNewtonMultiDimensions::doInit(const ParameterList& params) throw (Exception)
 {
-	vector<const Alphabet*> v(2);
-	v[0] = alphabet1_;
-	v[1] = alphabet2_;
-	return v;
+  nbParams_ = params.size();
+  if (nbParams_ == 0) return;
+
+  // Initialize optimizers:
+  unsigned int nbEvalMax = nbEvalMax_ / static_cast<unsigned int>(nbParams_);
+  optimizer_.setMaximumNumberOfEvaluations(nbEvalMax);
+  optimizer_.setProfiler(getProfiler());
+  optimizer_.setMessageHandler(getMessageHandler());
+  optimizer_.getStopCondition()->setTolerance(getStopCondition()->getTolerance());
+  optimizer_.setConstraintPolicy(getConstraintPolicy());
+  optimizer_.setVerbose(getVerbose() > 0 ? getVerbose() - 1 : 0);
+  optimizer_.setMaximumNumberOfCorrections(10);
+  getFunction()->setParameters(getParameters());
 }
 
 /******************************************************************************/
 
-CharStateNotSupportedException::CharStateNotSupportedException(const string & text, const Alphabet * alpha) :
-  AlphabetException("CharStateNotSupportedException: " + text, alpha) {};
+double SimpleNewtonMultiDimensions::doStep() throw (Exception)
+{
+  double f = getFunction()->getValue();
+  for (unsigned int i = 0; i < nbParams_; i++)
+  {
+    if (getVerbose() > 0)
+    {
+      cout << getParameters()[i].getName() << ":";
+      cout.flush();
+    }
+    // Re-init optimizer according to new values:
+    optimizer_.init(getParameters().subList(i));
+
+    // Optimize through this dimension:
+    f = optimizer_.optimize();
+    if (getVerbose() > 0) cout << endl;
+    getParameters_().matchParametersValues(getFunction()->getParameters());
+    nbEval_ += optimizer_.getNumberOfEvaluations(); 
+  }
+  tolIsReached_ = nbParams_ <= 1;
+  return f;
+}
 
 /******************************************************************************/
+
diff --git a/src/Bpp/Seq/Io/AbstractOAlignment.h b/src/Bpp/Numeric/Function/SimpleNewtonMultiDimensions.h
similarity index 53%
copy from src/Bpp/Seq/Io/AbstractOAlignment.h
copy to src/Bpp/Numeric/Function/SimpleNewtonMultiDimensions.h
index 2991063..7de20e4 100644
--- a/src/Bpp/Seq/Io/AbstractOAlignment.h
+++ b/src/Bpp/Numeric/Function/SimpleNewtonMultiDimensions.h
@@ -1,14 +1,14 @@
 //
-// File: AbstractOAlignment.h
+// File: SimpleNewtonMultiDimensions.h
 // Created by: Julien Dutheil
-// Created on: ?
+// Created on: Thu Apr 26 15:29 2007
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,50 +37,62 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _ABSTRACTOALIGNMENT_H_
-#define _ABSTRACTOALIGNMENT_H_
+#ifndef _SIMPLENEWTONMULTIDIMENSIONS_H_
+#define _SIMPLENEWTONMULTIDIMENSIONS_H_
 
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Container/VectorSequenceContainer.h"
-
-// From the STL:
-#include <string>
-#include <fstream>
+#include "AbstractOptimizer.h"
+#include "NewtonOneDimension.h"
 
 namespace bpp
 {
 
 /**
- * @brief Partial implementation of the OAlignment interface.
+ * @brief This Optimizer is a simple multi-dimensions optimizer, calling
+ * the Newton one dimensional optimizer on each parameter.
+ *
+ * The one-dimensional optimizer used is NewtonOneDimension.
  */
-class AbstractOAlignment:
-  public virtual OAlignment
+class SimpleNewtonMultiDimensions:
+  public AbstractOptimizer
 {
+	private:
+
+		size_t nbParams_;
 
-	public: 
-		AbstractOAlignment() {}
-		virtual ~AbstractOAlignment() {}
+		NewtonOneDimension optimizer_; // One dimensional optimizer.
 
 	public:
 
+		SimpleNewtonMultiDimensions(DerivableSecondOrder* function);
+
+		virtual ~SimpleNewtonMultiDimensions() {};
+
+    SimpleNewtonMultiDimensions* clone() const { return new SimpleNewtonMultiDimensions(*this); }
+
+	public:
 		/**
-		 * @name OAlignment methods:
+		 * @name The Optimizer interface.
 		 *
 		 * @{
-		 */ 
-		void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception) = 0;
-		void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-		{
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-			writeAlignment(output, sc);
-			output.close();
-		}
+		 */
+		void setFunction(Function* function);
 		/** @} */
+
+		void doInit(const ParameterList& params) throw (Exception);
+
+		double doStep() throw (Exception);
+
+    /**
+     * @return The optimizer used to optimize each parameter.
+     */
+    Optimizer& getOneDimensionOptimizer() { return optimizer_; } 
+    /**
+     * @return The optimizer used to optimize each parameter.
+     */
+    const Optimizer& getOneDimensionOptimizer() const { return optimizer_; } 
 };
 
 } //end of namespace bpp.
 
-#endif //_ABSTRACTOALIGNMENT_H_
+#endif //_SIMPLENEWTONMULTIDIMENSIONS_H_
 
diff --git a/src/Bpp/Numeric/Function/ThreePointsNumericalDerivative.cpp b/src/Bpp/Numeric/Function/ThreePointsNumericalDerivative.cpp
new file mode 100644
index 0000000..64dfe03
--- /dev/null
+++ b/src/Bpp/Numeric/Function/ThreePointsNumericalDerivative.cpp
@@ -0,0 +1,263 @@
+//
+// File: ThreePointsNumericalDerivative.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Aug 17 15:00 2006
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "ThreePointsNumericalDerivative.h"
+
+using namespace bpp;
+using namespace std;
+
+void ThreePointsNumericalDerivative::updateDerivatives(const ParameterList parameters)
+throw (ParameterNotFoundException, ConstraintException)
+{
+  if (computeD1_ && variables_.size() > 0)
+  {
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(false);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(false);
+    function_->setParameters(parameters);
+    f2_ = function_->getValue();
+    if ((abs(f2_) >= NumConstants::VERY_BIG()) || std::isnan(f2_))
+    {
+      for (size_t i = 0; i < variables_.size(); ++i)
+      {
+        der1_[i] = log(-1);
+        der2_[i] = log(-1);
+      }
+      return;
+    }
+
+    string lastVar;
+    bool functionChanged = false;
+    ParameterList p;
+    bool start = true;
+    for (size_t i = 0; i < variables_.size(); ++i)
+    {
+      string var = variables_[i];
+      if (!parameters.hasParameter(var))
+        continue;
+      if (!start)
+      {
+        vector<string> vars(2);
+        vars[0] = var;
+        vars[1] = lastVar;
+        p = parameters.subList(vars);
+      }
+      else
+      {
+        p = parameters.subList(var);
+        start = false;
+      }
+      lastVar = var;
+      functionChanged = true;
+      double value = function_->getParameterValue(var);
+      double h = -(1. + std::abs(value)) * h_;
+      if (abs(h) < p[0].getPrecision())
+        h = h < 0 ? -p[0].getPrecision() : p[0].getPrecision();
+      double hf1(0), hf3(0);
+      unsigned int nbtry = 0;
+
+      // Compute f1_
+      while (hf1 == 0)
+      {
+        try
+        {
+          p[0].setValue(value + h);
+          function_->setParameters(p); // also reset previous parameter...
+
+          p = p.subList(0);
+          f1_ = function_->getValue();
+          if ((abs(f1_) >= NumConstants::VERY_BIG()) || std::isnan(f1_))
+            throw ConstraintException("f1_ too large", &p[0], f1_);
+          else
+            hf1 = h;
+        }
+        catch (ConstraintException& ce)
+        {
+          if (++nbtry == 10) // no possibility to compute derivatives
+            break;
+          else if (h < 0)
+            h = -h;  // try on the right
+          else
+            h /= -2;  // try again on the left with smaller interval
+        }
+      }
+
+      if (hf1 != 0)
+      {
+        // Compute f3_
+        if (h < 0)
+          h = -h;  // on the right
+        else
+          h /= 2;  //  on the left with smaller interval
+
+        nbtry = 0;
+        while (hf3 == 0)
+        {
+          try
+          {
+            p[0].setValue(value + h);
+            function_->setParameters(p); // also reset previous parameter...
+
+            p = p.subList(0);
+            f3_ = function_->getValue();
+            if ((abs(f3_) >= NumConstants::VERY_BIG()) || std::isnan(f3_))
+              throw ConstraintException("f3_ too large", &p[0], f3_);
+            else
+              hf3 = h;
+          }
+          catch (ConstraintException& ce)
+          {
+            if (++nbtry == 10) // no possibility to compute derivatives
+              break;
+            else if (h < 0)
+              h = -h;  // try on the right
+            else
+              h /= -2;  // try again on the left with smaller interval
+          }
+        }
+      }
+
+      if (hf3 == 0)
+      {
+        der1_[i] = log(-1);
+        der2_[i] = log(-1);
+      }
+      else
+      {
+        der1_[i] = (f1_ - f3_) / (hf1 - hf3);
+        der2_[i] = ((f1_ - f2_) / hf1 - (f3_ - f2_) / hf3) * 2 / (hf1 - hf3);
+      }
+    }
+
+
+    if (computeCrossD2_)
+    {
+      string lastVar1, lastVar2;
+      for (unsigned int i = 0; i < variables_.size(); i++)
+      {
+        string var1 = variables_[i];
+        if (!parameters.hasParameter(var1))
+          continue;
+        for (unsigned int j = 0; j < variables_.size(); j++)
+        {
+          if (j == i)
+          {
+            crossDer2_(i, j) = der2_[i];
+            continue;
+          }
+          string var2 = variables_[j];
+          if (!parameters.hasParameter(var2))
+            continue;
+
+          vector<string> vars(2);
+          vars[0] = var1;
+          vars[1] = var2;
+          if (i > 0 && j > 0)
+          {
+            if (lastVar1 != var1 && lastVar1 != var2)
+              vars.push_back(lastVar1);
+            if (lastVar2 != var1 && lastVar2 != var2)
+              vars.push_back(lastVar2);
+          }
+          p = parameters.subList(vars);
+
+          double value1 = function_->getParameterValue(var1);
+          double value2 = function_->getParameterValue(var2);
+          double h1 = (1. + std::abs(value1)) * h_;
+          double h2 = (1. + std::abs(value2)) * h_;
+
+          // Compute 4 additional points:
+          try
+          {
+            p[0].setValue(value1 - h1);
+            p[1].setValue(value2 - h2);
+            function_->setParameters(p); // also reset previous parameter...
+            vector<size_t> tmp(2);
+            tmp[0] = 0;
+            tmp[1] = 1;
+            p = p.subList(tmp); // removed the previous parameters.
+            f11_ = function_->getValue();
+
+            p[1].setValue(value2 + h2);
+            function_->setParameters(p.subList(1));
+            f12_ = function_->getValue();
+
+            p[0].setValue(value1 + h1);
+            function_->setParameters(p.subList(0));
+            f22_ = function_->getValue();
+
+            p[1].setValue(value2 - h2);
+            function_->setParameters(p.subList(1));
+            f21_ = function_->getValue();
+
+            crossDer2_(i, j) = ((f22_ - f21_) - (f12_ - f11_)) / (4 * h1 * h2);
+          }
+          catch (ConstraintException& ce)
+          {
+            throw Exception("ThreePointsNumericalDerivative::setParameters. Could not compute cross derivatives at limit.");
+          }
+
+          lastVar1 = var1;
+          lastVar2 = var2;
+        }
+      }
+    }
+
+    // Reset last parameter and compute analytical derivatives if any.
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(computeD1_);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(computeD2_);
+    if (functionChanged)
+      function_->setParameters(parameters.subList(lastVar));
+  }
+  else
+  {
+    // Reset initial value and compute analytical derivatives if any.
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(computeD1_);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(computeD2_);
+    function_->setParameters(parameters);
+    // Just in case derivatives are not computed:
+    f2_ = function_->getValue();
+  }
+}
+
diff --git a/src/Bpp/Numeric/Function/ThreePointsNumericalDerivative.h b/src/Bpp/Numeric/Function/ThreePointsNumericalDerivative.h
new file mode 100644
index 0000000..e413494
--- /dev/null
+++ b/src/Bpp/Numeric/Function/ThreePointsNumericalDerivative.h
@@ -0,0 +1,135 @@
+//
+// File: ThreePointsNumericalDerivative.h
+// Created by: Julien Dutheil
+// Created on: Thu Aug 17 15:00 2006
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _THREEPOINTSNUMERICALDERIVATIVE_H_
+#define _THREEPOINTSNUMERICALDERIVATIVE_H_
+
+#include "Functions.h"
+#include "AbstractNumericalDerivative.h"
+
+// From the STL:
+#include <map>
+#include <vector>
+#include <string>
+
+namespace bpp
+{
+/**
+ * @brief Three points numerical derivative function wrapper.
+ *
+ * Numerical derivatives use three points to compute the derivatives.
+ * @f$x_0 at f$ is the focus point, @f$x_{-1} = x_0-h at f$ and @f$x_{+1} = x_0+h at f$
+ * are other points, with function values @f$f_0 at f$, @f$f_{-1}@f$ and @f$f_{+1}@f$ respectively.
+ * The derivatives are then computed using the central formulas:
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_{+1}-f_{-1}}{2h}\\
+ * \dfrac{\partial^2 f}{\partial x^2} &=& \dfrac{f_{+1}-2f_0+f_{-1}}{h^2}\\
+ * @f}
+ * In case of border limit (when @f$x_{-1}@f$ or @f$x_{+1}@f$ are not computable),
+ * the foreward and backward computations are performed, respectively:
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_{+1}-f_0}{h}\\
+ * \dfrac{\partial^2 f}{\partial x^2} &=& \dfrac{f_{+2}-2f_{+1}+f_0}{h^2}\\
+ * @f}
+ * and
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_0-f_{-1}}{h}\\
+ * \dfrac{\partial^2 f}{\partial x^2} &=& \dfrac{f_0-2f_{-1}+f_{-2}}{h^2}\\
+ * @f}
+ *
+ * The @f$h at f$ parameter is computed in a parameter dependent manner:
+ * @f$ h = x \times e at f$, with @f$x \neq 0 at f$ being the current parameter value.
+ * If @f$x = 0 at f$, @f$h = e at f$.
+ * Default value is provided for @f$e at f$ and corresponds to the _h field.
+ * The default value works fine in most cases, but you may want to change it using the setInterval method.
+ *
+ * @see AbstractNumericalDerivative
+ */
+class ThreePointsNumericalDerivative :
+  public AbstractNumericalDerivative
+{
+private:
+  double f1_, f2_, f3_, f11_, f22_, f12_, f21_;
+
+public:
+  ThreePointsNumericalDerivative (Function* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_(),
+    f3_(),
+    f11_(),
+    f22_(),
+    f12_(),
+    f21_() {}
+  ThreePointsNumericalDerivative (DerivableFirstOrder* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_(),
+    f3_(),
+    f11_(),
+    f22_(),
+    f12_(),
+    f21_() {}
+  ThreePointsNumericalDerivative (DerivableSecondOrder* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_(),
+    f3_(),
+    f11_(),
+    f22_(),
+    f12_(),
+    f21_() {}
+  virtual ~ThreePointsNumericalDerivative() {}
+
+  ThreePointsNumericalDerivative* clone() const { return new ThreePointsNumericalDerivative(*this); }
+
+public:
+  double getValue() const throw (Exception)
+  {
+    return f2_;
+  }
+
+protected:
+  void updateDerivatives(const ParameterList parameters)
+  throw (ParameterNotFoundException, ConstraintException);
+};
+} // end of namespace bpp.
+
+#endif // _THREEPOINTSNUMERICALDERIVATIVE_H_
+
diff --git a/src/Bpp/Numeric/Function/TwoPointsNumericalDerivative.cpp b/src/Bpp/Numeric/Function/TwoPointsNumericalDerivative.cpp
new file mode 100644
index 0000000..295b7d7
--- /dev/null
+++ b/src/Bpp/Numeric/Function/TwoPointsNumericalDerivative.cpp
@@ -0,0 +1,127 @@
+//
+// File: TwoPointsNumericalDerivative.cpp
+// Created by: Julien Dutheil
+// Created on: Mon May 28 10:33 2007
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "TwoPointsNumericalDerivative.h"
+
+using namespace bpp;
+using namespace std;
+
+void TwoPointsNumericalDerivative::updateDerivatives(const ParameterList parameters)
+throw (ParameterNotFoundException, ConstraintException)
+{
+  if (computeD1_ && variables_.size() > 0)
+  {
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(false);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(false);
+    function_->setParameters(parameters);
+    f1_ = function_->getValue();
+    string lastVar;
+    bool functionChanged = false;
+    bool start = true;
+    for (unsigned int i = 0; i < variables_.size(); i++)
+    {
+      string var = variables_[i];
+      if (!parameters.hasParameter(var))
+        continue;
+      ParameterList p;
+      if (!start)
+      {
+        vector<string> vars(2);
+        vars[0] = var;
+        vars[1] = lastVar;
+        lastVar = var;
+        functionChanged = true;
+        p = parameters.subList(vars);
+      }
+      else
+      {
+        p = parameters.subList(var);
+        lastVar = var;
+        functionChanged = true;
+        start = false;
+      }
+      double value = function_->getParameterValue(var);
+      double h = (1 + std::abs(value)) * h_;
+      // Compute one other point:
+      try
+      {
+        p[0].setValue(value + h);
+        function_->setParameters(p);
+        f2_ = function_->getValue();
+      }
+      catch (ConstraintException& ce1)
+      {
+        // Right limit raised, use backward approximation:
+        try
+        {
+          p[0].setValue(value - h);
+          function_->setParameters(p);
+          f2_ = function_->getValue();
+          der1_[i] = (f1_ - f2_) / h;
+        }
+        catch (ConstraintException& ce2)
+        {
+          // PB: can't compute derivative, because of a two narrow interval (lower than h)
+          throw ce2;
+        }
+      }
+      // No limit raised, use forward approximation:
+      der1_[i] = (f2_ - f1_) / h;
+    }
+    // Reset last parameter and compute analytical derivatives if any:
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(computeD1_);
+    if (functionChanged)
+      function_->setParameters(parameters.subList(lastVar));
+  }
+  else
+  {
+    // Reset initial value and compute analytical derivatives if any.
+    if (function1_)
+      function1_->enableFirstOrderDerivatives(computeD1_);
+    if (function2_)
+      function2_->enableSecondOrderDerivatives(computeD2_);
+    // Just in case derivatives are not computed:
+    function_->setParameters(parameters);
+    f1_ = function_->getValue();
+  }
+}
+
diff --git a/src/Bpp/Numeric/Function/TwoPointsNumericalDerivative.h b/src/Bpp/Numeric/Function/TwoPointsNumericalDerivative.h
new file mode 100644
index 0000000..c871606
--- /dev/null
+++ b/src/Bpp/Numeric/Function/TwoPointsNumericalDerivative.h
@@ -0,0 +1,121 @@
+//
+// File: TwoPointsNumericalDerivative.h
+// Created by: Julien Dutheil
+// Created on: Mon May 28 10:33 2007
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _TWOPOINTSNUMERICALDERIVATIVE_H_
+#define _TWOPOINTSNUMERICALDERIVATIVE_H_
+
+#include "Functions.h"
+#include "AbstractNumericalDerivative.h"
+
+// From the STL:
+#include <map>
+#include <vector>
+#include <string>
+
+namespace bpp
+{
+/**
+ * @brief Two points numerical derivative function wrapper.
+ *
+ * Numerical derivatives use two points to compute the (first order) derivatives.
+ * @f$x_0 at f$ is the focus point and @f$x_{+1} = x_0+h at f$ (or @f$x_0-h at f$, if constrained on the right).
+ * Corresponding function values are @f$f_0 at f$, @f$f_{-1}@f$ and @f$f_{+1/-1}@f$ respectively.
+ * The derivatives are then computed using the central formulas:
+ * @f{eqnarray*}
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_{+1}-f_{0}}{h}\mathrm{\ or}\\
+ * \dfrac{\partial   f}{\partial x  } &=& \dfrac{f_{0}-f_{-1}}{h}\\
+ * @f}
+ * This class does not allow computation of second order derivatives.
+ *
+ * The @f$h at f$ parameter is computed in a parameter dependent manner:
+ * @f$ h = x \times e at f$, with @f$x \neq 0 at f$ being the current parameter value.
+ * If @f$x = 0 at f$, @f$h = e at f$.
+ * Default value is provided for @f$e at f$ and corresponds to the _h field.
+ * The default value works fine in most cases, but you may want to change it using the setInterval method.
+ *
+ * @see AbstractNumericalDerivative, ThreePointsNumericalDerivative, FivePointsNumericalDerivative
+ */
+class TwoPointsNumericalDerivative :
+  public AbstractNumericalDerivative
+{
+private:
+  double f1_, f2_;
+
+public:
+  TwoPointsNumericalDerivative(Function* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_() {}
+  TwoPointsNumericalDerivative(DerivableFirstOrder* function) :
+    AbstractNumericalDerivative(function),
+    f1_(),
+    f2_() {}
+  virtual ~TwoPointsNumericalDerivative() {}
+
+  TwoPointsNumericalDerivative* clone() const { return new TwoPointsNumericalDerivative(*this); }
+
+public:
+  double getValue() const throw (Exception) { return f1_; }
+
+  /**
+   * @name The DerivableSecondOrder interface
+   *
+   * @{
+   */
+  double getSecondOrderDerivative(const std::string& variable) const
+  throw (Exception)
+  {
+    throw Exception("Second order derivative not avalaible with two points method.");
+  }
+
+  double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const
+  throw (Exception)
+  {
+    throw Exception("Unimplemented cross derivative.");
+  }
+  /** @} */
+
+protected:
+  void updateDerivatives(const ParameterList parameters)
+  throw (ParameterNotFoundException, ConstraintException);
+};
+} // end of namespace bpp.
+
+#endif // _TWOPOINTSNUMERICALDERIVATIVE_H_
+
diff --git a/src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.cpp b/src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.cpp
new file mode 100644
index 0000000..028f7df
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.cpp
@@ -0,0 +1,129 @@
+//
+// File: AbstractHmmTransitionMatrix.cpp
+// Created by: Laurent Guéguen
+// Created on: lundi 10 février 2014, à 10h 59
+//
+
+/*
+Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "AbstractHmmTransitionMatrix.h"
+
+#include "../Matrix/MatrixTools.h"
+#include "../VectorTools.h"
+#include "../Random/RandomTools.h"
+
+using namespace bpp;
+using namespace std;
+
+AbstractHmmTransitionMatrix::AbstractHmmTransitionMatrix(const HmmStateAlphabet* alph, const string& prefix) :
+  alph_(alph),
+  pij_((size_t)alph->getNumberOfStates(), (size_t)alph->getNumberOfStates()),
+  tmpmat_((size_t)alph->getNumberOfStates(), (size_t)alph->getNumberOfStates()),
+  eqFreq_((size_t)alph->getNumberOfStates()),
+  upToDate_(false)
+{
+}
+
+AbstractHmmTransitionMatrix::AbstractHmmTransitionMatrix(const AbstractHmmTransitionMatrix& hptm) :
+  alph_(hptm.alph_),
+  pij_(hptm.pij_),
+  tmpmat_(hptm.tmpmat_),
+  eqFreq_(hptm.eqFreq_),
+  upToDate_(hptm.upToDate_)
+{
+}
+
+AbstractHmmTransitionMatrix& AbstractHmmTransitionMatrix::operator=(const AbstractHmmTransitionMatrix& hptm)
+{
+  alph_=hptm.alph_;
+  pij_=hptm.pij_;
+  tmpmat_=hptm.tmpmat_;
+  eqFreq_=hptm.eqFreq_;
+  upToDate_=hptm.upToDate_;
+  
+  return *this;
+}
+
+void AbstractHmmTransitionMatrix::setHmmStateAlphabet(const HmmStateAlphabet* stateAlphabet) throw (HmmUnvalidAlphabetException)
+{
+  if (stateAlphabet==NULL)
+    throw HmmUnvalidAlphabetException("Null alphabet in AbstractHmmTransitionMatrix::setHmmStateAlphabet");
+
+  alph_=stateAlphabet;
+}
+
+vector<size_t> AbstractHmmTransitionMatrix::sample(size_t size) const
+{
+  vector<size_t> vres;
+  if (size==0)
+    return vres;
+
+  size_t nbStates=getHmmStateAlphabet()->getNumberOfStates();
+
+  // update pij_
+  getPij();
+    
+  size_t sta=0, stb;
+  double prob = RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0);
+
+  for (size_t i = 0; i < nbStates; ++i) {
+    prob-=eqFreq_[i];
+    if (prob < 0) {
+      sta=i;
+      break;
+    }
+  }
+        
+  vres.push_back(sta);
+
+  for (size_t pos=1;pos<size;pos++)
+  {
+    prob = RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0);
+
+    const vector<double>& row=pij_.getRow(sta);
+
+    for (size_t i = 0; i < nbStates; ++i) {
+      prob-=row[i];
+      if (prob < 0) {
+        stb=i;
+        break;
+      }
+    }
+    vres.push_back(stb);
+    sta=stb;
+  }
+  return vres;
+}
+
+  
diff --git a/src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.h b/src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.h
new file mode 100644
index 0000000..c850cf4
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.h
@@ -0,0 +1,120 @@
+//
+// File: AbstractHmmTransitionMatrix.h
+// Created by: Laurent Guéguen
+// Created on: lundi 10 février 2014, à 10h 55
+//
+
+/*
+Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ABSTRACTHMMTRANSITIONMATRIX_H_
+#define _ABSTRACTHMMTRANSITIONMATRIX_H_
+
+#include "HmmStateAlphabet.h"
+#include "HmmTransitionMatrix.h"
+
+#include "../VectorTools.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Partial implementation of HmmTransitionMatrix.
+ *
+ */
+  
+class AbstractHmmTransitionMatrix:
+  public virtual HmmTransitionMatrix
+{
+private:
+  const HmmStateAlphabet* alph_;
+
+protected:
+  mutable RowMatrix<double> pij_, tmpmat_;
+
+  mutable Vdouble eqFreq_;
+
+  mutable bool upToDate_;
+  
+public:
+
+  AbstractHmmTransitionMatrix(const HmmStateAlphabet* alph, const std::string& prefix = "");
+
+  AbstractHmmTransitionMatrix(const AbstractHmmTransitionMatrix& hptm);
+
+  AbstractHmmTransitionMatrix& operator=(const AbstractHmmTransitionMatrix& hptm);
+
+  /**
+   * @return The hidden alphabet associated to this model.
+   */
+
+  const HmmStateAlphabet* getHmmStateAlphabet() const
+  {
+    return alph_;
+  }
+
+  /**
+   * @brief Set the new hidden state alphabet
+   * @param stateAlphabet The new state alphabet
+   * @throw UnvalidStateAlphabetException if the new alphabet is uncorrect (for instance is NULL pointer).
+   */
+  
+  void setHmmStateAlphabet(const HmmStateAlphabet* stateAlphabet) throw (HmmUnvalidAlphabetException);
+   
+  /**
+   * @return The number of states in the model.
+   */
+
+  size_t getNumberOfStates() const
+  {
+    return alph_->getNumberOfStates();
+  }
+
+  /**
+   * @brief sampling of a sequence of states. Starting point is
+   * sampled from the equilibrium distribution.
+   *
+   * @param size the length of the sequence
+   * @return a vector of states index sampled from the Transition
+   * probabilities
+   *
+   */
+
+  std::vector<size_t> sample(size_t size) const;
+  
+};
+
+} //end of namespace bpp
+
+#endif //_ABSTRACTHMMTRANSITIONMATRIX_H_
+
diff --git a/src/Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.cpp b/src/Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.cpp
new file mode 100644
index 0000000..48c071f
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.cpp
@@ -0,0 +1,113 @@
+//
+// File: AutoCorrelationTransitionMatrix.cpp
+// Created by: Laurent Guéguen
+// Created on: lundi 10 février 2014, à 09h 56
+//
+
+/*
+Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "AutoCorrelationTransitionMatrix.h"
+
+#include "../../Text/TextTools.h"
+
+#include "../Matrix/MatrixTools.h"
+#include "../VectorTools.h"
+
+using namespace bpp;
+using namespace std;
+
+AutoCorrelationTransitionMatrix::AutoCorrelationTransitionMatrix(const HmmStateAlphabet* alph, const string& prefix) :
+  AbstractHmmTransitionMatrix(alph),
+  AbstractParametrizable(prefix),
+  vAutocorrel_()
+{
+  size_t size=(size_t)getNumberOfStates();
+
+  for (size_t i=0; i<size; i++)
+    {
+      vAutocorrel_.push_back(1./(double)size);
+      addParameter_(new Parameter(prefix + "lambda"+TextTools::toString(i+1), 1./(double)size, &Parameter::PROP_CONSTRAINT_EX));
+    }
+
+  for (size_t i = 0; i < size; i++)
+    eqFreq_[i] = 1./(double)size;
+}
+
+
+AutoCorrelationTransitionMatrix::AutoCorrelationTransitionMatrix(const AutoCorrelationTransitionMatrix& aptm) :
+  AbstractHmmTransitionMatrix(aptm),
+  AbstractParametrizable(aptm),
+  vAutocorrel_(aptm.vAutocorrel_)
+{
+}
+
+AutoCorrelationTransitionMatrix& AutoCorrelationTransitionMatrix::operator=(const AutoCorrelationTransitionMatrix& aptm)
+{
+  AbstractHmmTransitionMatrix::operator=(aptm);
+  AbstractParametrizable::operator=(aptm);
+  
+  vAutocorrel_=aptm.vAutocorrel_;
+  
+  return *this;
+}
+
+const Matrix<double>& AutoCorrelationTransitionMatrix::getPij() const
+ {
+   if (!upToDate_){
+     for (size_t i = 0; i < vAutocorrel_.size(); ++i)
+       for (size_t j = 0; j < vAutocorrel_.size(); ++j)
+         pij_(i,j) = (i==j) ? vAutocorrel_[i] : (1 - vAutocorrel_[i]) / static_cast<double>(getNumberOfStates()-1);
+
+     upToDate_ = true;
+   }
+   
+   return pij_;
+ }
+
+const std::vector<double>& AutoCorrelationTransitionMatrix::getEquilibriumFrequencies() const
+{
+  return eqFreq_;
+}
+
+void AutoCorrelationTransitionMatrix::fireParameterChanged(const ParameterList& parameters)
+{
+  size_t salph=getNumberOfStates();
+
+  for (size_t i=0; i< salph; i++)
+    vAutocorrel_[i]=getParameterValue("lambda"+TextTools::toString(i+1));
+  
+  upToDate_=false;
+}
+
+
diff --git a/src/Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.h b/src/Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.h
new file mode 100644
index 0000000..cb3ec80
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.h
@@ -0,0 +1,118 @@
+//
+// File: AutoCorrelationTransitionMatrix.h
+// Created by: Laurent Guéguen
+// Created on: lundi 10 février 2014, à 09h 56
+//
+
+/*
+Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _AUTOCORRELATIONTRANSITIONMATRIX_H_
+#define _AUTOCORRELATIONTRANSITIONMATRIX_H_
+
+#include "AbstractHmmTransitionMatrix.h"
+
+#include "../AbstractParameterAliasable.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Describe the auto-correlation probabilities inside hidden
+ *  states of a Hidden Markov Model. 
+ *
+ *  This modelling behaves like a HMM in which, from a given state,
+ * all transition probabilities to the other states are equal.
+ *
+ * The parameters are the within states transition probabilities,
+ * denoted as \c "lambaN" with N the number of the state (1 is the
+ * first).
+ */
+  
+class AutoCorrelationTransitionMatrix:
+  public virtual AbstractHmmTransitionMatrix,
+  public AbstractParametrizable
+{
+private:
+  std::vector<double> vAutocorrel_;
+
+public:
+
+  AutoCorrelationTransitionMatrix(const HmmStateAlphabet* alph, const std::string& prefix = "");
+
+  AutoCorrelationTransitionMatrix(const AutoCorrelationTransitionMatrix& hptm);
+
+  AutoCorrelationTransitionMatrix& operator=(const AutoCorrelationTransitionMatrix& hptm);
+
+  AutoCorrelationTransitionMatrix* clone() const { return new AutoCorrelationTransitionMatrix(*this);}
+
+  /**
+   * @brief Get the transition probability between two states.
+   *
+   * @param i initial state.
+   * @param j final state.
+   * @return the transition probability between the two states.
+   */
+  double Pij(size_t i, size_t j) const
+  {
+    return (i == j) ? vAutocorrel_[i] : (1 - vAutocorrel_[i]) / static_cast<double>(getNumberOfStates() - 1);
+  }
+
+  /**
+   * @brief Get all transition probabilities as a matrix.
+   *
+   * @return A n*n matrix will all transition probabilities (n being the number of hidden states).
+   */
+
+  const Matrix<double>& getPij() const;
+
+  /**
+   * @return The vector of equilibrium frequencies of the Markov chain described by the matrix.
+   */
+
+  const std::vector<double>& getEquilibriumFrequencies() const;
+
+
+  /*
+   * @brief From AbstractParametrizable interface
+   *
+   */
+
+  void fireParameterChanged(const ParameterList& parameters);
+  
+};
+
+} //end of namespace bpp
+
+#endif //_AUTOCORRELATIONTRANSITIONMATRIX_H_
+
diff --git a/src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.cpp b/src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.cpp
new file mode 100644
index 0000000..cff06d3
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.cpp
@@ -0,0 +1,142 @@
+//
+// File: FullHmmTransitionMatrix.cpp
+// Created by: Laurent Guéguen
+// Created on: samedi 21 septembre 2013, à 14h 43
+//
+
+/*
+Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "FullHmmTransitionMatrix.h"
+
+#include "../../Text/TextTools.h"
+
+#include "../Matrix/MatrixTools.h"
+#include "../VectorTools.h"
+
+using namespace bpp;
+using namespace std;
+
+FullHmmTransitionMatrix::FullHmmTransitionMatrix(const HmmStateAlphabet* alph, const string& prefix) :
+  AbstractHmmTransitionMatrix(alph),
+  AbstractParametrizable(prefix),
+  vSimplex_()
+{
+  size_t size=(size_t)getNumberOfStates();
+
+  for (size_t i=0; i<size; i++)
+    {
+      vSimplex_.push_back(Simplex(size,1,false,prefix + TextTools::toString(i+1)+"."));
+      addParameters_(vSimplex_[i].getParameters());
+    }
+}
+
+FullHmmTransitionMatrix::FullHmmTransitionMatrix(const FullHmmTransitionMatrix& hptm) :
+  AbstractHmmTransitionMatrix(hptm),
+  AbstractParametrizable(hptm),
+  vSimplex_(hptm.vSimplex_)
+{
+}
+
+FullHmmTransitionMatrix& FullHmmTransitionMatrix::operator=(const FullHmmTransitionMatrix& hptm)
+{
+  AbstractHmmTransitionMatrix::operator=(hptm);
+  AbstractParametrizable::operator=(hptm);
+  
+  return *this;
+}
+
+void FullHmmTransitionMatrix::setTransitionProbabilities(const Matrix<double>& mat)
+{
+  if (mat.getNumberOfRows()!=vSimplex_.size())
+    throw BadSizeException("FullHmmTransitionMatrix::setTransitionProbabilities: Wrong number of rows in given Matrix", mat.getNumberOfRows(), vSimplex_.size());
+  
+  ParameterList pl;
+  
+  for (size_t i=0; i<mat.getNumberOfRows();i++)
+  {
+    vSimplex_[i].setFrequencies(mat.row(i));
+    ParameterList pls=vSimplex_[i].getParameters();
+    for (size_t j=0; j<pls.size(); j++)
+    {
+      Parameter* p=pls[j].clone();
+      p->setName(TextTools::toString(i+1)+"."+p->getName());
+      pl.addParameter(p);
+    }
+  }
+  
+  matchParametersValues(pl);
+}
+
+
+const Matrix<double>& FullHmmTransitionMatrix::getPij() const
+ {
+   if (!upToDate_){
+     for (size_t i=0; i<vSimplex_.size(); i++)
+       for (size_t j=0; j<vSimplex_[i].dimension(); j++)
+         pij_(i,j)=vSimplex_[i].prob(j);
+     upToDate_=true;
+   }
+   
+   return pij_;
+ }
+
+const std::vector<double>& FullHmmTransitionMatrix::getEquilibriumFrequencies() const
+{
+  size_t salph=getNumberOfStates();
+  
+  if (!upToDate_){
+    pij_=getPij();
+
+    MatrixTools::pow(pij_, 256, tmpmat_);
+
+    for (size_t i = 0; i < salph; i++)
+      eqFreq_[i] = tmpmat_(0,i);
+    
+    upToDate_=true;
+  }
+
+  return eqFreq_;
+}
+
+void FullHmmTransitionMatrix::fireParameterChanged(const ParameterList& parameters)
+{
+  size_t salph=getNumberOfStates();
+
+  for (size_t i=0; i< salph; i++)
+    vSimplex_[i].matchParametersValues(parameters);
+  
+  upToDate_=false;
+}
+
+
diff --git a/src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.h b/src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.h
new file mode 100644
index 0000000..f0d4aca
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/FullHmmTransitionMatrix.h
@@ -0,0 +1,130 @@
+//
+// File: FullHmmTransitionMatrix.h
+// Created by: Laurent Guéguen
+// Created on: samedi 21 septembre 2013, à 00h 41
+//
+
+/*
+Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _FULLHMMTRANSITIONMATRIX_H_
+#define _FULLHMMTRANSITIONMATRIX_H_
+
+#include "../Prob/Simplex.h"
+
+#include "AbstractHmmTransitionMatrix.h"
+
+#include "../AbstractParameterAliasable.h"
+
+namespace bpp
+{
+
+/**
+ * @brief Describe the transition probabilities between hidden states of a Hidden Markov Model.
+ *
+ *
+ * Transition probabilities are described through simplexes.
+ *
+ *
+ * Parameters are denoted \c "I.Simplex.thetaJ" where \c I is the line number
+ * of the transition matrix, and \c "thetaJ" is the matching parameter
+ * in the Ith Simplex. 
+ *
+ * @see Simplex
+ */
+  
+class FullHmmTransitionMatrix:
+  public virtual AbstractHmmTransitionMatrix,
+  public AbstractParametrizable
+{
+private:
+  std::vector<Simplex> vSimplex_;
+
+public:
+
+  FullHmmTransitionMatrix(const HmmStateAlphabet* alph, const std::string& prefix = "");
+
+  FullHmmTransitionMatrix(const FullHmmTransitionMatrix& hptm);
+
+  FullHmmTransitionMatrix& operator=(const FullHmmTransitionMatrix& hptm);
+
+  FullHmmTransitionMatrix* clone() const { return new FullHmmTransitionMatrix(*this);}
+
+  /**
+   * @brief Set the matrix of the transition probabilities.
+   *
+   */
+  
+  void setTransitionProbabilities(const Matrix<double>& mat);
+  
+  /**
+   * @brief Get the transition probability between two states.
+   *
+   * @param i initial state.
+   * @param j final state.
+   * @return the transition probability between the two states.
+   */
+
+  double Pij(size_t i, size_t j) const
+  {
+    return vSimplex_[i].prob(j);
+  }
+
+  /**
+   * @brief Get all transition probabilities as a matrix.
+   *
+   * @return A n*n matrix will all transition probabilities (n being the number of hidden states).
+   */
+
+  const Matrix<double>& getPij() const;
+
+  /**
+   * @return The vector of equilibrium frequencies of the Markov chain described by the matrix.
+   */
+
+  const std::vector<double>& getEquilibriumFrequencies() const;
+
+
+  /*
+   * @brief From AbstractParametrizable interface
+   *
+   */
+
+  void fireParameterChanged(const ParameterList& parameters);
+  
+};
+
+} //end of namespace bpp
+
+#endif //_FULLHMMTRANSITIONMATRIX_H_
+
diff --git a/src/Bpp/Numeric/Hmm/HmmEmissionProbabilities.h b/src/Bpp/Numeric/Hmm/HmmEmissionProbabilities.h
new file mode 100644
index 0000000..970c662
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/HmmEmissionProbabilities.h
@@ -0,0 +1,131 @@
+//
+// File: HmmEmissionProbabilities.h
+// Created by: Julien Dutheil
+// Created on: Fri Sep 04 13:14 2009 from file HmmLikelihood.
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _HMMEMISSIONPROBABILITIES_H_
+#define _HMMEMISSIONPROBABILITIES_H_
+
+#include "HmmStateAlphabet.h"
+#include "HmmExceptions.h"
+#include "../Parametrizable.h"
+
+//From the STL:
+#include <vector>
+
+namespace bpp
+{
+
+/**
+ * @brief Interface for computing emission probabilities in a Hidden Markov Model.
+ *
+ * This class is part of the HMM framework. It compute the probabilities of the data
+ * conditionned on each hidden state. The emission probabilities class also has in charge
+ * the data, its putative compression, and the number of position in the sequence of
+ * observed states.
+ *
+ * @see HmmStateAlphabet
+ * @see HmmTransitionMatrix
+ */
+  class HmmEmissionProbabilities:
+    public virtual Parametrizable
+  {
+  public:
+    virtual HmmEmissionProbabilities* clone() const = 0;
+
+    virtual const HmmStateAlphabet* getHmmStateAlphabet() const = 0;
+ 
+    /**
+     * @brief Set the new hidden state alphabet.
+     * @param stateAlphabet The new state alphabet.
+     * @throw UnvalidStateAlphabetException if the new alphabet is uncorrect (for instance is NULL pointer).
+     */
+    virtual void setHmmStateAlphabet(const HmmStateAlphabet* stateAlphabet) throw (HmmUnvalidAlphabetException) = 0;
+
+    /**
+     * @brief Operator access to the emission probabilities.
+     *
+     * This is the fastest way to get the values, but no checking is performed on the indices.
+     * For debugging purpose, the getEmissionProbability would be a safer use.
+     *
+     * @param pos The position of the sequential data to consider.
+     * @param state The index of the hidden state to consider, as defined by the HmmStateAlphabet object associated to this class.
+     */
+  
+    virtual double operator()(size_t pos, size_t state) const = 0;
+
+    virtual void computeDEmissionProbabilities(std::string& variable) const
+    {
+      throw (NotImplementedException("HmmEmissionProbabilities::computeDEmissionProbabilities is not overdefined."));
+    }
+  
+    virtual void computeD2EmissionProbabilities(std::string& variable) const
+    {
+      throw (NotImplementedException("HmmEmissionProbabilities::computeD2EmissionProbabilities is not overdefined."));
+    }
+  
+    virtual const std::vector<double>& getDEmissionProbabilities(size_t pos) const
+    {
+      throw (NotImplementedException("HmmEmissionProbabilities::getDEmissionProbability is not overdefined."));
+    }
+  
+    virtual const std::vector<double>& getD2EmissionProbabilities(size_t pos) const
+    {
+      throw (NotImplementedException("HmmEmissionProbabilities::getD2EmissionProbability is not overdefined."));
+    }
+  
+    /**
+     * @brief Operator access to the emission probabilities.
+     *
+     * This is the fastest way to get the values, but no checking is performed on the indices.
+     * For debugging purpose, the getEmissionProbability would be a safer use.
+     *
+     * @param pos The position of the sequential data to consider.
+     * @return A vector of probabilities, whose size is the number of hidden states.
+     */
+    virtual const std::vector<double>& operator()(size_t pos) const = 0;
+    
+    /**
+     * @return The number of positions in the data.
+     */
+    virtual size_t getNumberOfPositions() const = 0;
+  };
+
+} //end of namespace bpp.
+
+#endif //_HMMEMISSIONPROBABILITIES_H_
+
diff --git a/src/Bpp/Seq/SiteIterator.h b/src/Bpp/Numeric/Hmm/HmmExceptions.h
similarity index 62%
rename from src/Bpp/Seq/SiteIterator.h
rename to src/Bpp/Numeric/Hmm/HmmExceptions.h
index efb427a..1abead2 100644
--- a/src/Bpp/Seq/SiteIterator.h
+++ b/src/Bpp/Numeric/Hmm/HmmExceptions.h
@@ -1,14 +1,14 @@
 //
-// File: SiteIterator.h
+// File: HmmExceptions.h
 // Created by: Julien Dutheil
-// Created on: Sun Oct 19 12:47:16 2003
+// Created on: Fri Sep 04 15:30 2009
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 16, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for phylogenetic data analysis.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,44 +37,47 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SITEITERATOR_H_
-#define _SITEITERATOR_H_
+#ifndef _HMMEXCEPTIONS_H_
+#define _HMMEXCEPTIONS_H_
 
-#include "Site.h"
+#include "../../Exceptions.h"
 
 namespace bpp
 {
 
-/**
- * @brief Generic site iterator interface, allowing to loop over sites.
- */
-class SiteIterator
-{
-	public:
-		SiteIterator() {}
-		virtual ~SiteIterator() {}
-	
-	public:
-		virtual Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
-};
-
-/**
- * @brief Generic const site iterator interface, allowing to loop over const sites.
- */
-class ConstSiteIterator
-{
-	public:
-		ConstSiteIterator() {}
-		virtual ~ConstSiteIterator() {}
-	
-	public:
-		virtual const Site* nextSite() = 0;
-		virtual bool hasMoreSites() const = 0;
-};
+  /**
+   * @brief Exception thrown when an unvalid state is requested.
+   *
+   * This class belongs to the HMM framework.
+   *
+   * @author Julien Dutheil
+   */
+  class HmmBadStateException:
+    public Exception
+  {
+    public:
+      HmmBadStateException(const std::string& description): Exception(description) {}
+
+  };
+
+
+
+  /**
+   * @brief Exception thrown when an unvalid alphabet is specified.
+   *
+   * This class belongs to the HMM fra;ework.
+   *
+   * @author Julien Dutheil
+   */
+  class HmmUnvalidAlphabetException:
+    public Exception
+  {
+    public:
+      HmmUnvalidAlphabetException(const std::string& description): Exception(description) {}
 
+  };
 
-} //end of namespace bpp.
+}; //end of namespace bpp.
 
-#endif	//_SITEITERATOR_H_
+#endif //_HMMEXCEPTIONS_H_
 
diff --git a/src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.cpp b/src/Bpp/Numeric/Hmm/HmmLikelihood.cpp
similarity index 56%
rename from src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.cpp
rename to src/Bpp/Numeric/Hmm/HmmLikelihood.cpp
index d3f8e7e..da9acb7 100644
--- a/src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.cpp
+++ b/src/Bpp/Numeric/Hmm/HmmLikelihood.cpp
@@ -1,7 +1,7 @@
 //
-// File: BppOSequenceReaderFormat.cpp
-// Created by: Julien Dutheil
-// Created on: Tuesday November 20th, 13:27
+// File: HmmLikelihood.cpp
+// Created by: Laurent Guéguen
+// Created on: jeudi 26 septembre 2013, à 13h 55
 //
 
 /*
@@ -37,34 +37,54 @@
   knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "BppOSequenceStreamReaderFormat.h"
-#include "Fasta.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-
-#include <string>
-#include <memory>
+#include "HmmLikelihood.h"
 
 using namespace bpp;
 using namespace std;
 
-ISequenceStream* BppOSequenceStreamReaderFormat::read(const std::string& description) throw (Exception)
+AbstractHmmLikelihood::AbstractHmmLikelihood() :
+  dLogLik_(0),
+  dVariable_(""),
+  d2LogLik_(0),
+  d2Variable_("") {}
+
+AbstractHmmLikelihood::AbstractHmmLikelihood(const AbstractHmmLikelihood& adhlik) :
+  dLogLik_(adhlik.dLogLik_),
+  dVariable_(adhlik.dVariable_),
+  d2LogLik_(adhlik.d2LogLik_),
+  d2Variable_(adhlik.d2Variable_)
+{}
+
+AbstractHmmLikelihood& AbstractHmmLikelihood::operator=(const AbstractHmmLikelihood& adhlik)
 {
-  unparsedArguments_.clear();
-  string format = "";
-  KeyvalTools::parseProcedure(description, format, unparsedArguments_);
-  auto_ptr<ISequenceStream> iSeq;
-  if (format == "Fasta")
-  {
-    bool strictNames = ApplicationTools::getBooleanParameter("strict_names", unparsedArguments_, false, "", true, false);
-    bool extended    = ApplicationTools::getBooleanParameter("extended", unparsedArguments_, false, "", true, false);
-    iSeq.reset(new Fasta(100, true, extended, strictNames));
-  }
-  else
-  {
-    throw Exception("Sequence format '" + format + "' unknown.");
+  dLogLik_=adhlik.dLogLik_;
+  dVariable_=adhlik.dVariable_;
+  d2LogLik_=adhlik.d2LogLik_;
+  d2Variable_=adhlik.d2Variable_;
+
+  return *this;
+}
+
+double AbstractHmmLikelihood::getFirstOrderDerivative(const std::string& variable) const throw (Exception)
+{
+  if (variable!=dVariable_){
+    dVariable_=variable;
+    
+    getHmmEmissionProbabilities().computeDEmissionProbabilities(dVariable_);
+    computeDLikelihood_();
   }
+  return -dLogLik_;
+  
+}
+    
+double AbstractHmmLikelihood::getSecondOrderDerivative(const std::string& variable) const throw (Exception)
+{
+  if (variable!=d2Variable_){
+    d2Variable_=variable;
 
-  return iSeq.release();
+    getHmmEmissionProbabilities().computeD2EmissionProbabilities(d2Variable_);
+    computeD2Likelihood_();
+  }
+  return -d2LogLik_;
 }
 
diff --git a/src/Bpp/Numeric/Hmm/HmmLikelihood.h b/src/Bpp/Numeric/Hmm/HmmLikelihood.h
new file mode 100644
index 0000000..08c9189
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/HmmLikelihood.h
@@ -0,0 +1,213 @@
+//
+// File: HmmLikelihood.h
+// Created by: Julien Dutheil
+// Created on: Fri Oct 26 11:20 2007
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _HMMLIKELIHOOD_H_
+#define _HMMLIKELIHOOD_H_
+
+
+// From NumCalc:
+#include "../Function/Functions.h"
+#include "../VectorTools.h"
+
+#include "HmmStateAlphabet.h"
+#include "HmmTransitionMatrix.h"
+#include "HmmEmissionProbabilities.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Basal interface for Hidden Markov Models likelihood computation.
+   *
+   * HmmLikelihood classes compute the probability of data according to parameters (likelihood),
+   * using the so-called forward recursion:
+   *
+   * - Initialisation: @f[ f_0({\cal A}_0), \ldots, f_0({\cal A}_n) @f] The initial frequencies, set to the equilibrium frequencies of the chain.
+   * - Recursion (for i=1 to l, the length of the sequence data): @f[ f_i({\cal A}_y) = e_y(D_i) \sum_{x=1}^n f_{i-1}({\cal A}_x) \cdot p_{x,y} @f]
+   * - Termination: @f[ \Pr(D) = \sum_{x=1}^n f_l({\cal A}_x) @f]
+   * where @f$ {\cal A}_{1..n} @f$ denotes the hidden states of the alphabet, @f$ e_y(D_i) @f$ the
+   * probability of the data at position i conditioned on hidden state y (emission probabilities)
+   * and @f$ p_{x,y} @f$ is the probability of havving hidden state y at state i+1 knowing there
+   * is hidden state x at position i (transition probabilities). These essential elements are given
+   * respectively by the HmmEmissionProbabilities and HmmTransitionMatrix object associated to this
+   * class. Both objects have to share the same HmmStateAlphabet instance, which describes all
+   * allowed hidden states.
+   *
+   * The HmmLikelihood interface provides essentially two major methods:
+   * - A method to retrieve the likelihood value (parameter estimation)
+   * - Two methods to retrieve the posterio probabilities of each state using the forward and backward conditionnal likelihoods (posterior decoding).
+   */
+  
+  class HmmLikelihood:
+    public virtual DerivableSecondOrder
+  {
+  public:
+
+    virtual HmmLikelihood* clone() const = 0;
+
+    virtual const HmmStateAlphabet& getHmmStateAlphabet() const = 0;
+    virtual HmmStateAlphabet& getHmmStateAlphabet() = 0;
+    
+    virtual const HmmTransitionMatrix& getHmmTransitionMatrix() const = 0;
+    virtual HmmTransitionMatrix& getHmmTransitionMatrix() = 0;
+    
+    virtual const HmmEmissionProbabilities& getHmmEmissionProbabilities() const = 0;
+    virtual HmmEmissionProbabilities& getHmmEmissionProbabilities() = 0;
+
+    virtual void getHiddenStatesPosteriorProbabilities(std::vector< std::vector<double> >& probs, bool append) const throw (Exception) = 0;
+
+    virtual Vdouble getHiddenStatesPosteriorProbabilitiesForASite(size_t site) const = 0;
+
+    virtual double getLogLikelihood() const = 0;
+
+    virtual double getDLogLikelihood() const = 0;
+
+    virtual double getD2LogLikelihood() const = 0;
+
+    /**
+     * @brief Get the likelihood for a site, and its derivatives.
+     *
+     * @param site The site index to analyse.
+     * @return The likelihood for site <i>site</i>.
+     */
+  
+    virtual double getLikelihoodForASite(size_t site) const = 0;
+
+    virtual double getDLogLikelihoodForASite(size_t site) const = 0;
+
+    virtual double getD2LogLikelihoodForASite(size_t site) const = 0;
+    /**
+     * @brief Get the likelihood for each site.
+     *
+     * @return A vector with all likelihoods for each site.
+     */
+    virtual Vdouble getLikelihoodForEachSite() const = 0;
+
+    virtual const std::vector<size_t>& getBreakPoints() const = 0;
+
+    virtual void setBreakPoints(const std::vector<size_t>& breakPoints) = 0;
+
+  protected:
+
+    virtual void computeDLikelihood_() const = 0;
+
+    virtual void computeD2Likelihood_() const = 0;
+
+  };
+
+
+  /*
+   * @brief partial impmementation of Hmm Likelihoods.
+   *
+   */
+  
+  class AbstractHmmLikelihood:
+    public virtual HmmLikelihood
+  {
+  protected:
+    
+    mutable double dLogLik_;
+    mutable std::string dVariable_;
+
+    mutable double d2LogLik_;
+    mutable std::string d2Variable_;
+
+  public:
+    AbstractHmmLikelihood();
+    
+    AbstractHmmLikelihood(const AbstractHmmLikelihood& adhlik);
+
+    AbstractHmmLikelihood& operator=(const AbstractHmmLikelihood& adhlik);
+
+    /* @{
+     *
+     * @brief From FirstOrder:
+     *
+     */
+
+    void enableFirstOrderDerivatives(bool yn) {};
+    
+    bool enableFirstOrderDerivatives() const { return true;}
+
+    double getFirstOrderDerivative(const std::string& variable) const throw (Exception);
+
+    double getDLogLikelihood() const
+    {
+      return dLogLik_;
+    }
+
+    /*
+     * @}
+     *
+     */
+
+    /* @{
+     *
+     * @brief From SecondOrder:
+     *
+     */
+
+    void enableSecondOrderDerivatives(bool yn) {};
+    
+    bool enableSecondOrderDerivatives() const {return true;}
+
+    double getSecondOrderDerivative(const std::string& variable) const throw (Exception);
+  
+    double getD2LogLikelihood() const
+    {
+      return d2LogLik_;
+    }
+
+    double getSecondOrderDerivative(const std::string& variable1, const std::string& variable2) const throw (Exception) {
+      throw (NotImplementedException("AbstractHmmLikelihood::getSecondOrderDerivative is not defined for 2 variables."));
+    }
+    
+    /*
+     * @}
+     *
+     */
+
+  
+  };
+
+
+} //end of namespace bpp.
+
+#endif //_HMMLIKELIHOOD_H_
+
diff --git a/src/Bpp/Numeric/Hmm/HmmStateAlphabet.h b/src/Bpp/Numeric/Hmm/HmmStateAlphabet.h
new file mode 100644
index 0000000..40442a6
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/HmmStateAlphabet.h
@@ -0,0 +1,122 @@
+//
+// File: HmmStateAlphabet.h
+// Created by: Julien Dutheil
+// Created on: Fri Oct 26 11:07 2007
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _HMMSTATEALPHABET_H_
+#define _HMMSTATEALPHABET_H_
+
+#include "HmmExceptions.h"
+#include "../Parametrizable.h"
+#include "../../Exceptions.h"
+
+//From the STL:
+#include <vector>
+
+//using namespace bpp;
+
+namespace bpp {
+
+  class StateListener;
+  class StateChangedEvent;
+
+  /**
+   * @brief Hidden states alphabet.
+   *
+   * Implementations of this interface describe the set of hidden states of a Hidden Markov Model.
+   */
+  class HmmStateAlphabet:
+    public virtual Parametrizable
+  {
+  public:
+    HmmStateAlphabet() {}
+    virtual ~HmmStateAlphabet() {}
+
+  public:
+    /**
+     * @param stateIndex The index of a hidden state.
+     * @return The corresponding hidden state.
+     * @see getNumberOfStates
+     */
+    virtual const Clonable& getState(size_t stateIndex) const throw (HmmBadStateException) = 0;
+
+
+    virtual size_t getNumberOfStates() const = 0;
+
+    /**
+     * @brief Tell if this instance can work with the instance of alphabet given as input.
+     *
+     * In many case, this will return true is the pointer provided as argument refers to this object.
+     *
+     * @param stateAlphabet The alphabet to check.
+     * @return true if the matrix is compatible with the given alphabet.
+     */
+    virtual bool worksWith(const HmmStateAlphabet* stateAlphabet) const = 0;
+ 
+  };
+
+  class StateListener
+  {
+  public:
+    StateListener() {}
+    virtual ~StateListener() {}
+
+  public:
+    virtual void stateChanged(StateChangedEvent& event) = 0;
+  };
+
+  class StateChangedEvent
+  {
+  protected:
+    std::vector<unsigned int> states_;
+
+  public:
+    StateChangedEvent(unsigned int stateIndex): states_(1)
+    {
+      states_[0] = stateIndex;
+    }
+    StateChangedEvent(std::vector<unsigned int>& states): states_(states) {}
+
+  public:
+    const std::vector<unsigned int>& getStates() const { return states_; }
+    std::vector<unsigned int>& getStates() { return states_; }
+
+  };
+
+}
+#endif //_HMMSTATEALPHABET_H_
+
diff --git a/src/Bpp/Numeric/Hmm/HmmTransitionMatrix.h b/src/Bpp/Numeric/Hmm/HmmTransitionMatrix.h
new file mode 100644
index 0000000..34ab889
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/HmmTransitionMatrix.h
@@ -0,0 +1,108 @@
+//
+// File: HmmTransitionMatrix.h
+// Created by: Julien Dutheil
+// Created on: Sat Oct 27 10:24 2007
+//
+
+/*
+  Copyright or © or Copr. Bio++Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _HMMTRANSITIONMATRIX_H_
+#define _HMMTRANSITIONMATRIX_H_
+
+#include "HmmStateAlphabet.h"
+#include "HmmExceptions.h"
+#include "../Matrix/Matrix.h"
+#include "../Parametrizable.h"
+
+//Fron the STL:
+#include <vector>
+
+namespace bpp
+{
+
+/**
+ * @brief Describe the transition probabilities between hidden states of a Hidden Markov Model.
+ *
+ * This class is part of the HMM framework.
+ */
+  class HmmTransitionMatrix:
+    public virtual Parametrizable
+  {
+  public:
+
+    /**
+     * @return The hidden alphabet associated to this model.
+     */
+
+    virtual const HmmStateAlphabet* getHmmStateAlphabet() const = 0;
+
+    /**
+     * @brief Set the new hidden state alphabet.
+     * @param stateAlphabet The new state alphabet.
+     * @throw UnvalidStateAlphabetException if the new alphabet is uncorrect (for instance is NULL pointer).
+     */
+    virtual void setHmmStateAlphabet(const HmmStateAlphabet* stateAlphabet) throw (HmmUnvalidAlphabetException) = 0;
+   
+    /**
+     * @return The number of states in the model.
+     */
+    virtual size_t getNumberOfStates() const = 0;
+
+    /**
+     * @brief Get the transition probability between two states.
+     *
+     * @param i initial state.
+     * @param j final state.
+     * @return the transition probability between the two states.
+     */
+    virtual double Pij(size_t i, size_t j) const = 0;
+
+    /**
+     * @brief Get all transition probabilities as a matrix.
+     *
+     * @return A n*n matrix will all transition probabilities (n being the number of hidden states).
+     */
+    virtual const Matrix<double>& getPij() const = 0;
+
+    /**
+     * @return The vector of equilibrium frequencies of the Markov chain described by the matrix.
+     */
+    virtual const std::vector<double>& getEquilibriumFrequencies() const = 0;
+
+  };
+
+} //end of namespace bpp
+
+#endif //_HMMTRANSITIONMATRIX_H_
+
diff --git a/src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.cpp b/src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.cpp
new file mode 100644
index 0000000..423755b
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.cpp
@@ -0,0 +1,579 @@
+//
+// File: LogsumHmmLikelihood.cpp
+// Created by: Julien Dutheil
+// Created on: Fri Oct 26 11:57 2007
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "LogsumHmmLikelihood.h"
+
+// from the STL:
+#include <iostream>
+#include <algorithm>
+using namespace bpp;
+using namespace std;
+
+LogsumHmmLikelihood::LogsumHmmLikelihood(
+    HmmStateAlphabet* hiddenAlphabet,
+    HmmTransitionMatrix* transitionMatrix,
+    HmmEmissionProbabilities* emissionProbabilities,
+    bool ownsPointers,
+    const std::string& prefix) throw (Exception):
+  AbstractHmmLikelihood(),
+  AbstractParametrizable(prefix),
+  hiddenAlphabet_(hiddenAlphabet),
+  transitionMatrix_(transitionMatrix),
+  emissionProbabilities_(emissionProbabilities),
+  ownsPointers_(ownsPointers),
+  logLikelihood_(),
+  partialLogLikelihoods_(),
+  logLik_(),
+  dLogLikelihood_(),
+  partialDLogLikelihoods_(),
+  d2LogLikelihood_(),
+  partialD2LogLikelihoods_(),
+  backLogLikelihood_(),
+  backLogLikelihoodUpToDate_(false),
+  breakPoints_(),
+  nbStates_(),
+  nbSites_()
+{
+  if (!hiddenAlphabet)        throw Exception("LogsumHmmLikelihood: null pointer passed for HmmStateAlphabet.");
+  if (!transitionMatrix)      throw Exception("LogsumHmmLikelihood: null pointer passed for HmmTransitionMatrix.");
+  if (!emissionProbabilities) throw Exception("LogsumHmmLikelihood: null pointer passed for HmmEmissionProbabilities.");
+
+  if (!hiddenAlphabet_->worksWith(transitionMatrix_->getHmmStateAlphabet()))
+    throw Exception("LogsumHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
+  if (!hiddenAlphabet_->worksWith(emissionProbabilities_->getHmmStateAlphabet()))
+    throw Exception("LogsumHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
+  nbStates_ = hiddenAlphabet_->getNumberOfStates();
+  nbSites_ = emissionProbabilities_->getNumberOfPositions();
+
+  //Manage parameters:
+  addParameters_(hiddenAlphabet_->getParameters());
+  addParameters_(transitionMatrix_->getParameters());
+  addParameters_(emissionProbabilities_->getParameters());
+
+  //Init arrays:
+  logLikelihood_.resize(nbSites_ * nbStates_);
+
+  //Compute:
+  computeForward_();
+}
+
+void LogsumHmmLikelihood::setNamespace(const std::string& nameSpace)
+{
+  AbstractParametrizable::setNamespace(nameSpace);
+
+  hiddenAlphabet_->setNamespace(nameSpace);
+  transitionMatrix_->setNamespace(nameSpace);
+  emissionProbabilities_->setNamespace(nameSpace);
+}
+
+void LogsumHmmLikelihood::fireParameterChanged(const ParameterList& pl)
+{
+  dVariable_="";
+  d2Variable_="";
+
+  bool alphabetChanged    = hiddenAlphabet_->matchParametersValues(pl);
+  bool transitionsChanged = transitionMatrix_->matchParametersValues(pl);
+  bool emissionChanged    = emissionProbabilities_->matchParametersValues(pl);
+  // these lines are necessary because the transitions and emissions can depend on the alphabet.
+  // we could use a StateChangeEvent, but this would result in computing some calculations twice in some cases
+  // (when both the alphabet and other parameter changed).
+  if (alphabetChanged && !transitionsChanged) transitionMatrix_->setParametersValues(transitionMatrix_->getParameters());
+  if (alphabetChanged && !emissionChanged) emissionProbabilities_->setParametersValues(emissionProbabilities_->getParameters());
+
+  backLogLikelihoodUpToDate_=false;
+  computeLikelihood();
+}
+
+void LogsumHmmLikelihood::computeLikelihood()
+{
+  computeForward_();
+}
+
+/***************************************************************************************************************************/
+
+void LogsumHmmLikelihood::computeForward_()
+{
+  double x, a;
+  vector<double> logTrans(nbStates_ * nbStates_);
+
+  //Transition probabilities:
+  for (size_t i = 0; i < nbStates_; i++)
+  {
+    size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++)
+      logTrans[ii + j] = log(transitionMatrix_->Pij(j, i));
+  }
+
+  //Initialisation:
+  const vector<double>* emissions = &(* emissionProbabilities_)(0);
+
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    size_t jj = j * nbStates_;
+    x = logTrans[jj] + log(transitionMatrix_->getEquilibriumFrequencies()[0]);
+
+    for (size_t k = 1; k < nbStates_; k++)
+    {
+      a = logTrans[k + jj] + log(transitionMatrix_->getEquilibriumFrequencies()[k]);
+      x = NumTools::logsum(x, a);
+    }
+
+    logLikelihood_[j] = log((*emissions)[j]) + x;
+  }
+ 
+  //Recursion:
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+  partialLogLikelihoods_.clear();
+ 
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    size_t ii = i * nbStates_;
+    size_t iip = (i - 1) * nbStates_;
+    emissions = &(*emissionProbabilities_)(i);
+    if (i < nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = logTrans[jj] + logLikelihood_[iip];
+        for (size_t k = 1; k < nbStates_; k++)
+        {
+          a = logTrans[jj + k] + logLikelihood_[iip + k];
+          x = NumTools::logsum(x, a);
+        }
+        logLikelihood_[ii + j] = log((*emissions)[j]) + x;
+      }
+    }
+    else //Reset markov chain:
+    {
+      //Termination of previous segment:
+      double tmpLog = logLikelihood_[(i - 1) * nbStates_];
+      for (size_t k = 1; k < nbStates_; k++)
+        tmpLog = NumTools::logsum(tmpLog, logLikelihood_[(i - 1) * nbStates_ + k]);
+      partialLogLikelihoods_.push_back(tmpLog);
+
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = logTrans[jj] + log(transitionMatrix_->getEquilibriumFrequencies()[0]);
+        for (size_t k = 1; k < nbStates_; k++)
+        {
+          a = logTrans[jj + k] + log(transitionMatrix_->getEquilibriumFrequencies()[k]);
+          x = NumTools::logsum(x, a);
+        }
+        logLikelihood_[ii + j] = log((*emissions)[j]) + x;
+      }
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+  }
+
+  //Termination:
+  double tmpLog = logLikelihood_[(nbSites_ - 1) * nbStates_];
+  for (size_t k = 1; k < nbStates_; k++)
+    tmpLog = NumTools::logsum(tmpLog, logLikelihood_[(nbSites_ - 1) * nbStates_ + k]);
+  partialLogLikelihoods_.push_back(tmpLog);
+  
+  //Compute likelihood:
+  logLik_ = 0;
+  vector<double> copy = partialLogLikelihoods_; //We need to keep the original order for posterior decoding.
+  sort(copy.begin(), copy.end());
+  for (size_t i = copy.size(); i > 0; --i)
+    logLik_ += copy[i - 1];
+}
+
+/***************************************************************************************************************************/
+
+void LogsumHmmLikelihood::computeBackward_() const
+{
+  if (backLogLikelihood_.size()==0)
+  {
+    backLogLikelihood_.resize(nbSites_);
+    for (size_t i=0;i<nbSites_;i++)
+      backLogLikelihood_[i].resize(nbStates_);
+  }
+  
+  double x;
+
+  //Transition probabilities:
+  vector<double> logTrans(nbStates_ * nbStates_);
+  for (size_t i = 0; i < nbStates_; i++)
+  {
+    size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++)
+      logTrans[ii + j] = log(transitionMatrix_->Pij(i, j));
+  }
+
+
+  //Initialisation:
+  const vector<double>* emissions = 0;
+  size_t nextBrkPt = 0; //next break point
+  vector<size_t>::const_reverse_iterator bpIt = breakPoints_.rbegin();
+  if (bpIt != breakPoints_.rend()) nextBrkPt = *bpIt;
+  
+  for (size_t k = 0; k < nbStates_; k++)
+  {
+    backLogLikelihood_[nbSites_ - 1][k] = 0.;
+  }
+
+  //Recursion:
+  for (size_t i = nbSites_ - 1; i > 0; i--)
+  {
+    emissions = &(*emissionProbabilities_)(i);
+    if (i > nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = log((*emissions)[0]) + logTrans[jj] + backLogLikelihood_[i][0];
+        for (size_t k = 1; k < nbStates_; k++)
+        {
+          x = NumTools::logsum(x, log((*emissions)[k]) + logTrans[jj + k] + backLogLikelihood_[i][k]);
+        }
+        backLogLikelihood_[i - 1][j] = x;
+      }    
+    }
+    else //Reset markov chain
+    {
+      for (unsigned int j = 0; j < nbStates_; j++)
+      {
+        backLogLikelihood_[i - 1][j] = 0.;
+      }    
+      bpIt++;
+      if (bpIt != breakPoints_.rend()) nextBrkPt = *bpIt;
+      else nextBrkPt = 0;
+    }
+  }
+
+  backLogLikelihoodUpToDate_=true;
+}
+
+
+/***************************************************************************************************************************/
+
+double LogsumHmmLikelihood::getLikelihoodForASite(size_t site) const
+{
+  Vdouble probs=getHiddenStatesPosteriorProbabilitiesForASite(site);
+  double x=0;
+  for (size_t i=0;i<nbStates_;i++)
+    x+=probs[i]*(*emissionProbabilities_)(site,i);
+
+  return x;
+}
+
+Vdouble LogsumHmmLikelihood::getLikelihoodForEachSite() const
+{
+  std::vector< std::vector<double> > vv;
+  getHiddenStatesPosteriorProbabilities(vv);
+
+  Vdouble ret(nbSites_);
+  for (size_t i=0;i<nbSites_;i++)
+  {
+    ret[i]=0;
+    for (size_t j=0;j<nbStates_;j++)
+      ret[i]+=vv[i][j]*(*emissionProbabilities_)(i,j);
+  }
+
+  return ret;
+}
+
+
+/***************************************************************************************************************************/
+
+Vdouble LogsumHmmLikelihood::getHiddenStatesPosteriorProbabilitiesForASite(size_t site) const
+{
+  if (!backLogLikelihoodUpToDate_)
+    computeBackward_();
+
+  Vdouble probs(nbStates_);
+  
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  vector<double>::const_iterator logLikIt = partialLogLikelihoods_.begin();
+  while (bpIt != breakPoints_.end())
+  {
+    if (site>=(*bpIt))
+      logLikIt++;
+    else
+      break;
+    bpIt++;
+  }
+
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    probs[j] = exp(logLikelihood_[site * nbStates_ + j] + backLogLikelihood_[site][j] - *logLikIt);
+  }
+
+  return probs;
+}
+
+void LogsumHmmLikelihood::getHiddenStatesPosteriorProbabilities(std::vector< std::vector<double> >& probs, bool append) const throw (Exception)
+{
+  size_t offset = append ? probs.size() : 0;
+  probs.resize(offset + nbSites_);
+  for (size_t i = 0; i < nbSites_; i++)
+  {
+    probs[offset + i].resize(nbStates_);
+  }
+
+  if (!backLogLikelihoodUpToDate_)
+    computeBackward_();
+ 
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+ 
+  vector<double>::const_iterator logLikIt = partialLogLikelihoods_.begin();
+  for (size_t i = 0; i < nbSites_; i++)
+  {
+    if (i == nextBrkPt) {
+      logLikIt++;
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+
+    size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++)
+    {
+      probs[offset + i][j] = exp(logLikelihood_[ii + j] + backLogLikelihood_[i][j] - *logLikIt);
+    }
+  }
+}
+
+/***************************************************************************************************************************/
+
+void LogsumHmmLikelihood::computeDForward_() const
+{
+  //Init arrays:
+  if (dLogLikelihood_.size()==0){
+    dLogLikelihood_.resize(nbSites_);
+    for (size_t i=0;i<nbSites_;i++)
+      dLogLikelihood_[i].resize(nbStates_);
+  }
+
+  partialDLogLikelihoods_.clear();
+
+  vector<double> num(nbStates_), num2(nbStates_);
+
+  //Transition probabilities:
+  const ColMatrix<double> trans(transitionMatrix_->getPij());
+
+  //Initialisation:
+  const vector<double>* emissions = &(*emissionProbabilities_)(0);
+  const vector<double>* dEmissions = &emissionProbabilities_->getDEmissionProbabilities(0);
+
+  for (size_t j = 0; j < nbStates_; j++)
+    dLogLikelihood_[0][j] = (*dEmissions)[j] / (*emissions)[j];
+
+  //Recursion:
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+  partialDLogLikelihoods_.clear();
+ 
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    size_t iip = (i - 1) * nbStates_;
+
+    emissions = &(*emissionProbabilities_)(i);
+    dEmissions = &emissionProbabilities_->getDEmissionProbabilities(i);
+
+    for (size_t kp = 0; kp < nbStates_; kp++)
+      num[kp]=logLikelihood_[iip+kp];
+
+    num-=num[VectorTools::whichMax(num)];
+
+    if (i < nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        num2=dLogLikelihood_[i-1]*trans.getCol(j);
+
+        dLogLikelihood_[i][j] = (*dEmissions)[j]/(*emissions)[j] + VectorTools::sumExp(num,num2)/VectorTools::sumExp(num,trans.getCol(j));
+      }
+    }      
+    else //Reset markov chain:
+    {
+      //Termination of previous segment
+
+      partialDLogLikelihoods_.push_back(VectorTools::sumExp(num,dLogLikelihood_[i-1])/VectorTools::sumExp(num));
+
+      for (size_t j = 0; j < nbStates_; j++)
+        dLogLikelihood_[i][j] = (*dEmissions)[j] / (*emissions)[j];
+      
+      bpIt++;
+      if (bpIt != breakPoints_.end())
+        nextBrkPt = *bpIt;
+      else
+        nextBrkPt = nbSites_;
+    }
+  }
+  
+  //Termination:
+  for (size_t kp = 0; kp < nbStates_; kp++)
+    num[kp]=logLikelihood_[nbStates_*(nbSites_-1)+kp];
+
+  num-=num[VectorTools::whichMax(num)];
+            
+  partialDLogLikelihoods_.push_back(VectorTools::sumExp(num,dLogLikelihood_[nbSites_-1])/VectorTools::sumExp(num));
+
+  //Compute dLogLikelihood
+  
+  dLogLik_ = 0;
+  vector<double> copy = partialDLogLikelihoods_; //We need to keep the original order for posterior decoding.
+  sort(copy.begin(), copy.end());
+  for (size_t i = copy.size(); i > 0; --i)
+    dLogLik_ += copy[i - 1];
+}
+
+double LogsumHmmLikelihood::getDLogLikelihoodForASite(size_t site) const
+{
+  return partialDLogLikelihoods_[site];
+}
+
+/***************************************************************************************************************************/
+
+void LogsumHmmLikelihood::computeD2Forward_() const
+{
+  // Make sure that Dlikelihoods are correctly computed
+  getFirstOrderDerivative(d2Variable_);
+  
+  //Init arrays:
+  if (d2LogLikelihood_.size()==0){
+    d2LogLikelihood_.resize(nbSites_);
+    for (size_t i=0;i<nbSites_;i++)
+      d2LogLikelihood_[i].resize(nbStates_);
+  }
+
+  partialD2LogLikelihoods_.clear();
+  
+  vector<double> num(nbStates_),num2(nbStates_),num3(nbStates_);
+  
+  //Transition probabilities:
+  const ColMatrix<double> trans(transitionMatrix_->getPij());
+  
+  //Initialisation:
+  const vector<double>* emissions = &(*emissionProbabilities_)(0);
+  const vector<double>* dEmissions = &emissionProbabilities_->getDEmissionProbabilities(0);
+  const vector<double>* d2Emissions = &emissionProbabilities_->getD2EmissionProbabilities(0);
+  
+  for (size_t j = 0; j < nbStates_; j++)
+    d2LogLikelihood_[0][j] = (*d2Emissions)[j] / (*emissions)[j] - pow((*dEmissions)[j] / (*emissions)[j],2);
+
+  //Recursion:
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+  partialDLogLikelihoods_.clear();
+ 
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    size_t iip = (i - 1) * nbStates_;
+
+    emissions = &(*emissionProbabilities_)(i);
+    dEmissions = &emissionProbabilities_->getDEmissionProbabilities(i);
+    d2Emissions = &emissionProbabilities_->getD2EmissionProbabilities(i);
+
+    for (size_t kp = 0; kp < nbStates_; kp++)
+      num[kp]=logLikelihood_[iip+kp];
+
+    num-=num[VectorTools::whichMax(num)];
+
+    if (i < nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        double den=VectorTools::sumExp(num,trans.getCol(j));
+
+        num2=dLogLikelihood_[i-1]*trans.getCol(j);
+
+        num3=(dLogLikelihood_[i-1]*dLogLikelihood_[i-1]+d2LogLikelihood_[i-1])*trans.getCol(j);
+
+        d2LogLikelihood_[i][j] =  VectorTools::sumExp(num,num3)/den - pow(VectorTools::sumExp(num,num2)/den,2);
+      }
+    }
+    else //Reset markov chain:
+    {
+      //Termination of previous segment:
+
+      double den=VectorTools::sumExp(num);
+
+      num2=dLogLikelihood_[i-1]*dLogLikelihood_[i-1]+d2LogLikelihood_[i-1];
+
+      partialD2LogLikelihoods_.push_back(VectorTools::sumExp(num,num2)/den-pow(VectorTools::sumExp(num,dLogLikelihood_[i-1])/den,2));
+      
+      for (size_t j = 0; j < nbStates_; j++)
+        d2LogLikelihood_[i][j] = (*d2Emissions)[j] / (*emissions)[j] - pow((*dEmissions)[j] / (*emissions)[j],2);
+
+      
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+  }  
+
+  //Termination:
+  for (size_t kp = 0; kp < nbStates_; kp++)
+    num[kp]=logLikelihood_[nbStates_*(nbSites_-1)+kp];
+
+  num-=num[VectorTools::whichMax(num)];
+
+  double den=VectorTools::sumExp(num);
+
+  num2=dLogLikelihood_[nbSites_-1]*dLogLikelihood_[nbSites_-1]+d2LogLikelihood_[nbSites_-1];
+
+  partialD2LogLikelihoods_.push_back(VectorTools::sumExp(num,num2)/den-pow(VectorTools::sumExp(num,dLogLikelihood_[nbSites_-1])/den,2));
+
+  
+  //Compute d2LogLikelihood
+  
+  d2LogLik_ = 0;
+  vector<double> copy = partialD2LogLikelihoods_; //We need to keep the original order for posterior decoding.
+  sort(copy.begin(), copy.end());
+  for (size_t i = copy.size(); i > 0; --i)
+    d2LogLik_ += copy[i - 1];
+}
+
+double LogsumHmmLikelihood::getD2LogLikelihoodForASite(size_t site) const
+{
+  return partialD2LogLikelihoods_[site];
+}
diff --git a/src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.h b/src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.h
new file mode 100644
index 0000000..67158e9
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/LogsumHmmLikelihood.h
@@ -0,0 +1,306 @@
+//
+// File: LogsumHmmLikelihood.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 23 11:27 2009
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _LOGSUMHMMLIKELIHOOD_H_
+#define _LOGSUMHMMLIKELIHOOD_H_
+
+#include "HmmLikelihood.h"
+#include "../AbstractParametrizable.h"
+#include "../NumTools.h"
+#include "../Matrix/Matrix.h"
+
+//From the STL:
+#include <vector>
+#include <memory>
+
+namespace bpp {
+
+  /**
+   * @brief A simple implementation of hidden Markov models recursion.
+   *
+   * This implementation uses the logsum method described in Durbin et al "Biological sequence analysis", Cambridge University Press,
+   * and further developped in Tobias P. Mann "Numerically Stable Hidden Markov Model Implementation" (2006) http://bozeman.genome.washington.edu/compbio/mbt599_2006/hmm_scaling_revised.pdf .
+   * It also offer the possibility to specify "breakpoints", where the chain will be reset to the equilibrium frequencies.
+   *
+   * Although probably more numerically accurate, this method is slower than the rescaling, as it involves one exponentiation per site and per hidden state!
+   *
+   * @see RescaledHmmLikelihood
+   */
+  class LogsumHmmLikelihood:
+    public virtual AbstractHmmLikelihood,
+    public AbstractParametrizable
+  {
+  protected:
+    /**
+     * @brief The alphabet describing the hidden states.
+     */
+
+    HmmStateAlphabet* hiddenAlphabet_;
+    HmmTransitionMatrix* transitionMatrix_;
+    HmmEmissionProbabilities* emissionProbabilities_;
+
+    /**
+     * @brief Owns previous objects
+     *
+     */
+
+    bool ownsPointers_;
+    
+    /**
+     * @brief The likelihood array.
+     *
+     * logLikelihood_[i * nbStates_ + j] corresponds to log(Pr(x1...xi, yi=j)),
+     * where the x are the observed states, and y the hidden states.
+     */
+    std::vector<double> logLikelihood_;
+    std::vector<double> partialLogLikelihoods_;
+    double logLik_;
+
+    /**
+     * @brief The DLogLikelihood arrays.
+     *
+     * dLogLikelihood_[i][j] corresponds to d(log(Pr(x1...xi, yi=j))),
+     * where the x are the observed states, and y the hidden states.
+     *
+     * d2LogLikelihood_[i][j] corresponds to d2(log(Pr(x1...xi, yi=j))),
+     * where the x are the observed states, and y the hidden states.
+     *
+     */
+
+    mutable std::vector< std::vector<double> > dLogLikelihood_;
+    mutable std::vector<double> partialDLogLikelihoods_;
+
+    mutable std::vector< std::vector<double> > d2LogLikelihood_;
+    mutable std::vector<double> partialD2LogLikelihoods_;
+
+    /**
+     * @brief backward logLikelihood
+     *
+     * backLogLikelihood_[i][j] corresponds to log(Pr(x_i+1...x_n | yi=j)),
+     * where the x are the observed states, and y the hidden states.
+     */
+
+    mutable std::vector<std::vector<double> > backLogLikelihood_;
+    mutable bool backLogLikelihoodUpToDate_;
+
+    std::vector<size_t> breakPoints_;
+
+    size_t nbStates_, nbSites_;
+
+  public:
+    /**
+     * @brief Build a new LogsumHmmLikelihood object.
+     *
+     * @warning the HmmTransitionMatrix and HmmEmissionProbabilities
+     * object passed as argument must be non-null and point toward the
+     * same HmmStateAlphabet instance.
+     *
+     * @warning If ownsPointers_, The three object will be copied if
+     * needed, and deleted when the hmm likelihood objet is deleted.
+     * You should secure a copy before if you don't want them to be
+     * destroyed with this object.
+     */
+    
+    LogsumHmmLikelihood(
+      HmmStateAlphabet* hiddenAlphabet,
+      HmmTransitionMatrix* transitionMatrix,
+      HmmEmissionProbabilities* emissionProbabilities,
+      bool ownsPointers_ = true,
+      const std::string& prefix = "") throw (Exception);
+
+    LogsumHmmLikelihood(const LogsumHmmLikelihood& lik):
+      AbstractHmmLikelihood(lik),
+      AbstractParametrizable(lik),
+      hiddenAlphabet_(),
+      transitionMatrix_(),
+      emissionProbabilities_(),
+      ownsPointers_(lik.ownsPointers_),
+      logLikelihood_(lik.logLikelihood_),
+      partialLogLikelihoods_(lik.partialLogLikelihoods_),
+      logLik_(lik.logLik_),
+      dLogLikelihood_(lik.dLogLikelihood_),
+      partialDLogLikelihoods_(lik.partialDLogLikelihoods_),
+      d2LogLikelihood_(lik.d2LogLikelihood_),
+      partialD2LogLikelihoods_(lik.partialD2LogLikelihoods_),
+      backLogLikelihood_(lik.backLogLikelihood_),
+      backLogLikelihoodUpToDate_(lik.backLogLikelihoodUpToDate_),
+      breakPoints_(lik.breakPoints_),
+      nbStates_(lik.nbStates_),
+      nbSites_(lik.nbSites_)
+    {
+      if (ownsPointers_)
+      {
+        hiddenAlphabet_=dynamic_cast<HmmStateAlphabet*>(lik.hiddenAlphabet_->clone());
+        transitionMatrix_=dynamic_cast<HmmTransitionMatrix*>(lik.transitionMatrix_->clone());
+        emissionProbabilities_=dynamic_cast<HmmEmissionProbabilities*>(lik.emissionProbabilities_->clone());
+      }
+      else
+      {
+        hiddenAlphabet_=lik.hiddenAlphabet_;
+        transitionMatrix_=lik.transitionMatrix_;
+        emissionProbabilities_=lik.emissionProbabilities_;
+      }
+  
+      // Now adjust pointers:
+      transitionMatrix_->setHmmStateAlphabet(hiddenAlphabet_);
+      emissionProbabilities_->setHmmStateAlphabet(hiddenAlphabet_);
+    }
+
+    LogsumHmmLikelihood& operator=(const LogsumHmmLikelihood& lik)
+    {
+      AbstractHmmLikelihood::operator=(lik);
+      AbstractParametrizable::operator =(lik);
+
+      ownsPointers_=lik.ownsPointers_;
+      
+      if (ownsPointers_)
+      {
+        hiddenAlphabet_        = dynamic_cast<HmmStateAlphabet*>(lik.hiddenAlphabet_->clone());
+        transitionMatrix_      = dynamic_cast<HmmTransitionMatrix*>(lik.transitionMatrix_->clone());
+        emissionProbabilities_ = dynamic_cast<HmmEmissionProbabilities*>(lik.emissionProbabilities_->clone());
+      }
+      else
+      {
+        hiddenAlphabet_=lik.hiddenAlphabet_;
+        transitionMatrix_=lik.transitionMatrix_;
+        emissionProbabilities_=lik.emissionProbabilities_;
+      }
+          
+      logLikelihood_         = lik.logLikelihood_;
+      partialLogLikelihoods_ = lik.partialLogLikelihoods_;
+      dLogLikelihood_        = lik.dLogLikelihood_;
+      partialDLogLikelihoods_= lik.partialDLogLikelihoods_;
+      d2LogLikelihood_       = lik.d2LogLikelihood_;      
+      partialD2LogLikelihoods_  = lik.partialD2LogLikelihoods_;
+      backLogLikelihood_     = lik.backLogLikelihood_;
+      backLogLikelihoodUpToDate_= lik.backLogLikelihoodUpToDate_;
+      logLik_                = lik.logLik_;
+      breakPoints_           = lik.breakPoints_;
+      nbStates_              = lik.nbStates_;
+      nbSites_               = lik.nbSites_;
+
+      // Now adjust pointers:
+      transitionMatrix_->setHmmStateAlphabet(hiddenAlphabet_);
+      emissionProbabilities_->setHmmStateAlphabet(hiddenAlphabet_);
+      return *this;
+    }
+
+    virtual ~LogsumHmmLikelihood() {
+      if (ownsPointers_)
+      {
+        delete hiddenAlphabet_;
+        delete transitionMatrix_;
+        delete emissionProbabilities_;
+      }
+    }
+    
+
+    LogsumHmmLikelihood* clone() const { return new LogsumHmmLikelihood(*this); }
+
+  public:
+    const HmmStateAlphabet& getHmmStateAlphabet() const { return *hiddenAlphabet_; }
+    HmmStateAlphabet& getHmmStateAlphabet() { return *hiddenAlphabet_; }
+
+    const HmmTransitionMatrix& getHmmTransitionMatrix() const { return *transitionMatrix_; }
+    HmmTransitionMatrix& getHmmTransitionMatrix() { return *transitionMatrix_; }
+
+    const HmmEmissionProbabilities& getHmmEmissionProbabilities() const { return *emissionProbabilities_; }
+    HmmEmissionProbabilities& getHmmEmissionProbabilities() { return *emissionProbabilities_; }
+
+    void setBreakPoints(const std::vector<size_t>& breakPoints) {
+      breakPoints_ = breakPoints;
+      computeForward_();
+      backLogLikelihoodUpToDate_=false;
+    }
+
+    const std::vector<size_t>& getBreakPoints() const { return breakPoints_; }
+
+    void setParameters(const ParameterList& pl) throw (Exception)
+    {
+      setParametersValues(pl);
+    }
+
+    double getValue() const throw (Exception) { return -logLik_; }
+
+    double getLogLikelihood() const { return logLik_; }
+
+    double getLikelihoodForASite(size_t site) const;
+
+    double getDLogLikelihoodForASite(size_t site) const;
+
+    double getD2LogLikelihoodForASite(size_t site) const;
+
+    Vdouble getLikelihoodForEachSite() const;
+
+    void setNamespace(const std::string& nameSpace);
+
+    void fireParameterChanged(const ParameterList& pl);
+    
+    Vdouble getHiddenStatesPosteriorProbabilitiesForASite(size_t site) const;
+
+    void getHiddenStatesPosteriorProbabilities(std::vector< std::vector<double> >& probs, bool append = false) const throw (Exception);
+
+    void computeLikelihood();
+  protected:
+
+    void computeForward_();
+    
+    void computeBackward_() const;
+
+    void computeDLikelihood_() const
+    {
+      computeDForward_();
+    }
+
+    void computeD2Likelihood_() const
+    {
+      computeD2Forward_();
+    }
+    
+    void computeDForward_() const;
+    
+    void computeD2Forward_() const;
+    
+
+  };
+
+}
+
+#endif //_LOGSUMHMMLIKELIHOOD_H_
+
diff --git a/src/Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.cpp b/src/Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.cpp
new file mode 100644
index 0000000..1a21fd3
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.cpp
@@ -0,0 +1,256 @@
+//
+// File: LowMemoryRescaledHmmLikelihood.h
+// Created by: Julien Dutheil
+// Created on: Wed Dec 16 10:47 2009
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "LowMemoryRescaledHmmLikelihood.h"
+
+// from the STL:
+#include <iostream>
+#include <algorithm>
+using namespace bpp;
+using namespace std;
+
+LowMemoryRescaledHmmLikelihood::LowMemoryRescaledHmmLikelihood(
+  HmmStateAlphabet* hiddenAlphabet,
+  HmmTransitionMatrix* transitionMatrix,
+  HmmEmissionProbabilities* emissionProbabilities,
+  const std::string& prefix,
+  size_t maxSize) throw (Exception) :
+  AbstractHmmLikelihood(),
+  AbstractParametrizable(prefix),
+  hiddenAlphabet_(hiddenAlphabet),
+  transitionMatrix_(transitionMatrix),
+  emissionProbabilities_(emissionProbabilities),
+  likelihood1_(),
+  likelihood2_(),
+  logLik_(),
+  maxSize_(maxSize),
+  breakPoints_(),
+  nbStates_(),
+  nbSites_()
+{
+  if (!hiddenAlphabet) throw Exception("LowMemoryRescaledHmmLikelihood: null pointer passed for HmmStateAlphabet.");
+  if (!transitionMatrix) throw Exception("LowMemoryRescaledHmmLikelihood: null pointer passed for HmmTransitionMatrix.");
+  if (!emissionProbabilities) throw Exception("LowMemoryRescaledHmmLikelihood: null pointer passed for HmmEmissionProbabilities.");
+  if (!hiddenAlphabet_->worksWith(transitionMatrix->getHmmStateAlphabet()))
+    throw Exception("LowMemoryRescaledHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
+  if (!hiddenAlphabet_->worksWith(emissionProbabilities->getHmmStateAlphabet()))
+    throw Exception("LowMemoryRescaledHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
+  nbStates_ = hiddenAlphabet_->getNumberOfStates();
+  nbSites_ = emissionProbabilities_->getNumberOfPositions();
+
+  // Manage parameters:
+  addParameters_(hiddenAlphabet_->getParameters());
+  addParameters_(transitionMatrix_->getParameters());
+  addParameters_(emissionProbabilities_->getParameters());
+
+  // Init arrays:
+  likelihood1_.resize(nbStates_);
+  likelihood2_.resize(nbStates_);
+
+  // Compute:
+  computeForward_();
+}
+
+void LowMemoryRescaledHmmLikelihood::setNamespace(const std::string& nameSpace)
+{
+  AbstractParametrizable::setNamespace(nameSpace);
+
+  hiddenAlphabet_->setNamespace(nameSpace);
+  transitionMatrix_->setNamespace(nameSpace);
+  emissionProbabilities_->setNamespace(nameSpace);
+}
+
+void LowMemoryRescaledHmmLikelihood::fireParameterChanged(const ParameterList& pl)
+{
+   bool alphabetChanged    = hiddenAlphabet_->matchParametersValues(pl);
+   bool transitionsChanged = transitionMatrix_->matchParametersValues(pl);
+   bool emissionChanged    = emissionProbabilities_->matchParametersValues(pl);
+  // these lines are necessary because the transitions and emissions can depend on the alphabet.
+  // we could use a StateChangeEvent, but this would result in computing some calculations twice in some cases
+  // (when both the alphabet and other parameter changed).
+  if (alphabetChanged && !transitionsChanged) transitionMatrix_->setParametersValues(transitionMatrix_->getParameters());
+  if (alphabetChanged && !emissionChanged) emissionProbabilities_->setParametersValues(emissionProbabilities_->getParameters());
+
+  computeForward_();
+}
+
+/***************************************************************************************************************************/
+
+void LowMemoryRescaledHmmLikelihood::computeForward_()
+{
+  double x;
+  vector<double> tmp(nbStates_);
+  vector<double> lScales(min(maxSize_, nbSites_));
+  vector<double> trans(nbStates_ * nbStates_);
+
+  // Transition probabilities:
+  for (size_t i = 0; i < nbStates_; i++)
+  {
+   size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++)
+    {
+      trans[ii + j] = transitionMatrix_->Pij(j, i);
+    }
+  }
+
+  // Initialisation:
+  double scale = 0;
+  const vector<double>* emissions = &(*emissionProbabilities_)(0);
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    size_t jj = j * nbStates_;
+    x = 0;
+    for (size_t k = 0; k < nbStates_; k++)
+    {
+      x += trans[k + jj] * transitionMatrix_->getEquilibriumFrequencies()[k];
+    }
+    tmp[j] = (*emissions)[j] * x;
+    scale += tmp[j];
+  }
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    likelihood1_[j] = tmp[j] / scale;
+  }
+  lScales[0] = log(scale);
+
+  vector<double>* previousLikelihood = &likelihood2_, * currentLikelihood = &likelihood1_, * tmpLikelihood;
+
+  // Recursion:
+  size_t nextBrkPt = nbSites_; // next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+
+  double a;
+  logLik_ = 0;
+  size_t offset = 0;
+  greater<double> cmp;
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    //Swap pointers:
+    tmpLikelihood = previousLikelihood;
+    previousLikelihood = currentLikelihood;
+    currentLikelihood = tmpLikelihood;
+
+    scale = 0;
+    emissions = &(*emissionProbabilities_)(i);
+    if (i < nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = 0;
+        for (size_t k = 0; k < nbStates_; k++)
+        {
+          a = trans[jj + k] * (*previousLikelihood)[k];
+          if (a < 0)
+          {
+            // *ApplicationTools::warning << "Negative value for likelihood at " << i << ", state " << j << ": " << _likelihood[i-1][k] << ", Pij = " << _hiddenModel->Pij(k, j) << endl;
+            a = 0;
+          }
+          x += a;
+        }
+        tmp[j] = (*emissions)[j] * x;
+        if (tmp[j] < 0)
+        {
+          // *ApplicationTools::warning << "Negative emission probability at " << i << ", state " << j << ": " << _emissions[i][j] << endl;
+          tmp[j] = 0;
+        }
+        scale += tmp[j];
+      }
+    }
+    else // Reset markov chain:
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = 0;
+        for (size_t k = 0; k < nbStates_; k++)
+        {
+          a = trans[jj + k] * transitionMatrix_->getEquilibriumFrequencies()[k];
+          if (a < 0)
+          {
+            // *ApplicationTools::warning << "Negative value for likelihood at " << i << ", state " << j << ": " << _likelihood[i-1][k] << ", Pij = " << _hiddenModel->Pij(k, j) << endl;
+            a = 0;
+          }
+          x += a;
+        }
+        tmp[j] = (*emissions)[j] * x;
+        if (tmp[j] < 0)
+        {
+          // *ApplicationTools::warning << "Negative emission probability at " << i << ", state " << j << ": " << _emissions[i][j] << endl;
+          tmp[j] = 0;
+        }
+        scale += tmp[j];
+      }
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+
+    for (size_t j = 0; j < nbStates_; j++)
+    {
+      if (scale > 0) (*currentLikelihood)[j] = tmp[j] / scale;
+      else (*currentLikelihood)[j] = 0;
+    }
+    lScales[i - offset] = log(scale);
+  
+    if (i - offset == maxSize_ - 1)
+    {
+      //We make partial calculations and reset the arrays:
+      double partialLogLik = 0;
+      sort(lScales.begin(), lScales.end(), cmp);
+      for (size_t j = 0; j < maxSize_; ++j)
+      {
+        partialLogLik += lScales[j];
+      }
+      logLik_ += partialLogLik;
+      offset += maxSize_;
+    }
+  }
+  sort(lScales.begin(), lScales.begin() + static_cast<ptrdiff_t>(nbSites_ - offset), cmp);
+  double partialLogLik = 0;
+  for (size_t i = 0; i < nbSites_ - offset; ++i)
+  {
+    partialLogLik += lScales[i];
+  }
+  logLik_ += partialLogLik;
+}
+
+/***************************************************************************************************************************/
+
diff --git a/src/Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.h b/src/Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.h
new file mode 100644
index 0000000..4ab7162
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.h
@@ -0,0 +1,240 @@
+//
+// File: LowMemoryRescaledHmmLikelihood.h
+// Created by: Julien Dutheil
+// Created on: Wed Dec 16 10:47 2009
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _LOWMEMORYRESCALEDHMMLIKELIHOOD_H_
+#define _LOWMEMORYRESCALEDHMMLIKELIHOOD_H_
+
+#include "HmmLikelihood.h"
+#include "../AbstractParametrizable.h"
+#include "../Matrix/Matrix.h"
+
+// From the STL:
+#include <vector>
+#include <memory>
+
+namespace bpp
+{
+/**
+ * @brief A modified implementation of the RescaledHmmLikelihood implementation, with lower memory usage.
+ *
+ * This implementation is similar to the one used in the RescaledHmmLikelihood class,
+ * but does not store the full likelihood array. The benefit of it is a significantly reduced
+ * memory usage, allowing to compute likelihood for very large data sets.
+ *
+ * The drawback is that this class can't compute posterior
+ * probabilities, neither derivatives of the likelihoods, and can
+ * hence only be used to compute likelihoods.
+ *
+ */
+  
+class LowMemoryRescaledHmmLikelihood :
+  public AbstractHmmLikelihood,
+  public AbstractParametrizable
+{
+private:
+  /**
+   * @brief The alphabet describing the hidden states.
+   */
+  std::unique_ptr<HmmStateAlphabet> hiddenAlphabet_;
+  std::unique_ptr<HmmTransitionMatrix> transitionMatrix_;
+  std::unique_ptr<HmmEmissionProbabilities> emissionProbabilities_;
+
+  /**
+   * @brief The likelihood array.
+   *
+   * Here we use two arrays for the i and i-1 positions
+   */
+  std::vector<double> likelihood1_;
+  std::vector<double> likelihood2_;
+  double logLik_;
+  size_t maxSize_;
+
+  std::vector<size_t> breakPoints_;
+
+  size_t nbStates_, nbSites_;
+
+public:
+  /**
+   * @brief Build a new LowMemoryRescaledHmmLikelihood object.
+   *
+   * @warning the HmmTransitionMatrix and HmmEmissionProbabilities object passed as argument must be non-null
+   * and point toward the same HmmStateAlphabet instance. The three object will be copied if needed, and
+   * deleted when the hmm likelihood objet is deleted. You should secure a copy before if you don't want them to
+   * be destroyed with this object.
+   *
+   * @param hiddenAlphabet The hidden states alphabet to use.
+   * @param transitionMatrix The transition matrix to use.
+   * @param emissionProbabilities The emission probabilities to use.
+   * @param prefix A namespace for parameter names.
+   * @param maxSize the maximum size of the vector of scales. If this size is exceeded, then a temporary likelihood computation is made and stored, and the vector is reset.
+   * the size of the vector specify the memory usage of the class. A two low value can lead to numerical precision errors.
+   */
+  LowMemoryRescaledHmmLikelihood(
+    HmmStateAlphabet* hiddenAlphabet,
+    HmmTransitionMatrix* transitionMatrix,
+    HmmEmissionProbabilities* emissionProbabilities,
+    const std::string& prefix,
+    size_t maxSize = 1000000) throw (Exception);
+
+  LowMemoryRescaledHmmLikelihood(const LowMemoryRescaledHmmLikelihood& lik) :
+    AbstractHmmLikelihood(lik),
+    AbstractParametrizable(lik),
+    hiddenAlphabet_(dynamic_cast<HmmStateAlphabet*>(lik.hiddenAlphabet_->clone())),
+    transitionMatrix_(dynamic_cast<HmmTransitionMatrix*>(lik.transitionMatrix_->clone())),
+    emissionProbabilities_(dynamic_cast<HmmEmissionProbabilities*>(lik.emissionProbabilities_->clone())),
+    likelihood1_(lik.likelihood1_),
+    likelihood2_(lik.likelihood2_),
+    logLik_(lik.logLik_),
+    maxSize_(lik.maxSize_),
+    breakPoints_(lik.breakPoints_),
+    nbStates_(lik.nbStates_),
+    nbSites_(lik.nbSites_)
+  {
+    // Now adjust pointers:
+    transitionMatrix_->setHmmStateAlphabet(hiddenAlphabet_.get());
+    emissionProbabilities_->setHmmStateAlphabet(hiddenAlphabet_.get());
+  }
+
+  LowMemoryRescaledHmmLikelihood& operator=(const LowMemoryRescaledHmmLikelihood& lik)
+  {
+    AbstractHmmLikelihood::operator=(lik);
+    AbstractParametrizable::operator=(lik);
+    hiddenAlphabet_        = std::unique_ptr<HmmStateAlphabet>(dynamic_cast<HmmStateAlphabet*>(lik.hiddenAlphabet_->clone()));
+    transitionMatrix_      = std::unique_ptr<HmmTransitionMatrix>(dynamic_cast<HmmTransitionMatrix*>(lik.transitionMatrix_->clone()));
+    emissionProbabilities_ = std::unique_ptr<HmmEmissionProbabilities>(dynamic_cast<HmmEmissionProbabilities*>(lik.emissionProbabilities_->clone()));
+    likelihood1_           = lik.likelihood1_;
+    likelihood2_           = lik.likelihood2_;
+    logLik_                = lik.logLik_;
+    maxSize_               = lik.maxSize_;
+    breakPoints_           = lik.breakPoints_;
+    nbStates_              = lik.nbStates_;
+    nbSites_               = lik.nbSites_;
+
+    // Now adjust pointers:
+    transitionMatrix_->setHmmStateAlphabet(hiddenAlphabet_.get());
+    emissionProbabilities_->setHmmStateAlphabet(hiddenAlphabet_.get());
+    return *this;
+  }
+
+  virtual ~LowMemoryRescaledHmmLikelihood() {}
+
+  LowMemoryRescaledHmmLikelihood* clone() const { return new LowMemoryRescaledHmmLikelihood(*this); }
+
+public:
+  const HmmStateAlphabet& getHmmStateAlphabet() const { return *hiddenAlphabet_; }
+  HmmStateAlphabet& getHmmStateAlphabet() { return *hiddenAlphabet_; }
+
+  const HmmTransitionMatrix& getHmmTransitionMatrix() const { return *transitionMatrix_; }
+  HmmTransitionMatrix& getHmmTransitionMatrix() { return *transitionMatrix_; }
+
+  const HmmEmissionProbabilities& getHmmEmissionProbabilities() const { return *emissionProbabilities_; }
+  HmmEmissionProbabilities& getHmmEmissionProbabilities() { return *emissionProbabilities_; }
+
+  void setBreakPoints(const std::vector<size_t>& breakPoints) {
+    breakPoints_ = breakPoints;
+    computeForward_();
+  }
+
+  const std::vector<size_t>& getBreakPoints() const { return breakPoints_; }
+
+  void setParameters(const ParameterList& pl) throw (Exception)
+  {
+    setParametersValues(pl);
+  }
+
+  double getValue() const throw (Exception) { return -logLik_; }
+
+  double getLogLikelihood() const { return logLik_; }
+
+  void setNamespace(const std::string& nameSpace);
+
+  void fireParameterChanged(const ParameterList& pl);
+
+  double getLikelihoodForASite(size_t site) const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::getLikelihoodForASite. This class can't compute posterior probabilities, use RescaledHmmLikelihood instead."));    
+  }
+
+
+  Vdouble getLikelihoodForEachSite() const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::getLikelihoodForEachSite. This class can't compute posterior probabilities, use RescaledHmmLikelihood instead."));    
+  }
+
+  Vdouble getHiddenStatesPosteriorProbabilitiesForASite(size_t site) const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::getHiddenStatesPosteriorProbabilitiesForASite. This class can't compute posterior probabilities, use RescaledHmmLikelihood instead."));    
+  }
+
+  void getHiddenStatesPosteriorProbabilities(std::vector< std::vector<double> >& probs, bool append = false) const throw (NotImplementedException)
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::getHiddenStatesPosteriorProbabilities. This class can't compute posterior probabilities, use RescaledHmmLikelihood instead."));    
+  }
+
+protected:
+  void computeForward_();
+
+  void computeDLikelihood_() const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::computeDLikelihood_. Use RescaledHmmLikelihood instead."));
+  }
+
+  void computeD2Likelihood_() const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::computeD2Likelihood_. Use RescaledHmmLikelihood instead."));
+  }
+
+  double getDLogLikelihoodForASite(size_t site) const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::getDLogLikelihoodForASite. Use RescaledHmmLikelihood instead."));
+    return 0;
+  }
+
+  double getD2LogLikelihoodForASite(size_t site) const
+  {
+    throw (NotImplementedException("LowMemoryRescaledHmmLikelihood::getD2LogLikelihoodForASite. Use RescaledHmmLikelihood instead."));
+    return 0;
+  }
+
+};
+
+}
+
+#endif // _LOWMEMORYRESCALEDHMMLIKELIHOOD_H_
+
diff --git a/src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.cpp b/src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.cpp
new file mode 100644
index 0000000..d2a93d1
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.cpp
@@ -0,0 +1,597 @@
+//
+// File: RescaledHmmLikelihood.cpp
+// Created by: Julien Dutheil
+// Created on: Fri Oct 26 11:57 2007
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for phylogenetic data analysis.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "RescaledHmmLikelihood.h"
+
+#include "../../App/ApplicationTools.h"
+
+// from the STL:
+#include <iostream>
+#include <algorithm>
+using namespace bpp;
+using namespace std;
+
+RescaledHmmLikelihood::RescaledHmmLikelihood(
+    HmmStateAlphabet* hiddenAlphabet,
+    HmmTransitionMatrix* transitionMatrix,
+    HmmEmissionProbabilities* emissionProbabilities,
+    const std::string& prefix) throw (Exception):
+  AbstractHmmLikelihood(),
+  AbstractParametrizable(prefix),
+  hiddenAlphabet_(hiddenAlphabet),
+  transitionMatrix_(transitionMatrix),
+  emissionProbabilities_(emissionProbabilities),
+  likelihood_(),
+  dLikelihood_(),
+  d2Likelihood_(),
+  backLikelihood_(),
+  backLikelihoodUpToDate_(false),
+  scales_(),
+  dScales_(),
+  d2Scales_(),
+  logLik_(),
+  breakPoints_(),
+  nbStates_(),
+  nbSites_()
+{
+  if (!hiddenAlphabet)        throw Exception("RescaledHmmLikelihood: null pointer passed for HmmStateAlphabet.");
+  if (!transitionMatrix)      throw Exception("RescaledHmmLikelihood: null pointer passed for HmmTransitionMatrix.");
+  if (!emissionProbabilities) throw Exception("RescaledHmmLikelihood: null pointer passed for HmmEmissionProbabilities.");
+  if (!hiddenAlphabet_->worksWith(transitionMatrix->getHmmStateAlphabet()))
+    throw Exception("RescaledHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
+  if (!hiddenAlphabet_->worksWith(emissionProbabilities->getHmmStateAlphabet()))
+    throw Exception("RescaledHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
+  nbStates_ = hiddenAlphabet_->getNumberOfStates();
+  nbSites_ = emissionProbabilities_->getNumberOfPositions();
+
+  //Manage parameters:
+  addParameters_(hiddenAlphabet_->getParameters());
+  addParameters_(transitionMatrix_->getParameters());
+  addParameters_(emissionProbabilities_->getParameters());
+
+  //Init arrays:
+  likelihood_.resize(nbSites_ * nbStates_);
+  
+  scales_.resize(nbSites_);
+  
+  //Compute:
+  computeForward_();
+}
+
+void RescaledHmmLikelihood::setNamespace(const std::string& nameSpace)
+{
+  AbstractParametrizable::setNamespace(nameSpace);
+
+  hiddenAlphabet_->setNamespace(nameSpace);
+  transitionMatrix_->setNamespace(nameSpace);
+  emissionProbabilities_->setNamespace(nameSpace);
+}
+
+void RescaledHmmLikelihood::fireParameterChanged(const ParameterList& pl)
+{
+  bool alphabetChanged    = hiddenAlphabet_->matchParametersValues(pl);
+  bool transitionsChanged = transitionMatrix_->matchParametersValues(pl);
+  bool emissionChanged    = emissionProbabilities_->matchParametersValues(pl);
+  // these lines are necessary because the transitions and emissions can depend on the alphabet.
+  // we could use a StateChangeEvent, but this would result in computing some calculations twice in some cases
+  // (when both the alphabet and other parameter changed).
+  if (alphabetChanged && !transitionsChanged) transitionMatrix_->setParametersValues(transitionMatrix_->getParameters());
+  if (alphabetChanged && !emissionChanged) emissionProbabilities_->setParametersValues(emissionProbabilities_->getParameters());
+  
+  computeForward_();
+  backLikelihoodUpToDate_=false;
+}
+
+/***************************************************************************************************************************/
+
+void RescaledHmmLikelihood::computeForward_()
+{
+  double x;
+  vector<double> tmp(nbStates_);
+  vector<double> lScales(nbSites_);
+  vector<double> trans(nbStates_ * nbStates_);
+
+  //Transition probabilities:
+  for (size_t i = 0; i < nbStates_; i++)
+  {
+    size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++) {
+      trans[ii + j] = transitionMatrix_->Pij(j, i);
+      if (std::isnan(trans[ii + j]))
+        throw Exception("RescaledHmmLikelihood::computeForward_. NaN transition probability");
+      if (trans[ii + j] < 0)
+        throw Exception("RescaledHmmLikelihood::computeForward_. Negative transition probability: " + TextTools::toString(trans[ii + j]));
+    }
+  }
+
+  //Initialisation:
+  scales_[0] = 0;
+  const vector<double>* emissions = &(*emissionProbabilities_)(0);
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    size_t jj = j * nbStates_;
+    x = 0;
+    for (size_t k = 0; k < nbStates_; k++)
+    {
+      x += trans[k + jj] * transitionMatrix_->getEquilibriumFrequencies()[k];
+      //cerr << j << "\t" << k << "\t" << trans[k + jj] << "\t" << transitionMatrix_->getEquilibriumFrequencies()[k] << "\t" << trans[k + jj] * transitionMatrix_->getEquilibriumFrequencies()[k] << "\t" << x << endl;  
+    }
+    tmp[j] = (*emissions)[j] * x;
+    //cerr << "e[j]=" << (*emissions)[j] << "\t" << tmp[j] << endl;
+    scales_[0] += tmp[j];
+  }
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    likelihood_[j] = tmp[j] / scales_[0];
+  }
+  lScales[0] = log(scales_[0]);
+ 
+  //Recursion:
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+  
+  double a;
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    size_t ii = i * nbStates_;
+    size_t iip = (i - 1) * nbStates_;
+    scales_[i] = 0 ;
+    emissions = &(*emissionProbabilities_)(i);
+    if (i < nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = 0;
+        for (size_t k = 0; k < nbStates_; k++)
+        {
+          a = trans[jj + k] * likelihood_[iip + k];
+          //if (a < 0)
+          //{
+          //  (*ApplicationTools::warning << "Negative value for likelihood at " << i << ", state " << j << ": " << likelihood_[iip + k] << ", Pij = " << trans[jj + k]).endLine();
+          //  a = 0;
+          //}
+          x += a;
+        }
+        tmp[j] = (*emissions)[j] * x;
+        if (tmp[j] < 0)
+        {
+          (*ApplicationTools::warning << "Negative probability at " << i << ", state " << j << ": " << (*emissions)[j] << "\t" << x).endLine();
+          tmp[j] = 0;
+        }
+        scales_[i] += tmp[j];
+      }
+    }
+    else //Reset markov chain:
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        size_t jj = j * nbStates_;
+        x = 0;
+        for (size_t k = 0; k < nbStates_; k++)
+        {
+          a = trans[jj + k] * transitionMatrix_->getEquilibriumFrequencies()[k];
+          //if (a < 0)
+          //{
+          //  (*ApplicationTools::warning << "Negative value for likelihood at " << i << ", state " << j << ": ,Pij = " << trans[jj + k]).endLine();
+          //  a = 0;
+          //}
+          x += a;
+        }
+        tmp[j] = (*emissions)[j] * x;
+        //if (tmp[j] < 0)
+        //{
+        //  (*ApplicationTools::warning << "Negative emission probability at " << i << ", state " << j << ": " << (*emissions)[j]).endLine();
+        //  tmp[j] = 0;
+        //}
+        scales_[i] += tmp[j];
+      }
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+
+    for (size_t j = 0; j < nbStates_; j++)
+    {
+      if (scales_[i] > 0) likelihood_[ii + j] = tmp[j] / scales_[i];
+      else                likelihood_[ii + j] = 0;
+    }
+    lScales[i] = log(scales_[i]);
+  }
+  greater<double> cmp;
+  sort(lScales.begin(), lScales.end(), cmp);
+  logLik_ = 0;
+  for (size_t i = 0; i < nbSites_; ++i)
+  {
+    logLik_ += lScales[i];
+  }
+}
+
+/***************************************************************************************************************************/
+
+void RescaledHmmLikelihood::computeBackward_() const
+{
+  if (backLikelihood_.size() == 0)
+  {
+    backLikelihood_.resize(nbSites_);
+    for (size_t i = 0; i < nbSites_; i++)
+      backLikelihood_[i].resize(nbStates_);
+  }
+
+  double x;
+
+  //Transition probabilities:
+  vector<double> trans(nbStates_ * nbStates_);
+  for (size_t i = 0; i < nbStates_; i++)
+  {
+    size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++)
+      trans[ii + j] = transitionMatrix_->Pij(i, j);
+  }
+
+
+  //Initialisation:
+  const vector<double>* emissions = 0;
+  size_t nextBrkPt = 0; //next break point
+  vector<size_t>::const_reverse_iterator bpIt = breakPoints_.rbegin();
+  if (bpIt != breakPoints_.rend()) nextBrkPt = *bpIt;
+  
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    x = 0;
+    backLikelihood_[nbSites_ - 1][j] = 1.;
+  }
+
+  //Recursion:
+  for (size_t i = nbSites_ - 1; i > 0; i--)
+  {
+    emissions = &(*emissionProbabilities_)(i);
+    if (i > nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        x = 0;
+        size_t jj = j * nbStates_;
+        for (size_t k = 0; k < nbStates_; k++)
+        {
+          x += (*emissions)[k] * trans[jj + k] * backLikelihood_[i][k];
+        }
+        backLikelihood_[i-1][j] = x / scales_[i];
+      }    
+    }
+    else //Reset markov chain
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        backLikelihood_[i-1][j] = 1.;
+      }    
+      bpIt++;
+      if (bpIt != breakPoints_.rend()) nextBrkPt = *bpIt;
+      else nextBrkPt = 0;
+    }
+  }
+
+  backLikelihoodUpToDate_ = true;
+}
+
+/***************************************************************************************************************************/
+
+double RescaledHmmLikelihood::getLikelihoodForASite(size_t site) const
+{
+  Vdouble probs = getHiddenStatesPosteriorProbabilitiesForASite(site);
+  double x = 0;
+  for (size_t i = 0; i < nbStates_; i++)
+    x += probs[i] * (*emissionProbabilities_)(site,i);
+
+  return x;
+}
+
+Vdouble RescaledHmmLikelihood::getLikelihoodForEachSite() const
+{
+  std::vector< std::vector<double> > vv;
+  getHiddenStatesPosteriorProbabilities(vv);
+
+  Vdouble ret(nbSites_);
+  for (size_t i = 0; i < nbSites_; i++)
+    {
+      ret[i] = 0;
+      for (size_t j = 0; j < nbStates_; j++)
+        ret[i] += vv[i][j] * (*emissionProbabilities_)(i,j);
+    }
+
+  return ret;
+}
+
+/***************************************************************************************************************************/
+
+Vdouble RescaledHmmLikelihood::getHiddenStatesPosteriorProbabilitiesForASite(size_t site) const
+{
+  if (!backLikelihoodUpToDate_)
+    computeBackward_();
+
+  Vdouble probs(nbStates_);
+  
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    probs[j] = likelihood_[site * nbStates_ + j] * backLikelihood_[site][j];
+  }
+
+  return probs;
+}
+
+
+void RescaledHmmLikelihood::getHiddenStatesPosteriorProbabilities(std::vector< std::vector<double> >& probs, bool append) const throw (Exception)
+{
+  size_t offset = append ? probs.size() : 0;
+  probs.resize(offset + nbSites_);
+  for (size_t i = 0; i < nbSites_; i++)
+  {
+    probs[offset + i].resize(nbStates_);
+  }
+
+  if (!backLikelihoodUpToDate_)
+    computeBackward_();
+  
+  for (size_t i = 0; i < nbSites_; i++)
+  {
+    size_t ii = i * nbStates_;
+    for (size_t j = 0; j < nbStates_; j++)
+    {
+      probs[offset + i][j] = likelihood_[ii + j] * backLikelihood_[i][j];
+    }
+  }
+}
+
+/***************************************************************************************************************************/
+
+void RescaledHmmLikelihood::computeDForward_() const
+{
+  //Init arrays:
+  if (dLikelihood_.size()==0){
+    dLikelihood_.resize(nbSites_);
+    for (size_t i=0;i<nbSites_;i++)
+      dLikelihood_[i].resize(nbStates_);
+  }
+  if (dScales_.size()==0)
+    dScales_.resize(nbSites_);
+  
+  double x;
+  vector<double> tmp(nbStates_), dTmp(nbStates_);
+  vector<double> dLScales(nbSites_);
+  
+  //Transition probabilities:
+  const ColMatrix<double> trans(transitionMatrix_->getPij());
+
+  //Initialisation:
+  dScales_[0] = 0;
+  const vector<double>* emissions = &(*emissionProbabilities_)(0);
+  const vector<double>* dEmissions = &emissionProbabilities_->getDEmissionProbabilities(0);
+
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    dTmp[j] = (*dEmissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+    tmp[j] = (*emissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+
+    dScales_[0] += dTmp[j];
+  }
+
+  dLScales[0]=dScales_[0]/scales_[0];
+
+  
+  for (size_t j = 0; j < nbStates_; j++)
+    dLikelihood_[0][j] = (dTmp[j] * scales_[0] - tmp[j] * dScales_[0]) / pow(scales_[0],2);
+ 
+  //Recursion:
+
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+  
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    size_t iip = (i - 1) * nbStates_;
+
+    dScales_[i] = 0 ;
+
+    emissions = &(*emissionProbabilities_)(i);
+    dEmissions = &emissionProbabilities_->getDEmissionProbabilities(i);
+    
+    if (i < nextBrkPt)
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        x = 0;
+        for (size_t k = 0; k < nbStates_; k++)
+          x += trans(k,j) * likelihood_[iip + k];
+
+        tmp[j] = (*emissions)[j] * x;
+        dTmp[j] = (*dEmissions)[j] * x + (*emissions)[j] * VectorTools::sum(trans.getCol(j) * dLikelihood_[i-1]);
+          
+        dScales_[i] += dTmp[j];
+      }
+    }
+    else //Reset markov chain:
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        dTmp[j] = (*dEmissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+        tmp[j] = (*emissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+        
+        dScales_[i] += dTmp[j];
+      }
+      
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+
+    dLScales[i]=dScales_[i]/scales_[i];
+
+    for (size_t j = 0; j < nbStates_; j++)
+      dLikelihood_[i][j] = (dTmp[j] * scales_[i] - tmp[j] * dScales_[i]) / pow(scales_[i],2);
+  }
+  
+  greater<double> cmp;
+  sort(dLScales.begin(), dLScales.end(), cmp);
+  dLogLik_ = 0;
+  for (size_t i = 0; i < nbSites_; ++i)
+  {
+    dLogLik_ += dLScales[i];
+  }
+}
+
+double RescaledHmmLikelihood::getDLogLikelihoodForASite(size_t site) const
+{
+  return dScales_[site]/scales_[site];
+}
+
+/***************************************************************************************************************************/
+
+
+void RescaledHmmLikelihood::computeD2Forward_() const
+{
+  //Init arrays:
+  if (d2Likelihood_.size()==0){
+    d2Likelihood_.resize(nbSites_);
+    for (size_t i=0;i<nbSites_;i++)
+      d2Likelihood_[i].resize(nbStates_);
+  }
+  if (d2Scales_.size()==0)
+    d2Scales_.resize(nbSites_);
+  
+  double x;
+  vector<double> tmp(nbStates_), dTmp(nbStates_), d2Tmp(nbStates_);
+  vector<double> d2LScales(nbSites_);
+  
+  //Transition probabilities:
+  const ColMatrix<double> trans(transitionMatrix_->getPij());
+
+  //Initialisation:
+  d2Scales_[0] = 0;
+  const vector<double>* emissions = &(*emissionProbabilities_)(0);
+  const vector<double>* dEmissions = &emissionProbabilities_->getDEmissionProbabilities(0);
+  const vector<double>* d2Emissions = &emissionProbabilities_->getD2EmissionProbabilities(0);
+
+  for (size_t j = 0; j < nbStates_; j++)
+  {
+    tmp[j] = (*emissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+    dTmp[j] = (*dEmissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+    d2Tmp[j] = (*d2Emissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+
+    d2Scales_[0] += d2Tmp[j];
+  }
+
+  d2LScales[0]=d2Scales_[0]/scales_[0]-pow(dScales_[0]/scales_[0],2);
+  
+  for (size_t j = 0; j < nbStates_; j++)
+    d2Likelihood_[0][j] = d2Tmp[j] / scales_[0] - (d2Scales_[0] * tmp[j] + 2 * dScales_[0] * dTmp[j]) / pow(scales_[0],2)
+      +  2 * pow(dScales_[0],2) * tmp[j] / pow(scales_[0],3);
+   
+  //Recursion:
+
+  size_t nextBrkPt = nbSites_; //next break point
+  vector<size_t>::const_iterator bpIt = breakPoints_.begin();
+  if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+  
+  for (size_t i = 1; i < nbSites_; i++)
+  {
+    dScales_[i] = 0 ;
+
+    emissions = &(*emissionProbabilities_)(i);
+    dEmissions = &emissionProbabilities_->getDEmissionProbabilities(i);
+    d2Emissions = &emissionProbabilities_->getD2EmissionProbabilities(i);
+    
+    if (i < nextBrkPt)
+    {
+      size_t iip = (i - 1) * nbStates_;
+
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        x = 0;
+        for (size_t k = 0; k < nbStates_; k++)
+          x += trans(k,j) * likelihood_[iip + k];
+
+        tmp[j] = (*emissions)[j] * x;
+        dTmp[j] = (*dEmissions)[j] * x + (*emissions)[j] * VectorTools::sum(trans.getCol(j) * dLikelihood_[i-1]);
+        d2Tmp[j] = (*d2Emissions)[j] * x + 2 * (*dEmissions)[j] * VectorTools::sum(trans.getCol(j) * dLikelihood_[i-1])
+          + (*emissions)[j] * VectorTools::sum(trans.getCol(j) * d2Likelihood_[i-1]);
+          
+        d2Scales_[i] += d2Tmp[j];
+      }
+    }
+    else //Reset markov chain:
+    {
+      for (size_t j = 0; j < nbStates_; j++)
+      {
+        tmp[j] = (*emissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+        dTmp[j] = (*dEmissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+        d2Tmp[j] = (*d2Emissions)[j] * transitionMatrix_->getEquilibriumFrequencies()[j];
+        
+        d2Scales_[i] += d2Tmp[j];
+      }
+      
+      bpIt++;
+      if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
+      else nextBrkPt = nbSites_;
+    }
+
+    d2LScales[i]=d2Scales_[i]/scales_[i]-pow(dScales_[i]/scales_[i],2);
+  
+    for (size_t j = 0; j < nbStates_; j++)
+      d2Likelihood_[i][j] = d2Tmp[j] / scales_[i] - (d2Scales_[i] * tmp[j] + 2 * dScales_[i] * dTmp[j]) / pow(scales_[i],2)
+        +  2 * pow(dScales_[i],2) * tmp[j] / pow(scales_[i],3);
+  }
+  
+  greater<double> cmp;
+  sort(d2LScales.begin(), d2LScales.end(), cmp);
+  dLogLik_ = 0;
+  for (size_t i = 0; i < nbSites_; ++i)
+  {
+    d2LogLik_ += d2LScales[i];
+  }
+}
+
+/***************************************************************************************************************************/
+
+double RescaledHmmLikelihood::getD2LogLikelihoodForASite(size_t site) const
+{
+  return d2Scales_[site]/scales_[site]-pow(dScales_[site]/scales_[site],2);
+}
+
diff --git a/src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.h b/src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.h
new file mode 100644
index 0000000..0cb76cb
--- /dev/null
+++ b/src/Bpp/Numeric/Hmm/RescaledHmmLikelihood.h
@@ -0,0 +1,259 @@
+//
+// File: RescaledHmmLikelihood.h
+// Created by: Julien Dutheil
+// Created on: Fri Oct 26 11:57 2007
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _RESCALEDHMMLIKELIHOOD_H_
+#define _RESCALEDHMMLIKELIHOOD_H_
+
+#include "HmmLikelihood.h"
+#include "../AbstractParametrizable.h"
+#include "../Matrix/Matrix.h"
+
+//From the STL:
+#include <vector>
+#include <memory>
+
+namespace bpp {
+
+  /**
+   * @brief A simple implementation of hidden Markov models recursion.
+   *
+   * This implementation uses the rescaling method described in Durbin et al "Biological sequence analysis", Cambridge University Press.
+   * It also offer the possibility to specify "breakpoints", where the chain will be reset to the equilibrium frequencies.
+   */
+  class RescaledHmmLikelihood:
+    public virtual AbstractHmmLikelihood,
+    public AbstractParametrizable
+  {
+  private:
+    /**
+     * @brief The alphabet describing the hidden states.
+     */
+    std::unique_ptr<HmmStateAlphabet> hiddenAlphabet_;
+    std::unique_ptr<HmmTransitionMatrix> transitionMatrix_;
+    std::unique_ptr<HmmEmissionProbabilities> emissionProbabilities_;
+
+    /**
+     * @brief The likelihood arrays.
+     *
+     */
+
+    /**
+     * @brief forward likelihood
+     *
+     * likelihood_[i * nbStates_ + j] corresponds to Pr(x_1...x_i, y_i=j)/Pr(x_1...x_i),
+     * where the x are the observed states, and y the hidden states.
+     */
+
+    std::vector<double> likelihood_;
+
+    /**
+     * @brief derivatec of forward likelihood
+     *
+     * dlikelihood_[i][j] corresponds to d(Pr(x_1...x_i, y_i=j))/Pr(x_1...x_i)),
+     * where the x are the observed states, and y the hidden states.
+     */
+
+    mutable std::vector<std::vector<double> > dLikelihood_;
+    mutable std::vector<std::vector<double> > d2Likelihood_;
+
+    /**
+     * @brief backward likelihood
+     *
+     * backLikelihood_[i][j] corresponds to Pr(x_i+1...x_n | yi=j),
+     * where the x are the observed states, and y the hidden states.
+     */
+
+    mutable std::vector<std::vector<double> > backLikelihood_;
+    mutable bool backLikelihoodUpToDate_;
+    
+    /**
+     * @brief scales for likelihood computing
+     *
+     * scales_[i * nbStates_ + j] corresponds to Pr(x_1...x_i)/Pr(x_1...x_{i-1})
+     * where the x are the observed states.
+     */
+    
+    std::vector<double> scales_;
+    
+    mutable std::vector<double> dScales_;
+    mutable std::vector<double> d2Scales_;
+    double logLik_;
+
+    std::vector<size_t> breakPoints_;
+
+    size_t nbStates_, nbSites_;
+
+  public:
+    /**
+     * @brief Build a new RescaledHmmLikelihood object.
+     *
+     * @warning the HmmTransitionMatrix and HmmEmissionProbabilities object passed as argument must be non-null
+     * and point toward the same HmmStateAlphabet instance. The three object will be copied if needed, and
+     * deleted when the hmm likelihood objet is deleted. You should secure a copy before if you don't want them to
+     * be destroyed with this object.
+     */
+    RescaledHmmLikelihood(
+                          HmmStateAlphabet* hiddenAlphabet,
+                          HmmTransitionMatrix* transitionMatrix,
+                          HmmEmissionProbabilities* emissionProbabilities,
+                          const std::string& prefix) throw (Exception);
+    
+    RescaledHmmLikelihood(const RescaledHmmLikelihood& lik):
+    AbstractHmmLikelihood(lik),
+    AbstractParametrizable(lik),
+    hiddenAlphabet_(dynamic_cast<HmmStateAlphabet*>(lik.hiddenAlphabet_->clone())),
+    transitionMatrix_(dynamic_cast<HmmTransitionMatrix*>(lik.transitionMatrix_->clone())),
+    emissionProbabilities_(dynamic_cast<HmmEmissionProbabilities*>(lik.emissionProbabilities_->clone())),
+    likelihood_(lik.likelihood_),
+    dLikelihood_(lik.dLikelihood_),
+    d2Likelihood_(lik.d2Likelihood_),
+    backLikelihood_(lik.backLikelihood_),
+    backLikelihoodUpToDate_(lik.backLikelihoodUpToDate_),
+    scales_(lik.scales_),
+    dScales_(lik.dScales_),
+    d2Scales_(lik.d2Scales_),
+    logLik_(lik.logLik_),
+    breakPoints_(lik.breakPoints_),
+    nbStates_(lik.nbStates_),
+    nbSites_(lik.nbSites_)
+    {
+      // Now adjust pointers:
+      transitionMatrix_->setHmmStateAlphabet(hiddenAlphabet_.get());
+      emissionProbabilities_->setHmmStateAlphabet(hiddenAlphabet_.get());
+    }
+
+    RescaledHmmLikelihood& operator=(const RescaledHmmLikelihood& lik)
+    {
+      AbstractHmmLikelihood::operator=(lik);
+      AbstractParametrizable::operator=(lik);
+      hiddenAlphabet_        = std::unique_ptr<HmmStateAlphabet>(dynamic_cast<HmmStateAlphabet*>(lik.hiddenAlphabet_->clone()));
+      transitionMatrix_      = std::unique_ptr<HmmTransitionMatrix>(dynamic_cast<HmmTransitionMatrix*>(lik.transitionMatrix_->clone()));
+      emissionProbabilities_ = std::unique_ptr<HmmEmissionProbabilities>(dynamic_cast<HmmEmissionProbabilities*>(lik.emissionProbabilities_->clone()));
+      likelihood_            = lik.likelihood_;
+      dLikelihood_           = lik.dLikelihood_;
+      d2Likelihood_          = lik.d2Likelihood_;
+      backLikelihood_        = lik.backLikelihood_;
+      backLikelihoodUpToDate_= lik.backLikelihoodUpToDate_;
+      scales_                = lik.scales_;
+      dScales_               = lik.dScales_;
+      d2Scales_              = lik.d2Scales_;
+      logLik_                = lik.logLik_;
+      breakPoints_           = lik.breakPoints_;
+      nbStates_              = lik.nbStates_;
+      nbSites_               = lik.nbSites_;
+
+      // Now adjust pointers:
+      transitionMatrix_->setHmmStateAlphabet(hiddenAlphabet_.get());
+      emissionProbabilities_->setHmmStateAlphabet(hiddenAlphabet_.get());
+      return *this;
+    }
+
+    virtual ~RescaledHmmLikelihood() {}
+
+    RescaledHmmLikelihood* clone() const { return new RescaledHmmLikelihood(*this); }
+
+  public:
+    const HmmStateAlphabet& getHmmStateAlphabet() const { return *hiddenAlphabet_; }
+    HmmStateAlphabet& getHmmStateAlphabet() { return *hiddenAlphabet_; }
+
+    const HmmTransitionMatrix& getHmmTransitionMatrix() const { return *transitionMatrix_; }
+    HmmTransitionMatrix& getHmmTransitionMatrix() { return *transitionMatrix_; }
+
+    const HmmEmissionProbabilities& getHmmEmissionProbabilities() const { return *emissionProbabilities_; }
+    HmmEmissionProbabilities& getHmmEmissionProbabilities() { return *emissionProbabilities_; }
+
+    void setBreakPoints(const std::vector<size_t>& breakPoints) {
+      breakPoints_ = breakPoints;
+      computeForward_();
+      backLikelihoodUpToDate_=false;
+    }
+
+    const std::vector<size_t>& getBreakPoints() const { return breakPoints_; }
+
+    void setParameters(const ParameterList& pl) throw (Exception)
+    {
+      setParametersValues(pl);
+    }
+
+    double getValue() const throw (Exception) { return -logLik_; }
+
+    double getLogLikelihood() const { return logLik_; }
+
+    double getLikelihoodForASite(size_t site) const;
+
+    double getDLogLikelihoodForASite(size_t site) const;
+
+    double getD2LogLikelihoodForASite(size_t site) const;
+    
+    Vdouble getLikelihoodForEachSite() const;
+
+    void setNamespace(const std::string& nameSpace);
+
+    void fireParameterChanged(const ParameterList& pl);
+
+    Vdouble getHiddenStatesPosteriorProbabilitiesForASite(size_t site) const;
+
+    void getHiddenStatesPosteriorProbabilities(std::vector< std::vector<double> >& probs, bool append = false) const throw (Exception);
+
+    
+  protected:
+    void computeForward_();
+    void computeBackward_() const;
+
+    
+    void computeDLikelihood_() const
+    {
+      computeDForward_();
+    }
+
+    void computeD2Likelihood_() const
+    {
+      computeD2Forward_();
+    }
+
+    void computeDForward_() const;
+    
+    void computeD2Forward_() const;
+    
+  };
+
+}
+
+#endif //_RESCALEDHMMLIKELIHOOD_H_
+
diff --git a/src/Bpp/Numeric/Matrix/EigenValue.h b/src/Bpp/Numeric/Matrix/EigenValue.h
new file mode 100644
index 0000000..c294761
--- /dev/null
+++ b/src/Bpp/Numeric/Matrix/EigenValue.h
@@ -0,0 +1,1248 @@
+//
+// File: EigenValue.h
+// Created by: Julien Dutheil
+// Created on: Tue Apr 7 16:24 2004
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+
+
+#ifndef _EIGENVALUE_H_
+#define _EIGENVALUE_H_
+#define TOST(i) static_cast<size_t>(i)
+
+#include <algorithm>
+// for min(), max() below
+
+#include <cmath>
+// for abs() below
+#include <climits>
+
+#include "Matrix.h"
+#include "../NumTools.h"
+
+namespace bpp
+{
+
+/** 
+ * @brief Computes eigenvalues and eigenvectors of a real (non-complex) matrix. 
+ * 
+ * [This class and its documentation is adpated from the C++ port of the JAMA library.]
+ * 
+ * If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is
+ * diagonal and the eigenvector matrix V is orthogonal. That is,
+ * the diagonal values of D are the eigenvalues, and
+ * V*V' = I, where I is the identity matrix.  The columns of V 
+ * represent the eigenvectors in the sense that A*V = V*D.
+ *
+ * If A is not symmetric, then the eigenvalue matrix D is block diagonal
+ * with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues,
+ * a + i*b, in 2-by-2 blocks, [a, b; -b, a].  That is, if the complex
+ * eigenvalues look like
+ * <pre>
+ * 
+ *         u + iv     .        .          .      .    .
+ *           .      u - iv     .          .      .    .
+ *           .        .      a + ib       .      .    .
+ *           .        .        .        a - ib   .    .
+ *           .        .        .          .      x    .
+ *           .        .        .          .      .    y
+ * </pre>
+ * then D looks like
+ * <pre>
+ * 
+ *           u        v        .          .      .    .
+ *          -v        u        .          .      .    . 
+ *           .        .        a          b      .    .
+ *           .        .       -b          a      .    .
+ *           .        .        .          .      x    .
+ *           .        .        .          .      .    y
+ * </pre>
+ * This keeps V a real matrix in both symmetric and non-symmetric
+ *  cases, and A*V = V*D.
+ *
+ *
+ * The matrix V may be badly
+ * conditioned, or even singular, so the validity of the equation
+ * A = V*D*inverse(V) depends upon the condition number of V.
+ *
+ * (Adapted from JAMA, a Java Matrix Library, developed by jointly 
+ *  by the Mathworks and NIST; see  http://math.nist.gov/javanumerics/jama).
+ */
+template <class Real>
+class EigenValue
+{
+
+  private:
+   /** 
+    * @brief Row and column dimension (square matrix).
+    */
+   size_t n_;
+
+   /**
+    * @brief Tell if the matrix is symmetric.
+    */
+   bool issymmetric_;
+
+   /**
+    * @name Arrays for internal storage of eigenvalues.
+    *
+    * @{
+    */
+   std::vector<Real> d_;         /* real part */
+   std::vector<Real> e_;         /* img part */
+   /** @} */
+   
+   /**
+    * @brief Array for internal storage of eigenvectors.
+    */
+   RowMatrix<Real> V_;
+
+   /**
+    * @brief Matrix for internal storage of nonsymmetric Hessenberg form.
+    *
+    * Internal storage of nonsymmetric Hessenberg form.
+    */
+   RowMatrix<Real> H_;
+   
+
+   /**
+    * @brief Matrix for internal storage of eigen values in a matrix form.
+    *
+    * Internal storage of eigen values in a matrix form.
+    */
+   mutable RowMatrix<Real> D_;
+
+   /**
+    * @brief Working storage for nonsymmetric algorithm.
+    *
+    * Working storage for nonsymmetric algorithm.
+    */
+   std::vector<Real> ort_;
+
+   /**
+    * @brief Symmetric Householder reduction to tridiagonal form.
+    *
+    * This is derived from the Algol procedures tred2 by
+    * Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
+    * Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
+    * Fortran subroutine in EISPACK.
+    */
+   void tred2()
+   {
+     for (size_t j = 0; j < n_; j++)
+     {
+       d_[j] = V_(n_-1,j);
+     }
+
+     // Householder reduction to tridiagonal form.
+   
+     for (size_t i = n_-1; i > 0; i--)
+     {
+       // Scale to avoid under/overflow.
+   
+       Real scale = 0.0;
+       Real h = 0.0;
+       for (size_t k = 0; k < i; ++k)
+       {
+         scale = scale + NumTools::abs<Real>(d_[k]);
+       }
+       if (scale == 0.0)
+       {
+         e_[i] = d_[i-1];
+         for (size_t j = 0; j < i; ++j)
+         {
+           d_[j] = V_(i - 1, j);
+           V_(i, j) = 0.0;
+           V_(j, i) = 0.0;
+         }
+       }
+       else
+       {
+         // Generate Householder vector.
+   
+         for (size_t k = 0; k < i; ++k)
+         {
+           d_[k] /= scale;
+           h += d_[k] * d_[k];
+         }
+         Real f = d_[i - 1];
+         Real g = sqrt(h);
+         if (f > 0)
+         {
+           g = -g;
+         }
+         e_[i] = scale * g;
+         h = h - f * g;
+         d_[i-1] = f - g;
+         for (size_t j = 0; j < i; ++j)
+         {
+           e_[j] = 0.0;
+         }
+   
+         // Apply similarity transformation to remaining columns.
+   
+         for (size_t j = 0; j < i; ++j)
+         {
+           f = d_[j];
+           V_(j,i) = f;
+           g = e_[j] + V_(j,j) * f;
+           for (size_t k = j + 1; k <= i - 1; k++)
+           {
+             g += V_(k,j) * d_[k];
+             e_[k] += V_(k,j) * f;
+           }
+           e_[j] = g;
+         }
+         f = 0.0;
+         for (size_t j = 0; j < i; ++j)
+         {
+           e_[j] /= h;
+           f += e_[j] * d_[j];
+         }
+         Real hh = f / (h + h);
+         for (size_t j = 0; j < i; ++j)
+         {
+           e_[j] -= hh * d_[j];
+         }
+         for (size_t j = 0; j < i; ++j)
+         {
+           f = d_[j];
+           g = e_[j];
+           for (size_t k = j; k <= i-1; ++k)
+           {
+             V_(k,j) -= (f * e_[k] + g * d_[k]);
+           }
+           d_[j] = V_(i-1,j);
+           V_(i,j) = 0.0;
+         }
+       }
+       d_[i] = h;
+     }
+   
+     // Accumulate transformations.
+   
+     for (size_t i = 0; i < n_-1; i++)
+     {
+       V_(n_-1,i) = V_(i,i);
+       V_(i,i) = 1.0;
+       Real h = d_[i+1];
+       if (h != 0.0)
+       {
+         for (size_t k = 0; k <= i; k++)
+         {
+           d_[k] = V_(k,i+1) / h;
+         }
+         for (size_t j = 0; j <= i; j++)
+         {
+           Real g = 0.0;
+           for (size_t k = 0; k <= i; k++)
+           {
+             g += V_(k,i+1) * V_(k,j);
+           }
+           for (size_t k = 0; k <= i; k++)
+           {
+             V_(k,j) -= g * d_[k];
+           }
+         }
+       }
+       for (size_t k = 0; k <= i; k++)
+       {
+         V_(k,i+1) = 0.0;
+       }
+     }
+     for (size_t j = 0; j < n_; j++)
+     {
+       d_[j] = V_(n_-1,j);
+       V_(n_-1,j) = 0.0;
+     }
+     V_(n_-1,n_-1) = 1.0;
+     e_[0] = 0.0;
+   } 
+
+   /**
+    * @brief Symmetric tridiagonal QL algorithm.
+    *
+    * This is derived from the Algol procedures tql2, by
+    * Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
+    * Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
+    * Fortran subroutine in EISPACK.
+    */
+   void tql2 ()
+   {
+     for (size_t i = 1; i < n_; i++)
+     {
+       e_[i - 1] = e_[i];
+     }
+     e_[n_ - 1] = 0.0;
+   
+     Real f = 0.0;
+     Real tst1 = 0.0;
+     Real eps = pow(2.0,-52.0);
+     for (size_t l = 0; l < n_; ++l)
+     {
+       // Find small subdiagonal element
+   
+       tst1 = std::max(tst1, NumTools::abs<Real>(d_[l]) + NumTools::abs<Real>(e_[l]));
+       size_t m = l;
+
+       // Original while-loop from Java code
+       while (m < n_)
+       {
+         if (NumTools::abs<Real>(e_[m]) <= eps*tst1)
+         {
+           break;
+         }
+         m++;
+       }
+
+       // If m == l, d_[l] is an eigenvalue,
+       // otherwise, iterate.
+   
+       if (m > l)
+       {
+         int iter = 0;
+         do
+         {
+           iter = iter + 1;  // (Could check iteration count here.)
+   
+           // Compute implicit shift
+   
+           Real g = d_[l];
+           Real p = (d_[l + 1] - g) / (2.0 * e_[l]);
+           Real r = hypot(p,1.0);
+           if (p < 0)
+           {
+             r = -r;
+           }
+           d_[l] = e_[l] / (p + r);
+           d_[l + 1] = e_[l] * (p + r);
+           Real dl1 = d_[l + 1];
+           Real h = g - d_[l];
+           for (size_t i = l + 2; i < n_; ++i)
+           {
+             d_[i] -= h;
+           }
+           f = f + h;
+   
+           // Implicit QL transformation.
+   
+           p = d_[m];
+           Real c = 1.0;
+           Real c2 = c;
+           Real c3 = c;
+           Real el1 = e_[l + 1];
+           Real s = 0.0;
+           Real s2 = 0.0;
+           //for (size_t i = m - 1; i >= l; --i)
+           for (size_t ii = m; ii > l; --ii)
+           {
+             size_t i = ii - 1; //to avoid infinite loop!
+             c3 = c2;
+             c2 = c;
+             s2 = s;
+             g = c * e_[i];
+             h = c * p;
+             r = hypot(p, e_[i]);
+             e_[i + 1] = s * r;
+             s = e_[i] / r;
+             c = p / r;
+             p = c * d_[i] - s * g;
+             d_[i + 1] = h + s * (c * g + s * d_[i]);
+   
+             // Accumulate transformation.
+   
+             for (size_t k = 0; k < n_; k++)
+             {
+               h = V_(k, i + 1);
+               V_(k, i + 1) = s * V_(k, i) + c * h;
+               V_(k, i) = c * V_(k, i) - s * h;
+             }
+           }
+           p = -s * s2 * c3 * el1 * e_[l] / dl1;
+           e_[l] = s * p;
+           d_[l] = c * p;
+   
+           // Check for convergence.
+   
+         } while (NumTools::abs<Real>(e_[l]) > eps * tst1);
+       }
+       d_[l] = d_[l] + f;
+       e_[l] = 0.0;
+     }
+     
+     // Sort eigenvalues and corresponding vectors.
+   
+     for (size_t i = 0; n_ > 0 && i < n_-1; i++)
+     {
+       size_t k = i;
+       Real p = d_[i];
+       for (size_t j = i+1; j < n_; j++)
+       {
+         if (d_[j] < p)
+         {
+           k = j;
+           p = d_[j];
+         }
+       }
+       if (k != i)
+       {
+         d_[k] = d_[i];
+         d_[i] = p;
+         for (size_t j = 0; j < n_; j++)
+         {
+           p = V_(j, i);
+           V_(j,i) = V_(j, k);
+           V_(j,k) = p;
+         }
+       }
+     }
+   }
+
+   /**
+    * @brief Nonsymmetric reduction to Hessenberg form.
+    *
+    * This is derived from the Algol procedures orthes and ortran,
+    * by Martin and Wilkinson, Handbook for Auto. Comp.,
+    * Vol.ii-Linear Algebra, and the corresponding
+    * Fortran subroutines in EISPACK.
+    */
+   void orthes()
+   {
+     if (n_ == 0) return;
+     size_t low = 0;
+     size_t high = n_-1;
+   
+     for (size_t m = low + 1; m <= high - 1; ++m)
+     {
+       // Scale column.
+   
+       Real scale = 0.0;
+       for (size_t i = m; i <= high; ++i)
+       {
+         scale = scale + NumTools::abs<Real>(H_(i, m - 1));
+       }
+       if (scale != 0.0)
+       {
+         // Compute Householder transformation.
+   
+         Real h = 0.0;
+         for (size_t i = high; i >= m; --i)
+         {
+           ort_[i] = H_(i, m - 1)/scale;
+           h += ort_[i] * ort_[i];
+         }
+         Real g = sqrt(h);
+         if (ort_[m] > 0)
+         {
+           g = -g;
+         }
+         h = h - ort_[m] * g;
+         ort_[m] = ort_[m] - g;
+   
+         // Apply Householder similarity transformation
+         // H = (I-u*u'/h)*H*(I-u*u')/h)
+   
+         for (size_t j = m; j < n_; ++j)
+         {
+           Real f = 0.0;
+           for (size_t i = high; i >= m; --i)
+           {
+             f += ort_[i] * H_(i, j);
+           }
+           f = f/h;
+           for (size_t i = m; i <= high; ++i)
+           {
+             H_(i,j) -= f*ort_[i];
+           }
+         }
+   
+         for (size_t i = 0; i <= high; ++i)
+         {
+           Real f = 0.0;
+           for (size_t j = high; j >= m; --j)
+           {
+             f += ort_[j] * H_(i, j);
+           }
+           f = f/h;
+           for (size_t j = m; j <= high; ++j)
+           {
+             H_(i,j) -= f * ort_[j];
+           }
+         }
+         ort_[m] = scale * ort_[m];
+         H_(m, m - 1) = scale * g;
+       }
+     }
+   
+     // Accumulate transformations (Algol's ortran).
+
+     for (size_t i = 0; i < n_; i++)
+     {
+       for (size_t j = 0; j < n_; j++)
+       {
+         V_(i,j) = (i == j ? 1.0 : 0.0);
+       }
+     }
+
+     for (size_t m = high - 1; m >= low + 1; --m)
+     {
+       if (H_(m, m - 1) != 0.0)
+       {
+         for (size_t i = m + 1; i <= high; ++i)
+         {
+           ort_[i] = H_(i, m - 1);
+         }
+         for (size_t j = m; j <= high; ++j)
+         {
+           Real g = 0.0;
+           for (size_t i = m; i <= high; i++)
+           {
+             g += ort_[i] * V_(i, j);
+           }
+           // Double division avoids possible underflow
+           g = (g / ort_[m]) / H_(m, m - 1);
+           for (size_t i = m; i <= high; ++i)
+           {
+             V_(i, j) += g * ort_[i];
+           }
+         }
+       }
+     }
+   }
+
+
+   // Complex scalar division.
+
+   Real cdivr, cdivi;
+   void cdiv(Real xr, Real xi, Real yr, Real yi)
+   {
+     Real r,d;
+     if (NumTools::abs<Real>(yr) > NumTools::abs<Real>(yi))
+     {
+       r = yi/yr;
+       d = yr + r*yi;
+       cdivr = (xr + r*xi)/d;
+       cdivi = (xi - r*xr)/d;
+     }
+     else
+     {
+       r = yr/yi;
+       d = yi + r*yr;
+       cdivr = (r*xr + xi)/d;
+       cdivi = (r*xi - xr)/d;
+     }
+   }
+
+
+   // Nonsymmetric reduction from Hessenberg to real Schur form.
+
+  void hqr2 ()
+  {
+    //  This is derived from the Algol procedure hqr2,
+    //  by Martin and Wilkinson, Handbook for Auto. Comp.,
+    //  Vol.ii-Linear Algebra, and the corresponding
+    //  Fortran subroutine in EISPACK.
+  
+    // Initialize
+   
+    int nn = static_cast<int>(this->n_);
+    int n = nn-1;
+    int low = 0;
+    int high = nn-1;
+    Real eps = pow(2.0,-52.0);
+    Real exshift = 0.0;
+    Real p=0,q=0,r=0,s=0,z=0,t,w,x,y;
+   
+    // Store roots isolated by balanc and compute matrix norm
+   
+    Real norm = 0.0;
+    for (int i = 0; i < nn; i++)
+    {
+      if ((i < low) || (i > high))
+      {
+        d_[TOST(i)] = H_(TOST(i),TOST(i));
+        e_[TOST(i)] = 0.0;
+      }
+      for (int j = std::max(i-1,0); j < nn; j++)
+      {
+        norm = norm + NumTools::abs<Real>(H_(TOST(i),TOST(j)));
+      }
+    }
+   
+    // Outer loop over eigenvalue index
+  
+    int iter = 0;
+    while (n >= low)
+    {
+      // Look for single small sub-diagonal element
+  
+      int l = n;
+      while (l > low)
+      {
+        s = NumTools::abs<Real>(H_(TOST(l-1),TOST(l-1))) + NumTools::abs<Real>(H_(TOST(l),TOST(l)));
+        if (s == 0.0)
+        {
+          s = norm;
+        }
+        if (NumTools::abs<Real>(H_(TOST(l),TOST(l-1))) < eps * s)
+        {
+          break;
+        }
+        l--;
+      }
+      
+      // Check for convergence
+      // One root found
+  
+      if (l == n)
+      {
+        H_(TOST(n),TOST(n)) = H_(TOST(n),TOST(n)) + exshift;
+        d_[TOST(n)] = H_(TOST(n),TOST(n));
+        e_[TOST(n)] = 0.0;
+        n--;
+        iter = 0;
+  
+        // Two roots found
+  
+      }
+      else if (l == n-1)
+      {
+        w = H_(TOST(n),TOST(n-1)) * H_(TOST(n-1),TOST(n));
+        p = (H_(TOST(n-1),TOST(n-1)) - H_(TOST(n),TOST(n))) / 2.0;
+        q = p * p + w;
+        z = sqrt(NumTools::abs<Real>(q));
+        H_(TOST(n),TOST(n)) = H_(TOST(n),TOST(n)) + exshift;
+        H_(TOST(n-1),TOST(n-1)) = H_(TOST(n-1),TOST(n-1)) + exshift;
+        x = H_(TOST(n),TOST(n));
+  
+        // Real pair
+  
+        if (q >= 0)
+        {
+          if (p >= 0)
+          {
+            z = p + z;
+          }
+          else
+          {
+            z = p - z;
+          }
+          d_[TOST(n - 1)] = x + z;
+          d_[TOST(n)] = d_[TOST(n - 1)];
+          if (z != 0.0)
+          {
+            d_[TOST(n)] = x - w / z;
+          }
+          e_[TOST(n - 1)] = 0.0;
+          e_[TOST(n)] = 0.0;
+          x = H_(TOST(n),TOST(n-1));
+          s = NumTools::abs<Real>(x) + NumTools::abs<Real>(z);
+          p = x / s;
+          q = z / s;
+          r = sqrt(p * p+q * q);
+          p = p / r;
+          q = q / r;
+  
+          // Row modification
+  
+          for (int j = n-1; j < nn; j++)
+          {
+            z = H_(TOST(n-1),TOST(j));
+            H_(TOST(n-1),TOST(j)) = q * z + p * H_(TOST(n),TOST(j));
+            H_(TOST(n),TOST(j)) = q * H_(TOST(n),TOST(j)) - p * z;
+          }
+  
+          // Column modification
+  
+          for (int i = 0; i <= n; i++)
+          {
+            z = H_(TOST(i),TOST(n-1));
+            H_(TOST(i),TOST(n-1)) = q * z + p * H_(TOST(i),TOST(n));
+            H_(TOST(i),TOST(n)) = q * H_(TOST(i),TOST(n)) - p * z;
+          }
+  
+          // Accumulate transformations
+  
+          for (int i = low; i <= high; i++)
+          {
+            z = V_(TOST(i),TOST(n-1));
+            V_(TOST(i),TOST(n-1)) = q * z + p * V_(TOST(i),TOST(n));
+            V_(TOST(i),TOST(n)) = q * V_(TOST(i),TOST(n)) - p * z;
+          }
+   
+          // Complex pair
+  
+        }
+        else
+        {
+          d_[TOST(n - 1)] = x + p;
+          d_[TOST(n)] = x + p;
+          e_[TOST(n-1)] = z;
+          e_[TOST(n)] = -z;
+        }
+        n = n - 2;
+        iter = 0;
+  
+        // No convergence yet
+  
+      }
+      else
+      {
+        // Form shift
+  
+        x = H_(TOST(n),TOST(n));
+        y = 0.0;
+        w = 0.0;
+        if (l < n)
+        {
+          y = H_(TOST(n-1),TOST(n-1));
+          w = H_(TOST(n),TOST(n-1)) * H_(TOST(n-1),TOST(n));
+        }
+  
+        // Wilkinson's original ad hoc shift
+  
+        if (iter == 10)
+        {
+          exshift += x;
+          for (int i = low; i <= n; i++)
+          {
+            H_(TOST(i),TOST(i)) -= x;
+          }
+          s = NumTools::abs<Real>(H_(TOST(n),TOST(n-1))) + NumTools::abs<Real>(H_(TOST(n-1),TOST(n-2)));
+          x = y = 0.75 * s;
+          w = -0.4375 * s * s;
+        }
+
+        // MATLAB's new ad hoc shift
+        if (iter == 30)
+        {
+          s = (y - x) / 2.0;
+          s = s * s + w;
+          if (s > 0)
+          {
+            s = sqrt(s);
+            if (y < x)
+            {
+              s = -s;
+            }
+            s = x - w / ((y - x) / 2.0 + s);
+            for (int i = low; i <= n; i++)
+            {
+              H_(TOST(i),TOST(i)) -= s;
+            }
+            exshift += s;
+            x = y = w = 0.964;
+          }
+        }
+  
+        iter = iter + 1;   // (Could check iteration count here.)
+  
+        // Look for two consecutive small sub-diagonal elements
+  
+        int m = n-2;
+        while (m >= l)
+        {
+          z = H_(TOST(m),TOST(m));
+          r = x - z;
+          s = y - z;
+          p = (r * s - w) / H_(TOST(m+1),TOST(m)) + H_(TOST(m),TOST(m+1));
+          q = H_(TOST(m+1),TOST(m+1)) - z - r - s;
+          r = H_(TOST(m+2),TOST(m+1));
+          s = NumTools::abs<Real>(p) + NumTools::abs<Real>(q) + NumTools::abs<Real>(r);
+          p = p / s;
+          q = q / s;
+          r = r / s;
+          if (m == l)
+          {
+            break;
+          }
+          if (NumTools::abs<Real>(H_(TOST(m),TOST(m-1))) * (NumTools::abs<Real>(q) + NumTools::abs<Real>(r)) <
+               eps * (NumTools::abs<Real>(p) * (NumTools::abs<Real>(H_(TOST(m-1),TOST(m-1))) + NumTools::abs<Real>(z) +
+               NumTools::abs<Real>(H_(TOST(m+1),TOST(m+1))))))
+          {
+            break;
+          }
+          m--;
+        }
+  
+        for (int i = m+2; i <= n; i++)
+        {
+          H_(TOST(i),TOST(i-2)) = 0.0;
+          if (i > m+2)
+          {
+            H_(TOST(i),TOST(i-3)) = 0.0;
+          }
+        }
+ 
+        // Double QR step involving rows l:n and columns m:n
+   
+        for (int k = m; k <= n-1; k++)
+        {
+          int notlast = (k != n-1);
+          if (k != m)
+          {
+            p = H_(TOST(k),TOST(k-1));
+            q = H_(TOST(k+1),TOST(k-1));
+            r = (notlast ? H_(TOST(k+2),TOST(k-1)) : 0.0);
+            x = NumTools::abs<Real>(p) + NumTools::abs<Real>(q) + NumTools::abs<Real>(r);
+            if (x != 0.0)
+            {
+              p = p / x;
+              q = q / x;
+              r = r / x;
+            }
+          }
+          if (x == 0.0)
+          {
+            break;
+          }
+          s = sqrt(p * p + q * q + r * r);
+          if (p < 0)
+          {
+            s = -s;
+          }
+          if (s != 0)
+          {
+            if (k != m)
+            {
+              H_(TOST(k),TOST(k-1)) = -s * x;
+            }
+            else if (l != m)
+            {
+              H_(TOST(k),TOST(k-1)) = -H_(TOST(k),TOST(k-1));
+            }
+            p = p + s;
+            x = p / s;
+            y = q / s;
+            z = r / s;
+            q = q / p;
+            r = r / p;
+   
+            // Row modification
+   
+            for (int j = k; j < nn; j++)
+            {
+              p = H_(TOST(k),TOST(j)) + q * H_(TOST(k+1),TOST(j));
+              if (notlast)
+              {
+                p = p + r * H_(TOST(k+2),TOST(j));
+                H_(TOST(k+2),TOST(j)) = H_(TOST(k+2),TOST(j)) - p * z;
+              }
+              H_(TOST(k),TOST(j)) = H_(TOST(k),TOST(j)) - p * x;
+              H_(TOST(k+1),TOST(j)) = H_(TOST(k+1),TOST(j)) - p * y;
+            }
+   
+            // Column modification
+   
+            for (int i = 0; i <= std::min(n,k+3); i++)
+            {
+              p = x * H_(TOST(i),TOST(k)) + y * H_(TOST(i),TOST(k+1));
+              if (notlast)
+              {
+                p = p + z * H_(TOST(i),TOST(k+2));
+                H_(TOST(i),TOST(k+2)) = H_(TOST(i),TOST(k+2)) - p * r;
+              }
+              H_(TOST(i),TOST(k)) = H_(TOST(i),TOST(k)) - p;
+              H_(TOST(i),TOST(k+1)) = H_(TOST(i),TOST(k+1)) - p * q;
+            }
+   
+            // Accumulate transformations
+   
+            for (int i = low; i <= high; i++)
+            {
+              p = x * V_(TOST(i),TOST(k)) + y * V_(TOST(i),TOST(k+1));
+              if (notlast)
+              {
+                p = p + z * V_(TOST(i),TOST(k+2));
+                V_(TOST(i),TOST(k+2)) = V_(TOST(i),TOST(k+2)) - p * r;
+              }
+              V_(TOST(i),TOST(k)) = V_(TOST(i),TOST(k)) - p;
+              V_(TOST(i),TOST(k+1)) = V_(TOST(i),TOST(k+1)) - p * q;
+            }
+          }  // (s != 0)
+        }  // k loop
+      }  // check convergence
+    }  // while (n >= low)
+      
+    // Backsubstitute to find vectors of upper triangular form
+
+    if (norm == 0.0)
+    {
+       return;
+    }
+   
+    for (n = nn-1; n >= 0; n--)
+    {
+      p = d_[TOST(n)];
+      q = e_[TOST(n)];
+   
+      // Real vector
+   
+      if (q == 0)
+      {
+        int l = n;
+        H_(TOST(n),TOST(n)) = 1.0;
+        for (int i = n-1; i >= 0; i--)
+        {
+          w = H_(TOST(i),TOST(i)) - p;
+          r = 0.0;
+          for (int j = l; j <= n; j++)
+          {
+            r = r + H_(TOST(i),TOST(j)) * H_(TOST(j),TOST(n));
+          }
+          if (e_[TOST(i)] < 0.0)
+          {
+            z = w;
+            s = r;
+          }
+          else
+          {
+            l = i;
+            if (e_[TOST(i)] == 0.0)
+            {
+              if (w != 0.0)
+              {
+                H_(TOST(i),TOST(n)) = -r / w;
+              }
+              else
+              {
+                H_(TOST(i),TOST(n)) = -r / (eps * norm);
+              }
+   
+              // Solve real equations
+   
+            }
+            else
+            {
+              x = H_(TOST(i),TOST(i+1));
+              y = H_(TOST(i+1),TOST(i));
+              q = (d_[TOST(i)] - p) * (d_[TOST(i)] - p) + e_[TOST(i)] * e_[TOST(i)];
+              t = (x * s - z * r) / q;
+              H_(TOST(i),TOST(n)) = t;
+              if (NumTools::abs<Real>(x) > NumTools::abs<Real>(z))
+              {
+                H_(TOST(i+1),TOST(n)) = (-r - w * t) / x;
+              }
+              else
+              {
+                H_(TOST(i+1),TOST(n)) = (-s - y * t) / z;
+              }
+            }
+   
+            // Overflow control
+   
+            t = NumTools::abs<Real>(H_(TOST(i),TOST(n)));
+            if ((eps * t) * t > 1)
+            {
+              for (int j = i; j <= n; j++)
+              {
+                H_(TOST(j),TOST(n)) = H_(TOST(j),TOST(n)) / t;
+              }
+            }
+          }
+        }
+   
+        // Complex vector
+   
+      }
+      else if (q < 0)
+      {
+        int l = n-1;
+
+        // Last vector component imaginary so matrix is triangular
+   
+        if (NumTools::abs<Real>(H_(TOST(n),TOST(n-1))) > NumTools::abs<Real>(H_(TOST(n-1),TOST(n))))
+        {
+          H_(TOST(n-1),TOST(n-1)) = q / H_(TOST(n),TOST(n-1));
+          H_(TOST(n-1),TOST(n)) = -(H_(TOST(n),TOST(n)) - p) / H_(TOST(n),TOST(n-1));
+        }
+        else
+        {
+          cdiv(0.0,-H_(TOST(n-1),TOST(n)),H_(TOST(n-1),TOST(n-1))-p,q);
+          H_(TOST(n-1),TOST(n-1)) = cdivr;
+          H_(TOST(n-1),TOST(n)) = cdivi;
+        }
+        H_(TOST(n),TOST(n-1)) = 0.0;
+        H_(TOST(n),TOST(n)) = 1.0;
+        for (int i = n-2; i >= 0; i--)
+        {
+          Real ra,sa,vr,vi;
+          ra = 0.0;
+          sa = 0.0;
+          for (int j = l; j <= n; j++)
+          {
+            ra = ra + H_(TOST(i),TOST(j)) * H_(TOST(j),TOST(n-1));
+            sa = sa + H_(TOST(i),TOST(j)) * H_(TOST(j),TOST(n));
+          }
+          w = H_(TOST(i),TOST(i)) - p;
+   
+          if (e_[TOST(i)] < 0.0)
+          {
+            z = w;
+            r = ra;
+            s = sa;
+          }
+          else
+          {
+            l = i;
+            if (e_[TOST(i)] == 0)
+            {
+              cdiv(-ra,-sa,w,q);
+              H_(TOST(i),TOST(n-1)) = cdivr;
+              H_(TOST(i),TOST(n)) = cdivi;
+            }
+            else
+            {
+              // Solve complex equations
+ 
+              x = H_(TOST(i),TOST(i+1));
+              y = H_(TOST(i+1),TOST(i));
+              vr = (d_[TOST(i)] - p) * (d_[TOST(i)] - p) + e_[TOST(i)] * e_[TOST(i)] - q * q;
+              vi = (d_[TOST(i)] - p) * 2.0 * q;
+              if ((vr == 0.0) && (vi == 0.0))
+              {
+                vr = eps * norm * (NumTools::abs<Real>(w) + NumTools::abs<Real>(q) +
+                NumTools::abs<Real>(x) + NumTools::abs<Real>(y) + NumTools::abs<Real>(z));
+              }
+              cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi);
+              H_(TOST(i),TOST(n-1)) = cdivr;
+              H_(TOST(i),TOST(n)) = cdivi;
+              if (NumTools::abs<Real>(x) > (NumTools::abs<Real>(z) + NumTools::abs<Real>(q)))
+              {
+                H_(TOST(i+1),TOST(n-1)) = (-ra - w * H_(TOST(i),TOST(n-1)) + q * H_(TOST(i),TOST(n))) / x;
+                H_(TOST(i+1),TOST(n)) = (-sa - w * H_(TOST(i),TOST(n)) - q * H_(TOST(i),TOST(n-1))) / x;
+              }
+              else
+              {
+                cdiv(-r-y*H_(TOST(i),TOST(n-1)),-s-y*H_(TOST(i),TOST(n)),z,q);
+                H_(TOST(i+1),TOST(n-1)) = cdivr;
+                H_(TOST(i+1),TOST(n)) = cdivi;
+              }
+            }
+ 
+            // Overflow control
+            t = std::max(NumTools::abs<Real>(H_(TOST(i),TOST(n-1))),NumTools::abs<Real>(H_(TOST(i),TOST(n))));
+            if ((eps * t) * t > 1)
+            {
+              for (int j = i; j <= n; j++)
+              {
+                H_(TOST(j),TOST(n-1)) = H_(TOST(j),TOST(n-1)) / t;
+                H_(TOST(j),TOST(n)) = H_(TOST(j),TOST(n)) / t;
+              }
+            }
+          }
+        }
+      }
+    }
+   
+    // Vectors of isolated roots
+   
+    for (int i = 0; i < nn; i++)
+    {
+      if (i < low || i > high)
+      {
+        for (int j = i; j < nn; j++)
+        {
+          V_(TOST(i),TOST(j)) = H_(TOST(i),TOST(j));
+        }
+      }
+    }
+   
+    // Back transformation to get eigenvectors of original matrix
+   
+    for (int j = nn-1; j >= low; j--)
+    {
+      for (int i = low; i <= high; i++)
+      {
+        z = 0.0;
+        for (int k = low; k <= std::min(j,high); k++)
+        {
+          z = z + V_(TOST(i),TOST(k)) * H_(TOST(k),TOST(j));
+        }
+        V_(TOST(i),TOST(j)) = z;
+      }
+    }
+  }
+
+  public:
+
+   bool isSymmetric() const { return issymmetric_; }
+
+
+    /**
+     * @brief Check for symmetry, then construct the eigenvalue decomposition
+     *
+     * @param A    Square real (non-complex) matrix
+     */
+    EigenValue(const Matrix<Real>& A) :
+      n_(A.getNumberOfColumns()),
+      issymmetric_(true),
+      d_(n_),
+      e_(n_),
+      V_(n_,n_),
+      H_(),
+      D_(n_, n_),
+      ort_(),
+      cdivr(), cdivi()
+    {
+      if (n_ > INT_MAX)
+        throw Exception("EigenValue: can only be computed for matrices <= " + TextTools::toString(INT_MAX));
+      for (size_t j = 0; (j < n_) && issymmetric_; j++)
+      {
+        for (size_t i = 0; (i < n_) && issymmetric_; i++)
+        {
+          issymmetric_ = (A(i,j) == A(j,i));
+        }
+      }
+
+      if (issymmetric_)
+      {
+        for (size_t i = 0; i < n_; i++)
+        {
+          for (size_t j = 0; j < n_; j++)
+          {
+            V_(i,j) = A(i,j);
+          }
+        }
+   
+        // Tridiagonalize.
+        tred2();
+   
+        // Diagonalize.
+        tql2();
+      }
+      else
+      {
+        H_.resize(n_,n_);
+        ort_.resize(n_);
+         
+        for (size_t j = 0; j < n_; j++)
+        {
+          for (size_t i = 0; i < n_; i++)
+          {
+            H_(i,j) = A(i,j);
+          }
+        }
+   
+        // Reduce to Hessenberg form.
+        orthes();
+   
+        // Reduce Hessenberg to real Schur form.
+        hqr2();
+      }
+    }
+
+
+    /**
+     * @brief Return the eigenvector matrix
+     *
+     * @return V
+     */
+    const RowMatrix<Real>& getV() const { return V_; }
+
+    /**
+     * @brief Return the real parts of the eigenvalues
+     *
+     * @return real(diag(D))
+     */
+    const std::vector<Real>& getRealEigenValues() const { return d_; }
+
+    /**
+     * @brief Return the imaginary parts of the eigenvalues in parameter e.
+     *
+     * @return e: new matrix with imaginary parts of the eigenvalues.
+     */
+    const std::vector<Real>& getImagEigenValues() const { return e_; }
+   
+    /**
+     * @brief Computes the block diagonal eigenvalue matrix.
+     * 
+     * If the original matrix A is not symmetric, then the eigenvalue 
+     * matrix D is block diagonal with the real eigenvalues in 1-by-1 
+     * blocks and any complex eigenvalues,
+     * a + i*b, in 2-by-2 blocks, [a, b; -b, a].  That is, if the complex
+     * eigenvalues look like
+     * <pre>
+     *
+     *       u + iv     .        .          .      .    .
+     *         .      u - iv     .          .      .    .
+     *         .        .      a + ib       .      .    .
+     *         .        .        .        a - ib   .    .
+     *         .        .        .          .      x    .
+     *         .        .        .          .      .    y
+     * </pre>
+     *     then D looks like
+     * <pre>
+     *
+     *         u        v        .          .      .    .
+     *        -v        u        .          .      .    . 
+     *         .        .        a          b      .    .
+     *         .        .       -b          a      .    .
+     *         .        .        .          .      x    .
+     *         .        .        .          .      .    y
+     * </pre>
+     * This keeps V a real matrix in both symmetric and non-symmetric
+     * cases, and A*V = V*D.
+     *
+     * @return D: upon return, the matrix is filled with the block diagonal 
+     * eigenvalue matrix.
+     */
+    const RowMatrix<Real>& getD() const
+    {
+      for (size_t i = 0; i < n_; i++)
+      {
+        for (size_t j = 0; j < n_; j++)
+        {
+          D_(i,j) = 0.0;
+        }
+        D_(i,i) = d_[i];
+        if (e_[i] > 0)
+        {
+          D_(i,i+1) = e_[i];
+        }
+        else if (e_[i] < 0)
+        {
+          D_(i,i-1) = e_[i];
+        }
+      }
+      return D_;
+    }
+};
+
+} //end of namespace bpp.
+
+#endif //_EIGENVALUE_H_
+
diff --git a/src/Bpp/Numeric/Matrix/LUDecomposition.h b/src/Bpp/Numeric/Matrix/LUDecomposition.h
new file mode 100644
index 0000000..dc3b8cc
--- /dev/null
+++ b/src/Bpp/Numeric/Matrix/LUDecomposition.h
@@ -0,0 +1,465 @@
+//
+// File: LU.h
+// Created by: Julien Dutheil
+// Created on: Tue Apr 7 16:24 2004
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _LU_H_
+#define _LU_H_
+
+#include "Matrix.h"
+#include "../NumTools.h"
+#include "../../Exceptions.h"
+
+// From the STL:
+#include <algorithm>
+#include <vector>
+// for min(), max() below
+
+namespace bpp
+{
+/**
+ * @brief LU Decomposition.
+ *
+ * [This class and its documentation is adpated from the C++ port of the JAMA library.]
+ *
+ * For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n
+ * unit lower triangular matrix L, an n-by-n upper triangular matrix U,
+ * and a permutation vector piv of length m so that A(piv,:) = L*U.
+ * If m < n, then L is m-by-m and U is m-by-n.
+ *
+ * The LU decompostion with pivoting always exists, even if the matrix is
+ * singular, so the constructor will never fail.  The primary use of the
+ * LU decomposition is in the solution of square systems of simultaneous
+ * linear equations. This will fail if isNonsingular() returns false.
+ */
+template<class Real>
+class LUDecomposition
+{
+private:
+  /* Array for internal storage of decomposition.  */
+  RowMatrix<Real> LU;
+  RowMatrix<Real> L_;
+  RowMatrix<Real> U_;
+  size_t m, n;
+  int pivsign;
+  std::vector<size_t> piv;
+
+private:
+  static void permuteCopy(const Matrix<Real>& A, const std::vector<size_t>& piv, size_t j0, size_t j1, Matrix<Real>& X)
+  {
+    size_t piv_length = piv.size();
+
+    X.resize(piv_length, j1 - j0 + 1);
+
+    for (size_t i = 0; i < piv_length; i++)
+    {
+      for (size_t j = j0; j <= j1; j++)
+      {
+        X(i, j - j0) = A(piv[i], j);
+      }
+    }
+  }
+
+  static void permuteCopy(const std::vector<Real>& A, const std::vector<size_t>& piv, std::vector<Real>& X)
+  {
+    size_t piv_length = piv.size();
+    if (piv_length != A.size())
+      X.clean();
+
+    X.resize(piv_length);
+
+    for (size_t i = 0; i < piv_length; i++)
+    {
+      X[i] = A[piv[i]];
+    }
+  }
+
+public:
+  /**
+   * @brief LU Decomposition
+   *
+   * @param  A   Rectangular matrix
+   * @return LU Decomposition object to access L, U and piv.
+   */
+
+  // This is the constructor in JAMA C++ port. However, it seems to have some bug...
+  // We use the original JAMA's 'experimental' port, which gives good results instead.
+  /*	  LUDecomposition (const Matrix<Real> &A) : LU(A), m(A.getNumberOfRows()), n(A.getNumberOfColumns()), piv(A.getNumberOfRows())
+        {
+
+        // Use a "left-looking", dot-product, Crout/Doolittle algorithm.
+
+
+        for (size_t i = 0; i < m; i++) {
+        piv[i] = i;
+        }
+        pivsign = 1;
+        //Real *LUrowi = 0;;
+        vector<Real> LUrowi;
+        vector<Real> LUcolj;
+
+        // Outer loop.
+
+        for (size_t j = 0; j < n; j++) {
+
+        // Make a copy of the j-th column to localize references.
+
+        LUcolj = LU.col(j);
+        //for (size_t i = 0; i < m; i++) {
+      //  LUcolj[i] = LU(i,j);
+      //}
+
+      // Apply previous transformations.
+
+      for (size_t i = 0; i < m; i++) {
+        //LUrowi = LU[i];
+        LUrowi = LU.row(i);
+
+        // Most of the time is spent in the following dot product.
+
+        size_t kmax = NumTools::min<size_t>(i,j);
+        double s = 0.0;
+        for (size_t k = 0; k < kmax; k++) {
+        s += LUrowi[k] * LUcolj[k];
+        }
+
+        LUrowi[j] = LUcolj[i] -= s;
+        }
+
+        // Find pivot and exchange if necessary.
+
+        size_t p = j;
+        for (size_t i = j+1; i < m; i++) {
+        if (NumTools::abs<Real>(LUcolj[i]) > NumTools::abs<Real>(LUcolj[p])) {
+        p = i;
+        }
+        }
+        if (p != j) {
+        size_t k=0;
+        for (k = 0; k < n; k++) {
+        double t = LU(p,k);
+        LU(p,k) = LU(j,k);
+        LU(j,k) = t;
+        }
+        k = piv[p];
+        piv[p] = piv[j];
+        piv[j] = k;
+        pivsign = -pivsign;
+        }
+
+        // Compute multipliers.
+
+        if ((j < m) && (LU(j,j) != 0.0)) {
+        for (size_t i = j+1; i < m; i++) {
+        LU(i,j) /= LU(j,j);
+        }
+        }
+        }
+        }
+   */
+
+  LUDecomposition (const Matrix<Real>& A) :
+    LU(A),
+    L_(A.getNumberOfRows(), A.getNumberOfColumns()),
+    U_(A.getNumberOfColumns(), A.getNumberOfColumns()),
+    m(A.getNumberOfRows()),
+    n(A.getNumberOfColumns()),
+    pivsign(1),
+    piv(A.getNumberOfRows())
+  {
+    for (size_t i = 0; i < m; i++)
+    {
+      piv[i] = i;
+    }
+    // Main loop.
+    for (size_t k = 0; k < n; k++)
+    {
+      // Find pivot.
+      size_t p = k;
+      for (size_t i = k + 1; i < m; i++)
+      {
+        if (NumTools::abs<Real>(LU(i, k)) > NumTools::abs<Real>(LU(p, k)))
+        {
+          p = i;
+        }
+      }
+      // Exchange if necessary.
+      if (p != k)
+      {
+        for (size_t j = 0; j < n; j++)
+        {
+          double t = LU(p, j); LU(p, j) = LU(k, j); LU(k, j) = t;
+        }
+        size_t t = piv[p]; piv[p] = piv[k]; piv[k] = t;
+        pivsign = -pivsign;
+      }
+      // Compute multipliers and eliminate k-th column.
+      if (LU(k, k) != 0.0)
+      {
+        for (size_t i = k + 1; i < m; i++)
+        {
+          LU(i, k) /= LU(k, k);
+          for (size_t j = k + 1; j < n; j++)
+          {
+            LU(i, j) -= LU(i, k) * LU(k, j);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * @brief Return lower triangular factor
+   *
+   * @return L
+   */
+  const RowMatrix<Real>& getL()
+  {
+    for (size_t i = 0; i < m; i++)
+    {
+      for (size_t j = 0; j < n; j++)
+      {
+        if (i > j)
+        {
+          L_(i, j) = LU(i, j);
+        }
+        else if (i == j)
+        {
+          L_(i, j) = 1.0;
+        }
+        else
+        {
+          L_(i, j) = 0.0;
+        }
+      }
+    }
+    return L_;
+  }
+
+  /**
+   * @brief Return upper triangular factor
+   *
+   * @return U portion of LU factorization.
+   */
+  const RowMatrix<Real>& getU ()
+  {
+    for (size_t i = 0; i < n; i++)
+    {
+      for (size_t j = 0; j < n; j++)
+      {
+        if (i <= j)
+        {
+          U_(i, j) = LU(i, j);
+        }
+        else
+        {
+          U_(i, j) = 0.0;
+        }
+      }
+    }
+    return U_;
+  }
+
+  /**
+   * @brief Return pivot permutation vector
+   *
+   * @return piv
+   */
+  std::vector<size_t> getPivot () const
+  {
+    return piv;
+  }
+
+
+  /**
+   * @brief Compute determinant using LU factors.
+   *
+   * @return determinant of A, or 0 if A is not square.
+   */
+  Real det() const
+  {
+    if (m != n)
+    {
+      return Real(0);
+    }
+    Real d = Real(pivsign);
+    for (size_t j = 0; j < n; j++)
+    {
+      d *= LU(j, j);
+    }
+    return d;
+  }
+
+  /**
+   * @brief Solve A*X = B
+   *
+   * @param  B [in]  A Matrix with as many rows as A and any number of columns.
+   * @param  X [out]  A RowMatrix that will be changed such that L*U*X = B(piv,:).
+   * @return  the lowest diagonal term (in absolute value), for further checkings
+   *             of non-singularity of LU.
+   *
+   * If B is nonconformant or LU is singular, an Exception is raised.
+   *
+   */
+  Real solve (const Matrix<Real>& B, Matrix<Real>& X) const throw (BadIntegerException, ZeroDivisionException)
+  {
+    /* Dimensions: A is mxn, X is nxk, B is mxk */
+
+    if (B.getNumberOfRows() != m)
+    {
+      throw BadIntegerException("Wrong dimension in LU::solve", static_cast<int>(B.getNumberOfRows()));
+    }
+
+    Real minD = NumTools::abs<Real>(LU(0, 0));
+    for (size_t i = 1; i < m; i++)
+    {
+      Real currentValue = NumTools::abs<Real>(LU(i, i));
+      if (currentValue < minD)
+        minD = currentValue;
+    }
+
+    if (minD < NumConstants::SMALL())
+    {
+      throw ZeroDivisionException("Singular matrix in LU::solve.");
+    }
+
+    // Copy right hand side with pivoting
+    size_t nx = B.getNumberOfColumns();
+
+    permuteCopy(B, piv, 0, nx - 1, X);
+
+    // Solve L*Y = B(piv,:)
+    for (size_t k = 0; k < n; k++)
+    {
+      for (size_t i = k + 1; i < n; i++)
+      {
+        for (size_t j = 0; j < nx; j++)
+        {
+          X(i, j) -= X(k, j) * LU(i, k);
+        }
+      }
+    }
+    // Solve U*X = Y;
+    // !!! Do not use unsigned int with -- loop!!!
+    // for (int k = n-1; k >= 0; k--) {
+    size_t k = n;
+
+    do
+    {
+      k--;
+      for (size_t j = 0; j < nx; j++)
+      {
+        X(k, j) /= LU(k, k);
+      }
+      for (size_t i = 0; i < k; i++)
+      {
+        for (size_t j = 0; j < nx; j++)
+        {
+          X(i, j) -= X(k, j) * LU(i, k);
+        }
+      }
+    }
+    while (k > 0);
+
+    return minD;
+  }
+
+
+  /**
+   * @brief Solve A*x = b, where x and b are vectors of length equal	to the number of rows in A.
+   *
+   * @param  b [in] a vector (Array1D> of length equal to the first dimension	of A.
+   * @param  x [out] a vector that will be changed so that so that L*U*x = b(piv).
+   * @return  the lowest diagonal term (in absolute value), for further checkings
+   *             of non-singularity of LU.
+   *
+   * If B is nonconformant or LU is singular, an Exception is raised.
+   */
+  Real solve (const std::vector<Real>& b, std::vector<Real>& x)  const throw (BadIntegerException, ZeroDivisionException)
+  {
+    /* Dimensions: A is mxn, X is nxk, B is mxk */
+
+    if (b.dim1() != m)
+    {
+      throw BadIntegerException("Wrong dimension in LU::solve", b.dim1());
+    }
+
+    Real minD = NumTools::abs<Real>(LU(0, 0));
+    for (size_t i = 1; i < m; i++)
+    {
+      Real currentValue = NumTools::abs<Real>(LU(i, i));
+      if (currentValue < minD)
+        minD = currentValue;
+    }
+
+    if (minD < NumConstants::SMALL())
+    {
+      throw ZeroDivisionException("Singular matrix in LU::solve.");
+    }
+
+    permuteCopy(b, piv, x);
+
+    // Solve L*Y = B(piv)
+    for (size_t k = 0; k < n; k++)
+    {
+      for (size_t i = k + 1; i < n; i++)
+      {
+        x[i] -= x[k] * LU(i, k);
+      }
+    }
+
+    // Solve U*X = Y;
+    // for (size_t k = n-1; k >= 0; k--) {
+    size_t k = n;
+    do
+    {
+      k--;
+      x[k] /= LU(k, k);
+      for (size_t i = 0; i < k; i++)
+      {
+        x[i] -= x[k] * LU(i, k);
+      }
+    }
+    while (k > 0);
+
+    return minD;
+  }
+}; /* class LU */
+} // end of namespace bpp.
+
+#endif // _LU_H_
+
diff --git a/src/Bpp/Numeric/Matrix/Matrix.h b/src/Bpp/Numeric/Matrix/Matrix.h
new file mode 100644
index 0000000..72393c6
--- /dev/null
+++ b/src/Bpp/Numeric/Matrix/Matrix.h
@@ -0,0 +1,547 @@
+//
+// File: Matrix.h
+// Authors: Julien Dutheil
+//          Sylvain Gaillard
+// Created on: Tue Apr 07 11:58 2004
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+#ifndef _MATRIX_H_
+#define _MATRIX_H_
+
+#include <vector>
+#include "../../Clonable.h"
+#include "../NumConstants.h"
+#include "../NumTools.h"
+#include "../VectorExceptions.h"
+#include <iostream>
+
+namespace bpp
+{
+/**
+ * @brief The matrix template interface.
+ */
+template<class Scalar>
+class Matrix :
+  public Clonable
+{
+public:
+  Matrix() {}
+  virtual ~Matrix() {}
+
+public:
+
+  /**
+   * @return \f$m_{i,j}\f$.
+   * @param i row index.
+   * @param j column index.
+   */
+  virtual const Scalar& operator()(size_t i, size_t j) const = 0;
+  
+  /**
+   * @return \f$m_{i,j}\f$.
+   * @param i row index.
+   * @param j column index.
+   */
+  virtual Scalar& operator()(size_t i, size_t j) = 0;
+
+  virtual bool equals(const Matrix& m, double threshold = NumConstants::TINY())
+  {
+    if (m.getNumberOfRows() != getNumberOfRows() || m.getNumberOfColumns() != getNumberOfColumns())
+      return false;
+    for (size_t i = 0; i < getNumberOfRows(); i++)
+    {
+      for (size_t j = 0; j < getNumberOfColumns(); j++)
+      {
+        if (NumTools::abs<double>(static_cast<double>(operator()(i, j)) - static_cast<double>(m(i, j))) > threshold) return false;
+      }
+    }
+    return true;
+  }
+  /**
+   * @return The number of rows.
+   */
+  virtual size_t getNumberOfRows() const = 0;
+  /**
+   * @return The number of columns.
+   */
+  virtual size_t getNumberOfColumns() const = 0;
+  /**
+   * @return the row at position i as a vector.
+   * @param i The index of the row.
+   */
+  virtual std::vector<Scalar> row(size_t i) const = 0;
+  /**
+   * @return the column at position j as a vector.
+   * @param j The index of the column.
+   */
+  virtual std::vector<Scalar> col(size_t j) const = 0;
+  /**
+   * @brief Resize the matrix.
+   *
+   * @param nRows The new number of rows.
+   * @param nCols The new number of columns.
+   */
+  virtual void resize(size_t nRows, size_t nCols) = 0;
+};
+
+
+/**
+ * @brief Matrix storage by row.
+ *
+ * This matrix is a vector of vector of Scalar.
+ * Row access is in \f$O(1)\f$ while column access is in \f$O(nRow)\f$.
+ */
+template<class Scalar>
+class RowMatrix :
+  public Matrix<Scalar>
+{
+protected:
+  std::vector< std::vector<Scalar> > m_;
+
+public:
+  RowMatrix() : m_() {}
+
+  RowMatrix(size_t nRow, size_t nCol) : m_(nRow)
+  {
+    for (size_t i = 0; i < nRow; i++)
+    {
+      m_[i].resize(nCol);
+    }
+  }
+
+  RowMatrix(const Matrix<Scalar>& m) : m_(m.getNumberOfRows())
+  {
+    size_t nr = m.getNumberOfRows();
+    size_t nc = m.getNumberOfColumns();
+    for (size_t i = 0; i < nr; i++)
+    {
+      m_[i].resize(nc);
+      for (size_t j = 0; j < nc; j++)
+      {
+        m_[i][j] = m(i, j);
+      }
+    }
+  }
+
+  RowMatrix& operator=(const Matrix<Scalar>& m)
+  {
+    size_t nr = m.getNumberOfRows();
+    m_.resize(nr);
+    size_t nc = m.getNumberOfColumns();
+    for (size_t i = 0; i < nr; i++)
+    {
+      m_[i].resize(nc);
+      for (size_t j = 0; j < nc; j++)
+      {
+        m_[i][j] = m(i, j);
+      }
+    }
+    return *this;
+  }
+
+//  virtual ~RowMatrix() {}
+
+public:
+  RowMatrix* clone() const { return new RowMatrix(*this); }
+
+  const Scalar& operator()(size_t i, size_t j) const { return m_[i][j]; }
+
+  Scalar& operator()(size_t i, size_t j) { return m_[i][j]; }
+
+  size_t getNumberOfRows() const { return m_.size(); }
+
+  size_t getNumberOfColumns() const { return m_.size() == 0 ? 0 : m_[0].size(); }
+
+  std::vector<Scalar> row(size_t i) const
+  {
+    std::vector<Scalar> r(getNumberOfColumns());
+    for (size_t j = 0; j < getNumberOfColumns(); j++) { r[j] = operator()(i, j); }
+    return r;
+  }
+
+  const std::vector<Scalar>& getRow(size_t i) const
+  {
+    return m_[i];
+  }
+
+  std::vector<Scalar>& getRow(size_t i) 
+  {
+    return m_[i];
+  }
+
+  std::vector<Scalar> col(size_t j) const
+  {
+    std::vector<Scalar> c(getNumberOfRows());
+    for (size_t i = 0; i < getNumberOfRows(); i++) { c[i] = operator()(i, j); }
+    return c;
+  }
+
+  void resize(size_t nRows, size_t nCols)
+  {
+    m_.resize(nRows);
+    for (size_t i = 0; i < nRows; i++)
+    {
+      m_[i].resize(nCols);
+    }
+  }
+
+  void addRow(const std::vector<Scalar>& newRow) throw (DimensionException)
+  {
+    if (getNumberOfColumns()!=0 && newRow.size() != getNumberOfColumns())
+      throw DimensionException("RowMatrix::addRow: invalid row dimension", newRow.size(), getNumberOfColumns());
+    m_.push_back(newRow);
+  }
+};
+
+/**
+ * @brief Matrix storage by column.
+ *
+ * This matrix is a vector of vector of Scalar.
+ * Column access is in \f$O(1)\f$ while row access is in \f$O(nCol)\f$.
+ */
+  template<class Scalar>
+  class ColMatrix :
+    public Matrix<Scalar>
+  {
+  private:
+    std::vector< std::vector<Scalar> > m_;
+
+  public:
+    ColMatrix() : m_() {}
+
+    ColMatrix(size_t nRow, size_t nCol) : m_(nCol)
+    {
+      for (size_t i = 0; i < nCol; i++)
+      {
+        m_[i].resize(nRow);
+      }
+    }
+
+    ColMatrix(const Matrix<Scalar>& m) : m_(m.getNumberOfColumns())
+    {
+      size_t nr = m.getNumberOfRows();
+      size_t nc = m.getNumberOfColumns();
+      for (size_t i = 0; i < nc; i++)
+      {
+        m_[i].resize(nr);
+        for (size_t j = 0; j < nr; j++)
+        {
+          m_[i][j] = m(j, i);
+        }
+      }
+    }
+
+    ColMatrix& operator=(const Matrix<Scalar>& m)
+    {
+      size_t nc = m.getNumberOfColumns();
+      m_.resize(nc);
+      size_t nr = m.getNumberOfRows();
+      for (size_t i = 0; i < nc; i++)
+      {
+        m_[i].resize(nr);
+        for (size_t j = 0; j < nr; j++)
+        {
+          m_[i][j] = m(j, i);
+        }
+      }
+      return *this;
+    }
+
+    virtual ~ColMatrix() {}
+
+  public:
+    ColMatrix* clone() const { return new ColMatrix(*this); }
+
+    const Scalar& operator()(size_t i, size_t j) const { return m_[j][i]; }
+
+    Scalar& operator()(size_t i, size_t j) { return m_[j][i]; }
+
+    size_t getNumberOfColumns() const { return m_.size(); }
+
+    size_t getNumberOfRows() const { return m_.size() == 0 ? 0 : m_[0].size(); }
+
+    std::vector<Scalar> row(size_t i) const
+    {
+      std::vector<Scalar> r(getNumberOfColumns());
+      for (size_t j = 0; j < getNumberOfColumns(); j++) { r[j] = operator()(i, j); }
+      return r;
+    }
+
+    const std::vector<Scalar>& getCol(size_t i) const
+    {
+      return m_[i];
+    }
+
+    std::vector<Scalar> col(size_t j) const
+    {
+      std::vector<Scalar> c(getNumberOfRows());
+      for (size_t i = 0; i < getNumberOfRows(); i++) { c[i] = operator()(i, j); }
+      return c;
+    }
+
+    void resize(size_t nRows, size_t nCols)
+    {
+      m_.resize(nCols);
+      for (size_t i = 0; i < nCols; i++)
+      {
+        m_[i].resize(nRows);
+      }
+    }
+
+    void addCol(const std::vector<Scalar>& newCol) throw (DimensionException)
+    {
+      if (getNumberOfRows()!=0 && newCol.size() != getNumberOfRows())
+        throw DimensionException("ColMatrix::addCol: invalid column dimension", newCol.size(), getNumberOfRows());
+      m_.push_back(newCol);
+    }
+  };
+
+/**
+ * @brief Matrix storage in one vector.
+ *
+ * This Matrix is a simple vector of Scalar of size n x m.
+ * Element access is in \f$O(1)\f$ but resizing the matrix while keeping the
+ * old values is in \f$O(nm)\f$.
+ *
+ * Basic usage:
+ * @code
+ * LinearMatrix<int> m(3, 2); // Create a 3x2 matrix of int
+ * m(1, 2) = 5; // Set the value of element at row = 1, col = 2 to 5
+ * int x = m(0, 1); // Get the value of element at row = 0, col = 1;
+ * @endcode
+ *
+ * @author Sylvain Gaillard
+ */
+template<class Scalar>
+class LinearMatrix :
+  public Matrix<Scalar>
+{
+private:
+  std::vector<Scalar> m_;
+  size_t rows_;
+  size_t cols_;
+
+public:
+  /**
+   * @brief Build a 0 x 0 matrix.
+   */
+  LinearMatrix() : m_(),
+    rows_(0),
+    cols_(0) { resize_(0, 0); }
+
+  /**
+   * @brief build a nRow x nCol matrix.
+   */
+  LinearMatrix(size_t nRow, size_t nCol) : m_(),
+    rows_(nRow),
+    cols_(nCol) { resize_(nRow, nCol); }
+
+  LinearMatrix(const Matrix<Scalar>& m) : m_(m.getNumberOfRows() * m.getNumberOfColumns())
+  {
+    size_t nr = m.getNumberOfRows();
+    size_t nc = m.getNumberOfColumns();
+    for (size_t i = 0; i < nr; i++)
+    {
+      for (size_t j = 0; j < nc; j++)
+      {
+        m_[i * cols_ + j] = m(i, j);
+      }
+    }
+  }
+
+  LinearMatrix& operator=(const Matrix<Scalar>& m)
+  {
+    size_t nr = m.getNumberOfRows();
+    size_t nc = m.getNumberOfColumns();
+    m_.resize(nr * nc);
+    for (size_t i = 0; i < nr; i++)
+    {
+      m_[i].resize(nc);
+      for (size_t j = 0; j < nc; j++)
+      {
+        m_[i * cols_ + j] = m(i, j);
+      }
+    }
+    return *this;
+  }
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~LinearMatrix() {}
+
+public:
+  LinearMatrix* clone() const { return new LinearMatrix(*this); }
+
+  const Scalar& operator()(size_t i, size_t j) const { return m_[i * cols_ + j]; }
+
+  Scalar& operator()(size_t i, size_t j) { return m_[i * cols_ + j]; }
+
+  size_t getNumberOfRows() const { return rows_; }
+
+  size_t getNumberOfColumns() const { return cols_; }
+
+  std::vector<Scalar> row(size_t i) const
+  {
+    std::vector<Scalar> r(getNumberOfColumns());
+    for (size_t j = 0; j < getNumberOfColumns(); j++)
+    {
+      r[j] = operator()(i, j);
+    }
+    return r;
+  }
+
+  std::vector<Scalar> col(size_t j) const
+  {
+    std::vector<Scalar> c(getNumberOfRows());
+    for (size_t i = 0; i < getNumberOfRows(); i++)
+    {
+      c[i] = operator()(i, j);
+    }
+    return c;
+  }
+
+  /**
+   * @copydoc Matrix::resize
+   *
+   * This method resize the matrix keeping old data in place.
+   * @see LinearMatrix::resize(size_t nRow, size_t nCol, bool keepValues)
+   */
+  void resize(size_t nRows, size_t nCols)
+  {
+    resize(nRows, nCols, true);
+  }
+
+  /**
+   * @brief Resize the matrix.
+   *
+   * This task may be memory consumming if keepValues is true because it use
+   * a copy of the input matrix to keep trace of the values.
+   *
+   * @param nRows the new number of rows
+   * @param nCols the new number of columns
+   * @param keepValues if old values must be kept in the resized matrix.
+   * If keepValues = false, old values are still in the matrix but not at
+   * the same positions. For instance:
+   * @code
+   * LinearMatrix<int> m(3, 2);
+   * for (size_t i = 0 ; i < m.getNumberOfRows() ; i++) {
+   *   for (size_t j = 0 ; j < m.getNumberOfColumns() ; j++) {
+   *     m(i, j) = i * m.nCols() + j + 1;
+   *   }
+   * }
+   * MatrixTools::print(m);
+   * // 3x2
+   * // [
+   * // [1, 2]
+   * // [3, 4]
+   * // [5, 6]
+   * // ]
+   * LinearMatrix<int> m2 = m;
+   * m2.resize(2, 4, false); // resize the matrix with keepValues = false
+   * MatrixTools::print(m2);
+   * // 2x4
+   * // [
+   * // [1, 2, 3, 4]
+   * // [5, 6, 0, 0]
+   * // ]
+   * LinearMatrix<int> m3 = m;
+   * m3.resize(2, 4, true); // resize the matrix with keepValues = true
+   * MatrixTools::print(m3);
+   * // 2x4
+   * // [
+   * // [1, 2, 0, 0]
+   * // [3, 4, 0, 0]
+   * // ]
+   * @endcode
+   */
+  void resize(size_t nRows, size_t nCols, bool keepValues)
+  {
+    LinearMatrix<Scalar> tmpM;
+    if (keepValues)
+      tmpM = *this;
+    resize_(nRows, nCols);
+    if (keepValues)
+    {
+      for (size_t i = 0; i < nRows; i++)
+      {
+        for (size_t j = 0; j < nCols; j++)
+        {
+          if (i < tmpM.getNumberOfRows() && j < tmpM.getNumberOfColumns())
+          {
+            operator()(i, j) = tmpM(i, j);
+          }
+          else
+          {
+            operator()(i, j) = 0;
+          }
+        }
+      }
+    }
+  }
+
+private:
+  /**
+   * @brief Internal basic resize fonctionnalities.
+   */
+  void resize_(size_t nRows, size_t nCols)
+  {
+    m_.resize(nRows * nCols);
+    rows_ = nRows;
+    cols_ = nCols;
+  }
+};
+
+template<class Scalar>
+bool operator==(const Matrix<Scalar>& m1, const Matrix<Scalar>& m2)
+{
+  if (m1.getNumberOfRows() != m2.getNumberOfRows() || m1.getNumberOfColumns() != m2.getNumberOfColumns())
+    return false;
+  for (size_t i = 0; i < m1.getNumberOfRows(); i++)
+  {
+    for (size_t j = 0; j < m1.getNumberOfColumns(); j++)
+    {
+      if (m1(i, j) != m2(i, j))
+        return false;
+    }
+  }
+  return true;
+}
+} // end of namespace bpp.
+
+#endif // _MATRIX_H_
+
diff --git a/src/Bpp/Numeric/Matrix/MatrixTools.h b/src/Bpp/Numeric/Matrix/MatrixTools.h
new file mode 100644
index 0000000..3b3719b
--- /dev/null
+++ b/src/Bpp/Numeric/Matrix/MatrixTools.h
@@ -0,0 +1,1361 @@
+//
+// File: MatrixTools.h
+// Created by: Julien Dutheil
+// Created on: Mon Jan 19 16:42:25 2004
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus. This file is part of the Bio++ project.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use,
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info".
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability.
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or
+  data to be ensured and,  more generally, to use and operate it in the
+  same conditions as regards security.
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _MATRIXTOOLS_H_
+#define _MATRIXTOOLS_H_
+
+#include "../VectorTools.h"
+#include "Matrix.h"
+#include "LUDecomposition.h"
+#include "EigenValue.h"
+#include "../../Io/OutputStream.h"
+
+#include <cstdio>
+#include <iostream>
+
+namespace bpp
+{
+/**
+ * @brief Functions dealing with matrices.
+ */
+  class MatrixTools
+  {
+  public:
+    MatrixTools() {}
+    ~MatrixTools() {}
+
+  public:
+    /**
+     * @brief Copy operation. This function supplies the lack of inheritence of the assigment operator :D .
+     *
+     * @param A [in] Original matrix.
+     * @param O [out] A copy of the given matrix.
+     */
+    template<class MatrixA, class MatrixO>
+    static void copy(const MatrixA& A, MatrixO& O)
+    {
+      O.resize(A.getNumberOfRows(), A.getNumberOfColumns());
+      for (size_t i = 0; i < A.getNumberOfRows(); i++)
+      {
+        for (size_t j = 0; j < A.getNumberOfColumns(); j++)
+        {
+          O(i, j) = A(i, j);
+        }
+      }
+    }
+
+    /**
+     * @brief Get a identity matrix of a given size.
+     *
+     * @param n the size of the matrix.
+     * @param O [out] A identity matrix of size n.
+     */
+    template<class Matrix>
+    static void getId(size_t n, Matrix& O)
+    {
+      O.resize(n, n);
+      for (size_t i = 0; i < n; i++)
+      {
+        for (size_t j = 0; j < n; j++) {
+          O(i, j) = (i == j) ? 1 : 0;
+        }
+      }
+    }
+
+    /**
+     * @param D [in] A vector of diagonal elements.
+     * @param O [out] A diagonal matrix with diagonal elements taken from a vector.
+     */
+    template<class Scalar>
+    static void diag(const std::vector<Scalar>& D, Matrix<Scalar>& O)
+    {
+      size_t n = D.size();
+      O.resize(n, n);
+      for (size_t i = 0; i < n; i++)
+      {
+        for (size_t j = 0; j < n; j++) { O(i, j) = (i == j) ? D[i] : 0;}
+      }
+    }
+
+    /**
+     * @param x [in] A scalar
+     * @param n [in] the dimension of the output matrix
+     * @param O [out] A diagonal matrix with diagonal elements equal to x
+     */
+    template<class Scalar>
+    static void diag(const Scalar x, size_t n, Matrix<Scalar>& O)
+    {
+      O.resize(n, n);
+      for (size_t i = 0; i < n; i++)
+      {
+        for (size_t j = 0; j < n; j++) { O(i, j) = (i == j) ? x : 0;}
+      }
+    }
+
+    /**
+     * @param M [in] The matrix.
+     * @param O [out] The diagonal elements of a square matrix as a vector.
+     * @throw DimensionException If M is not a square matrix.
+     */
+    template<class Scalar>
+    static void diag(const Matrix<Scalar>& M, std::vector<Scalar>& O) throw (DimensionException)
+    {
+      size_t nc = M.getNumberOfColumns();
+      size_t nr = M.getNumberOfRows();
+      if (nc != nr) throw DimensionException("MatrixTools::diag(). M must be a square matrix.", nr, nc);
+      O.resize(nc);
+      for (size_t i = 0; i < nc; i++) { O[i] = M(i, i);}
+    }
+
+    /**
+     * @brief Set all elements in M to value x.
+     * @param M A matrix.
+     * @param x The value to use.
+     */
+    template<class Matrix, class Scalar>
+    static void fill(Matrix& M, Scalar x)
+    {
+      for (size_t i = 0; i < M.getNumberOfRows(); i++)
+      {
+        for (size_t j = 0; j < M.getNumberOfColumns(); j++)
+        {
+          M(i, j) = x;
+        }
+      }
+    }
+
+    /**
+     * @brief Set all diagonal elements in M to value x.
+     * @param M A matrix.
+     * @param x The value to use.
+     */
+    template<class Matrix, class Scalar>
+    static void fillDiag(Matrix& M, Scalar x)
+    {
+      for (size_t i = 0; i < M.getNumberOfRows(); i++)
+        M(i, i) = x;
+    }
+
+    /**
+     * @brief Multiply all elements of a matrix by a given value, and add a constant.
+     *
+     * Performs \f$\forall i \forall j m_{i,j} = a.m_{i,j}+b\f$.
+     *
+     * @param A A matrix.
+     * @param a Multiplicator.
+     * @param b Constant.
+     */
+    template<class Matrix, class Scalar>
+    static void scale(Matrix& A, Scalar a, Scalar b = 0)
+    {
+      for (size_t i = 0; i < A.getNumberOfRows(); i++)
+      {
+        for (size_t j = 0; j < A.getNumberOfColumns(); j++)
+        {
+          A(i, j) = a * A(i, j) + b;
+        }
+      }
+    }
+
+    /**
+     * @param A [in] First matrix.
+     * @param B [in] Second matrix.
+     * @param O [out] The dot product of two matrices.
+     */
+    template<class Scalar>
+    static void mult(const Matrix<Scalar>& A, const Matrix<Scalar>& B, Matrix<Scalar>& O) throw (DimensionException)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      if (ncA != nrB) throw DimensionException("MatrixTools::mult(). nrows B != ncols A.", nrB, ncA);
+      O.resize(nrA, ncB);
+      for (size_t i = 0; i < nrA; i++)
+      {
+        for (size_t j = 0; j < ncB; j++)
+        {
+          O(i, j) = 0;
+          for (size_t k = 0; k < ncA; k++)
+          {
+            O(i, j) += A(i, k) * B(k, j);
+          }
+        }
+      }
+    }
+
+    /**
+     * @brief Compute A . D . B where D is a diagonal matrix in O(n^3).
+     *
+     * Since D is a diagonal matrix, this function is more efficient than doing
+     * mult(mult(A, diag(D)), B), which involves two 0(n^3) operations.
+     *
+     * @param A [in] The first matrix.
+     * @param D [in] The diagonal matrix (only diagonal elements in a vector)
+     * @param B [in] The second matrix.
+     * @param O [out] The result matrix.
+     * @throw DimensionException If matrices have not the appropriate size.
+     */
+    template<class Scalar>
+    static void mult(const Matrix<Scalar>& A, const std::vector<Scalar>& D, const Matrix<Scalar>& B, Matrix<Scalar>& O) throw (DimensionException)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      if (ncA != nrB) throw DimensionException("MatrixTools::mult(). nrows B != ncols A.", nrB, ncA);
+      if (ncA != D.size()) throw DimensionException("MatrixTools::mult(). Vector size is not equal to matrix size.", D.size(), ncA);
+      O.resize(nrA, ncB);
+      for (size_t i = 0; i < nrA; i++)
+      {
+        for (size_t j = 0; j < ncB; j++)
+        {
+          O(i, j) = 0;
+          for (size_t k = 0; k < ncA; k++)
+          {
+            O(i, j) += A(i, k) * B(k, j) * D[k];
+          }
+        }
+      }
+    }
+
+    /**
+     * @brief Compute A . (U+D+L) . B where D is a diagonal matrix, U
+     * (resp. L) is a matrix in which the only non-zero terms are on the
+     * diagonal that is over (resp. under) the main diagonal, in O(n^3).
+     *
+     * Since D is a diagonal matrix, this function is more efficient than doing
+     * mult(mult(A, diag(D)), B), which involves two 0(n^3) operations.
+     *
+     * @param A [in] The first matrix.
+     * @param D [in] The diagonal matrix (only diagonal elements in a vector)
+     * @param U [in] The upper diagonal matrix (only upper diagonal elements in a vector)
+     * @param L [in] The lower diagonal matrix (only lower diagonal elements in a vector)
+     * @param B [in] The second matrix.
+     * @param O [out] The result matrix.
+     * @throw DimensionException If matrices have not the appropriate size.
+     */
+    template<class Scalar>
+    static void mult(const Matrix<Scalar>& A, const std::vector<Scalar>& D, const std::vector<Scalar>& U, const std::vector<Scalar>& L, const Matrix<Scalar>& B, Matrix<Scalar>& O) throw (DimensionException)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      if (ncA != nrB) throw DimensionException("MatrixTools::mult(). nrows B != ncols A.", nrB, ncA);
+      if (ncA != D.size()) throw DimensionException("MatrixTools::mult(). Vector size is not equal to matrix size.", D.size(), ncA);
+      if (ncA != U.size()+1) throw DimensionException("MatrixTools::mult(). Vector size is not equal to matrix size-1.", U.size(), ncA);
+      if (ncA != L.size()+1) throw DimensionException("MatrixTools::mult(). Vector size is not equal to matrix size-1.", L.size(), ncA);
+      O.resize(nrA, ncB);
+      for (size_t i = 0; i < nrA; i++)
+      {
+        for (size_t j = 0; j < ncB; j++)
+        {
+          O(i, j) = A(i, 0) * D[0] * B(0, j);
+          if (nrB>1)
+            O(i, j) += A(i,0) * U[0] * B(1,j);
+          for (size_t k = 1; k < ncA-1; k++)
+          {
+            O(i, j) += A(i, k) * (L[k-1] * B(k-1, j) + D[k] * B(k, j) + U[k] * B(k+1,j));
+          }
+          if (ncA>=2)
+            O(i, j) += A(i, ncA-1) * L[ncA-2] * B(ncA-2, j);
+          O(i,j) += A(i, ncA-1) * D[ncA-1] * B(ncA-1, j);
+        }
+      }
+    }
+
+    /**
+     * @brief Add matrix B to matrix A.
+     *
+     * @param A [in, out] Matrix A
+     * @param B [in] Matrix B
+     * @throw DimensionException If A and B have note the same size.
+     */
+    
+    template<class MatrixA, class MatrixB>
+    static void add(MatrixA& A, const MatrixB& B) throw (DimensionException)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      if (ncA > ncB) throw DimensionException("MatrixTools::operator+=(). A and B must have the same number of colums.", ncB, ncA);
+      if (nrA > nrB) throw DimensionException("MatrixTools::operator+=(). A and B must have the same number of rows.", nrB, nrA);
+      
+      
+      for (size_t i = 0; i < nrA; i++)
+      {
+        for (size_t j = 0; j < ncA; j++)
+        {
+          A(i, j) += B(i, j);
+        }
+      }
+    }
+
+    /**
+     * @brief Add matrix x.B to matrix A.
+     *
+     * @param A [in,out] Matrix A
+     * @param x [in] Scalar x
+     * @param B [in] Matrix B
+     * @throw DimensionException If A and B have note the same size.
+     */
+    template<class MatrixA, class MatrixB, class Scalar>
+    static void add(MatrixA& A, Scalar& x, const MatrixB& B) throw (DimensionException)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      if (ncA != ncB) throw DimensionException("MatrixTools::operator+(). A and B must have the same number of colums.", ncB, ncA);
+      if (nrA != nrB) throw DimensionException("MatrixTools::operator+(). A and B must have the same number of rows.", nrB, nrA);
+      
+      for (size_t i = 0; i < nrA; i++)
+      {
+        for (size_t j = 0; j < ncA; j++)
+        {
+          A(i, j) += x*B(i, j);
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the power of a given matrix.
+     *
+     * @param A [in] The matrix.
+     * @param p The number of multiplications.
+     * @param O [out]\f$  A^p \f$ computed recursively:
+     *               \f$ A^{2n} = (A^n)^2 \f$
+     *               \f$ A^{2n+1} = A*(A^n)^2 \f$   
+     * If p = 0, sends the identity matrix.
+     * @throw DimensionException If m is not a square matrix.
+     */
+    template<class Matrix>
+    static void pow(const Matrix& A, size_t p, Matrix& O) throw (DimensionException)
+    {
+      size_t n = A.getNumberOfRows();
+      if (n != A.getNumberOfColumns()) throw DimensionException("MatrixTools::pow(). nrows != ncols.", A.getNumberOfColumns(), A.getNumberOfRows());
+      switch(p){
+      case 0:
+        getId<Matrix>(n, O);
+        break;
+      case 1:
+        copy(A,O);
+        break;
+      case 2:
+        mult(A,A,O);
+        break;
+      default:
+        Matrix tmp;
+        if (p%2){
+          pow(A,p/2,tmp);
+          pow(tmp,2,O);
+        }
+        else{
+          pow(A,(p-1)/2,tmp);
+          pow(tmp,2,O);
+          mult(A,O,tmp);
+          copy(tmp,O);
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the power of a given matrix, using eigen value decomposition.
+     *
+     * @param A [in] The matrix.
+     * @param p The power of the matrix.
+     * @param O [out]\f$\prod_{i=1}^p m\f$.
+     * If p = 0, sends the identity matrix.
+     * @throw DimensionException If m is not a square matrix.
+     */
+    template<class Scalar>
+    static void pow(const Matrix<Scalar>& A, double p, Matrix<Scalar>& O) throw (DimensionException)
+    {
+      size_t n = A.getNumberOfRows();
+      if (n != A.getNumberOfColumns()) throw DimensionException("MatrixTools::pow(). nrows != ncols.", A.getNumberOfColumns(), A.getNumberOfRows());
+      EigenValue<Scalar> eigen(A);
+      RowMatrix<Scalar> rightEV, leftEV;
+      rightEV = eigen.getV();
+      inv(rightEV, leftEV);
+      mult(rightEV, VectorTools::pow(eigen.getRealEigenValues(), p), leftEV, O);
+    }
+
+    /**
+     * @brief Perform matrix exponentiation using diagonalization.
+     *
+     * @warning This method currently relies only on diagonalization, so it won't work if your matrix is not diagonalizable.
+     * The function may be extended later to deal with other cases.
+     *
+     * @param A [in] The matrix.
+     * @param O [out]\f$\prod_{i=1}^p m\f$.
+     * @throw DimensionException If m is not a square matrix.
+     */
+    template<class Scalar>
+    static void exp(const Matrix<Scalar>& A, Matrix<Scalar>& O) throw (DimensionException)
+    {
+      size_t n = A.getNumberOfRows();
+      if (n != A.getNumberOfColumns()) throw DimensionException("MatrixTools::exp(). nrows != ncols.", A.getNumberOfColumns(), A.getNumberOfRows());
+      EigenValue<Scalar> eigen(A);
+      RowMatrix<Scalar> rightEV, leftEV;
+      rightEV = eigen.getV();
+      inv(rightEV, leftEV);
+      mult(rightEV, VectorTools::exp(eigen.getRealEigenValues()), leftEV, O);
+    }
+
+    /**
+     * @brief Compute a vector of the first powers of a given matrix.
+     *
+     * @param A [in] The matrix.
+     * @param p The number of powers.
+     * @param vO [out] the vector of the powers (from 0 to p)
+     *
+     * @throw DimensionException If m is not a square matrix.
+     */
+  
+    template<class Matrix, class Scalar>
+    static void Taylor(const Matrix& A, size_t p, std::vector< RowMatrix<Scalar> > & vO) throw (DimensionException)
+    {
+      size_t n = A.getNumberOfRows();
+      if (n != A.getNumberOfColumns())
+        throw DimensionException("MatrixTools::pow(). nrows != ncols.", A.getNumberOfColumns(), A.getNumberOfRows());
+      vO.resize(p+1);
+      getId<Matrix>(n, vO[0]);
+      copy(A,vO[1]);
+    
+      for (size_t i = 1; i < p; i++)
+      {
+        mult(vO[i], A, vO[i+1]);
+      }
+    }
+
+    /**
+     * @return The position of the maximum value in the matrix.
+     * @param m The matrix.
+     */
+    template<class Matrix>
+    static std::vector<size_t> whichMax(const Matrix& m)
+    {
+      size_t nrows = m.getNumberOfRows();
+      size_t ncols = m.getNumberOfColumns();
+      std::vector<size_t> pos(2);
+      size_t imax = 0;
+      size_t jmax = 0;
+      double currentMax = log(0.);
+      for (size_t i = 0; i < nrows; i++)
+      {
+        for (size_t j = 0; j < ncols; j++)
+        {
+          double currentValue = m(i, j);
+          // cout << currentValue << "\t" << (currentValue > currentMax) << endl;
+          if (currentValue > currentMax)
+          {
+            imax = i;
+            jmax = j;
+            currentMax = currentValue;
+          }
+        }
+      }
+      pos[0] = imax;
+      pos[1] = jmax;
+      return pos;
+    }
+
+    /**
+     * @return The position of the minimum value in the matrix.
+     * @param m The matrix.
+     */
+    template<class Matrix>
+    static std::vector<size_t> whichMin(const Matrix& m)
+    {
+      size_t nrows = m.getNumberOfRows();
+      size_t ncols = m.getNumberOfColumns();
+      std::vector<size_t> pos(2);
+      size_t imin = 0;
+      size_t jmin = 0;
+      double currentMin = -log(0.);
+      for (size_t i = 0; i < nrows; i++)
+      {
+        for (size_t j = 0; j < ncols; j++)
+        {
+          double currentValue = m(i, j);
+          if (currentValue < currentMin)
+          {
+            imin = i;
+            jmin = j;
+            currentMin = currentValue;
+          }
+        }
+      }
+      pos[0] = imin;
+      pos[1] = jmin;
+      return pos;
+    }
+
+    /**
+     * @return The maximum value in the matrix.
+     * @param m The matrix.
+     */
+    template<class Real>
+    static Real max(const Matrix<Real>& m)
+    {
+      size_t nrows = m.getNumberOfRows();
+      size_t ncols = m.getNumberOfColumns();
+      Real currentMax = log(0.);
+      for (size_t i = 0; i < nrows; i++)
+      {
+        for (size_t j = 0; j < ncols; j++)
+        {
+          Real currentValue = m(i, j);
+          // cout << currentValue << "\t" << (currentValue > currentMax) << endl;
+          if (currentValue > currentMax)
+          {
+            currentMax = currentValue;
+          }
+        }
+      }
+      return currentMax;
+    }
+
+
+    /**
+     * @return The minimum value in the matrix.
+     * @param m The matrix.
+     */
+    template<class Real>
+    static Real min(const Matrix<Real>& m)
+    {
+      size_t nrows = m.getNumberOfRows();
+      size_t ncols = m.getNumberOfColumns();
+      Real currentMin = -log(0.);
+      for (size_t i = 0; i < nrows; i++)
+      {
+        for (size_t j = 0; j < ncols; j++)
+        {
+          Real currentValue = m(i, j);
+          if (currentValue < currentMin)
+          {
+            currentMin = currentValue;
+          }
+        }
+      }
+      return currentMin;
+    }
+
+    /**
+     * @brief Print a matrix to a stream.
+     *
+     * @param m The matrix to print.
+     * @param out The stream to use.
+     */
+    template<class Matrix>
+    static void print(const Matrix& m, std::ostream& out = std::cout)
+    {
+      out << m.getNumberOfRows() << "x" << m.getNumberOfColumns() << std::endl;
+      out << "[" << std::endl;
+      for (size_t i = 0; i < m.getNumberOfRows(); i++)
+      {
+        out << "[";
+        for (size_t j = 0; j < m.getNumberOfColumns() - 1; j++)
+        {
+          out << m(i, j) << ", ";
+        }
+        if (m.getNumberOfColumns() > 0) out << m(i, m.getNumberOfColumns() - 1) << "]" << std::endl;
+      }
+      out << "]" << std::endl;
+    }
+
+    /**
+     * @brief Print a matrix to a stream.
+     *
+     * @param m The matrix to print.
+     * @param out The stream to use.
+     * @param pIn left delimiter (default: "(")
+     * @param pOut right delimiter (default: ")")
+     */
+    template<class Matrix>
+    static void print(const Matrix& m, bpp::OutputStream& out, char pIn = '(', char pOut = ')')
+    {
+      out << pIn;
+    
+      for (size_t i = 0; i < m.getNumberOfRows(); i++)
+      {
+        if (i!=0)
+          out << ",";
+      
+        out << pIn;
+        for (size_t j = 0; j < m.getNumberOfColumns() - 1; j++)
+        {
+          out << m(i, j) << ", ";
+        }
+        if (m.getNumberOfColumns() > 0) out << m(i, m.getNumberOfColumns() - 1) << pOut;
+      }
+      out << pOut;
+    }
+
+    /**
+     * @brief Print a matrix to a stream, so that it is read by R.
+     *
+     * @param m The matrix to print.
+     * @param variableName The name of the R variable handeling the matrix
+     * @param out The stream to use.
+     */
+    template<class Matrix>
+    static void printForR(const Matrix& m, const std::string& variableName = "x", std::ostream& out = std::cout)
+    {
+      out.precision(12);
+      out << variableName << "<-matrix(c(";
+      for (size_t i = 0; i < m.getNumberOfRows(); i++)
+      {
+        for (size_t j = 0; j < m.getNumberOfColumns(); j++)
+        {
+          if (i > 0 || j > 0)
+            out << ", ";
+          out << m(i, j);
+        }
+      }
+      out << "), nrow=" << m.getNumberOfRows() << ", byrow=TRUE)" << std::endl;
+    }
+
+
+    /**
+     * @brief Print a vector to a stream.
+     *
+     * @param v The vector to print.
+     * @param out The stream to use.
+     */
+    template<class Real>
+    static void print(const std::vector<Real>& v, std::ostream& out = std::cout)
+    {
+      out << v.size() << std::endl;
+      out << "[";
+      for (size_t i = 0; i < v.size() - 1; i++)
+      {
+        out << v[i] << ", ";
+      }
+      if (v.size() > 0) out << v[v.size() - 1];
+      out << "]" << std::endl;
+    }
+
+    /**
+     * @return True if the matrix is a square matrix.
+     * @param A A matrix.
+     */
+    template<class Matrix>
+    static bool isSquare(const Matrix& A) { return A.getNumberOfRows() == A.getNumberOfColumns(); }
+
+    /**
+     * @param A [in] The matrix to inverse.
+     * @param O [out] The inverse matrix of A.
+     * @return x the minimum absolute value of the diagonal of the LU decomposition
+     * @throw DimensionException If A is not a square matrix.
+     */
+    template<class Scalar>
+    static Scalar inv(const Matrix<Scalar>& A, Matrix<Scalar>& O) throw (DimensionException, ZeroDivisionException)
+    {
+      if (!isSquare(A)) throw DimensionException("MatrixTools::inv(). Matrix A is not a square matrix.", A.getNumberOfRows(), A.getNumberOfColumns());
+      LUDecomposition<Scalar> lu(A);
+      RowMatrix<Scalar> I;
+      getId(A.getNumberOfRows(), I);
+      return lu.solve(I, O);
+    }
+
+    /**
+     * @brief Get determinant of a square matrix.
+     *
+     * This implementation is in @f$o(n^3)@f$ and uses the LU decomposition method.
+     *
+     * @param A [in] The input matrix.
+     * @return The determinant of A.
+     * @throw DimensionException If A is not a square matrix.
+     */
+    template<class Scalar>
+    static double det(const Matrix<Scalar>& A) throw (DimensionException)
+    {
+      if (!isSquare(A)) throw DimensionException("MatrixTools::det(). Matrix A is not a square matrix.", A.getNumberOfRows(), A.getNumberOfColumns());
+      LUDecomposition<Scalar> lu(A);
+      return lu.det();
+    }
+
+    /**
+     * @param A [in] The matrix to transpose.
+     * @param O [out] The transposition of A.
+     */
+    template<class MatrixA, class MatrixO>
+    static void transpose(const MatrixA& A, MatrixO& O)
+    {
+      O.resize(A.getNumberOfColumns(), A.getNumberOfRows());
+      for (size_t i = 0; i < A.getNumberOfColumns(); i++)
+      {
+        for (size_t j = 0; j < A.getNumberOfRows(); j++)
+        {
+          O(i, j) = A(j, i);
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the variance-covariance matrix of an input matrix.
+     *
+     * The input matrix represent a n-sample of a random vector of dimension r.
+     * It is assumed to have r rows and n columns.
+     * The variance matrix is then computed as @f[ V = A\cdot A^T - \mu\cdot\mu^T at f],
+     * where @f$\mu at f$ is the mean vector of the sample.
+     * the output matrix is a square matrix of size r.
+     *
+     * @param A [in] The intput matrix.
+     * @param O [out] The resulting variance covariance matrix.
+     */
+    template<class Scalar>
+    static void covar(const Matrix<Scalar>& A, Matrix<Scalar>& O)
+    {
+      size_t r = A.getNumberOfRows();
+      size_t n = A.getNumberOfColumns();
+      O.resize(r, r);
+      RowMatrix<Scalar> tA;
+      transpose(A, tA);
+      mult(A, tA, O);
+      scale(O, 1. / static_cast<double>(n));
+      RowMatrix<Scalar> mean(r, 1);
+      for (size_t i = 0; i < r; i++)
+      {
+        for (size_t j = 0; j < n; j++)
+        {
+          mean(i, 0) += A(i, j);
+        }
+        mean(i, 0) /= static_cast<double>(n);
+      }
+      RowMatrix<Scalar> tMean;
+      transpose(mean, tMean);
+      RowMatrix<Scalar> meanMat;
+      mult(mean, tMean, meanMat);
+      scale(meanMat, -1.);
+      add(O, meanMat);
+    }
+
+    /**
+     * @brief Compute the Kronecker product of two row matrices.
+     *
+     * @param A [in] The first row matrix.
+     * @param B [in] The second row matrix.
+     * @param O [out] The product \f$A \otimes B\f$.
+     * @param check [optional] if resize of 0 (default: true)
+     */
+    template<class Scalar>
+    static void kroneckerMult(const Matrix<Scalar>& A, const Matrix<Scalar>& B, Matrix<Scalar>& O, bool check = true)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+
+      if (check)
+        O.resize(nrA * nrB, ncA * ncB);
+      
+      for (size_t ia = 0; ia < nrA; ia++)
+      {
+        for (size_t ja = 0; ja < ncA; ja++)
+        {
+          Scalar aij = A(ia, ja);
+          for (size_t ib = 0; ib < nrB; ib++)
+          {
+            for (size_t jb = 0; jb < ncB; jb++)
+            {
+              O(ia * nrB + ib, ja * ncB + jb) = aij * B(ib, jb);
+            }
+          }
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the Kronecker product of one Matrice with a
+     * diagonal matrix, which main term and dimension are given
+     *
+     * @param A [in] The first row matrix.
+     * @param dim [in] The dimension of the diagonal matrix.
+     * @param v [in] The diagonal value of the diagonal matrix.
+     * @param O [out] The product \f$A \otimes B\f$.
+     * @param check [optional] if resize of 0 (default: true)
+     */
+    template<class Scalar>
+    static void kroneckerMult(const Matrix<Scalar>& A, size_t dim, const Scalar& v, Matrix<Scalar>& O, bool check = true)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+
+      if (check)
+        O.resize(nrA * dim, ncA * dim);
+      
+      for (size_t ia = 0; ia < nrA; ia++)
+      {
+        for (size_t ja = 0; ja < ncA; ja++)
+        {
+          Scalar aij = A(ia, ja);
+          for (size_t ib = 0; ib < dim; ib++)
+          {
+            for (size_t jb = 0; jb < dim; jb++)
+            {
+              O(ia * dim + ib, ja * dim + jb) = aij * ((ib==jb)?v:0);
+            }
+          }
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the Kronecker product of two row matrices in
+     * which the diagonal element is changed
+     *
+     * @param A [in] The first row matrix.
+     * @param B [in] The second row matrix.
+     * @param dA [in] The replaced diagonal element of A
+     * @param dB [in] The replaced diagonal element of B
+     * @param O [out] The product \f$A \otimes B\f$.
+     * @param check [optional] if resize of 0 (default: true)
+     */
+    template<class Scalar>
+    static void kroneckerMult(const Matrix<Scalar>& A, const Matrix<Scalar>& B, const Scalar& dA, const Scalar& dB, Matrix<Scalar>& O, bool check= true)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+
+      if (check)
+        O.resize(nrA * nrB, ncA * ncB);
+      
+      for (size_t ia = 0; ia < nrA; ia++)
+      {
+        for (size_t ja = 0; ja < ncA; ja++)
+        {
+          const Scalar& aij = (ia==ja)?dA:A(ia, ja);
+          
+          for (size_t ib = 0; ib < nrB; ib++)
+          {
+            for (size_t jb = 0; jb < ncB; jb++)
+            {
+              O(ia * nrB + ib, ja * ncB + jb) = aij * ((ib==jb)?dB:B(ib, jb));
+            }
+          }
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the Hadamard product of two row matrices with same dimensions.
+     *
+     * @param A [in] The first row matrix.
+     * @param B [in] The second row matrix.
+     * @param O [out] The Hadamard product.
+     */
+    template<class Scalar>
+    static void hadamardMult(const Matrix<Scalar>& A, const Matrix<Scalar>& B, Matrix<Scalar>& O)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      if (nrA != nrB) throw DimensionException("MatrixTools::hadamardMult(). nrows A != nrows B.", nrA, nrB);
+      if (ncA != ncB) throw DimensionException("MatrixTools::hadamardMult(). ncols A != ncols B.", ncA, ncB);
+      O.resize(nrA, ncA);
+      for (size_t i = 0; i < nrA; i++)
+      {
+        for (size_t j = 0; j < ncA; j++)
+        {
+          O(i, j) = A(i, j) * B(i, j);
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the "Hadamard" product of a row matrix and a vector containing weights, according to rows or columns.
+     *
+     * @param A [in] The row matrix.
+     * @param B [in] The vector of row or column weights.
+     * @param O [out] The 'Hadamard' product.
+     * @param row Boolean. If row is set to 'true', the vector contains weights for rows. Otherwise the vector contains weights for columns.
+     */
+    template<class Scalar>
+    static void hadamardMult(const Matrix<Scalar>& A, const std::vector<Scalar>& B, Matrix<Scalar>& O, bool row = true)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t sB = B.size();
+      if (row == true && nrA != sB) throw DimensionException("MatrixTools::hadamardMult(). nrows A != size of B.", nrA, sB);
+      if (row == false && ncA != sB) throw DimensionException("MatrixTools::hadamardMult(). ncols A != size of B.", ncA, sB);
+      O.resize(nrA, ncA);
+      if (row)
+      {
+        for (size_t i = 0; i < nrA; i++)
+        {
+          for (size_t j = 0; j < ncA; j++)
+          {
+            O(i, j) = A(i, j) * B[i];
+          }
+        }
+      }
+      else
+      {
+        for (size_t i = 0; i < nrA; i++)
+        {
+          for (size_t j = 0; j < ncA; j++)
+          {
+            O(i, j) = A(i, j) * B[j];
+          }
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the direct sum of two row matrices.
+     *
+     * @param A [in] The first row matrix.
+     * @param B [in] The second row matrix.
+     * @param O [out] The sum \f$A \oplus B\f$.
+     */
+    template<class Scalar>
+    static void directSum(const Matrix<Scalar>& A, const Matrix<Scalar>& B, Matrix<Scalar>& O)
+    {
+      size_t ncA = A.getNumberOfColumns();
+      size_t nrA = A.getNumberOfRows();
+      size_t nrB = B.getNumberOfRows();
+      size_t ncB = B.getNumberOfColumns();
+      O.resize(nrA + nrB, ncA + ncB);
+      
+      for (size_t ia = 0; ia < nrA; ia++)
+      {
+        for (size_t ja = 0; ja < ncA; ja++)
+        {
+          O(ia, ja) = A(ia, ja);
+        }
+      }
+
+      for (size_t ia = 0; ia < nrA; ia++)
+      {
+        for (size_t jb = 0; jb < ncB; jb++)
+        {
+          O(ia, ncA + jb) = 0;
+        }
+      }
+
+      for (size_t ib = 0; ib < nrB; ib++)
+      {
+        for (size_t ja = 0; ja < ncA; ja++)
+        {
+          O(nrA + ib, ja) = 0;
+        }
+      }
+
+      for (size_t ib = 0; ib < nrB; ib++)
+      {
+        for (size_t jb = 0; jb < nrB; jb++)
+        {
+          O(nrA + ib, ncA + jb) = B(ib, jb);
+        }
+      }
+    }
+
+    /**
+     * @brief Compute the direct sum of n row matrices.
+     *
+     * @param vA [in] A vector of row matrices of any size.
+     * @param O [out] The sum \f$\bigoplus_i A_i\f$.
+     */
+    template<class Scalar>
+    static void directSum(const std::vector< Matrix<Scalar>*>& vA, Matrix<Scalar>& O)
+    {
+      size_t nr = 0;
+      size_t nc = 0;
+      for (size_t k = 0; k < vA.size(); k++)
+      {
+        nr += vA[k]->getNumberOfRows();
+        nc += vA[k]->getNumberOfColumns();
+      }
+      O.resize(nr, nc);
+      for (size_t k=0; k<nr; k++)
+        for (size_t k2=0; k2<nc; k2++)
+          O(k,k2)=0;
+      
+      size_t rk = 0; // Row counter
+      size_t ck = 0; // Col counter
+      for (size_t k = 0; k < vA.size(); k++)
+      {
+        const Matrix<Scalar>* Ak = vA[k];
+        for (size_t i = 0; i < Ak->getNumberOfRows(); i++)
+        {
+          for (size_t j = 0; j < Ak->getNumberOfColumns(); j++)
+          {
+            O(rk + i, ck + j) = (*Ak)(i, j);
+          }
+        }
+        rk += Ak->getNumberOfRows();
+        ck += Ak->getNumberOfColumns();
+      }
+    }
+
+    /**
+     * @brief Convert to a vector of vector.
+     *
+     * @param M [in] A matrix object.
+     * @param vO [out] The output vector of vector (will be resized accordingly).
+     */
+    template<class Scalar>
+    static void toVVdouble(const Matrix<Scalar>& M, std::vector< std::vector<Scalar> >& vO)
+    {
+      size_t n = M.getNumberOfRows();
+      size_t m = M.getNumberOfColumns();
+      vO.resize(n);
+      for (size_t i = 0; i < n; i++)
+      {
+        vO[i].resize(m);
+        for (size_t j = 0; j < m; j++)
+        {
+          vO[i][j] = M(i, j);
+        }
+      }
+    }
+
+    /**
+     * @brief Sum all elements in M.
+     * @param M A matrix.
+     * @return The sum of all elements.
+     */
+    template<class Scalar>
+    static Scalar sumElements(const Matrix<Scalar>& M)
+    {
+      Scalar sum = 0;
+      for (size_t i = 0; i < M.getNumberOfRows(); i++)
+      {
+        for (size_t j = 0; j < M.getNumberOfColumns(); j++)
+        {
+          sum += M(i, j);
+        }
+      }
+      return sum;
+    }
+
+
+  
+    /**
+     * @brief Linear Assignment Problem
+     *
+     * The algorithm coded here is described in 
+     * * A Shortest Augmenting Path Algorithm for Dense and Sparse Linear Assignment Problems, Computing 38, 325-340, 1987
+     * by R. Jonker and A. Volgenant, University of Amsterdam.
+     *
+     * @param assignCost [input/output] Cost matrix
+     * @param rowSol     [output] Column assigned to row in solution
+     * @param colSol     [output] Row assigned to column in solution
+     * @param u          [output] Dual variables, row reduction numbers
+     * @param v          [output] Dual variables, column reduction numbers
+     * @return The optimal cost.
+     */
+    template<class Scalar>
+    static Scalar lap(Matrix<Scalar>& assignCost,
+                      std::vector<int> &rowSol, 
+                      std::vector<int> &colSol, 
+                      std::vector<Scalar> &u, 
+                      std::vector<Scalar> &v) throw (Exception)
+    {
+      size_t dim = assignCost.getNumberOfRows();
+      if (assignCost.getNumberOfColumns() != dim)
+        throw Exception("MatrixTools::lap. Cost matrix should be scare.");
+  
+      bool unassignedFound;
+      size_t i, iMin;
+      size_t numFree = 0, previousNumFree, f, k, freeRow;
+      int i0;
+      std::vector<size_t> free(dim); // list of unassigned rows.
+      std::vector<size_t> pred(dim); // row-predecessor of column in augmenting/alternating path.
+      size_t j, j1, j2, endOfPath, last, low, up;
+      std::vector<size_t> colList(dim); // list of columns to be scanned in various ways.
+      std::vector<short int> matches(dim, 0); // counts how many times a row could be assigned.
+      Scalar min;
+      Scalar h;
+      size_t uMin, uSubMin;
+      Scalar v2;
+      std::vector<Scalar> d(dim); // 'cost-distance' in augmenting path calculation.
+
+      // Column reduction
+      for (j = dim; j > 0; j--)    // reverse order gives better results.
+      {
+        // find minimum cost over rows.
+        min = assignCost(0, j - 1); 
+        iMin = 0;
+        for (i = 1; i < dim; ++i) { 
+          if (assignCost(i, j - 1) < min) 
+          { 
+            min = assignCost(i, j - 1); 
+            iMin = i;
+          }
+        }
+        v[j - 1] = min; 
+
+        if (++matches[iMin] == 1) 
+        { 
+          // init assignment if minimum row assigned for first time.
+          rowSol[iMin] = static_cast<int>(j - 1); 
+          colSol[j - 1] = static_cast<int>(iMin); 
+        }
+        else
+          colSol[j - 1] = -1;        // row already assigned, column not assigned.
+      }
+
+      // Reduction tranfer
+      for (i = 0; i < dim; i++) { 
+        if (matches[i] == 0)     // fill list of unassigned 'free' rows.
+          free[numFree++] = i;
+        else {
+          if (matches[i] == 1)   // transfer reduction from rows that are assigned once.
+          {
+            j1 = static_cast<size_t>(rowSol[i]); //rowSol[i] is >= 0 here 
+            min = -log(0);
+            for (j = 0; j < dim; j++)  
+              if (j != j1)
+                if (assignCost(i, j - 1) - v[j] < min) 
+                  min = assignCost(i, j - 1) - v[j - 1];
+            v[j1] = v[j1] - min;
+          }
+        }
+      }
+
+      // Augmenting row reduction 
+      short loopcnt = 0;           // do-loop to be done twice.
+      do
+      {
+        loopcnt++;
+
+        // scan all free rows.
+        // in some cases, a free row may be replaced with another one to be scanned next.
+        k = 0; 
+        previousNumFree = numFree; 
+        numFree = 0;             // start list of rows still free after augmenting row reduction.
+        while (k < previousNumFree)
+        {
+          i = free[k]; 
+          k++;
+
+          // find minimum and second minimum reduced cost over columns.
+          uMin = assignCost(i, 0) - v[0]; 
+          j1 = 0; 
+          uSubMin = static_cast<size_t>(-log(0));
+          for (j = 1; j < dim; j++) 
+          {
+            h = assignCost(i, j) - v[j];
+            if (h < uSubMin) {
+              if (h >= uMin) 
+              { 
+                uSubMin = h; 
+                j2 = j;
+              }
+              else 
+              { 
+                uSubMin = uMin; 
+                uMin = h; 
+                j2 = j1; 
+                j1 = j;
+              }
+            }
+          }
+
+          i0 = colSol[j1];
+          if (uMin < uSubMin) {
+            // change the reduction of the minimum column to increase the minimum
+            // reduced cost in the row to the subminimum.
+            v[j1] = v[j1] - (uSubMin - uMin);
+          } else {                  // minimum and subminimum equal.
+            if (i0 >= 0)         // minimum column j1 is assigned.
+            { 
+              // swap columns j1 and j2, as j2 may be unassigned.
+              j1 = j2; 
+              i0 = colSol[j2];
+            }
+          }
+
+          // (re-)assign i to j1, possibly de-assigning an i0.
+          rowSol[i] = static_cast<int>(j1); 
+          colSol[j1] = static_cast<int>(i);
+
+          if (i0 >= 0) {          // minimum column j1 assigned earlier.
+            if (uMin < uSubMin) {
+              // put in current k, and go back to that k.
+              // continue augmenting path i - j1 with i0.
+              free[--k] = static_cast<size_t>(i0); 
+            } else { 
+              // no further augmenting reduction possible.
+              // store i0 in list of free rows for next phase.
+              free[numFree++] = static_cast<size_t>(i0); 
+            }
+          }
+        }
+      }
+      while (loopcnt < 2);       // repeat once.
+
+      // Augment solution for each free row.
+      for (f = 0; f < numFree; f++) 
+      {
+        freeRow = free[f];       // start row of augmenting path.
+
+        // Dijkstra shortest path algorithm.
+        // runs until unassigned column added to shortest path tree.
+        for (j = 0; j < dim; j++)  
+        { 
+          d[j] = assignCost(freeRow, j) - v[j]; 
+          pred[j] = freeRow;
+          colList[j] = j;        // init column list.
+        }
+
+        low = 0; // columns in 0..low-1 are ready, now none.
+        up = 0;  // columns in low..up-1 are to be scanned for current minimum, now none.
+        // columns in up..dim-1 are to be considered later to find new minimum, 
+        // at this stage the list simply contains all columns 
+        unassignedFound = false;
+        do
+        {
+          if (up == low)         // no more columns to be scanned for current minimum.
+          {
+            last = low - 1; 
+
+            // scan columns for up..dim-1 to find all indices for which new minimum occurs.
+            // store these indices between low..up-1 (increasing up). 
+            min = d[colList[up++]]; 
+            for (k = up; k < dim; k++) 
+            {
+              j = colList[k]; 
+              h = d[j];
+              if (h <= min)
+              {
+                if (h < min)     // new minimum.
+                { 
+                  up = low;      // restart list at index low.
+                  min = h;
+                }
+                // new index with same minimum, put on undex up, and extend list.
+                colList[k] = colList[up]; 
+                colList[up++] = j; 
+              }
+            }
+
+            // check if any of the minimum columns happens to be unassigned.
+            // if so, we have an augmenting path right away.
+            for (k = low; k < up; k++) { 
+              if (colSol[colList[k]] < 0) 
+              {
+                endOfPath = colList[k];
+                unassignedFound = true;
+                break;
+              }
+            }
+          }
+
+          if (!unassignedFound) 
+          {
+            // update 'distances' between freerow and all unscanned columns, via next scanned column.
+            j1 = colList[low]; 
+            low++; 
+            i = static_cast<size_t>(colSol[j1]); 
+            h = assignCost(i, j1) - v[j1] - min;
+
+            for (k = up; k < dim; k++) 
+            {
+              j = colList[k]; 
+              v2 = assignCost(i, j) - v[j] - h;
+              if (v2 < d[j])
+              {
+                pred[j] = i;
+                if (v2 == min) {  // new column found at same minimum value
+                  if (colSol[j] < 0) 
+                  {
+                    // if unassigned, shortest augmenting path is complete.
+                    endOfPath = j;
+                    unassignedFound = true;
+                    break;
+                  }
+                  // else add to list to be scanned right away.
+                  else 
+                  { 
+                    colList[k] = colList[up]; 
+                    colList[up++] = j; 
+                  }
+                }
+                d[j] = v2;
+              }
+            }
+          } 
+        }
+        while (!unassignedFound);
+
+        // update column prices.
+        for (k = 0; k <= last; k++)  
+        { 
+          j1 = colList[k]; 
+          v[j1] = v[j1] + d[j1] - min;
+        }
+
+        // reset row and column assignments along the alternating path.
+        do
+        {
+          i = pred[endOfPath]; 
+          colSol[endOfPath] = static_cast<int>(i); 
+          j1 = endOfPath; 
+          endOfPath = static_cast<size_t>(rowSol[i]); 
+          rowSol[i] = static_cast<int>(j1);
+        }
+        while (i != freeRow);
+      }
+
+      // calculate optimal cost.
+      Scalar lapCost = 0;
+      for (i = 0; i < dim; i++)  
+      {
+        j = static_cast<size_t>(rowSol[i]);
+        u[i] = assignCost(i, j) - v[j];
+        lapCost = lapCost + assignCost(i, j); 
+      }
+
+      return lapCost;
+    }
+
+  };
+
+} // end of namespace bpp.
+
+#endif  // _MATRIXTOOLS_H_
diff --git a/src/Bpp/Numeric/NumConstants.h b/src/Bpp/Numeric/NumConstants.h
new file mode 100644
index 0000000..18d95a2
--- /dev/null
+++ b/src/Bpp/Numeric/NumConstants.h
@@ -0,0 +1,102 @@
+//
+// File: NumConstants.h
+// Created by: Julien Dutheil
+// Created on: Tue Feb 03 14:21 2009
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus. This file is part of the Bio++ project.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _NUMCONSTANTS_H_
+#define _NUMCONSTANTS_H_
+
+#include <cmath>
+#include <limits>
+
+namespace bpp {
+
+  /**
+   * @brief this static class contains several useful constant values.
+   *
+   * This classe uses function in order to avoid the infamous "static initialization order fiasco".
+   * C++0x solves this...
+   */
+  class NumConstants
+  {
+
+  public:
+    /**
+     * @name Golden ratio.
+     *
+     * The golden ratio, @f$\phi at f$ is equal to @f$\frac{1+\sqrt{5}}{2} = 1.6180339887498948482\ldots at f$.
+     * We also define @f$R=\phi-1 at f$ and @f$C = 1 - R at f$.
+     * @{
+     */
+    static double GOLDEN_RATIO_PHI() { return (1. + sqrt(5.)) / 2.; }
+    static double GOLDEN_RATIO_R() { return GOLDEN_RATIO_PHI() - 1.; }
+    static double GOLDEN_RATIO_C() { return 1. - GOLDEN_RATIO_R(); }
+
+    /** @} */
+
+    static double MEGA() { return 1e6; }
+    static double KILO() { return 1e3; }
+    static double DECI() { return 1e-1; }
+    static double CENTI() { return 1e-2; }
+    static double MILLI() { return 1e-3; }
+    static double MICRO() { return 1e-6; }
+    static double NANO() { return 1e-9; }
+    static double PICO() { return 1e-12; }
+
+    static double SMALL() { return 1e-6; }
+    static double TINY() { return 1e-12; }
+    static double VERY_TINY() { return 1e-20; }
+    static double VERY_BIG() { return static_cast<double>(1.7E+23); }
+    
+    /**
+     * @name Define those constants in case they would not be available in stl/limits.
+     *
+     * @{
+     */
+    static double INF() { return std::numeric_limits<double>::has_infinity ? -log(0) : std::numeric_limits<double>::max(); }
+    static double PINF() { return std::numeric_limits<double>::has_infinity ? -log(0) : std::numeric_limits<double>::max(); }
+    static double MINF() { return std::numeric_limits<double>::has_infinity ? log(0) : std::numeric_limits<double>::min(); }
+    static double NaN() { return NAN; }
+    /** @} */
+
+    static double PI() { return 3.141593; }
+  };
+
+}//end of namespace bpp.
+
+#endif	//_NUMCONSTANTS_H_
+
diff --git a/src/Bpp/Seq/Io/GenBank.cpp b/src/Bpp/Numeric/NumTools.cpp
similarity index 55%
rename from src/Bpp/Seq/Io/GenBank.cpp
rename to src/Bpp/Numeric/NumTools.cpp
index b891716..3157d30 100644
--- a/src/Bpp/Seq/Io/GenBank.cpp
+++ b/src/Bpp/Numeric/NumTools.cpp
@@ -1,14 +1,14 @@
 //
-// File: GenBank.cpp
+// File: NumTools.cpp
 // Created by: Julien Dutheil
-// Created on: Tue Oct 2 2007
+// Created on: Mon Nov 10 12:06:55 2003
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus. This file is part of the Bio++ project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,50 +37,59 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "GenBank.h"
-
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
+#include "NumTools.h"
+#include "Matrix/Matrix.h"
 
 using namespace bpp;
 using namespace std;
 
-/****************************************************************************************/
-
-void GenBank::appendSequencesFromStream(std::istream& input, SequenceContainer& vsc) const throw (Exception)
+/******************************************************************************/
+  
+double NumTools::uniRoot(Function& f, const std::string& param, double a, double b, double tolerance) throw (Exception)
 {
-  if (!input) { throw IOException ("GenBank::read: fail to open file"); }
-
-  string temp, name, sequence = "";  // Initialization
-
-  // Main loop : for all file lines
-  while (!input.eof())
+  ParameterList pl;
+  pl.addParameter(Parameter(param, a));
+  double fa = f.f(pl);
+  pl[0].setValue(b);
+  double fb = f.f(pl);
+  if(fa * fb > 0.) throw Exception("NumTools::uniRoot(). Initial interval values are not of opposite sign.");
+  double c = (a + b) / 2.;
+  double fc;
+  while(abs(fb - fa) > tolerance)
   {
-    getline(input, temp, '\n');  // Copy current line in temporary string
-
-    if(temp.size() >= 9 && temp.substr(0,9) == "ACCESSION")
+    c = (a + b) / 2.; //Better use golden section here...
+    pl[0].setValue(c);
+    fc = f.f(pl);
+    
+    if(fc * fa < 0.)
     {
-      name = TextTools::removeSurroundingWhiteSpaces(temp.substr(10));
-      StringTokenizer st(name, " ");
-      name = st.nextToken();
-      //cout << name << endl;
+      b = c;
+      fb = fc;
     }
-    if (temp.size() >=6 && temp.substr(0,6) == "ORIGIN")
+    else
     {
-      sequence = "";
-      getline(input, temp, '\n');  // Copy current line in temporary string
-      while (!input.eof() && temp.size() > 2 && temp.substr(0,2) != "//")
-      {
-        sequence += TextTools::removeWhiteSpaces(temp.substr(10));
-        getline(input, temp, '\n');  // Copy current line in temporary string
-      }
-      if(name == "") throw Exception("GenBank::read(). Sequence with no ACCESSION number!");
-      Sequence* seq = new BasicSequence(name, sequence, vsc.getAlphabet());
-      vsc.addSequence(*seq, true);
-      name = "";
+      a = c;
+      fa = fc;
     }
-  }  
+  }
+  return c;
+}
+ 
+/******************************************************************************/
+
+RowMatrix<double>* NumTools::computeHessianMatrix(DerivableSecondOrder& function, const ParameterList& parameters)
+{
+  size_t n = parameters.size();
+  vector<string> variables = parameters.getParameterNames();
+  RowMatrix<double>* hessian = new RowMatrix<double>(n, n);
+  for(unsigned int i = 0; i < n; i++)
+    for(unsigned int j = 0; j < n; j++)
+      if(j == i)
+        (*hessian)(i,j) = function.d2f(variables[i], parameters);
+      else
+        (*hessian)(i,j) = function.d2f(variables[i], variables[j], parameters);
+  return hessian;
 }
 
-/****************************************************************************************/
+/******************************************************************************/
 
diff --git a/src/Bpp/Numeric/NumTools.h b/src/Bpp/Numeric/NumTools.h
new file mode 100644
index 0000000..1e48920
--- /dev/null
+++ b/src/Bpp/Numeric/NumTools.h
@@ -0,0 +1,205 @@
+//
+// File: NumTools.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 10 12:06:55 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _NUMTOOLS_H_
+#define _NUMTOOLS_H_
+
+#include "Function/Functions.h"
+
+namespace bpp
+{
+//Forward declaration:
+template<class Scalar> class RowMatrix;
+
+/**
+ * @brief Some utilitary function for numerical calculus.
+ */
+class NumTools
+{
+public:
+
+  /**
+   * @brief Get the magnitude of a value.
+   *
+   * This template function may work with any type for which the operators
+   * < and - are defined.
+   *
+   * @param a The value for which the magnitude must be returned.
+   * @return The magnitude of the value a.
+   */ 
+  template<class T> static T abs(T a) { return a < 0 ? -a : a; }
+
+  /**
+   * @brief Get the sign of a value.
+   *
+   * This template function may work with any type for which the operators
+   * < and == are defined.
+   *
+   * @param a The value for which the sign must be returned.
+   * @return -1 if a < 0, 0 if a = 0, 1 else.
+   */ 
+  template<class T> static T sign(T a) { return a < 0 ? -1 : (a == 0 ? 0 : 1); }
+
+  /**
+   * @brief Get the max between 2 values.
+   *
+   * This template function may work with any type for which the operator
+   * > is defined.
+   *
+   * @param a, b The two values to compare.
+   * @return a if a > b, b else.
+   */ 
+  template<class T> static T max(T a, T b) { return a > b ? a : b; }
+
+  /**
+   * @brief Get the min between 2 values.
+   *
+   * This template function may work with any type for which the operator
+   * < is defined.
+   *
+   * @param a, b The two values to compare.
+   * @return a if a < b, b else.
+   */ 
+  template<class T> static T min(T a, T b) { return a < b ? a : b; }
+
+  /**
+   * @brief Get the magnitude of a times the sign of b.
+   *
+   * @param a The value whose magnitude must be used.
+   * @param b The value whose sign must be used.
+   * @return abs<T>(a) * sign<T>(b).
+   */	 
+  template<class T> static T sign(T a, T b) { return abs<T>(a) * sign<T>(b); }
+
+  /**
+   * @brief Get the square of a number.
+   *
+   * @param a The value.
+   * @return @f$ a^2 @f$.
+   */ 
+  template<class T> static T sqr(T a) { return a * a; }
+
+  /**
+   * @brief Compute the logarithm of a sum from the sum of logarithms.
+   *
+   * The following formula is used:
+   * @f[
+   *  \ln(x) + \ln\left(1+ \exp\left(\ln(y) - \ln(x)\right)\right) = \ln(x + y)
+   * @f]
+   * see http://bozeman.genome.washington.edu/compbio/mbt599_2006/hmm_scaling_revised.pdf
+   *
+   * @param lnx The value.
+   * @param lny The power
+   * @return @f$ ln(x+y) @f$.
+   */ 
+  template<class T> static T logsum(T lnx, T lny) {  return (lny < lnx) ?
+      lnx + log(1. + exp(lny - lnx)) :
+      lny + log(1. + exp(lnx - lny));
+  }
+
+  /**************************************************************************/
+
+  template<class T> static void swap(T & a, T & b)
+  {
+	  T swap = a;
+	  a = b;
+	  b = swap;	
+  }
+
+  template<class T> static void shift(T & a, T & b, T c)
+  {
+  	a = b; b = c;
+  }
+
+  template<class T> static void shift(T & a, T & b, T & c, T d)
+  {
+  	a = b; b = c; c = d;
+  }
+
+  /**************************************************************************/
+
+  template<class T> static T fact(T n) { return (n == 0) ? 1 : n * fact(n - 1); }
+
+  /**************************************************************************/
+
+  template<class T> static T logFact(T n) { return (n == 0) ? 0 : (log(n) + logFact(n - 1)); }
+
+  /**************************************************************************/
+   
+  /**
+   * @brief Find one root of the given function.
+   *
+   * @param f The function to analyse.
+   * @param param The name of the parameter to solve.
+   * @param a Lower bound of initial interval.
+   * @param b Upper bound of initial interval.
+   * @param tolerance The final precision requested.
+   * @return The value of the parameter for which the function is zero.
+   * @throw Exception If something bad happened or if the initial interval do not contains a root.
+   */
+  static double uniRoot(Function & f, const std::string & param, double a, double b, double tolerance) throw (Exception);
+  
+  /**************************************************************************/
+  
+  /**
+   * @brief Compute the Hessian matrix for a function at a given point.
+   *
+   * @f[
+   * H(f(\theta)) = \begin{pmatrix}
+   * \frac{\partial^2 f(\theta)}{\partial \theta_1^2} & \frac{\partial^2 f(\theta)}{\partial \theta_1 \partial \theta_2} & \cdots & \frac{\partial^2 f(\theta)}{\partial \theta_1 \partial \theta_n}\\
+   * \frac{\partial^2 f(\theta)}{\partial \theta_2 \partial \theta_1} & \frac{\partial^2 f(\theta)}{\partial \theta_2^2} & \cdots & \frac{\partial^2 f(\theta)}{\partial \theta_2 \partial \theta_n}\\
+   * \vdots & \vdots & \ddots & \vdots \\
+   * \frac{\partial^2 f(\theta)}{\partial \theta_n \partial \theta_1} & \frac{\partial^2 f(\theta)}{\partial \theta_n \partial \theta_2} & \cdots & \frac{\partial^2 f(\theta)}{\partial \theta_n^2} 
+   * \end{pmatrix}
+   * @f]
+   *
+   * @param function A function with second order derivatives.
+   * @param parameters The set of parameters for which to compute the hessian matrix.
+   * @return A matrix with size equal to the number of parameters.
+   */
+  static RowMatrix<double>* computeHessianMatrix(DerivableSecondOrder& function, const ParameterList & parameters);
+ 
+  /**************************************************************************/
+
+};
+
+} //end of namespace bpp.
+
+#endif	//_NUMTOOLS_H_
+
diff --git a/src/Bpp/Numeric/Number.h b/src/Bpp/Numeric/Number.h
new file mode 100644
index 0000000..8b918aa
--- /dev/null
+++ b/src/Bpp/Numeric/Number.h
@@ -0,0 +1,231 @@
+//
+// File: Number.h
+// Created by: Julien Dutheil
+// Created on: Thu Nov 13 16:29:03 2003
+//
+
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _NUMBER_H_
+#define _NUMBER_H_
+
+#include "../Clonable.h"
+#include "../Text/TextTools.h"
+
+#include <string>
+
+namespace bpp
+{
+/**
+ * @brief The Number interface.
+ *
+ * This template class may be used to deal with number in an object way.
+ */
+class BppNumberI: public Clonable
+{
+	public:
+		
+		BppNumberI() {}
+			
+		virtual ~BppNumberI() {}
+
+	public:
+	
+		virtual BppNumberI* clone() const = 0;
+	
+	public:
+		
+    virtual std::string toString() const = 0;
+
+};
+
+
+class BppNotANumber: public virtual BppNumberI
+{
+	public:
+		
+		BppNotANumber() {}
+			
+		virtual ~BppNotANumber() {}
+
+	public:
+	
+		virtual BppNotANumber* clone() const { return new BppNotANumber(); }
+	
+	public:
+		
+    virtual std::string toString() const { return "NaN"; }
+
+};
+
+
+/**
+ * @brief The Number object template class.
+ *
+ * This template class may be used to deal with number in an object way.
+ */
+template<class T> class Number: public virtual BppNumberI
+{
+	protected:
+		/** @brief The value of this parameter. */
+		T value_;
+	
+	public:
+		
+		/**
+		 * @brief Build a new Number object with a specific value.
+		 *
+		 * @param value The value that the Number must have.
+		 */
+		Number(const T& value = 0): value_(value) {}
+			
+		virtual ~Number() {}
+
+    Number<T> & operator=(const T & t)
+    { 
+      value_ = t;
+      return *this;
+    }
+	
+	public:
+	
+		/**
+		 * @name The Clonable interface.
+		 *
+		 * @{
+		 */
+		Number<T>* clone() const { return new Number<T>(value_); }
+		/** @} */
+	
+	public:
+		
+		/**
+		 * @brief Get the value of this number.
+		 *
+		 * @return The value of this number.
+		 */
+		T getValue() const { return value_; }
+
+    std::string toString() const { return TextTools::toString(value_); }
+};
+
+/**
+ * @brief An object wrapper for double values.
+ */
+class BppDouble: public virtual Number<double>
+{
+ 	public:
+		
+		/**
+		 * @brief Build a new BppDouble number object with a specific value.
+		 *
+		 * @param value The value that the Number must have.
+		 */
+		BppDouble(double value = 0): Number<double>(value) {}
+			
+		virtual ~BppDouble() {}
+
+	public:
+	
+		/**
+		 * @name The Clonable interface.
+		 *
+		 * @{
+		 */
+		BppDouble* clone() const { return new BppDouble(*this); }
+		/** @} */
+	
+};
+
+/**
+ * @brief An object wrapper for integer values.
+ */
+class BppInteger: public virtual Number<int>
+{
+ 	public:
+		
+		/**
+		 * @brief Build a new BppInteger number object with a specific value.
+		 *
+		 * @param value The value that the Number must have.
+		 */
+		BppInteger(int value = 0): Number<int>(value) {}
+			
+		virtual ~BppInteger() {}
+
+	public:
+	
+		/**
+		 * @name The Clonable interface.
+		 *
+		 * @{
+		 */
+		BppInteger* clone() const { return new BppInteger(*this); }
+		/** @} */
+	
+};
+
+/**
+ * @brief An object wrapper for unsigned integer values.
+ */
+class BppUnsignedInteger: public virtual Number<unsigned int>
+{
+ 	public:
+		
+		/**
+		 * @brief Build a new BppUnsignedInteger number object with a specific value.
+		 *
+		 * @param value The value that the Number must have.
+		 */
+		BppUnsignedInteger(unsigned int value = 0): Number<unsigned int>(value) {}
+			
+		virtual ~BppUnsignedInteger() {}
+
+	public:
+	
+		/**
+		 * @name The Clonable interface.
+		 *
+		 * @{
+		 */
+		BppUnsignedInteger* clone() const { return new BppUnsignedInteger(*this); }
+		/** @} */
+	
+};
+
+} //end of namespace bpp.
+
+#endif	//_NUMBER_H_
+
diff --git a/src/Bpp/Numeric/Parameter.cpp b/src/Bpp/Numeric/Parameter.cpp
new file mode 100644
index 0000000..836891d
--- /dev/null
+++ b/src/Bpp/Numeric/Parameter.cpp
@@ -0,0 +1,210 @@
+//
+// File: Parameter.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Oct 15 15:40:47 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "Parameter.h"
+#include <cmath>
+
+//From Utils:
+#include "../Text/TextTools.h"
+
+using namespace bpp;
+
+#include <iostream>
+using namespace std;
+
+/******************************************************************************/
+
+ParameterEvent::ParameterEvent(Parameter* parameter): parameter_(parameter) {}
+
+/** Constructors: *************************************************************/
+
+Parameter::Parameter(const std::string& name, double value, Constraint* constraint, bool attachConstraint, double precision)
+  throw (ConstraintException) :
+  name_(name), value_(0), precision_(0), constraint_(constraint), attach_(attachConstraint), listeners_(), listenerAttach_()
+{
+  // This may throw a ConstraintException:
+  setValue(value);
+  setPrecision(precision);
+}
+
+Parameter::Parameter(const std::string& name, double value, const Constraint* constraint, double precision)
+  throw (ConstraintException) :
+  name_(name), value_(0), precision_(0), constraint_(constraint ? constraint->clone() : 0), attach_(true), listeners_(), listenerAttach_()
+{
+  // This may throw a ConstraintException:
+  setValue(value);
+  setPrecision(precision);
+}
+
+Parameter::Parameter(const Parameter& p) :
+  name_(p.name_),
+  value_(p.value_),
+  precision_(p.precision_),
+  constraint_(0),
+  attach_(p.attach_),
+  listeners_(p.listeners_),
+  listenerAttach_(p.listenerAttach_)
+{
+  if (p.attach_ && p.constraint_)
+    constraint_ = p.constraint_->clone();
+  else
+    constraint_ = p.constraint_;
+  for (size_t i = 0; i < listeners_.size(); i++)
+    if (listenerAttach_[i])
+      listeners_[i] = dynamic_cast<ParameterListener*>(p.listeners_[i]->clone());
+}
+
+Parameter& Parameter::operator=(const Parameter& p)
+{
+  name_           = p.name_;
+  value_          = p.value_;
+  precision_      = p.precision_;
+  attach_         = p.attach_;
+  if (p.attach_ && p.constraint_)
+    constraint_   = p.constraint_->clone();
+  else
+    constraint_   = p.constraint_;
+  listeners_      = p.listeners_;
+  listenerAttach_ = p.listenerAttach_;
+  for (size_t i = 0; i < listeners_.size(); i++)
+    if (listenerAttach_[i])
+      listeners_[i] = dynamic_cast<ParameterListener*>(p.listeners_[i]->clone());
+  return *this;	
+}
+
+/** Destructor: ***************************************************************/
+
+Parameter::~Parameter()
+{
+  if (attach_ && constraint_) delete constraint_;
+  for (size_t i = 0; i < listeners_.size(); i++)
+    if (listenerAttach_[i])
+      delete listeners_[i];
+} 
+
+/** Value: ********************************************************************/
+
+void Parameter::setValue(double value) throw (ConstraintException)
+{
+  if (std::abs(value-value_)>precision_/2){
+    if (constraint_ && !constraint_->isCorrect(value)) 
+      throw ConstraintException("Parameter::setValue", this, value);
+    value_ = value;
+    ParameterEvent event(this);
+    fireParameterValueChanged(event);
+  }
+}
+
+/** Precision: ********************************************************************/
+
+void Parameter::setPrecision(double precision)
+{
+  precision_=(precision<0)?0:precision;
+}
+
+/** Constraint: ***************************************************************/
+
+void Parameter::setConstraint(Constraint* constraint, bool attach)
+{
+  if (!constraint){
+    if (constraint_ && attach_)
+      delete constraint_;
+    constraint_=0;
+    attach_=false;
+  }
+  else {
+    if (constraint->isCorrect(value_)) {
+      if (constraint_ && attach_)
+        delete constraint_;
+      constraint_ = constraint;
+      attach_= attach;
+    }
+  else throw ConstraintException("Parameter::setConstraint", this, value_);
+  }
+}
+
+
+const Constraint* Parameter::removeConstraint()
+{
+  const Constraint * c = constraint_;
+  constraint_ = 0;
+  return c;
+}
+
+/******************************************************************************/
+
+void Parameter::removeParameterListener(const std::string& listenerId)
+{
+  for (unsigned int i = 0; i < listeners_.size(); i++)
+    {
+      if (listeners_[i]->getId() == listenerId)
+        {
+          if (listenerAttach_[i]) delete listeners_[i];
+          listeners_.erase(listeners_.begin() + i);
+          listenerAttach_.erase(listenerAttach_.begin() + i);
+        }
+    }
+}
+
+/******************************************************************************/
+
+bool Parameter::hasParameterListener(const std::string& listenerId)
+{
+  for (unsigned int i = 0; i < listeners_.size(); i++)
+    if (listeners_[i]->getId() == listenerId)
+      return true;
+  return false;
+}
+
+/******************************************************************************/
+
+const IntervalConstraint Parameter::R_PLUS(true, 0, true);
+
+const IntervalConstraint Parameter::R_PLUS_STAR(true, 0, false);
+
+const IntervalConstraint Parameter::R_MINUS(false, 0, true);
+
+const IntervalConstraint Parameter::R_MINUS_STAR(false, 0, false);
+
+const IntervalConstraint Parameter::PROP_CONSTRAINT_IN(0, 1, true, true);
+
+const IntervalConstraint Parameter::PROP_CONSTRAINT_EX(0, 1, false, false);
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Parameter.h b/src/Bpp/Numeric/Parameter.h
new file mode 100644
index 0000000..9f3a99c
--- /dev/null
+++ b/src/Bpp/Numeric/Parameter.h
@@ -0,0 +1,328 @@
+//
+// File: Parameter.h
+// Created by: Julien Dutheil
+// Created on: Wed Oct 15 15:40:47 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _PARAMETER_H_
+#define _PARAMETER_H_
+
+#include "ParameterExceptions.h"
+#include "Constraints.h"
+#include "../Clonable.h"
+
+// From the STL:
+#include <string>
+#include <iostream>
+#include <vector>
+
+namespace bpp
+{
+
+  class Parameter;
+
+  class ParameterEvent:
+    public virtual Clonable
+  {
+  protected:
+    Parameter* parameter_;
+
+  public:
+    ParameterEvent(Parameter* parameter);
+    
+    ParameterEvent(const ParameterEvent& pe): parameter_(pe.parameter_) {}
+    ParameterEvent& operator=(const ParameterEvent& pe)
+    {
+      parameter_ = pe.parameter_;
+      return *this;
+    }
+
+    ParameterEvent* clone() const { return new ParameterEvent(*this); }
+
+  public:
+    const Parameter* getParameter() const { return parameter_; }
+    Parameter* getParameter() { return parameter_; }
+  };
+
+  /**
+   * @brief The parameter listener interface.
+   *
+   * Imlementing this interface allows to catch events associated to parameters modifications.
+   * Listeners must have an identifier that will be used to pinpoint it when attached to a list.
+   * This identifier needs not be unique though, but listeners with identical id will be undistinguishable.
+   */
+  class ParameterListener:
+    public virtual Clonable
+  {
+  public:
+    ParameterListener* clone() const = 0;
+
+  public:
+
+    /**
+     * @return The identifier of this listener.
+     */
+    virtual const std::string& getId() const = 0;
+
+    /**
+     * @brief Notify a renaming action.
+     *
+     * @param event Event associated to the acion.
+     */
+    virtual void parameterNameChanged(ParameterEvent& event) = 0;
+    
+    /**
+     * @brief Notify a value change.
+     *
+     * @param event Event associated to the acion.
+     */
+    virtual void parameterValueChanged(ParameterEvent& event) = 0;
+  };
+
+  /**
+   * @brief This class is designed to facilitate the manipulation of parameters.
+   *
+   * A parameter object contains a <i>value</i> stored as a double.
+   * It also contains a <i>name</i> and optionaly a constraint.
+   * Constraint objects allows to apply restriction on the value of the parameter,
+   * for instance positive number, or a particular interval and so on.
+   *
+   * @see ParameterList, Parametrizable, Constraint.
+   */
+  class Parameter:
+    public virtual Clonable
+  {
+  protected:
+    std::string name_;             //Parameter name
+    double value_;            //Parameter value
+    double precision_;  // Precision needed for Parameter value
+    Constraint* constraint_; //A constraint on the value
+    bool attach_;   // Tells if the constraint is attached to the Parameter
+    std::vector<ParameterListener*> listeners_;
+    std::vector<bool> listenerAttach_;
+  
+  public: // Class constructors and destructors:
+
+    /**
+     * @brief Default contructor. Creates a parameter with no name, no constraint, and a value of 0.
+     */
+    Parameter(): name_(""), value_(0), precision_(0), constraint_(0), attach_(true), listeners_(), listenerAttach_() {}
+    /**
+     * @brief Build a new parameter.
+     *
+     * @param name       The parameter name.
+     * @param value      The parameter value.
+     * @param constraint A  pointer toward a constraint Object.
+     * @param attachConstraint Tell if the constraint must be attached to this parameter, or shared
+     * @param precision An optional parameter precision (default 0)
+     * between different objects (the default behavior, for backward compatibility).
+     * If the first case, the constraint object will be destroyed when the parameter is destroyed,
+     * and duplicated when the parameter is copied.
+     * @throw ConstraintException If the parameter value does not match the contraint.
+     */
+    Parameter(const std::string& name, double value, Constraint* constraint, bool attachConstraint, double precision=0)
+      throw (ConstraintException);
+
+    /**
+     * @brief Build a new parameter.
+     *
+     * @param name       The parameter name.
+     * @param value      The parameter value.
+     * @param constraint An optional pointer toward a constraint Object. The constraint will be copied and attached to this instance.
+     * @param precision An optional parameter precision (default 0)
+     * @throw ConstraintException If the parameter value does not match the contraint.
+     */
+    Parameter(const std::string& name, double value, const Constraint* constraint = 0, double precision=0)
+      throw (ConstraintException);
+
+
+    /**
+     * @brief Copy constructor.
+     */
+    Parameter(const Parameter& param);
+    
+    /**
+     * @brief Assignment operator.
+     */
+    Parameter& operator=(const Parameter& param);
+  
+    virtual ~Parameter();
+    
+    Parameter* clone() const { return new Parameter(*this); }
+    
+  public:
+
+    /**
+     * @brief Set the name of this parameter.
+     *
+     * @param name the new parameter name.
+     */
+    virtual void setName(const std::string & name)
+    {
+      name_ = name;
+      ParameterEvent event(this);
+      fireParameterNameChanged(event);
+    }
+  
+    /**
+     * @brief Set the value of this parameter.
+     *
+     * @param value the new parameter value.
+     */
+    virtual void setValue(double value) throw (ConstraintException);
+  
+    /**
+     * @brief Set the precision of this parameter.
+     *
+     * @param precision the new parameter precision.
+     */
+    void setPrecision(double precision);
+    
+    /**
+     * @brief Get the name of this parameter.
+     *
+     * @return The parameter name.
+     */
+    virtual const std::string& getName() const { return name_; }
+  
+    /**
+     * @brief Get the value of this parameter.
+     *
+     * @return The parameter value.
+     */
+    virtual double getValue() const { return value_; }
+    
+    /**
+     * @brief Get the precision of this parameter.
+     *
+     * @return The precision value.
+     */
+    virtual double getPrecision() const { return precision_; }
+    
+    /**
+     * @brief Return the constraint associated to this parameter if there is one.
+     *
+     * @return A pointer toward the constraint, or NULL if there is no constraint.
+     */
+    virtual const Constraint* getConstraint() const { return constraint_; }
+    
+    /**
+     * @brief Return the constraint associated to this parameter if there is one.
+     *
+     * @return A pointer toward the constraint, or NULL if there is no constraint.
+     */
+    virtual Constraint* getConstraint() { return constraint_; }
+
+    /**
+     * @brief Tells if this parameter has a constraint.
+     *
+     * @return True if this parameter has a contraint.
+     */
+    virtual bool hasConstraint() const { return constraint_ != 0; }
+    
+    /**
+     * @brief Remove the constraint associated to this parameter.
+     *
+     * Warning! The contraint objet is not deleted.
+     *
+     * @return A pointer toward the formerly used contraint.
+     */
+    virtual const Constraint* removeConstraint();
+
+    /**
+     * @brief Set a constraint to this parameter.
+     *
+     * @param constraint a pointer to the constraint (may be null)
+     * @param attach says if the constraint is attached to the Parameter (default: false).
+     */
+    
+    virtual void setConstraint(Constraint* constraint, bool attach = false);
+
+    /**
+     * @brief Add a new listener to this parameter.
+     *
+     * @param listener The listener to add.
+     * @param attachListener Tell if the parameter will own this listener.
+     * If so, deep copies will be made when cloning the parameter, and the listener will be destroyed upon
+     * destruction of the parameter or upon removal. Alternatively, only superficial copies will be made,
+     * and the listener will persist if the parameter is destroyed.
+     */
+    virtual void addParameterListener(ParameterListener* listener, bool attachListener = true)
+    {
+      listeners_.push_back(listener);
+      listenerAttach_.push_back(attachListener);
+    }
+
+    /**
+     * @brief Remove all listeners with a given id from this parameter.
+     *
+     * @param listenerId The id of listener to remove.
+     */
+    virtual void removeParameterListener(const std::string& listenerId);
+
+    /**
+     * @brief Tell is there is a listener with a given id from this parameter.
+     *
+     * @param listenerId The id of listener to remove.
+     * @return True if at list one listener with the given id was found.
+     */
+    virtual bool hasParameterListener(const std::string& listenerId);
+
+  protected:
+    void fireParameterNameChanged(ParameterEvent& event)
+    {
+      for(std::vector<ParameterListener *>::iterator it = listeners_.begin(); it != listeners_.end(); it++)
+        (*it)->parameterNameChanged(event);
+    }
+    void fireParameterValueChanged(ParameterEvent& event)
+    {
+      for(std::vector<ParameterListener *>::iterator it = listeners_.begin(); it != listeners_.end(); it++)
+        (*it)->parameterValueChanged(event);
+    }
+  
+  public:
+    static const IntervalConstraint R_PLUS;
+    static const IntervalConstraint R_PLUS_STAR;
+    static const IntervalConstraint R_MINUS;
+    static const IntervalConstraint R_MINUS_STAR;
+    static const IntervalConstraint PROP_CONSTRAINT_IN;
+    static const IntervalConstraint PROP_CONSTRAINT_EX;
+  };
+
+} //end of namespace bpp.
+
+#endif  //_PARAMETER_H_
+
diff --git a/src/Bpp/Numeric/ParameterAliasable.h b/src/Bpp/Numeric/ParameterAliasable.h
new file mode 100644
index 0000000..b9c6f68
--- /dev/null
+++ b/src/Bpp/Numeric/ParameterAliasable.h
@@ -0,0 +1,194 @@
+//
+// File: ParameterAliasable.h
+// Created by: Julien Dutheil
+// Created on: Thu May 14 16:53 2009
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _PARAMETERALIASABLE_H_
+#define _PARAMETERALIASABLE_H_
+
+#include "Parametrizable.h"
+#include "ParameterExceptions.h"
+#include "ParameterList.h"
+
+//From the STL:
+#include <string>
+#include <map>
+
+namespace bpp
+{
+
+/**
+ * @brief Extend the Parametrizable interface with support for parameter aliases.
+ *
+ * Parameter aliases allows several parameter to be constrained together, and 
+ * for instance, be jointly estimated.
+ * The alias relationship is not symmetric:
+ * @code
+ * aliasParameters("a","b");
+ * @endcode
+ * results in the value of "b" being updated when a is modified, but a will not be updated upon modification of "a".
+ * "b" will also be removed of the list of "independent" parameters.
+ * Furthermore, a parameter can only be aliased with another one:
+ * @code
+ * aliasParameters("a","b");
+ * aliasParameters("c","b"); //ERROR, throws an exception.
+ * @endcode
+ * However, several parameters can be aliased to the same one:
+ * @code
+ * aliasParameters("a","b");
+ * aliasParameters("a","c");
+ * @endcode
+ * In this case, modifying "a" will automatically update the values of "b" and "c", and "b" and "c" are removed from the list of indepedent parameters.
+ * Finally, parameters can be chained:
+ * @code
+ * aliasParameters("a","b");
+ * aliasParameters("b","c");
+ * @endcode
+ * is equivallent to the previous example.
+ */
+  class ParameterAliasable :
+    public virtual Parametrizable
+  {
+  public:
+    ParameterAliasable() {}
+    virtual ~ParameterAliasable() {}
+
+  public:
+
+    /**
+     * @brief Get the number of independent parameters.
+     *
+     * @return The number of independent parameters.
+     * If no parameters are aliased, this is equivalent to the getNumberOfParameters() method.
+     */
+    virtual size_t getNumberOfIndependentParameters() const = 0;
+
+    /**
+     * @brief Set two parameters as 'aliased'.
+     *
+     * The values of the two parameters will be synchronized, so that setting the value of one parameter will automatically set the value of the other one accordingly.
+     * @param p1 Original parameter.
+     * @param p2 Aliased parameter.
+     * @throw ParameterNotFoundException if p1 or p2 do not correspond to existing parameters.
+     * @throw Exception when trying to perform non-valid association.
+     */
+    virtual void aliasParameters(const std::string & p1, const std::string & p2) throw (ParameterNotFoundException, Exception) = 0; 
+
+    /**
+     * @brief alias the parameters following the links described in a
+     * map, and update the object accordingly. Cycles in aliasing are
+     * detected and forbidden.
+     *
+     * @param unparsedParams the map of the links : <A,B> matches for A->B aliasing.
+     * @param verbose verbosity
+     *
+     **/
+    
+    virtual void aliasParameters(std::map<std::string, std::string>& unparsedParams, bool verbose) = 0;
+
+    /**
+     * @brief Detach two parameters previously set as 'aliased'.
+     *
+     * The values of the two parameters will now be independent.
+     * @param p1 Original parameter.
+     * @param p2 Aliased parameter.
+     * @throw ParameterNotFoundException if p1 or p2 do not correspond to existing parameters.
+     * @throw Exception when trying to perform non-valid dissociation.
+     */
+    virtual void unaliasParameters(const std::string & p1, const std::string & p2) throw (ParameterNotFoundException, Exception)  = 0;
+
+    /**
+     * @brief Get the minimal list of parameters to set the model.
+     *
+     * If no parameters are aliased, this is the same a getParameters().
+     *
+     * @return A minimal set of parameters.
+     */
+    virtual const ParameterList & getIndependentParameters() const = 0;
+
+    /**
+     * @return The list of names of the parameters that are aliased with a given parameter.
+     * Depending on the implementation, the function may be recursive or not...
+     * @param name The name of the parameter to look for.
+     */
+    virtual std::vector<std::string> getAlias(const std::string& name) const = 0;
+
+    /**
+     * @return the map of the aliases.
+     *
+     **/
+    
+    virtual std::map<std::string, std::string> getAliases() const = 0;
+
+  };
+
+
+
+
+/**
+ * @brief A low-level implementation of the ParameterAliasable interface with void functions.
+ *
+ * @see Parameter, ParameterList, ParameterAliasable
+ */
+  class ParameterAliasableAdapter:
+    public ParametrizableAdapter
+  {
+  public:
+    ParameterAliasableAdapter() {}
+    virtual ~ParameterAliasableAdapter() {}
+
+  public:
+
+    /**
+     * @name The ParameterAliasable interface.
+     *
+     * @{
+     */
+    const ParameterList & getIndependentParameters() const { return getParameters(); }
+    void aliasParameters(const std::string & p1, const std::string & p2) throw (ParameterNotFoundException, Exception) {}
+    void unaliasParameters(const std::string & p1, const std::string & p2) throw (ParameterNotFoundException, Exception) {}
+    unsigned int getNumberOfIndependentParameters() const{ return 0; }
+    std::vector<std::string> getAlias(const std::string& name) const { return std::vector<std::string>(); }
+    std::map<std::string, std::string> getAliases() const { return std::map<std::string, std::string>(); }
+    /** @} */
+
+  };
+
+} // end of namespace bpp.
+
+#endif // _PARAMETERALIASABLE_H_
+
diff --git a/src/Bpp/Seq/SequenceExceptions.cpp b/src/Bpp/Numeric/ParameterExceptions.cpp
similarity index 61%
rename from src/Bpp/Seq/SequenceExceptions.cpp
rename to src/Bpp/Numeric/ParameterExceptions.cpp
index a85679c..d06f268 100644
--- a/src/Bpp/Seq/SequenceExceptions.cpp
+++ b/src/Bpp/Numeric/ParameterExceptions.cpp
@@ -1,14 +1,14 @@
 //
-// File: SequenceExceptions.cpp
+// File: ParameterExceptions.cpp
 // Created by: Julien Dutheil
-// Created on: Mon Nov  3 16:35:30 2003
+// Created on: Mon Nov  3 18:05:36 2003
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,32 +37,39 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SequenceExceptions.h"
-#include "Sequence.h"
+#include "ParameterExceptions.h"
+#include "Parameter.h"
+
+// From Utils:
+#include "../Text/TextTools.h"
 
 using namespace bpp;
 using namespace std;
 
 /******************************************************************************/
-	
-SequenceException::SequenceException(const std::string& text, const Sequence* seq) :
-	Exception("SequenceException: " + text + (seq != 0 ? "(" + seq->getName() + ")" : string(""))),
-	sequence_(seq) {};
 
-/******************************************************************************/
-	
-EmptySequenceException::EmptySequenceException(const std::string& text, const Sequence* seq) :
-	SequenceException("EmptySequenceException: " + text, seq) {};
+ParameterException::ParameterException(const std::string& text, const Parameter* param) :
+	Exception("ParameterException: " + text + (param != 0 ? "(" + param -> getName() + ")" : string(""))),
+	parameter_(param) {};
 		
+const Parameter* ParameterException::getParameter() const { return parameter_; }
+
 /******************************************************************************/
+
+ConstraintException::ConstraintException(const std::string& text, const Parameter* param, double badValue) :
+	ParameterException("ConstraintException: " + text + "(" + TextTools::toString(badValue) + ")"
+      + (param->hasConstraint() ? param->getConstraint()->getDescription() : "no constraint"), param),
+	badValue_(badValue) {};
 		
-SequenceWithGapException::SequenceWithGapException(const std::string& text, const Sequence* seq) :
-	SequenceException("SequenceWithGapException: " + text, seq) {};
-		
+double ConstraintException::getBadValue() const { return badValue_; }
+
 /******************************************************************************/
-	
-SequenceNotAlignedException::SequenceNotAlignedException(const std::string& text, const Sequence* seq) :
-	SequenceException("SequenceNotAlignedException: " + text, seq) {};
+
+ParameterNotFoundException::ParameterNotFoundException(const string& text, const string& param) :
+	Exception("ParameterNotFoundException: " + text + (!TextTools::isEmpty(param) ? "(" + param + ")" : string(""))),
+	parameter_(param) {};
 		
+std::string ParameterNotFoundException::getParameter() const { return parameter_; }
+
 /******************************************************************************/
 
diff --git a/src/Bpp/Numeric/ParameterExceptions.h b/src/Bpp/Numeric/ParameterExceptions.h
new file mode 100644
index 0000000..72ce6d3
--- /dev/null
+++ b/src/Bpp/Numeric/ParameterExceptions.h
@@ -0,0 +1,164 @@
+//
+// File: ParameterExceptions.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov  3 18:05:36 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _PARAMETEREXCEPTIONS_H_
+#define _PARAMETEREXCEPTIONS_H_
+
+// From Utils:
+#include "../Exceptions.h"
+
+// From the STL:
+#include <string>
+
+namespace bpp
+{
+
+class Parameter;
+
+/**
+ * @brief The parameter exception base class.
+ *
+ * @see Exception
+ */
+class ParameterException :
+  public Exception
+{
+
+	private:
+		const Parameter* parameter_;
+			
+	public:	// Class constructors and destructor:
+		/**
+		 * @brief Build a new ParameterException object.
+		 *
+		 * @param text A message to be passed to the exception hierarchy.
+		 * @param param A const pointer toward the parameter that threw the exception.
+		 */	
+		ParameterException(const std::string& text, const Parameter* param);
+
+    ParameterException(const ParameterException& pe):
+      Exception(pe),
+      parameter_(pe.parameter_) {} //We explicitely do not want to make a hard copy of the pointer here.
+
+    ParameterException& operator=(const ParameterException& pe)
+    {
+      Exception::operator=(pe);
+      parameter_ = pe.parameter_;
+      return *this;
+    }
+	
+		virtual ~ParameterException() throw () {}
+		
+	public:
+		/**
+		 * @brief Get the parameter that threw the exception.
+		 *
+		 * @return A const pointer toward the parameter.
+		 */
+		virtual const Parameter * getParameter() const;
+};
+
+/**
+ * @brief Exception thrown when a value do not match a given constraint.
+ *
+ * @see Constraint
+ */
+class ConstraintException : public ParameterException
+{
+	
+	private:
+		double badValue_;
+	
+	public: // Class constructor and destructor:
+		/**
+		 * @brief Build a new ConstraintException object.
+		 *
+		 * @param text     A message to be passed to the exception hierarchy.
+		 * @param param    A const pointer toward the parameter that threw the exception.
+		 * @param badValue The value that doesn't match the constraint.
+		 */	
+		ConstraintException(const std::string& text, const Parameter* param, double badValue);
+
+		virtual ~ConstraintException() throw () {}
+	
+	public:
+		/**
+		 * @brief Get the value that doesn't match the constraint.
+		 *
+		 * @return The faulty value.
+		 */
+		virtual double getBadValue() const;
+};
+
+/*******************************************************************************/
+
+/**
+ * @brief Exception thrown when a parameter is not found,
+ * for instance in a ParameterList.
+ */
+class ParameterNotFoundException : public Exception
+{
+
+	private:
+		const std::string parameter_;
+			
+	public:	// Class constructors and destructor:
+		/**
+		 * @brief Build a new ParameterNotFoundException object.
+		 *
+		 * @param text     A message to be passed to the exception hierarchy.
+		 * @param param    The name of the parameter not found.
+		 */	
+		ParameterNotFoundException(const std::string& text, const std::string& param = "");
+	
+		virtual ~ParameterNotFoundException() throw () {}
+		
+	public:
+		/**
+		 * @brief Get the name of the parameter not found.
+		 *
+		 * @return The parameter name.
+		 */
+		virtual std::string getParameter() const;		
+};
+
+} //end of namespace bpp.
+
+#endif	//_PARAMETEREXCEPTIONS_H_
+
diff --git a/src/Bpp/Numeric/ParameterList.cpp b/src/Bpp/Numeric/ParameterList.cpp
new file mode 100644
index 0000000..35f8c34
--- /dev/null
+++ b/src/Bpp/Numeric/ParameterList.cpp
@@ -0,0 +1,593 @@
+//
+// File: ParameterList.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Oct 15 18:17:29 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "ParameterList.h"
+#include "../Text/StringTokenizer.h"
+
+using namespace bpp;
+
+#include <iostream>
+#include <algorithm>
+using namespace std;
+
+/** Copy constructor: *********************************************************/
+
+ParameterList::ParameterList(const ParameterList& pl) :
+  parameters_(pl.size())
+{
+  // Now copy all parameters:
+  for (size_t i = 0; i < size(); i++)
+  {
+    parameters_[i] = shared_ptr<Parameter>(pl.parameters_[i]->clone());
+  }
+}
+
+/** Assignation operator: *****************************************************/
+
+ParameterList& ParameterList::operator=(const ParameterList& pl)
+{
+  // Then resize the vector:
+  parameters_.resize(pl.size());
+
+  // Now copy all parameters:
+  for (size_t i = 0; i < pl.size(); i++)
+  {
+    parameters_[i] = shared_ptr<Parameter>(pl.parameters_[i]->clone());
+  }
+
+  return *this;
+}
+
+/** Destructor: ***************************************************************/
+
+ParameterList::~ParameterList()
+{
+  // Delete all parameter objects.
+  reset();
+}
+
+/******************************************************************************/
+
+const Parameter& ParameterList::getParameter(const std::string& name) const throw (ParameterNotFoundException)
+{
+  for (size_t i = 0; i < size(); i++)
+  {
+    const Parameter* p = parameters_[i].get();
+    if (p->getName() == name) return *p;
+  }
+  throw ParameterNotFoundException("ParameterList::getParameter('name').", name);
+}
+
+/******************************************************************************/
+
+const shared_ptr<Parameter>& ParameterList::getSharedParameter(const std::string& name) const throw (ParameterNotFoundException)
+{
+  for (size_t i = 0; i < size(); i++)
+  {
+    const shared_ptr<Parameter>& p = parameters_[i];
+    if (p->getName() == name)
+      return p;
+  }
+  throw ParameterNotFoundException("ParameterList::getSharedParameter('name').", name);
+}
+
+
+/******************************************************************************/
+
+double ParameterList::getParameterValue(const std::string& name) const throw (ParameterNotFoundException)
+{
+  for (size_t i = 0; i < size(); i++)
+  {
+    const Parameter* p = parameters_[i].get();
+    if (p->getName() == name) return p->getValue();
+  }
+  throw ParameterNotFoundException("ParameterList::getParameterValue('name').", name);
+}
+
+/******************************************************************************/
+
+Parameter& ParameterList::getParameter(const std::string& name) throw (ParameterNotFoundException)
+{
+  for (size_t i = 0; i < size(); i++)
+  {
+    Parameter* p = parameters_[i].get();
+    if (p->getName() == name) return *p;
+  }
+  throw ParameterNotFoundException("ParameterList::getParameter('name').", name);
+}
+
+/******************************************************************************/
+
+shared_ptr<Parameter>& ParameterList::getSharedParameter(const std::string& name) throw (ParameterNotFoundException)
+{
+  for (size_t i = 0; i < size(); i++)
+  {
+    shared_ptr<Parameter>& p = parameters_[i];
+    if (p->getName() == name)
+      return p;
+  }
+  throw ParameterNotFoundException("ParameterList::getSharedParameter('name').", name);
+}
+
+
+/******************************************************************************/
+
+ParameterList ParameterList::subList(const std::vector<std::string>& names) const throw (ParameterNotFoundException)
+{
+  ParameterList pl;
+  for (size_t i = 0; i < names.size(); i++)
+  {
+    Parameter param = getParameter(names[i]);
+    pl.addParameter(param);
+  }
+  return pl;
+}
+
+/******************************************************************************/
+
+ParameterList ParameterList::subList(const std::string& name) const throw (ParameterNotFoundException)
+{
+  ParameterList pl;
+  Parameter param = getParameter(name);
+  pl.addParameter(param);
+  return pl;
+}
+
+/******************************************************************************/
+
+ParameterList ParameterList::subList(const std::vector<size_t>& parameters) const
+{
+  ParameterList pl;
+  for (size_t i = 0; i < parameters.size(); i++)
+  {
+    if (parameters[i] < size())
+      pl.parameters_.push_back(shared_ptr<Parameter>(parameters_[parameters[i]]->clone()));
+  }
+  return pl;
+}
+
+/******************************************************************************/
+
+ParameterList ParameterList::subList(size_t parameter) const
+{
+  ParameterList pl;
+  if (parameter < size())
+    pl.parameters_.push_back(shared_ptr<Parameter>(parameters_[parameter]->clone()));
+  return pl;
+}
+
+/******************************************************************************/
+
+ParameterList ParameterList::getCommonParametersWith(const ParameterList& params) const
+{
+  ParameterList pl;
+  for (size_t i = 0; i < params.size(); i++)
+  {
+    const Parameter& p = params[i];
+    if (hasParameter(p.getName()))
+      pl.parameters_.push_back(shared_ptr<Parameter>(p.clone()));
+    // We use push_back instead of addParameter because we are sure the name is not duplicated.
+  }
+
+  return pl;
+}
+
+/******************************************************************************/
+
+std::vector<std::string> ParameterList::getParameterNames() const
+{
+  vector<string> pNames(size());
+  for (size_t i = 0; i < size(); i++)
+  {
+    pNames[i] = parameters_[i]->getName();
+  }
+  return pNames;
+}
+
+/****************************************************************************/
+
+vector<string> ParameterList::getMatchingParameterNames(const string& pattern) const
+{
+  vector<string> pNames;
+  for (size_t i = 0; i < size(); i++)
+    {
+      string name = parameters_[i]->getName();
+
+      StringTokenizer stj(pattern, "*", true, false);
+      size_t pos1, pos2;
+      bool flag(true);
+      string g=stj.nextToken();
+      pos1=name.find(g);
+      if (pos1!=0)
+        flag=false;
+      pos1+=g.length();
+      while (flag && stj.hasMoreToken()){
+        g=stj.nextToken();
+        pos2=name.find(g,pos1);
+        if (pos2 == string::npos){
+          flag=false;
+          break;
+        }
+        pos1=pos2+g.length();
+      }
+      if (flag &&
+          ((g.length()==0) || (pos1==name.length()) || (name.rfind(g)==name.length()-g.length())))
+        pNames.push_back(name);
+    }
+
+  return pNames;
+}
+
+/******************************************************************************/
+
+void ParameterList::addParameter(const Parameter& param) throw (ParameterException)
+{
+  if (hasParameter(param.getName()))
+    throw ParameterException("ParameterList::addParameter. Parameter with name '" + param.getName() + "' already exists.", &param);
+  parameters_.push_back(shared_ptr<Parameter>(param.clone()));
+  
+}
+
+/******************************************************************************/
+
+void ParameterList::addParameter(Parameter* param) throw (ParameterException)
+{
+  if (hasParameter(param->getName()))
+    throw ParameterException("ParameterList::addParameter. Parameter with name '" + param->getName() + "' already exists.", param);
+  parameters_.push_back(shared_ptr<Parameter>(param));
+}
+
+/******************************************************************************/
+
+void ParameterList::shareParameter(const std::shared_ptr<Parameter>& param) throw (ParameterException)
+{
+  if (hasParameter(param->getName()))
+    setParameterValue(param->getName(), param->getValue());
+  else
+    parameters_.push_back(param);
+}
+
+
+/******************************************************************************/
+
+void ParameterList::setParameter(size_t index, const Parameter& param) throw (IndexOutOfBoundsException)
+{
+  if (index >= size()) throw IndexOutOfBoundsException("ParameterList::setParameter.", index, 0, size());
+  parameters_[index] = shared_ptr<Parameter>(param.clone());
+}
+
+
+/******************************************************************************/
+
+void ParameterList::includeParameters(const ParameterList& params)
+{
+  for (size_t i = 0; i < params.size(); i++)
+  {
+    if (hasParameter(params[i].getName()))
+      setParameterValue(params[i].getName(), params[i].getValue());
+    else
+      parameters_.push_back(shared_ptr<Parameter>(params[i].clone()));
+  }
+}
+
+/******************************************************************************/
+
+void ParameterList::addParameters(const ParameterList& params)
+throw (ParameterException)
+{
+  for (size_t i = 0; i < params.size(); i++)
+  {
+    addParameter(params[i]);
+  }
+}
+
+/******************************************************************************/
+
+void ParameterList::shareParameters(const ParameterList& params)
+  throw (ParameterException)
+{
+  for (size_t i = 0; i < params.size(); i++)
+  {
+    shareParameter(params.getSharedParameter(i));
+  }
+}
+
+/******************************************************************************/
+
+void ParameterList::setParameterValue(const string& name, double value)
+throw (ParameterNotFoundException, ConstraintException)
+{
+  Parameter* p = &getParameter(name);
+  p->setValue(value);
+}
+
+/******************************************************************************/
+
+void ParameterList::setAllParametersValues(const ParameterList& params)
+throw (ParameterNotFoundException, ConstraintException)
+{
+  // First we check if all values are correct:
+  for (vector<shared_ptr<Parameter> >::iterator it = parameters_.begin(); it < parameters_.end(); it++)
+  {
+    const Parameter* p = &params.getParameter((*it)->getName());
+    if ((*it)->hasConstraint() && !(*it)->getConstraint()->isCorrect(p->getValue()))
+      throw ConstraintException("ParameterList::setParametersValues()", (*it).get(), p->getValue());
+  }
+
+  // If all values are ok, we set them:
+  for (vector<shared_ptr<Parameter> >::iterator it = parameters_.begin(); it < parameters_.end(); it++)
+  {
+    const Parameter* p = &params.getParameter((*it)->getName());
+    (*it)->setValue(p->getValue());
+  }
+}
+
+/******************************************************************************/
+
+void ParameterList::setParametersValues(const ParameterList& params)
+{
+  // First we check if all values are correct:
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    if (hasParameter((*it)->getName()))
+    {
+      Parameter* p = &getParameter((*it)->getName());
+      if (p->hasConstraint() && !p->getConstraint()->isCorrect((*it)->getValue()))
+        throw ConstraintException("ParameterList::setParametersValues()", p, (*it)->getValue());
+    }
+  }
+
+  // If all values are ok, we set them:
+  {
+    for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+    {
+      if (hasParameter((*it)->getName()))
+      {
+        Parameter* p = &getParameter((*it)->getName());
+        p->setValue((*it)->getValue());
+      }
+    }
+  }
+}
+
+/******************************************************************************/
+
+bool ParameterList::testParametersValues(const ParameterList& params) const
+{
+  // First we check if all values are correct:
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    if (hasParameter((*it)->getName()))
+    {
+      const Parameter* p = &getParameter((*it)->getName());
+      if (p->hasConstraint() && !p->getConstraint()->isCorrect((*it)->getValue()))
+        throw ConstraintException("ParameterList::testParametersValues()", p, (*it)->getValue());
+    }
+  }
+
+  // If all values are ok, we test them:
+  bool ch = 0;
+
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    if (hasParameter((*it)->getName()))
+    {
+      const Parameter* p = &getParameter((*it)->getName());
+      if (p->getValue() != (*it)->getValue())
+        ch |= 1;
+    }
+  }
+  return ch;
+}
+
+/******************************************************************************/
+
+bool ParameterList::matchParametersValues(const ParameterList& params, vector<size_t>* updatedParameters)
+throw (ConstraintException)
+{
+  // First we check if all values are correct:
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    if (hasParameter((*it)->getName()))
+    {
+      Parameter* p = &getParameter((*it)->getName());
+      if (p->hasConstraint() && !p->getConstraint()->isCorrect((*it)->getValue()))
+        throw ConstraintException("ParameterList::matchParametersValues()", p, (*it)->getValue());
+    }
+  }
+
+  // If all values are ok, we set them:
+  bool ch = 0;
+
+  size_t pos = 0;
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    if (hasParameter((*it)->getName()))
+    {
+      Parameter* p = &getParameter((*it)->getName());
+      if (p->getValue() != (*it)->getValue()) {
+        ch |= 1;
+        p->setValue((*it)->getValue());
+        if (updatedParameters)
+          updatedParameters->push_back(pos);
+      }
+    }
+    pos++;
+  }
+  return ch;
+}
+
+/******************************************************************************/
+void ParameterList::setAllParameters(const ParameterList& params)
+throw (ParameterNotFoundException)
+{
+  for (vector<shared_ptr<Parameter> >::iterator it = parameters_.begin(); it < parameters_.end(); it++)
+  {
+    const Parameter* p = &params.getParameter((*it)->getName());
+    **it = *p;
+  }
+}
+
+/******************************************************************************/
+void ParameterList::setParameters(const ParameterList& params)
+throw (ParameterNotFoundException)
+{
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    Parameter* p = &getParameter((*it)->getName());
+    *p = **it;
+  }
+}
+
+/******************************************************************************/
+bool ParameterList::hasParameter(const std::string& name) const
+{
+  for (unsigned int i = 0; i < size(); i++)
+  {
+    const Parameter* p = parameters_[i].get();
+    if (p->getName() == name)
+      return true;
+  }
+  return false;
+}
+
+/******************************************************************************/
+void ParameterList::matchParameters(const ParameterList& params)
+{
+  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
+  {
+    if (hasParameter((*it)->getName()))
+    {
+      Parameter* p = &getParameter((*it)->getName());
+      *p = **it;
+    }
+  }
+}
+
+/******************************************************************************/
+void ParameterList::deleteParameter(const std::string& name) throw (ParameterNotFoundException)
+{
+  for (unsigned int i = 0; i < size(); i++)
+  {
+    Parameter* p = parameters_[i].get();
+    
+    if (p->getName() == name)
+    {
+      parameters_.erase(parameters_.begin() + i);
+      return;
+    }
+  }
+  throw ParameterNotFoundException("ParameterList::deleteParameter", name);
+}
+
+/******************************************************************************/
+void ParameterList::deleteParameters(const std::vector<std::string>& names, bool mustExist) throw (ParameterNotFoundException)
+{
+  for (unsigned int i = 0; i < names.size(); i++)
+  {
+    try
+    {
+      deleteParameter(names[i]);
+    }
+    catch (ParameterNotFoundException& e)
+    {
+      if (mustExist)
+        throw ParameterNotFoundException(e);
+      else
+        continue;
+    }
+  }
+}
+
+/******************************************************************************/
+void ParameterList::deleteParameter(size_t index) throw (IndexOutOfBoundsException)
+{
+  if (index >= size()) throw IndexOutOfBoundsException("ParameterList::deleteParameter.", index, 0, size());
+  // Parameter* p = parameters_[index].get();
+  // delete p;
+  parameters_.erase(parameters_.begin() + static_cast<ptrdiff_t>(index));
+}
+
+/******************************************************************************/
+void ParameterList::deleteParameters(const std::vector<size_t>& indices) throw (IndexOutOfBoundsException)
+{
+  vector<size_t> tmp(indices);
+  sort(tmp.begin(), tmp.end());
+  for (vector<size_t>::reverse_iterator i = tmp.rbegin(); i != tmp.rend(); i++)
+  {
+    size_t index = *i;
+    if (index >= size()) throw IndexOutOfBoundsException("ParameterList::deleteParameter.", index, 0, size());
+//    Parameter* p = parameters_[index].get();
+//    delete p;
+    parameters_.erase(parameters_.begin() + static_cast<ptrdiff_t>(index));
+  }
+}
+
+/******************************************************************************/
+size_t ParameterList::whichParameterHasName(const std::string& name) const throw (ParameterNotFoundException)
+{
+  for (size_t i = 0; i < size(); i++)
+  {
+    if (parameters_[i]->getName() == name) return i;
+  }
+  throw ParameterNotFoundException("ParameterList::whichParameterHasName.", name);
+}
+
+/******************************************************************************/
+void ParameterList::printParameters(OutputStream& out) const
+{
+  (out << "Name:\tValue:\tConstraint:").endLine();
+  (out << "_________________________________________________").endLine();
+  for (unsigned int i = 0; i < size(); i++)
+  {
+    out << parameters_[i]->getName();
+    out << "\t" << parameters_[i]->getValue();
+    out << (parameters_[i]->hasConstraint() ? "\t" + parameters_[i]->getConstraint()->getDescription() : string(""));
+    out.endLine();
+  }
+}
+
+/******************************************************************************/
+void ParameterList::reset()
+{
+  parameters_.resize(0);
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/ParameterList.h b/src/Bpp/Numeric/ParameterList.h
new file mode 100644
index 0000000..fb47c2d
--- /dev/null
+++ b/src/Bpp/Numeric/ParameterList.h
@@ -0,0 +1,439 @@
+//
+// File: ParameterList.h
+// Created by: Julien Dutheil
+// Created on: Wed Oct 15 18:17:29 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _PARAMETERLIST_H_
+#define _PARAMETERLIST_H_
+
+#include "Parameter.h"
+#include "../Clonable.h"
+#include "../Io/OutputStream.h"
+
+// From STL:
+#include <vector>
+#include <string>
+#include <iostream>
+
+namespace bpp
+{
+/**
+ * @brief The parameter list object.
+ *
+ * @author Julien Dutheil, Laurent Gueguen
+ * This is a vector of Parameter with a few additional methods, mainly for giving
+ * name access.
+ */
+class ParameterList :
+  public Clonable
+{
+private:
+  std::vector<std::shared_ptr<Parameter> > parameters_;
+
+public:
+  /**
+   * @brief Build a new ParameterList object.
+   */
+  ParameterList() : parameters_() {}
+
+  /**
+   * @brief Copy constructor
+   *
+   * All parameters in the list will be cloned.
+   */
+  ParameterList(const ParameterList& pl);
+
+  ParameterList& operator=(const ParameterList& pl);
+
+  ParameterList* clone() const { return new ParameterList(*this); }
+
+  virtual ~ParameterList();
+
+public:
+  /**
+   * @return The number of parameters in the list.
+   */
+  size_t size() const { return parameters_.size(); }
+
+  /**
+   * @return The parameter at a given position.
+   * @warning No check is performed on the validity of the index given as input!
+   */
+  virtual const Parameter& operator[](size_t i) const { return *parameters_[i]; }
+  virtual Parameter& operator[](size_t i) { return *parameters_[i]; }
+
+  /**
+   * @return The shared_ptr parameter at a given position.
+   * @warning No check is performed on the validity of the index given as input!
+   */
+  virtual const std::shared_ptr<Parameter>& getSharedParameter(size_t i) const { return parameters_[i]; }
+  virtual std::shared_ptr<Parameter>& getSharedParameter(size_t i) { return parameters_[i]; }
+
+  /**
+   * @brief Get the parameter with name <i>name</i>.
+   *
+   * @param name The name of the parameter to look for.
+   * @return A const reference toward the parameter with name <i>name</i>.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+  virtual const Parameter& getParameter(const std::string& name) const throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get the parameter with name <i>name</i> as a shared pointer.
+   *
+   * @param name The name of the parameter to look for.
+   * @return A const shared parameter toward the parameter with name <i>name</i>.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+  virtual const std::shared_ptr<Parameter>& getSharedParameter(const std::string& name) const throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get the value of the parameter with name <i>name</i>.
+   *
+   * @param name The name of the parameter to look for.
+   * @return A value of the parameter with name <i>name</i>.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+
+  virtual double getParameterValue(const std::string& name) const throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get the parameter with name <i>name</i>.
+   *
+   * @param name The name of the parameter to look for.
+   * @return A reference toward the parameter with name <i>name</i>.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+  virtual Parameter& getParameter(const std::string& name) throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get the parameter with name <i>name</i> as a shared pointer.
+   *
+   * @param name The name of the parameter to look for.
+   * @return A shared parameter toward the parameter with name <i>name</i>.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+  virtual std::shared_ptr<Parameter>& getSharedParameter(const std::string& name) throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get given parameters as a sublist.
+   *
+   * @param names Name of the parameters to be included in the list.
+   * @return A list with all parameters specified.
+   * @throw ParameterNotFoundException If at least one name does not correspond to a parameter in the list.
+   */
+  virtual ParameterList subList(const std::vector<std::string>& names) const throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get given parameter as a sublist.
+   *
+   * @param name Name of the parameter to be included in the list.
+   * @return A list with the parameter specified.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+  virtual ParameterList subList(const std::string& name) const throw (ParameterNotFoundException);
+
+  /**
+   * @brief Get given parameters as a sublist.
+   *
+   * @param parameters Positions of the parameters to be included in the list.
+   * @return A list with all parameters specified.
+   */
+  virtual ParameterList subList(const std::vector<size_t>& parameters) const;
+
+  /**
+   * @brief Get given parameter as a sublist.
+   *
+   * @param parameter Position of the parameters to be included in the list.
+   * @return A list with the parameter specified.
+   */
+  virtual ParameterList subList(size_t parameter) const;
+
+  /**
+   * @brief Get the sublist containing all common parameter between this list and pl.
+   *
+   * @param params The list to compare to.
+   * @return A list with all common parameters.
+   */
+  virtual ParameterList getCommonParametersWith(const ParameterList& params) const;
+
+  /**
+   * @brief Get all parameter names in the list.
+   *
+   * @return A vector with all names in the same order as the parameters in the list.
+   */
+  virtual std::vector<std::string> getParameterNames() const;
+
+  /**
+   * @brief Get all parameter names matching with the given name. Up
+   * to now, only "*" jokers are available.
+   *
+   * @param pattern a pattern of name
+   * @return A vector of matching names
+   */
+  
+  virtual std::vector<std::string> getMatchingParameterNames(const std::string& pattern) const;
+
+  /**
+   * @brief Add a new parameter at the end of the list.
+   *
+   * @param param The parameter to add to the list.
+   */
+  virtual void addParameter(const Parameter& param) throw (ParameterException);
+
+  /**
+   * @brief Add a new parameter at the end of the list.
+   *
+   * This function is more efficient than its reference counterpart,
+   * as it avoid an object copy. The ParameterList will own the pointer
+   * after addition, if it is successful.
+   *
+   * @param param A ppointer toward the parameter to add to the list.
+   */
+
+  virtual void addParameter(Parameter* param) throw (ParameterException);
+
+  /**
+   * @brief Share a parameter at the end of the list.
+   *
+   * @param param The shared_ptr parameter to add to the list.
+   */
+  
+  virtual void shareParameter(const std::shared_ptr<Parameter>& param) throw (ParameterException);
+
+
+  /**
+   * @brief Change given parameter.
+   *
+   * @param index The position of the parameter to alter.
+   * @param param The parameter to add to the list.
+   * @throw IndexOutOfBoundsException if the index is not valid.
+   */
+  
+  virtual void setParameter(size_t index, const Parameter& param) throw (IndexOutOfBoundsException);
+
+//  virtual void setParameter(size_t index, Parameter* param) throw (IndexOutOfBoundsException);
+
+  /**
+   * @brief Add new parameters at the end of the list.
+   *
+   * @param params The parameter list containing the new parameters to
+   * add to the list.
+   */
+  virtual void addParameters(const ParameterList& params) throw (ParameterException);
+
+  /**
+   * @brief Share parameters with a given list. They are added the end of this list.
+   *
+   * @param params The parameter list containing the parameters to
+   * share with to the list.
+   */
+  
+  virtual void shareParameters(const ParameterList& params) throw (ParameterException);
+
+  /**
+   * @brief Add parameters to the list. If the parameter already
+   * exists, only the value is updated, otherwise the new parameter is
+   * added at the end of the list.
+   *
+   * @param params The parameter list containing the new paramters to add to the list.
+   */
+  virtual void includeParameters(const ParameterList& params);
+
+  /**
+   * @brief Set the value of parameter with name <i>name</i> to be equal to <i>value</i>.
+   *
+   * @param name the name of the parameter to set.
+   * @param value The value of the parameter.
+   * @throw ParameterNotFoundException If no parameter with the given name is found in the list.
+   * @throw ConstraintException If the value is incorrect.
+   */
+  virtual void setParameterValue(const std::string& name, double value)
+    throw (ParameterNotFoundException, ConstraintException);
+
+  /**
+   * @brief Set the parameters to be equals to <i>params</i>.
+   *
+   * The list must contain exactly the same parameters (ie same names)
+   * than the parameters available.
+   *
+   * @param params A list with all parameters.
+   * @see setParameters(), matchParameters();
+   * @throw ParameterNotFoundException If at least one name does not correspond to a parameter in the list.
+   * @throw ConstraintException If one value is incorrect (and the two parameter list do not have the same constraints).
+   */
+  virtual void setAllParametersValues(const ParameterList& params)
+    throw (ParameterNotFoundException, ConstraintException);
+
+  /**
+   * @brief Update the parameters from the ones in <i>params</i>
+   * that have matching names.
+   *
+   * @param params A list containing all parameters to update.
+   * @see setAllParameters(), matchParameters()
+   * @throw ConstraintException If one value is incorrect (and the two parameter list do not have the same constraints).
+   */
+  virtual void setParametersValues(const ParameterList& params);
+
+  /**
+   * @brief Returns true if the Parameter of the given name exists.
+   *
+   * @name A string name
+   */
+  virtual bool hasParameter(const std::string& name) const;
+
+  /**
+   * @brief Tests the parameters from <i>params</i>.
+   *
+   * Only common parameters with <i>params</i> are compared.
+   *
+   * @param params A list of parameters.
+   * @return true iff a least one parameter value is different.
+   */
+  virtual bool testParametersValues(const ParameterList& params) const;
+
+  /**
+   * @brief Update the parameters from <i>params</i>.
+   *
+   * Only common parameters with <i>params</i> will be updated.
+   *
+   * @param params A list of parameters.
+   * @param updatedParameters An optional pointer toward a vector which will
+   * store the indices of parameters for which a value has changed.
+   * Indices are relative on the input parameter list "params".
+   * @return true iff a least one parameter value has been changed.
+   * @see setParameters(), setAllParameters()
+   */
+
+  virtual bool matchParametersValues(const ParameterList& params, std::vector<size_t>* updatedParameters = 0)
+    throw (ConstraintException);
+
+  /**
+   * @brief Set the parameters to be equals to <i>params</i>.
+   *
+   * The list must contain exactly the same parameters (ie same names)
+   * than the parameters available.
+   *
+   * @param params A list with all parameters.
+   * @see setParameters(), matchParameters();
+   */
+  virtual void setAllParameters(const ParameterList& params)
+    throw (ParameterNotFoundException);
+
+  /**
+   * @brief Update the parameters from <i>params</i>.
+   *
+   * <i>params</i> must be a subset of all parameters available.
+   *
+   * @param params A list containing all parameters to update.
+   * @see setAllParameters(), matchParameters()
+   */
+  virtual void setParameters(const ParameterList& params)
+    throw (ParameterNotFoundException);
+
+  /**
+   * @brief Update the parameters from <i>params</i>.
+   *
+   * Only common parameters with <i>params</i> will be updated.
+   *
+   * @param params A list of parameters.
+   * @see setParameters(), setAllParameters()
+   */
+  virtual void matchParameters(const ParameterList& params);
+
+  /**
+   * @brief Delete a parameter from the list.
+   *
+   * @param name The name of the parameter to delete from the list.
+   */
+  virtual void deleteParameter(const std::string& name) throw (ParameterNotFoundException);
+
+  /**
+   * @brief Delete several parameters from the list.
+   *
+   * @param names The names of the parameters to delete from the list.
+   * @param mustExist If true, an exception is thrown if a name does
+   *                    not match an extant parameter.
+   */
+  
+  virtual void deleteParameters(const std::vector<std::string>& names, bool mustExist = true) throw (ParameterNotFoundException);
+
+  /**
+   * @brief Delete a parameter from the list.
+   *
+   * @param index The position of the parameter to delete in the list.
+   */
+  virtual void deleteParameter(size_t index) throw (IndexOutOfBoundsException);
+
+  /**
+   * @brief Delete several parameters from the list.
+   *
+   * @param indices The positions of the parameters to delete in the list.
+   * Duplicated positions will be considered only one time.
+   */
+  virtual void deleteParameters(const std::vector<size_t>& indices) throw (IndexOutOfBoundsException);
+
+  /**
+   * @brief Get the position of a given parameter according to its name.
+   *
+   * @param name The name of the parameter to look for.
+   * @return The position of the parameter if found. If several parameters exist with the given name,
+   * the position of the first one is returned.
+   * @throw ParameterNotFoundException If no parameter with the given name is found.
+   */
+  virtual size_t whichParameterHasName(const std::string& name) const throw (ParameterNotFoundException);
+
+  /**
+   * @brief Print all parameters.
+   */
+  virtual void printParameters(OutputStream& out) const;
+
+  virtual void printParameters(std::ostream& out) const
+  {
+    StlOutputStreamWrapper os(&out);
+    printParameters(os);
+  }
+
+  /**
+   * @brief Reset the list: delete all parameters.
+   */
+  virtual void reset();
+};
+} // end of namespace bpp.
+
+#endif  // _PARAMETERLIST_H_
+
diff --git a/src/Bpp/Numeric/Parametrizable.h b/src/Bpp/Numeric/Parametrizable.h
new file mode 100644
index 0000000..3c1a095
--- /dev/null
+++ b/src/Bpp/Numeric/Parametrizable.h
@@ -0,0 +1,230 @@
+//
+// File: Parametrizable.h
+// Created by: Julien Dutheil
+// Created on: Sun Oct 19 23:06:42 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _PARAMETRIZABLE_H_
+#define _PARAMETRIZABLE_H_
+
+// From Utils:
+#include "../Clonable.h"
+
+// From the STL:
+#include <string>
+
+#include "ParameterList.h"
+
+namespace bpp
+{
+
+/**
+ * @brief This is the interface for all objects that imply parameters.
+ *
+ * @see Parameter, ParameterList
+ */
+class Parametrizable:
+  public virtual Clonable
+{
+	public:
+		Parametrizable() {}
+		virtual ~Parametrizable() {}
+
+	public:
+    /**
+     * @brief Tell if there is a parameter with specified name.
+     *
+     * @param name The name of the parameter to look for.
+     * @return y/n.
+     */
+    virtual bool hasParameter(const std::string& name) const = 0;
+	
+		/**
+		 * @brief Get all parameters available.
+     *
+     * @see getIndependentParameters if some parameters are aliased.
+		 * @return A list with all parameters available.
+		 */
+		virtual const ParameterList& getParameters() const = 0;
+
+    /**
+     * @brief Get the parameter with specified name.
+     *
+     * @param name The name of the parameter to look for.
+     * @return The parameter with given name.
+     * @throw ParameterNotFoundException if no parameter with this name is found.
+     */
+    virtual const Parameter& getParameter(const std::string& name) const throw (ParameterNotFoundException) = 0;
+	
+		/**
+		 * @brief Get the value for parameter of name 'name'.
+		 *
+		 * @param name The name of the parameter.
+		 * @return the value of parameter <i>name</i>.
+		 */
+		virtual double getParameterValue(const std::string& name) const
+			throw (ParameterNotFoundException) = 0;
+
+		/**
+		 * @brief Set the parameters values to be equals to those of <i>parameters</i>.
+		 *
+		 * The list must contain exactly the same parameters (ie same names)
+		 * than the parameters available.
+		 *
+		 * @param parameters A list with all parameters.
+		 * @throw ParameterNotFoundException If a some parameter in the list is not in <i>params</i>.
+		 * @throw ConstraintException If a value in <i>parameters</i> does not match the constraint in the
+		 * corresponding parameter in the list.
+		 */
+		virtual void setAllParametersValues(const ParameterList& parameters) 
+			throw (ParameterNotFoundException, ConstraintException) = 0;
+
+		/**
+		 * @brief Set the value of parameter with name <i>name</i> to be equal to <i>value</i>.
+		 *
+		 * @param name the name of the parameter to set.
+		 * @param value The value of the parameter.
+		 * @throw ParameterNotFoundException If no parameter in the list has the name <i>name</i>.
+		 * @throw ConstraintException If <i>value</i> does not match the constraint associated to
+		 * parameter <i>name</i>.
+		 */
+		virtual void setParameterValue(const std::string& name, double value) 
+			throw (ParameterNotFoundException, ConstraintException) = 0;
+
+		/**
+		 * @brief Update the parameters from <i>parameters</i>.
+		 *
+		 * <i>parameters</i> must be a subset of all parameters available.
+		 *
+		 * @param parameters A list containing all parameters to update.
+		 * @throw ParameterNotFoundException If a some parameter in <i>params</i> is not in the list.
+		 * @throw ConstraintException If a value in <i>parameters</i> does not match the constraint in the
+		 * corresponding parameter in the list.
+		 */
+		virtual void setParametersValues(const ParameterList& parameters)
+			throw (ParameterNotFoundException, ConstraintException) = 0;
+
+		/**
+		 * @brief Update the parameters from <i>parameters</i>.
+		 *
+		 * Only common parameters with <i>parameters</i> will be updated.
+		 *
+		 * @param parameters A list of parameters.
+     * @return True if at least one parameter value has been changed.
+		 * @throw ConstraintException If a value in <i>parameters</i> does not match the constraint in the
+		 * corresponding parameter in the list.
+		 */
+		virtual bool matchParametersValues(const ParameterList& parameters)
+			throw (ConstraintException) = 0;
+
+    /**
+     * @brief Get the number of parameters.
+     *
+     * @see getNumberOfIndependentParameters If some parameters are aliased.
+     * @return The number of parameters.
+     */
+    virtual size_t getNumberOfParameters() const = 0;
+
+    /**
+     * @brief Set the namespace for the parameter names.
+     *
+     * @param prefix The 'namespace', that is a prefix to add to all parameter names.
+     * If parameter names are already prefixed, the new prefix will be used instead.
+     */
+    virtual void setNamespace(const std::string& prefix) = 0;
+
+    /**
+     * @return The current namespace used. This is an empty string if no namespace is currently defined.
+     */
+    virtual std::string getNamespace() const = 0;
+
+    /**
+     * @brief Resolves a parameter name according to the current namespace.
+     *
+     * @return The parameter name without the namespace prefix, if any.
+     */
+    virtual std::string getParameterNameWithoutNamespace(const std::string& name) const = 0;
+
+};
+
+/**
+ * @brief A low-level implementation of the Parametrizable interface with void functions.
+ *
+ * @see Parameter, ParameterList, Parametrizable
+ */
+class ParametrizableAdapter:
+  public virtual Parametrizable
+{
+  protected:
+    ParameterList parameters_;
+    Parameter parameter_;
+
+	public:
+		ParametrizableAdapter(): parameters_(), parameter_() {}
+		virtual ~ParametrizableAdapter() {}
+
+	public:
+
+		/**
+		 * @name The Parametrizable interface.
+		 *
+		 * @{
+		 */
+    bool hasParameter(const std::string & name) const { return parameters_.hasParameter(name); }
+		const ParameterList & getParameters() const { return parameters_; }
+    const Parameter & getParameter(const std::string & name) const throw (ParameterNotFoundException) { return parameter_; }
+		double getParameterValue(const std::string & name) const
+			throw (ParameterNotFoundException) { return 0; };
+		void setAllParametersValues(const ParameterList & parameters) 
+			throw (ParameterNotFoundException, ConstraintException) {}
+		void setParameterValue(const std::string & name, double value) 
+			throw (ParameterNotFoundException, ConstraintException) {}
+		void setParametersValues(const ParameterList & parameters)
+			throw (ParameterNotFoundException, ConstraintException) {}
+		bool matchParametersValues(const ParameterList & parameters)
+			throw (ConstraintException) { return false ;}
+    size_t getNumberOfParameters() const{ return 0; }
+    void setNamespace(const std::string& prefix) {}
+    std::string getNamespace() const { return ""; }
+    std::string getParameterNameWithoutNamespace(const std::string& name) const { return name; }
+		/** @} */
+
+};
+
+} //end of namespace bpp.
+
+#endif	//_PARAMETRIZABLE_H_
+
diff --git a/src/Bpp/Numeric/ParametrizableCollection.h b/src/Bpp/Numeric/ParametrizableCollection.h
new file mode 100644
index 0000000..d60d99b
--- /dev/null
+++ b/src/Bpp/Numeric/ParametrizableCollection.h
@@ -0,0 +1,382 @@
+//
+// File: ParametrizableCollection.h
+// Created by: Laurent Guéguen
+// Created on: mercredi 12 juin 2013, à 14h 24
+//
+
+/*
+  Copyright or (c) or Copr. Bio++ Development Team, (November 16, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for phylogenetic data analysis.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use,
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info".
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability.
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or
+  data to be ensured and,  more generally, to use and operate it in the
+  same conditions as regards security.
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _PARAMETRIZABLECOLLECTION_H_
+#define _PARAMETRIZABLECOLLECTION_H_
+
+#include "Parametrizable.h"
+#include "AbstractParameterAliasable.h"
+
+// From the STL:
+#include <map>
+#include <memory>
+
+namespace bpp
+{
+  /**
+   * @brief Plain collection of  parametrizable objects
+   *
+   * The collection is a map from unsigned integers to Parametrizables.
+   *
+   * The access to the parameters of the objects will be done through
+   * this collection.
+   *
+   */
+  
+  template <class N>
+  class ParametrizableCollection :
+    public AbstractParameterAliasable
+  {
+  protected:
+    /**
+     * @brief Contains all objects used.
+     */
+    
+    std::map<size_t, N* > objectsSet_;
+
+    /**
+     * @brief A vector of the numbers of objects that have changed
+     * during the last fireParameterChanged.
+     *
+     */
+
+    std::vector<size_t> vChanged_;
+    
+  public:
+    /**
+     * @brief Create an empty object set.
+     *
+     */
+  
+    ParametrizableCollection():
+      AbstractParameterAliasable(""),
+      objectsSet_(),
+      vChanged_()
+    {
+    }
+
+    ParametrizableCollection(const ParametrizableCollection<N>& set) :
+      AbstractParameterAliasable(set),
+      objectsSet_(),
+      vChanged_(set.vChanged_)
+    {
+      // Duplicate all objects:
+      typename std::map<size_t, N* >::const_iterator it;
+      for (it=set.objectsSet_.begin(); it!=set.objectsSet_.end(); it++)
+        objectsSet_[it->first]=it->second->clone();
+    }
+
+    ParametrizableCollection<N>& operator=(const ParametrizableCollection<N>& set)
+    {
+      clear();
+
+      AbstractParameterAliasable::operator=(set);
+      vChanged_ = set.vChanged_;
+      
+      // Duplicate all objects:
+      typename std::map<size_t, N* >::const_iterator it;
+      for (it=set.objectsSet_.begin(); it!=set.objectsSet_.end(); it++)
+        objectsSet_[it->first]=it->second->clone();
+
+      return *this;
+    }
+
+    /**
+     * @brief Resets all the information contained in this object.
+     *
+     */
+   
+    void clear()
+    {
+      resetParameters_();
+      
+      typename std::map<size_t, N*>::const_iterator it;
+      for (it=objectsSet_.begin(); it!=objectsSet_.end(); it++)
+        delete it->second;
+      objectsSet_.clear();
+      vChanged_.empty();
+    }
+
+    ~ParametrizableCollection()
+    {
+      clear();
+    }
+
+    ParametrizableCollection<N>* clone() const { return new ParametrizableCollection<N>(*this); }
+
+  public:
+    /**
+     * To be called when a parameter has changed.
+     * Depending on parameters, this will actualize the corresponding objects in the set.
+     * @param parameters The modified parameters.
+     */
+  
+    void fireParameterChanged(const ParameterList& parameters)
+    {
+      vChanged_.clear();
+      
+      std::vector<size_t> vCh;
+
+      std::map<size_t, ParameterList > mNumPl;
+      
+      for (size_t i=0; i<parameters.size(); i++)
+        {
+          std::string n=parameters[i].getName();
+          size_t t=n.rfind("_");
+          if (t==std::string::npos)
+            continue;
+          size_t num=(size_t)atoi(n.substr(t+1).c_str());
+          mNumPl[num].addParameter(Parameter(n.substr(0,t),parameters[i].getValue()));
+        }
+
+      std::map<size_t, ParameterList >::iterator it;
+      
+      // Then we update all objects in the set:
+      for (it=mNumPl.begin(); it!=mNumPl.end(); it++){
+        if (hasObject(it->first) && objectsSet_[it->first]->matchParametersValues(it->second))
+          vChanged_.push_back(it->first);
+      }
+    }
+
+    std::vector<size_t> hasChanged() const
+    {
+      return vChanged_;
+    }
+
+    void clearChanged()
+    {
+      vChanged_.clear();
+    }
+
+    /**
+     * @return The current number of distinct discrete objects in this set.
+     */
+  
+    size_t getNumberOfObjects() const { return objectsSet_.size(); }
+
+    /**
+     * @brief Says if there is a object with a given index.
+     *
+     * @param objectIndex Index of the object in the set.
+     * @return true or false.
+     */
+  
+    const bool hasObject(size_t objectIndex) const
+    {
+      return (objectsSet_.find(objectIndex)!=objectsSet_.end());
+    }
+
+    /**
+     * @brief Returns the keys of the set.
+     *
+     */
+  
+    const std::vector<size_t> keys() const
+    {
+      std::vector<size_t> vkeys;
+      typename std::map<size_t, N*>::const_iterator it;
+
+      for (it=objectsSet_.begin(); it!=objectsSet_.end(); it++)
+        vkeys.push_back(it->first);
+            
+      return vkeys;
+    }
+
+  
+    /**
+     * @brief Get one object from the set knowing its index.
+     *
+     * @param objectIndex Index of the object in the set.
+     * @return A pointer toward the corresponding object.
+     */
+  
+    const N* operator[](size_t objectIndex) const
+    {
+      typename std::map<size_t, N*>::const_iterator it=objectsSet_.find(objectIndex);
+      if (it==objectsSet_.end())
+        throw BadIntegerException("ParametrizableCollection::getObject().", (int)objectIndex);
+    
+      return dynamic_cast<const N*>(it->second);
+    }
+
+    N* operator[](size_t objectIndex)
+    {
+      typename std::map<size_t, N*>::iterator it=objectsSet_.find(objectIndex);
+      if (it==objectsSet_.end())
+        throw BadIntegerException("ParametrizableCollection::getObject().", (int)objectIndex);
+    
+      return it->second;
+    }
+  
+    /**
+     * @brief Get the paramters of the Collection corresponding to an
+     * object from the set knowing its index.
+     *
+     * @param objectIndex Index of the object in the set.
+     * @return A ParameterList
+     */
+
+    ParameterList getParametersForObject(size_t objectIndex) const
+    {
+      ParameterList pl;
+      typename std::map<size_t, N*>::const_iterator it=objectsSet_.find(objectIndex);
+
+      if (it!=objectsSet_.end())
+      {
+        if (dynamic_cast<const ParameterAliasable*>(it->second)!=NULL)
+          pl = dynamic_cast<const ParameterAliasable*>(it->second)->getIndependentParameters();
+        else
+          pl = it->second->getParameters();
+        
+        for (size_t i=0; i<pl.size();i++)
+          pl[i].setName(pl[i].getName()+"_"+TextTools::toString(objectIndex));
+      }
+      return pl;
+    }
+    
+    /**
+     * @brief Add a new object to the set with a given number.
+     *
+     * @throw Exception if the number is already used. See replace function instead.
+     *
+     * @param object A pointer toward an object, that will added to the set.
+     * 
+     * WARNING! The set will now be the owner of the pointer, and will destroy it if needed!
+     * Copy the object first if you don't want it to be lost!
+     *
+     * @param objectIndex The number of the object in the Collection
+     * 
+     */
+
+    void addObject(N* object, size_t objectIndex)
+    {
+      typename std::map<size_t, N*>::iterator it=objectsSet_.find(objectIndex);
+      if (it!=objectsSet_.end())
+        throw BadIntegerException("ParametrizableCollection<N>::addObject. Object objectIndex already used", (int)objectIndex);
+
+      objectsSet_[objectIndex]=object;
+
+      // Associate parameters:
+      std::string pname;
+      std::vector<std::string> nplm;
+      nplm=object->getParameters().getParameterNames();
+
+      for (size_t i  = 0; i < nplm.size(); i++)
+        {
+          pname = nplm[i];
+          Parameter* p = new Parameter(object->getParameters().getParameter(pname));
+          p->setName(pname + "_" + TextTools::toString(objectIndex));
+          addParameter_(p);
+        }
+
+      if (dynamic_cast<ParameterAliasable*>(object)){
+        ParameterAliasable* ppa=dynamic_cast<ParameterAliasable*>(object);
+        for (size_t i  = 0; i < nplm.size(); i++)
+          {
+            std::vector<std::string> va=ppa->getAlias(nplm[i]);
+            for (size_t j=0;j<va.size();j++)
+              aliasParameters(nplm[i] + "_" + TextTools::toString(objectIndex), va[j] + "_" + TextTools::toString(objectIndex));
+          }
+      }
+    }
+
+    /**
+     * @brief Remove a object from the set, and all corresponding
+     * parameters. 
+     *
+     * @param objectIndex The index of the object in the set.
+     * @return the removed N*. 
+     */
+  
+    N* removeObject(size_t objectIndex)
+    {
+      if (objectsSet_.find(objectIndex)==objectsSet_.end())
+        throw BadIntegerException("ParametrizableCollection<N>::removeObject. None Object at this objectIndex", (int)objectIndex);
+
+      N* pm=objectsSet_[objectIndex];
+      objectsSet_.erase(objectIndex);
+      
+      // Erase all parameter references to this object and translate other indices...
+      
+      ParameterList pl=getParameters();
+      
+      for (size_t i = pl.size(); i>0; i--)
+        {
+          std::string pn=pl[i-1].getName();
+          
+          size_t pu=pn.rfind("_");
+          int nm=atoi(pn.substr(pu+1).c_str());
+          if (nm==(int)objectIndex){
+            std::vector<std::string> alpn=getAlias(pn);
+            for (unsigned j=0; j<alpn.size(); j++)
+              try {
+                unaliasParameters(alpn[j],pn);
+              }
+              catch (Exception& e)
+                {
+                  continue;
+                }
+            deleteParameter_(i-1);
+          }
+        }
+      
+      return pm;
+    }
+
+    /**
+     * @brief Replace a object in the set, and returns the replaced one.
+     *
+     * @param objectIndex The index of the object to be replaced in the set.
+     * @param object the replacing N
+     * @return the replaced N*. 
+     */
+
+    N* replaceObject(N* object, size_t objectIndex)
+    {
+      N* pm=removeObject(objectIndex);
+      addObject(object, objectIndex);
+      return pm;
+    }
+
+
+  };
+} // end of namespace bpp.
+
+#endif // _PARAMETRIZABLECOLLECTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/AbstractDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/AbstractDiscreteDistribution.cpp
new file mode 100644
index 0000000..1dc4c40
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/AbstractDiscreteDistribution.cpp
@@ -0,0 +1,466 @@
+//
+// File: AbstractDiscreteDistribution.cpp
+// Created by: Julien Dutheil
+// Created on: ?
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "AbstractDiscreteDistribution.h"
+
+#include "../Random/RandomTools.h"
+#include "../VectorTools.h"
+
+using namespace bpp;
+using namespace std;
+
+
+AbstractDiscreteDistribution::AbstractDiscreteDistribution(size_t nbClasses, const std::string& prefix) :
+  AbstractParameterAliasable(prefix),
+  numberOfCategories_(nbClasses),
+  distribution_(),
+  bounds_(nbClasses-1),
+  intMinMax_(-NumConstants::VERY_BIG(), NumConstants::VERY_BIG(), true, true),
+  median_(false)
+{}
+
+AbstractDiscreteDistribution::AbstractDiscreteDistribution(size_t nbClasses, double delta, const std::string& prefix) :
+  AbstractParameterAliasable(prefix),
+  numberOfCategories_(nbClasses),
+  distribution_(Order(delta)),
+  bounds_(nbClasses-1),
+  intMinMax_(-NumConstants::VERY_BIG(), NumConstants::VERY_BIG(),true, true),
+  median_(false)
+{}
+
+AbstractDiscreteDistribution::AbstractDiscreteDistribution(const AbstractDiscreteDistribution& adde) :
+  AbstractParameterAliasable(adde),
+  numberOfCategories_(adde.numberOfCategories_),
+  distribution_(adde.distribution_),
+  bounds_(adde.bounds_),
+  intMinMax_(adde.intMinMax_),
+  median_(adde.median_)
+{
+}
+
+AbstractDiscreteDistribution& AbstractDiscreteDistribution::operator=(const AbstractDiscreteDistribution& adde) 
+{
+  AbstractParameterAliasable::operator=(adde);
+  numberOfCategories_=adde.numberOfCategories_;
+  distribution_=adde.distribution_;
+  bounds_=adde.bounds_;
+  intMinMax_=adde.intMinMax_;
+  median_=adde.median_;
+
+  return *this;
+}
+
+/******************************************************************************/
+
+size_t AbstractDiscreteDistribution::getNumberOfCategories() const
+{
+  return numberOfCategories_;
+}
+
+void AbstractDiscreteDistribution::setNumberOfCategories(size_t nbClasses)
+{
+  if (nbClasses <= 0)
+    cerr << "DEBUG: ERROR!!! Number of categories is <= 0 in AbstractDiscreteDistribution::setNumberOfCategories()." << endl;
+
+  if (numberOfCategories_ != nbClasses)
+  {
+    numberOfCategories_ = nbClasses;
+    discretize();
+  }
+}
+
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getCategory(size_t categoryIndex) const
+{
+  map<double, double>::const_iterator it = distribution_.begin();
+  for (unsigned int i = 0; i < categoryIndex; i++)
+  {
+    it++;
+  }
+  return it->first;
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getProbability(size_t categoryIndex) const
+{
+  map<double, double>::const_iterator it = distribution_.begin();
+  for (unsigned int i = 0; i < categoryIndex; i++)
+  {
+    it++;
+  }
+  return it->second;
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getProbability(double category) const
+{
+  return distribution_.find(category)->second;
+}
+
+/******************************************************************************/
+
+Vdouble AbstractDiscreteDistribution::getCategories() const
+{
+  Vdouble result(distribution_.size());
+  unsigned int i = 0;
+  for (map<double, double>::const_iterator it = distribution_.begin();
+       it != distribution_.end();
+       it++)
+  {
+    result[i] = it->first;
+    i++;
+  }
+  return result;
+}
+
+/******************************************************************************/
+
+Vdouble AbstractDiscreteDistribution::getProbabilities() const
+{
+  Vdouble result(distribution_.size());
+  size_t i = 0;
+  for (map<double, double>::const_iterator it = distribution_.begin();
+       it != distribution_.end();
+       it++)
+  {
+    result[i] = it->second;
+    i++;
+  }
+  return result;
+}
+
+/******************************************************************************/
+
+void AbstractDiscreteDistribution::set(double category, double probability)
+{
+  distribution_[category] = probability;
+}
+
+/******************************************************************************/
+
+void AbstractDiscreteDistribution::add(double category, double probability)
+{
+  if (distribution_.find(category) == distribution_.end())
+  {
+    // new category
+    distribution_[category] = probability;
+  }
+  else
+  {
+    // existing category
+    distribution_[category] += probability;
+  }
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::rand() const
+{
+  double r = RandomTools::giveRandomNumberBetweenZeroAndEntry(1);
+  double cumprob = 0;
+  for (map<double, double>::const_iterator i = distribution_.begin();
+       i != distribution_.end();
+       i++)
+  {
+    cumprob += i->second;
+    if (r <= cumprob)
+      return i->first;
+  }
+  // This line can't be reached:
+  return -1.;
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getInfCumulativeProbability(double category) const
+{
+  double prob = 0;
+  map<double, double>::const_iterator it = distribution_.find(category);
+  for (map<double, double>::const_iterator i = distribution_.begin();
+       i != it;
+       i++)
+  {
+    prob += i->second;
+  }
+  return prob;
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getIInfCumulativeProbability(double category) const
+{
+  double prob = 0;
+  map<double, double>::const_iterator it = distribution_.find(category);
+  if (it == distribution_.end())
+    return 0;
+  for (map<double, double>::const_iterator i = ++it;
+       i != distribution_.end();
+       i++)
+  {
+    prob += i->second;
+  }
+  return 1. - prob;
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getSupCumulativeProbability(double category) const
+{
+  double prob = 0;
+  map<double, double>::const_iterator it = distribution_.find(category);
+  if (it == distribution_.end())
+    return 0;
+  for (map<double, double>::const_iterator i = ++it;
+       i != distribution_.end();
+       i++)
+  {
+    prob += i->second;
+  }
+  return prob;
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getSSupCumulativeProbability(double category) const
+{
+  double prob = 0;
+  map<double, double>::const_iterator it = distribution_.find(category);
+  for (map<double, double>::const_iterator i = distribution_.begin();
+       i != it;
+       i++)
+  {
+    prob += i->second;
+  }
+  return 1. - prob;
+}
+
+/******************************************************************************/
+
+void AbstractDiscreteDistribution::print(OutputStream& out) const
+{
+  for (map<double, double>::const_iterator i = distribution_.begin(); i != distribution_.end(); i++)
+  {
+    (out << "Pr(" << (i->first) << ") = " << (i->second)).endLine();
+  }
+}
+
+/******************************************************************************/
+
+double AbstractDiscreteDistribution::getValueCategory(double value) const
+{
+  if (!(intMinMax_.isCorrect(value)))
+    throw Exception("AbstractDiscreteDistribution::getValueCategory out of bounds:" + TextTools::toString(value));
+
+  map<double, double>::const_iterator it = distribution_.begin();
+  for (unsigned int i=1;i<bounds_.size();i++)
+    if (value<bounds_[i])
+      break;
+    else
+      it++;
+
+  return it->first;
+}
+
+/***********************************************************************/
+
+
+void AbstractDiscreteDistribution::discretize()
+{
+  /* discretization of distribution with equal proportions in each
+     category
+   */
+
+  distribution_.clear();
+  bounds_.resize(numberOfCategories_ - 1);
+
+  double minX = pProb(intMinMax_.getLowerBound());
+  double maxX = pProb(intMinMax_.getUpperBound());
+
+  double ec;
+  size_t i;
+  vector<double> values(numberOfCategories_);
+
+  if (maxX != minX)
+  {
+    // divide the domain into equiprobable intervals
+    ec = (maxX - minX) / static_cast<double>(numberOfCategories_);
+
+    for (i = 1; i < numberOfCategories_; i++)
+    {
+      bounds_[i-1] = qProb(minX + static_cast<double>(i) * ec);
+    }
+
+    // for each category, sets the value v as the median, adjusted
+    //      such that the sum of the values = 1
+    if (median_)
+    {
+      double t=0;
+      for (i = 0; i < numberOfCategories_; i++)
+        values[i] = qProb(minX + (static_cast<double>(i) + 0.5) * ec);
+
+      for (i = 0, t = 0; i < numberOfCategories_; i++)
+        t += values[i];
+
+      double mean = Expectation(intMinMax_.getUpperBound()) - Expectation(intMinMax_.getLowerBound());
+
+      for (i = 0; i < numberOfCategories_; i++)
+        values[i] *= mean / t / ec;
+    }
+    else
+      // for each category, sets the value v such that
+      //      v * length_of_the_interval = the surface of the category
+      {
+      double a = Expectation(intMinMax_.getLowerBound()), b;
+      for (i = 0; i < numberOfCategories_-1; i++)
+        {
+          b = Expectation(bounds_[i]);
+          values[i] = (b - a) / ec;
+          a = b;
+        }
+      values[numberOfCategories_-1] = (Expectation(intMinMax_.getUpperBound())-a) / ec;
+    }
+  }
+  else 
+    // if maxX==minX, uniform discretization of the range
+  {
+    ec = (intMinMax_.getUpperBound() - intMinMax_.getLowerBound()) / static_cast<double>(numberOfCategories_);
+    for (i = 1; i < numberOfCategories_; i++)
+      bounds_[i-1] = intMinMax_.getLowerBound() + static_cast<double>(i) * ec;
+
+    values[0] = (intMinMax_.getLowerBound() + bounds_[0]) / 2;
+    
+    for (i = 1; i < numberOfCategories_-1; i++)
+      values[i] = (bounds_[i-1] + bounds_[i]) / 2;
+
+    values[numberOfCategories_-1] = (intMinMax_.getUpperBound()+bounds_[numberOfCategories_ - 1]) / 2;
+  }
+
+  // adjustments near the boundaries of the domain, according to the precision chosen
+  if (intMinMax_.strictLowerBound())
+  {
+    for (i = 0; i < numberOfCategories_; i++)
+    {
+      if (values[i] < intMinMax_.getLowerBound() + precision())
+        values[i] = intMinMax_.getLowerBound() + precision();
+      else
+        break;
+    }
+  }
+  else
+  {
+    for (i = 0; i < numberOfCategories_; i++)
+    {
+      if (values[i] < intMinMax_.getLowerBound())
+        values[i] = intMinMax_.getLowerBound() + precision();
+      else
+        break;
+    }
+  }
+
+  if (intMinMax_.strictUpperBound())
+  {
+    for (i = numberOfCategories_; i > 0; i--)
+    {
+      if (values[i-1] > intMinMax_.getUpperBound() - precision())
+        values[i-1] = intMinMax_.getUpperBound() - precision();
+      else
+        break;
+    }
+  }
+  else
+  {
+    for (i = numberOfCategories_; i > 0; i--)
+    {
+      if (values[i-1] > intMinMax_.getUpperBound())
+        values[i-1] = intMinMax_.getUpperBound() - precision();
+      else
+        break;
+    }
+  }
+
+  // now the distribution_ map, taking care that all values are different
+  
+  double p = 1. / static_cast<double>(numberOfCategories_);
+  for (i = 0; i < numberOfCategories_; i++)
+  {
+    if (distribution_.find(values[i]) != distribution_.end())
+    {
+      int j = 1;
+      int f = ((values[i] + NumConstants::TINY()) >= intMinMax_.getUpperBound()) ? -1 : 1;
+      while (distribution_.find(values[i] + f * j * precision()) != distribution_.end())
+      {
+        j++;
+        f = ((values[i] + f * j * precision()) >= intMinMax_.getUpperBound()) ? -1 : 1;
+      }
+      distribution_[values[i] + f * j * precision()] = p;
+    }
+    else
+      distribution_[values[i]] = p;
+  }
+
+  return;
+}
+
+Vdouble AbstractDiscreteDistribution::getBounds() const
+{
+  Vdouble vb(numberOfCategories_ + 1);
+  vb[0] = getLowerBound();
+  for (unsigned int i = 0; i < numberOfCategories_ - 1; i++)
+    vb[i + 1] = getBound(i);
+  vb[numberOfCategories_] = getUpperBound();
+  return vb;
+}
+
+void AbstractDiscreteDistribution::restrictToConstraint(const Constraint& c)
+{
+  const IntervalConstraint* pi = dynamic_cast<const IntervalConstraint*>(&c);
+
+  if (!pi)
+    throw Exception("AbstractDiscreteDistribution::restrictToConstraint: the constraint is not an interval");
+
+  if (!(intMinMax_ <= (*pi)))
+  {
+    intMinMax_ &= c;
+    discretize();
+  }
+}
diff --git a/src/Bpp/Numeric/Prob/AbstractDiscreteDistribution.h b/src/Bpp/Numeric/Prob/AbstractDiscreteDistribution.h
new file mode 100644
index 0000000..64b90e4
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/AbstractDiscreteDistribution.h
@@ -0,0 +1,246 @@
+//
+// File: AbstractDiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: ?
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _ABSTRACTDISCRETEDISTRIBUTION_H_
+#define _ABSTRACTDISCRETEDISTRIBUTION_H_
+
+#include "DiscreteDistribution.h"
+#include "../Constraints.h"
+#include "../AbstractParameterAliasable.h"
+
+#include <map>
+
+namespace bpp
+{
+
+  /**
+   * @brief Partial implementation of the DiscreteDistribution interface.
+   *
+   * This class uses a map to store the cateogry values as keys and probabilities as values.
+   * It uses its own comparator class to deal with double precision.
+   * By default, category values that differ less than 10E-9 will be considered identical.
+   */
+  class AbstractDiscreteDistribution :
+    public virtual DiscreteDistribution,
+    public virtual AbstractParameterAliasable
+  {
+
+  public:
+    
+    /**
+     * @brief Comparator class for AbstractDiscreteDistribution.
+     */
+    class Order
+    {
+    private:
+      double precision_;
+      
+    public:
+
+      Order(double prec=NumConstants::TINY()):
+        precision_(prec)
+      {}
+
+      Order(const Order& ord) :
+        precision_(ord.precision_)
+      {}
+
+      Order& operator=(const Order& ord)
+      {
+        precision_=ord.precision_;
+        return *this;
+      }
+
+      double precision() const {
+        return precision_;
+      }
+
+      void setPrecision(double prec) {
+        precision_=prec;
+      }
+      
+      bool operator() (double l1, double l2) const
+      {
+        return (l1 < l2 - precision_); 
+      }
+
+    };
+
+  protected:
+
+    /*
+     * The number of categories
+     */
+
+    size_t numberOfCategories_;  
+    /**
+     * These fields must be initialized in the constructor of the derived classes.
+     */
+    std::map<double, double, Order> distribution_;
+    
+    std::vector<double> bounds_;
+
+    /**
+     * @brief the interval where the distribution is defined/restricted.
+     *
+     */
+    
+    IntervalConstraint intMinMax_;    
+
+    /**
+     * Tells if the values in the classes is associated to the median or not (default: false)
+     *
+     */
+
+    bool median_;
+    
+  public:
+    AbstractDiscreteDistribution(size_t nbClasses, const std::string& prefix = ""); 
+
+    /**
+     * With additional precision value to discriminate categories (default 1e-12)
+     *
+     */
+    AbstractDiscreteDistribution(size_t nbClasses, double precision, const std::string& prefix = "");
+    
+    AbstractDiscreteDistribution(const AbstractDiscreteDistribution& adde);
+
+    AbstractDiscreteDistribution& operator=(const AbstractDiscreteDistribution& adde);
+    
+    virtual ~AbstractDiscreteDistribution() {}
+
+    
+  public:
+
+    /**
+     * @name The DiscreteDistribution interface.
+     *
+     * @{
+     */
+    size_t getNumberOfCategories() const;
+    void setNumberOfCategories(size_t nbClasses);
+    double getCategory(size_t categoryIndex) const;
+    double getProbability(size_t categoryIndex) const;
+    double getProbability(double category) const;
+    Vdouble getCategories() const;
+    Vdouble getProbabilities() const;
+    double getValueCategory(double value) const;
+    void set(double category, double probability);
+    void add(double category, double probability);
+    double getInfCumulativeProbability(double category) const;
+    double getIInfCumulativeProbability(double category) const;
+    double getSupCumulativeProbability(double category) const;
+    double getSSupCumulativeProbability(double category) const;
+    double rand() const;
+    double randC() const throw (Exception) { throw Exception("AbstractDiscreteDistribution::randC. No continuous version available for this distribution."); }
+
+    /*
+     *@return value of the internal bound
+     *
+     */
+    
+    double getBound(size_t i) const throw (IndexOutOfBoundsException)
+    {
+      if (i >= numberOfCategories_ - 1)
+        throw IndexOutOfBoundsException("AbstractDiscreteDistribution::getBound(i)", i , 0, numberOfCategories_-1);
+      return bounds_[i];
+    }  
+
+
+    /*
+     *@brief Information about the range of the distribution
+     *
+     */
+     
+
+    double getLowerBound() const
+    {
+      return intMinMax_.getLowerBound();
+    }
+
+    double getUpperBound() const
+    {
+      return intMinMax_.getUpperBound();
+    }
+
+    bool strictLowerBound() const
+    {
+      return intMinMax_.strictLowerBound();
+    }
+
+    bool strictUpperBound() const
+    {
+      return intMinMax_.strictUpperBound();
+    }
+
+    Vdouble getBounds() const;
+    
+    void print(OutputStream& out) const;
+
+    double precision() const { return distribution_.key_comp().precision();}
+      
+    void setMedian(bool median) {
+      if (median_ != median) {
+        median_ = median;
+        discretize();
+      }
+    }
+    
+    virtual void discretize();
+
+    /** @} */
+
+    /**
+     * @brief Restricts the distribution to the domain where the
+     * constraint is respected, in addition of other predefined
+     * constraints.
+     *
+     * @param c The Constraint to respect.
+     *
+     */
+    
+    virtual void restrictToConstraint(const Constraint& c);
+      
+
+  };
+
+} //end of namespace bpp.
+
+#endif  //_ABSTRACTDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/BetaDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/BetaDiscreteDistribution.cpp
new file mode 100644
index 0000000..dc4d0f6
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/BetaDiscreteDistribution.cpp
@@ -0,0 +1,122 @@
+//
+// File: BetaDiscreteDistribution.cpp
+// Created by: Laurent Guéguen
+// Created on: lundi 31 mai 2010, à 11h 15
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "BetaDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../NumConstants.h"
+#include "../../Utils/MapTools.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <cmath>
+
+using namespace std;
+
+/** Constructor: **************************************************************/
+
+BetaDiscreteDistribution::BetaDiscreteDistribution(size_t n, double alpha, double beta) :
+  AbstractParameterAliasable("Beta."),
+  AbstractDiscreteDistribution(n,NumConstants::VERY_TINY(),"Beta."), alpha_(alpha), beta_(beta), diffln_(0)
+{
+  addParameter_(new Parameter("Beta.alpha", alpha, new IntervalConstraint(1, 0.0001, true), true));
+
+  // For precision issues, beta cannot be too low
+  addParameter_(new Parameter("Beta.beta", beta, new IntervalConstraint(1, 0.1, true), true));
+  intMinMax_.setLowerBound(0, true);
+  intMinMax_.setUpperBound(1, true);
+
+  diffln_ = exp(RandomTools::lnBeta(alpha_ + 1, beta_) - RandomTools::lnBeta(alpha_, beta_));
+  discretize();
+}
+
+BetaDiscreteDistribution::BetaDiscreteDistribution(const BetaDiscreteDistribution& bdd) :
+  AbstractParameterAliasable(bdd),
+  AbstractDiscreteDistribution(bdd), alpha_(bdd.alpha_), beta_(bdd.beta_), diffln_(bdd.diffln_)
+{
+}
+
+BetaDiscreteDistribution& BetaDiscreteDistribution::operator=(const BetaDiscreteDistribution& bdd)
+{
+  AbstractParameterAliasable::operator=(bdd);
+  AbstractDiscreteDistribution::operator=(bdd);
+
+  alpha_=bdd.alpha_;
+  beta_=bdd.beta_;
+  diffln_=bdd.diffln_;
+  
+  return *this;
+}
+  
+/******************************************************************************/
+
+void BetaDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
+{
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  alpha_=getParameterValue("alpha");
+  beta_=getParameterValue("beta");
+
+  if (alpha_<=1 && intMinMax_.getLowerBound()==0)
+    intMinMax_.setLowerBound(precision(),false);
+
+  if (beta_<=1 && intMinMax_.getUpperBound()==1)
+    intMinMax_.setUpperBound(1-precision(),false);
+
+  diffln_=exp(RandomTools::lnBeta(alpha_+1,beta_)-RandomTools::lnBeta(alpha_,beta_));
+  discretize();
+}
+
+/******************************************************************************/
+
+double BetaDiscreteDistribution::qProb(double x) const
+{
+  return RandomTools::qBeta(x, alpha_, beta_);
+}
+
+double BetaDiscreteDistribution::pProb(double x) const 
+{
+  return RandomTools::pBeta(x, alpha_, beta_);
+}
+
+double BetaDiscreteDistribution::Expectation(double a) const
+{
+  return RandomTools::pBeta(a,alpha_+1,beta_)*diffln_;
+}
+
+    
diff --git a/src/Bpp/Numeric/Prob/BetaDiscreteDistribution.h b/src/Bpp/Numeric/Prob/BetaDiscreteDistribution.h
new file mode 100644
index 0000000..c4e66d3
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/BetaDiscreteDistribution.h
@@ -0,0 +1,117 @@
+//
+// File: BetaDiscreteDistribution.h
+// Created by: Laurent Guéguen
+// Created on: jeudi 27 mai 2010, à 23h 34
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _BETADISCRETEDISTRIBUTION_H_
+#define _BETADISCRETEDISTRIBUTION_H_
+
+#include "AbstractDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Discretized Beta distribution with parameters alpha and
+   * beta, on a given interval. On default, the interval is @f$ [0;1]
+   * @f$, but it can be restricted.
+   *
+   * The minimum (resp maximum) value of this distribution is set to
+   * 1e-12 (resp 1-1e-12) if alpha>1 (resp beta>1), otherwise it is 0
+   * (resp 1).
+   *
+   * The Parameters are: alpha and beta @f$ \in [0.0001;\infty[ @f$.
+   * @author Laurent Guéguen
+   */
+  
+  class BetaDiscreteDistribution:
+    public AbstractDiscreteDistribution
+  {
+  private:
+
+    double alpha_, beta_;
+
+    /* for computation economy */
+       
+    double diffln_;
+  public:
+    /**
+     * @brief Build a new discretized beta distribution.
+     *
+     * @param n the number of categories to use.
+     * @param alpha The alpha parameter.
+     * @param beta The beta parameter.
+     *
+     */
+    
+    BetaDiscreteDistribution(size_t n, double alpha = 1, double beta = 1);
+
+    BetaDiscreteDistribution(const BetaDiscreteDistribution&);
+
+    BetaDiscreteDistribution& operator=(const BetaDiscreteDistribution&);
+    
+    BetaDiscreteDistribution* clone() const { return new BetaDiscreteDistribution(*this); }
+  
+  public:
+
+    std::string getName() const { return "Beta";}
+
+    void fireParameterChanged(const ParameterList & parameters);
+  
+    double randC() const throw (Exception)
+    {
+      double x= RandomTools::randBeta(getParameterValue("alpha"),
+                                      getParameterValue("beta"));
+      while (!intMinMax_.isCorrect(x))
+        x= RandomTools::randBeta(getParameterValue("alpha"),
+                                 getParameterValue("beta"));
+      return x;
+    }
+
+    double qProb(double x) const;
+     
+    double pProb(double x) const;
+
+    double Expectation(double a) const;
+
+  };
+
+} //end of namespace bpp.
+
+#endif  //_BETADISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Seq/Container/SequenceContainerIterator.cpp b/src/Bpp/Numeric/Prob/ConstantDistribution.cpp
similarity index 52%
copy from src/Bpp/Seq/Container/SequenceContainerIterator.cpp
copy to src/Bpp/Numeric/Prob/ConstantDistribution.cpp
index 977949d..600f19b 100644
--- a/src/Bpp/Seq/Container/SequenceContainerIterator.cpp
+++ b/src/Bpp/Numeric/Prob/ConstantDistribution.cpp
@@ -1,14 +1,14 @@
 //
-// File: SequenceContainerIterator.cpp
-// Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:44 2013
+// File: ConstantDistribution.cpp
+// Created by: jdutheil 
+// Created on: Fri Oct 24 08:48:03 2003
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,39 +37,67 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SequenceContainerIterator.h"
+#include "ConstantDistribution.h"
 
 using namespace bpp;
 
-// From the STL:
 #include <iostream>
 
 using namespace std;
 
 /******************************************************************************/
-	
-AbstractSequenceContainerIterator::AbstractSequenceContainerIterator(const OrderedSequenceContainer& sequences) :
-  sequences_(&sequences),
-  currentPosition_(0)
-{}
 
-/******************************************************************************/
-	
-SimpleSequenceContainerIterator::SimpleSequenceContainerIterator(const OrderedSequenceContainer& sequences):
-  AbstractSequenceContainerIterator(sequences) {}
+ConstantDistribution::ConstantDistribution(double value):
+  AbstractParameterAliasable("Constant."),
+  AbstractDiscreteDistribution(1, "Constant."),
+  value_(value)
+{
+  addParameter_(new Parameter("Constant.value", value)); 
+  distribution_[value_] = 1; //One single class  with probability 1.
+}
 
-const Sequence* SimpleSequenceContainerIterator::nextSequence()
+ConstantDistribution::ConstantDistribution(const ConstantDistribution& cd) :
+  AbstractParameterAliasable(cd),
+  AbstractDiscreteDistribution(cd),
+  value_(cd.value_)
+{}
+
+ConstantDistribution& ConstantDistribution::operator=(const ConstantDistribution& cd)
 {
-	const Sequence* s = &sequences_->getSequence(currentPosition_);
-	currentPosition_++;
-	return s;
+  AbstractParameterAliasable::operator=(cd);
+  AbstractDiscreteDistribution::operator=(cd);
+  value_=cd.value_;
+
+  return *this;
 }
 
-bool SimpleSequenceContainerIterator::hasMoreSequences() const
+/******************************************************************************/
+
+void ConstantDistribution::fireParameterChanged(const ParameterList& parameters) 
 {
-	return currentPosition_ < sequences_->getNumberOfSequences();
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+
+  value_=getParameterValue("value");
+  distribution_.clear();
+  distribution_[value_] = 1; //One single class of rate 1 with probability 1.
 }
 
 /******************************************************************************/
 
+void ConstantDistribution::restrictToConstraint(const Constraint& c)
+{
+  if (getNumberOfParameters()==0)
+    return;
+  
+  const IntervalConstraint* pi=dynamic_cast<const IntervalConstraint*>(&c);
+  if (!pi)
+    throw Exception("ConstantDistribution::restrictToConstraint: Non-interval exception");
+
+  if (! pi->isCorrect(getParameterValue("value")))
+    throw ConstraintException("Impossible to restrict to Constraint", &getParameter_("value"), getParameterValue("value"));
+
+  AbstractDiscreteDistribution::restrictToConstraint(c);
 
+  Parameter& p=getParameter_("value");
+  p.setConstraint(intMinMax_.clone(),true);
+ }
diff --git a/src/Bpp/Seq/Io/Dcse.h b/src/Bpp/Numeric/Prob/ConstantDistribution.h
similarity index 50%
rename from src/Bpp/Seq/Io/Dcse.h
rename to src/Bpp/Numeric/Prob/ConstantDistribution.h
index 8ad2b2b..75d9e9b 100644
--- a/src/Bpp/Seq/Io/Dcse.h
+++ b/src/Bpp/Numeric/Prob/ConstantDistribution.h
@@ -1,14 +1,14 @@
 //
-// File: DCSE.h
-// Created by: Julien Dutheil
-// Created on: Wed Mar 3 2004
+// File: ConstantDistribution.h
+// Created by: jdutheil
+// Created on: Fri Oct 24 08:48:03 2003
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,73 +37,72 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _DCSE_H_
-#define _DCSE_H_
+#ifndef _CONSTANTDISTRIBUTION_H_
+#define _CONSTANTDISTRIBUTION_H_
 
-#include "AbstractIAlignment.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/AlignedSequenceContainer.h"
+#include "AbstractDiscreteDistribution.h"
 
 namespace bpp
 {
 
-/**
- * @brief Support for the Dedicated Comparative Sequence Editor format.
- *
- * Only the sequence information is retrieved.
- * All structural information is dropped for now.
- * 
- * A description of this format may be found here:
- * http://www.psb.ugent.be/rRNA/help/formats/aliformat.html
- */
-class DCSE :
-  public AbstractIAlignment,
-  public virtual ISequence
-{
+  /**
+   * @brief Constant discrete distribution.
+   *
+   * Only one category with probability 1.0.
+   */
+  class ConstantDistribution :
+    public AbstractDiscreteDistribution
+  {
+  
+  private:
+    double value_;
     
-  public: 
-    DCSE() {};
-    virtual ~DCSE() {};
-
   public:
-  
     /**
-     * @name The AbstractIAlignment interface.
+     * @brief Builds a new ConstantDistribution object from a
+     *  value
      *
-     * @{
-     */
-    void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception);
-    /** @} */
-
-    /**
-     * @name The ISequence interface.
+     * @param value The value of the distribution.
      *
-     * As a SiteContainer is a subclass of SequenceContainer, we hereby implement the ISequence
-     * interface by downcasting the interface.
-     *
-     * @{
      */
-    virtual SequenceContainer* readSequences(std::istream& input, const Alphabet* alpha) const throw (Exception) {
-      return readAlignment(input, alpha);
-    }
-    virtual SequenceContainer* readSequences(const std::string& path, const Alphabet* alpha) const throw (Exception) {
-      return readAlignment(path, alpha);
-    }
-    /** @} */
+    
+    ConstantDistribution(double value);
+
+    ConstantDistribution(const ConstantDistribution&);
 
+    ConstantDistribution& operator=(const ConstantDistribution&);
     
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const;
-    const std::string getFormatDescription() const;
-    /** @} */
-};
+    virtual ~ConstantDistribution() {}
+  
+    ConstantDistribution* clone() const
+    {
+      return new ConstantDistribution(*this);
+    }
+  
+  public:
+    void fireParameterChanged(const ParameterList& parameters);
+    
+    double randC() const throw (Exception) { return value_; }
 
+    std::string getName() const { return("Constant"); }
+
+    double getLowerBound() const { return value_; }
+                               
+    double getUpperBound() const { return value_; }
+
+    double qProb(double x) const { return (x >= 1) ? value_ : -NumConstants::VERY_BIG(); }
+     
+    double pProb(double x) const { return x < value_ ? 0 : 1; }
+                                
+    double Expectation(double a) const { return a < value_ ? 0 : 1; }
+
+    void restrictToConstraint(const Constraint& c);
+
+    void discretize() {}
+
+  };
+  
 } //end of namespace bpp.
 
-#endif // _DCSE_H_
+#endif  //_CONSTANTDISTRIBUTION_H_
 
diff --git a/src/Bpp/Numeric/Prob/DirichletDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/DirichletDiscreteDistribution.cpp
new file mode 100644
index 0000000..d43f6fe
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/DirichletDiscreteDistribution.cpp
@@ -0,0 +1,282 @@
+//
+// File: BetaDiscreteDistribution.cpp
+// Created by: Laurent Guéguen
+// Created on: jeudi 2 septembre 2010, à 17h 03
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "DirichletDiscreteDistribution.h"
+#include "BetaDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../NumConstants.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <cmath>
+
+using namespace std;
+
+/** Constructor: **************************************************************/
+
+DirichletDiscreteDistribution::DirichletDiscreteDistribution(vector<size_t> vn, Vdouble valpha) :
+  AbstractParameterAliasable("Dirichlet."),
+  vpBDD_()
+{
+  if (vn.size() <= 0 || vn.size() != valpha.size() - 1)
+    throw Exception("Wrong number of categories for Dirichlet distribution: " + TextTools::toString(vn.size()));
+
+  for (size_t j = 0; j < valpha.size(); j++)
+  {
+    addParameter_(new Parameter("Dirichlet.alpha_" + TextTools::toString(j + 1), valpha[j], new IntervalConstraint(1, 0.0001, true), true));
+  }
+
+  for (size_t j = 0; j < vn.size(); j++)
+  {
+    if (vn[j] <= 0)
+      throw Exception("Wrong number of categories in Dirichlet distribution constructor: " + TextTools::toString(vn[j]));
+  }
+
+  for (size_t j = 0; j < vn.size(); j++)
+  {
+    vpBDD_.push_back(new BetaDiscreteDistribution(vn[j], 1, 1));
+  }
+
+  discretize(valpha);
+}
+
+DirichletDiscreteDistribution::~DirichletDiscreteDistribution()
+{
+  for (unsigned int i = 0; i < vpBDD_.size(); i++)
+  {
+    delete vpBDD_[i];
+  }
+}
+
+/******************************************************************************/
+
+void DirichletDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
+{
+  AbstractParameterAliasable::fireParameterChanged(parameters);
+  applyParameters();
+}
+
+/******************************************************************************/
+
+void DirichletDiscreteDistribution::applyParameters()
+{
+  Vdouble valpha;
+
+  for (unsigned int j = 0; j < vpBDD_.size() + 1; j++)
+  {
+    valpha.push_back(getParameterValue("alpha_" + TextTools::toString(j + 1)));
+  }
+
+  discretize(valpha);
+}
+
+/******************************************************************************/
+
+void DirichletDiscreteDistribution::discretize(Vdouble& valpha)
+{
+  /* discretization of Dirichlet distribution with equal proportions in
+     each category */
+
+  double x;
+  ParameterList pL;
+  pL.addParameter(Parameter("Beta.alpha", 1));
+  pL.addParameter(Parameter("Beta.beta", 1));
+  for (unsigned int j = 0; j < vpBDD_.size(); j++)
+  {
+    x = 0;
+    for (unsigned int i = j + 1; i < valpha.size(); i++)
+    {
+      x += valpha[i];
+    }
+
+    pL.setParameterValue("Beta.alpha", valpha[j]);
+    pL.setParameterValue("Beta.beta", x);
+
+    vpBDD_[j]->matchParametersValues(pL);
+  }
+}
+
+
+/******************************************************************************/
+
+size_t DirichletDiscreteDistribution::getNumberOfCategories() const
+{
+  size_t n = 1;
+
+  for (size_t j = 0; j < vpBDD_.size(); j++)
+  {
+    n *= vpBDD_[j]->getNumberOfCategories();
+  }
+
+  return n;
+}
+
+/******************************************************************************/
+
+Vdouble DirichletDiscreteDistribution::getValueCategory(Vdouble& value) const
+{
+  if (value.size() != vpBDD_.size() + 1)
+    throw Exception("Bad Vdouble parameter in DirichletDiscreteDistribution::getValueCategory");
+
+  Vdouble vd;
+  double y, sumc = 0;
+
+  for (size_t j = 0; j < vpBDD_.size(); j++)
+  {
+    if (1 - sumc < NumConstants::VERY_TINY())
+      y = vpBDD_[j]->getValueCategory(NumConstants::VERY_TINY());
+    else
+      y = vpBDD_[j]->getValueCategory(value[j] / (1 - sumc)) * (1 - sumc);
+    sumc += y;
+    vd.push_back(y);
+  }
+  vd.push_back(1 - sumc);
+  return vd;
+}
+
+/******************************************************************************/
+
+double DirichletDiscreteDistribution::getProbability(Vdouble& category) const
+{
+  if (category.size() != vpBDD_.size() + 1)
+    throw Exception("Bad Vdouble parameter in DirichletDiscreteDistribution::getProbability");
+
+  double sumc = 0;
+  double p = 1;
+
+  for (unsigned int j = 0; j < vpBDD_.size(); j++)
+  {
+    p *= vpBDD_[j]->getProbability(category[j] / (1 - sumc));
+    sumc += category[j];
+  }
+  return p;
+}
+
+/******************************************************************************/
+
+VVdouble DirichletDiscreteDistribution::getCategories() const
+{
+  VVdouble vvd1, vvd2;
+  Vdouble vdj, vd;
+  double sumc = 0;
+
+  vdj = vpBDD_[0]->getCategories();
+  for (unsigned int k = 0; k < vdj.size(); k++)
+  {
+    vd.push_back(vdj[k]);
+    vvd1.push_back(vd);
+    vd.pop_back();
+  }
+
+  for (unsigned int j = 1; j < vpBDD_.size(); j++)
+  {
+    vdj = vpBDD_[j]->getCategories();
+    vvd2.clear();
+    for (unsigned int i = 0; i < vvd1.size(); i++)
+    {
+      vd = vvd1[i];
+      sumc = 0;
+      for (unsigned int k = 0; k < vd.size(); k++)
+      {
+        sumc += vd[k];
+      }
+      for (unsigned int k = 0; k < vdj.size(); k++)
+      {
+        vd.push_back(vdj[k] * (1 - sumc));
+        vvd2.push_back(vd);
+        vd.pop_back();
+      }
+    }
+    vvd1 = vvd2;
+  }
+
+  vvd2.clear();
+  for (unsigned int i = 0; i < vvd1.size(); i++)
+  {
+    vd = vvd1[i];
+    sumc = 0;
+    for (unsigned int k = 0; k < vd.size(); k++)
+    {
+      sumc += vd[k];
+    }
+    vd.push_back(1 - sumc);
+    vvd2.push_back(vd);
+  }
+
+  return vvd2;
+}
+
+/******************************************************************************/
+
+Vdouble DirichletDiscreteDistribution::rand() const
+{
+  Vdouble vd;
+  double x, sumc = 0;
+  for (unsigned int j = 0; j < vpBDD_.size(); j++)
+  {
+    x = vpBDD_[j]->rand() * (1 - sumc);
+    sumc += x;
+    vd.push_back(x);
+  }
+
+  vd.push_back(1 - sumc);
+  return vd;
+}
+
+/******************************************************************************/
+
+Vdouble DirichletDiscreteDistribution::randC() const
+{
+  Vdouble vd;
+  double x, sumc = 0;
+  for (unsigned int j = 0; j < vpBDD_.size(); j++)
+  {
+    x = vpBDD_[j]->randC() * (1 - sumc);
+    sumc += x;
+    vd.push_back(x);
+  }
+
+  vd.push_back(1 - sumc);
+  return vd;
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Prob/DirichletDiscreteDistribution.h b/src/Bpp/Numeric/Prob/DirichletDiscreteDistribution.h
new file mode 100644
index 0000000..959c3ec
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/DirichletDiscreteDistribution.h
@@ -0,0 +1,178 @@
+//
+// File: DirichletDiscreteDistribution.h
+// Created by: Laurent Guéguen
+// Created on: jeudi 2 septembre 2010, à 17h 03
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _DIRICHLETDISCRETEDISTRIBUTION_H_
+#define _DIRICHLETDISCRETEDISTRIBUTION_H_
+
+#include "MultipleDiscreteDistribution.h"
+#include "BetaDiscreteDistribution.h"
+#include "../VectorTools.h"
+#include "../ParameterAliasable.h"
+#include "../../Exceptions.h"
+#include "../../Io/OutputStream.h"
+
+namespace bpp
+{
+/**
+ * @brief Discretized Dirichlet distribution. If the distribution is
+ * in n dimensions, the domain is the n-1 simplex.
+ *
+ * The discretization is made in the order of these dimensions. Then
+ * the order of the dimensions is not neutral on the resulting
+ * categories.
+ *
+ * Here is an example of the discretization process: if the
+ * distribution is in 3 dimensions, and the number of categories is
+ * 4 in the first dimension, 3 in the second and 5 in the third, the
+ * first interval is split in 4 equi-probable intervals, and each
+ * interval is split on the second dimension in 3 equi-probable
+ * intervals, and each of the 12 resulting 2D intervals is split in
+ * 5 equi-probable 3D-intervals. Eventually, there are 60
+ * equi-probable categories.
+ *
+ * In the same example, if the distribution is followed by the
+ * random vector @f$ (X_1,X_2,X_3) @f$, the 1D distribution used for
+ * @f$ X_1 @f$ is the marginal distribution, which discretized
+ * values are say, @f$ v_1^1, v_1^2, v_1^3, v_1^4 @f$, then the four
+ * 1D distributions used for @f$ X_2 @f$ are the conditional
+ * marginal distributions @f$ (X_2|X_1=v_1^1), (X_2|X_1=v_1^2),
+ * (X_2|X_1=v_1^3), (X_2|X_1=v_1^4) @f$. And in a similar way for
+ * @f$ X_3 @f$, with the 12 resulting conditions on @f$ X_1 @f$ and
+ * @f$ X_2 @f$.
+ *
+ *
+ * It uses the AbstractDiscreteDistribution comparator class to deal
+ * with double precision. By default, category values that differ
+ * less than 10E-9 will be considered identical.
+ *
+ *
+ * The successive discretization process is done using the
+ * distributions, if the parameters are @f$ (\alpha_1, ...,
+ * \alpha_n)@f$:
+ *
+ * @f$ X_1 @f$ follows Beta(@f$ \alpha_1, \sum_{i=2}^n \alpha_i @f$).
+ *
+ * @f$ X_j @f$ follows @f$ (1-\sum_{i=1}^{j-1} X_i) @f$ *
+ * Beta(@f$ \alpha_j, \sum_{i=j+1}^n \alpha_i @f$).
+ *
+ * @f$ X_n = 1 - \sum_{i=1}^{n-1} X_i @f$.
+ *
+ *
+ * The parameters are: alpha_1, ... alpha_n @f$ \in [0.0001;\infty[
+ * @f$.
+ */
+
+class DirichletDiscreteDistribution :
+  public MultipleDiscreteDistribution,
+  public AbstractParameterAliasable
+{
+private:
+  std::vector<BetaDiscreteDistribution* > vpBDD_;
+
+public:
+  /**
+   * @brief Build a new discretized Dirichlet distribution
+   *
+   * @param vn the vector of the dim-1 numbers of categories to use.
+   * @param valpha the vector of the dim alpha parameters.
+   */
+  DirichletDiscreteDistribution(std::vector<size_t> vn, Vdouble valpha);
+
+  ~DirichletDiscreteDistribution();
+
+  DirichletDiscreteDistribution* clone() const
+  {
+    return new DirichletDiscreteDistribution(*this);
+  }
+
+protected:
+  void applyParameters();
+
+public:
+  std::string getName() const {return("Dirichlet");}
+  
+  void fireParameterChanged(const ParameterList& parameters);
+
+  /**
+   * @return The number of categories
+   */
+  size_t getNumberOfCategories() const;
+
+  /**
+   * @param Vvalue
+   * @return The vector of categoryIndex of the classes the value is
+   * in. Throws a ConstraintException if the value is off the domain
+   * of the DirichletDiscreteDistribution.
+   */
+  Vdouble getValueCategory(Vdouble& Vvalue) const;
+
+  VVdouble getCategories() const;
+
+  /**
+   * @param category The vector of values associated to the class.
+   * @return The probability associated to a given class.
+   */
+  virtual double getProbability(Vdouble& category) const;
+
+  /**
+   * @brief Draw a random vector from this distribution.
+   *
+   * This vector will be one of the class values, drawn according
+   * to the class probabilities.
+   *
+   * @return A random number according to this distribution.
+   */
+
+  Vdouble rand() const;
+
+  /**
+   * @brief Draw a random vector from the continuous version of this
+   * distribution.
+   *
+   * @return A random vector according to this distribution.
+   */
+  Vdouble randC() const;
+
+protected:
+  void discretize(Vdouble& valpha);
+};
+} // end of namespace bpp.
+
+#endif  // _DIRICHLETDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/DiscreteDistribution.h b/src/Bpp/Numeric/Prob/DiscreteDistribution.h
new file mode 100644
index 0000000..2c14d2e
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/DiscreteDistribution.h
@@ -0,0 +1,320 @@
+//
+// File: DiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: ?
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _DISCRETEDISTRIBUTION_H_
+#define _DISCRETEDISTRIBUTION_H_
+
+#include "../VectorTools.h"
+#include "../ParameterAliasable.h"
+#include "../NumConstants.h"
+#include "../../Exceptions.h"
+#include "../../Io/OutputStream.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Interface for discrete distribution objects.
+   *
+   * A discrete distribution usually contains a finite set of
+   * categories and a probability associated to each.
+   * 
+   * Each category (or class) is defined by two bounds, and sometimes by
+   * a mean or a median value.
+   *
+   * A discrete distribution may contain one or several parameters.
+   * The probabilities associated to each class usually depends on
+   * the parameter values.
+   * In some cases, the number and/or bounds of the classes may also 
+   * depend on the parameters values, depending on the kind of
+   * discretization used.
+   */
+  class DiscreteDistribution:
+    public virtual ParameterAliasable
+  {
+  public:
+    DiscreteDistribution() {}
+    virtual ~DiscreteDistribution() {}
+
+  
+    DiscreteDistribution* clone() const = 0;
+
+  public:
+		
+    /**
+     * @brief Get the name of the distribution.
+     *
+     * @return The name of this distribution.
+     */
+    virtual std::string getName() const = 0;
+
+    /**
+     * @return The number of categories.
+     */
+    virtual size_t getNumberOfCategories() const = 0;
+
+    
+    /**
+     * @brief sets the number of categories and discretizes if there
+     * is a change in this number.
+     */
+    
+    virtual void setNumberOfCategories(size_t nbClasses) = 0;
+		
+    /**
+     * @param value 
+     * @return The value of the category the value is in. Throws a
+     * OutOfRangeException if the value is off the domain of the
+     * DiscreteDistribution.
+     */
+    
+    virtual double getValueCategory(double value) const = 0 ;
+    
+    /**
+     * @param categoryIndex Class index.
+     * @return The value associated to a given class.
+     */
+
+    virtual double getCategory(size_t categoryIndex) const = 0;
+		
+    /**
+     * @param categoryIndex Class index.
+     * @return The probability associated to a given class.
+     */
+    virtual double getProbability(size_t categoryIndex) const = 0;
+
+    /**
+     * @param category The value associated to the class.
+     * @return The probability associated to a given class.
+     */
+    virtual double getProbability(double category) const = 0;
+
+    /**
+     * @return A vector with all classes values.
+     */
+    virtual Vdouble getCategories() const = 0;
+    /**
+     * @return A vector with all probabilities.
+     */
+    virtual Vdouble getProbabilities() const = 0;
+
+    /**
+     * @brief Set the probability associated to a class.
+     *
+     * If the category does not exist, a new category is created
+     * with the corresponding probability.
+     * If the category already exist, its probability is set to 'probability'.
+     * The sum of all probabilities is not checked.
+     * 
+     * @param category The class value.
+     * @param probability The class probability.
+     */
+    virtual void set(double category, double probability) = 0;
+		
+    /**
+     * @brief Modify the probability associated to a class.
+     *
+     * If the category does not exist, a new category is created
+     * with the corresponding probability.
+     * if the category exists, add 'probability' to the existing probability.
+     * The sum of all probabilities is not checked.
+     * 
+     * @param category The class value.
+     * @param probability The class probability.
+     */
+    virtual void add(double category, double probability) = 0;
+
+    /**
+     * @return \f$Pr(x < \mbox{category})\f$.
+     * @param category The class value.
+     */
+    virtual double getInfCumulativeProbability(double category) const = 0;
+    /**
+     * @return \f$Pr(x \leq \mbox{category})\f$.
+     * @param category The class value.
+     */
+    virtual double getIInfCumulativeProbability(double category) const = 0;
+    /**
+     * @return \f$Pr(x > \mbox{category})\f$.
+     * @param category The class value.
+     */
+    virtual double getSupCumulativeProbability(double category) const = 0;
+    /**
+     * @return \f$Pr(x \geq \mbox{category})\f$.
+     * @param category The class value.
+     */
+    virtual double getSSupCumulativeProbability(double category) const = 0;
+	
+    /**
+     * @brief Draw a random number from this distribution.
+     *
+     * This number will be one of the class values, drawn according
+     * to the class probabilities.
+     * 
+     * @return A random number according to this distribution.
+     */
+    virtual double rand() const = 0;
+
+    /**
+     * @brief Draw a random number from the continuous version of this distribution, if it exists.
+     *
+     * Uses the continuous version of this distribution to draw a random number.
+     * 
+     * @return A random number according to this distribution.
+     * @throw Exception If there is no continuous version of this distribution.
+     */
+    virtual double randC() const throw (Exception) = 0;
+
+    /**
+     * @brief Return the quantile of the continuous version of the
+     * distribution, ie y such that @f$ Prob(X<y)=x @f$
+     * 
+     **/
+     
+    virtual double qProb(double x) const  = 0;
+
+    /**
+     * @brief Return the cumulative quantile of the continuous version
+     * of the distribution, ie @f$ Prob(X<x) @f$.
+     *
+     **/
+     
+    virtual double pProb(double x) const  = 0;
+
+    /**
+     * @brief Return a primitive function used for the expectation
+     * of the continuous version of the distribution, ie
+     * @f$ E(X|...<=X<a) = \int_{...}^a t.dProb(t) dt @f$.
+     *
+     **/
+     
+    virtual double Expectation(double a) const  = 0;
+
+    /**
+     *@brief Sets the median value to true to say that the value in a
+     * class is proportional to the median value of the class, the
+     * proportionality factor being such that the sum of the values
+     * equals the expectation of the distribution. If it is set to
+     * false, the value is the mean value in the class.
+     *
+     * If the median value is modified, the discretization process is
+     * launched.
+     *
+     * @param median tells how the value associated to each class is
+     * computed. 
+     */
+    
+    virtual void setMedian(bool median) = 0;
+    
+    /**
+     * @brief Discretizes the distribution in equiprobable classes.
+     */
+
+    virtual void discretize() = 0;
+
+    /**
+     *@return A vector of all the bounds
+     */
+    virtual Vdouble getBounds() const = 0;
+    
+    /**
+     * @return the i th internal bound
+     */
+    virtual double getBound(size_t) const = 0;
+
+    /**
+     *@brief methods about the range of the definition
+     *
+     **/
+     
+    /**
+     * @return The lowest value.
+     */
+    virtual double getLowerBound() const {
+      return (-NumConstants::VERY_BIG());
+    }
+  
+    /**
+     * @return The highest value.
+     */
+    virtual double getUpperBound() const {
+      return (NumConstants::VERY_BIG());
+    }
+  
+    /**
+     * @return The lowest value.
+     */
+    virtual bool strictLowerBound() const {
+      return (true);
+    }
+  
+    /**
+     * @return The highest value.
+     */
+    virtual bool strictUpperBound() const {
+      return (true);
+    }
+  
+    /**
+     * @brief Restricts the distribution to the domain where the
+     * constraint is respected, in addition of other predefined
+     * constraints.
+     *
+     * If the domain interval is modified, the discretization process
+     * is launched.
+     *
+     * @param c The Constraint to respect.
+     *
+     */
+    
+    virtual void restrictToConstraint(const Constraint& c) = 0;
+          
+    /**
+     * @brief Print the distribution (categories and corresponding probabilities) to a stream.
+     *
+     * @param out The outstream where to print the distribution.
+     */
+    virtual void print(OutputStream& out) const = 0;
+
+  };
+
+} //end of namespace bpp.
+
+#endif  //_DISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Seq/AlphabetIndex/BLOSUM50.cpp b/src/Bpp/Numeric/Prob/ExponentialDiscreteDistribution.cpp
similarity index 63%
rename from src/Bpp/Seq/AlphabetIndex/BLOSUM50.cpp
rename to src/Bpp/Numeric/Prob/ExponentialDiscreteDistribution.cpp
index 1094a5c..f63c9fb 100644
--- a/src/Bpp/Seq/AlphabetIndex/BLOSUM50.cpp
+++ b/src/Bpp/Numeric/Prob/ExponentialDiscreteDistribution.cpp
@@ -1,15 +1,14 @@
 //
-// File: BLOSUM50.cpp
+// File: ExponentialDiscreteDistribution.cpp
 // Created by: Julien Dutheil
-// Created on: Tue Jan 18 10:28 2007
+// Created on: Tue Nov 13 12:37 2007
 //
 
-
 /*
    Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
    This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
+   for numerical calculus.
 
    This software is governed by the CeCILL  license under French law and
    abiding by the rules of distribution of free software.  You can  use,
@@ -38,41 +37,38 @@
    knowledge of the CeCILL license and that you accept its terms.
  */
 
-#include "BLOSUM50.h"
-
-#include "../Alphabet/AlphabetTools.h"
+#include "ExponentialDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../NumConstants.h"
+#include "../../Utils/MapTools.h"
 
-// from the STL:
-#include <string>
+using namespace bpp;
 
+// From the STL:
+#include <cmath>
 using namespace std;
-using namespace bpp;
 
-BLOSUM50::BLOSUM50() :
-  distanceMatrix_(20, 20),
-  alpha_(&AlphabetTools::PROTEIN_ALPHABET)
-{
-  #include "__BLOSUM50MatrixCode"
-}
+/****************************************************************/
 
-double BLOSUM50::getIndex(int state1, int state2) const
-throw (BadIntException)
+ExponentialDiscreteDistribution::ExponentialDiscreteDistribution(size_t n, double lambda) :
+  AbstractParameterAliasable("Exponential."),
+  AbstractDiscreteDistribution(n, "Exponential."),
+  lambda_(lambda)
 {
-  size_t stateIndex1 = alpha_->getStateIndex(state1);
-  size_t stateIndex2 = alpha_->getStateIndex(state2);
-  return distanceMatrix_(stateIndex1, stateIndex2);
-}
+  addParameter_(new Parameter("Exponential.lambda", lambda,  &Parameter::R_PLUS));
 
-double BLOSUM50::getIndex(const std::string& state1, const std::string& state2) const
-throw (BadCharException)
-{
-  return distanceMatrix_(
-      static_cast<size_t>(alpha_->charToInt(state1)),
-      static_cast<size_t>(alpha_->charToInt(state2)));
+  intMinMax_.setLowerBound(0, true);
+  discretize();
 }
 
-LinearMatrix<double>* BLOSUM50::getIndexMatrix() const
+/******************************************************************************/
+
+void ExponentialDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
 {
-  return new LinearMatrix<double>(distanceMatrix_);
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  lambda_ = getParameterValue("lambda");
+  discretize();
 }
 
+
+
diff --git a/src/Bpp/Numeric/Prob/ExponentialDiscreteDistribution.h b/src/Bpp/Numeric/Prob/ExponentialDiscreteDistribution.h
new file mode 100644
index 0000000..26c18ac
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/ExponentialDiscreteDistribution.h
@@ -0,0 +1,122 @@
+//
+// File: ExponentialDiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: Tue Nov 13 12:37 2007
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _EXPONENTIALDISCRETEDISTRIBUTION_H_
+#define _EXPONENTIALDISCRETEDISTRIBUTION_H_
+
+#include "AbstractDiscreteDistribution.h"
+#include "../Constraints.h"
+#include "../Random/RandomTools.h"
+
+namespace bpp
+{
+/**
+ * @brief Discretized Exponential distribution.
+ *
+ * @author Julien Dutheil
+ */
+class ExponentialDiscreteDistribution :
+  public AbstractDiscreteDistribution
+{
+protected:
+  double lambda_;
+
+public:
+  /**
+   * @brief Build a new discretized exponential distribution.
+   * @param n the number of categories to use.
+   * @param lambda The lambda parameter.
+   *
+   * The Parameter is: lambda @f$ \in [0;\infty[ @f$.
+   *
+   */
+
+  ExponentialDiscreteDistribution(size_t n, double lambda = 1.);
+
+  ExponentialDiscreteDistribution(const ExponentialDiscreteDistribution& dist) :
+    AbstractParameterAliasable(dist),
+    AbstractDiscreteDistribution(dist),
+    lambda_(dist.lambda_)
+  {}
+
+  ExponentialDiscreteDistribution& operator=(const ExponentialDiscreteDistribution& dist)
+  {
+    AbstractParameterAliasable::operator=(dist);    
+    AbstractDiscreteDistribution::operator=(dist);
+    lambda_ = dist.lambda_;
+    return *this;
+  }
+
+  ~ExponentialDiscreteDistribution(){};
+
+  ExponentialDiscreteDistribution* clone() const { return new ExponentialDiscreteDistribution(*this); }
+
+public:
+  std::string getName() const {return("Exponential");}
+  
+  void fireParameterChanged(const ParameterList& parameters);
+
+  double randC() const throw (Exception)
+  {
+    double x = RandomTools::randExponential(1. / getParameterValue("lambda"));
+    while (!intMinMax_.isCorrect(x))
+      x = RandomTools::randExponential(1. / getParameterValue("lambda"));
+
+    return x;
+  }
+
+  double pProb(double x) const
+  {
+    return 1. - exp(-lambda_ * x);
+  }
+
+  double qProb(double x) const
+  {
+    return -log(1. - x) / lambda_;
+  }
+
+  double Expectation(double a) const
+  {
+    return 1. / lambda_ - exp(-a * lambda_) * (a + 1. / lambda_);
+  }
+};
+} //end of namespace bpp.
+
+#endif  //_EXPONENTIALDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/GammaDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/GammaDiscreteDistribution.cpp
new file mode 100644
index 0000000..f4ef78d
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/GammaDiscreteDistribution.cpp
@@ -0,0 +1,135 @@
+//
+// File: GammaDiscreteDistribution.cpp
+// Created by: Julien Dutheil
+// Created on: Sun Oct 26 20:36:12 2003
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "GammaDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../NumConstants.h"
+#include "../../Utils/MapTools.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <cmath>
+
+using namespace std;
+
+/** Constructor: **************************************************************/
+
+GammaDiscreteDistribution::GammaDiscreteDistribution(size_t n, double alpha, double beta, double minimumAlpha, double minimumBeta, bool paramOffset, double offset) :
+  AbstractParameterAliasable("Gamma."),
+  AbstractDiscreteDistribution(n, "Gamma."),
+  alpha_(alpha),
+  beta_(beta),
+  offset_(offset),
+  ga1_(1)
+{
+  // We use a lower bound of 0.0001 for alpha and beta to prohibe errors due to computer
+  // floating precision: if alpha is quite low (gamma -> constant), some classes
+  // may have the same category value, leading to a classe number lower than expected.
+  // NB: if this is the case, then a warning is shown. This may happen in optimization
+  // algorithms.
+  addParameter_(new Parameter("Gamma.alpha", alpha, new IntervalConstraint(1, minimumAlpha, true), true));
+  addParameter_(new Parameter("Gamma.beta", beta, new IntervalConstraint(1, minimumBeta, true), true));
+  if (paramOffset)
+    addParameter_(new Parameter("Gamma.offset", offset));
+  
+  ga1_ = exp(RandomTools::lnGamma(alpha_ + 1) - RandomTools::lnGamma(alpha_));
+
+  intMinMax_.setLowerBound(offset_, true);
+  discretize();
+}
+
+GammaDiscreteDistribution::GammaDiscreteDistribution(const GammaDiscreteDistribution& gdd) :
+  AbstractParameterAliasable(gdd),
+  AbstractDiscreteDistribution(gdd),
+  alpha_(gdd.alpha_),
+  beta_(gdd.beta_),
+  offset_(gdd.offset_),
+  ga1_(gdd.ga1_)
+{
+}
+
+GammaDiscreteDistribution& GammaDiscreteDistribution::operator=(const GammaDiscreteDistribution& gdd)
+{
+  AbstractParameterAliasable::operator=(gdd);
+  AbstractDiscreteDistribution::operator=(gdd);
+  alpha_=gdd.alpha_;
+  beta_=gdd.beta_;
+  offset_=gdd.offset_;
+  ga1_=gdd.ga1_;
+
+  return *this;
+}
+
+GammaDiscreteDistribution::~GammaDiscreteDistribution() {}
+
+/******************************************************************************/
+
+void GammaDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
+{
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  alpha_ = getParameterValue("alpha");
+  beta_ = getParameterValue("beta");
+  if (hasParameter("offset"))
+      offset_ = getParameterValue("offset");
+  ga1_ = exp(RandomTools::lnGamma(alpha_ + 1) - RandomTools::lnGamma(alpha_));
+
+  discretize();
+}
+
+/******************************************************************************/
+
+// Adapted from function DiscreteGamma of Yang
+
+double GammaDiscreteDistribution::qProb(double x) const
+{
+  return offset_ + RandomTools::qGamma(x, alpha_, beta_);
+}
+
+
+double GammaDiscreteDistribution::pProb(double x) const
+{
+  return RandomTools::pGamma(x-offset_, alpha_, beta_);
+}
+
+double GammaDiscreteDistribution::Expectation(double a) const
+{
+  return RandomTools::pGamma(a-offset_, alpha_ + 1, beta_) / beta_ * ga1_ + (offset_ > 0 ? offset_ * RandomTools::pGamma(a - offset_, alpha_, beta_) : 0);
+}
+
diff --git a/src/Bpp/Numeric/Prob/GammaDiscreteDistribution.h b/src/Bpp/Numeric/Prob/GammaDiscreteDistribution.h
new file mode 100644
index 0000000..e84a0a6
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/GammaDiscreteDistribution.h
@@ -0,0 +1,125 @@
+//
+// File: GammaDiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: Sun Oct 26 20:36:12 2003
+//
+
+/*
+  Copyright or © or Copr. CNRS, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _GAMMADISCRETEDISTRIBUTION_H_
+#define _GAMMADISCRETEDISTRIBUTION_H_
+
+#include "AbstractDiscreteDistribution.h"
+#include "../Constraints.h"
+#include "../Random/RandomTools.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Discretized Gamma distribution with an offset.
+   *
+   * @author Julien Dutheil, Laurent Guéguen, with original code from Tal Pupko and Ziheng Yang.
+   */
+  
+  class GammaDiscreteDistribution:
+    public AbstractDiscreteDistribution
+  {
+  private:
+
+    double alpha_, beta_;
+
+    double offset_;
+    
+    // To prevent useless computations
+    double ga1_;
+    
+  public:
+    std::string getName() const {return("Gamma");}
+
+    /**
+     * @brief Build a new discretized gamma distribution.
+     * @param n the number of categories to use.
+     * @param alpha The alpha parameter (shape)
+     * @param beta The beta parameter (rate)
+     * @param minimumAlpha The minimum allowed value for parameter alpha.
+     * @param minimumBeta The minimum allowed value for parameter beta.
+     * @param paramOffset bool if the distribution has an offset
+     *               parameter (default: false).
+     * @param offset The distribution is offset + Gamma (default 0).
+     *         P(X<x)=pGamma(x-offset,alpha,beta)
+     *
+     * The Parameters are: alpha and beta @f$ \in [minimumBound;\infty[ @f$.
+     * Small values of alpha and/or beta can lead to discretization issues.
+     *
+     * 
+     * If @f$ alpha > 1 @f$, the minimum value of the distribution is
+     * set to offset+1e-12, otherwise it is offset.
+     */
+    
+    GammaDiscreteDistribution(size_t n, double alpha = 1., double beta = 1., double minimumAlpha = 0.05, double minimumBeta = 0.05, bool paramOffset = false, double offset = 0);
+
+    GammaDiscreteDistribution(const GammaDiscreteDistribution&);
+
+    GammaDiscreteDistribution& operator=(const GammaDiscreteDistribution&);
+
+    virtual ~GammaDiscreteDistribution();
+
+    GammaDiscreteDistribution* clone() const { return new GammaDiscreteDistribution(*this); }
+
+    void fireParameterChanged(const ParameterList & parameters);
+  
+    double randC() const throw (Exception)
+    {
+      double x= RandomTools::randGamma(getParameterValue("alpha"),
+                                       getParameterValue("beta"));
+      while (!intMinMax_.isCorrect(x))
+        x= RandomTools::randGamma(getParameterValue("alpha"),
+                                  getParameterValue("beta"));
+      
+      return x + offset_;
+    }
+
+    double qProb(double x) const;
+     
+    double pProb(double x) const;
+
+    double Expectation(double a) const;
+
+};
+
+} //end of namespace bpp.
+
+#endif  //_GAMMADISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/GaussianDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/GaussianDiscreteDistribution.cpp
new file mode 100644
index 0000000..833aa55
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/GaussianDiscreteDistribution.cpp
@@ -0,0 +1,109 @@
+//
+// File: GaussianDiscreteDistribution.cpp
+// Created by: Laurent Guéguen
+// Created on: April 2010
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "GaussianDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../NumConstants.h"
+#include "../../Utils/MapTools.h"
+
+using namespace bpp;
+
+// From the STL:
+#include <cmath>
+
+using namespace std;
+
+/** Constructor: **************************************************************/
+
+GaussianDiscreteDistribution::GaussianDiscreteDistribution(size_t n, double mu, double sigma) :
+  AbstractParameterAliasable("Gaussian."),
+  AbstractDiscreteDistribution(n,"Gaussian."), mu_(mu), sigma_(sigma)
+{
+  addParameter_(new Parameter("Gaussian.mu", mu));
+  addParameter_(new Parameter("Gaussian.sigma", sigma, &Parameter::R_PLUS_STAR));
+  discretize();
+}
+
+GaussianDiscreteDistribution::GaussianDiscreteDistribution(const GaussianDiscreteDistribution& gdd) :
+  AbstractParameterAliasable(gdd),
+  AbstractDiscreteDistribution(gdd),
+  mu_(gdd.mu_),
+  sigma_(gdd.sigma_)
+{
+}
+
+GaussianDiscreteDistribution& GaussianDiscreteDistribution::operator=(const GaussianDiscreteDistribution& gdd) 
+{
+  AbstractParameterAliasable::operator=(gdd);
+  AbstractDiscreteDistribution::operator=(gdd);
+  mu_=gdd.mu_;
+  sigma_=gdd.sigma_;
+
+  return *this;
+}
+
+GaussianDiscreteDistribution::~GaussianDiscreteDistribution() {}
+
+/******************************************************************************/
+
+void GaussianDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
+{
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  mu_ = getParameterValue("mu");
+  sigma_ = getParameterValue("sigma");
+  discretize();  
+}
+
+/******************************************************************************/
+
+double GaussianDiscreteDistribution::qProb(double x) const
+{
+  return RandomTools::qNorm(x, mu_, sigma_);
+}
+
+double GaussianDiscreteDistribution::pProb(double x) const
+{
+  return RandomTools::pNorm(x, mu_, sigma_);
+}
+
+double GaussianDiscreteDistribution::Expectation(double a) const
+{
+  return -sigma_/sqrt(2*M_PI)*exp(-pow((a-mu_)/sigma_,2)/2)
+    +mu_*RandomTools::pNorm(a,mu_,sigma_);
+}
diff --git a/src/Bpp/Seq/Io/GenBank.h b/src/Bpp/Numeric/Prob/GaussianDiscreteDistribution.h
similarity index 52%
rename from src/Bpp/Seq/Io/GenBank.h
rename to src/Bpp/Numeric/Prob/GaussianDiscreteDistribution.h
index f4a450f..a7fb8bc 100644
--- a/src/Bpp/Seq/Io/GenBank.h
+++ b/src/Bpp/Numeric/Prob/GaussianDiscreteDistribution.h
@@ -1,14 +1,14 @@
 //
-// File: GenBank.h
-// Created by: Julien Dutheil
-// Created on: Tue Oct 2 2007
+// File: GaussianDiscreteDistribution.h
+// Created by: Laurent Guéguen
+// Created on: April 2010
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,58 +37,68 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _GENBANK_H_
-#define _GENBANK_H_
+#ifndef _GAUSSIANDISCRETEDISTRIBUTION_H_
+#define _GAUSSIANDISCRETEDISTRIBUTION_H_
 
-#include "AbstractISequence.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
+#include "AbstractDiscreteDistribution.h"
+#include "../Constraints.h"
+#include "../Random/RandomTools.h"
 
 namespace bpp
 {
 
 /**
- * @brief The GenBank sequence file format.
+ * @brief Discretized Gaussian distribution.
  *
- * For now, only read raw sequences. Features are not yet supported.
+ * @author Laurent Guéguen
  */
-class GenBank :
-  public AbstractISequence
+class GaussianDiscreteDistribution:
+  public AbstractDiscreteDistribution
 {
-  public:
+  private:
+  double mu_, sigma_;
   
+  public:
     /**
-     * @brief Build a new GenBank object.
+     * @brief Build a new discretized normal distribution.
+     * @param n the number of categories to use.
+     * @param mu The mean parameter.
+     * @param sigma The standard deviation parameter.
+     *
+     * The Parameters are: mu @f$ \in ]-\infty;\infty[ @f$ and sigma
+     * @f$ \in ]0;\infty[ @f$.
+     *
      */
-    GenBank() {}
+  GaussianDiscreteDistribution(size_t n, double mu=0., double sigma = 1.);
 
-    virtual ~GenBank() {}
+  GaussianDiscreteDistribution(const GaussianDiscreteDistribution&);
 
-  public:
+  GaussianDiscreteDistribution& operator=(const GaussianDiscreteDistribution&);
+  
+  virtual ~GaussianDiscreteDistribution();
 
-    /**
-     * @name The AbstractISequence interface.
-     *
-     * @{
-     */
-    void appendSequencesFromStream(std::istream& input, SequenceContainer& sc) const throw (Exception);
-    /** @} */
+  GaussianDiscreteDistribution* clone() const { return new GaussianDiscreteDistribution(*this); }
   
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const { return "GenBank file"; };
-    const std::string getFormatDescription() const
-    {
-      return "Sequences following the GenBank data base format.";
-    }
-    /** @} */
-};
+public:
+
+  std::string getName() const {return("Gaussian");}
+
+  void fireParameterChanged(const ParameterList & parameters);
+  
+  double randC() const throw (Exception)
+  {
+    return RandomTools::randGaussian(mu_,sigma_);
+  }
+
+  double qProb(double x) const;
+     
+  double pProb(double x) const;
+
+  double Expectation(double a) const;
 
+};
+  
 } //end of namespace bpp.
 
-#endif // _GENBANK_H_
+#endif  //_GAUSSIANDISCRETEDISTRIBUTION_H_
 
diff --git a/src/Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.cpp
new file mode 100644
index 0000000..68078a9
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.cpp
@@ -0,0 +1,157 @@
+//
+// File: InvariantMixedDiscreteDistribution.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Dec 24 12:02 2007
+//
+
+/*
+   Copyright or © or Copr. CNRS, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "InvariantMixedDiscreteDistribution.h"
+#include "../../Utils/MapTools.h"
+
+
+using namespace bpp;
+using namespace std;
+
+/******************************************************************************/
+
+InvariantMixedDiscreteDistribution::InvariantMixedDiscreteDistribution(
+  DiscreteDistribution* dist, double p, double invariant) :
+  AbstractParameterAliasable("Invariant."),
+  AbstractDiscreteDistribution(1, "Invariant."),
+  dist_(dist),
+  invariant_(invariant),
+  p_(p),
+  nestedPrefix_(dist->getNamespace())
+{
+  // We first change the namespace of the nested distribution:
+  dist_->setNamespace("Invariant." + nestedPrefix_);
+  addParameters_(dist_->getIndependentParameters());
+  addParameter_(new Parameter("Invariant.p", p, &Parameter::PROP_CONSTRAINT_IN));
+
+  updateDistribution();
+}
+
+/******************************************************************************/
+
+void InvariantMixedDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
+{
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  p_ = getParameterValue("p");
+  dist_->matchParametersValues(parameters);
+
+  updateDistribution();
+}
+
+/******************************************************************************/
+
+void InvariantMixedDiscreteDistribution::updateDistribution()
+{
+  distribution_.clear();
+  bounds_.clear();
+
+  size_t distNCat = dist_->getNumberOfCategories();
+  vector<double> probs = dist_->getProbabilities();
+  vector<double> cats  = dist_->getCategories();
+
+  distribution_[invariant_] = p_;
+  for (size_t i = 0; i < distNCat; i++)
+  {
+    if (cats[i] == invariant_)
+      distribution_[invariant_] += (1. - p_) * probs[i];
+    else
+      distribution_[cats[i]] = (1. - p_) * probs[i];
+  }
+
+  intMinMax_.setLowerBound(dist_->getLowerBound(), !dist_->strictLowerBound());
+  intMinMax_.setUpperBound(dist_->getUpperBound(), !dist_->strictUpperBound());
+
+  if (invariant_ <= intMinMax_.getLowerBound())
+    intMinMax_.setLowerBound(invariant_, true);
+  if (invariant_ >= intMinMax_.getUpperBound())
+    intMinMax_.setUpperBound(invariant_, true);
+
+  numberOfCategories_ = distribution_.size();
+
+  // bounds_
+
+  // if invariant_ is between 2 values of dist_, bounds_ are set in the
+  // middle of the 3 values
+
+  bool nv = true;
+
+  double a = dist_->getCategory(0), b;
+  if (nv && (invariant_ < a))
+  {
+    bounds_.push_back((a + invariant_) / 2);
+    nv = false;
+  }
+
+  for (size_t i = 1; i < distNCat; i++)
+  {
+    b = dist_->getCategory(i);
+    if (nv && (invariant_ < b))
+    {
+      bounds_.push_back((a + invariant_) / 2);
+      bounds_.push_back((invariant_ + b) / 2);
+      nv = false;
+    }
+    else
+      bounds_.push_back(dist_->getBound(i - 1));
+    a = b;
+  }
+
+  if (nv)
+    bounds_.push_back((a + invariant_) / 2);
+}
+
+/******************************************************************************/
+
+void InvariantMixedDiscreteDistribution::setNamespace(const string& prefix)
+{
+  AbstractDiscreteDistribution::setNamespace(prefix);
+  // We also need to update the namespace of the nested distribution:
+  dist_->setNamespace(prefix + nestedPrefix_);
+}
+
+/******************************************************************************/
+
+void InvariantMixedDiscreteDistribution::restrictToConstraint(const Constraint& c)
+{
+  if (!c.isCorrect(invariant_))
+    throw ConstraintException("Impossible to restrict to Constraint", &getParameter_("p"), invariant_);
+
+  dist_->restrictToConstraint(c);
+  updateDistribution();
+}
diff --git a/src/Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.h b/src/Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.h
new file mode 100644
index 0000000..7742ac1
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.h
@@ -0,0 +1,162 @@
+//
+// File: InvariantMixedDiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: Mon Dec 24 12:02 2007
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _INVARIANTMIXEDDISCRETEDISTRIBUTION_H_
+#define _INVARIANTMIXEDDISCRETEDISTRIBUTION_H_
+
+#include "AbstractDiscreteDistribution.h"
+
+namespace bpp
+{
+/**
+ * @brief Discrete mixed distribution, with a one-category fixed value (called "invariant") and a user-specified multi-categories distribution.
+ *
+ * The term "invariant" comes from the use of such distributions in phylogenetics:
+ * the fixed category corresponds to a value of 0 and describes invariant positions in an alignment.
+ */
+class InvariantMixedDiscreteDistribution :
+  public AbstractDiscreteDistribution
+{
+private:
+  DiscreteDistribution* dist_;
+  double invariant_, p_;
+  std::string nestedPrefix_;
+
+public:
+  /**
+   * @brief Build a new InvariantMixedDiscreteDistribution object.
+   *
+   * @param dist            The distribution to use. The mixed distribution will "own" this distribution object.
+   * This means that the distribution will be cloned in case of copy of this instance, and will be
+   * deleted with this instance.
+   * @param p               The probability of being in the invariant category.
+   * @param invariant       The value of the invariant category (typically 0, but other values may be specified).
+   */
+  InvariantMixedDiscreteDistribution(DiscreteDistribution* dist, double p, double invariant = 0.);
+
+  virtual ~InvariantMixedDiscreteDistribution()
+  {
+    delete dist_;
+  }
+
+  InvariantMixedDiscreteDistribution(const InvariantMixedDiscreteDistribution& imdd) :
+    AbstractParameterAliasable(imdd),
+    AbstractDiscreteDistribution(imdd),
+    dist_(dynamic_cast<DiscreteDistribution*>(imdd.dist_->clone())),
+    invariant_(imdd.invariant_),
+    p_(imdd.p_),
+    nestedPrefix_(imdd.nestedPrefix_)
+  {}
+
+  InvariantMixedDiscreteDistribution& operator=(const InvariantMixedDiscreteDistribution& imdd)
+  {
+    AbstractParameterAliasable::operator=(imdd);
+    AbstractDiscreteDistribution::operator=(imdd);
+    dist_         = dynamic_cast<DiscreteDistribution*>(imdd.dist_->clone());
+    invariant_    = imdd.invariant_;
+    p_            = imdd.p_;
+    nestedPrefix_ = imdd.nestedPrefix_;
+    return *this;
+  }
+
+  InvariantMixedDiscreteDistribution* clone() const { return new InvariantMixedDiscreteDistribution(*this); }
+
+public:
+  std::string getName() const {return "Invariant"; }
+
+  void fireParameterChanged(const ParameterList& parameters);
+
+  void setNamespace(const std::string& prefix);
+
+  /**
+   * @ brief Sets the number of categories of the embedded
+   * distribution. The number of categories of this class equals this
+   * plus one if the invariant_ is not in the embedded distribution
+   * values.
+   */
+  void setNumberOfCategories(size_t nbClasses)
+  {
+    dist_->setNumberOfCategories(nbClasses);
+    updateDistribution();
+  }
+
+  /**
+   * @return The nested, conditional, sub-distribution.
+   */
+  const DiscreteDistribution* getVariableSubDistribution() const { return dist_; }
+
+  double qProb(double x) const
+  {
+    return (x >= p_ + (1 - p_) * dist_->pProb(invariant_)) ? dist_->qProb((x - p_) / (1 - p_)) : dist_->qProb(x / (1 - p_));
+  }
+
+  double pProb(double x) const
+  {
+    return (1 - p_) * dist_->pProb(x) + (x < invariant_ ? 0 : p_);
+  }
+
+  double Expectation(double a) const
+  {
+    return (1 - p_) * dist_->Expectation(a) + (a < invariant_ ? 0 : p_);
+  }
+
+  void setMedian(bool median)
+  {
+    if (median_ != median)
+    {
+      median_ = median;
+      dist_->setMedian(median);
+      updateDistribution();
+    }
+  }
+
+  void discretize()
+  {
+    dist_->discretize();
+    updateDistribution();
+  }
+
+  void restrictToConstraint(const Constraint& c);
+
+protected:
+  void updateDistribution();
+};
+} // end of namespace bpp.
+
+#endif // _INVARIANTMIXEDDISCRETEDISTRIBUTION_H_
diff --git a/src/Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.cpp b/src/Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.cpp
new file mode 100644
index 0000000..e5872d2
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.cpp
@@ -0,0 +1,319 @@
+//
+// File: MixtureOfDiscreteDistributions
+// Created by: Laurent Guéguen
+// Created on: mercredi 9 juin 2010, à 23h 09
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "MixtureOfDiscreteDistributions.h"
+#include "../NumConstants.h"
+#include "../../Utils/MapTools.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+using namespace std;
+
+MixtureOfDiscreteDistributions::MixtureOfDiscreteDistributions(const vector<DiscreteDistribution*>& distributions,
+                                                               const vector<double>& probas ) :
+  AbstractParameterAliasable("Mixture."),
+  AbstractDiscreteDistribution(1, "Mixture."),
+  vdd_(),
+  probas_(),
+  vNestedPrefix_()
+{
+  if (distributions.size() != probas.size())
+  {
+    throw Exception("MixtureOfDiscreteDistributions. Distributions and probabilities vectors must have the same size (" + TextTools::toString(distributions.size()) + " != " + TextTools::toString(probas.size()) + ").");
+  }
+
+  size_t size = distributions.size();
+  for (size_t i = 0; i < size; i++)
+  {
+    if (distributions[i] == 0)
+      throw Exception("MixtureOfDiscreteDistributions. Null DiscreteDistribution* in argument vector at index " + TextTools::toString(i));
+  }
+
+  for (size_t i = 0; i < size; i++)
+  {
+    probas_.push_back(probas[i]);
+  }
+
+  double sum = VectorTools::sum(probas);
+  if (fabs(1. - sum) > precision())
+    throw Exception("MixtureOfDiscreteDistributions. Probabilities must equal 1 (sum =" + TextTools::toString(sum) + ").");
+
+  double y = 1;
+  for (size_t i = 0; i < size - 1; i++)
+  {
+    addParameter_(new Parameter("Mixture.theta" + TextTools::toString(i + 1), probas[i] / y, &Parameter::PROP_CONSTRAINT_IN));
+    y -= probas[i];
+  }
+
+
+  for (size_t i = 0; i < size; i++)
+  {
+    vdd_.push_back(distributions[i]->clone());
+  }
+
+  //  Parameters
+
+  for (size_t i = 0; i < size; i++)
+  {
+    vNestedPrefix_.push_back(TextTools::toString(i + 1) + "_" + distributions[i]->getNamespace());
+  }
+
+  for (size_t i = 0; i < size; i++)
+  {
+    vdd_[i]->setNamespace("Mixture." + vNestedPrefix_[i]);
+  }
+
+  for (size_t i = 0; i < size; i++)
+  {
+    addParameters_(vdd_[i]->getParameters());
+  }
+
+  updateDistribution();
+}
+
+MixtureOfDiscreteDistributions::MixtureOfDiscreteDistributions(const MixtureOfDiscreteDistributions& mdd) :
+  AbstractParameterAliasable(mdd),
+  AbstractDiscreteDistribution(mdd),
+  vdd_(),
+  probas_(),
+  vNestedPrefix_()
+{
+  for (size_t i = 0; i < mdd.vdd_.size(); i++)
+  {
+    probas_.push_back(mdd.probas_[i]);
+    vdd_.push_back(mdd.vdd_[i]->clone());
+    vNestedPrefix_.push_back(mdd.vNestedPrefix_[i]);
+  }
+}
+
+MixtureOfDiscreteDistributions& MixtureOfDiscreteDistributions::operator=(const MixtureOfDiscreteDistributions& mdd)
+{
+  AbstractParameterAliasable::operator=(mdd);
+  AbstractDiscreteDistribution::operator=(mdd);
+  vdd_.clear();
+  probas_.clear();
+  vNestedPrefix_.clear();
+
+  for (size_t i = 0; i < mdd.vdd_.size(); i++)
+  {
+    probas_.push_back(mdd.probas_[i]);
+    vdd_.push_back(mdd.vdd_[i]->clone());
+    vNestedPrefix_.push_back(mdd.vNestedPrefix_[i]);
+  }
+
+  return *this;
+}
+
+MixtureOfDiscreteDistributions::~MixtureOfDiscreteDistributions()
+{
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    delete vdd_[i];
+  }
+
+  vdd_.clear();
+}
+
+void MixtureOfDiscreteDistributions::setNumberOfCategories(size_t nbClasses)
+{
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    vdd_[i]->setNumberOfCategories(nbClasses);
+  }
+
+  updateDistribution();
+}
+
+
+void MixtureOfDiscreteDistributions::fireParameterChanged(const ParameterList& parameters)
+{
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  size_t size = vdd_.size();
+  double x = 1.0;
+  for (size_t i = 0; i < size - 1; i++)
+  {
+    probas_[i] = getParameterValue("theta" + TextTools::toString(i + 1)) * x;
+    x *= 1 - getParameterValue("theta" + TextTools::toString(i + 1));
+  }
+
+  probas_[size - 1] = x;
+
+
+  for (size_t i = 0; i < size; i++)
+  {
+    vdd_[i]->matchParametersValues(parameters);
+  }
+
+  updateDistribution();
+}
+
+void MixtureOfDiscreteDistributions::updateDistribution()
+{
+  size_t size = vdd_.size();
+  distribution_.clear();
+  // calculation of distribution
+
+  for (size_t i = 0; i < size; i++)
+  {
+    vector<double> values = vdd_[i]->getCategories();
+    for (size_t j = 0; j < values.size(); j++)
+    {
+      distribution_[values[j]] = 0;
+    }
+  }
+
+  for (size_t i = 0; i < size; i++)
+  {
+    vector<double> values = vdd_[i]->getCategories();
+    vector<double> probas2 = vdd_[i]->getProbabilities();
+    for (size_t j = 0; j < values.size(); j++)
+    {
+      distribution_[values[j]] += probas2[j] * probas_[i];
+    }
+  }
+
+  numberOfCategories_ = distribution_.size();
+
+  // intMinMax_
+
+  double uB, lB;
+  uB = -NumConstants::VERY_BIG();
+  lB = NumConstants::VERY_BIG();
+
+  bool suB = true, slB = true;
+
+  for (size_t i = 0; i < size; i++)
+  {
+    if (vdd_[i]->getLowerBound() <= lB)
+    {
+      lB = vdd_[i]->getLowerBound();
+      slB = vdd_[i]->strictLowerBound();
+    }
+    if (vdd_[i]->getUpperBound() >= uB)
+    {
+      uB = vdd_[i]->getUpperBound();
+      suB = vdd_[i]->strictUpperBound();
+    }
+  }
+
+  intMinMax_.setLowerBound(lB, slB);
+  intMinMax_.setUpperBound(uB, suB);
+
+  // Compute midpoint bounds_:
+  vector<double> values = MapTools::getKeys<double, double, AbstractDiscreteDistribution::Order>(distribution_);
+
+  bounds_.resize(numberOfCategories_ - 1);
+
+  // Fill from 0 to numberOfCategories_-1 with midpoints:
+  for (size_t i = 0; i < numberOfCategories_ - 1; i++)
+  {
+    bounds_[i] = (values[i] + values[i + 1]) / 2.;
+  }
+}
+
+void MixtureOfDiscreteDistributions::setMedian(bool median)
+{
+  if (median_ != median)
+  {
+    median_ = median;
+    for (size_t i = 0; i < vdd_.size(); i++)
+    {
+      vdd_[i]->setMedian(median);
+    }
+    updateDistribution();
+  }
+}
+void MixtureOfDiscreteDistributions::discretize()
+{
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    vdd_[i]->discretize();
+  }
+
+  updateDistribution();
+}
+
+double MixtureOfDiscreteDistributions::pProb(double x) const
+{
+  double s = 0;
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    s += probas_[i] * vdd_[i]->pProb(x);
+  }
+  return s;
+}
+
+double MixtureOfDiscreteDistributions::qProb(double x) const
+{
+  throw Exception("MixtureOfDiscreteDistributions::qProb to difficult to compute: not implemented");
+  return 0;
+}
+
+double MixtureOfDiscreteDistributions::Expectation(double a) const
+{
+  double s = 0;
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    s += probas_[i] * vdd_[i]->Expectation(a);
+  }
+  return s;
+}
+
+void MixtureOfDiscreteDistributions::restrictToConstraint(const Constraint& c)
+{
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    vdd_[i]->restrictToConstraint(c);
+  }
+
+  updateDistribution();
+}
+
+/******************************************************************************/
+
+void MixtureOfDiscreteDistributions::setNamespace(const string& prefix)
+{
+  AbstractDiscreteDistribution::setNamespace(prefix);
+  // We also need to update the namespace of the nested distributions:
+  for (size_t i = 0; i < vdd_.size(); i++)
+  {
+    vdd_[i]->setNamespace(prefix + vNestedPrefix_[i]);
+  }
+}
+
diff --git a/src/Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.h b/src/Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.h
new file mode 100644
index 0000000..2b058e4
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.h
@@ -0,0 +1,163 @@
+//
+// File: MixtureOfDiscreteDistributions.h
+// Created by: Laurent Guéguen
+// Created on: mercredi 9 juin 2010, à 22h 44
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _MIXTUREOFDISCRETEDISTRIBUTIONS_H_
+#define _MIXTUREOFDISCRETEDISTRIBUTIONS_H_
+
+#include "AbstractDiscreteDistribution.h"
+
+namespace bpp
+{
+/**
+ * @brief A Discrete distribution object defined by a vector of
+ * Discrete Distributions and a set of probabilities for these
+ * Discrete Distributions.
+ *
+ * The non-null values of the MixtureOfDiscreteDistributions are all
+ * the non-null values of the Discrete Distributions, with
+ * probabilities equal to their probabilities in each Discrete
+ * Distribution multiplied by the specific probability of this
+ * Distribution.
+ *
+ * Parameters:
+ *
+ * For the probabilities: they are called \c "theta1",... and defined
+ * as @f$ \theta_{i \in 1..\textrm{size-1}} @f$ such that probability
+ * of value @f$i @f$ is @f$ (1-\theta_1).(1-\theta_2)...\theta_{i} @f$
+ *
+ * For the values: they are the parameters of the Discrete
+ * Distributions, prefixed by the index in the vector of the Discrete
+ * Distributions.
+ *
+ */
+class MixtureOfDiscreteDistributions :
+  public AbstractDiscreteDistribution
+{
+protected:
+  std::vector<DiscreteDistribution*> vdd_;
+
+  std::vector<double> probas_;
+
+  std::vector<std::string> vNestedPrefix_;
+
+public:
+  /**
+   * @brief Builds a new MixtureOfDiscreteDistributions object from a
+   * vector of Discrete Distributions and a vector of probabilities.
+   * The Discrete Distributions are cloned in the constructor to
+   * become attributes.
+   *
+   * @param distributions The vector of pointers to Discrete
+   * Distributions.
+   * @param probas The vector of probabilities.
+   *
+   */
+
+  MixtureOfDiscreteDistributions(const std::vector<DiscreteDistribution*>& distributions, const std::vector<double>& probas);
+
+  ~MixtureOfDiscreteDistributions();
+
+  MixtureOfDiscreteDistributions(const MixtureOfDiscreteDistributions& mdd);
+
+  MixtureOfDiscreteDistributions& operator=(const MixtureOfDiscreteDistributions& mdd);
+
+  MixtureOfDiscreteDistributions* clone() const { return new MixtureOfDiscreteDistributions(*this); }
+
+public:
+  std::string getName() const {return "Mixture"; }
+
+  /**
+   * @brief Returns the number of discrete distributions in the
+   * mixture.
+   *
+   */
+  size_t getNumberOfDistributions() const {return vdd_.size(); }
+
+  /**
+   * @brief Returns a pointer to the n-th discrete distribution in the mixture.
+   *
+   * @param n tne number of the distribution in the mixture;
+   */
+  const DiscreteDistribution* getNDistribution(size_t n) const
+  {
+    return vdd_[n];
+  }
+
+  /**
+   * @brief Returns the probability of the n-th discrete distribution in the mixture.
+   *
+   * @param n the number of the distribution in the mixture;
+   */
+  double getNProbability(size_t n) const
+  {
+    return probas_[n];
+  }
+
+  /**
+   * @brief sets the number of categories of EACH submodel to
+   * nbClasses, so the number of categories of the mixture is the sum
+   * of all these numbers.
+   *
+   */
+
+  void setNumberOfCategories(size_t nbClasses);
+
+  void fireParameterChanged(const ParameterList& parameters);
+
+  double qProb(double x) const;
+
+  double pProb(double x) const;
+
+  double Expectation(double a) const;
+
+  void setMedian(bool median);
+
+  void restrictToConstraint(const Constraint& c);
+
+  void discretize();
+
+  void setNamespace(const std::string& prefix);
+
+protected:
+  void updateDistribution();
+};
+} // end of namespace bpp.
+
+#endif  // _MIXTUREOFDISCRETEDISTRIBUTIONS_H__
+
diff --git a/src/Bpp/Numeric/Prob/MultipleDiscreteDistribution.h b/src/Bpp/Numeric/Prob/MultipleDiscreteDistribution.h
new file mode 100644
index 0000000..86fb4d8
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/MultipleDiscreteDistribution.h
@@ -0,0 +1,149 @@
+//
+// File: MultipleDiscreteDistribution.h
+// Created by: Laurent Guéguen
+// Created on: mardi 20 juillet 2010, à 14h 52
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _MULTIPLEDISCRETEDISTRIBUTION_H_
+#define _MULTIPLEDISCRETEDISTRIBUTION_H_
+
+#include "../VectorTools.h"
+#include "../ParameterAliasable.h"
+#include "../../Exceptions.h"
+#include "../../Io/OutputStream.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Interface for multiple discrete distribution objects.
+   *
+   * A multiple discrete distribution usually contains a vector of
+   * finite set of categories and a probability associated to each.
+   * The size of the vector is the dimension of the distribution.
+   *
+   * Each category (or class) is defined by two bounds, and sometimes
+   * by a mean or a median value.
+   *
+   * A multiple discrete distribution may contain one or several
+   * parameters. The probabilities associated to each class usually
+   * depends on the parameter values. In some cases, the number and/or
+   * bounds of the classes may also depend on the parameters values,
+   * depending on the kind of discretization used.
+   */
+
+  class MultipleDiscreteDistribution:
+    public virtual ParameterAliasable
+  {
+  public:
+    MultipleDiscreteDistribution() {}
+    
+    virtual ~MultipleDiscreteDistribution() {}
+
+    MultipleDiscreteDistribution * clone() const = 0;
+
+  public:
+
+    /**
+     * @return The number of categories 
+     */
+    virtual size_t getNumberOfCategories() const = 0;
+
+    /**
+     * @param Vvalue The vector of values to check.
+     * @return The vector of categories of the classes the value is
+     * in. Throws a ConstraintException if the value is off the domain
+     * of the MultipleDiscreteDistribution.
+     */
+    
+    virtual Vdouble getValueCategory(Vdouble& Vvalue) const = 0;
+    
+    /**
+     * @param category The vector of values associated to the class.
+     * @return The probability associated to a given class.
+     */
+    virtual double getProbability(Vdouble& category) const = 0;
+
+
+  public:
+
+    /**
+     * @brief Draw a random vector from this distribution.
+     *
+     * This vector will be one of the class values, drawn according
+     * to the class probabilities.
+     * 
+     * @return A random number according to this distribution.
+     */
+    virtual Vdouble rand() const = 0;
+
+    /**
+     * @brief Draw a random vector from the continuous version of this distribution, if it exists.
+     *
+     * Uses the continuous version of this distribution to draw a random vector.
+     * 
+     * @return A random vector according to this distribution.
+     * @throw Exception If there is no continuous version of this distribution.
+     */
+    virtual Vdouble randC() const = 0;
+
+    /**
+     * @brief Checks if the Parameters can respect the given 
+     * Constraints (one per dimension) and optionnaly tries to modify
+     * their own Constraints.
+     *
+     * @param vc The vector of Constraint to respect.
+     * @param f boolean flag to say if the Constraints must be changed
+     * (if possible) (default: true)
+     *
+     * @return true if the Parameters Constraints are adapted to the
+     * given Constraints, false otherwise.
+     */
+    //virtual bool adaptToConstraint(const std::vector<Constraint&>& vc, bool f=true) = 0;
+    
+    /**
+     * @brief Print the distribution (categories and corresponding probabilities) to a stream.
+     *
+     * @param out The outstream where to print the distribution.
+     */
+    //    virtual void print(OutputStream& out) const = 0;
+
+  };
+
+} //end of namespace bpp.
+
+#endif  //_MULTIPLEDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.cpp b/src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.cpp
new file mode 100644
index 0000000..8fc0145
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.cpp
@@ -0,0 +1,350 @@
+//
+// File: SimpleDiscreteDistribution.cpp
+// Created by: Julien Dutheil
+// Created on: ?
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "SimpleDiscreteDistribution.h"
+#include "../NumConstants.h"
+#include "../../Utils/MapTools.h"
+#include "../../Text/TextTools.h"
+
+using namespace bpp;
+using namespace std;
+
+
+SimpleDiscreteDistribution::SimpleDiscreteDistribution(const map<double, double>& distribution,
+                                                       double prec,
+                                                       bool fixed) :
+  AbstractParameterAliasable("Simple."),
+  AbstractDiscreteDistribution(distribution.size(), prec, "Simple."),
+  givenRanges_()
+{
+  double sum = 0;
+  for (map<double, double>::const_iterator i = distribution.begin(); i != distribution.end(); i++)
+  {
+    distribution_[i->first] = i->second;
+    sum += i->second;
+  }
+  if (fabs(1. - sum) > precision())
+    throw Exception("SimpleDiscreteDistribution. Probabilities must equal 1 (sum =" + TextTools::toString(sum) + ").");
+
+  if (!fixed)
+  {
+    unsigned int n = 1;
+    double x, y = 1;
+    for (map<double, double>::const_iterator i = distribution.begin(); i != distribution.end(); i++)
+    {
+      addParameter_(new Parameter("Simple.V" + TextTools::toString(n), i->first));
+
+      if (n != numberOfCategories_)
+      {
+        x = i->second;
+        addParameter_(new Parameter("Simple.theta" + TextTools::toString(n), x / y, &Parameter::PROP_CONSTRAINT_IN));
+        y -= x;
+      }
+      n++;
+    }
+  }
+  discretize();
+}
+
+SimpleDiscreteDistribution::SimpleDiscreteDistribution(const vector<double>& values,
+                                                       const vector<double>& probas,
+                                                       double prec,
+                                                       bool fixed
+                                                       ) :
+  AbstractParameterAliasable("Simple."),
+  AbstractDiscreteDistribution(values.size(), prec, "Simple."),
+  givenRanges_()
+{
+  if (values.size() != probas.size())
+  {
+    throw Exception("SimpleDiscreteDistribution. Values and probabilities vectors must have the same size (" + TextTools::toString(values.size()) + " != " + TextTools::toString(probas.size()) + ").");
+  }
+  size_t size = values.size();
+
+  for (size_t i = 0; i < size; i++)
+  {
+    if (distribution_.find(values[i]) != distribution_.end())
+      throw Exception("SimpleDiscreteDistribution: two given values are equal");
+    else
+      distribution_[values[i]] = probas[i];
+  }
+
+  double sum = VectorTools::sum(probas);
+  if (fabs(1. - sum) > precision())
+    throw Exception("SimpleDiscreteDistribution. Probabilities must equal 1 (sum =" + TextTools::toString(sum) + ").");
+
+  if (!fixed)
+  {
+    double y = 1;
+    for (unsigned int i = 0; i < size - 1; i++)
+    {
+      addParameter_(new Parameter("Simple.V" + TextTools::toString(i + 1), values[i]));
+      addParameter_(new Parameter("Simple.theta" + TextTools::toString(i + 1), probas[i] / y, &Parameter::PROP_CONSTRAINT_IN));
+      y -= probas[i];
+    }
+    addParameter_(new Parameter("Simple.V" + TextTools::toString(size), values[size - 1]));
+  }
+
+  discretize();
+}
+
+SimpleDiscreteDistribution::SimpleDiscreteDistribution(const std::vector<double>& values,
+                                                       const std::map<size_t, std::vector<double> >& ranges,
+                                                       const std::vector<double>& probas,
+                                                       double prec,
+                                                       bool fixed) :
+  AbstractParameterAliasable("Simple."),
+  AbstractDiscreteDistribution(values.size(), prec, "Simple."),
+  givenRanges_()
+{
+  if (values.size() != probas.size())
+  {
+    throw Exception("SimpleDiscreteDistribution. Values and probabilities vectors must have the same size (" + TextTools::toString(values.size()) + " != " + TextTools::toString(probas.size()) + ").");
+  }
+  size_t size = values.size();
+
+  for (size_t i = 0; i < size; i++)
+  {
+    if (distribution_.find(values[i]) != distribution_.end())
+      throw Exception("SimpleDiscreteDistribution: two given values are equal");
+    else
+      distribution_[values[i]] = probas[i];
+  }
+
+  double sum = VectorTools::sum(probas);
+  if (fabs(1. - sum) > precision())
+    throw Exception("SimpleDiscreteDistribution. Probabilities must equal 1 (sum =" + TextTools::toString(sum) + ").");
+
+  if (!fixed)
+  {
+    double y = 1;
+    for (size_t i = 0; i < size - 1; i++)
+    {
+      map<size_t, vector<double> >::const_iterator it = ranges.find(i + 1);
+      if (it == ranges.end())
+        addParameter_(new Parameter("Simple.V" + TextTools::toString(i + 1), values[i]));
+      else
+      {
+        if (values[i] >= it->second[0] &&  values[i] <= it->second[1])
+        {
+          addParameter_(new Parameter("Simple.V" + TextTools::toString(i + 1), values[i], new IntervalConstraint(it->second[0], it->second[1], true, true), true));
+          givenRanges_[i + 1] = it->second;
+        }
+        else
+          throw Exception("SimpleDiscreteDistribution. Value and given range of parameter V" + TextTools::toString(i + 1) + " do not match: " + TextTools::toString(values[i]) + " vs [" + TextTools::toString(it->second[0]) + ";" + TextTools::toString(it->second[1]) + "]");
+      }
+      addParameter_(new Parameter("Simple.theta" + TextTools::toString(i + 1), probas[i] / y, &Parameter::PROP_CONSTRAINT_IN));
+      y -= probas[i];
+    }
+
+    map<size_t, vector<double> >::const_iterator it = ranges.find(size);
+    if (it == ranges.end())
+      addParameter_(new Parameter("Simple.V" + TextTools::toString(size), values[size - 1]));
+    else
+    {
+      if (values[size - 1] >= it->second[0] &&  values[size - 1] <= it->second[1])
+      {
+        addParameter_(new Parameter("Simple.V" + TextTools::toString(size), values[size - 1], new IntervalConstraint(it->second[0], it->second[1], true, true), true));
+        givenRanges_[size] = it->second;
+      }
+      else
+        throw Exception("SimpleDiscreteDistribution. Value and given range of parameter V" + TextTools::toString(size) + " do not match: " + TextTools::toString(values[size - 1]) + " vs [" + TextTools::toString(it->second[0]) + ";" + TextTools::toString(it->second[1]) + "]");
+    }
+  }
+
+  discretize();
+}
+
+
+SimpleDiscreteDistribution::SimpleDiscreteDistribution(const SimpleDiscreteDistribution& sdd) :
+  AbstractParameterAliasable(sdd),
+  AbstractDiscreteDistribution(sdd),
+  givenRanges_(sdd.givenRanges_)
+{}
+
+SimpleDiscreteDistribution& SimpleDiscreteDistribution::operator=(const SimpleDiscreteDistribution& sdd)
+{
+  AbstractParameterAliasable::operator=(sdd);
+  AbstractDiscreteDistribution::operator=(sdd);
+  givenRanges_ = sdd.givenRanges_;
+
+  return *this;
+}
+
+void SimpleDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
+{
+  if (getNumberOfParameters() != 0)
+  {
+    AbstractDiscreteDistribution::fireParameterChanged(parameters);
+    size_t size = distribution_.size();
+
+    distribution_.clear();
+    double x = 1.0;
+    double v;
+    for (size_t i = 0; i < size - 1; i++)
+    {
+      v = getParameterValue("V" + TextTools::toString(i + 1));
+      if (distribution_.find(v) != distribution_.end())
+      {
+        int j = 1;
+        int f = ((v + precision()) >= intMinMax_.getUpperBound()) ? -1 : 1;
+        while (distribution_.find(v + f * j * precision()) != distribution_.end())
+        {
+          j++;
+          f = ((v + f * j * precision()) >= intMinMax_.getUpperBound()) ? -1 : 1;
+        }
+        v += f * j * precision();
+        // approximation to avoid useless computings:
+        // setParameterValue("V"+TextTools::toString(i+1),v);
+      }
+      distribution_[v] = getParameterValue("theta" + TextTools::toString(i + 1)) * x;
+      x *= 1 - getParameterValue("theta" + TextTools::toString(i + 1));
+    }
+
+    v = getParameterValue("V" + TextTools::toString(size));
+    if (distribution_.find(v) != distribution_.end())
+    {
+      int j = 1;
+      int f = ((v + precision()) >= intMinMax_.getUpperBound()) ? -1 : 1;
+      while (distribution_.find(v + f * j * precision()) != distribution_.end())
+      {
+        j++;
+        f = ((v + f * j * precision()) >= intMinMax_.getUpperBound()) ? -1 : 1;
+      }
+      v += f * j * precision();
+      // approximation to avoid useless computings:
+      // setParameterValue("V"+TextTools::toString(size),v);
+    }
+    distribution_[v] = x;
+  }
+  discretize();
+}
+
+double SimpleDiscreteDistribution::qProb(double x) const
+{
+  double s = -NumConstants::VERY_BIG();
+  double x2 = x;
+  for (map<double, double>::const_iterator it = distribution_.begin(); it != distribution_.end(); it++)
+  {
+    x2 -= it->second;
+    if (x2 < 0)
+      return s;
+    else
+      s = it->second;
+  }
+
+  return s;
+}
+
+double SimpleDiscreteDistribution::pProb(double x) const
+{
+  double s = 0;
+  for (map<double, double>::const_iterator it = distribution_.begin(); it != distribution_.end(); it++)
+  {
+    if (it->first >= x)
+      s += it->second;
+    else
+      break;
+  }
+
+  return s;
+}
+
+double SimpleDiscreteDistribution::Expectation(double a) const
+{
+  double s = 0;
+  for (map<double, double>::const_iterator it = distribution_.begin(); it != distribution_.end(); it++)
+  {
+    if (it->first >= a)
+      s += it->second;
+    else
+      break;
+  }
+
+  return s;
+}
+
+
+void SimpleDiscreteDistribution::discretize()
+{
+  // Compute a new arbitray bounderi:
+  vector<double> values = MapTools::getKeys<double, double, AbstractDiscreteDistribution::Order>(distribution_);
+
+  // Fill from 0 to numberOfCategories_-2 with midpoints:
+  for (unsigned int i = 0; i < numberOfCategories_ - 1; i++)
+  {
+    bounds_[i] = (values[i] + values[i + 1]) / 2.;
+  }
+}
+
+void SimpleDiscreteDistribution::restrictToConstraint(const Constraint& c)
+{
+  if (getNumberOfParameters() == 0)
+    return;
+
+  const IntervalConstraint* pi = dynamic_cast<const IntervalConstraint*>(&c);
+
+  if (!pi)
+    throw Exception("SimpleDiscreteDistribution::restrictToConstraint: Non-interval exception");
+
+  map<double, double>::const_iterator it;
+
+  for (it = distribution_.begin(); it != distribution_.end(); it++)
+  {
+    if (!pi->isCorrect(it->first))
+      throw Exception("Impossible to restrict to Constraint value " + TextTools::toString(it->first));
+  }
+
+  AbstractDiscreteDistribution::restrictToConstraint(c);
+
+  size_t size = distribution_.size();
+  for (size_t i = 0; i < size; i++)
+  {
+    map<size_t, vector<double> >::const_iterator itr = givenRanges_.find(i + 1);
+    if (itr == givenRanges_.end())
+      getParameter_("V" + TextTools::toString(i + 1)).setConstraint(intMinMax_.clone(), true);
+    else
+    {
+      const Constraint* pc = getParameter_("V" + TextTools::toString(i + 1)).removeConstraint();
+      getParameter_("V" + TextTools::toString(i + 1)).setConstraint(*pc & *intMinMax_.clone(), true);
+      delete pc;
+    }
+  }
+}
+
diff --git a/src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.h b/src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.h
new file mode 100644
index 0000000..0c0cadf
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/SimpleDiscreteDistribution.h
@@ -0,0 +1,158 @@
+//
+// File: SimpleDiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: ?
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _SIMPLEDISCRETEDISTRIBUTION_H_
+#define _SIMPLEDISCRETEDISTRIBUTION_H_
+
+#include "AbstractDiscreteDistribution.h"
+
+// From the STL:
+#include <map>
+
+namespace bpp
+{
+
+/**
+ * @brief A Discrete distribution object, where some specific
+ * probabilities are assigned to a finite set of values.
+ *
+ * Optional parameters:
+ *
+ * For the probabilities: they are called \c "theta1",... and defined
+ * as @f$ \theta_{i \in 1..\textrm{size-1}} @f$ such that probability of value @f$i @f$ is @f$ (1-\theta_1).(1-\theta_2)...\theta_{i} @f$
+ *
+ * For the values: they are called \c "V1", \c "V2" ...
+ *
+ */
+class SimpleDiscreteDistribution:
+  public AbstractDiscreteDistribution
+{
+private:
+
+  std::map<size_t, std::vector<double> > givenRanges_;
+  
+  public:
+    /**
+     * @brief Builds a new SimpleDiscreteDistribution object from a
+     * map<double,double> object. With this constructor, the
+     * probabilities are fixed (ie no parameters).
+     *
+     * Keys are taken to be interval values, and map values to be the corresponding probabilities.
+     *
+     * @param distribution The map object to use.
+     * @param precision to discriminate the categories
+     * @param fixed tells if there are parameters (default false means there are parameters).
+     */
+  
+  SimpleDiscreteDistribution(const std::map<double, double>& distribution, double precision=NumConstants::TINY(), bool fixed=false);
+
+  /**
+   * @brief Builds a new SimpleDiscreteDistribution object from a
+   * vector of values and a vector of probabilities
+   *
+   * @param values The vector of values.
+   * @param probas The vector of probabilities.
+   * @param prec precision used to discriminate the categories
+   * @param fixed tells if there are parameters (default false means there are parameters).
+   *
+   */
+
+  SimpleDiscreteDistribution(const std::vector<double>& values, const std::vector<double>& probas, double prec=NumConstants::TINY(), bool fixed=false);
+
+  /**
+   * @brief Builds a new SimpleDiscreteDistribution object from a
+   * vector of values, a map of ranges and a vector of probabilities
+   *
+   * @param values The vector of values.
+   * @param ranges The map of ranges. Each key is the index of the
+   *        parameter in the given vector of values, and the
+   *        associated value is a vector of two doubles, for the min
+   *        and the max of the range.
+   * @param probas The vector of probabilities.
+   * @param prec precision to discriminate the categories
+   * @param fixed tells if there are parameters (default false means there are parameters).
+   *
+   */
+
+  SimpleDiscreteDistribution(const std::vector<double>& values, const std::map<size_t, std::vector<double> >& ranges, const std::vector<double>& probas, double prec=NumConstants::TINY(), bool fixed=false);
+
+  virtual ~SimpleDiscreteDistribution() {}
+
+  SimpleDiscreteDistribution(const SimpleDiscreteDistribution&);
+
+  SimpleDiscreteDistribution& operator=(const SimpleDiscreteDistribution&);
+  
+  SimpleDiscreteDistribution * clone() const { return new SimpleDiscreteDistribution(*this); }
+
+public:
+
+  /*
+   *@brief Returns the map of the given ranges for the values.
+   *
+   */
+  
+  const std::map<size_t, std::vector<double> > getRanges() const { return givenRanges_;}
+    
+  std::string getName() const {return("Simple");}
+  
+  void discretize();
+  
+  void fireParameterChanged(const ParameterList & parameters);
+
+  double getLowerBound() const {
+    return distribution_.begin()->first;
+  }
+
+  double getUpperBound() const {
+    return distribution_.rbegin()->first;
+  }  
+  
+  double qProb(double x) const ;
+  
+  double pProb(double x) const ;
+                                
+  double Expectation(double a) const;
+
+  void restrictToConstraint(const Constraint& c);
+};
+
+} //end of namespace bpp.
+
+#endif  //_SIMPLEDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Prob/Simplex.cpp b/src/Bpp/Numeric/Prob/Simplex.cpp
new file mode 100644
index 0000000..acc424f
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/Simplex.cpp
@@ -0,0 +1,299 @@
+//
+// File: Simplex.cpp
+// Created by: Laurent Guéguen
+// Created on: mardi 31 mai 2011, à 13h 16
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "Simplex.h"
+#include "../NumConstants.h"
+
+#include "../VectorTools.h"
+
+using namespace bpp;
+using namespace std;
+
+Simplex::Simplex(const std::vector<double>& probas, unsigned short method, bool allowNull, const std::string& name) : AbstractParameterAliasable(name),
+  dim_(probas.size()),
+  method_(method),
+  vProb_(),
+  valpha_()
+{
+  if  (dim_==0)
+    return;
+
+  double sum = VectorTools::sum(probas);
+  if (fabs(1. - sum) > NumConstants::SMALL())
+    throw Exception("Simplex. Probabilities must equal 1 (sum =" + TextTools::toString(sum) + ").");
+
+  const Constraint* pc = (allowNull ? &Parameter::PROP_CONSTRAINT_IN : &Parameter::PROP_CONSTRAINT_EX);
+
+  for (unsigned int i = 0; i < dim_; i++)
+  {
+    vProb_.push_back(probas[i]);
+  }
+
+  double y = 1;
+  switch (method_)
+  {
+  case 1:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      addParameter_(new Parameter(name + "theta" + TextTools::toString(i + 1), vProb_[i] / y, pc));
+      y -= vProb_[i];
+    }
+    break;
+  case 2:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      addParameter_(new Parameter(name + "theta" + TextTools::toString(i + 1), vProb_[i] / (vProb_[i] + vProb_[i + 1]), pc));
+    }
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      valpha_.push_back(vProb_[i + 1] / vProb_[i]);
+    }
+    break;
+  case 3:
+    for (size_t i = 1; i < dim_; i++)
+    {
+      size_t o = i;
+      size_t li2 = 0; // rank of the strongest bit
+      while (o)
+      {
+        li2++;
+        o = o >> 1;
+      }
+
+      double i1 = 0, i0 = 0;
+      size_t j = 0;
+      size_t pi = i &  ~(1 << (li2 - 1));
+      while (j < dim_)
+      {
+        size_t t = (j << li2) + pi;
+        if (t >= dim_)
+          break;
+        else
+          i0 += vProb_[t];
+        t += (1 << (li2 - 1));
+        if (t < dim_)
+          i1 += vProb_[t];
+        j++;
+      }
+      addParameter_(new Parameter(name + "theta" + TextTools::toString(i), i1 / (i0 + i1), pc));
+    }
+    break;
+  }
+}
+
+Simplex::Simplex(size_t dim, unsigned short method, bool allowNull, const std::string& name) :
+  AbstractParameterAliasable(name),
+  dim_(dim),
+  method_(method),
+  vProb_(),
+  valpha_()
+{
+  if  (dim_==0)
+    return;
+  
+  for (size_t i = 0; i < dim_; i++)
+  {
+    vProb_.push_back(1. / static_cast<double>(dim_));
+  }
+
+  const Constraint* pc = (allowNull ? &Parameter::PROP_CONSTRAINT_IN : &Parameter::PROP_CONSTRAINT_EX);
+
+  double y = 1;
+  switch (method_)
+  {
+  case 1:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      addParameter_(new Parameter(name + "theta" + TextTools::toString(i + 1), vProb_[i] / y, pc));
+      y -= vProb_[i];
+    }
+    break;
+  case 2:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      addParameter_(new Parameter(name + "theta" + TextTools::toString(i + 1), 0.5, pc));
+    }
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      valpha_.push_back(1.);
+    }
+    break;
+  case 3:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      addParameter_(new Parameter(name + "theta" + TextTools::toString(i + 1), 0.5, pc));
+    }
+    setFrequencies(vProb_);
+    
+    break;
+  }
+}
+
+void Simplex::fireParameterChanged(const ParameterList& parameters)
+{
+  if  (dim_==0)
+    return;
+
+  double x = 1.0;
+  switch (method_)
+  {
+  case 1:
+    double th;
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      th = getParameterValue("theta" + TextTools::toString(i + 1));
+      vProb_[i] = th * x;
+      x *= 1 - th;
+    }
+    vProb_[dim_ - 1] = x;
+    break;
+  case 2:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      th = getParameterValue("theta" + TextTools::toString(i + 1));
+      valpha_[i] = (1 - th) / th;
+    }
+    th = 1;
+    vProb_[0] = 1;
+    x = 1.0;
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      th *= valpha_[i];
+      vProb_[i + 1] = th;
+      x += vProb_[i + 1];
+    }
+    for (unsigned int i = 0; i < dim_; i++)
+    {
+      vProb_[i] /= x;
+    }
+
+    break;
+  case 3:
+    size_t o = dim_;
+    size_t ld2 = 0; // rank of the strongest bit
+    while (o)
+    {
+      ld2++;
+      o = o >> 1;
+    }
+    for (size_t i = 0; i < dim_; i++)
+    {
+      x = 1;
+      size_t ld = ld2;
+      size_t k = i;
+      while (ld)
+      {
+        if (k >> (ld - 1))
+          x *= getParameterValue("theta" + TextTools::toString(k));
+        else
+        {
+          if ((k + (1 << (ld - 1))) < dim_)
+            x *= 1 - getParameterValue("theta" + TextTools::toString(k + (1 << (ld - 1))));
+        }
+        k &= ~(1 << (--ld));
+      }
+      vProb_[i] = x;
+    }
+    break;
+  }
+}
+
+
+void Simplex::setFrequencies(const std::vector<double>& probas)
+{
+  if  (dim_==0)
+    return;
+
+  double sum = VectorTools::sum(probas);
+  if (fabs(1. - sum) > NumConstants::SMALL())
+    throw Exception("Simplex::setFrequencies. Probabilities must equal 1 (sum =" + TextTools::toString(sum) + ").");
+
+  double y = 1;
+
+  ParameterList pl;
+  switch (method_)
+  {
+  case 1:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      pl.addParameter(Parameter(getNamespace() + "theta" + TextTools::toString(i + 1), probas[i] / y));
+      y -= probas[i];
+    }
+    break;
+  case 2:
+    for (unsigned int i = 0; i < dim_ - 1; i++)
+    {
+      pl.addParameter(Parameter(getNamespace() + "theta" + TextTools::toString(i + 1), probas[i] / (probas[i] + probas[i + 1])));
+      valpha_[i] = probas[i + 1] / probas[i];
+    }
+    break;
+  case 3:
+    for (size_t i = 1; i < dim_; i++)
+    {
+      size_t o = i;
+      size_t li2 = 0; // rank of the strongest bit
+      while (o)
+      {
+        li2++;
+        o = o >> 1;
+      }
+
+      double i1 = 0, i0 = 0;
+      size_t j = 0;
+      size_t pi = i &  ~(1 << (li2 - 1));
+      while (j < dim_)
+      {
+        size_t t = (j << li2) + pi;
+        if (t >= dim_)
+          break;
+        else
+          i0 += probas[t];
+        t += (1 << (li2 - 1));
+        if (t < dim_)
+          i1 += probas[t];
+        j++;
+      }
+      pl.addParameter(Parameter(getNamespace() + "theta" + TextTools::toString(i), i1 / (i0 + i1)));
+    }
+    break;
+  }
+
+  matchParametersValues(pl);
+}
+
diff --git a/src/Bpp/Numeric/Prob/Simplex.h b/src/Bpp/Numeric/Prob/Simplex.h
new file mode 100644
index 0000000..33763f3
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/Simplex.h
@@ -0,0 +1,183 @@
+//
+// File: Simplex.h
+// Created by: Laurent Guéguen
+// Created on: mardi 31 mai 2011, à 11h 02
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _SIMPLEX_H_
+#define _SIMPLEX_H_
+
+
+// From the STL:
+#include <vector>
+
+#include "../AbstractParameterAliasable.h"
+
+namespace bpp
+{
+/**
+ * @brief A Simplex object, used to define sets of probabilities that
+ * sum 1.
+ *
+ * The probabilities are denoted @f$p_i at f$ for @f$i \in <1,n>@f$.
+ *
+ * If they are parametrized, the parameters are called \c "theta1",
+ * ..., \c "theta(n-1)".
+ *
+ * Three ways of parametrization are available:
+ *
+ * Global ratio:
+ *
+ * @f$\forall i<n, \theta_i=\frac{p_i}{1-(p_1+...+p_{i-1})}@f$.
+ *
+ * In the reverse,
+ * @f$\forall i<n, p_i= (1-\theta_1).(1-\theta_2)...\theta_{i}@f$
+ * and @f$p_n=(1-\theta_1).(1-\theta_2)...(1-\theta_{n-1})@f$.
+ *
+ *
+ * Local ratio:
+ *
+ * @f$\theta_i = \frac{p_i}{p_i+p_{i+1}} \forall i \in 1..\textrm{n-1}@f$.
+ *
+ * In the reverse if we denote @f$\alpha_i=\frac{1-\theta_i}{\theta_i}@f$,
+ * @f$p_i=\frac{\alpha_1...\alpha_{i-1}}{1+\sum_{k=1}^{n-1}\alpha_1...\alpha_k}@f$.
+ *
+ * Binary:
+ *
+ * This parametrization is based on the binary coding.
+ *
+ * Given @f$a_b...a_1 at f$ the writing of i in binary, we denote
+ * @f$i_k=a_k...a_1 at f$.
+ *
+ * Given @f$a_b...a_1 at f$ the writing of i in binary where @f$a_b=1 at f$,
+ * we denote @f$1_i=\sum_j\{p_{j+1} \text{ such that }
+ * j_b=1i_{b-1}\}@f$ and @f$0_i=\sum_j\{p_{j+1} \text{ such that }
+ * j_b=0i_{b-1}\}@f$, and then we define:
+ *
+ *
+ * @f$\theta_i=\frac{1_i}{1_i+0_i}@f$
+ *
+ * and on the reverse, we denote @f$\theta'_{0i_{b-1}}=1-\theta_i at f$
+ * and @f$\theta'_{1i_{b-1}}=\theta_i at f$.
+ *
+ * Then, if @f$c=ceil(log_2(n))@f$, for @f$i \in <0,n-1>@f$.
+ *
+ * @f$p_{i+1}=\theta'_{i_c}....\theta'_{i_1} @f$
+ *
+ */
+class Simplex :
+  public AbstractParameterAliasable
+{
+private:
+
+  /**
+   * @brief The dimension+1 of the space simplex (ie the number of probabilities).
+   *
+   */
+  size_t dim_;
+
+  /**
+   * @brief the method of parametrization.
+   *
+   * 0: No parametrization
+   * 1: Global ratio
+   * 2: Local ratio
+   * 3: Binary
+   */
+  unsigned short method_;
+
+  std::vector<double> vProb_;
+
+  /**
+   * @brief just used with local ratio (method 2)
+   */
+  std::vector<double> valpha_;
+
+public:
+  /**
+   * @brief Builds a new Simplex object from a number of
+   * probabilities. They are initialized equal.
+   *
+   * @param dim The number of probabilities.
+   * @param method  tells the method of parametrization (default 0)
+   *    0: No parametrization
+   *    1: Global ratio
+   *    2: Local ratio
+   *    3: Binary
+   * @param allowNull if null probabilites are allowed (default: false)
+   * @param name The name passed to AbstractParameterAliasable constructor.
+   *
+   */
+  Simplex(size_t dim, unsigned short method = 0, bool allowNull = false, const std::string& name = "Simplex.");
+
+  /**
+   * @brief Builds a new Simplex object from a vector of probabilities
+   *
+   * @param probas The vector of probabilities.
+   * @param method  tells the method of parametrization (default 0)
+   *    0: No parametrization
+   *    1: Global ratio
+   *    2: Local ratio
+   *    3: Binary
+   * @param allowNull if null probabilites are allowed (default: false)
+   * @param name The name passed to AbstractParameterAliasable constructor.
+   *
+   */
+  Simplex(const std::vector<double>& probas, unsigned short method = 0, bool allowNull = false, const std::string& name = "Simplex.");
+
+  virtual ~Simplex() {}
+
+  Simplex* clone() const { return new Simplex(*this); }
+
+public:
+  void fireParameterChanged(const ParameterList& parameters);
+
+  size_t dimension() const { return dim_; }
+
+  void setFrequencies(const std::vector<double>&);
+
+  const std::vector<double>& getFrequencies() const { return vProb_;}
+
+  std::vector<double>& getFrequencies() { return vProb_;}
+
+  double prob(size_t i) const { return vProb_[i]; }
+
+  unsigned short getMethod() const { return method_; }
+};
+} // end of namespace bpp.
+
+#endif  // _SIMPLEDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Seq/AlphabetIndex/SimpleScore.cpp b/src/Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.cpp
similarity index 51%
rename from src/Bpp/Seq/AlphabetIndex/SimpleScore.cpp
rename to src/Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.cpp
index 5c7801f..628db47 100644
--- a/src/Bpp/Seq/AlphabetIndex/SimpleScore.cpp
+++ b/src/Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.cpp
@@ -1,14 +1,14 @@
 //
-// File: SimpleScore.cpp
+// File: TruncatedExponentialDiscreteDistribution.cpp
 // Created by: Julien Dutheil
-// Created on: Fri May 04 09:35 2007
+// Created on: Fri Jan 25 15:24 2008
 //
 
 /*
    Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
    This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
+   for numerical calculus.
 
    This software is governed by the CeCILL  license under French law and
    abiding by the rules of distribution of free software.  You can  use,
@@ -37,48 +37,54 @@
    knowledge of the CeCILL license and that you accept its terms.
  */
 
-// from the STL:
-#include <string>
+#include "TruncatedExponentialDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../../Utils/MapTools.h"
 
-using namespace std;
+using namespace bpp;
 
-#include "SimpleScore.h"
+// From the STL:
+#include <cmath>
 
-using namespace bpp;
+using namespace std;
 
-SimpleScore::SimpleScore(const Alphabet* alphabet, double match, double mismatch) :
-  distanceMatrix_(alphabet->getSize(), alphabet->getSize()),
-  alphabet_(alphabet)
-{
-  // Load the matrix:
-  size_t n = alphabet_->getSize();
-  for (size_t i = 0; i < n; ++i)
-  {
-    for (size_t j = 0; j < n; ++j)
-    {
-      distanceMatrix_(i, j) = (i == j ? match : mismatch);
-    }
-  }
-}
+/** Constructor: **************************************************************/
 
-double SimpleScore::getIndex(int state1, int state2) const
-throw (BadIntException)
+TruncatedExponentialDiscreteDistribution::TruncatedExponentialDiscreteDistribution(size_t n, double lambda, double truncationPoint) :
+  AbstractParameterAliasable("TruncExponential."),
+  AbstractDiscreteDistribution(n, "TruncExponential."),
+  lambda_(lambda),
+  tp_(truncationPoint),
+  cond_(1-exp(-lambda_*tp_))
 {
-  size_t stateIndex1 = alphabet_->getStateIndex(state1);
-  size_t stateIndex2 = alphabet_->getStateIndex(state2);
-  return distanceMatrix_(stateIndex1, stateIndex2);
+  addParameter_(new Parameter("TruncExponential.tp", truncationPoint, &Parameter::R_PLUS));
+  addParameter_(new Parameter("TruncExponential.lambda", lambda,  &Parameter::R_PLUS));
+
+  intMinMax_.setLowerBound(0, true);
+  intMinMax_.setUpperBound(tp_, false);
+
+  discretize();
 }
 
-double SimpleScore::getIndex(const std::string& state1, const std::string& state2) const
-throw (BadCharException)
+/******************************************************************************/
+
+void TruncatedExponentialDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
 {
-  size_t stateIndex1 = alphabet_->getStateIndex(state1);
-  size_t stateIndex2 = alphabet_->getStateIndex(state2);
-  return distanceMatrix_(stateIndex1, stateIndex2);
+  AbstractDiscreteDistribution::fireParameterChanged(parameters);
+  lambda_ = getParameterValue("lambda");
+  tp_ = getParameterValue("tp");
+
+  intMinMax_.setUpperBound(tp_, false);
+  cond_=1-exp(-lambda_*tp_);
+  
+  discretize();
 }
 
-LinearMatrix<double>* SimpleScore::getIndexMatrix() const
+/******************************************************************************/
+
+void TruncatedExponentialDiscreteDistribution::restrictToConstraint(const Constraint& c)
 {
-  return new LinearMatrix<double>(distanceMatrix_);
-}
+  AbstractDiscreteDistribution::restrictToConstraint(c);
 
+  getParameter_("tp").setConstraint(intMinMax_.clone(), true);
+}
diff --git a/src/Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.h b/src/Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.h
new file mode 100644
index 0000000..8ed06af
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.h
@@ -0,0 +1,154 @@
+//
+// File: TruncatedExponentialDiscreteDistribution.h
+// Created by: Julien Dutheil
+// Created on: Fri Jan 25 15:24 2008
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _TRUNCATEDEXPONENTIALDISCRETEDISTRIBUTION_H_
+#define _TRUNCATEDEXPONENTIALDISCRETEDISTRIBUTION_H_
+
+#include "ExponentialDiscreteDistribution.h"
+#include "../Constraints.h"
+#include "../Random/RandomTools.h"
+
+namespace bpp
+{
+/**
+ * @brief Discretized Truncated (on the right) Exponential
+ * distribution, where the probabilities are given the exponential,
+ * conditioned by the upper limit.
+ *
+ * This distribution has two parameters: the traditional exponential law parameter,
+ * and the abscissa of the truncation. The distribution will be truncated on the right
+ * of this point.
+ */
+  
+class TruncatedExponentialDiscreteDistribution :
+  public AbstractDiscreteDistribution
+{
+protected:
+  double lambda_;
+
+  double tp_;
+
+  /*
+   * Probability of the condition given x < tp_.
+   *
+   */
+   
+  double cond_;
+  
+public:
+  /**
+   * @brief Build a new truncated exponential discrete distribution.
+   * @param n the number of categories to use.
+   * @param lambda The lambda parameter
+   * @param truncationPoint The truncation point
+   *
+   * The Parameters are: lambda @f$ \in [0.000001;\infty[ @f$ and tp . at f$ \in [0;\infty[ @f$
+   *
+   */
+
+  TruncatedExponentialDiscreteDistribution(size_t n, double lambda = 1., double truncationPoint = 10);
+
+  TruncatedExponentialDiscreteDistribution(const TruncatedExponentialDiscreteDistribution& dist) :
+    AbstractParameterAliasable(dist),
+    AbstractDiscreteDistribution(dist),
+    lambda_(dist.lambda_),
+    tp_(dist.tp_),
+    cond_(dist.cond_)
+  {}
+
+  TruncatedExponentialDiscreteDistribution& operator=(const TruncatedExponentialDiscreteDistribution& dist)
+  {
+    AbstractParameterAliasable::operator=(dist);
+    AbstractDiscreteDistribution::operator=(dist);
+    lambda_= dist.lambda_;
+    tp_ = dist.tp_;
+    cond_ = dist.cond_;
+    return *this;
+  }
+
+  ~TruncatedExponentialDiscreteDistribution(){};
+
+  TruncatedExponentialDiscreteDistribution* clone() const { return new TruncatedExponentialDiscreteDistribution(*this); }
+
+public:
+
+  std::string getName() const {return("TruncExponential");}
+
+  void fireParameterChanged(const ParameterList& parameters);
+
+  double randC() const throw (Exception)
+  {
+    double x = RandomTools::randExponential(1. / getParameterValue("lambda"));
+    while (!intMinMax_.isCorrect(x))
+      x = RandomTools::randExponential(1. / getParameterValue("lambda"));
+
+    return x;
+  }
+
+  double pProb(double x) const
+  {
+    if (x>=tp_)
+      return 1.;
+    else
+      return (1. - exp(-lambda_ * x))/cond_;
+  }
+
+  double qProb(double x) const
+  {
+    if (x==1)
+      return tp_;
+    else
+      return -log(1. - cond_*x) / lambda_;
+  }
+
+  double Expectation(double a) const
+  {
+    if (a<tp_)
+      return (1. / lambda_ - exp(-a * lambda_) * (a + 1. / lambda_))/cond_;
+    else
+      return (1. / lambda_ - exp(-tp_ * lambda_) * (tp_ + 1. / lambda_))/cond_;
+      
+  }
+
+  void restrictToConstraint(const Constraint& c);
+};
+} //end of namespace bpp.
+
+#endif  //_TRUNCATEDEXPONENTIALDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Seq/SequenceWithQuality.cpp b/src/Bpp/Numeric/Prob/UniformDiscreteDistribution.cpp
similarity index 55%
rename from src/Bpp/Seq/SequenceWithQuality.cpp
rename to src/Bpp/Numeric/Prob/UniformDiscreteDistribution.cpp
index 40cc8f4..1d2d03a 100644
--- a/src/Bpp/Seq/SequenceWithQuality.cpp
+++ b/src/Bpp/Numeric/Prob/UniformDiscreteDistribution.cpp
@@ -1,14 +1,14 @@
-// 
-// File:    SequenceWithQuality.cpp
-// Author:  Sylvain Gaillard
-// Created: 19/01/2010 16:09:02
-// 
+//
+// File: UniformDiscreteDistribution.cpp
+// Created by: Laurent Guéguen
+// Created on: April 2010
+//
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (January 19, 2010)
+Copyright or © or Copr. CNRS, (2010)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,44 +37,58 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SequenceWithQuality.h"
-#include <Bpp/Numeric/VectorTools.h>
+#include "UniformDiscreteDistribution.h"
+#include "../Random/RandomTools.h"
+#include "../../Utils/MapTools.h"
 
 using namespace bpp;
 
-#include <string>
-#include <iostream>
+// From the STL:
+#include <cmath>
 
 using namespace std;
 
-const string SequenceQuality::QUALITY_SCORE = "Quality score";
-const int SequenceQuality::DEFAULT_QUALITY_VALUE = 20;
+/** Constructor: **************************************************************/
 
-/******************************************************************************/
-
-void SequenceQuality::afterSequenceChanged(const SymbolListEditionEvent& event)
+UniformDiscreteDistribution::UniformDiscreteDistribution(unsigned int n, double min, double max) :
+  AbstractParameterAliasable("Uniform."),
+  AbstractDiscreteDistribution(n,"Uniform."),
+  min_((min<max)?min:max),
+  max_((min<max)?max:min) 
 {
-  qualScores_.clear();
-  qualScores_.insert(qualScores_.begin(), event.getSymbolList()->size(), DEFAULT_QUALITY_VALUE);
+  intMinMax_.setLowerBound(min_,false);
+  intMinMax_.setUpperBound(max_,false);
+
+  discretize();
 }
 
-/******************************************************************************/
+UniformDiscreteDistribution::UniformDiscreteDistribution(const UniformDiscreteDistribution& udd) : 
+  AbstractParameterAliasable(udd),
+  AbstractDiscreteDistribution(udd),
+  min_(udd.min_),
+  max_(udd.max_)
+{
+}
 
-void SequenceQuality::afterSequenceInserted(const SymbolListInsertionEvent& event)
+UniformDiscreteDistribution& UniformDiscreteDistribution::operator=(const UniformDiscreteDistribution& udd) 
 {
-  qualScores_.insert(
-      qualScores_.begin() + static_cast<ptrdiff_t>(event.getPosition()),
-      event.getLength(), DEFAULT_QUALITY_VALUE);
+  AbstractParameterAliasable::operator=(udd);
+  AbstractDiscreteDistribution::operator=(udd);
+  min_=udd.min_;
+  max_=udd.max_;
+
+  return *this;
 }
 
+UniformDiscreteDistribution::~UniformDiscreteDistribution() {}
+
 /******************************************************************************/
 
-void SequenceQuality::afterSequenceDeleted(const SymbolListDeletionEvent& event)
+void UniformDiscreteDistribution::fireParameterChanged(const ParameterList& parameters)
 {
-  qualScores_.erase(
-      qualScores_.begin() + static_cast<ptrdiff_t>(event.getPosition()),
-      qualScores_.begin() + static_cast<ptrdiff_t>(event.getPosition() + event.getLength()));
 }
 
-/******************************************************************************/
+
+
+
 
diff --git a/src/Bpp/Numeric/Prob/UniformDiscreteDistribution.h b/src/Bpp/Numeric/Prob/UniformDiscreteDistribution.h
new file mode 100644
index 0000000..965d054
--- /dev/null
+++ b/src/Bpp/Numeric/Prob/UniformDiscreteDistribution.h
@@ -0,0 +1,113 @@
+//
+// File: UniformDiscreteDistribution.h
+// Created by: Laurent Guéguen
+// Created on: April 2010
+//
+
+/*
+  Copyright or © or Copr. CNRS, (2010)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _UNIFORMDISCRETEDISTRIBUTION_H_
+#define _UNIFORMDISCRETEDISTRIBUTION_H_
+
+#include "AbstractDiscreteDistribution.h"
+#include "../Constraints.h"
+#include "../Random/RandomTools.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief Discretized Uniform distribution.
+   * All categories are equidistributed all along a given interval.
+   *
+   * @author Laurent Gueguen
+   */
+  class UniformDiscreteDistribution:
+    public AbstractDiscreteDistribution
+  {
+  private:
+    double min_;
+    double max_;
+
+  public:
+    /**
+     * @brief Build a new discretized uniform distribution.
+     * @param n the number of categories to use.
+     * @param min The minimun value (default 0)
+     * @param max The maximum value (default 1)
+     */
+    UniformDiscreteDistribution(unsigned int n, double min = 0., double max = 1.);
+
+    UniformDiscreteDistribution(const UniformDiscreteDistribution&);
+
+    UniformDiscreteDistribution& operator=(const UniformDiscreteDistribution&);
+    
+    virtual ~UniformDiscreteDistribution();
+
+    UniformDiscreteDistribution* clone() const { return new UniformDiscreteDistribution(*this); }
+  
+  public:
+    std::string getName() const {return("Uniform");}
+
+    void fireParameterChanged(const ParameterList & parameters);
+
+    double randC() const throw (Exception)
+    {
+      double x= RandomTools::giveRandomNumberBetweenZeroAndEntry(max_-min_)+min_;
+      while (!intMinMax_.isCorrect(x))
+        x= RandomTools::giveRandomNumberBetweenZeroAndEntry(max_-min_)+min_;
+      return x;
+    }
+
+    double qProb(double x) const
+    {
+      return min_+x*(max_-min_);
+    }
+    
+    double pProb(double x) const
+    {
+      return (x<=min_)?0:(x-min_)/(max_-min_);
+    }
+    
+    double Expectation(double a) const
+    {
+      return (a<=min_)?0:((a>=max_)?(max_+min_)/2:(a*a-min_*min_)/(max_-min_)/2);
+    }
+    
+  };
+
+} //end of namespace bpp.
+
+#endif  //_UNIFORMDISCRETEDISTRIBUTION_H_
+
diff --git a/src/Bpp/Numeric/Random/ContingencyTableGenerator.cpp b/src/Bpp/Numeric/Random/ContingencyTableGenerator.cpp
new file mode 100644
index 0000000..cf28bbd
--- /dev/null
+++ b/src/Bpp/Numeric/Random/ContingencyTableGenerator.cpp
@@ -0,0 +1,199 @@
+//
+// File ContingencyTableGenerator.cpp
+// Author: Julien Dutheil
+// Created on: Fri Dec 10 2010 16:19
+//
+
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "ContingencyTableGenerator.h"
+#include "../VectorTools.h"
+
+#include <iostream>
+
+using namespace bpp;
+using namespace std;
+
+/**************************************************************************/
+
+ContingencyTableGenerator::ContingencyTableGenerator(
+    const std::vector<size_t>& nrowt,
+    const std::vector<size_t>& ncolt):
+  nrowt_(nrowt),
+  ncolt_(ncolt),
+  nrow_(nrowt.size()),
+  ncol_(ncolt.size()),
+  nrowm_(0),
+  ncolm_(0),
+  jwork_(ncolt.size()),
+  ntot_(0),
+  fact_(0)
+{
+  if (nrow_ < 2 || ncol_ < 2)
+    throw Exception("ContingencyTableGenerator. Input marginals must have size greater than 1.");
+  ntot_ = VectorTools::sum(nrowt_);
+  if (ntot_ != VectorTools::sum(ncolt_))
+    throw Exception("ContingencyTableGenerator. Marginal do not sum to the same value.");
+  nrowm_ = nrow_ - 1;
+  ncolm_ = ncol_ - 1;
+  fact_.resize(ntot_ + 1);
+  double x = 0.;
+  fact_[0] = 0.;
+  for (unsigned int i = 1; i <= ntot_; i++) {
+    x = x + log(static_cast<double>(i));
+    fact_[i] = x;
+  } 
+}
+
+/* Algorithm AS 159 Applied Statistics (1981), vol. 30, no. 1
+   original (C) Royal Statistical Society 1981
+
+   Generate random two-way table with given marginal totals.
+
+   Heavily pretty edited by Martin Maechler, Dec 2003
+   use double precision for integer multiplication (against overflow);
+
+   Taken from R source file rcont.c and adapted by Julien Dutheil, Dec 2010
+*/
+
+RowMatrix<size_t> ContingencyTableGenerator::rcont2(const RandomFactory& generator)
+{
+  RowMatrix<size_t> table(nrow_, ncol_); //Result
+  size_t j, l, m, ia, ib, ic, jc, id, ie, ii, nll, nlm, nr_1, nc_1;
+  long double x, y, dummy, sumprb;
+  bool lsm, lsp;
+
+  nr_1 = nrow_ - 1;
+  nc_1 = ncol_ - 1;
+
+  ib = 0; /* -Wall */
+
+  /* Construct random matrix */
+  for (j = 0; j < nc_1; ++j)
+    jwork_[j] = ncolt_[j];
+
+  jc = ntot_;
+
+  for (l = 0; l < nr_1; ++l) { /* -----  matrix[ l, * ] ----- */
+    ia = nrowt_[l];
+    ic = jc;
+    jc -= ia;/* = n_tot - sum(nr[0:l]) */
+
+    for (m = 0; m < nc_1; ++m) {
+      id = jwork_[m];
+      ie = ic;
+      ic -= id;
+      ib = ie - ia;
+      ii = ib - id;
+
+      if (ie == 0) { /* Row [l,] is full, fill rest with zero entries */
+        for (j = m; j < nc_1; ++j)
+          table(l, j) = 0;
+        ia = 0;
+        break;
+      }
+
+      /* Generate pseudo-random number */
+      dummy = generator.drawNumber();
+
+      do {/* Outer Loop */
+
+        /* Compute conditional expected value of MATRIX(L, M) */
+
+        nlm = static_cast<size_t>(ia * (static_cast<long double>(id) / static_cast<long double>(ie)) + 0.5);
+        x = exp(fact_[ia] + fact_[ib] + fact_[ic] + fact_[id]
+          - fact_[ie] - fact_[nlm]
+          - fact_[id - nlm] - fact_[ia - nlm] - fact_[ii + nlm]);
+        if (x >= dummy)
+          break;
+
+        sumprb = x;
+        y = x;
+        nll = nlm;
+
+        do {
+          /* Increment entry in row L, column M */
+          j = static_cast<size_t>((id - nlm) * static_cast<long double>(ia - nlm));
+          lsp = (j == 0);
+          if (!lsp) {
+            ++nlm;
+            x = x * j / (static_cast<long double>(nlm) * (ii + nlm));
+            sumprb += x;
+            if (sumprb >= dummy)
+              goto L160;
+          }
+
+          do {
+            /* Decrement entry in row L, column M */
+            j = nll * (ii + nll);
+            lsm = (j == 0);
+            if (!lsm) {
+              --nll;
+              y = y * j / (static_cast<long double>(id - nll) * (ia - nll));
+              sumprb += y;
+              if (sumprb >= dummy) {
+                nlm = nll;
+                goto L160;
+              }
+              /* else */
+              if (!lsp)
+                break;/* to while (!lsp) */
+            }
+          } while (!lsm);
+        } while (!lsp);
+
+        dummy = sumprb * generator.drawNumber();
+
+      } while (true);
+
+L160:
+      table(l, m) = nlm;
+      ia -= nlm;
+      jwork_[m] -= nlm;
+    }
+    table(l, nc_1) = ia;/* last column in row l */
+  }
+
+  /* Compute entries in last row of MATRIX */
+  for (m = 0; m < nc_1; ++m)
+    table(nr_1, m) = jwork_[m];
+
+  table(nr_1, nc_1) = ib - table(nr_1, nc_1 - 1);
+
+  return table;
+}
+  
+/**************************************************************************/
+
diff --git a/src/Bpp/Seq/Alphabet/DefaultAlphabet.h b/src/Bpp/Numeric/Random/ContingencyTableGenerator.h
similarity index 52%
rename from src/Bpp/Seq/Alphabet/DefaultAlphabet.h
rename to src/Bpp/Numeric/Random/ContingencyTableGenerator.h
index b84419c..35d9a66 100644
--- a/src/Bpp/Seq/Alphabet/DefaultAlphabet.h
+++ b/src/Bpp/Numeric/Random/ContingencyTableGenerator.h
@@ -1,13 +1,14 @@
 //
-// File: DefaultAlphabet.h
+// File ContingencyTableGenerator.h
 // Author: Julien Dutheil
+// Created on: Fri Dec 10 2010 16:19
 //
 
 /*
   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
   This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
+  for numerical calculus.
 
   This software is governed by the CeCILL  license under French law and
   abiding by the rules of distribution of free software.  You can  use, 
@@ -36,64 +37,57 @@
   knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _DEFAULTALPHABET_H_
-#define _DEFAULTALPHABET_H_
+#ifndef _CONTINGENCYTABLEGENERATOR_H_
+#define _CONTINGENCYTABLEGENERATOR_H_
 
-#include "LetterAlphabet.h"
-#include <Bpp/Text/TextTools.h>
+#include "RandomFactory.h"
+#include "RandomTools.h"
+#include "../Matrix/Matrix.h"
+
+// From the STL:
+#include <cmath>
+#include <vector>
 
 namespace bpp
 {
 
-/**
- * @brief The DefaultAlphabet class.
+  /**
+ * @brief Generate a random contingency matrix with given marginal counts.
+ *
+ * This procedure was adapted from the original fortran code described in:
+ * Patefield, W. M. (1981) Algorithm AS159.  An efficient method of
+ * generating r x c tables with given row and column totals.
+ * _Applied Statistics_ *30*, 91-97.
+ * This algorithm is the one also used in R function chisq.test for instance.
+ *
+ * The code was adpated from file rcont.c, edited by Martin Maechler, Dec 2003,
+ * available in the R software source distribution.
  *
- * This alphabet should match virtually any type of sequences.
- * This should be used by who does not care of the sequence type.
+ * @param nrowt Marginal counts.
+ * @param ncolt Marginal counts.
+ * @return A random matrix of counts with the same marginals as specified.
  */
-  class DefaultAlphabet:
-    public LetterAlphabet
-  {
-  protected:
-    void registerState(AlphabetState* st) throw (Exception) {
-      AbstractAlphabet::registerState(st);
-    }
-    std::string chars_;
-		
-  public:
-    // class constructor
-    DefaultAlphabet();
-
-    DefaultAlphabet(const DefaultAlphabet& bia) : LetterAlphabet(bia), chars_(bia.chars_) {}
-
-    DefaultAlphabet& operator=(const DefaultAlphabet& bia)
-    {
-      LetterAlphabet::operator=(bia);
-      chars_=bia.chars_;
-      return *this;
-    }
-
-    DefaultAlphabet* clone() const
-    {
-      return new DefaultAlphabet(*this);
-    }
-
-
-
-    // class destructor
-    virtual ~DefaultAlphabet() {}
+class ContingencyTableGenerator
+{
+  private:
+    std::vector<size_t> nrowt_;
+    std::vector<size_t> ncolt_;
+    size_t nrow_;
+    size_t ncol_;
+    size_t nrowm_;
+    size_t ncolm_;
+    std::vector<size_t> jwork_; //workspace
+    size_t ntot_; //total number of observations
+    std::vector<double> fact_; //log factorial
 
   public:
-    unsigned int getSize() const { return 26; }
-    unsigned int getNumberOfTypes() const { return 27; }
-    std::string getAlphabetType() const { return "Default alphabet"; }
-    int getUnknownCharacterCode() const { return 37; }
-    bool isUnresolved(int state) const { return state == 37; }
-    bool isUnresolved(const std::string& state) const { return false; }
+    ContingencyTableGenerator(const std::vector<size_t>& nrowt, const std::vector<size_t>& ncolt);
 
-  };
+  public:
+    RowMatrix<size_t> rcont2(const RandomFactory& generator = *RandomTools::DEFAULT_GENERATOR); 
+};
 
 } //end of namespace bpp.
 
-#endif // _DEFAULTALPHABET_H_
+#endif  //_CONTINGENCYTABLEGENERATOR_H_
 
diff --git a/src/Bpp/Seq/Io/IoSequence.h b/src/Bpp/Numeric/Random/RandomFactory.h
similarity index 68%
copy from src/Bpp/Seq/Io/IoSequence.h
copy to src/Bpp/Numeric/Random/RandomFactory.h
index 131c31a..45475d2 100644
--- a/src/Bpp/Seq/Io/IoSequence.h
+++ b/src/Bpp/Numeric/Random/RandomFactory.h
@@ -1,14 +1,14 @@
-//
-// File IoSequence.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-//
+/*
+ * File RandomFactory.h
+ * Author : Sylvain Gaillard
+ * Last modification : Friday September 24 2004
+ */
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,36 +37,36 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCE_H_
-#define _IOSEQUENCE_H_
-
-#include <Bpp/Exceptions.h>
-#include <Bpp/Io/IoFormat.h>
-
-// From STL:
-#include <string>
+#ifndef _RANDOMFACTORY_H_
+#define _RANDOMFACTORY_H_
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequence interface.
+ * @brief This is the interface for the Random Number Generators.
  *
- * Interface for sequences input/ouput.
+ * A Random Number Generator draw numbers between two end points. Each
+ * number is taken from a given statistic distribution.
  */
-class IOSequence: public virtual IOFormat
-{
+class RandomFactory {
 	public:
-		IOSequence() {}
-		virtual ~IOSequence() {}
+		RandomFactory() {}
+		virtual ~RandomFactory() {}
 
 	public:
-
-		const std::string getDataType() const { return "Sequence container"; }
-
+		/**
+		 * @brief Set the generator's seed.
+		 */
+		virtual void setSeed(long seed) = 0;
+
+		/**
+		 * @brief Return a random number.
+		 */
+		virtual double drawNumber() const = 0;
 };
 
 } //end of namespace bpp.
 
-#endif	// _IOSEQUENCE_H_
+#endif // _RANDOMFACTORY_H_
 
diff --git a/src/Bpp/Numeric/Random/RandomTools.cpp b/src/Bpp/Numeric/Random/RandomTools.cpp
new file mode 100644
index 0000000..1ba3aba
--- /dev/null
+++ b/src/Bpp/Numeric/Random/RandomTools.cpp
@@ -0,0 +1,1034 @@
+//
+// File RandomTools.cpp
+// Author : Julien Dutheil
+// Last modification : Friday Septembre 24 2004
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "RandomTools.h"
+#include "Uniform01K.h"
+#include "../VectorTools.h"
+#include "../NumConstants.h"
+
+#include <iostream>
+
+using namespace bpp;
+using namespace std;
+
+RandomFactory* RandomTools::DEFAULT_GENERATOR = new Uniform01K(time(NULL));
+
+// Initiate random seed :
+// RandomTools::RandInt RandomTools::r = time(NULL) ;
+
+void RandomTools::setSeed(long seed)
+{
+  DEFAULT_GENERATOR->setSeed(seed);
+}
+
+// Method to get a double random value (between 0 and specified range)
+// Note : the number you get is between 0 and entry not including entry !
+double RandomTools::giveRandomNumberBetweenZeroAndEntry(double entry, const RandomFactory& generator)
+{
+  // double tm = r.drawFloatNumber();
+  double tm = generator.drawNumber();
+  return tm * entry;
+}
+
+// Method to get a boolean random value
+bool RandomTools::flipCoin(const RandomFactory& generator)
+{
+  return (RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0, generator) - 0.5) > 0;
+}
+
+double RandomTools::randGaussian(double mean, double variance, const RandomFactory& generator)
+{
+  return RandomTools::qNorm(generator.drawNumber(), mean, sqrt(variance));
+}
+
+double RandomTools::randGamma(double dblAlpha, const RandomFactory& generator)
+{
+  assert(dblAlpha > 0.0);
+  if (dblAlpha < 1.0)
+    return RandomTools::DblGammaLessThanOne(dblAlpha, generator);
+  else if (dblAlpha > 1.0)
+    return RandomTools::DblGammaGreaterThanOne(dblAlpha, generator);
+  return -log(RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0, generator));
+}
+
+double RandomTools::randGamma(double alpha, double beta, const RandomFactory& generator)
+{
+  double x = RandomTools::randGamma(alpha, generator) / beta;
+  return x;
+}
+
+double RandomTools::randExponential(double mean, const RandomFactory& generator)
+{
+  return -mean* log(RandomTools::giveRandomNumberBetweenZeroAndEntry(1, generator));
+}
+
+std::vector<size_t> RandomTools::randMultinomial(size_t n, const std::vector<double>& probs)
+{
+  double s = VectorTools::sum(probs);
+  double r;
+  double cumprob;
+  vector<size_t> sample(n);
+  for (unsigned int i = 0; i < n; i++)
+  {
+    r = RandomTools::giveRandomNumberBetweenZeroAndEntry(1);
+    cumprob = 0;
+    bool test = true;
+    for (unsigned int j = 0; test &(j < probs.size()); j++)
+    {
+      cumprob += probs[j] / s;
+      if (r <= cumprob)
+      {
+        sample[i] = j;
+        test = false;
+      }
+    }
+    // This test should never be true if probs sum to one:
+    if (test)
+      sample[i] = probs.size();
+  }
+  return sample;
+}
+
+// ------------------------------------------------------------------------------
+
+
+double RandomTools::DblGammaGreaterThanOne(double dblAlpha, const RandomFactory& generator)
+{
+  // Code adopted from David Heckerman
+  // -----------------------------------------------------------
+  //  DblGammaGreaterThanOne(dblAlpha)
+  //
+  //  routine to generate a gamma random variable with unit scale and
+  //      alpha > 1
+  //  reference: Ripley, Stochastic Simulation, p.90
+  //  Chang and Feast, Appl.Stat. (28) p.290
+  // -----------------------------------------------------------
+  double rgdbl[6];
+
+  rgdbl[1] = dblAlpha - 1.0;
+  rgdbl[2] = (dblAlpha - (1.0 / (6.0 * dblAlpha))) / rgdbl[1];
+  rgdbl[3] = 2.0 / rgdbl[1];
+  rgdbl[4] = rgdbl[3] + 2.0;
+  rgdbl[5] = 1.0 / sqrt(dblAlpha);
+
+  for ( ; ; )
+  {
+    double dblRand1;
+    double dblRand2;
+    do
+    {
+      dblRand1 = RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0, generator);
+      dblRand2 = RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0, generator);
+      if (dblAlpha > 2.5)
+        dblRand1 = dblRand2 + rgdbl[5] * (1.0 - 1.86 * dblRand1);
+    }
+    while (!(0.0 < dblRand1 && dblRand1 < 1.0));
+
+    double dblTemp = rgdbl[2] * dblRand2 / dblRand1;
+
+    if (rgdbl[3] * dblRand1 + dblTemp + 1.0 / dblTemp <= rgdbl[4] ||
+        rgdbl[3] * log(dblRand1) + dblTemp - log(dblTemp) < 1.0)
+    {
+      return dblTemp * rgdbl[1];
+    }
+  }
+  assert(false);
+  return 0.0;
+}
+
+double RandomTools::DblGammaLessThanOne(double dblAlpha, const RandomFactory& generator)
+{
+  // routine to generate a gamma random variable with
+  // unit scale and alpha < 1
+  // reference: Ripley, Stochastic Simulation, p.88
+  double dblTemp;
+  const double dblexp = exp(1.0);
+  for ( ; ; )
+  {
+    double dblRand0 = giveRandomNumberBetweenZeroAndEntry(1.0, generator);
+    double dblRand1 = giveRandomNumberBetweenZeroAndEntry(1.0, generator);
+    if (dblRand0 <= (dblexp / (dblAlpha + dblexp)))
+    {
+      dblTemp = pow(((dblAlpha + dblexp) * dblRand0) /
+                    dblexp, 1.0 / dblAlpha);
+      if (dblRand1 <= exp(-1.0 * dblTemp))
+        return dblTemp;
+    }
+    else
+    {
+      dblTemp = -1.0 * log((dblAlpha + dblexp) * (1.0 - dblRand0) / (dblAlpha * dblexp));
+      if (dblRand1 <= pow(dblTemp, dblAlpha - 1.0))
+        return dblTemp;
+    }
+  }
+  assert(false);
+  return 0.0;
+}
+
+/******************************************************************************/
+
+// From Yang's PAML package:
+
+/******************************************************************************/
+
+double RandomTools::qNorm(double prob)
+{
+  double a0 = -.322232431088, a1 = -1, a2 = -.342242088547, a3 = -.0204231210245;
+  double a4 = -.453642210148e-4, b0 = .0993484626060, b1 = .588581570495;
+  double b2 = .531103462366, b3 = .103537752850, b4 = .0038560700634;
+  double y, z = 0, p = prob, p1;
+
+  p1 = (p < 0.5 ? p : 1 - p);
+  if (p1 < 1e-20)
+    return -9999;
+
+  y = sqrt (log(1 / (p1 * p1)));
+  z = y + ((((y * a4 + a3) * y + a2) * y + a1) * y + a0) / ((((y * b4 + b3) * y + b2) * y + b1) * y + b0);
+  return p < 0.5 ? -z : z;
+}
+
+double RandomTools::qNorm(double prob, double mu, double sigma)
+{
+  return RandomTools::qNorm(prob) * sigma + mu;
+}
+
+double RandomTools::incompleteGamma (double x, double alpha, double ln_gamma_alpha)
+{
+  size_t i;
+  double p = alpha, g = ln_gamma_alpha;
+  double accurate = 1e-8, overflow = 1e30;
+  double factor, gin = 0, rn = 0, a = 0, b = 0, an = 0, dif = 0, term = 0;
+  vector<double> pn(6);
+
+  if (x == 0)
+    return 0;
+  if (x < 0 || p <= 0)
+    return -1;
+
+  factor = exp(p * log(x) - x - g);
+  if (x > 1 && x >= p)
+    goto l30;
+  /* (1) series expansion */
+  gin = 1;  term = 1;  rn = p;
+l20:
+  rn++;
+  term *= x / rn;   gin += term;
+
+  if (term > accurate)
+    goto l20;
+  gin *= factor / p;
+  goto l50;
+l30:
+  /* (2) continued fraction */
+  a = 1 - p;   b = a + x + 1;  term = 0;
+  pn[0] = 1;  pn[1] = x;  pn[2] = x + 1;  pn[3] = x * b;
+  gin = pn[2] / pn[3];
+l32:
+  a++;  b += 2;  term++;   an = a * term;
+  for (i = 0; i < 2; i++)
+  {
+    pn[i + 4] = b * pn[i + 2] - an * pn[i];
+  }
+  if (pn[5] == 0)
+    goto l35;
+  rn = pn[4] / pn[5];   dif = fabs(gin - rn);
+  if (dif > accurate)
+    goto l34;
+  if (dif <= accurate * rn)
+    goto l42;
+l34:
+  gin = rn;
+l35:
+  for (i = 0; i < 4; i++)
+  {
+    pn[i] = pn[i + 2];
+  }
+  if (fabs(pn[4]) < overflow)
+    goto l32;
+  for (i = 0; i < 4; i++)
+  {
+    pn[i] /= overflow;
+  }
+  goto l32;
+l42:
+  gin = 1 - factor * gin;
+
+l50:
+
+  return gin;
+}
+
+
+double RandomTools::qChisq(double prob, double v)
+{
+  double e = .5e-6, aa = .6931471805, p = prob, g;
+  double xx, c, ch, a = 0, q = 0, p1 = 0, p2 = 0, t = 0, x = 0, b = 0, s1, s2, s3, s4, s5, s6;
+
+  if (p < .000002 || p > .999998 || v <= 0)
+    return -1;
+
+  g = lnGamma (v / 2);
+  xx = v / 2;   c = xx - 1;
+  if (v >= -1.24 * log(p))
+    goto l1;
+
+  ch = pow((p * xx * exp(g + xx * aa)), 1 / xx);
+  if (ch - e < 0)
+    return ch;
+  goto l4;
+l1:
+  if (v > .32)
+    goto l3;
+  ch = 0.4;   a = log(1 - p);
+l2:
+  q = ch;  p1 = 1 + ch * (4.67 + ch);  p2 = ch * (6.73 + ch * (6.66 + ch));
+  t = -0.5 + (4.67 + 2 * ch) / p1 - (6.73 + ch * (13.32 + 3 * ch)) / p2;
+  ch -= (1 - exp(a + g + .5 * ch + c * aa) * p2 / p1) / t;
+  if (fabs(q / ch - 1) - .01 <= 0)
+    goto l4;
+  else
+    goto l2;
+
+l3:
+  x = qNorm (p);
+  p1 = 0.222222 / v;   ch = v * pow((x * sqrt(p1) + 1 - p1), 3.0);
+  if (ch > 2.2 * v + 6)
+    ch = -2 * (log(1 - p) - c * log(.5 * ch) + g);
+l4:
+  q = ch;   p1 = .5 * ch;
+  if ((t = incompleteGamma (p1, xx, g)) < 0)
+  {
+    std::cerr << "err IncompleteGamma" << std::endl;
+    return -1;
+  }
+  p2 = p - t;
+  t = p2 * exp(xx * aa + g + p1 - c * log(ch));
+  b = t / ch;  a = 0.5 * t - b * c;
+
+  s1 = (210 + a * (140 + a * (105 + a * (84 + a * (70 + 60 * a))))) / 420;
+  s2 = (420 + a * (735 + a * (966 + a * (1141 + 1278 * a)))) / 2520;
+  s3 = (210 + a * (462 + a * (707 + 932 * a))) / 2520;
+  s4 = (252 + a * (672 + 1182 * a) + c * (294 + a * (889 + 1740 * a))) / 5040;
+  s5 = (84 + 264 * a + c * (175 + 606 * a)) / 2520;
+  s6 = (120 + c * (346 + 127 * c)) / 5040;
+  ch += t * (1 + 0.5 * t * s1 - b * c * (s1 - b * (s2 - b * (s3 - b * (s4 - b * (s5 - b * s6))))));
+  if (fabs(q / ch - 1) > e)
+    goto l4;
+
+  return ch;
+}
+
+
+double RandomTools::pNorm(double x, double mu, double sigma)
+{
+  return RandomTools::pNorm((x - mu) / sigma);
+}
+
+
+double RandomTools::pNorm(double x)
+{
+  const static double a[5] = {
+    2.2352520354606839287,
+    161.02823106855587881,
+    1067.6894854603709582,
+    18154.981253343561249,
+    0.065682337918207449113
+  };
+  const static double b[4] = {
+    47.20258190468824187,
+    976.09855173777669322,
+    10260.932208618978205,
+    45507.789335026729956
+  };
+  const static double c[9] = {
+    0.39894151208813466764,
+    8.8831497943883759412,
+    93.506656132177855979,
+    597.27027639480026226,
+    2494.5375852903726711,
+    6848.1904505362823326,
+    11602.651437647350124,
+    9842.7148383839780218,
+    1.0765576773720192317e-8
+  };
+  const static double d[8] = {
+    22.266688044328115691,
+    235.38790178262499861,
+    1519.377599407554805,
+    6485.558298266760755,
+    18615.571640885098091,
+    34900.952721145977266,
+    38912.003286093271411,
+    19685.429676859990727
+  };
+  const static double p[6] = {
+    0.21589853405795699,
+    0.1274011611602473639,
+    0.022235277870649807,
+    0.001421619193227893466,
+    2.9112874951168792e-5,
+    0.02307344176494017303
+  };
+  const static double q[5] = {
+    1.28426009614491121,
+    0.468238212480865118,
+    0.0659881378689285515,
+    0.00378239633202758244,
+    7.29751555083966205e-5
+  };
+
+  double xden, xnum, temp, del, eps, xsq, y, cum;
+  int i;
+
+  eps = 1e-20;
+
+  y = fabs(x);
+  if (y <= 0.67448975)   /* qnorm(3/4) = .6744.... -- earlier had 0.66291 */
+  {
+    if (y > eps)
+    {
+      xsq = x * x;
+      xnum = a[4] * xsq;
+      xden = xsq;
+      for (i = 0; i < 3; ++i)
+      {
+        xnum = (xnum + a[i]) * xsq;
+        xden = (xden + b[i]) * xsq;
+      }
+    }
+    else
+      xnum = xden = 0.0;
+
+    temp = x * (xnum + a[3]) / (xden + b[3]);
+    cum = 0.5 + temp;
+  }
+  else if (y <= sqrt(32))
+  {
+    /* Evaluate pnorm for 0.674.. = qnorm(3/4) < |x| <= sqrt(32) ~= 5.657 */
+
+    xnum = c[8] * y;
+    xden = y;
+    for (i = 0; i < 7; ++i)
+    {
+      xnum = (xnum + c[i]) * y;
+      xden = (xden + d[i]) * y;
+    }
+    temp = (xnum + c[7]) / (xden + d[7]);
+
+    xsq = trunc(y * 16) / 16;
+    del = (y - xsq) * (y + xsq);
+    cum = exp(-xsq * xsq * 0.5) * exp(-del * 0.5) * temp;
+
+    if (x > 0.)
+      cum = 1 - cum;
+  }
+  else if (-37.5193 < x  &&  x < 8.2924)
+  {
+    xsq = 1.0 / (x * x);
+    xnum = p[5] * xsq;
+    xden = xsq;
+    for (i = 0; i < 4; ++i)
+    {
+      xnum = (xnum + p[i]) * xsq;
+      xden = (xden + q[i]) * xsq;
+    }
+    temp = xsq * (xnum + p[4]) / (xden + q[4]);
+    temp = (1 / sqrt(2 * M_PI) - temp) / y;
+
+    xsq = trunc(x * 16) / 16;
+    del = (x - xsq) * (x + xsq);
+
+    cum = exp(-xsq * xsq * 0.5) * exp(-del * 0.5) * temp;
+
+    if (x > 0.)
+      cum = 1. - cum;
+  }
+  else   /* no log_p , large x such that probs are 0 or 1 */
+  {
+    if (x > 0)
+      cum = 1.;
+    else
+      cum = 0.;
+  }
+
+  return cum;
+}
+
+double RandomTools::lnBeta(double alpha, double beta)
+{
+  return lnGamma(alpha) + lnGamma(beta) - lnGamma(alpha + beta);
+}
+
+double RandomTools::randBeta(double alpha, double beta, const RandomFactory& generator)
+{
+  return RandomTools::qBeta(generator.drawNumber(), alpha, beta);
+}
+
+
+double RandomTools::qBeta(double prob, double alpha, double beta)
+{
+  double lower = NumConstants::VERY_TINY();
+  double upper = 1 - NumConstants::VERY_TINY();
+  double const1 = 2.30753;
+  double const2 = 0.27061;
+  double const3 = 0.99229;
+  double const4 = 0.04481;
+
+
+  int swap_tail, i_pb, i_inn;
+  double a, adj, logbeta, g, h, pp, prev, qq, r, s, t, tx, w, y, yprev;
+  double acu;
+  volatile double xinbta;
+
+  if (alpha <= 0. || beta < 0.)
+    throw ("RandomTools::qBeta wih non positive parameters");
+
+  if (prob < 0. || prob > 1.)
+    throw ("RandomTools::qBeta wih bad probability");
+
+  /* initialize */
+  logbeta = lnBeta(alpha, beta);
+
+  /* change tail if necessary;  afterwards   0 < a <= 1/2   */
+  if (prob <= 0.5)
+  {
+    a = prob;  pp = alpha; qq = beta; swap_tail = 0;
+  }
+  else   /* change tail, swap  alpha <-> beta :*/
+  {
+    a = 1 - prob;
+    pp = beta; qq = alpha; swap_tail = 1;
+  }
+
+  /* calculate the initial approximation */
+
+  /* y := {fast approximation of} qnorm(1 - a) :*/
+  r = sqrt(-2 * log(a));
+  y = r - (const1 + const2 * r) / (1. + (const3 + const4 * r) * r);
+  if (pp > 1 && qq > 1)
+  {
+    r = (y * y - 3.) / 6.;
+    s = 1. / (pp + pp - 1.);
+    t = 1. / (qq + qq - 1.);
+    h = 2. / (s + t);
+    w = y * sqrt(h + r) / h - (t - s) * (r + 5. / 6. - 2. / (3. * h));
+    xinbta = pp / (pp + qq * exp(w + w));
+  }
+  else
+  {
+    r = qq + qq;
+    t = 1. / (9. * qq);
+    t = r * pow(1. - t + y * sqrt(t), 3.0);
+    if (t <= 0.)
+      xinbta = 1. - exp((log1p(-a) + log(qq) + logbeta) / qq);
+    else
+    {
+      t = (4. * pp + r - 2.) / t;
+      if (t <= 1.)
+        xinbta = exp((log(a * pp) + logbeta) / pp);
+      else
+        xinbta = 1. - 2. / (t + 1.);
+    }
+  }
+
+  /* solve for x by a modified newton-raphson method, */
+  /* using the function pbeta_raw */
+
+  r = 1 - pp;
+  t = 1 - qq;
+  yprev = 0.;
+  adj = 1;
+  /* Sometimes the approximation is negative! */
+  if (xinbta < lower)
+    xinbta = 0.5;
+  else if (xinbta > upper)
+    xinbta = 0.5;
+
+  /* Desired accuracy should depend on  (a,p)
+   * This is from Remark .. on AS 109, adapted.
+   * However, it's not clear if this is "optimal" for IEEE double prec.
+
+   * acu = fmax2(lower, pow(10., -25. - 5./(pp * pp) - 1./(a * a)));
+
+   * NEW: 'acu' accuracy NOT for squared adjustment, but simple;
+   * ---- i.e.,  "new acu" = sqrt(old acu)
+
+   */
+  double po = pow(10., -13 - 2.5 / (pp * pp) - 0.5 / (a * a));
+  acu = (lower > po) ? lower : po;
+
+  tx = prev = 0.;  /* keep -Wall happy */
+
+  for (i_pb = 0; i_pb < 1000; i_pb++)
+  {
+    y = incompleteBeta(xinbta, pp, qq);
+// #ifdef IEEE_754
+//     if(!R_FINITE(y))
+// #else
+//       if (errno)
+// #endif
+//         ML_ERR_return_NAN;
+
+    y = (y - a) *
+        exp(logbeta + r * log(xinbta) + t * log1p(-xinbta));
+    if (y * yprev <= 0.)
+      prev = (fabs(adj) > lower) ? fabs(adj) : lower;
+    g = 1;
+    for (i_inn = 0; i_inn < 1000; i_inn++)
+    {
+      adj = g * y;
+      if (fabs(adj) < prev)
+      {
+        tx = xinbta - adj; /* trial new x */
+        if (tx >= 0. && tx <= 1)
+        {
+          if ((prev <= acu) || (fabs(y) <= acu))
+            return swap_tail ? 1 - xinbta : xinbta;
+          if (tx != 0. && tx != 1)
+            break;
+        }
+      }
+      g /= 3;
+    }
+    if (fabs(tx - xinbta) < 1e-15 * xinbta)
+      return swap_tail ? 1 - xinbta : xinbta;
+
+    xinbta = tx;
+    yprev = y;
+  }
+  // throw Exception("Bad precision in RandomTools::qBeta");
+
+  return swap_tail ? 1 - xinbta : xinbta;
+}
+
+double RandomTools::incompleteBeta(double x, double alpha, double beta)
+{
+  double t;
+  double xc;
+  double w;
+  double y;
+  int flag;
+  double big;
+  double biginv;
+  double maxgam;
+  double minlog;
+  double maxlog;
+
+  big = 4.503599627370496e15;
+  biginv = 2.22044604925031308085e-16;
+  maxgam = 171.624376956302725;
+  minlog = log(NumConstants::VERY_TINY());
+  maxlog = log(NumConstants::VERY_BIG());
+
+  if ((alpha <= 0) || (beta <= 0))
+    throw Exception("RandomTools::incompleteBeta not valid with non-positive parameters");
+
+  if ((x < 0) || (x > 1))
+    throw Exception("RandomTools::incompleteBeta out of bounds limit");
+
+  if (x == 0)
+    return 0;
+
+  if (x == 1)
+    return 1;
+
+  flag = 0;
+  if ((beta * x <= 1.0) && (x <= 0.95))
+  {
+    return incompletebetaps(alpha, beta, x, maxgam);
+  }
+  w = 1.0 - x;
+
+  if (x > alpha / (alpha + beta))
+  {
+    flag = 1;
+    t = alpha;
+    alpha = beta;
+    beta = t;
+    xc = x;
+    x = w;
+  }
+  else
+  {
+    xc = w;
+  }
+  if (flag == 1 && (beta * x <= 1.0) && (x <= 0.95) )
+  {
+    t = incompletebetaps(alpha, beta, x, maxgam);
+    if (t <= NumConstants::VERY_TINY())
+      return 1.0 - NumConstants::VERY_TINY();
+    else
+      return 1.0 - t;
+  }
+
+  y = x * (alpha + beta - 2.0) - (alpha - 1.0);
+  if (y < 0.0)
+  {
+    w = incompletebetafe(alpha, beta, x, big, biginv);
+  }
+  else
+  {
+    w = incompletebetafe2(alpha, beta, x, big, biginv) / xc;
+  }
+  y = alpha * log(x);
+  t = beta * log(xc);
+  if ( (alpha + beta < maxgam) && (fabs(y) < maxlog) && (fabs(t) < maxlog) )
+  {
+    t = pow(xc, beta);
+    t = t * pow(x, alpha);
+    t = t / alpha;
+    t = t * w;
+    t = t * exp(lnGamma(alpha + beta) - (lnGamma(alpha) + lnGamma(beta)));
+    if (flag == 1)
+    {
+      if (t < NumConstants::VERY_TINY())
+        return 1.0 - NumConstants::VERY_TINY();
+      else
+        return 1.0 - t;
+    }
+    else
+      return t;
+  }
+  y = y + t + lnGamma(alpha + beta) - lnGamma(alpha) - lnGamma(beta);
+  y = y + log(w / alpha);
+  if (y < minlog)
+  {
+    t = 0.0;
+  }
+  else
+  {
+    t = exp(y);
+  }
+  if (flag == 1)
+  {
+    if (t < NumConstants::VERY_TINY())
+      t = 1.0 - NumConstants::VERY_TINY();
+    else
+      t = 1.0 - t;
+  }
+  return t;
+}
+
+
+/**********************************************/
+
+double RandomTools::incompletebetafe(double a,
+                                     double b,
+                                     double x,
+                                     double big,
+                                     double biginv)
+{
+  double result;
+  double xk;
+  double pk;
+  double pkm1;
+  double pkm2;
+  double qk;
+  double qkm1;
+  double qkm2;
+  double k1;
+  double k2;
+  double k3;
+  double k4;
+  double k5;
+  double k6;
+  double k7;
+  double k8;
+  double r;
+  double t;
+  double ans;
+  double thresh;
+  int n;
+
+  k1 = a;
+  k2 = a + b;
+  k3 = a;
+  k4 = a + 1.0;
+  k5 = 1.0;
+  k6 = b - 1.0;
+  k7 = k4;
+  k8 = a + 2.0;
+  pkm2 = 0.0;
+  qkm2 = 1.0;
+  pkm1 = 1.0;
+  qkm1 = 1.0;
+  ans = 1.0;
+  r = 1.0;
+  n = 0;
+  thresh = 3.0 * NumConstants::VERY_TINY();
+  do
+  {
+    xk = -x * k1 * k2 / (k3 * k4);
+    pk = pkm1 + pkm2 * xk;
+    qk = qkm1 + qkm2 * xk;
+    pkm2 = pkm1;
+    pkm1 = pk;
+    qkm2 = qkm1;
+    qkm1 = qk;
+    xk = x * k5 * k6 / (k7 * k8);
+    pk = pkm1 + pkm2 * xk;
+    qk = qkm1 + qkm2 * xk;
+    pkm2 = pkm1;
+    pkm1 = pk;
+    qkm2 = qkm1;
+    qkm1 = qk;
+    if (qk != 0)
+    {
+      r = pk / qk;
+    }
+    if (r != 0)
+    {
+      t = fabs((ans - r) / r);
+      ans = r;
+    }
+    else
+    {
+      t = 1.0;
+    }
+    if (t < thresh)
+    {
+      break;
+    }
+    k1 = k1 + 1.0;
+    k2 = k2 + 1.0;
+    k3 = k3 + 2.0;
+    k4 = k4 + 2.0;
+    k5 = k5 + 1.0;
+    k6 = k6 - 1.0;
+    k7 = k7 + 2.0;
+    k8 = k8 + 2.0;
+    if (fabs(qk) + fabs(pk) > big)
+    {
+      pkm2 = pkm2 * biginv;
+      pkm1 = pkm1 * biginv;
+      qkm2 = qkm2 * biginv;
+      qkm1 = qkm1 * biginv;
+    }
+    if ((fabs(qk) < biginv) || (fabs(pk) < biginv))
+    {
+      pkm2 = pkm2 * big;
+      pkm1 = pkm1 * big;
+      qkm2 = qkm2 * big;
+      qkm1 = qkm1 * big;
+    }
+    n = n + 1;
+  }
+  while (n != 300);
+  result = ans;
+  return result;
+}
+
+
+/*************************************************************************
+   Continued fraction expansion #2
+   for incomplete beta integral
+
+   Cephes Math Library, Release 2.8:  June, 2000
+   Copyright 1984, 1995, 2000 by Stephen L. Moshier
+*************************************************************************/
+double RandomTools::incompletebetafe2(double a,
+                                      double b,
+                                      double x,
+                                      double big,
+                                      double biginv)
+{
+  double result;
+  double xk;
+  double pk;
+  double pkm1;
+  double pkm2;
+  double qk;
+  double qkm1;
+  double qkm2;
+  double k1;
+  double k2;
+  double k3;
+  double k4;
+  double k5;
+  double k6;
+  double k7;
+  double k8;
+  double r;
+  double t;
+  double ans;
+  double z;
+  double thresh;
+  int n;
+
+  k1 = a;
+  k2 = b - 1.0;
+  k3 = a;
+  k4 = a + 1.0;
+  k5 = 1.0;
+  k6 = a + b;
+  k7 = a + 1.0;
+  k8 = a + 2.0;
+  pkm2 = 0.0;
+  qkm2 = 1.0;
+  pkm1 = 1.0;
+  qkm1 = 1.0;
+  z = x / (1.0 - x);
+  ans = 1.0;
+  r = 1.0;
+  n = 0;
+  thresh = 3.0 * NumConstants::VERY_TINY();
+  do
+  {
+    xk = -z * k1 * k2 / (k3 * k4);
+    pk = pkm1 + pkm2 * xk;
+    qk = qkm1 + qkm2 * xk;
+    pkm2 = pkm1;
+    pkm1 = pk;
+    qkm2 = qkm1;
+    qkm1 = qk;
+    xk = z * k5 * k6 / (k7 * k8);
+    pk = pkm1 + pkm2 * xk;
+    qk = qkm1 + qkm2 * xk;
+    pkm2 = pkm1;
+    pkm1 = pk;
+    qkm2 = qkm1;
+    qkm1 = qk;
+    if (qk != 0)
+    {
+      r = pk / qk;
+    }
+    if (r != 0)
+    {
+      t = fabs((ans - r) / r);
+      ans = r;
+    }
+    else
+    {
+      t = 1.0;
+    }
+    if (t < thresh)
+    {
+      break;
+    }
+    k1 = k1 + 1.0;
+    k2 = k2 - 1.0;
+    k3 = k3 + 2.0;
+    k4 = k4 + 2.0;
+    k5 = k5 + 1.0;
+    k6 = k6 + 1.0;
+    k7 = k7 + 2.0;
+    k8 = k8 + 2.0;
+    if (fabs(qk) + fabs(pk) > big)
+    {
+      pkm2 = pkm2 * biginv;
+      pkm1 = pkm1 * biginv;
+      qkm2 = qkm2 * biginv;
+      qkm1 = qkm1 * biginv;
+    }
+    if ((fabs(qk) < biginv) || (fabs(pk) < biginv))
+    {
+      pkm2 = pkm2 * big;
+      pkm1 = pkm1 * big;
+      qkm2 = qkm2 * big;
+      qkm1 = qkm1 * big;
+    }
+    n = n + 1;
+  }
+  while (n != 300);
+  result = ans;
+  return result;
+}
+
+
+/*************************************************************************
+   Power series for incomplete beta integral.
+   Use when b*x is small and x not too close to 1.
+
+   Cephes Math Library, Release 2.8:  June, 2000
+   Copyright 1984, 1995, 2000 by Stephen L. Moshier
+*************************************************************************/
+double RandomTools::incompletebetaps(double a, double b, double x, double maxgam)
+{
+  double result;
+  double s;
+  double t;
+  double u;
+  double v;
+  double n;
+  double t1;
+  double z;
+  double ai;
+
+  ai = 1.0 / a;
+  u = (1.0 - b) * x;
+  v = u / (a + 1.0);
+  t1 = v;
+  t = u;
+  n = 2.0;
+  s = 0.0;
+  z = NumConstants::VERY_TINY() * ai;
+  while (fabs(v) > z)
+  {
+    u = (n - b) * x / n;
+    t = t * u;
+    v = t / (a + n);
+    s = s + v;
+    n = n + 1.0;
+  }
+  s = s + t1;
+  s = s + ai;
+  u = a * log(x);
+  if ((a + b < maxgam) && (fabs(u) < log(NumConstants::VERY_BIG())))
+  {
+    t = exp(lnGamma(a + b) - (lnGamma(a) + lnGamma(b)));
+    s = s * t * pow(x, a);
+  }
+  else
+  {
+    t = lnGamma(a + b) - lnGamma(a) - lnGamma(b) + u + log(s);
+    if (t < log(NumConstants::VERY_TINY()))
+    {
+      s = 0.0;
+    }
+    else
+    {
+      s = exp(t);
+    }
+  }
+  result = s;
+  return result;
+}
+
+/**************************************************************************/
+
diff --git a/src/Bpp/Numeric/Random/RandomTools.h b/src/Bpp/Numeric/Random/RandomTools.h
new file mode 100644
index 0000000..cf44569
--- /dev/null
+++ b/src/Bpp/Numeric/Random/RandomTools.h
@@ -0,0 +1,554 @@
+//
+// File RandomTools.h
+// Author : Julien Dutheil
+//          Sylvain Gaillard
+// Last modification : Thu November 6 2008
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _RANDOMTOOLS_H_
+#define _RANDOMTOOLS_H_
+
+#include "RandomFactory.h"
+#include "../VectorExceptions.h"
+#include "../VectorTools.h"
+#include "../../Exceptions.h"
+
+// From the STL:
+#include <cmath>
+#include <cassert>
+#include <ctime>
+#include <vector>
+
+namespace bpp
+{
+
+  /**
+   * @brief Utilitary function dealing with random numbers.
+   *
+   * This class uses Uniform01K generator by default.
+   * It is possible to change this by setting the DEFAULT_GENERATOR variable.
+   *
+   * This class is adapted from Pupko's SEMPHY library.
+   * It also borrow some code from Yang's PAML package.
+   *
+   * @see RandomFactory
+   */
+  class RandomTools
+  {
+  public:
+    RandomTools() {}
+    virtual ~RandomTools() {}
+
+  private:
+    /**
+     *@brief functions for the computation of incompleteBeta
+     */
+    static double incompletebetafe(double a,
+                                   double b,
+                                   double x,
+                                   double big,
+                                   double biginv);
+    static double incompletebetafe2(double a,
+                                    double b,
+                                    double x,
+                                    double big,
+                                    double biginv);
+    static double incompletebetaps(double a,
+                                   double b,
+                                   double x,
+                                   double maxgam);
+  
+  public:
+    static RandomFactory* DEFAULT_GENERATOR;
+    
+    /**
+     * @brief Get a double random value (between 0 and specified range).
+     *
+     * Note : the number you get is between 0 and entry not including entry !
+     * @param entry Max number to reach.
+     * @param generator Random number generator to use.
+     */
+    static double giveRandomNumberBetweenZeroAndEntry(double entry, const RandomFactory& generator = *DEFAULT_GENERATOR);
+
+    /**
+     * @brief Get a boolean random value.
+     *
+     * @param generator Random number generator to use.
+     */
+    static bool flipCoin(const RandomFactory& generator = *DEFAULT_GENERATOR);
+
+    /**
+     * @brief Get an integer random value (between 0 and specified range).
+     *
+     * Note : the number you get is between 0 and entry not including entry !
+     * @param entry Max number to reach.
+     * @param generator Random number generator to use.
+     */
+    template<class intType>
+    static intType giveIntRandomNumberBetweenZeroAndEntry(intType entry, const RandomFactory& generator = *DEFAULT_GENERATOR) {
+      return static_cast<intType>(giveRandomNumberBetweenZeroAndEntry(static_cast<double>(entry), generator));
+    }
+
+    /**
+     * @brief Set the default generator seed.
+     *
+     * @param seed New seed.
+     */
+    static void setSeed(long seed);
+
+    /**
+     * @return A random number drawn from a normal distribution.
+     * @param mean The mean of the law.
+     * @param variance The variance of the law.
+     * @param generator The uniform generator to use.
+     */
+    static double randGaussian(double mean, double variance, const RandomFactory& generator = *DEFAULT_GENERATOR);
+    
+    /**
+     * @return A random number drawn from a gamma distribution with unit scale (beta=1).
+     * @param dblAlpha The alpha parameter.
+     * @param generator The uniform generator to use.
+     */
+    static double randGamma(double dblAlpha, const RandomFactory& generator = *DEFAULT_GENERATOR);
+
+    /**
+     * @return A random number drawn from a gamma distribution.
+     * @param alpha The alpha parameter.
+     * @param beta The beta parameter.
+     * @param generator The uniform generator to use.
+     */
+    static double randGamma(double alpha, double beta, const RandomFactory& generator = *DEFAULT_GENERATOR);
+  
+    /**
+     * @return A random number drawn from a beta distribution.
+     * @param alpha The alpha parameter.
+     * @param beta The beta parameter.
+     * @param generator The uniform generator to use.
+     */
+    static double randBeta(double alpha, double beta, const RandomFactory& generator = *DEFAULT_GENERATOR);
+  
+    /**
+     * @return A random number drawn from an exponential distribution.
+     * @param mean The mean of the distribution.
+     * @param generator The uniform generator to use.
+     */
+    static double randExponential(double mean, const RandomFactory& generator = *DEFAULT_GENERATOR);
+
+    /**
+     * @brief Pick one element in a vector
+     *
+     * Pick one element randomly in a vector and return it.
+     *
+     * @param v The vector of elements.
+     * @param replace If set to yes, then elements are allowed to be picked more than once, and therefore can be re-"placed" in the final sample.(default: false)
+     * @return On element of the vector.
+     * @throw EmptyVectorException if the vector is empty.
+     *
+     * @author Sylvain Gaillard
+     */
+    template<class T>
+    static T pickOne(std::vector<T>& v, bool replace = false) throw (EmptyVectorException<T>) {
+      if (v.empty())
+        throw EmptyVectorException<T>("RandomTools::pickOne: input vector is empty", &v);
+      size_t pos = RandomTools::giveIntRandomNumberBetweenZeroAndEntry<size_t>(v.size());
+      if (replace)
+        return v[pos];
+      else {
+        T e = v[pos];
+        v[pos] = v.back();
+        v.pop_back();
+        return e;
+      }
+    }
+
+    template<class T>
+    static T pickOne(const std::vector<T>& v) throw (EmptyVectorException<T>) {
+      if (v.empty())
+        throw EmptyVectorException<T>("RandomTools::pickOne: input vector is empty", &v);
+      size_t pos = RandomTools::giveIntRandomNumberBetweenZeroAndEntry<size_t>(v.size());
+      return v[pos];
+    }
+
+    /**
+     * @brief Sample a vector.
+     *
+     * The sample is a new vector of the specified size.
+     * If the size of the sample is identical to the original vector,
+     * the result is a shuffle of the original vector.
+     *
+     * @param vin The vector to sample.
+     * @param vout [out] The output vector to fill, with the appropriate size.
+     * @param replace Should sampling be with replacement?
+     * @return A vector which is a sample of v.
+     * @throw IndexOutOfBoundException if the sample size exceeds the original
+     * size when sampling without replacement.
+     * @throw EmptyVectorException if the vector is empty.
+     *
+     * @author Sylvain Gaillard
+     */
+    template<class T> 
+    static void getSample(const std::vector<T>& vin, std::vector<T>& vout, bool replace = false) throw (EmptyVectorException<T>, IndexOutOfBoundsException)
+    {
+      if (vout.size() > vin.size() && !replace)
+        throw IndexOutOfBoundsException("RandomTools::getSample: size exceeded v.size.", vout.size(), 0, vin.size());
+      std::vector<size_t> hat(vin.size());
+      for (size_t i = 0 ; i < vin.size() ; i++)
+        hat[i] = i;
+      for (size_t i = 0 ; i < vout.size() ; i++)
+        vout[i] = vin[pickOne(hat, replace)];
+    }
+
+    /**
+     * @brief Pick one element in a vector, with associated probability weights
+     *
+     * Pick one element randomly in a vector and return it.
+     * If you choose to make the picking without replacement the element is
+     * removed from the vector, and so is the corresponding weight
+     *
+     * @param v The vector of elements.
+     * @param w The vector of weight associated to the v elements.
+     * @param replace Should pick with replacement? (default: false)
+     * @return On element of the vector.
+     * @throw EmptyVectorException if the vector is empty.
+     *
+     * @author Julien Dutheil
+     */
+    template<class T>
+    static T pickOne(std::vector<T>& v, std::vector<double>& w, bool replace = false) throw (EmptyVectorException<T>) {
+      if (v.empty())
+        throw EmptyVectorException<T>("RandomTools::pickOne (with weight): input vector is empty", &v);
+      //Compute cumulative sum of weights:
+      std::vector<double> sumw = VectorTools::cumSum(w);
+      //Convert to cumulative distribution:
+      sumw /= sumw.back();
+      //Get random positions:
+      double prob = RandomTools::giveRandomNumberBetweenZeroAndEntry(1.0);
+      size_t pos = v.size() - 1;
+      for (size_t i = 0; i < v.size(); ++i) {
+        if (prob < sumw[i]) {
+          pos = i;
+          break;
+        }
+      }
+      if (replace)
+        return v[pos];
+      else {
+        T e = v[pos];
+        v[pos] = v.back();
+        v.pop_back();
+        w[pos] = w.back();
+        w.pop_back();
+        return e;
+      }
+    }
+
+    /**
+     * @brief Sample a vector, with associated probability weights.
+     *
+     * The sample is a new vector of the specified size.
+     * If the size of the sample is identical to the original vector,
+     * the result is a shuffle of the original vector.
+     *
+     * It has to be noted that in case of sampling without replacement,
+     * the effect of the weighting scheme will be weaker as the sample size becomes
+     * close to the population size. In case the two are equal (pure permutations),
+     * the weigths have no effect at all.
+     *
+     * @param vin The vector to sample.
+     * @param w The vector of weights.
+     * @param vout [out] The output vector to fill, with the appropriate size.
+     * @param replace Should sampling be with replacement?
+     * @return A vector which is a sample of v.
+     * @throw IndexOutOfBoundException if the sample size exceeds the original
+     * size when sampling without replacement.
+     * @throw EmptyVectorException if the vector is empty.
+     * @warning: For large sampling with replacement, the function is not efficient,
+     * as it recomputes the some of weights for each element picked.
+     * @author Julien Dutheil
+     */
+   template<class T> 
+    static void getSample(const std::vector<T>& vin, const std::vector<double>& w, std::vector<T>& vout, bool replace = false) throw (EmptyVectorException<T>, IndexOutOfBoundsException)
+    {
+      if (vout.size() > vin.size() && !replace)
+        throw IndexOutOfBoundsException("RandomTools::getSample (with weights): size exceeded v.size.", vout.size(), 0, vin.size());
+      std::vector<size_t> hat(vin.size());
+      for (size_t i = 0 ; i < vin.size() ; i++)
+        hat[i] = i;
+      std::vector<double> w2(w); //non const copy
+      for (size_t i = 0 ; i < vout.size() ; i++)
+        vout[i] = vin[pickOne(hat, w2, replace)];
+    }
+
+    /**
+     * @brief Get a random state from a set of probabilities/scores.
+     *
+     * The input probabilities are scaled so that they sum to one.
+     * If 'x' probabilities are provided as input, the output vector will contain values between 0 and 'x-1'.
+     *
+     * @param n The sample size.
+     * @param probs The set of intput probabilities.
+     * @return A vector of int values corresponding to the output states. States are supposed to be in the same order as the input probabilities, the first state being '0'.
+     */ 
+    static std::vector<size_t> randMultinomial(size_t n, const std::vector<double>& probs);
+
+    /**
+     * @name Probability functions.
+     *
+     * @{
+     * Adapted from Yang's PAML package.
+     *
+     */
+
+    /**
+     * @brief Normal quantile function.
+     *
+     * Returns z so that Prob{x<z}=prob where x ~ N(0,1) and (1e-12)<prob<1-(1e-12)
+     * returns (-9999) if in error
+     * Odeh RE & Evans JO (1974) The percentage points of the normal distribution.
+     * Applied Statistics 22: 96-97 (AS70)
+     *
+     * Newer methods:
+     *  Wichura MJ (1988) Algorithm AS 241: the percentage points of the
+     *    normal distribution.  37: 477-484.
+     *  Beasley JD & Springer SG  (1977).  Algorithm AS 111: the percentage 
+     *    points of the normal distribution.  26: 118-121.
+     *
+     * @param prob The probability.
+     * @return The quantile corresponding to prob.
+     */
+    static double qNorm(double prob);
+  
+    /**
+     * @brief Normal quantile function.
+     *
+     * Returns z so that Prob{x<z}=prob where x ~ N(mu,sigma^2) and (1e-12)<prob<1-(1e-12)
+     * returns (-9999) if in error
+     * Odeh RE & Evans JO (1974) The percentage points of the normal distribution.
+     * Applied Statistics 22: 96-97 (AS70)
+     *
+     * Newer methods:
+     *  Wichura MJ (1988) Algorithm AS 241: the percentage points of the
+     *    normal distribution.  37: 477-484.
+     *  Beasley JD & Springer SG  (1977).  Algorithm AS 111: the percentage 
+     *    points of the normal distribution.  26: 118-121.
+     *
+     * @param prob The probability.
+     * @param mu The mean of the distribution
+     * @param sigma The standard deviation of the distribution
+     * @return The quantile corresponding to prob.
+     */
+    static double qNorm(double prob, double mu, double sigma);
+
+    /**
+     * @brief Computes \f$ln\left(\Gamma\left(\alpha\right)\right)\f$ given \f$\alpha\f$.
+     * 
+     * @param alpha Alpha parameter.
+     * @return \f$ln\left(\Gamma\left(\alpha\right)\right)\f$
+     */
+    static double lnGamma(double alpha) { return std::lgamma(alpha); }
+
+    /**
+     * @brief Returns the incomplete gamma ratio I(x,alpha).
+     *
+     * X is the upper limit of the integration and alpha is the shape parameter.
+     * returns (-1) if in error
+     * ln_gamma_alpha = ln(Gamma(alpha)), is almost redundant.
+     * (1) series expansion     if (alpha>x || x<=1)
+     * (2) continued fraction   otherwise
+     * RATNEST FORTRAN by
+     * Bhattacharjee GP (1970) The incomplete gamma integral.  Applied Statistics,
+     * 19: 285-287 (AS32)
+     *
+     * @param x the upper limit of the integration.
+     * @param alpha the shape parameter.
+     * @param ln_gamma_alpha ln(Gamma(alpha)).
+     */
+    static double incompleteGamma(double x, double alpha, double ln_gamma_alpha);
+
+
+    /**
+     * @brief \f$\chi^2\f$ quantile function.
+     * 
+     * returns z so that Prob{x<z}=prob where x is Chi2 distributed with df=v
+     * returns -1 if in error.   0.000002<prob<0.999998
+     * RATNEST FORTRAN by
+     * Best DJ & Roberts DE (1975) The percentage points of the 
+     * Chi2 distribution.  Applied Statistics 24: 385-388.  (AS91)
+     * Converted into C by Ziheng Yang, Oct. 1993.
+     *
+     * @param prob The probability.
+     * @param v number of degree of freedom.
+     * @return The quantile corresponding to prob.
+     */
+    static double qChisq(double prob, double v);
+
+    /**
+     * @brief \f$\chi^2\f$ cumulative probability function.
+     *
+     * @param x The quantile for which the probability should be computed.
+     * @param v number of degree of freedom.
+     * @return The corresponding probability of the quantile.
+     */
+    static double pChisq(double x, double v)
+    {
+      if (x < 0) return 0;
+      return pGamma(x, v / 2, 0.5);
+    }
+
+    /**
+     * @brief The Gamma quantile function.
+     *
+     * @param prob The probability.
+     * @param alpha Alpha parameter.
+     * @param beta  Beta parameter.
+     * @return The quantile corresponding to prob.
+     */
+    static double qGamma(double prob, double alpha, double beta)
+    {
+      return qChisq(prob,2.0*(alpha))/(2.0*(beta));
+    }
+
+    /**
+     * @brief \f$\Gamma\f$ cumulative probability function.
+     *
+     * @param x The quantile for which the probability should be computed.
+     * @param alpha Alpha parameter.
+     * @param beta  Beta parameter.
+     * @return The corresponding probability of the quantile.
+     * @throw Exception If alpha or beta is invalid (<0).
+     *
+     */
+    static double pGamma(double x, double alpha, double beta) throw (Exception)
+    {
+      if (alpha < 0) throw Exception("RandomTools::pGamma. Negative alpha is not allowed.");
+      if (beta < 0) throw Exception("RandomTools::pGamma. Negative beta is not allowed.");
+      if (alpha == 0.) return 1.;
+      return incompleteGamma(beta*x, alpha, lnGamma(alpha));
+    }
+
+    /** @} */
+    
+    /**
+     * @name Other probability functions.
+     *
+     * Adapted from C routines for R programming langague
+     *  Copyright (C) 1995, 1996  Robert Gentleman and Ross Ihaka
+     *  Copyright (C) 1998    Ross Ihaka
+     *  Copyright (C) 2000-2002 The R Development Core Team
+     *  Copyright (C) 2003    The R Foundation
+
+     * @{
+     */
+
+    /**
+     * @brief Normal cumulative function.
+     *
+     * Returns Prob{x<=z} where x ~ N(0,1)
+     * 
+     * @param z the value.
+     * @return The corresponding probability.
+     */
+    static double pNorm(double z);
+
+    /* @brief Normal cumulative function.
+    *
+    * Returns Prob{x<=z} where x ~ N(mu,sigma^2)
+     
+    * @param z the value.
+    * @param mu The mean of the distribution
+    * @param sigma The standard deviation of the distribution
+    * @return The corresponding probability.
+    */
+    
+    static double pNorm(double z, double mu, double sigma);
+
+    /**
+     * @brief Computes
+     * \f$ln\left(Beta\left(\alpha,\beta\right)\right)\f$ given
+     * \f$\alpha\f$ and \f$b\eta\f$.
+     * 
+     * Returns ln(beta(alpha,beta)) for alpha>0 and beta>0.
+     *
+     * @param alpha, beta Alpha and Beta parameters.
+     * @return \f$ln\left(Beta\left(\alpha,\beta\right)\right)\f$
+     */
+    static double lnBeta(double alpha, double beta);
+
+    /**
+     * @brief Returns the regularized incomplete beta function
+     * @f$I_x(\alpha,\beta) = pbeta(x,\alpha,\beta at f$
+     *
+     * alpha and beta are the parameters of the function.
+     *
+     * Adapted From Cephes Math Library Release 2.8:  June, 2000
+     * Copyright by Stephen L. Moshier
+     * Under GPL License
+     *
+     * @param x the upper limit of the integration.
+     * @param alpha, beta the shape parameters.
+     */
+    static double incompleteBeta(double x, double alpha, double beta);
+    static double pBeta(double x, double alpha, double beta)
+    {
+      return incompleteBeta(x,alpha,beta);
+    }
+
+    /**
+     * @brief The Beta quantile function.
+     *
+     * An adaptation from the C code of R
+     *  Copyright (C) 1995, 1996  Robert Gentleman and Ross Ihaka
+     *  Copyright (C) 1998--2007  The R Development Core Team
+     *  based on code (C) 1979 and later Royal Statistical Society
+     *
+     * @param prob The probability.
+     * @param alpha Alpha parameter.
+     * @param beta  Beta parameter.
+     * @return The quantile corresponding to prob.
+     */
+    static double qBeta(double prob, double alpha, double beta);
+
+    /** @} */
+
+  private:
+    static double DblGammaGreaterThanOne(double dblAlpha, const RandomFactory& generator);
+    static double DblGammaLessThanOne(double dblAlpha, const RandomFactory& generator);
+  };
+
+} //end of namespace bpp.
+
+#endif  //_RANDOMTOOLS_H_
+
diff --git a/src/Bpp/Numeric/Random/Uniform01K.cpp b/src/Bpp/Numeric/Random/Uniform01K.cpp
new file mode 100644
index 0000000..af7213f
--- /dev/null
+++ b/src/Bpp/Numeric/Random/Uniform01K.cpp
@@ -0,0 +1,106 @@
+//
+// File Uniform01K.cpp
+// Author : Sylvain Gaillard
+// Last modification : Friday September 24 2004
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "Uniform01K.h"
+
+#include "../NumTools.h"
+
+using namespace bpp;
+
+const long Uniform01K::MAXNUMBER = 1000000000;
+const long Uniform01K::ZERO = 0;
+const long Uniform01K::MODSEED = 256434901;
+
+//** Class constructor: *******************************************************/
+
+Uniform01K::Uniform01K(long seed) :
+  _it1(), _it2()
+{
+	setSeed(seed);
+}
+
+//** Class destructor: *******************************************************/
+Uniform01K::~Uniform01K() {}
+
+//** Other methodes: *********************************************************/
+
+void Uniform01K::setSeed(long seed)
+{
+	long tmp1, tmp2;
+	unsigned short i, ii, j;
+	tmp1 = NumTools::abs(MODSEED - NumTools::abs(seed));
+	tmp1 %= MAXNUMBER;
+	_tab[55] = tmp1;
+	tmp2 = 1;
+
+	for (i = 1 ; i <= 54 ; i++)
+  {
+		ii = static_cast<unsigned short>((21 * i) % 55);
+		_tab[ii] = tmp2;
+		tmp2 = tmp1 - tmp2;
+
+		if (tmp2 < ZERO) tmp2 += MAXNUMBER;
+
+		tmp1 = _tab[ii];
+	}
+
+	for (j=1 ; j<=4 ; j++)
+		for (i=1 ; i<=55 ; i++)
+    {
+			_tab[i] -= _tab[1 + (i + 30) % 55];
+			if (_tab[i] < ZERO) _tab[i] += MAXNUMBER;
+		}
+	_it1 = 0;
+	_it2 = 31;
+}
+
+double Uniform01K::drawNumber() const
+{
+	if (++_it1 == 56) _it1 = 1;
+	if (++_it2 == 56) _it2 = 1;
+
+	long tmp = _tab[_it1] - _tab[_it2];
+	if (tmp < ZERO) tmp += MAXNUMBER;
+	_tab[_it2] = tmp;
+	double r = static_cast<double>(static_cast<long double>(tmp) / MAXNUMBER);
+	//if (r < 0.) return drawNumber(); // In case of negative number, take the next one in the serie.
+	//if (r > 1.) return drawNumber(); // In case of number > 1, take the next one in the serie.
+	return r;
+}
+
diff --git a/src/Bpp/Seq/Container/SiteContainerExceptions.h b/src/Bpp/Numeric/Random/Uniform01K.h
similarity index 56%
copy from src/Bpp/Seq/Container/SiteContainerExceptions.h
copy to src/Bpp/Numeric/Random/Uniform01K.h
index 0d6d449..408fd10 100644
--- a/src/Bpp/Seq/Container/SiteContainerExceptions.h
+++ b/src/Bpp/Numeric/Random/Uniform01K.h
@@ -1,14 +1,14 @@
 //
-// File SiteContainerExceptions.h
-// Author: Julien Dutheil
-// Created on: mer mar 31 2004
-// 
+// File Uniform01K.h
+// Author : Sylvain Gaillard
+// Last modification : Friday September 24 2004
+//
 
 /*
 Copyright or © or Copr. CNRS, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,64 +37,61 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SITECONTAINEREXCEPTIONS_H_
-#define _SITECONTAINEREXCEPTIONS_H_
+#ifndef _UNIFORM01K_H_
+#define _UNIFORM01K_H_
 
-// From STL
-#include <string>
-#include <Bpp/Exceptions.h>
+#include "RandomFactory.h"
 
 namespace bpp
 {
 
 /**
- * @brief The site not found exception base class.
+ * @brief A uniform random number generator.
  *
- * @see Exception
+ * This is a uniform generator which draw double between 0 and 1 excluding
+ * the end points.
+ * This generator is based on an algorithm described by D.E. Knuth, 1981,
+ * "Seminumerical Algorithms" 2nd ed., vol.2 of "The Art of Computer
+ * Programming" (Reading, MA: Addison-Wesley), §§3.2-3.3.
+ * 
+ * The algorithm used here is the one described in "Numerical Recipes in C".
  */
-class SiteNotFoundException:
-  public Exception
+class Uniform01K : public virtual RandomFactory
 {
-
-	protected:
-
-		/**
-		 * @brief The id of the site that was to be found.
-		 */
-		const std::string id;
-
-	public:	// Class constructor
-	
+	public: // Constructors and destructor
 		/**
-		 * @brief Build a new SiteNotFoundException object.
+		 * @brief Create a Random Number Generator.
 		 *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param sId  A the id of the site that was to be found.
+		 * @param seed The seed for the random numbers.
 		 */
-		SiteNotFoundException(const char *   text, const char * sId = "");
+		Uniform01K(long seed);
 
 		/**
-		 * @brief Build a new SiteNotFoundException object.
-		 *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param sId  A the id of the site that was to be found.
+		 * @brief Destroy the generator.
 		 */
-		SiteNotFoundException(const std::string & text, const std::string & sId = "");
-
-		// Class destructor
-		~SiteNotFoundException() throw();
+		virtual ~Uniform01K();
 
 	public:
+		/**
+		 * @brief Set the seed for a new set of random numbers.
+		 */
+		void setSeed(long seed);
 
 		/**
-		 * @brief Get the id of the site that was to be found.
-		 *
-		 * @return The id of the site that was to be found.
+		 * @brief Get a random number between 0.0 and 1.0 (exclusive of the end point values).
 		 */
-		virtual const std::string getSiteId() const;
+		double drawNumber() const;
+
+	private:
+		static const long MAXNUMBER;
+		static const long ZERO;
+		static const long MODSEED;
+		mutable long _tab[56];
+		mutable unsigned int _it1;
+		mutable unsigned int _it2;
 };
 
 } //end of namespace bpp.
 
-#endif // _SITECONTAINEREXCEPTIONS_H_
+#endif // _UNIFORM01K_H_
 
diff --git a/src/Bpp/Seq/DistanceMatrix.cpp b/src/Bpp/Numeric/Random/Uniform01QD.cpp
similarity index 77%
rename from src/Bpp/Seq/DistanceMatrix.cpp
rename to src/Bpp/Numeric/Random/Uniform01QD.cpp
index c485203..cb13fce 100644
--- a/src/Bpp/Seq/DistanceMatrix.cpp
+++ b/src/Bpp/Numeric/Random/Uniform01QD.cpp
@@ -1,13 +1,14 @@
 //
-// File: DistanceMatrix.cpp
-// Created on: Sat Feb 17 15:25 2007
+// File Uniform01QD.cpp
+// Author : Sylvain Gaillard
+// Last modification : Friday September 24 2004
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+Copyright or © or Copr. Bio++ Development TeamCNRS, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for phylogenetic data analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -36,18 +37,18 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "DistanceMatrix.h"
-
-using namespace std;
+#include "Uniform01QD.h"
 
 using namespace bpp;
 
-size_t DistanceMatrix::getNameIndex(const std::string& name) const throw (Exception)
+#include <cmath>
+
+using namespace std;
+
+double Uniform01QD::drawNumber() const
 {
-  for (size_t i = 0; i < names_.size(); ++i)
-  {
-    if (names_[i] == name) return i;
-  }
-  throw Exception("DistanceMatrix::getNameIndex. Name not found: '" + name + "'.");
+	seed_ = seed_ * 1103515245 + 12345;
+	if (seed_ < 0) seed_ = -seed_;
+	return static_cast<double>(seed_ / 2147483648.0L);
 }
 
diff --git a/src/Bpp/Seq/Io/AbstractOAlignment.h b/src/Bpp/Numeric/Random/Uniform01QD.h
similarity index 61%
rename from src/Bpp/Seq/Io/AbstractOAlignment.h
rename to src/Bpp/Numeric/Random/Uniform01QD.h
index 2991063..214f619 100644
--- a/src/Bpp/Seq/Io/AbstractOAlignment.h
+++ b/src/Bpp/Numeric/Random/Uniform01QD.h
@@ -1,14 +1,15 @@
 //
-// File: AbstractOAlignment.h
-// Created by: Julien Dutheil
-// Created on: ?
+// File Uniform01QD.h
+// Author : Sylvain Gaillard
+// Last modification : Friday September 24 2004
+//
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,50 +38,54 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _ABSTRACTOALIGNMENT_H_
-#define _ABSTRACTOALIGNMENT_H_
 
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Container/VectorSequenceContainer.h"
+#ifndef _UNIFORM01QD_H_
+#define _UNIFORM01QD_H_
 
-// From the STL:
-#include <string>
-#include <fstream>
+#include "RandomFactory.h"
 
 namespace bpp
 {
 
 /**
- * @brief Partial implementation of the OAlignment interface.
+ * @brief A quick and dirty uniform random number generator.
+ *
+ * This is a congruential uniform generator which draw double between 0 and 1 excluding
+ * the end points.
+ *
+ * WARNING!!! Only works on 32bits architectures!
  */
-class AbstractOAlignment:
-  public virtual OAlignment
+class Uniform01QD : public virtual RandomFactory
 {
+	public: // Constructors and destructor
+		/**
+		 * @brief Create a Random Number Generator.
+		 *
+		 * @param seed The seed for the random numbers.
+		 */
+		Uniform01QD(long seed): seed_(seed) {}
 
-	public: 
-		AbstractOAlignment() {}
-		virtual ~AbstractOAlignment() {}
+		/**
+		 * @brief Destroy the generator.
+		 */
+		virtual ~Uniform01QD() {}
 
 	public:
+		/**
+		 * @brief Set the seed for a new set of random numbers.
+		 */
+		void setSeed(long seed) { seed_ = seed; }
 
 		/**
-		 * @name OAlignment methods:
-		 *
-		 * @{
-		 */ 
-		void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception) = 0;
-		void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-		{
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-			writeAlignment(output, sc);
-			output.close();
-		}
-		/** @} */
+		 * @brief Get a random number between 0.0 and 1.0 (exclusive of the end point values).
+		 */
+		double drawNumber() const;
+
+	private:
+		mutable long seed_;
 };
 
 } //end of namespace bpp.
 
-#endif //_ABSTRACTOALIGNMENT_H_
+#endif // _UNIFORM01QD_H_
 
diff --git a/src/Bpp/Seq/SiteExceptions.cpp b/src/Bpp/Numeric/Random/Uniform01WH.cpp
similarity index 72%
rename from src/Bpp/Seq/SiteExceptions.cpp
rename to src/Bpp/Numeric/Random/Uniform01WH.cpp
index 4acf100..6bdb7e2 100644
--- a/src/Bpp/Seq/SiteExceptions.cpp
+++ b/src/Bpp/Numeric/Random/Uniform01WH.cpp
@@ -1,12 +1,14 @@
-// File: SiteExceptions.cpp
-// Author: Julien Dutheil
-// Created On: dim mar 7 2004
+//
+// File Uniform01WH.cpp
+// Author : Sylvain Gaillard
+// Last modification : Friday September 24 2004
+//
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. CNRS, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -35,18 +37,20 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SiteExceptions.h"
-#include "Site.h"
-#include <Bpp/Text/TextTools.h>
+#include "Uniform01WH.h"
 
 using namespace bpp;
-using namespace std;
 
-/***************************************************************************/
+#include <cmath>
+
+using namespace std;
 
-SiteException::SiteException(const std::string& text, const Site* s) :
-	Exception(text + (s != 0 ? "(" + TextTools::toString(s->getPosition()) + ")" : string(""))),
-	site_(s) {};
-    
-/***************************************************************************/
+double Uniform01WH::drawNumber() const
+{
+	double i;
+	ix = (171 * ix) % 30269;
+	iy = (172 * iy) % 30307;
+	iz = (170 * iz) % 30323;
+	return modf((double) ix / 30269. + (double) iy / 30307. + (double) iz / 30323, &i);
+}
 
diff --git a/src/Bpp/Seq/Container/SiteContainerExceptions.h b/src/Bpp/Numeric/Random/Uniform01WH.h
similarity index 56%
rename from src/Bpp/Seq/Container/SiteContainerExceptions.h
rename to src/Bpp/Numeric/Random/Uniform01WH.h
index 0d6d449..0e7bab7 100644
--- a/src/Bpp/Seq/Container/SiteContainerExceptions.h
+++ b/src/Bpp/Numeric/Random/Uniform01WH.h
@@ -1,14 +1,14 @@
 //
-// File SiteContainerExceptions.h
-// Author: Julien Dutheil
-// Created on: mer mar 31 2004
-// 
+// File Uniform01WH.h
+// Author : Sylvain Gaillard
+// Last modification : Friday September 24 2004
+//
 
 /*
 Copyright or © or Copr. CNRS, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,64 +37,61 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SITECONTAINEREXCEPTIONS_H_
-#define _SITECONTAINEREXCEPTIONS_H_
+#ifndef _UNIFORM01WH_H_
+#define _UNIFORM01WH_H_
 
-// From STL
-#include <string>
-#include <Bpp/Exceptions.h>
+#include "RandomFactory.h"
 
 namespace bpp
 {
 
 /**
- * @brief The site not found exception base class.
+ * @brief A uniform random number generator.
  *
- * @see Exception
+ * This is a congruential uniform generator which draw double between 0 and 1 excluding
+ * the end points.
+ * This generator is based on a Fortan routine from Wichmann, B. A. and Hill, I. D. (1982).
+ * "An efficient and portable pseudorandom number generator," Applied Statistics, 31, 188-190
  */
-class SiteNotFoundException:
-  public Exception
+class Uniform01WH : public virtual RandomFactory
 {
-
-	protected:
-
+	public: // Constructors and destructor
 		/**
-		 * @brief The id of the site that was to be found.
+		 * @brief Create a Random Number Generator.
+		 *
+		 * @param seed The seed for the random numbers.
 		 */
-		const std::string id;
+		Uniform01WH(long seed) : ix(seed), iy(seed), iz(seed) {}
 
-	public:	// Class constructor
-	
 		/**
-		 * @brief Build a new SiteNotFoundException object.
-		 *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param sId  A the id of the site that was to be found.
+		 * @brief Destroy the generator.
 		 */
-		SiteNotFoundException(const char *   text, const char * sId = "");
+		virtual ~Uniform01WH();
 
+	public:
 		/**
-		 * @brief Build a new SiteNotFoundException object.
-		 *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param sId  A the id of the site that was to be found.
+		 * @brief Set the seed for a new set of random numbers.
 		 */
-		SiteNotFoundException(const std::string & text, const std::string & sId = "");
+		void setSeed(long seed) { setSeeds(seed); }
 
-		// Class destructor
-		~SiteNotFoundException() throw();
-
-	public:
+		/**
+		 * @brief Set the three seeds.
+		 */
+		void setSeeds(long seed1, long seed2 = 20356, long seed3 = 35412)
+    {
+      ix = seed1; iy = seed2; iz = seed3;
+    }
 
 		/**
-		 * @brief Get the id of the site that was to be found.
-		 *
-		 * @return The id of the site that was to be found.
+		 * @brief Get a random number between 0.0 and 1.0 (exclusive of the end point values).
 		 */
-		virtual const std::string getSiteId() const;
+		double drawNumber() const;
+
+	private:
+		mutable long ix, iy, iz;
 };
 
 } //end of namespace bpp.
 
-#endif // _SITECONTAINEREXCEPTIONS_H_
+#endif // _UNIFORM01WH_H_
 
diff --git a/src/Bpp/Numeric/Range.h b/src/Bpp/Numeric/Range.h
new file mode 100644
index 0000000..109d271
--- /dev/null
+++ b/src/Bpp/Numeric/Range.h
@@ -0,0 +1,543 @@
+//
+// File: Range.h
+// Created by: Julien Dutheil
+// Created on: Mon Nov 21 15:52 2011
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _RANGE_H_
+#define _RANGE_H_
+
+#include "../Text/TextTools.h"
+#include "../Clonable.h"
+
+//From the STL:
+#include <string>
+#include <set>
+#include <algorithm>
+#include <iostream>
+#include <cstddef>
+
+namespace bpp {
+
+/**
+ * @brief The Range class, defining an interval.
+ *
+ * Methods are provided for extending the range, get union and intersection.
+ */
+template<class T> class Range:
+  public virtual Clonable
+{
+  private:
+    T begin_;
+    T end_;
+
+  public:
+    /**
+     * @brief Creates a new interval.
+     *
+     * If a > b, then the positions are swapped.
+     * If a == b, the interval is considered empty.
+     * Coordinates are 0-based and of type [a, b[,
+     * so that the length of the interval is computed as
+     * b - a.
+     *
+     * @param a First position
+     * @param b Second position
+     */
+    Range(const T& a = 0, const T& b = 0):
+      begin_(std::min(a, b)),
+      end_(std::max(a, b))
+    {}
+
+    Range(const Range<T>& range): begin_(range.begin_), end_(range.end_) {}
+    
+    Range<T>& operator=(const Range<T>& range) {
+      begin_ = range.begin_;
+      end_   = range.end_;
+      return *this;
+    }
+
+    Range<T>* clone() const { return new Range<T>(*this); }
+
+    virtual ~Range() {}
+
+  public:
+    bool operator==(const Range<T>& r) const {
+      return begin_ == r.begin_ && end_ == r.end_;
+    }
+    bool operator!=(const Range<T>& r) const {
+      return begin_ != r.begin_ || end_ != r.end_;
+    }
+    bool operator<(const Range<T>& r) const {
+      return begin_ < r.begin_ || end_ < r.end_;
+    }
+    virtual Range& operator+=(const T& val) {
+      begin_ += val;
+      end_ += val;
+      return *this;
+    }
+    virtual Range operator+(const T& val) {
+      return Range<T>(*this) += val;
+    }
+    virtual Range& operator-=(const T& val) {
+      begin_ -= val;
+      end_ -= val;
+      return *this;
+    }
+    virtual Range operator-(const T& val) {
+      return Range<T>(*this) -= val;
+    }
+
+    T begin() const { return begin_; }
+    
+    T end() const { return end_; }
+    
+    T length() const { return end_ - begin_; }
+
+    /**
+     * @param r Range to compare with.
+     * @return True if the two intervals overlap.
+     */
+    bool overlap(const Range& r) const
+    {
+      return (r.begin_ < end_ && r.end_ > begin_);
+    }
+
+    /**
+     * @param r Range to compare with.
+     * @return True if the two intervals are contiguous (i.e. the two intervals
+     * are adjacent and share one bound).
+     */
+    bool isContiguous(const Range& r) const
+    {
+      return (r.begin_ == end_ || r.end_ == begin_);
+    }
+
+    /**
+     * @param r Range to compare with.
+     * @return True if the given interval is included in the instanciated one.
+     */
+    bool contains(const Range& r) const
+    {
+      return (r.begin_ >= begin_ && r.end_ <= end_);
+    }
+
+    /**
+     * @brief Expand the current interval with the given one.
+     *
+     * If the two intervals do not overlap, then the interval is not modified.
+     * @param r input interval.
+     */
+    void expandWith(const Range& r)
+    {
+      if (r.begin_ < begin_ && r.end_ >= begin_)
+        begin_ = r.begin_;
+      if (r.end_ > end_ && r.begin_ <= end_)
+        end_ = r.end_;
+    }
+
+    /**
+     * @brief Restrict the current interval to the intersection with the given one.
+     *
+     * If the two intervals do not overlap, then the interval is set to empty.
+     * @param r input interval.
+     */
+    void sliceWith(const Range& r)
+    {
+      if (!overlap(r)) {
+        begin_ = 0;
+        end_   = 0;
+      } else {
+        if (r.begin_ > begin_ && r.begin_ <= end_)
+          begin_ = r.begin_;
+        if (r.end_ < end_ && r.end_ >= begin_)
+          end_ = r.end_;
+      }
+    }
+
+    /**
+     * @return True if then begining position equals the ending one.
+     */
+    bool isEmpty() const { return begin_ == end_; }
+
+    /**
+     * @return A string describing the range.
+     */
+    std::string toString() const {
+      return ("[" + TextTools::toString(begin_) + "," + TextTools::toString(end_) + "[");
+    }
+
+};
+
+/**
+ * @brief Interface discribing a collection of Range objects.
+ */
+template<class T> class RangeCollection {
+  public:
+    virtual ~RangeCollection() {}
+    /**
+     * @brief Add a new range to the collection.
+     *
+     * @param r The range to add to the collection.
+     */
+    virtual void addRange(const Range<T>& r) = 0;
+
+    /**
+     * @brief Get the intersection with a given range.
+     *
+     * The new multirange is the union of all ranges intersections with the given range.
+     *
+     * @param r Restriction range.
+     */
+    virtual void restrictTo(const Range<T>& r) = 0;
+
+    /**
+     * @brief Only keep the ranges that fall within the given range.
+     *
+     * @param r Restriction range.
+     */
+    virtual void filterWithin(const Range<T>& r) = 0;
+
+    /**
+     * @return A string representation of the set of intervals.
+     */
+    virtual std::string toString() const = 0;
+
+    /**
+     * @return True if the set does not contain any range.
+     */
+    virtual bool isEmpty() const = 0;
+
+    /**
+     * @return The number of ranges in the collection.
+     */
+    virtual size_t size() const = 0;
+
+    /**
+     * @return The number of positions in the collection.
+     */
+    virtual size_t totalLength() const = 0;
+
+    /**
+     * @return The ith range in the collection.
+     */
+    virtual const Range<T>& getRange(size_t i) const = 0;
+
+    /**
+     * @brief Clear the collection.
+     */
+    virtual void clear() = 0;
+};
+
+/**
+ * @brief A special class used inside RangeCollection.
+ */
+template<class T> class rangeComp_ {
+  public:
+    bool operator() (const Range<T>* a, const Range<T>* b) const {
+      return ((*a) < (*b));
+    }
+};
+
+/**
+ * @brief This class implements a data structure describing a set of intervales.
+ *
+ * Intervales can be overlapping, but empty intervales will be ignored/removed.
+ */
+template<class T> class RangeSet:
+  public RangeCollection<T>
+{
+  public:
+
+  private:
+    std::set< Range<T>*, rangeComp_<T> > ranges_;
+
+  public:
+    RangeSet(): ranges_() {}
+
+    RangeSet(const RangeSet<T>& set): ranges_()
+    {
+      for (typename std::set< Range<T>* >::iterator it = set.ranges_.begin(); it != set.ranges_.end(); ++it) {
+        ranges_.insert(ranges_.end(), (**it).clone());
+      }
+    }
+
+    RangeSet& operator=(const RangeSet<T>& set)
+    {
+      clear_();
+      for (typename std::set< Range<T>* >::iterator it = set.ranges_.begin(); it != set.ranges_.end(); ++it) {
+        ranges_.insert(ranges_.end(), (**it).clone());
+      }
+      return *this;
+    }
+
+    virtual ~RangeSet() {
+      clear_();
+    }
+
+  public:
+    void addRange(const Range<T>& r) {
+      if (!r.isEmpty())
+        ranges_.insert(r.clone());
+    }
+
+    void restrictTo(const Range<T>& r) {
+      typename std::set< Range<T>* >::iterator it = ranges_.begin();
+      while (it != ranges_.end()) {
+        (**it).sliceWith(r);
+        if ((**it).isEmpty()) {
+          typename std::set< Range<T>* >::iterator it2 = it;
+          delete *it;
+          ++it;
+          ranges_.erase(it2);
+        } else {
+          ++it;
+        }
+      }
+    }
+
+    void filterWithin(const Range<T>& r) {
+      typename std::set< Range<T>* >::iterator it = ranges_.begin();
+      while (it != ranges_.end()) {
+        if (r.contains(**it)) {
+          ++it;
+        } else {
+          typename std::set< Range<T>* >::iterator it2 = it;
+          delete *it;
+          ++it;
+          ranges_.erase(it2);
+        }
+      }
+    }
+    
+    std::string toString() const {
+      std::string s = "{ ";
+      for (typename std::set< Range<T>* >::const_iterator it = ranges_.begin(); it != ranges_.end(); ++it) {
+        s += (**it).toString() + " ";
+      }
+      s += "}";
+      return s;
+    }
+
+    bool isEmpty() const { return ranges_.size() == 0; }
+    
+    size_t size() const { return ranges_.size(); }
+    
+    /**
+     * @return The total length of the range set. Overlapping positions will be counted several times.
+     */
+    size_t totalLength() const {
+      size_t tot = 0;
+      for (typename std::set< Range<T>* >::const_iterator it = ranges_.begin(); it != ranges_.end(); ++it) {
+        tot += (**it).length();
+      }
+      return tot;
+    }
+
+    const Range<T>& getRange(size_t i) const {
+      typename std::set< Range<T>* >::const_iterator it = ranges_.begin();
+      for (size_t c = 0; c < i; ++c)
+        ++it;
+        //it = it++;
+      return **it;
+    }
+    
+    const std::set< Range<T>*, rangeComp_<T> >& getSet() const { return ranges_; }
+
+    std::set< Range<T>*, rangeComp_<T> >& getSet() { return ranges_; }
+
+    void clear() {
+      clear_();
+    }
+
+  private:
+    void clear_() {
+      for (typename std::set< Range<T>* >::const_iterator it = ranges_.begin(); it != ranges_.end(); ++it) {
+        delete *it;
+      }
+      ranges_.clear();
+    }
+};
+
+/**
+ * @brief This class implements a data structure describing a set of non-overlapping intervales.
+ */
+template<class T> class MultiRange:
+  public RangeCollection<T>
+{
+  private:
+    std::vector<Range<T>*> ranges_;
+
+  public:
+    MultiRange(): ranges_() {}
+
+    MultiRange(const MultiRange<T>& mr): ranges_()
+    {
+      for (size_t i = 0; i < mr.ranges_.size(); ++i)
+        ranges_.push_back(mr.ranges_[i]->clone());
+    }
+
+    MultiRange& operator=(const MultiRange<T>& mr)
+    {
+      clear_();
+      for (size_t i = 0; i < mr.ranges_.size(); ++i)
+        ranges_.push_back(mr.ranges_[i]->clone());
+      return *this;
+    }
+
+    virtual ~MultiRange() {
+      clear_();
+    }
+
+
+  public:
+    void addRange(const Range<T>& r) {
+      //this is a bit tricky, as many cases can happen. we have to check how many ranges overlap with the new one:
+      std::vector<size_t> overlappingPositions;
+      for (size_t i = 0; i < ranges_.size(); ++i) {
+        if (ranges_[i]->overlap(r))
+          overlappingPositions.push_back(i);
+      }
+      //check if not overlap:
+      if (overlappingPositions.size() == 0) {
+        //We simply add the new range to the list:
+        ranges_.push_back(r.clone());
+      } else {
+        //We extend the first overlapping element:
+        ranges_[overlappingPositions[0]]->expandWith(r);
+        //Now we merge all other overlapping ranges, if any:
+        for (size_t i = overlappingPositions.size() - 1; i > 0; --i) {
+          //Expand first range:
+          ranges_[overlappingPositions[0]]->expandWith(*ranges_[overlappingPositions[i]]);
+          //Then removes this range:
+          delete ranges_[overlappingPositions[i]];
+          ranges_.erase(ranges_.begin() + static_cast<ptrdiff_t>(overlappingPositions[i]));
+        }
+      }
+      clean_();
+    }
+
+    void restrictTo(const Range<T>& r) {
+      for (size_t i = 0; i < ranges_.size(); ++i)
+        ranges_[i]->sliceWith(r);
+      clean_();
+    }
+
+    void filterWithin(const Range<T>& r) {
+      typename std::vector< Range<T>* >::iterator it = ranges_.begin();
+      while (it != ranges_.end()) {
+        if (r.contains(**it)) {
+          ++it;
+        } else {
+          delete *it;
+          it = ranges_.erase(it);
+        }
+      }
+    }
+ 
+    /**
+     * @return A string representation of the set of intervals.
+     */
+    std::string toString() const {
+      std::string s = "{ ";
+      for (size_t i = 0; i < ranges_.size(); ++i)
+        s += ranges_[i]->toString() + " ";
+      s += "}";
+      return s;
+    }
+
+    /**
+     * @return A vector with all interval bounds.
+     */
+    std::vector<T> getBounds() const {
+      std::vector<T> bounds;
+      for (size_t i = 0; i < ranges_.size(); ++i) {
+        bounds.push_back(ranges_[i]->begin());
+        bounds.push_back(ranges_[i]->end());
+      }
+      return bounds;
+    }
+
+    /**
+     * @return True if the set does not contain any range.
+     */
+    bool isEmpty() const { return ranges_.size() == 0; }
+
+    size_t size() const { return ranges_.size(); }
+
+    size_t totalLength() const {
+      size_t tot = 0;
+      for (typename std::vector< Range<T>* >::const_iterator it = ranges_.begin(); it != ranges_.end(); ++it) {
+        tot += (**it).length();
+      }
+      return tot;
+    }
+
+    const Range<T>& getRange(size_t i) const { return *ranges_[i]; }
+
+    void clear() {
+      clear_();
+    }
+
+  private:
+    void clean_() {
+      //Reorder
+      rangeComp_<T> comp;
+      std::sort(ranges_.begin(), ranges_.end(), comp);
+      //Remove empty intervals:
+      typename std::vector< Range<T>* >::iterator it = ranges_.begin();
+      while (it != ranges_.end()) {
+        if ((**it).isEmpty()) {
+          delete *it;
+          it = ranges_.erase(it);
+        } else {
+          ++it;
+        }
+      }
+    }
+  private:
+    void clear_() {
+      for (size_t i = 0; i < ranges_.size(); ++i) {
+        delete ranges_[i];
+      }
+      ranges_.clear();
+    }
+
+};
+
+} //end of namespace bpp
+
+#endif //_RANGE_H_
diff --git a/src/Bpp/Numeric/Stat/ContingencyTableTest.cpp b/src/Bpp/Numeric/Stat/ContingencyTableTest.cpp
new file mode 100644
index 0000000..f70d6ae
--- /dev/null
+++ b/src/Bpp/Numeric/Stat/ContingencyTableTest.cpp
@@ -0,0 +1,129 @@
+//
+// File: ContingencyTableTest.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Dec 09 14:20 2010
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "ContingencyTableTest.h"
+#include "../Random/ContingencyTableGenerator.h"
+
+#include "../../App/ApplicationTools.h"
+#include "../VectorTools.h"
+#include "../Random/RandomTools.h"
+
+#include <iostream>
+#include <algorithm>
+
+using namespace bpp;
+using namespace std;
+
+ContingencyTableTest::ContingencyTableTest(const std::vector< std::vector<size_t> >& table, unsigned int nbPermutations, bool warn):
+  statistic_(0),
+  pvalue_(0),
+  df_(0),
+  margin1_(table.size()),
+  margin2_(0)
+{
+  //Compute marginals:
+  size_t n = table.size();
+  if (n < 2)
+    throw Exception("ContingencyTableTest. Table size should be at least 2x2!");
+  size_t m = table[0].size();
+  if (m < 2)
+    throw Exception("ContingencyTableTest. Table size should be at least 2x2!");
+  margin2_.resize(m);
+  for (size_t j = 0; j < m; ++j)
+    margin2_[j] = 0;
+  bool test = false;
+  for (size_t i = 0; i < n; ++i) {
+    if (table[i].size() != m)
+      throw Exception("ContingencyTableTest. Input array has non-homogeneous dimensions!");
+    for (size_t j = 0; j < m; ++j) {
+      size_t c = table[i][j];
+      if (c <= 5) test = true;
+      margin1_[i] += c;
+      margin2_[j] += c;
+    }
+  }
+  for (size_t i = 0; i < n; ++i)
+    if (margin1_[i] == 0)
+      throw Exception("ContingencyTableTest. Row " + TextTools::toString(i) + " sums to 0.");
+  for (size_t j = 0; j < m; ++j)
+    if (margin2_[j] == 0)
+      throw Exception("ContingencyTableTest. Column " + TextTools::toString(j) + " sums to 0.");
+
+
+  size_t tot = VectorTools::sum(margin1_);
+  df_ = static_cast<double>((m - 1) * (n - 1));
+  
+  RowMatrix<long double> expc(n, m);
+  for (size_t i = 0; i < n; ++i) {
+    for (size_t j = 0; j < m; ++j) {
+      long double c = table[i][j];
+      long double e = static_cast<long double>(margin1_[i] * margin2_[j]) / static_cast<long double>(tot);
+      expc(i, j) = e;
+      statistic_ += static_cast<double>(std::pow(c - e, 2.L) / e);
+    }
+  }
+
+  if (nbPermutations > 0) {
+    size_t count = 0;
+    ContingencyTableGenerator ctgen(margin1_, margin2_);
+    for (unsigned int k = 0; k < nbPermutations; ++k) {
+      //Randomize:
+      RowMatrix<size_t> table_rep = ctgen.rcont2();
+      //Recompute statistic:
+      double stat_rep = 0;
+      for (size_t i = 0; i < n; ++i) {
+        for (size_t j = 0; j < m; ++j) {
+          long double c = table_rep(i , j);
+          long double e = expc(i, j);
+          stat_rep += static_cast<double>(std::pow(c - e, 2.L) / e);
+        }
+      }
+      if (stat_rep >= statistic_)
+        count++;
+    }
+    pvalue_ = static_cast<double>(count + 1) / static_cast<double>(nbPermutations + 1);
+  } else {
+    if (test && warn)
+      ApplicationTools::displayWarning("Unsufficient observations, p-value might be incorrect.");
+
+    //Compute p-value:
+    pvalue_ = 1. - RandomTools::pChisq(statistic_, df_);
+  }
+}
+
diff --git a/src/Bpp/Seq/SequenceIterator.h b/src/Bpp/Numeric/Stat/ContingencyTableTest.h
similarity index 51%
rename from src/Bpp/Seq/SequenceIterator.h
rename to src/Bpp/Numeric/Stat/ContingencyTableTest.h
index 2e6d1f4..a545023 100644
--- a/src/Bpp/Seq/SequenceIterator.h
+++ b/src/Bpp/Numeric/Stat/ContingencyTableTest.h
@@ -1,14 +1,14 @@
 //
-// File: SequenceIterator.h
+// File: ContingencyTableTest.h
 // Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:27 2013
+// Created on: Thu Dec 09 14:20 2010
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,72 +37,57 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SEQUENCEITERATOR_H_
-#define _SEQUENCEITERATOR_H_
+#ifndef _CONTINGENCYTABLETEST_H_
+#define _CONTINGENCYTABLETEST_H_
 
-#include "Sequence.h"
-#include "SequenceWithQuality.h"
+#include "StatTest.h"
 
-namespace bpp
-{
-
-/**
- * @brief Generic sequence iterator interface, allowing to loop over sequences.
- */
-class SequenceIterator
-{
-	public:
-		SequenceIterator() {}
-		virtual ~SequenceIterator() {}
-	
-	public:
-		virtual Sequence* nextSequence() = 0;
-		virtual bool hasMoreSequences() const = 0;
-};
+//From the STL:
+#include <vector>
 
-/**
- * @brief Generic const sequence iterator interface, allowing to loop over const sequences.
- */
-class ConstSequenceIterator
+namespace bpp
 {
-	public:
-		ConstSequenceIterator() {}
-		virtual ~ConstSequenceIterator() {}
-	
-	public:
-		virtual const Sequence* nextSequence() = 0;
-		virtual bool hasMoreSequences() const = 0;
-};
 
 /**
- * @brief Generic sequence iterator interface, allowing to loop over sequences with quality scores.
+ * @brief Implements tests on contingency tables.
+ *
+ * Performs a chi square test on contingency tables.
  */
-class SequenceWithQualityIterator:
-  public virtual SequenceIterator
+class ContingencyTableTest:
+  public virtual StatTest
 {
-	public:
-		SequenceWithQualityIterator() {}
-		virtual ~SequenceWithQualityIterator() {}
-	
-	public:
-		virtual SequenceWithQuality* nextSequence() = 0;
-};
+  private:
+    double statistic_;
+    double pvalue_;
+    double df_;
+    std::vector<size_t> margin1_;
+    std::vector<size_t> margin2_;
+
+  public:
+    /**
+     * @brief Build a new test object and perform computations.
+     *
+     * @param table The input contingency table.
+     * @param nbPermutations If greater than 0, performs a randomization test instead of using the chisquare approximation.
+     * @param warn Should a warning message be displayed in case of unsufficient observations?
+     */
+    ContingencyTableTest(const std::vector< std::vector<size_t> >& table, unsigned int nbPermutations = 0, bool warn = true);
+    virtual ~ContingencyTableTest() {}
+
+    ContingencyTableTest* clone() const { return new ContingencyTableTest(*this); }
+
+  public:
+    std::string getName() const { return "Test on contingency table."; }
+    double getStatistic() const { return statistic_; }
+    double getPValue() const { return pvalue_; }
+    double getDegreesOfFreedom() const { return df_; }
+    const std::vector<size_t> getMarginRows() const { return margin1_; }
+    const std::vector<size_t> getMarginColumns() const { return margin2_; }
 
-/**
- * @brief Generic const sequence iterator interface, allowing to loop over const sequences with quality scores.
- */
-class ConstSequenceWithQualityIterator:
-  public virtual ConstSequenceIterator
-{
-	public:
-		ConstSequenceWithQualityIterator() {}
-		virtual ~ConstSequenceWithQualityIterator() {}
-	
-	public:
-		virtual const SequenceWithQuality* nextSequence() = 0;
 };
 
 } //end of namespace bpp.
 
-#endif	//_SEQUENCEITERATOR_H_
+#endif //_CONTINGENCYTABLETEST_H_
+
 
diff --git a/src/Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.cpp b/src/Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.cpp
new file mode 100644
index 0000000..83db931
--- /dev/null
+++ b/src/Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.cpp
@@ -0,0 +1,114 @@
+//
+// File: CorrespondenceAnalysis.cpp
+// Created by: Mathieu Groussin
+// Created on: Sun Mar 06 10:03 2011
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "CorrespondenceAnalysis.h"
+#include "../../Matrix/Matrix.h"
+#include "../../Matrix/MatrixTools.h"
+#include "DualityDiagram.h"
+
+using namespace bpp;
+using namespace std;
+
+CorrespondenceAnalysis::CorrespondenceAnalysis(
+  const Matrix<double>& data,
+  unsigned int nbAxes,
+  double tol, bool verbose) throw (Exception) :
+  DualityDiagram(),
+  n_()
+{
+  size_t nRow = data.getNumberOfRows();
+  size_t nCol = data.getNumberOfColumns();
+
+  double tmp = 0.;
+  for (size_t i = 0; i < nRow; i++)
+  {
+    for (unsigned int j = 0; j < nCol; j++)
+    {
+      if (data(i, j) < 0.)
+        throw Exception("CorrespondenceAnalysis (constructor). Negative value(s) in the input data. This is not allowed !");
+      tmp += data(i, j);
+    }
+  }
+  n_ = tmp;
+
+  if (n_ == 0)
+    throw Exception("CorrespondenceAnalysis (constructor). All frequencies in the input data are zero...");
+
+  RowMatrix<double> dataTmp(data);
+  MatrixTools::scale(dataTmp, (1. / n_), 0.);
+
+  vector<double> rowWeights(nRow);
+  vector<double> colWeights(nCol);
+
+  for (size_t i = 0; i < nRow; i++)
+  {
+    for (unsigned int j = 0; j < nCol; j++)
+    {
+      rowWeights[i] += dataTmp(i, j);
+      colWeights[j] += dataTmp(i, j);
+    }
+  }
+
+  vector<double> tmpRowWeigths(nRow);
+  vector<double> tmpColWeigths(nCol);
+  for (size_t i = 0; i < rowWeights.size(); i++)
+  {
+    if (rowWeights[i] == 0.)
+      tmpRowWeigths[i] = 0.;
+    else
+      tmpRowWeigths[i] = 1. / rowWeights[i];
+  }
+  for (size_t j = 0; j < colWeights.size(); j++)
+  {
+    if (colWeights[j] == 0.)
+      tmpColWeigths[j] = 0.;
+    else
+      tmpColWeigths[j] = 1. / colWeights[j];
+  }
+
+  RowMatrix<double> tmpWeightedData(nRow, nCol);
+  RowMatrix<double> weightedData(nRow, nCol);
+  MatrixTools::hadamardMult(dataTmp, tmpRowWeigths, tmpWeightedData, true);
+  MatrixTools::hadamardMult(tmpWeightedData, tmpColWeigths, weightedData, false);
+  MatrixTools::scale(weightedData, 1., -1.);
+
+  setData(weightedData, rowWeights, colWeights, nbAxes, tol, verbose);
+}
+
+
diff --git a/src/Bpp/Seq/AlphabetIndex/BLOSUM50.h b/src/Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.h
similarity index 52%
rename from src/Bpp/Seq/AlphabetIndex/BLOSUM50.h
rename to src/Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.h
index ccded85..8b2d205 100644
--- a/src/Bpp/Seq/AlphabetIndex/BLOSUM50.h
+++ b/src/Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.h
@@ -1,14 +1,14 @@
 //
-// File: BLOSUM50.h
-// Created by: Julien Dutheil
-// Created on: Tue Jan 18 10:28 2007
+// File: CorrespondenceAnalysis.h
+// Created by: Mathieu Groussin
+// Created on: Sun Mar 06 10:03 2011
 //
 
 /*
    Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
+   This software is a computer program whose purpose is to provide basal and
+   utilitary classes. This file belongs to the Bio++ Project.
 
    This software is governed by the CeCILL  license under French law and
    abiding by the rules of distribution of free software.  You can  use,
@@ -37,69 +37,56 @@
    knowledge of the CeCILL license and that you accept its terms.
  */
 
-#ifndef _BLOSUM50_H_
-#define _BLOSUM50_H_
 
-// from the STL:
-#include <string>
+#ifndef _CORRESPONDENCEANALYSIS_H_
+#define _CORRESPONDENCEANALYSIS_H_
 
-#include "AlphabetIndex2.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
+#include "../../Matrix/Matrix.h"
+#include "DualityDiagram.h"
 
 namespace bpp
 {
+
 /**
- * @brief BLOSUM 50 Substitution Matrix.
+ * @brief This class allows to perform a correspondence analysis.
  *
- * Reference:
- * Henikoff, S. and Henikoff, J.G.
- * Amino acid substitution matrices from protein blocks
- * Proc. Natl. Acad. Sci. USA 89, 10915-10919 (1992)
+ * All values in the input table have to be non-negative.
+ * The DualityDiagram class, core class of a multivariate analysis, is called internally.
  *
- * Data from AAIndex2 database, Accession Number HENS920104.
+ * The code of this class is deeply inspired from the R code of the dudi.coa function available in the ade4 package.
  */
-class BLOSUM50 :
-  public virtual AlphabetIndex2
+
+class CorrespondenceAnalysis:
+  public DualityDiagram
 {
 private:
-  LinearMatrix<double> distanceMatrix_;
-  const ProteicAlphabet* alpha_;
+  double n_;
 
 public:
-  BLOSUM50();
-
-  BLOSUM50(const BLOSUM50& blosum) :
-    distanceMatrix_(blosum.distanceMatrix_),
-    alpha_(blosum.alpha_)
-  {}
+/**
+ * @brief Build a new CorrespondenceAnalysis object.
+ *
+ * @param data The input data (a RowMatrix) to analyse.
+ * @param nbAxes The number of kept axes during the analysis.
+ * @param tol Tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)
+ * @param verbose Should warnings be dispayed.
+ * @throw Exception if an error occured.
+ */
+  CorrespondenceAnalysis(
+    const Matrix<double>& data,
+    unsigned int nbAxes,
+    double tol = 0.0000001,
+    bool verbose = true)
+  throw (Exception);
 
-  BLOSUM50& operator=(const BLOSUM50& blosum)
-  {
-    distanceMatrix_ = blosum.distanceMatrix_;
-    alpha_ = blosum.alpha_;
-    return *this;
-  }
+  virtual ~CorrespondenceAnalysis() {}
 
-  virtual ~BLOSUM50() {}
+  CorrespondenceAnalysis* clone() const { return new CorrespondenceAnalysis(*this); }
 
 public:
-  /**
-   * @name Methods from the AlphabetIndex2 interface.
-   *
-   * @{
-   */
-  double getIndex(int state1, int state2) const throw (BadIntException);
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException);
-  const Alphabet* getAlphabet() const { return alpha_; }
-  BLOSUM50* clone() const { return new BLOSUM50(); }
-  LinearMatrix<double>* getIndexMatrix() const;
-  bool isSymmetric() const { return true; }
-  /** @} */
+  double getSumOfAllValues() const throw (Exception) { return n_; }
 };
 } // end of namespace bpp.
 
-#endif // _BLOSUM50_H_
+#endif  // _CORRESPONDENCEANALYSIS_H_
 
diff --git a/src/Bpp/Numeric/Stat/Mva/DualityDiagram.cpp b/src/Bpp/Numeric/Stat/Mva/DualityDiagram.cpp
new file mode 100644
index 0000000..0971a8a
--- /dev/null
+++ b/src/Bpp/Numeric/Stat/Mva/DualityDiagram.cpp
@@ -0,0 +1,291 @@
+//
+// File: DualityDiagram.cpp
+// Created by: Mathieu Groussin
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Tools, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "DualityDiagram.h"
+#include "../../Matrix/Matrix.h"
+#include "../../Matrix/MatrixTools.h"
+#include "../../Matrix/EigenValue.h"
+#include "../../../App/ApplicationTools.h"
+
+#include <cmath>
+
+using namespace bpp;
+using namespace std;
+
+DualityDiagram::DualityDiagram(
+  const Matrix<double>& matrix,
+  const vector<double>& rowWeights,
+  const vector<double>& colWeights,
+  unsigned int nbAxes,
+  double tol, bool verbose) throw (Exception) :
+  rowWeights_(rowWeights),
+  colWeights_(colWeights),
+  nbAxes_(nbAxes),
+  eigenValues_(),
+  eigenVectors_(),
+  rowCoord_(),
+  colCoord_(),
+  ppalAxes_(),
+  ppalComponents_()
+{
+  check_(matrix, rowWeights, colWeights, verbose);
+  compute_(matrix, tol, verbose);
+}
+
+void DualityDiagram::check_(
+  const Matrix<double>& matrix,
+  const vector<double>& rowWeights,
+  const vector<double>& colWeights,
+  unsigned int nbAxes) throw (Exception)
+{
+  size_t rowNb = matrix.getNumberOfRows();
+  size_t colNb = matrix.getNumberOfColumns();
+
+  if (rowWeights.size() != rowNb)
+    throw Exception("DualityDiagram::check_. The number of row weigths has to be equal to the number of rows!");
+  if (colWeights.size() != colNb)
+    throw Exception("DualityDiagram::check_. The number of column weigths has to be equal to the number of columns!");
+
+  // All row weigths have to be positive
+  for (vector<double>::const_iterator it = rowWeights.begin(); it != rowWeights.end(); it++)
+  {
+    if (*it < 0.)
+      throw Exception("DualityDiagram::check_. All row weights have to be positive");
+  }
+
+  // All column weigths have to be positive
+  for (vector<double>::const_iterator it = colWeights.begin(); it != colWeights.end(); it++)
+  {
+    if (*it < 0.)
+      throw Exception("DualityDiagram::check_. All column weights have to be positive");
+  }
+}
+
+
+void DualityDiagram::setData(
+  const Matrix<double>& matrix,
+  const vector<double>& rowWeights,
+  const vector<double>& colWeights,
+  unsigned int nbAxes,
+  double tol, bool verbose) throw (Exception)
+{
+  check_(matrix, rowWeights, colWeights, verbose);
+  rowWeights_ = rowWeights;
+  colWeights_ = colWeights;
+  nbAxes_     = nbAxes;
+  compute_(matrix, tol, verbose);
+}
+
+void DualityDiagram::compute_(const Matrix<double>& matrix,
+    double tol, bool verbose)
+{
+  size_t rowNb = matrix.getNumberOfRows();
+  size_t colNb = matrix.getNumberOfColumns();
+  
+  // If there are less rows than columns, the variance-covariance or correlation matrix is obtain differently (see below)
+  bool transpose = (rowNb < colNb);
+
+  // The initial matrix is multiplied by the square root of the row weigths.
+  vector<double> rW(rowWeights_);
+  for (unsigned int i = 0; i < rowWeights_.size(); i++)
+  {
+    rW[i] = sqrt(rowWeights_[i]);
+  }
+
+  RowMatrix<double> M1(rowNb, colNb);
+  MatrixTools::hadamardMult(matrix, rW, M1, true);
+
+  // The resulting matrix is then multiplied by the square root of the column weigths.
+  vector<double> cW(colWeights_);
+  for (unsigned int i = 0; i < colWeights_.size(); i++)
+  {
+    cW[i] = sqrt(colWeights_[i]);
+  }
+
+  RowMatrix<double> M2;
+  MatrixTools::hadamardMult(M1, cW, M2, false);
+
+  // The variance-covariance (if the data is centered) or the correlation (if the data is centered and normalized) matrix is calculated
+  RowMatrix<double> tM2;
+  MatrixTools::transpose(M2, tM2);
+  RowMatrix<double> M3;
+  if (!transpose)
+    MatrixTools::mult(tM2, M2, M3);
+  else
+    MatrixTools::mult(M2, tM2, M3);
+	
+  EigenValue<double> eigen(M3);
+  if (!eigen.isSymmetric())
+    throw Exception("DualityDiagram (constructor). The variance-covariance or correlation matrix should be symmetric...");
+
+  eigenValues_ = eigen.getRealEigenValues();
+  eigenVectors_ = eigen.getV();
+
+  // How many significant axes have to be conserved?
+  size_t rank = 0;
+  for (size_t i = eigenValues_.size(); i > 0; i--)
+  {
+    if ((eigenValues_[i - 1] / eigenValues_[eigenValues_.size() - 1]) > tol)
+      rank++;
+  }
+
+  if (nbAxes_ <=0)
+  {
+    throw Exception("DualityDiagram (constructor). The number of axes to keep must be positive.");
+  }
+  if (nbAxes_ > rank)
+  {
+    if (verbose)
+      ApplicationTools::displayWarning("The number of axes to kept has been reduced to conserve only significant axes");
+    nbAxes_ = rank;
+  }
+
+  /*The eigen values are initially sorted into ascending order by the 'eigen' function. Here the significant values are sorted
+     in the other way around.*/
+  vector<double> tmpEigenValues(nbAxes_);
+  size_t cpt = 0;
+  for (size_t i = eigenValues_.size(); i > (eigenValues_.size() - nbAxes_); i--)
+  {
+    tmpEigenValues[cpt] = eigenValues_[i-1];
+    cpt++;
+  }
+  eigenValues_ = tmpEigenValues;
+
+  for (vector<double>::iterator it = rowWeights_.begin(); it != rowWeights_.end(); it++)
+  {
+    if (*it == 0.)
+      *it = 1.;
+  }
+
+  for (vector<double>::iterator it = colWeights_.begin(); it != colWeights_.end(); it++)
+  {
+    if (*it == 0.)
+      *it = 1.;
+  }
+
+  vector<double> dval(nbAxes_);
+  for (size_t i = 0; i < dval.size(); i++)
+  {
+    dval[i] = sqrt(eigenValues_[i]);
+  }
+
+  vector<double> invDval(nbAxes_);
+  for (size_t i = 0; i < invDval.size(); i++)
+  {
+    invDval[i] = 1. / sqrt(eigenValues_[i]);
+  }
+
+  // Calculation of the row and column coordinates as well as the principal axes and components:
+  if (!transpose)
+  {
+    vector<double> tmpColWeights(colNb);
+    for (unsigned int i = 0; i < colWeights_.size(); i++)
+    {
+      tmpColWeights[i] = 1. / sqrt(colWeights_[i]);
+    }
+
+    // The eigen vectors are placed in the same order as their corresponding eigen value in eigenValues_.
+    RowMatrix<double> tmpEigenVectors;
+    tmpEigenVectors.resize(eigenVectors_.getNumberOfRows(), nbAxes_);
+    size_t cpt2 = 0;
+    for (size_t i = eigenVectors_.getNumberOfColumns(); i > (eigenVectors_.getNumberOfColumns() - nbAxes_); i--)
+    {
+      for (unsigned int j = 0; j < eigenVectors_.getNumberOfRows(); j++)
+      {
+        tmpEigenVectors(j, cpt2) = eigenVectors_(j, i-1);
+      }
+      cpt2++;
+    }
+	  
+    // matrix of principal axes
+    MatrixTools::hadamardMult(tmpEigenVectors, tmpColWeights, ppalAxes_, true);
+    // matrix of row coordinates
+    RowMatrix<double> tmpRowCoord_;
+    tmpRowCoord_.resize(rowNb, nbAxes_);
+    MatrixTools::hadamardMult(matrix, colWeights_, tmpRowCoord_, false);
+    MatrixTools::mult(tmpRowCoord_, ppalAxes_, rowCoord_);
+
+    // matrix of column coordinates
+    MatrixTools::hadamardMult(ppalAxes_, dval, colCoord_, false);
+    // matrix of principal components
+    MatrixTools::hadamardMult(rowCoord_, invDval, ppalComponents_, false);
+  }
+  else
+  {
+    vector<double> tmpRowWeights(rowNb);
+    for (unsigned int i = 0; i < rowWeights_.size(); i++)
+    {
+      tmpRowWeights[i] = 1. / sqrt(rowWeights_[i]);
+    }
+
+    // The eigen vectors are placed in the same order as their corresponding eigen value in eigenValues_.
+    RowMatrix<double> tmpEigenVectors;
+    tmpEigenVectors.resize(eigenVectors_.getNumberOfRows(), nbAxes_);
+    size_t cpt2 = 0;
+    for (size_t i = eigenVectors_.getNumberOfColumns(); i > (eigenVectors_.getNumberOfColumns() - nbAxes_); i--)
+    {
+      for (size_t j = 0; j < eigenVectors_.getNumberOfRows(); j++)
+      {
+        tmpEigenVectors(j, cpt2) = eigenVectors_(j, i-1);
+      }
+      cpt2++;
+    }
+
+    // matrix of principal components
+    MatrixTools::hadamardMult(tmpEigenVectors, tmpRowWeights, ppalComponents_, true);
+    // matrix of column coordinates
+    RowMatrix<double> tmpColCoord_;
+    tmpColCoord_.resize(colNb, nbAxes_);
+    MatrixTools::hadamardMult(matrix, rowWeights_, tmpColCoord_, true);
+    RowMatrix<double> tTmpColCoord_;
+    MatrixTools::transpose(tmpColCoord_, tTmpColCoord_);
+    MatrixTools::mult(tTmpColCoord_, ppalComponents_, colCoord_);
+
+    // matrix of row coordinates
+    MatrixTools::hadamardMult(ppalComponents_, dval, rowCoord_, false);
+    // matrix of principal axes
+    MatrixTools::hadamardMult(colCoord_, invDval, ppalAxes_, false);
+  }
+}
+
+/******************************************************************************/
+
+DualityDiagram::~DualityDiagram() {}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Numeric/Stat/Mva/DualityDiagram.h b/src/Bpp/Numeric/Stat/Mva/DualityDiagram.h
new file mode 100644
index 0000000..a9a872f
--- /dev/null
+++ b/src/Bpp/Numeric/Stat/Mva/DualityDiagram.h
@@ -0,0 +1,155 @@
+//
+// File: DualityDiagram.h
+// Created by: Mathieu Groussin
+// Created on: Sun Feb 27 22:03 2011
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide basal and
+   utilitary classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+#ifndef _DUALITYDIAGRAM_H_
+#define _DUALITYDIAGRAM_H_
+
+#include "../../Matrix/Matrix.h"
+
+namespace bpp
+{
+/**
+ * @brief The core class of a multivariate analysis.
+ *
+ * In the constructor, the eigen values and vectors of the variance-covariance or correlation matrix are calculated.
+ * Eigen values and vectors are stored in the eigenValues_ and eigenVectors_ respectively.
+ * Furthermore, four matrices are calculated: the row and column coordinates as well as the principal axes and components.
+ *
+ * The code of this class is deeply inspired from the R code of the as.dudi function available in the ade4 package.
+ */
+class DualityDiagram:
+  public virtual Clonable
+{
+
+private:
+  std::vector<double> rowWeights_;
+  std::vector<double> colWeights_;
+  size_t nbAxes_;
+  std::vector<double> eigenValues_;
+  RowMatrix<double> eigenVectors_;
+  RowMatrix<double> rowCoord_;
+  RowMatrix<double> colCoord_;
+  RowMatrix<double> ppalAxes_;
+  RowMatrix<double> ppalComponents_;
+
+public:
+  /**
+   * @brief Build an empty DualityDiagram object.
+   *
+   */
+  DualityDiagram() :
+    rowWeights_(),
+    colWeights_(),
+    nbAxes_(),
+    eigenValues_(),
+    eigenVectors_(),
+    rowCoord_(),
+    colCoord_(),
+    ppalAxes_(),
+    ppalComponents_() {}
+
+  /**
+   * @brief Build a new DualityDiagram object.
+   *
+   * @param matrix The input data to analyse.
+   * @param rowWeights A vector of values specifying the weights of rows.
+   * @param colWeights A vector of values specifying the weights of columns.
+   * @param nbAxes The number of kept axes during the analysis.
+   * @param tol Tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)
+   * @param verbose Should warnings be dispayed.
+   * @throw Exception if an error occured.
+   */
+  DualityDiagram(
+    const Matrix<double>& matrix,
+    const std::vector<double>& rowWeights,
+    const std::vector<double>& colWeights,
+    unsigned int nbAxes,
+    double tol = 0.0000001,
+    bool verbose = true) throw (Exception);
+
+  virtual ~DualityDiagram();
+
+  DualityDiagram* clone() const { return new DualityDiagram(*this); }
+
+private:
+  void check_(
+      const Matrix<double>& matrix,
+      const std::vector<double>& rowWeights,
+      const std::vector<double>& colWeights,
+      unsigned int nbAxes) throw (Exception);
+  void compute_(const Matrix<double>& matrix, double tol, bool verbose);
+
+public:
+  /**
+   * @brief Set the data and perform computations.
+   *
+   * @param matrix The input data to analyse.
+   * @param rowWeights A vector of values specifying the weights of rows.
+   * @param colWeights A vector of values specifying the weights of columns.
+   * @param nbAxes The number of kept axes during the analysis.
+   * @param tol Tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)
+   * @param verbose Should warnings be dispayed.
+   * @throw Exception if an error occured.
+   */
+  void setData(
+      const Matrix<double>& matrix,
+      const std::vector<double>& rowWeights,
+      const std::vector<double>& colWeights,
+      unsigned int nbAxes,
+      double tol = 0.0000001,
+      bool verbose = true) throw (Exception);
+ 
+  std::vector<double> computeVariancePercentagePerAxis() throw (Exception);
+  
+  size_t getNbOfKeptAxes() const throw (Exception) { return nbAxes_; }
+  const std::vector<double> getRowWeights() const throw (Exception) { return rowWeights_; }
+  const	std::vector<double> getColumnWeights() const throw (Exception) { return colWeights_; }	  
+  const std::vector<double>& getEigenValues() const throw (Exception) { return eigenValues_; }
+  const RowMatrix<double>& getRowCoordinates() const throw (Exception) { return rowCoord_; }
+  const RowMatrix<double>& getColCoordinates() const throw (Exception) { return colCoord_; }
+  const RowMatrix<double>& getPrincipalAxes() const throw (Exception) { return ppalAxes_; }
+  const RowMatrix<double>& getPrincipalComponents() const throw (Exception) { return ppalComponents_; }
+};
+
+} // end of namespace bpp.
+
+#endif  // _DUALITYDIAGRAM_H_
+
+
diff --git a/src/Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.cpp b/src/Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.cpp
new file mode 100644
index 0000000..4a14f43
--- /dev/null
+++ b/src/Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.cpp
@@ -0,0 +1,182 @@
+//
+// File: PrincipalComponentAnalysis.cpp
+// Created by: Mathieu Groussin
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for phylogenetic data analysis.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "PrincipalComponentAnalysis.h"
+#include "../../Matrix/Matrix.h"
+#include "../../Matrix/MatrixTools.h"
+#include "../../VectorTools.h"
+#include "DualityDiagram.h"
+
+#include <cmath>
+
+using namespace bpp;
+using namespace std;
+
+PrincipalComponentAnalysis::PrincipalComponentAnalysis(
+  const Matrix<double>& data,
+  unsigned int nbAxes,
+  const vector<double>& rowW,
+  const vector<double>& colW,
+  bool centered,
+  bool scaled,
+  double tol,
+  bool verbose) throw (Exception) :
+  DualityDiagram(),
+  columnMeans_(),
+  columnSd_()
+{
+  RowMatrix<double> tmpData = data;
+  
+  // Centering of data?
+  if (centered)
+  {
+    center(tmpData, rowW);
+  }
+  
+  // Scaling of data?
+  if (scaled)
+  {
+    scale(tmpData, rowW);
+  }
+
+  setData(tmpData, rowW, colW, nbAxes, tol, verbose);
+}
+
+/******************************************************************************/
+
+PrincipalComponentAnalysis::PrincipalComponentAnalysis(
+  const Matrix<double>& data,
+  unsigned int nbAxes,
+  bool centered,
+  bool scaled,
+  double tol,
+  bool verbose) throw (Exception) :
+  DualityDiagram(),
+  columnMeans_(),
+  columnSd_()
+{
+  size_t nRow = data.getNumberOfRows();
+  size_t nCol = data.getNumberOfColumns();
+
+  vector<double> rowW(nRow);
+  vector<double> colW(nCol);
+  VectorTools::fill(rowW, 1. / static_cast<double>(nRow));
+  VectorTools::fill(colW, 1.);
+
+  RowMatrix<double> tmpData = data;
+
+  // Centering of data?
+  if (centered)
+  {
+    center(tmpData, rowW);
+  }
+  
+  // Scaling of data?
+  if (scaled)
+  {
+    scale(tmpData, rowW);
+  }
+
+  setData(tmpData, rowW, colW, nbAxes, tol, verbose);
+}
+
+/******************************************************************************/
+
+void PrincipalComponentAnalysis::center(Matrix<double>& matrix, const vector<double>& rowW) throw (Exception)
+{
+  size_t nRow = matrix.getNumberOfRows();
+  size_t nCol = matrix.getNumberOfColumns();
+  if (nRow != rowW.size())
+    throw Exception("PrincipalComponentAnalysis::center. The number of row weigths have to be equal to the number of rows!");
+
+  double sumRowWeights = VectorTools::sum(rowW);
+
+  vector<double> columnMeans(nCol);
+  for (unsigned int i = 0; i < nCol; i++)
+  {
+    double tmp = 0.;
+    for (unsigned int j = 0; j < nRow; j++)
+    {
+      tmp += matrix(j, i) * rowW[j];
+    }
+    columnMeans[i] = tmp / sumRowWeights;
+  }
+
+  for (unsigned int i = 0; i < nCol; i++)
+  {
+    for (unsigned int j = 0; j < nRow; j++)
+    {
+      matrix(j, i) -= columnMeans[i];
+    }
+  }
+}
+
+/******************************************************************************/
+
+void PrincipalComponentAnalysis::scale(Matrix<double>& matrix, const vector<double>& rowW) throw (Exception)
+{
+  size_t nRow = matrix.getNumberOfRows();
+  size_t nCol = matrix.getNumberOfColumns();
+  if (nRow != rowW.size())
+    throw Exception("PrincipalComponentAnalysis::scale. The number of row weigths have to be equal to the number of rows!");
+
+  double sumRowWeights = VectorTools::sum(rowW);
+
+  vector<double> columnSd(nCol);
+  for (size_t i = 0; i < nCol; i++)
+  {
+    double tmp = 0.;
+    for (unsigned int j = 0; j < nRow; j++)
+    {
+      tmp += pow(matrix(j, i), 2) * rowW[j];
+    }
+    columnSd[i] = sqrt(tmp / sumRowWeights);
+  }
+
+  for (size_t i = 0; i < nCol; i++)
+  {
+    for (unsigned int j = 0; j < nRow; j++)
+    {
+      if (columnSd[i] == 0.)
+        matrix(j, i) = 0.;
+      else
+        matrix(j, i) /= columnSd[i];
+    }
+  }
+}
+
diff --git a/src/Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.h b/src/Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.h
new file mode 100644
index 0000000..6351f28
--- /dev/null
+++ b/src/Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.h
@@ -0,0 +1,138 @@
+//
+// File: PrincipalComponentAnalysis.h
+// Created by: Mathieu Groussin
+// Created on: Thu Mar 03 10:13 2011
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide basal and
+   utilitary classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+
+#ifndef _PRINCIPALCOMPONENTANALYSIS_H_
+#define _PRINCIPALCOMPONENTANALYSIS_H_
+
+#include "../../Matrix/Matrix.h"
+#include "DualityDiagram.h"
+
+namespace bpp
+{
+/**
+ * @brief This class allows to perform a principal component analysis.
+ *
+ * Two constructors are available. The first one allows the user to specify the row and column weights. The second one specify default weights:
+ * uniform weights unit weights are created for rows and columns respectively.
+ *
+ * The code of this class is deeply inspired from the R code of the dudi.pca function available in the ade4 package.
+ */
+class PrincipalComponentAnalysis:
+  public DualityDiagram
+{
+private:
+  std::vector<double> columnMeans_;
+  std::vector<double> columnSd_;
+
+public:
+  /**
+   * @brief Build a new PrincipalComponentAnalysis object.
+   *
+   * @param data The input data (a RowMatrix) to analyse.
+   * @param nbAxes The number of kept axes during the analysis.
+   * @param rowW A vector of values specifying the weights of rows.
+   * @param colW A vector of values specifying the weights of columns.
+   * @param centered If true the input matrix is centered according to the column means.
+   * @param scaled If true the input matrix is normalized according to the standard deviations of columns.
+   * @param tol Tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)
+   * @param verbose Should warnings be dispayed.
+   * @throw Exception if an error occured.
+   */
+  PrincipalComponentAnalysis(
+    const Matrix<double>& data,
+    unsigned int nbAxes,
+    const std::vector<double>& rowW,
+    const std::vector<double>& colW,
+    bool centered = true,
+    bool scaled = true,
+    double tol = 0.0000001,
+    bool verbose = true)
+  throw (Exception);
+
+  /**
+   * @brief Build a new PrincipalComponentAnalysis object and specify default row and column weights.
+   *
+   * @param data The input data (a RowMatrix) to analyse.
+   * @param nbAxes The number of kept axes during the analysis.
+   * @param centered If true the input matrix is centered according to the column means.
+   * @param scaled If true the input matrix is normalized according to the standard deviations of columns.
+   * @param tol Tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)
+   * @param verbose Should warnings be dispayed.
+   * @throw Exception if an error occured.
+   */
+  PrincipalComponentAnalysis(
+    const Matrix<double>& data,
+    unsigned int nbAxes,
+    bool centered = true,
+    bool scaled = true,
+    double tol = 0.0000001,
+    bool verbose = true)
+  throw (Exception);
+
+  virtual ~PrincipalComponentAnalysis() {}
+
+  PrincipalComponentAnalysis* clone() const { return new PrincipalComponentAnalysis(*this); }
+
+public:
+  /**
+   * @brief This function allows to center an input matrix from its column means.
+   *
+   * @param matrix The input data (a Matrix) to center.
+   * @param rowW A vector with row weights.
+   */
+  static void center(Matrix<double>& matrix, const std::vector<double>& rowW) throw (Exception);
+
+  /**
+   * @brief This function allows to center an input matrix from its column means.
+   *
+   * @param matrix The input data (a Matrix) to center.
+   * @param rowW A vector with row weights.
+   */
+  static void scale(Matrix<double>& matrix, const std::vector<double>& rowW) throw (Exception);
+
+public:
+  const std::vector<double>& getColumnMeans() const throw (Exception) { return columnMeans_; }
+  const std::vector<double>& getColumnSd() const throw (Exception) { return columnSd_; }
+};
+
+} // end of namespace bpp.
+
+#endif  // _PRINCIPALCOMPONENTANALYSIS_H_
+
diff --git a/src/Bpp/Seq/Io/IoSequence.h b/src/Bpp/Numeric/Stat/StatTest.h
similarity index 72%
rename from src/Bpp/Seq/Io/IoSequence.h
rename to src/Bpp/Numeric/Stat/StatTest.h
index 131c31a..c8747a8 100644
--- a/src/Bpp/Seq/Io/IoSequence.h
+++ b/src/Bpp/Numeric/Stat/StatTest.h
@@ -1,14 +1,14 @@
 //
-// File IoSequence.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
+// File: StatTest.h
+// Created by: Julien Dutheil
+// Created on: Tue Mar 18 13:56 2008
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,36 +37,37 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _IOSEQUENCE_H_
-#define _IOSEQUENCE_H_
+#ifndef _STATTEST_H_
+#define _STATTEST_H_
 
-#include <Bpp/Exceptions.h>
-#include <Bpp/Io/IoFormat.h>
+#include "../../Clonable.h"
 
-// From STL:
+//From the STL:
 #include <string>
 
 namespace bpp
 {
 
 /**
- * @brief The IOSequence interface.
+ * @brief Interface for statistical test results.
  *
- * Interface for sequences input/ouput.
+ * Specific test may add specific methods to the ones provided here.
  */
-class IOSequence: public virtual IOFormat
+class StatTest:
+  public virtual Clonable
 {
-	public:
-		IOSequence() {}
-		virtual ~IOSequence() {}
+  public:
+    StatTest() {}
+    virtual ~StatTest() {}
 
-	public:
-
-		const std::string getDataType() const { return "Sequence container"; }
+  public:
+    virtual std::string getName() const = 0;
+    virtual double getStatistic() const = 0;
+    virtual double getPValue() const = 0;
 
 };
 
-} //end of namespace bpp.
+} // end of namespace bpp;
 
-#endif	// _IOSEQUENCE_H_
+#endif //_STATTEST_H_
 
diff --git a/src/Bpp/Seq/Container/AbstractSequenceContainer.cpp b/src/Bpp/Numeric/Stat/StatTools.cpp
similarity index 68%
rename from src/Bpp/Seq/Container/AbstractSequenceContainer.cpp
rename to src/Bpp/Numeric/Stat/StatTools.cpp
index f9e7820..4a9f842 100644
--- a/src/Bpp/Seq/Container/AbstractSequenceContainer.cpp
+++ b/src/Bpp/Numeric/Stat/StatTools.cpp
@@ -1,21 +1,20 @@
 //
-// File: AbstractSequenceContainer.cpp
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Wednesday July 30 2003
+// File: StatTools.cpp
+// Created by: Julien Dutheil
+// Created on: Sun Jan 30 19:10 2011
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
 modify and/ or redistribute the software under the terms of the CeCILL
 license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". uu
+"http://www.cecill.info". 
 
 As a counterpart to the access to the source code and  rights to copy,
 modify and redistribute granted by the license, users are provided only
@@ -38,19 +37,24 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "AbstractSequenceContainer.h"
+#include "StatTools.h"
+
+//From the STL:
+#include <algorithm>
 
 using namespace bpp;
 using namespace std;
 
-/**************************************************************************************************/
-
-void AbstractSequenceContainer::setComments(const string& name, const Comments& comments)
-throw (SequenceNotFoundException)
-{ 
-	size_t pos = getSequencePosition(name);
-	setComments(pos, comments);
+vector<double> StatTools::computeFdr(const vector<double>& pvalues) {
+  size_t n = pvalues.size();
+  vector<PValue_> sortedPValues;
+  for (size_t i = 0; i < n; ++i) {
+    sortedPValues.push_back(PValue_(pvalues[i], i));  
+  }
+  sort(sortedPValues.begin(), sortedPValues.end());
+  vector<double> fdr(pvalues.size());
+  for (size_t i = 0; i < sortedPValues.size(); ++i) {
+    fdr[sortedPValues[i].index_] = sortedPValues[i].pvalue_ * static_cast<double>(n) / ( static_cast<double>(sortedPValues[i].index_ + 1));
+  }
+  return fdr;
 }
-
-/**************************************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/SequenceContainerIterator.h b/src/Bpp/Numeric/Stat/StatTools.h
similarity index 50%
rename from src/Bpp/Seq/Container/SequenceContainerIterator.h
rename to src/Bpp/Numeric/Stat/StatTools.h
index a4e227d..e65f20d 100644
--- a/src/Bpp/Seq/Container/SequenceContainerIterator.h
+++ b/src/Bpp/Numeric/Stat/StatTools.h
@@ -1,14 +1,14 @@
 //
-// File: SequenceContainerIterator.h
+// File: StatTools.h
 // Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:34 2013
+// Created on: Sun Jan 30 19:10 2011
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,61 +37,53 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#ifndef _SEQUENCECONTAINERITERATOR_H_
-#define _SEQUENCECONTAINERITERATOR_H_
+#ifndef _STATTOOLS_H_
+#define _STATTOOLS_H_
 
-#include "../Sequence.h"
-#include "../SequenceIterator.h"
-#include "OrderedSequenceContainer.h"
+//From the STL:
+#include <vector>
+#include <cstddef>
 
-namespace bpp
-{
+namespace bpp {
 
 /**
- * @brief Partial implementation of the SequenceIterator interface, allowing to loop over an ordered sequence container.
+ * @brief Statistics tools and utilitary functions.
  */
-class AbstractSequenceContainerIterator :
-  public virtual ConstSequenceIterator
+class StatTools
 {
-	protected:
-		const OrderedSequenceContainer* sequences_;
-		size_t currentPosition_;
-	
-	public:
-		AbstractSequenceContainerIterator(const OrderedSequenceContainer& sites);
-		
-    AbstractSequenceContainerIterator(const AbstractSequenceContainerIterator& asi) :
-      sequences_(asi.sequences_),
-      currentPosition_(asi.currentPosition_)
-    {}
-    
-    AbstractSequenceContainerIterator& operator=(const AbstractSequenceContainerIterator& asi)
-    {
-      sequences_ = asi.sequences_;
-      currentPosition_ = asi.currentPosition_;
-      return *this;
-    }
+  private:
+    struct PValue_ {
+      double pvalue_;
+      size_t index_;
+      PValue_(double pvalue, size_t index):
+        pvalue_(pvalue), index_(index) {}
 
-		virtual ~AbstractSequenceContainerIterator() {}
-	
-};
+      bool operator<(const PValue_& pvalue) const {
+        return pvalue.pvalue_ < pvalue_;
+      }
+    };
 
-/**
- * @brief Loop over all sequences in a SequenceContainer.
- */
-class SimpleSequenceContainerIterator:
-  public AbstractSequenceContainerIterator
-{
-	public:
-		SimpleSequenceContainerIterator(const OrderedSequenceContainer& sites);
-		virtual ~SimpleSequenceContainerIterator() {}
-	
-	public:
-		const Sequence* nextSequence();
-		bool hasMoreSequences() const;
+  public:
+    /**
+     * @brief Compute the false discovery rate for a set of input p-values, using Benjamini and Hochberg's 'FDR' method.
+     * 
+     * The false discovery rate is computed by sorting all pvalues.
+     * The FDR r is calculated with the formula
+     * @f$ r = p * n / i at f$
+     * where p is the p-value, n is the number of tests (the size of the input vector) and i is the rank of the p-value, that is the index in the sorted array.
+     * 
+     * References:
+     * - Benjamini, Y and Hochberg, Y (1995). Controlling the false discovery rate: a practical and powerful approach to multiple testing. Journal of the Royal Statistical Society, Series B (Methodological) 57(1):289-300.
+     * - Verhoeven, KJF; Simonsen, KL; M. McIntyre, LM (2005). Implementing false discovery rate control: increasing your power. Oikos. 108(3):643-647.
+     *
+     * @author Julien Dutheil
+     * @param pvalues The input p-values.
+     * @return The corresponding false discovery rates.
+     */
+    static std::vector<double> computeFdr(const std::vector<double>& pvalues);
 };
 
 } //end of namespace bpp.
 
-#endif	//_SEQUENCEITERATOR_H_
+#endif //_STATTOOLS_H_
 
diff --git a/src/Bpp/Numeric/Table.h b/src/Bpp/Numeric/Table.h
new file mode 100644
index 0000000..1bbd2f8
--- /dev/null
+++ b/src/Bpp/Numeric/Table.h
@@ -0,0 +1,1222 @@
+//
+// File: Table.h
+// Created by: Laurent Guéguen
+// Created on: dimanche 2 avril 2017, à 22h 59
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use,
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info".
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability.
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or
+  data to be ensured and,  more generally, to use and operate it in the
+  same conditions as regards security.
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _TABLE_H_
+#define _TABLE_H_
+
+#include "VectorTools.h"
+#include "TableExceptions.h"
+#include "../Clonable.h"
+
+// From the STL:
+#include <string>
+#include <vector>
+#include <map>
+#include <memory>
+
+
+namespace bpp
+{
+/**
+ * @brief This class corresponds to a 'dataset', <i>i.e.</i> a table
+ * with data by rows and variable by columns.
+ *
+ * Data are stored as T objects, by column.
+ */
+
+  template<class T>
+  class Table :
+    public Clonable
+  {
+  protected:
+    size_t nRow_, nCol_;
+    std::vector< std::vector<T> > data_;
+    std::vector<std::string> rowNames_;
+    std::vector<std::string> colNames_;
+
+  public:
+    /**
+     * @brief Build a new void Table object with nRow rows and nCol columns.
+     *
+     * @param nRow The number of rows of the Table.
+     * @param nCol The number of columns of the Table.
+     */
+    
+    Table(size_t nRow, size_t nCol) :
+      nRow_(nRow),
+      nCol_(nCol),
+      data_(nCol),
+      rowNames_(),
+      colNames_()
+    {
+      for (size_t i = 0; i < nCol; i++)
+      {
+        data_[i].resize(nRow);
+      }
+    }
+
+    /**
+     * @brief Build a new void Table object with named columns.
+     *
+     * @param colNames The names of the columns of the Table.
+     * @throw DuplicatedTableColumnNameException If colnames contains identical names.
+     */
+
+    Table(const std::vector<std::string>& colNames) throw (DuplicatedTableColumnNameException) :
+      nRow_(0),
+      nCol_(colNames.size()),
+      data_(colNames.size()),
+      rowNames_(),
+      colNames_()
+    {
+      setColumnNames(colNames); // May throw an exception.
+    }
+    
+
+    Table(const Table& table) :
+      nRow_(table.nRow_),
+      nCol_(table.nCol_),
+      data_(table.data_),
+      rowNames_(table.rowNames_),
+      colNames_(table.colNames_)
+    {
+    }
+
+    Table(const std::vector<std::vector<T> >& vt) :
+      nRow_(vt.size()==0?0:vt[0].size()),      
+      nCol_(vt.size()),
+      data_(vt),
+      rowNames_(),
+      colNames_()
+    {}
+
+    Table& operator=(const Table& table)
+    {
+      nRow_ = table.nRow_;
+      nCol_ = table.nCol_;
+      data_ = table.data_;
+      rowNames_ = table.rowNames_;
+      colNames_ = table.colNames_;
+      return *this;
+    }
+
+    Table& operator=(const std::vector<std::vector<T> >& vt)
+    {
+      nCol_ = vt.size();
+      if (vt.size()==0)
+      {
+        nRow_ = 0;
+        data_.clear();
+      }
+      else
+      {
+        nRow_=vt[0].size();
+        data_=vt;
+      }
+      
+      rowNames_.clear();
+      colNames_.clear();
+      return *this;
+    }
+
+    Table* clone() const { return new Table(*this); }
+
+    virtual ~Table() {}
+    
+  public:
+    /**
+     * @return The data.
+     *
+     */
+
+    const std::vector< std::vector<T> >& getData() const
+    {
+      return data_;
+    }
+    
+
+    /**
+     * @return The element at a given position.
+     * @param rowIndex Row number.
+     * @param colIndex Column number.
+     * @throw IndexOutOfBoundsException If one of the index is greater or equal to the corresponding number of columns/rows.
+     */
+
+    T& operator()(size_t rowIndex, size_t colIndex) throw (IndexOutOfBoundsException)
+    {
+      if (colIndex >= nCol_)
+        throw IndexOutOfBoundsException("Table::operator(size_t, size_t).", colIndex, 0, nCol_ - 1);
+      if (rowIndex >= data_[colIndex].size())
+        throw IndexOutOfBoundsException("Table::operator(size_t, size_t).", rowIndex, 0, data_[colIndex].size() - 1);
+      return data_[colIndex][rowIndex];
+    }
+
+    /**
+     * @return The element at a given position.
+     * @param rowIndex Row number.
+     * @param colIndex Column number.
+     * @throw IndexOutOfBoundsException If one of the index is greater or equal to the corresponding number of columns/rows.
+     */
+
+    const T& operator()(size_t rowIndex, size_t colIndex) const throw (IndexOutOfBoundsException)
+    {
+      if (colIndex >= nCol_)
+        throw IndexOutOfBoundsException("Table::operator(size_t, size_t).", colIndex, 0, nCol_ - 1);
+      if (rowIndex >= data_[colIndex].size())
+        throw IndexOutOfBoundsException("Table::operator(size_t, size_t).", rowIndex, 0, data_[colIndex].size() - 1);
+      return data_[colIndex][rowIndex];
+    }
+
+    /**
+     * @return The element at a given position.
+     * @param rowName Row name.
+     * @param colName Column name.
+     * @throw NoTableRowNamesException If the table does not have names associated to rows.
+     * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+     * @throw TableNameNotFoundException If one of rowName or colName do not match existing names.
+     */
+
+    T& operator()(const std::string& rowName, const std::string& colName)
+      throw (NoTableRowNamesException, NoTableColumnNamesException, TableNameNotFoundException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::operator(const string &, const string &).");
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::operator(const string &, const string &).");
+      try
+      {
+        size_t rowIndex = VectorTools::which(rowNames_, rowName);
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        return (*this)(rowIndex, colIndex);
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableNameNotFoundException("Table::operator(const string &, const string &).", *ex.getElement());
+      }
+    }
+    
+    /**
+     * @return The element at a given position.
+     * @param rowName Row name.
+     * @param colName Column name.
+     * @throw NoTableRowNamesException If the table does not have names associated to rows.
+     * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+     * @throw TableNameNotFoundException If one of rowName or colName do
+     * not match existing names.
+     */
+    const T& operator()(const std::string& rowName, const std::string& colName) const
+      throw (NoTableRowNamesException, NoTableColumnNamesException, TableNameNotFoundException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::operator(const string &, const string &).");
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::operator(const string &, const string &).");
+      try
+      {
+        size_t rowIndex = VectorTools::which(rowNames_, rowName);
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        return (*this)(rowIndex, colIndex);
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableNameNotFoundException("Table::operator(const string &, const string &).", *ex.getElement());
+      }
+    }
+  
+    
+
+    /**
+     * @return The element at a given position.
+     * @param rowName Row name.
+     * @param colIndex Column number.
+     * @throw NoTableRowNamesException If the table does not have names associated to rows.
+     * @throw IndexOutOfBoundsException If the index is greater or equal to the number of columns.
+     * @throw TableNameNotFoundException If rowName do not match existing names.
+     */
+
+    T& operator()(const std::string& rowName, size_t colIndex)
+      throw (NoTableRowNamesException, TableNameNotFoundException, IndexOutOfBoundsException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::operator(const string &, size_t).");
+      if (colIndex >= nCol_)
+        throw IndexOutOfBoundsException("Table::operator(const string &, size_t).", colIndex, 0, nCol_ - 1);
+      try
+      {
+        size_t rowIndex = VectorTools::which(rowNames_, rowName);
+        return (*this)(rowIndex, colIndex);
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableNameNotFoundException("Table::operator(const string &, size_t).", *ex.getElement());
+      }
+    }
+
+
+    /**
+     * @return The element at a given position.
+     * @param rowName Row name.
+     * @param colIndex Column number.
+     * @throw NoTableRowNamesException If the table does not have names associated to rows.
+     * @throw IndexOutOfBoundsException If the index is greater or equal to the number of columns.
+     * @throw TableNameNotFoundException If rowName do not match existing names.
+     */
+
+    const T& operator()(const std::string& rowName, size_t colIndex) const
+      throw (NoTableRowNamesException, TableNameNotFoundException, IndexOutOfBoundsException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::operator(const string &, size_t).");
+      if (colIndex >= nCol_)
+        throw IndexOutOfBoundsException("Table::operator(const string &, size_t).", colIndex, 0, nCol_ - 1);
+      try
+      {
+        size_t rowIndex = VectorTools::which(rowNames_, rowName);
+        return (*this)(rowIndex, colIndex);
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableNameNotFoundException("Table::operator(const string &, size_t).", *ex.getElement());
+      }
+    }
+
+
+    /**
+     * @return The element at a given position.
+     * @param rowIndex Row number.
+     * @param colName Column name.
+     * @throw IndexOutOfBoundsException If the index is greater or equal to the number of rows.
+     * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+     * @throw TableNameNotFoundException If colName do not match existing names.
+     */
+
+    T& operator()(size_t rowIndex, const std::string& colName)
+      throw (IndexOutOfBoundsException, NoTableColumnNamesException, TableNameNotFoundException)
+    {
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::operator(size_t, const string &).");
+      try
+      {
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        if (rowIndex >= data_[colIndex].size())
+          throw IndexOutOfBoundsException("Table::operator(size_t, const string &).", rowIndex, 0, data_[colIndex].size() - 1);
+        return (*this)(rowIndex, colIndex);
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableNameNotFoundException("Table::operator(const string &, const string &).", *ex.getElement());
+      }
+    }
+
+
+    /**
+     * @return The element at a given position.
+     * @param rowIndex Row number.
+     * @param colName Column name.
+     * @throw IndexOutOfBoundsException If the index is greater or equal to the number of rows.
+     * @throw NoTableColumnNamesException If the table does not have names associated to columns.
+     * @throw TableNameNotFoundException If colName do not match existing names.
+     */
+
+    const T& operator()(size_t rowIndex, const std::string& colName) const
+      throw (IndexOutOfBoundsException, NoTableColumnNamesException, TableNameNotFoundException)
+    {
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::operator(size_t, const string &).");
+      try
+      {
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        if (rowIndex >= data_[colIndex].size())
+          throw IndexOutOfBoundsException("Table::operator(size_t, const string &).", rowIndex, 0, data_[colIndex].size() - 1);
+        return (*this)(rowIndex, colIndex);
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableNameNotFoundException("Table::operator(const string &, const string &).", *ex.getElement());
+      }
+    }
+
+    /**
+     * @name Work on columns.
+     *
+     * @{
+     */
+
+    /**
+     * @return The number of columns in this table.
+     */
+    size_t getNumberOfColumns() const { return nCol_; }
+
+    /**
+     * @brief Set the column names of this table.
+     *
+     * @param colNames The row names.
+     * @throw DimensionException If the number of names do not match the number of columns in the table.
+     * @throw DuplicatedTableColumnNameException If names are not unique.
+     */
+    void setColumnNames(const std::vector<std::string>& colNames) throw (DimensionException, DuplicatedTableColumnNameException)
+    {
+      if (!VectorTools::isUnique(colNames))
+        throw DuplicatedTableColumnNameException("Table::setColumnNames(...). Column names must be unique.");
+      if (colNames.size() != nCol_)
+        throw DimensionException("Table::setColumnNames.", colNames.size(), nCol_);
+      else
+        
+        colNames_ = colNames;
+    }
+
+    /**
+     * @brief Get the column names of this table.
+     *
+     * @return The column names of this table.
+     * @throw NoTableColumnNamesException If no column names are associated to this table.
+     */
+
+    const std::vector<std::string>& getColumnNames() const throw (NoTableColumnNamesException)
+    {
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::getColumnNames().");
+      return colNames_;
+    }
+
+    std::vector<std::string>& getColumnNames() throw (NoTableColumnNamesException)
+    {
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::getColumnNames().");
+      return colNames_;
+    }
+
+    /**
+     * @brief Get a given column name.
+     *
+     * @param index The index of the column.
+     * @return The column name associated to the given column.
+     * @throw NoTableColumnNamesException If no column names are associated to this table.
+     * @throw IndexOutOfBoundsException If index is >= number of columns.
+     */
+    std::string getColumnName(size_t index) const throw (NoTableColumnNamesException, IndexOutOfBoundsException)
+    {
+      if (colNames_.size() ==0)
+        throw NoTableColumnNamesException("Table::getColumnName(size_t).");
+      if (index >= nCol_)
+        throw IndexOutOfBoundsException("Table::getColumnName(size_t).", index, 0, nCol_ - 1);
+      return colNames_[index];
+    }
+
+
+    /**
+     * @return true If column names are associated to this table.
+     */
+    bool hasColumnNames() const { return colNames_.size() != 0; }
+
+    /**
+     * @return The values in the given column.
+     * @param index The index of the column.
+     * @throw IndexOutOfBoundsException If index is >= number of columns.
+     */
+    std::vector<T>& getColumn(size_t index)
+    {
+      if (index >= nCol_)
+        throw IndexOutOfBoundsException("Table::getColumn(size_t).", index, 0, nCol_ - 1);
+      return data_[index];
+    }
+
+    /**
+     * @return The values in the given column.
+     * @param index The index of the column.
+     * @throw IndexOutOfBoundsException If index is >= number of columns.
+     */
+    const std::vector<T>& getColumn(size_t index) const
+    {
+      if (index >= nCol_)
+        throw IndexOutOfBoundsException("Table::getColumn(size_t).", index, 0, nCol_ - 1);
+      return data_[index];
+    }
+
+
+    /**
+     * @return The values in the given column.
+     * @param colName The name of the column.
+     * @throw NoTableColumnNamesException If no column names are associated to this table.
+     * @throw TableColumnNameNotFoundException If colName do not match existing column names.
+     */
+    std::vector<T>& getColumn(const std::string& colName) throw (NoTableColumnNamesException, TableColumnNameNotFoundException)
+    {
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::getColumn(const string &).");
+      try
+      {
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        return data_[colIndex];
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableColumnNameNotFoundException("Table::getColumn(const string &).", colName);
+      }
+    }
+
+    /**
+     * @return The values in the given column.
+     * @param colName The name of the column.
+     * @throw NoTableColumnNamesException If no column names are associated to this table.
+     * @throw TableColumnNameNotFoundException If colName do not match existing column names.
+     */
+    const std::vector<T>& getColumn(const std::string& colName) const throw (NoTableColumnNamesException, TableColumnNameNotFoundException)
+    {
+      if (colNames_.size() == 0)
+        throw NoTableColumnNamesException("Table::getColumn(const string &).");
+      try
+      {
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        return data_[colIndex];
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableColumnNameNotFoundException("Table::getColumn(const string &).", colName);
+      }
+    }
+
+
+    /**
+     * @brief Tell is a given column exists.
+     *
+     * @param colName The name of the column to look for.
+     * @return true if the column was found, false if not or if there are no column names.
+     */
+    bool hasColumn(const std::string& colName) const
+    {
+      if (colNames_.size() == 0)
+        return false;
+      for (size_t i = 0; i < colNames_.size(); i++)
+      {
+        if ((colNames_)[i] == colName)
+          return true;
+      }
+      return false;
+    }
+
+
+    /**
+     * @brief Delete the given column.
+     *
+     * @param index The index of the column.
+     * @throw IndexOutOfBoundsException If index is >= number of columns.
+     */
+    void deleteColumn(size_t index) throw (IndexOutOfBoundsException)
+    {
+      if (index >= nCol_)
+        throw IndexOutOfBoundsException("Table::deleteColumn(size_t).", index, 0, nCol_ - 1);
+      data_.erase(data_.begin() + (size_t)index); 
+      if (colNames_.size()!=0)
+        colNames_.erase(colNames_.begin() + (size_t)(index));
+      nCol_--;
+    }
+
+/**
+ * @brief Delete the given column.
+ *
+ * @param colName The name of the column.
+ * @throw NoTableColumnNamesException If no column names are associated to this table.
+ * @throw TableColumnNameNotFoundException If colName do not match existing column names.
+ */
+    void deleteColumn(const std::string& colName) throw (NoTableColumnNamesException, TableColumnNameNotFoundException)
+    {
+      if ((colNames_.size()==0))
+        throw NoTableColumnNamesException("Table::deleteColumn(const string &).");
+      try
+      {
+        size_t colIndex = VectorTools::which(colNames_, colName);
+        data_.erase(data_.begin() + (size_t)(colIndex));
+        colNames_.erase(colNames_.begin() + (size_t)(colIndex));
+        nCol_--;
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableColumnNameNotFoundException("Table::deleteColumn(const string &).", colName);
+      }
+    }
+
+
+    /**
+     * @brief Add a new column.
+     *
+     * @param newColumn The new column values.
+     * @param pos       The position optional (default : -1 for nb columns)
+     * @throw DimensionException If the number of values does not match the number of rows.
+     * @throw TableColumnNamesException If the table has row names.
+     */
+
+    void addColumn(const std::vector<T>& newColumn, int pos=-1) throw (DimensionException, TableColumnNamesException)
+    {
+      if (pos>(int)nCol_)
+        throw DimensionException("Table::addColumn.", pos, nCol_);
+      if (pos==-1)
+        pos=nCol_;
+
+      if (colNames_.size())
+        throw TableColumnNamesException("Table::addColumn. Table has column names.");
+      if (newColumn.size() != nRow_)
+        throw DimensionException("Table::addColumn.", newColumn.size(), nRow_);
+
+      data_.insert(data_.begin()+pos, newColumn);
+      nCol_++;
+    }
+
+    /**
+     * @brief Add a new column.
+     *
+     * @param colName   The name of the column.
+     * @param newColumn The new column values.
+     * @param pos       The position optional (default : -1 for nb columns)
+     * @throw DimensionException If the number of values does not match the number of rows.
+     * @throw NoTableColumnNamesException If the table does not have row names.
+     * @throw DuplicatedTableColumnNameException If colName is already used.
+     */
+
+    void addColumn(const std::string& colName, const std::vector<T>& newColumn, int pos=-1) throw (DimensionException, NoTableColumnNamesException, DuplicatedTableColumnNameException)
+    {
+      if (pos>(int)nCol_)
+        throw DimensionException("Table::addColumn.", pos, nCol_);
+      if (pos==-1)
+        pos=nCol_;
+      
+      if ((colNames_.size()==0))
+      {
+        if (nCol_ == 0)
+          colNames_ = new std::vector<std::string>();
+        else
+          throw NoTableColumnNamesException("Table::addColumn. Table has column names.");
+      }
+      if (newColumn.size() != nRow_)
+        throw DimensionException("Table::addColumn.", newColumn.size(), nRow_);
+      if (nCol_ > 0 && find(colNames_.begin(), colNames_.end(), colName) != colNames_.end())
+        throw DuplicatedTableColumnNameException("Table::addColumn(const string &, const std::vector<string> &). Column names must be unique.");
+
+      colNames_.insert(colNames_.begin()+pos,colName);
+      data_.insert(data_.begin()+pos, newColumn);
+      nCol_++;
+    }
+
+    /**
+     * @brief Add a new column
+     *
+     * @param stream the input stream
+     * @param sep The row delimiter
+     * @param pos       The position optional (default : nb cols)
+     * @param rowCol the indice of row where colnames are, starting
+     * from 0 (default -1 means no such column)
+     */
+    
+    void addColumn(std::string& st, const std::string& sep = "\t", int pos=-1, int rowCol = -1)
+    {
+      if (pos>(int)nCol_)
+        throw DimensionException("Table::addColumn.", pos, nCol_);
+      if (pos==-1)
+        pos=nCol_;
+
+      StringTokenizer stok(st, sep, false, true);
+      std::vector<std::string> row(stok.getTokens().begin(), stok.getTokens().end());
+
+      if (row.size()!=nRow_+(rowCol>=0)?1:0)
+        throw BadIntegerException("Table::addColumn. Bad number of rows: ", row.size());
+
+      std::vector<T> newColumn;
+      
+      for (size_t i=0; i<row.size(); i++)
+      {
+        if (i==rowCol)
+        {
+          std::string colName=row[i];
+          if (find(colNames_.begin(), colNames_.end(), colName) != colNames_.end())
+            throw DuplicatedTableColumnNameException("Table::addColumn(const std::vector<string> &). Column names must be unique.");
+
+          colNames_.insert(colNames_.begin()+(size_t)pos,colName);
+        }
+        else
+        {
+          std::stringstream ss(row[i]);
+          T t;
+          ss >> t;
+          newColumn.push_back(t);
+        }
+      }
+      data_.insert(data_.begin()+pos, newColumn);
+
+      nCol_++;      
+    }
+
+
+    /**
+     * @brief Set a new column.
+     *
+     * @param newColumn The new column values.
+     * @param pos       The position
+     * @throw DimensionException If the number of values does not match the number of rows.
+     * @throw TableColumnNamesException If the table has row names.
+     */
+    
+    void setColumn(const std::vector<T>& newColumn, size_t pos) throw (DimensionException, TableColumnNamesException)
+    {
+      if (pos>=(int)nCol_)
+        throw DimensionException("Table::setColumn.", pos, nCol_);
+
+      if (newColumn.size() != nRow_)
+        throw DimensionException("Table::setColumn.", newColumn.size(), nRow_);
+
+      data_[pos]=newColumn;
+    }
+
+    /**
+     * @brief Set a new column.
+     *
+     * @param colName   The name of the column.
+     * @param newColumn The new column values.
+     * @param pos       The position
+     * @throw DimensionException If the number of values does not match the number of rows.
+     * @throw NoTableColumnNamesException If the table does not have row names.
+     * @throw DuplicatedTableColumnNameException If colName is already used.
+     */
+    void setColumn(const std::string& colName, const std::vector<T>& newColumn, size_t pos) throw (DimensionException, NoTableColumnNamesException, DuplicatedTableColumnNameException)
+    {
+      if (pos>=nCol_)
+        throw DimensionException("Table::setColumn.", pos, nCol_);
+      
+      if (colNames_.size()==0)
+        throw NoTableColumnNamesException("Table::setColumn. Table has column names.");
+
+      if (newColumn.size() != nRow_)
+        throw DimensionException("Table::setColumn.", newColumn.size(), nRow_);
+      
+      if (find(colNames_.begin(), colNames_.end(), colName) != colNames_.end() && 
+          find(colNames_.begin(), colNames_.end(), colName) != colNames_.begin()+pos)
+        throw DuplicatedTableColumnNameException("Table::setColumn(const string &, const std::vector<T> &, size_t). Column names must be unique.");
+
+      colNames_[pos]=colName;
+      data_[pos]=newColumn;
+    }
+
+    /** @} */
+
+    /**
+     * @name Work on rows.
+     *
+     * @{
+     */
+
+    /**
+     * @return The number of rows in this table.
+     */
+    size_t getNumberOfRows() const { return nRow_; }
+
+    /**
+     * @brief Set the row names of this table.
+     *
+     * @param rowNames The row names.
+     * @throw DimensionException If the number of names do not match the number of rows in the table.
+     * @throw DuplicatedTableRowNameException If names are not unique.
+     */
+    void setRowNames(const std::vector<std::string>& rowNames) throw (DimensionException, DuplicatedTableRowNameException)
+    { 
+      if (!VectorTools::isUnique(rowNames))
+      {
+        throw DuplicatedTableRowNameException("Table::setRowNames(...). Row names must be unique.");
+      }
+      if (rowNames.size() != nRow_)
+        throw DimensionException("Table::setRowNames.", rowNames.size(), nRow_);
+      else
+      {
+        rowNames_ = rowNames;
+      }
+    }
+
+
+    /**
+     * @brief Get the row names of this table.
+     *
+     * @return The row names of this table.
+     * @throw NoTableRowNamesException If no row names are associated to this table.
+     */
+    
+    std::vector<std::string> getRowNames() throw (NoTableRowNamesException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::getRowNames().");
+      return rowNames_;
+    }
+
+    const std::vector<std::string>& getRowNames() const throw (NoTableRowNamesException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::getRowNames().");
+      return rowNames_;
+    }
+
+
+    /**
+     * @brief Tell is a given row exists.
+     *
+     * @param rowName The name of the row to look for.
+     * @return true if the row was found, false if not or if there are no row names.
+     */
+    bool hasRow(const std::string& rowName) const
+    {
+      if (rowNames_.size() == 0)
+        return false;
+      for (size_t i = 0; i < rowNames_.size(); i++)
+      {
+        if ((rowNames_)[i] == rowName)
+          return true;
+      }
+      return false;
+    }
+
+
+    /**
+     * @brief Get a given row name.
+     *
+     * @param index The index of the row.
+     * @return The row name associated to the given row.
+     * @throw NoTableRowNamesException If no row names are associated to this table.
+     * @throw IndexOutOfBoundsException If index is >= number of rows.
+     */
+    std::string getRowName(size_t index) const throw (NoTableRowNamesException, IndexOutOfBoundsException)
+    {
+      if (rowNames_.size() == 0)
+        throw NoTableRowNamesException("Table::getRowName(size_t).");
+      if (index >= nRow_)
+        throw IndexOutOfBoundsException("Table::getRowName(size_t).", index, 0, nRow_ - 1);
+      return (rowNames_)[index];
+    }
+
+
+    /**
+     * @return true If row names are associated to this table.
+     */
+    bool hasRowNames() const { return rowNames_.size() != 0; }
+
+    /**
+     * @return A vector which contains a copy  in the given row.
+     * @param index The index of the row.
+     * @throw IndexOutOfBoundsException If index is >= number of rows.
+     */
+    std::vector<T> getRow(size_t index) const throw (IndexOutOfBoundsException)
+    {
+      if (index >= nRow_)
+        throw IndexOutOfBoundsException("Table::getRow(size_t).", index, 0, nRow_ - 1);
+      std::vector<T> row;
+      for (size_t i = 0; i < nCol_; i++)
+      {
+        row.push_back(data_[i][index]);
+      }
+      return row;
+    }
+
+
+    /**
+     * @return A vector which contains a copy  in the given row.
+     * @param rowName The name of the row.
+     * @throw NoTableRowNamesException If no row names are associated to this table.
+     * @throw TableRowNameNotFoundException If rowName do not match existing row names.
+     */
+    std::vector<T> getRow(const std::string& rowName) const throw (NoTableRowNamesException, TableRowNameNotFoundException)
+    {
+      if ((rowNames_.size()==0))
+        throw NoTableRowNamesException("Table::getRow(const string &).");
+      try
+      {
+        size_t rowIndex = VectorTools::which(rowNames_, rowName);
+        std::vector<T> row;
+        for (size_t i = 0; i < nCol_; i++)
+        {
+          row.push_back(data_[i][rowIndex]);
+        }
+        return row;
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableRowNameNotFoundException("Table::getRow(const string &).", rowName);
+      }
+    }
+
+
+    /**
+     * @brief Delete the given row.
+     *
+     * @param index The index of the row.
+     * @throw IndexOutOfBoundsException If index is >= number of row.
+     */
+    void deleteRow(size_t index) throw (IndexOutOfBoundsException)
+    {
+      for (size_t j = 0; j < nCol_; j++)
+      {
+        std::vector<T>* column = &data_[j];
+        if (index >= column->size())
+          throw IndexOutOfBoundsException("Table::deleteRow(size_t).", index, 0, column->size() - 1);
+        column->erase(column->begin() + index);
+      }
+      if (rowNames_.size()!=0)
+        rowNames_.erase(rowNames_.begin() + index);
+      nRow_--;
+    }
+
+    /**
+     * @brief Delete the given rows.
+     *
+     * @param index The index of the first row.
+     * @param len the number of rows to delete
+     * @throw IndexOutOfBoundsException If index is >= number of row.
+     */
+    
+    void deleteRows(size_t index, size_t len) throw (IndexOutOfBoundsException)
+    {
+      for (size_t j = 0; j < nCol_; j++)
+      {
+        std::vector<T>* column = &data_[j];
+        if (index >= column->size())
+          throw IndexOutOfBoundsException("Table::deleteRow(size_t).", index, 0, column->size() - 1);
+        column->erase(column->begin() + index, column->begin() + index + len);
+      }
+      if (rowNames_.size()!=0)
+        rowNames_.erase(rowNames_.begin() + index, rowNames_.begin() + index + len);
+      nRow_--;
+    }
+
+
+    /**
+     * @brief Delete the given row.
+     *
+     * @param rowName The name of the row.
+     * @throw NoTableRowNamesException If no row names are associated to this table.
+     * @throw TableRowNameNotFoundException If rowName do not match existing column names.
+     */
+    void deleteRow(const std::string& rowName) throw (NoTableRowNamesException, TableRowNameNotFoundException)
+    {
+      if ((rowNames_.size()==0))
+        throw NoTableRowNamesException("Table::deleteRow(const string &).");
+      try
+      {
+        size_t rowIndex = VectorTools::which(rowNames_, rowName);
+        for (size_t j = 0; j < nCol_; j++)
+        {
+          std::vector<T>* column = &data_[j];
+          column->erase(column->begin() + rowIndex);
+        }
+        rowNames_.erase(rowNames_.begin() + rowIndex);
+        nRow_--;
+      }
+      catch (ElementNotFoundException<std::string>& ex)
+      {
+        throw TableRowNameNotFoundException("Table::deleteRow(const string &).", rowName);
+      }
+    }
+
+
+    /**
+     * @brief Add a new row.
+     *
+     * @param newRow The new row values.
+     * @param pos       The position optional (default : -1 for nb rows)
+     */
+    void addRow(const std::vector<T>& newRow, int pos=-1)
+    {
+      if (pos>(int)nRow_)
+        throw DimensionException("Table::addRow.", pos, nRow_);
+
+      if (pos==-1)
+        pos=nRow_;
+      
+      if (rowNames_.size()!=0)
+        throw TableRowNamesException("Table::addRow. Table has row names.");
+      if (newRow.size() != nCol_)
+        throw DimensionException("Table::addRow.", newRow.size(), nCol_);
+      for (size_t j = 0; j < nCol_; j++)
+      {
+        data_[j].insert(data_[j].begin()+(size_t)pos, newRow[j]);
+      }
+      nRow_++;
+    }
+
+    /**
+     * @brief Add a new row at a given position
+     *
+     * @param rowName   The name of the row.
+     * @param newRow    The new row values.
+     * @param pos       The position optional (default : -1 for nb rows)
+     */
+
+    void addRow(const std::string& rowName, const std::vector<T>& newRow, int pos=-1)
+    {
+      if (pos>(int)nRow_)
+        throw DimensionException("Table::addRow.", pos, nRow_);
+      if (pos==-1)
+        pos=nRow_;
+
+      if ((rowNames_.size()==0))
+      {
+        if (nRow_ == 0)
+          rowNames_ = new std::vector<std::string>();
+        else
+          throw NoTableRowNamesException("Table::addRow. Table has row names.");
+      }
+      if (newRow.size() != nCol_)
+        throw DimensionException("Table::addRow.", newRow.size(), nCol_);
+      if (nRow_ > 0 && find(rowNames_.begin(), rowNames_.end(), rowName) != rowNames_.end())
+        throw DuplicatedTableRowNameException("Table::addRow(const string &, const std::vector<string> &). Row names must be unique.");
+      rowNames_.insert(rowNames_.begin()+(size_t)pos,rowName);
+      for (size_t j = 0; j < nCol_; j++)
+      {
+        data_[j].insert(data_[j].begin()+(size_t)pos, newRow[j]);
+      }
+      nRow_++;
+    }
+
+    /**
+     * @brief Add a new row.
+     *
+     * @param stream the input stream
+     * @param sep The column delimiter
+     * @param pos       The position optional (default : nb rows)
+     * @param rowCol the indice of column where rownames are, starting
+     * from 0 (default -1 means no such column)
+     */
+    
+    void addRow(std::string& st, const std::string& sep = "\t", int pos=-1, int rowCol = -1)
+    {
+      if (pos>(int)nRow_)
+        throw DimensionException("Table::addRow.", pos, nRow_);
+      if (pos==-1)
+        pos=nRow_;
+
+      StringTokenizer stok(st, sep, false, true);
+      std::vector<std::string> row(stok.getTokens().begin(), stok.getTokens().end());
+
+      if (row.size()!=nCol_+(rowCol>=0)?1:0)
+        throw BadIntegerException("Table::addRow. Bad number of columns: ", row.size());
+
+      size_t id=0;
+      
+      for (size_t i=0; i<row.size(); i++)
+      {
+        if (i==rowCol)
+        {
+          std::string rowName=row[i];
+          if (find(rowNames_.begin(), rowNames_.end(), rowName) != rowNames_.end())
+            throw DuplicatedTableRowNameException("Table::addRow(const std::vector<string> &). Row names must be unique.");
+
+          rowNames_.insert(rowNames_.begin()+(size_t)pos,rowName);
+        }
+        else
+        {
+          std::stringstream ss(row[i]);
+          T t;
+          ss >> t;
+          data_[id].insert(data_[id].begin()+(size_t)pos,t);
+          id++;
+        }
+      }
+      nRow_++;      
+    }
+
+
+    /** @} */
+
+  public:
+    /**
+     * @brief Read a table form a stream in CSV-like
+     *
+     * By default, if the first line as one column less than the second one,
+     * the first line is taken as column names, and the first column as row names.
+     * Otherwise, no column names and no row names are specified, unless
+     * explicitely precised by the user.
+     * Note: if byRow=false, exchange row and column roles.
+     *
+     * @param in       The input stream.
+     * @param byRow    Tell if the table is filled by rows
+     * @param sep      The line delimiter.
+     * @param header   Tell if the first line must be used for names,
+     * otherwise use default.
+     * @param names     Use a column as rowNames (or a row as columnNames). If positive, use the specified column to compute rownames, otherwise use default;
+     * @return         A pointer toward a new Table object.
+     */
+    
+    static Table<T>* read(std::istream& in, bool byRow, const std::string& sep = "\t", bool header = true, int names = -1)
+    {
+      std::string firstLine  = FileTools::getNextLine(in);
+      StringTokenizer st1(firstLine, sep, false, true);
+      std::vector<std::string> row1(st1.getTokens().begin(), st1.getTokens().end());
+      size_t nCol = row1.size();
+      Table<T>* dt;
+
+      if (header)
+      {
+        // Use first line as header.
+        if (byRow)
+        {
+          dt = new Table<T>(0,nCol);
+          dt->setColumnNames(row1);
+        }
+        else
+        {
+          dt = new Table<T>(nCol,0);
+          dt->setRowNames(row1);
+        }
+      }
+      else
+      {
+        if (byRow)
+        {
+          dt = new Table<T>(0,nCol-(names>=0?1:0));
+          dt->addRow(firstLine, sep, names);
+        }
+        else
+        {
+          dt = new Table<T>(nCol-(names>=0?1:0),0);
+          dt->addColumn(firstLine, sep, names);
+        }
+      }
+            
+      // Now read each line:
+      std::string line = FileTools::getNextLine(in);
+      
+      while (!TextTools::isEmpty(line))
+      {
+        if (byRow)
+          dt->addRow(line, sep, names);
+        else
+          dt->addColumn(line, sep, names);
+          
+        line = FileTools::getNextLine(in);
+      }
+      return dt;
+    }
+
+
+    /**
+     * @brief Write a Table object to stream in CVS-like format.
+     *
+     * @param data         The table to write.
+     * @param out          The output stream.
+     * @param byRow        Tell if the table is written by rows.
+     * @param sep          The column delimiter.
+     * @param alignHeaders If true, add a delimiter before the first column header if there is row names.
+     */
+    static void write(const Table& data, std::ostream& out, bool byRow, const std::string& sep = "\t", bool alignHeaders = false)
+    {
+      size_t n = (byRow?data.getNumberOfColumns():data.getNumberOfRows());
+      if (n == 0)
+        return;
+      size_t m = (byRow?data.getNumberOfRows():data.getNumberOfColumns());
+
+      bool frontNames=((byRow && data.hasRowNames()) || (!byRow && data.hasColumnNames()));
+
+      if (byRow && data.hasColumnNames() || (!byRow && data.hasRowNames()))
+      { // Write header
+        std::vector<std::string> names = (byRow?data.getColumnNames():data.getRowNames());
+        
+        if (alignHeaders && frontNames)
+          out << sep;
+        out << names[0];
+        for (size_t i = 1; i < n; i++)
+        {
+          out << sep << names[i];
+        }
+        out << std::endl;
+      }
+      
+      // now write each row (or column):
+        
+      for (size_t i = 0; i < m; i++)
+      {
+        if (frontNames){
+          out << (byRow?data.getRowName(i):data.getColumnName(i)) << sep;
+        }
+
+        out << (byRow?data(i, 0):data(0, i));
+        for (size_t j = 1; j < n; j++)
+        {
+          out << sep << (byRow?data(i, j):data(j, i));
+        }
+        out << std::endl;
+      }
+    }
+
+    static void write(const Table& data, bpp::OutputStream& out, bool byRow, const std::string& sep = "\t", bool alignHeaders = false)
+    {
+      size_t n = (byRow?data.getNumberOfColumns():data.getNumberOfRows());
+      if (n == 0)
+        return;
+      size_t m = (byRow?data.getNumberOfRows():data.getNumberOfColumns());
+
+      bool frontNames=((byRow && data.hasRowNames()) || (!byRow && data.hasColumnNames()));
+
+      if (byRow && data.hasColumnNames() || (!byRow && data.hasRowNames()))
+      { // Write header
+        std::vector<std::string> names = (byRow?data.getColumnNames():data.getRowNames());
+        
+        if (alignHeaders && frontNames)
+          out << sep;
+        out << names[0];
+        for (size_t i = 1; i < n; i++)
+        {
+          out << sep << names[i];
+        }
+        out.endLine();
+      }
+      
+      // now write each row (or column):
+
+      for (size_t i = 0; i < m; i++)
+      {
+        if (frontNames)
+          out << (byRow?data.getRowName(i):data.getColumnName(i) << sep);
+        
+        out << (byRow?data(i, 0):data(0, i));
+        for (size_t j = 1; j < n; j++)
+        {
+          out << sep << byRow?data(i, j):data(j, i);
+        }
+        out.endLine();
+      }
+    }
+
+  };
+} // end of namespace bpp.
+
+#endif // _Table_H_
+
diff --git a/src/Bpp/Numeric/TableExceptions.h b/src/Bpp/Numeric/TableExceptions.h
new file mode 100644
index 0000000..51c586c
--- /dev/null
+++ b/src/Bpp/Numeric/TableExceptions.h
@@ -0,0 +1,175 @@
+//
+// File: DataTableExceptions.h
+// Created by: Julien Dutheil
+// Created on: Tue Nov 2005 14:10
+// from file DataTable.h
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide classes
+  for numerical calculus.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _TABLEEXCEPTIONS_H_
+#define _TABLEEXCEPTIONS_H_
+
+//#include "VectorTools.h"
+
+// From Utils:
+#include "../Exceptions.h"
+#include "../Text/TextTools.h"
+
+// From the STL:
+#include <string>
+
+namespace bpp
+{
+
+/**
+ * @brief Exception thrown when a given name is not found is a DataTable object.
+ */
+  class TableNameNotFoundException:
+    public Exception
+  {
+  protected:
+    std::string _name;
+		
+  public:
+    TableNameNotFoundException(const std::string & text, const std::string & name) :
+      Exception("TableNameNotFoundException: " + name + ". " + text), _name(name) {}
+    virtual ~TableNameNotFoundException() throw() {}
+
+  public:
+    std::string getName() const { return _name; }		
+  };
+
+/**
+ * @brief Exception thrown when a given row name is not found is a DataTable object.
+ */
+  class TableRowNameNotFoundException:
+    public TableNameNotFoundException
+  {
+  public:
+    TableRowNameNotFoundException(const std::string & text, const std::string & name) :
+      TableNameNotFoundException("TableRowNameNotFoundException: " + name + ". " + text, name) {}
+    virtual ~TableRowNameNotFoundException() throw() {}
+  };
+
+/**
+ * @brief Exception thrown when a given column name is not found is a DataTable object.
+ */
+  class TableColumnNameNotFoundException:
+    public TableNameNotFoundException
+  {
+  public:
+    TableColumnNameNotFoundException(const std::string & text, const std::string & name) :
+      TableNameNotFoundException("TableColumnNameNotFoundException: " + name + ". " + text, name) {}
+    virtual ~TableColumnNameNotFoundException() throw() {}
+  };
+
+/**
+ * @brief Exception thrown when trying to retrieve a row by its name
+ * and no row names have been specified.
+ */
+  class NoTableRowNamesException:
+    public Exception
+  {
+  public:
+    NoTableRowNamesException(const std::string & text) :
+      Exception("NoTableRowNamesException: "+text) {}
+    virtual ~NoTableRowNamesException() throw() {}
+  };
+
+/**
+ * @brief Exception thrown when trying to retrieve a column by its name
+ * and no column names have been specified.
+ */
+  class NoTableColumnNamesException:
+    public Exception
+  {
+  public:
+    NoTableColumnNamesException(const std::string & text) :
+      Exception("NoTableColumnNamesException: "+text) {}
+    virtual ~NoTableColumnNamesException() throw() {}
+  };
+
+/**
+ * @brief General exception class dealing with row names.
+ */
+  class TableRowNamesException:
+    public Exception
+  {
+  public:
+    TableRowNamesException(const std::string & text) :
+      Exception("TableRowNamesException: "+text) {}
+    virtual ~TableRowNamesException() throw() {}
+  };
+
+/**
+ * @brief General exception class dealing with column names.
+ */
+  class TableColumnNamesException:
+    public Exception
+  {
+  public:
+    TableColumnNamesException(const std::string & text) :
+      Exception("TableColumnNamesException: "+text) {}
+    virtual ~TableColumnNamesException() throw() {}
+  };
+
+/**
+ * @brief Exception thrown when attempting to duplicate a row name.
+ */
+  class DuplicatedTableRowNameException:
+    public Exception
+  {
+  public:
+    DuplicatedTableRowNameException(const std::string & text) :
+      Exception("DuplicatedTableRowNameException: "+text) {}
+    virtual ~DuplicatedTableRowNameException() throw() {}
+  };
+
+/**
+ * @brief Excpetion thrown when attempting to duplicate a column name.
+ */
+  class DuplicatedTableColumnNameException:
+    public Exception
+  {
+  public:
+    DuplicatedTableColumnNameException(const std::string & text) :
+      Exception("DuplicatedTableColumnNameException: "+text) {}
+    virtual ~DuplicatedTableColumnNameException() throw() {}
+  };
+
+} //end of namespace bpp.
+
+#endif //_TABLEEXCEPTIONS_H_
+
diff --git a/src/Bpp/Numeric/TransformedParameter.h b/src/Bpp/Numeric/TransformedParameter.h
new file mode 100644
index 0000000..88ae8e7
--- /dev/null
+++ b/src/Bpp/Numeric/TransformedParameter.h
@@ -0,0 +1,312 @@
+//
+// File: TransformedParameter.h
+// Created by: Julien Dutheil
+// Created on: Fri Jan 30 09:42 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _TRANSFORMEDPARAMETER_H_
+#define _TRANSFORMEDPARAMETER_H_
+
+#include "Parameter.h"
+#include "NumConstants.h"
+
+#include <cmath>
+
+namespace bpp
+{
+
+/**
+ * @brief The TransformedParameter abstract class.
+ *
+ * This class extends the Parameter class.
+ * A transformed parameter does not have a constraint attached to it, and is supposed to range from -inf to +inf.
+ * It uses a transformation in order to do this, typically using a bijection.
+ * The exact function used to achieve the transformation depends on the implementation of the interface.
+ */ 
+class TransformedParameter:
+  public Parameter
+{
+	public:
+    TransformedParameter(const std::string& name, double value):
+      Parameter(name, value) {}
+		
+		TransformedParameter* clone() const = 0;
+	
+	public:
+    /**
+     * @brief Set the value of the parameter using the orignal coordinate system.
+     *
+     * @param value Parameter value in original coordinates.
+     * @throw ConstraintException if the value is not correct.
+     */
+    virtual void setOriginalValue(double value) throw (ConstraintException) = 0;
+
+    /**
+     * @return The current value of the parameter in orignal coordinates.
+     */
+    virtual double getOriginalValue() const = 0;
+
+    /**
+     * @return The first order derivative of the transformation at the original point.
+     * @throw NotImplementedException if the transformation does not support derivation
+     * or if the derivation was not implemented.
+     */
+    virtual double getFirstOrderDerivative() const throw (NotImplementedException) = 0;
+    
+    /**
+     * @return The second order derivative of the transformation at the original point.
+     * @throw NotImplementedException if the transformation does not support derivation
+     * or if the derivation was not implemented.
+     */
+    virtual double getSecondOrderDerivative() const throw (NotImplementedException) = 0;
+};
+
+/**
+ * @brief Parameter transformation from ] b, +inf [ or ] -inf, b [ to ]-inf, + inf [.
+ *
+ * The equation of the tranformation is 
+ * @f[
+ * x' = \begin{cases}
+ *   \log(a\cdot(x-b)) & \text{if $x < b+1$},\\
+ *   a(x-1-b)          & \text{if $a \geq b+1$}.
+ * \end{cases}
+ * @f]
+ * for a transformation from ] b, +inf [ to ]-inf, + inf [.
+ * The 'b' parameter is the lower bound and 'a' is a scaling factor set to 1 by default.
+ * For a transformation from  ] -inf, b [, the transformation is then
+ * @f[
+ * x' = \begin{cases}
+ *   -\log(-a\cdot(x-b)) & \text{if $x < b-1$},\\
+ *   -a(x-1-b)           & \text{if $a \geq b-1$}.
+ * \end{cases}
+ * @f]
+ */
+class RTransformedParameter:
+  public TransformedParameter
+{
+  private:
+    double scale_;
+    double bound_;
+    bool positive_;
+
+  public:
+    /**
+     * @brief Build a new RTransformedParameter, with given bound and scale.
+     *
+     * @param name the name of the parameter.
+     * @param value the value of th eparameter, in orginal coordinates.
+     * @param bound the inerval bound to use.
+     * @param positive tell if the original interval is positive or negative.
+     * @param scale the scaling factor.
+     */
+    RTransformedParameter(const std::string& name, double value, double bound = 0, bool positive = true, double scale = 1):
+      TransformedParameter(name, 1.),
+      scale_(scale),
+      bound_(bound),
+      positive_(positive)
+    {
+      setOriginalValue(value);
+    }
+
+    RTransformedParameter* clone() const { return new RTransformedParameter(*this); }
+
+  public:
+    void setOriginalValue(double value) throw (ConstraintException) 
+    {
+      if (positive_ ? value <= bound_ : value >= bound_) throw ConstraintException("RTransformedParameter::setValue", this, value);
+      if (positive_  & (value < 1 + bound_)) setValue(log(scale_ * (value - bound_)));
+      if (positive_  & (value >= 1 + bound_)) setValue(scale_ * (value - 1. - bound_));
+      if (!positive_ & (value > -1 + bound_)) setValue(log(-scale_ * (value - bound_)));
+      if (!positive_ & (value <= -1 + bound_)) setValue(-scale_ * (value - 1. - bound_));
+    }
+
+    double getOriginalValue() const
+    {
+      double x = getValue();
+      if (positive_)
+        if(x < 0) return exp(x) / scale_ + bound_;
+        else      return x / scale_ + 1. + bound_;
+      else 
+        if(x < 0) return - exp(-x) / scale_ + bound_;
+        else      return - x / scale_ - 1. + bound_;
+    }
+
+    double getFirstOrderDerivative() const throw (NotImplementedException)
+    {
+      double x = getValue();
+      if (positive_)
+        if(x < 0) return exp(x) / scale_;
+        else      return 1. / scale_;
+      else 
+        if(x < 0) return exp(-x) / scale_;
+        else      return - 1. / scale_;
+    }
+
+    double getSecondOrderDerivative() const throw (NotImplementedException)
+    {
+      double x = getValue();
+      if (positive_)
+        if(x < 0) return exp(x) / scale_;
+        else      return 0;
+      else 
+        if(x < 0) return - exp(-x) / scale_;
+        else      return 0;
+    }
+
+};
+
+/**
+ * @brief Parameter transformation from ] a, b [ to ]-inf, + inf [.
+ *
+ * The equation of the tranformation is 
+ * @f[
+ * x' = s\tan\left(\pi\frac{x-a}{b-a} - \frac{\pi}{2}\right)
+ * @f]
+ * The 'a' and 'b' parameters are the lower and upper bounds and 's' is a scaling factor set to 1 by default.
+ * If the hyperbolic option is set to true (the default), then the following transformation is used instead:
+ * @f[
+ * x' = s\,\text{atanh}\left(2\frac{x-a}{b-a} - 1\right)
+ * @f]
+ *
+ */
+class IntervalTransformedParameter:
+  public TransformedParameter
+{
+  private:
+    double scale_;
+    double lowerBound_;
+    double upperBound_;
+    bool hyper_;
+    double tiny_;
+
+  public:
+    /**
+     * @brief Build a new IntervalTransformedParameter, with given bounds and scale.
+     *
+     * @param name the name of the parameter.
+     * @param value the value of th eparameter, in orginal coordinates.
+     * @param lowerBound the inerval lower bound to use.
+     * @param upperBound the inerval lower bound to use.
+     * @param scale the scaling factor.
+     * @param hyper tell if the hyberbolic function should be used (true by default).
+     */
+    IntervalTransformedParameter(const std::string& name, double value, double lowerBound = 0, double upperBound = 1, double scale = 1, bool hyper = true):
+      TransformedParameter(name, hyper ?
+          scale * atanh(2. * (value - lowerBound) / (upperBound - lowerBound) - 1.) :
+          scale * tan(NumConstants::PI() * (value - lowerBound)/(upperBound - lowerBound) - NumConstants::PI() / 2.)),
+      scale_(scale),
+      lowerBound_(lowerBound),
+      upperBound_(upperBound),
+      hyper_(hyper),
+      tiny_(NumConstants::TINY())
+    {}
+
+    IntervalTransformedParameter* clone() const { return new IntervalTransformedParameter(*this); }
+
+  public:
+    void setOriginalValue(double value) throw (ConstraintException) 
+    {
+      if (value <= lowerBound_ || value >= upperBound_) throw ConstraintException("IntervalTransformedParameter::setValue", this, value);
+      setValue(hyper_ ?
+          scale_ * atanh(2. * (value - lowerBound_) / (upperBound_ - lowerBound_) - 1.) :
+          scale_ * std::tan(NumConstants::PI() * (value - lowerBound_)/(upperBound_ - lowerBound_) - NumConstants::PI() / 2.));
+    }
+
+    double getOriginalValue() const
+    {
+      double x = getValue();
+      double x2 = hyper_ ?
+        (tanh(x / scale_) + 1.) * (upperBound_ - lowerBound_) / 2. + lowerBound_ :
+        (atan(x / scale_) + NumConstants::PI() / 2.) * (upperBound_ - lowerBound_) / NumConstants::PI() + lowerBound_;
+      return x2;
+    }
+
+
+    double getFirstOrderDerivative() const throw (NotImplementedException)
+    {
+      double x = getValue();
+      double x2 = hyper_ ?
+        1. / (pow(cosh(x / scale_), 2)) * (upperBound_ - lowerBound_) / (2. * scale_) :
+        (upperBound_ - lowerBound_) / (NumConstants::PI() * scale_ * (pow(x / scale_, 2) + 1.));
+      return x2;
+    }
+    double getSecondOrderDerivative() const throw (NotImplementedException)
+    {
+      double x = getValue();
+      double x2 = hyper_ ?
+        - 1. / (pow(cosh(x / scale_), 2)) * tanh(x / scale_) * (upperBound_ - lowerBound_) / (scale_ * scale_) :
+        -2. * x * (upperBound_ - lowerBound_) / (NumConstants::PI() * pow(scale_, 3) * pow((pow(x / scale_, 2) + 1.), 2));
+      return x2;
+    }
+};
+
+/**
+ * @brief 'Placebo' parameter transformation from ] b, +inf [ or ] -inf, b [ to ]-inf, + inf [.
+ *
+ * The class create a Transformed parameter which is exactly the same as a standard parameter.
+ * It only implements the setOriginalValue and getOriginalValue methods, and remove the constraint.
+ */
+class PlaceboTransformedParameter:
+  public TransformedParameter
+{
+  public:
+    PlaceboTransformedParameter(const std::string& name, double value):
+      TransformedParameter(name, value)
+    {}
+
+    PlaceboTransformedParameter* clone() const { return new PlaceboTransformedParameter(*this); }
+
+  public:
+    void setOriginalValue(double value) throw (ConstraintException) 
+    {
+      setValue(value);
+    }
+
+    double getOriginalValue() const
+    {
+      return getValue();
+    }
+    
+    double getFirstOrderDerivative() const throw (NotImplementedException) { return 1.; }
+    
+    double getSecondOrderDerivative() const throw (NotImplementedException) { return 0.; }
+};
+
+
+} //end of namespace bpp.
+
+#endif	//_TRANSFORMEDPARAMETER_H_
+
diff --git a/src/Bpp/Numeric/VectorExceptions.h b/src/Bpp/Numeric/VectorExceptions.h
new file mode 100644
index 0000000..b3fe62a
--- /dev/null
+++ b/src/Bpp/Numeric/VectorExceptions.h
@@ -0,0 +1,155 @@
+//
+// File: VectorExceptions.h
+// Created by: Julien Dutheil
+// Created on: 2003
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _VECTOREXCEPTIONS_H_
+#define _VECTOREXCEPTIONS_H_
+
+#include "../Exceptions.h"
+#include "../Text/TextTools.h"
+
+//From the STL/
+#include <string>
+#include <vector>
+
+namespace bpp
+{
+
+/**
+ * @brief General Exception dealing with vectors.
+ */
+template<class T>
+class VectorException :
+  public Exception
+{
+
+	protected:
+		const std::vector<T> * vect_;
+			
+	public:
+		VectorException(const std::string& text, const std::vector<T>* vect = 0) :
+			Exception("VectorException: " + text),
+			vect_(vect) {};
+
+    VectorException(const VectorException& ve): Exception(ve), vect_(ve.vect_) {}
+    VectorException& operator=(const VectorException& ve)
+    {
+      Exception::operator=(ve);
+      vect_ = ve.vect_;
+      return *this;
+    }
+	
+		virtual ~VectorException() throw () {};
+		
+	public:
+		virtual const std::vector<T>* getVector() const { return vect_; }
+};
+
+/**
+ * @brief Exception thrown when an empty vector was found.
+ */
+template<class T>
+class EmptyVectorException :
+  public VectorException<T>
+{
+
+	public:
+		EmptyVectorException(const std::string& text, const std::vector<T>* vect = 0) :
+			VectorException<T>("EmptyVectorException: " + text, vect) {};
+	
+		virtual ~EmptyVectorException() throw () {}
+};
+
+/**
+ * @brief Exception thrown when a dimension problem occured.
+ */
+class DimensionException :
+  public Exception
+{
+	private:
+		size_t dimension_;
+		size_t correctDimension_; 
+			
+	public:
+		DimensionException(const std::string& text, size_t dimension, size_t correctDimension) :
+		    Exception("DimensionException (found " + TextTools::toString(dimension) + ", should be " + TextTools::toString(correctDimension) + ") " + text),
+        dimension_(dimension),
+        correctDimension_(correctDimension) {};
+	
+		virtual ~DimensionException() throw () {}
+
+	public:
+		virtual size_t getDimension() const { return dimension_; }
+		virtual size_t getCorrectDimension() const { return correctDimension_; }
+};
+
+/**
+ * @brief Exception thrown when a given element was not found in the vector.
+ */
+template<class T> class ElementNotFoundException :
+  public VectorException<T>
+{
+
+	private:
+		const T* element_;
+			
+	public:
+		ElementNotFoundException(const std::string& text, const std::vector<T>* vect = 0, const T* element = 0) :
+			VectorException<T>("ElementNotFoundException: " + text, vect),
+			element_(element) {};
+
+    ElementNotFoundException(const ElementNotFoundException& enfe):
+      VectorException<T>(enfe), element_(enfe.element_) {}
+    
+    ElementNotFoundException& operator=(const ElementNotFoundException& enfe)
+    {
+      VectorException<T>::operator=(enfe);
+      element_ = enfe.element_;
+      return *this;
+    }
+
+		virtual ~ElementNotFoundException() throw () {};
+		
+	public:
+		virtual const T* getElement() const { return element_; }
+};
+
+} //end of namespace bpp.
+
+#endif //_VECTOREXCEPTIONS_H_
+
diff --git a/src/Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.cpp b/src/Bpp/Numeric/VectorTools.cpp
similarity index 53%
rename from src/Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.cpp
rename to src/Bpp/Numeric/VectorTools.cpp
index 7b23c60..a4e9f08 100644
--- a/src/Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.cpp
+++ b/src/Bpp/Numeric/VectorTools.cpp
@@ -1,14 +1,14 @@
 //
-// File: MiyataAAChemicalDistance.cpp
+// File: VectorTools.cpp
 // Created by: Julien Dutheil
-// Created on: Mon Feb 21 17:42 2005
+// Created on: Fri Mar 14 14:16:32 2003
 //
 
 /*
    Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
    This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
+   for numerical calculus.
 
    This software is governed by the CeCILL  license under French law and
    abiding by the rules of distribution of free software.  You can  use,
@@ -37,56 +37,65 @@
    knowledge of the CeCILL license and that you accept its terms.
  */
 
-// from the STL:
-#include <string>
+// From Utils:
+#include "../Text/TextTools.h"
 
-using namespace std;
+#include "VectorTools.h"
+using namespace bpp;
 
-#include "MiyataAAChemicalDistance.h"
-#include "../Alphabet/AlphabetTools.h"
-#include <Bpp/Numeric/NumTools.h>
+// From the STL:
+#include <cmath>
+#include <iostream>
+using namespace std;
 
-using namespace bpp;
+/******************************************************************************/
 
-MiyataAAChemicalDistance::MiyataAAChemicalDistance() :
-  distanceMatrix_(20, 20),
-  alpha_(&AlphabetTools::PROTEIN_ALPHABET),
-  sym_(true)
+vector<double> VectorTools::breaks(const vector<double>& v, unsigned int n)
 {
-  #include "__MiyataMatrixCode"
+  vector<double> out;
+  vector<double> r = VectorTools::range(v);
+  double part = (r[1] - r[0]) / n;
+  for (unsigned int i = 0; i < n; ++i)
+  {
+    out.push_back(r[0] + (part * i));
+  }
+  out.push_back(r[1]);
+  return out;
 }
 
-double MiyataAAChemicalDistance::getIndex(int state1, int state2) const
-throw (BadIntException)
-{
-  size_t stateIndex1 = alpha_->getStateIndex(state1);
-  size_t stateIndex2 = alpha_->getStateIndex(state2);
-  double d = distanceMatrix_(stateIndex1, stateIndex2);
-  return sym_ ? NumTools::abs<double>(d) : d;
-}
+/******************************************************************************/
 
-double MiyataAAChemicalDistance::getIndex(const string& state1, const string& state2) const
-throw (BadCharException)
+bool VectorTools::test()
 {
-  double d = distanceMatrix_(
-      static_cast<size_t>(alpha_->charToInt(state1)),
-      static_cast<size_t>(alpha_->charToInt(state2)));
-  return sym_ ? NumTools::abs(d) : d;
-}
+  vector<double> x1(5);
+  vector<double> x2(5);
+  x1[0] = -3.4;
+  x1[1] =  1.8;
+  x1[2] = -2.1;
+  x1[3] = -2.5;
+  x1[4] =  1.0;
 
-Matrix<double>* MiyataAAChemicalDistance::getIndexMatrix() const
-{
-  RowMatrix<double>* m = new RowMatrix<double>(distanceMatrix_);
-  if (sym_)
-  {
-    for (unsigned int i = 0; i < 20; i++)
-    {
-      for (unsigned int j = 0; j < 20; j++)
-      {
-        (*m)(i, j) = NumTools::abs<double>((*m)(i, j));
-      }
-    }
-  }
-  return m;
+  x2[0] = -5.3;
+  x2[1] = -4.8;
+  x2[2] =  2.7;
+  x2[3] =  7.2;
+  x2[4] =  0.4;
+
+  print(x1);
+  print(x2);
+  double m1 = mean<double, double>(x1);
+  double m2 = mean<double, double>(x2);
+  double v1 = var<double, double>(x1);
+  double v2 = var<double, double>(x2);
+  cout << "Mean x1 = " << m1 << "\tVar x1 = " << v1 << endl;
+  cout << "Mean x2 = " << m2 << "\tVar x2 = " << v2 << endl;
+  cov<double, double>(x1, x2);
+  cor<double, double>(x1, x2);
+  cos<double, double>(x1, x2);
+  shannon<double, double>(x1);
+  return m1 == -0.2 && m2 == 0.04 && v1 == 6.565 && v2 == 27.603;
 }
 
+/******************************************************************************/
+
+
diff --git a/src/Bpp/Numeric/VectorTools.h b/src/Bpp/Numeric/VectorTools.h
new file mode 100644
index 0000000..8bc62df
--- /dev/null
+++ b/src/Bpp/Numeric/VectorTools.h
@@ -0,0 +1,2007 @@
+//
+// File: VectorTools.h
+// Created by: Julien Dutheil
+// Created on: Fri Mar 14 14:16:32 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _VECTORTOOLS_H_
+#define _VECTORTOOLS_H_
+
+#include "VectorExceptions.h"
+#include "NumTools.h"
+#include "AdaptiveKernelDensityEstimation.h"
+#include "Matrix/Matrix.h"
+#include "../Io/OutputStream.h"
+#include "../App/ApplicationTools.h"
+
+// From the STL:
+#include <vector>
+#include <map>
+#include <cmath>
+#include <algorithm>
+#include <complex>
+
+namespace bpp
+{
+typedef std::vector<std::complex<double> > Vcomplex;
+typedef std::vector<Vcomplex> VVcomplex;
+typedef std::vector<VVcomplex> VVVcomplex;
+
+typedef std::vector<std::complex<long double> > Vlcomplex;
+typedef std::vector<Vlcomplex> VVlcomplex;
+typedef std::vector<VVlcomplex> VVVlcomplex;
+
+typedef std::vector<double> Vdouble;
+typedef std::vector<Vdouble> VVdouble;
+typedef std::vector<VVdouble> VVVdouble;
+typedef std::vector<VVVdouble> VVVVdouble;
+
+typedef std::vector<long double> Vldouble;
+typedef std::vector<Vldouble> VVldouble;
+typedef std::vector<VVldouble> VVVldouble;
+typedef std::vector<VVVldouble> VVVVldouble;
+
+typedef std::vector<int> Vint;
+typedef std::vector<Vint> VVint;
+typedef std::vector<VVint> VVVint;
+typedef std::vector<VVVint> VVVVint;
+
+typedef std::vector<unsigned int> Vuint;
+typedef std::vector<Vint> VVuint;
+typedef std::vector<VVint> VVVuint;
+typedef std::vector<VVVint> VVVVuint;
+
+/**
+ * @name Element-wise operations.
+ * @{
+ */
+
+template<class T>
+std::vector<T>  operator+(const std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  size_t size;
+  if (v1.size() != v2.size())
+  {
+    throw DimensionException("VectorTools::operator+", v1.size(), v2.size());
+  }
+  else
+  {
+    size = v1.size();
+  }
+  std::vector<T> result(size);
+  for (size_t i = 0; i < size; i++)
+  {
+    result[i] = v1[i] + v2[i];
+  }
+  return result;
+}
+
+template<class T>
+std::vector<T> operator-(const std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  size_t size;
+  if (v1.size() != v2.size())
+  {
+    throw DimensionException("VectorTools::operator-", v1.size(), v2.size());
+  }
+  else
+  {
+    size = v1.size();
+  }
+  std::vector<T> result(size);
+  for (size_t i = 0; i < size; i++)
+  {
+    result[i] = v1[i] - v2[i];
+  }
+  return result;
+}
+
+template<class T>
+std::vector<T> operator*(const std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  size_t size;
+  if (v1.size() != v2.size())
+  {
+    throw DimensionException("VectorTools::operator*", v1.size(), v2.size());
+  }
+  else
+  {
+    size = v1.size();
+  }
+  std::vector<T> result(size);
+  for (size_t i = 0; i < size; i++)
+  {
+    result[i] = v1[i] * v2[i];
+  }
+  return result;
+}
+
+template<class T>
+std::vector<T> operator/(const std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  size_t size;
+  if (v1.size() != v2.size())
+  {
+    throw DimensionException("VectorTools::operator/", v1.size(), v2.size());
+  }
+  else
+  {
+    size = v1.size();
+  }
+  std::vector<T> result(size);
+  for (size_t i = 0; i < size; i++)
+  {
+    result[i] = v1[i] / v2[i];
+  }
+  return result;
+}
+
+
+template<class T, class C>
+std::vector<T> operator+(const std::vector<T>& v1, const C& c)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = v1[i] + c;
+  }
+  return result;
+}
+template<class T, class C>
+std::vector<T> operator+(const C& c, const std::vector<T>& v1)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = c + v1[i];
+  }
+  return result;
+}
+
+template<class T, class C>
+std::vector<T> operator-(const std::vector<T>& v1, const C& c)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = v1[i] - c;
+  }
+  return result;
+}
+template<class T, class C>
+std::vector<T> operator-(const C& c, const std::vector<T>& v1)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = c - v1[i];
+  }
+  return result;
+}
+
+template<class T, class C>
+std::vector<T> operator*(const std::vector<T>& v1, const C& c)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = v1[i] * c;
+  }
+  return result;
+}
+template<class T, class C>
+std::vector<T> operator*(const C& c, const std::vector<T>& v1)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = c * v1[i];
+  }
+  return result;
+}
+
+template<class T, class C>
+std::vector<T> operator/(const std::vector<T>& v1, const C& c)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = v1[i] / c;
+  }
+  return result;
+}
+template<class T, class C>
+std::vector<T> operator/(const C& c, const std::vector<T>& v1)
+{
+  std::vector<T> result(v1.size());
+  for (size_t i = 0; i < result.size(); i++)
+  {
+    result[i] = c / v1[i];
+  }
+  return result;
+}
+
+
+template<class T>
+void operator+=(std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] += v2[i];
+  }
+}
+
+template<class T>
+void operator-=(std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] -= v2[i];
+  }
+}
+
+template<class T>
+void operator*=(std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] *= v2[i];
+  }
+}
+
+template<class T>
+void operator/=(std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] /= v2[i];
+  }
+}
+
+template<class T, class C>
+void operator&=(std::vector<T>& v1, const C& c)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] = c;
+  }
+}
+
+template<class T, class C>
+void operator+=(std::vector<T>& v1, const C& c)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] += c;
+  }
+}
+
+template<class T, class C>
+void operator-=(std::vector<T>& v1, const C& c)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] -= c;
+  }
+}
+
+template<class T, class C>
+void operator*=(std::vector<T>& v1, const C& c)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] *= c;
+  }
+}
+
+template<class T, class C>
+void operator/=(std::vector<T>& v1, const C& c)
+{
+  for (size_t i = 0; i < v1.size(); i++)
+  {
+    v1[i] /= c;
+  }
+}
+/** @} */
+
+/******************************************************************************/
+
+class VectorTools
+{
+public:
+  VectorTools() {}
+  virtual ~VectorTools() {}
+
+public:
+  /**
+   * @name Matrix-like functions to resize arrays.
+   *
+   * @{
+   */
+  template<class T>
+  static void resize2(VVdouble& vv, size_t n1, size_t n2)
+  {
+    vv.resize(n1);
+    for (size_t i = 0; i < n1; i++) { vv[i].resize(n2); }
+  }
+
+  template<class T>
+  static void resize3(VVVdouble& vvv, size_t n1, size_t n2, size_t n3)
+  {
+    vvv.resize(n1);
+    for (size_t i = 0; i < n1; i++)
+    {
+      vvv[i].resize(n2);
+      for (size_t j = 0; j < n2; j++)
+      {
+        vvv[i][j].resize(n3);
+      }
+    }
+  }
+
+  static void resize4(VVVVdouble& vvvv, size_t n1, size_t n2, size_t n3, size_t n4)
+  {
+    vvvv.resize(n1);
+    for (size_t i = 0; i < n1; i++)
+    {
+      vvvv[i].resize(n2);
+      for (size_t j = 0; j < n2; j++)
+      {
+        vvvv[i][j].resize(n3);
+        for (size_t k = 0; k < n3; k++)
+        {
+          vvvv[i][j][k].resize(n4);
+        }
+      }
+    }
+  }
+  /** @} */
+
+  template<class T>
+  static void fill(std::vector<T>& v, T value)
+  {
+    for (typename std::vector<T>::iterator it = v.begin(); it < v.end(); it++)
+    {
+      *it = value;
+    }
+  }
+
+  /**
+   * @brief Build a sequence std::vector.
+   *
+   * Build a std::vector from a value to another with a specified step.
+   * This works for numerical values for which additions, subtractions and division
+   * makes sens.
+   *
+   * @param from The begining.
+   * @param to The end.
+   * @param by The step.
+   * @return A std::vector containing the sequence.
+   */
+  template<class T>
+  static std::vector<T> seq(T from, T to, T by)
+  {
+    std::vector<T> v;
+    if (from < to)
+    {
+      // for (T i = from ; i <= to ; i += by) {           // Not good for double, 'to'
+      for (T i = from; i <= to + (by / 100); i += by)
+      { // must be a little bit larger
+        v.push_back(i);
+      }
+    }
+    else
+    {
+      for (T i = from; i >= to - (by / 100); i -= by)
+      {
+        v.push_back(i);
+      }
+    }
+    return v;
+  }
+
+  /**
+   * @brief Send the position of the first occurence of 'which'.
+   *
+   * Comparisons are performed using the == operator.
+   * Maximum complexity: O(v.size()).
+   *
+   * @param v The std::vector to search.
+   * @param which The element to search.
+   * @return The position of which in v.
+   */
+  template<class T>
+  static size_t which(const std::vector<T>& v, const T& which) throw (ElementNotFoundException<T> )
+  {
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      if (v[i] == which) return i;
+    }
+    throw ElementNotFoundException<T>("VectorTools::which.", &v, &which);
+  }
+
+  /**
+   * @brief Send the positions of all occurences of 'which'.
+   *
+   * Comparisons are performed using the == operator.
+   * Complexity: O(v.size()).
+   *
+   * @param v The std::vector to search.
+   * @param which The element to search.
+   * @return A std::vector containing the positions of which in v.
+   */
+  template<class T>
+  static std::vector<size_t> whichAll(const std::vector<T>& v, const T& which) throw (ElementNotFoundException<T> )
+  {
+    std::vector<size_t> w;
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      if (v[i] == which) w.push_back(i);
+    }
+    if (w.size())
+      return w;
+    throw ElementNotFoundException<T>("VectorTools::whichAll.", &v, &which);
+  }
+
+  /**
+   * @brief Send a new std::vector with unique elements.
+   *
+   * The input std::vector is copied, and the copy is sorted using QuickSort algorithm.
+   * A one-pass loop then look for duplicates and copy unique element to a result std::vector.
+   * The output std::vector is hence sorted.
+   *
+   * If v is empty, it is passed 'as is' in return (after being copied).
+   *
+   * @param v the std::vector to parse.
+   */
+  template<class T>
+  static std::vector<T> unique(const std::vector<T>& v)
+  {
+    if (v.size() == 0) return v;
+    std::vector<T> sortedV(v.begin(), v.end());
+    sort(sortedV.begin(), sortedV.end());
+    std::vector<T> uniq;
+    uniq.push_back(sortedV[0]);
+    for (size_t i = 1; i < sortedV.size(); i++)
+    {
+      if (sortedV[i] != sortedV[i - 1]) uniq.push_back(sortedV[i]);
+    }
+    return uniq;
+  }
+
+  /**
+   * @brief Tell if the std::vector as unique elements.
+   *
+   * The input std::vector is copied, and the copy is sorted using QuickSort algorithm.
+   * A one-pass loop then look for duplicates.
+   *
+   * If v is empty, the method returns 'true'.
+   *
+   * @param v the std::vector to parse.
+   */
+  template<class T>
+  static bool isUnique(const std::vector<T>& v)
+  {
+    if (v.size() == 0) return true;
+    std::vector<T> sortedV(v.begin(), v.end());
+    sort(sortedV.begin(), sortedV.end());
+    for (size_t i = 1; i < sortedV.size(); i++)
+    {
+      if (sortedV[i] == sortedV[i - 1]) return false;
+    }
+    return true;
+  }
+
+  /**
+   * @author Laurent Gueguen
+   * @param v1 the std::vector of elements,
+   * @param v2 the std::vector of the selected positions
+   * @return the std::vector of the selected elements, in the order of the
+   *  required positions
+   */
+  template<class T>
+  static std::vector<T> extract(const std::vector<T>& v1, const std::vector<int>& v2)
+  {
+    std::vector<T> v(v2.size());
+    for (size_t i = 0; i < v2.size(); i++)
+    {
+      v[i] = v1[v2[i]];
+    }
+    return v;
+  }
+
+  /**
+   * @brief Count each element of a std::vector.
+   *
+   * @return A map with keys = unique std::vector values and values = count for each std::vector value.
+   * @param v the std::vector to parse.
+   */
+  template<class T>
+  static std::map<T, size_t> countValues(const std::vector<T>& v)
+  {
+    std::map<T, size_t> c;
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      c[v[i]]++;
+    }
+    return c;
+  }
+
+  /**
+   * @brief Get the break points for a given number of classes.
+   *
+   * Given a std::vector of values, return the values that cut the range of values
+   * in a given number of classes.
+   *
+   * @param v The std::vector to parse.
+   * @param n The expected number of classes.
+   * @return a std::vector of size = n + 1 containing the breaking points.
+   */
+  static std::vector<double> breaks(const std::vector<double>& v, unsigned int n);
+
+  /**
+   * @brief Get the optimal class number following Scott's method.
+   *
+   * Use Scott's (1979) method to compute the optimal class number for histogram.
+   *
+   * Scott, D.W. (1979) On optimal and data-based histograms. Biometrika, 66, 605¿610.
+   *
+   * @param v The std::vector to parse.
+   * @return The number of classes.
+   */
+  template<class T>
+  static size_t nclassScott(const std::vector<T>& v)
+  {
+    std::vector<T> r1 = VectorTools::range(v);
+    T r = r1[1] - r1[0];
+    double n = v.size();
+    double h = 3.5 * VectorTools::sd<T, double>(v) * std::pow(n, -1. / 3);
+    return (size_t) ceil(r / h);
+  }
+
+  /**
+   * @return The product of all elements in a std::vector.
+   * @param v1 A std::vector.
+   */
+  template<class T>
+  static T prod(const std::vector<T>& v1)
+  {
+    T p = 1;
+    for (size_t i = 0; i < v1.size(); i++) { p *= v1[i]; }
+    return p;
+  }
+
+  /**
+   * @return The cumulative product of all elements in a std::vector.
+   * @param v1 A std::vector.
+   * @author Julien Dutheil
+   */
+  template<class T>
+  static std::vector<T> cumProd(const std::vector<T>& v1)
+  {
+    std::vector<T> p(v1.size());
+    if (v1.size() == 0) return p;
+    p[0] = v1[0];
+    for (size_t i = 1; i < v1.size(); i++) { p[i] = v1[i] * p[i - 1]; }
+    return p;
+  }
+
+  /**
+   * @return The sum of all elements in a std::vector.
+   * @param v1 A std::vector.
+   */
+  template<class T>
+  static T sum(const std::vector<T>& v1)
+  {
+    T s = 0;
+    for (size_t i = 0; i < v1.size(); i++) { s += v1[i]; }
+    return s;
+  }
+
+  /**
+   * @return The cumulative sum of all elements in a std::vector.
+   * @param v1 A std::vector.
+   * @author Julien Dutheil
+   */
+  template<class T>
+  static std::vector<T> cumSum(const std::vector<T>& v1)
+  {
+    std::vector<T> s(v1.size());
+    if (v1.size() == 0) return s;
+    s[0] = v1[0];
+    for (size_t i = 1; i < v1.size(); i++) { s[i] = v1[i] + s[i - 1]; }
+    return s;
+  }
+
+  /**
+   * @author Laurent Gueguen
+   * @return Log-normalize std::vector v1, ie add a constant to the elements of v
+   *  such that @f$\sum_i(\exp(v_i)) = 1 at f$.
+   * @param v std::vector.
+   */
+  template<class T>
+  static void logNorm(std::vector<T>& v)
+  {
+    T M = max(v);
+    T x = std::exp(v[0] - M);
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      x += std::exp(v[i] - M);
+    }
+    v -= M + std::log(x);
+  }
+
+  /**
+   * @author Laurent Gueguen
+   * @return From std::vector v1, return @f$\log(\sum_i(\exp(v1_i)))@f$.
+   * @param v1 a std::vector.
+   */
+  template<class T>
+  static T logSumExp(const std::vector<T>& v1)
+  {
+    T M = max(v1);
+    if (std::isinf(M))
+      return M;
+    
+    T x = std::exp(v1[0] - M);
+    for (size_t i = 1; i < v1.size(); i++)
+    {
+      x += std::exp(v1[i] - M);
+    }
+    return std::log(x) + M;
+  }
+
+  /**
+   * @author Laurent Gueguen
+   * @return From std::vector v1, return @f$\log(\sum_i(v2_i * \exp(v1_i)))@f$.
+   * @param v1 a std::vector.
+   * @param v2 another std::vector.
+   */
+  template<class T>
+  static T logSumExp(const std::vector<T>& v1, const std::vector<T>& v2)
+  {
+    size_t size;
+    if (v1.size() != v2.size())
+      throw DimensionException("VectorTools::logsumexp", v1.size(), v2.size());
+    else
+      size = v1.size();
+
+    T M = max(v1);
+    if (std::isinf(M))
+      throw BadNumberException("VectorTools::logSumExp", M);
+    
+    T x = v2[0] * std::exp(v1[0] - M);
+    for (size_t i = 1; i < size; i++)
+    {
+      x += v2[i] * std::exp(v1[i] - M);
+    }
+    return std::log(x) + M;
+  }
+
+  /**
+   * @author Laurent Gueguen
+   * @return From std::vector v1, return @f$\log(\textrm{mean}_i(\exp(v1_i)))@f$.
+   * @param v1 a std::vector.
+   */
+  template<class T>
+  static T logMeanExp(const std::vector<T>& v1)
+  {
+    T M = max(v1);
+    if (std::isinf(M))
+      return M;
+
+    T x = std::exp(v1[0] - M);
+    for (size_t i = 1; i < v1.size(); i++)
+    {
+      x += std::exp(v1[i] - M);
+    }
+    return std::log(x) + M - std::log(v1.size());
+  }
+
+
+  /**
+   * @author Laurent Gueguen
+   * @return From std::vector v1, return @f$\sum_i(\exp(v1_i))@f$.
+   * @param v1 a std::vector.
+   */
+  template<class T>
+  static T sumExp(const std::vector<T>& v1)
+  {
+    T M = max(v1);
+    if (std::isinf(M))
+      return (M<0?0:M);
+
+    T x = std::exp(v1[0] - M);
+    for (size_t i = 1; i < v1.size(); i++)
+    {
+      x += std::exp(v1[i] - M);
+    }
+    return x * std::exp(M);
+  }
+
+  /**
+   * @author Laurent Gueguen
+   * @return From std::vector v1, return @f$\sum_i(v2_i * \exp(v1_i))@f$.
+   * @param v1 a std::vector.
+   * @param v2 another std::vector.
+   */
+  template<class T>
+  static T sumExp(const std::vector<T>& v1, const std::vector<T>& v2)
+  {
+    size_t size;
+    if (v1.size() != v2.size())
+      throw DimensionException("VectorTools::sumExp", v1.size(), v2.size());
+    else
+      size = v1.size();
+
+    T M = max(v1);
+    if (std::isinf(M))
+      throw BadNumberException("VectorTools::sumExp", M);
+
+    T x = v2[0] * std::exp(v1[0] - M);
+    for (size_t i = 1; i < size; i++)
+    {
+      x += v2[i] * std::exp(v1[i] - M);
+    }
+    return x * std::exp(M);
+  }
+
+  /**
+   * @name These methods apply the corresponding function to each element
+   * and return the result in a new std::vector.
+   *
+   * @{
+   */
+  
+  template<class T>
+  static std::vector<T> log(const std::vector<T>& v1)
+  {
+    std::vector<T> v2(v1.size());
+    for (size_t i = 0; i < v2.size(); i++) { v2[i] = VectorTools::log(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static double log(const T& x)
+  {
+    return std::log(x);
+  }
+  
+  template<class T>
+  static std::vector<double> log(const std::vector<T>& v1, double base)
+  {
+    std::vector<double> v2(v1.size());
+    for (size_t i = 0; i < v2.size(); i++) { v2[i] = std::log(v1[i]) / std::log(base); }
+    return v2;
+  }
+
+  template<class T>
+  static double exp(const T& x)
+  {
+    return std::exp(x);
+  }
+
+  template<class T>
+  static std::vector<T> exp(const std::vector<T>& v1)
+  {
+    std::vector<T> v2(v1.size());
+    for (size_t i = 0; i < v2.size(); i++) { v2[i] = VectorTools::exp(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static std::vector<double> cos(const std::vector<T>& v1)
+  {
+    std::vector<double> v2(v1.size());
+    for (size_t i = 0; i < v2.size(); i++) { v2[i] = std::cos(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static std::vector<double> sin(const std::vector<T>& v1)
+  {
+    std::vector<double> v2(v1.size());
+    for (size_t i = 0; i < v2.size(); i++) { v2[i] = std::sin(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static std::vector<double> log10(const std::vector<T>& v1)
+  {
+    std::vector<double> v2(v1.size());
+    for (size_t i = 0; i < v1.size(); i++) { v2[i] = std::log10(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static std::vector<T> fact(const std::vector<T>& v1)
+  {
+    std::vector<T> v2(v1.size());
+    for (size_t i = 0; i < v1.size(); i++) { v2[i] = NumTools::fact<T>(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static std::vector<T> sqr(const std::vector<T>& v1)
+  {
+    std::vector<T> v2(v1.size());
+    for (size_t i = 0; i < v1.size(); i++) { v2[i] = NumTools::sqr<T>(v1[i]); }
+    return v2;
+  }
+
+  template<class T>
+  static std::vector<T> pow(const std::vector<T>& v1, T& b)
+  {
+    std::vector<T> v2(v1.size());
+    for (size_t i = 0; i < v1.size(); i++) { v2[i] = std::pow(v1[i], b); }
+    return v2;
+  }
+  /** @} */
+
+  /**
+   * @brief Concatenate a std::vector after converting to string.
+   *
+   * @param v The std::vector to concatenate.
+   * @param delim A string which is used to separate the values (default is " ").
+   */
+  template<class T>
+  static std::string paste(const std::vector<T>& v, const std::string& delim = " ")
+  {
+    std::ostringstream out;
+    out.precision(12);
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      out << v[i];
+      if (i < v.size() - 1)
+        out << delim;
+    }
+    return out.str();
+  }
+
+  /**
+   * @brief Print a std::vector to a stream.
+   * @param v1 A std::vector.
+   * @param out A stream.
+   * @param delim A string which is used to separate the values (default is " ").
+   */
+  template<class T>
+  static void print(const std::vector<T>& v1, OutputStream& out = * ApplicationTools::message, const std::string& delim = " ")
+  {
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      out << v1[i];
+      if (i < v1.size() - 1)
+        out << delim;
+    }
+    out.endLine();
+  }
+
+  template<class T>
+  static void printRange(const std::vector<T>& v1, OutputStream& out = * ApplicationTools::message, const std::string& delim = ",", const std::string& rangeDelim = "-")
+  {
+    size_t vs=v1.size();
+    
+    for (size_t i = 0; i < vs; i++)
+    {
+      out << v1[i];
+      size_t j=i+1;
+      
+      while (j<vs)
+        if (v1[j]==v1[j-1]+1)
+          j++;
+        else
+          break;
+      
+      if (j>i+2)
+        out << rangeDelim << v1[j-1];
+      i=j-1;
+      if (i<vs-1)
+        out << delim;
+    }
+  }
+
+
+  /**
+   * @brief Print a std::vector to a stream in R format
+   * @param v1 A std::vector.
+   * @param variableName the variable name (default "x").
+   * @param out A stream (default cout).
+   */
+  template<class T>
+  static void printForR(const std::vector<T>& v1, std::string variableName = "x", std::ostream& out = std::cout)
+  {
+    out.precision(12);
+    out << variableName << "<-c(";
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      out << v1[i];
+      if (i < v1.size() - 1)
+        out << ", ";
+    }
+    out << ")" << std::endl;
+  }
+
+  /**
+   * @return The scalar product of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType scalar(const std::vector<InputType>& v1, const std::vector<InputType>& v2) throw (DimensionException)
+  {
+    if (v1.size() != v2.size())
+    {
+      throw DimensionException("VectorTools::scalar", v1.size(), v2.size());
+    }
+    OutputType result = 0;
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      result += v1[i] * v2[i];
+    }
+    return result;
+  }
+  /**
+   * This dt product correspond to the dot product <v1,v2> in the space defined by
+   * @f[
+   * M =
+   * \begin{pmatrix}
+   * w_1 & \ldots & \\
+   * \vdots & w_2  & \ldots\\
+   *        & \vdots & \ddots\\
+   * \end{pmatrix}
+   * @f]
+   * @return The "weighted" scalar product of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @param w A std::vector of weights.
+   * @throw DimensionException If the two std::vector do not have the same length or do not match the length of the weights.
+   */
+  template<class InputType, class OutputType>
+  static OutputType scalar(const std::vector<InputType>& v1, const std::vector<InputType>& v2, const std::vector<InputType>& w) throw (DimensionException)
+  {
+    if (v1.size() != w.size())
+    {
+      throw DimensionException("VectorTools::scalar", v1.size(), w.size());
+    }
+    if (v2.size() != w.size())
+    {
+      throw DimensionException("VectorTools::scalar", v2.size(), w.size());
+    }
+    OutputType result = 0;
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      result += v1[i] * v2[i] * w[i];
+    }
+    return result;
+  }
+
+  /**
+   * @return The scalar Kronecker product of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class T>
+  static std::vector<T> kroneckerMult(const std::vector<T>& v1, const std::vector<T>& v2) throw (DimensionException)
+  {
+    size_t n1 = v1.size();
+    size_t n2 = v2.size();
+    std::vector<T> v3(n1 * n2);
+    for (size_t i = 0; i < n1; i++)
+    {
+      T v1i = v1[i];
+      for (size_t j = 0; j < n2; j++)
+      {
+        v3[i * n2 + j] = v1i * v2[j];
+      }
+    }
+    return v3;
+  }
+
+  /**
+   * @return The norm of a std::vector (@f$\sqrt{\sum_i^n x_i^2}@f$).
+   * @param v1 A std::vector.
+   */
+  template<class InputType, class OutputType>
+  static OutputType norm(const std::vector<InputType>& v1)
+  {
+    OutputType result = 0;
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      result += v1[i] * v1[i];
+    }
+    return sqrt(result);
+  }
+
+  /**
+   * @return The "weighted" norm of a std::vector (@f$\sqrt{\sum_i^n x_i^2}@f$).
+   * @param v1 A std::vector.
+   * @param w A std::vector of weights.
+   * @throw DimensionException If v1 and w do not have the same length.
+   * @see scalar.
+   */
+  template<class InputType, class OutputType>
+  static OutputType norm(const std::vector<InputType>& v1, const std::vector<InputType>& w) throw (DimensionException)
+  {
+    if (v1.size() != w.size())
+    {
+      throw DimensionException("VectorTools::norm", v1.size(), w.size());
+    }
+    OutputType result = 0;
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      result += v1[i] * v1[i] * w[i];
+    }
+    return sqrt(result);
+  }
+
+  /**
+   * @return The cosinus of the angle of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType cos(const std::vector<InputType>& v1, const std::vector<InputType>& v2) throw (DimensionException)
+  {
+    return scalar<InputType, OutputType>(v1, v2)
+           / (norm<InputType, OutputType>(v1) * norm<InputType, OutputType>(v2));
+  }
+
+  /**
+   * @return The weighted cosinus of the angle of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @param w A std::vector of weights.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType cos(const std::vector<InputType>& v1, const std::vector<InputType>& v2, const std::vector<InputType>& w) throw (DimensionException)
+  {
+    return scalar<InputType, OutputType>(v1, v2, w)
+           / (norm<InputType, OutputType>(v1, w) * norm<InputType, OutputType>(v2, w));
+  }
+
+  /**
+   * @name Extrema.
+   *
+   * @{
+   */
+
+  /**
+   * @brief Template function to get the minimum value of a std::vector.
+   *
+   * The < operator must be defined for the specified class.
+   *
+   * @param v The input std::vector.
+   * @return The minimum value in the std::vector.
+   * @throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static T min(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0) throw EmptyVectorException<T>("VectorTools::min()", &v);
+    T mini = v[0];
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      if (v[i] < mini) mini = v[i];
+    }
+    return mini;
+  }
+
+  /**
+   * @brief Template function to get the maximum value of a std::vector.
+   *
+   * The > operator must be defined for the specified class.
+   *
+   * @param v The input std::vector.
+   * @return The maximum value in the std::vector.
+   * @throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static T max(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0) throw EmptyVectorException<T>("VectorTools::max()", &v);
+    T maxi = v[0];
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      if (v[i] > maxi) maxi = v[i];
+    }
+    return maxi;
+  }
+
+  /**
+   * @brief Template function to get the index of the maximum value of a std::vector.
+   *
+   * The > operator must be defined for the specified class.
+   * The position sent is the first one matching the maximum value.
+   *
+   * @param v The input std::vector.
+   * @return The position of the maximum value in the std::vector.
+   * @throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static size_t whichMax(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0) throw EmptyVectorException<T>("VectorFuntions::whichMax()", &v);
+    T maxi = v[0];
+    size_t pos = 0;
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      if (v[i] > maxi)
+      {
+        maxi = v[i];
+        pos = i;
+      }
+    }
+    return pos;
+  }
+
+  /**
+   * @brief Template function to get the index of the minimum value of a std::vector.
+   *
+   * The < operator must be defined for the specified class.
+   * The position sent is the first one matching the maximum value.
+   *
+   * @param v The input std::vector.
+   * @return The position of the minimum value in the std::vector.
+   * @throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static size_t whichMin(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0) throw EmptyVectorException<T>("VectorTools::whichMin()", &v);
+    T mini = v[0];
+    size_t pos = 0;
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      if (v[i] < mini)
+      {
+        mini = v[i];
+        pos = i;
+      }
+    }
+    return pos;
+  }
+
+  /**
+   * @brief Template function to get the indices of the maximum value of a std::vector.
+   *
+   * The > and == operator must be defined for the specified class.
+   * All positions matching the maximum value are returned.
+   *
+   * @param v The input std::vector.
+   * @return A vector of positions matching the maximum value in the std::vector.
+   * @throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static std::vector<size_t> whichMaxAll(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0) throw EmptyVectorException<T>("VectorFuntions::whichMaxAll()", &v);
+    T maxi = max(v);
+    std::vector<size_t> pos;
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      if (v[i] == maxi)
+      {
+        pos.push_back(i);
+      }
+    }
+    return pos;
+  }
+
+  /**
+   * @brief Template function to get the indices of the minimum value of a std::vector.
+   *
+   * The < and == operator must be defined for the specified class.
+   * All positions matching the maximum value are returned.
+   *
+   * @param v The input std::vector.
+   * @return A vector of positions matching the minimum value in the std::vector.
+   * @throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static std::vector<size_t> whichMinAll(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0) throw EmptyVectorException<T>("VectorFuntions::whichMinAll()", &v);
+    T mini = min(v);
+    std::vector<size_t> pos;
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      if (v[i] == mini)
+      {
+        pos.push_back(i);
+      }
+    }
+    return pos;
+  }
+
+
+  /**
+   * @brief Template function to get both extrema of a std::vector.
+   *
+   * Both < and > operators must be defined for the specified class.
+   *
+   * @param v The input std::vector.
+   * @return A std::vector of size 2 which values are min(v) and max(v).
+   * throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static std::vector<T> range(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0)
+      throw EmptyVectorException<T>("VectorTools::range()", &v);
+    std::vector<T> r(2);
+    r[0] = r[1] = v[0];
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      if (v[i] < r[0]) r[0] = v[i];
+      if (v[i] > r[1]) r[1] = v[i];
+    }
+    return r;
+  }
+
+private:
+  template<class T> class order_Cmp_
+  {
+    const std::vector<T>& values_;
+
+public:
+    order_Cmp_(const std::vector<T>& v) : values_(v) {}
+    bool operator()(size_t a, size_t b) { return values_[a] < values_[b]; }
+  };
+
+public:
+  /**
+   * @brief Template function to get the order of elements in the input vector.
+   *
+   * This function is equivalent to the R 'order' function. It will sort elements by increasing size, so that [0] in the resulting outptu vector is the indice of the minimum element in the input vector, [1] is the second minimum, etc.
+   *
+   * @param v The input std::vector.
+   * @return Vector with sorted positions, according to input vector.
+   * throw EmptyVectorException If the input std::vector is empty.
+   */
+  template<class T>
+  static std::vector<size_t> order(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    if (v.size() == 0)
+      throw EmptyVectorException<T>("VectorTools::sort()", &v);
+    // Private inner class:
+    std::vector<size_t> index(v.size());
+    for (size_t i = 0; i < index.size(); ++i)
+    {
+      index[i] = i;
+    }
+    sort(index.begin(), index.end(), order_Cmp_<T>(v));
+    return index;
+  }
+
+  /** @} */
+
+  /**
+   * @brief Template function to get the absolute value of all elements of a std::vector.
+   *
+   *
+   * @param v The input std::vector.
+   * @return A vector with all absolute values.
+   */
+  template<class T>
+  static std::vector<T> abs(const std::vector<T>& v) throw (EmptyVectorException<T> )
+  {
+    std::vector<T> vabs(v.size());
+    for (size_t i = 1; i < v.size(); i++)
+    {
+      vabs[i] = std::abs(v[i]);
+    }
+    return vabs;
+  }
+
+  /**
+   * @return The mean value of the std::vector.
+   * @param v1 A std::vector.
+   */
+  template<class InputType, class OutputType>
+  static OutputType mean(const std::vector<InputType>& v1)
+  {
+    return (OutputType)sum<InputType>(v1) / (OutputType)v1.size();
+  }
+  /**
+   * @return The weighted mean value of the std::vector.
+   * @param v1 A std::vector.
+   * @param w A std::vector of weights.
+   * @param normalizeWeights Tell if weights should be normalized so that they sum to 1.
+   */
+  template<class InputType, class OutputType>
+  static OutputType mean(const std::vector<InputType>& v1, const std::vector<InputType>& w, bool normalizeWeights = true)
+  {
+    if (normalizeWeights)
+    {
+      std::vector<InputType> wn = w / sum(w);
+      return scalar<InputType, OutputType>(v1, wn);
+    }
+    else
+    {
+      return scalar<InputType, OutputType>(v1, w);
+    }
+  }
+
+  /**
+   * @return The median value of the std::vector.
+   * @param v1 A std::vector.
+   */
+  template<class InputType>
+  static InputType median(std::vector<InputType>& v1)
+  {
+    InputType med = 0;
+    if (v1.size() == 0) return med;
+    if (v1.size() == 1) return v1[0];
+    sort(v1.begin(), v1.end());
+    size_t i = v1.size() / 2;
+    if (v1.size() % 2 == 0)
+    {
+      // Vector size is pair
+      med = double((v1[i - 1] + v1[i]) / 2);
+    }
+    else
+    {
+      // Vector size is impair
+      med = v1[i];
+    }
+    return med;
+  }
+
+  /**
+   * @brief Set the mean of a std::vector to be 0.
+   *
+   * @return A std::vector with mean 0.
+   * @param v1 A std::vector.
+   */
+  template<class InputType, class OutputType>
+  static std::vector<OutputType> center(const std::vector<InputType>& v1)
+  {
+    OutputType m = mean<InputType, OutputType>(v1);
+    std::vector<OutputType> v(v1.size());
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      v[i] = (OutputType)v1[i] - m;
+    }
+    return v;
+  }
+  /**
+   * @brief Set the weighted mean of a std::vector to be 0.
+   *
+   * @return A std::vector with mean 0.
+   * @param v1 A std::vector.
+   * @param w A std::vector of weights.
+   * @param normalizeWeights Tell if weights should be normalized so that they sum to 1.
+   */
+  template<class InputType, class OutputType>
+  static std::vector<OutputType> center(const std::vector<InputType>& v1, const std::vector<InputType>& w, bool normalizeWeights = true)
+  {
+    OutputType m = mean<InputType, OutputType>(v1, w, normalizeWeights);
+    std::vector<OutputType> v(v1.size());
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      v[i] = (OutputType)v1[i] - m;
+    }
+    return v;
+  }
+
+  /**
+   * @return The covariance of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @param unbiased Tell if an unbiased estimate must be computed.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType cov(const std::vector<InputType>& v1, const std::vector<InputType>& v2, bool unbiased = true) throw (DimensionException)
+  {
+    OutputType n = (OutputType)v1.size();
+    OutputType x =  scalar<InputType, OutputType>(
+      center<InputType, OutputType>(v1),
+      center<InputType, OutputType>(v2)
+      ) / n;
+    if (unbiased) x = x * n / (n - 1);
+    return x;
+  }
+
+  /**
+   * @return The weighted covariance of two std::vectors.
+   * To have a population estimate you have to multiply by \f$\frac{n}{n-1}\f$.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @param w A std::vector of weights.
+   * @param unbiased Tell if an unbiased estimate must be computed.
+   * @param normalizeWeights Tell if weights should be normalized so that they sum to 1.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType cov(const std::vector<InputType>& v1, const std::vector<InputType>& v2, const std::vector<InputType>& w, bool unbiased = true, bool normalizeWeights = true) throw (DimensionException)
+  {
+    if (normalizeWeights)
+    {
+      std::vector<InputType> wn = w / sum(w);
+      OutputType x = scalar<InputType, OutputType>(
+        center<InputType, OutputType>(v1, wn, false),
+        center<InputType, OutputType>(v2, wn, false),
+        wn
+        );
+      if (unbiased)
+      {
+        x = x / (1 - sum(sqr<double>(wn)));
+      }
+      return x;
+    }
+    else
+    {
+      OutputType x = scalar<InputType, OutputType>(
+        center<InputType, OutputType>(v1, w, false),
+        center<InputType, OutputType>(v2, w, false),
+        w
+        );
+      if (unbiased)
+      {
+        x = x / (1 - sum(sqr(w)));
+      }
+      return x;
+    }
+  }
+  /**
+   * @return The variance of the std::vector.
+   * @param v1 The sample std::vector.
+   * @param unbiased Tell if an unbiased estimate must be computed.
+   */
+  template<class InputType, class OutputType>
+  static OutputType var(const std::vector<InputType>& v1, bool unbiased = true)
+  {
+    return cov<InputType, OutputType>(v1, v1, unbiased);
+  }
+  /**
+   * @return The weighted variance of the std::vector.
+   * @param v1 The sample std::vector.
+   * @param w A std::vector of weights.
+   * @param unbiased Tell if an unbiased estimate must be computed.
+   * @param normalizeWeights Tell if weights should be normalized so that they sum to 1.
+   * @throw DimensionException If v1 and w do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType var(const std::vector<InputType>& v1, const std::vector<InputType>& w, bool unbiased = true, bool normalizeWeights = true) throw (DimensionException)
+  {
+    return cov<InputType, OutputType>(v1, v1, w, unbiased, normalizeWeights);
+  }
+
+  /**
+   * @return The standard deviation of the std::vector.
+   * @param v1 The sample std::vector.
+   * @param unbiased Tell if an unbiased estimate must be computed.
+   */
+  template<class InputType, class OutputType>
+  static OutputType sd(const std::vector<InputType>& v1, bool unbiased = true)
+  {
+    return sqrt(var<InputType, OutputType>(v1, unbiased));
+  }
+
+  /**
+   * @return The weighted standard deviation of the std::vector.
+   * @param v1 The sample std::vector.
+   * @param w A std::vector of weights.
+   * @param unbiased Tell if an unbiased estimate must be computed.
+   * @param normalizeWeights Tell if weights should be normalized so that they sum to 1.
+   * @throw DimensionException If v1 and w do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType sd(const std::vector<InputType>& v1, const std::vector<InputType>& w, bool unbiased = true, bool normalizeWeights = true) throw (DimensionException)
+  {
+    return sqrt(var<InputType, OutputType>(v1, w, unbiased, normalizeWeights));
+  }
+
+  /**
+   * @return The Pearson correlation coefficient of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType cor(const std::vector<InputType>& v1, const std::vector<InputType>& v2) throw (DimensionException)
+  {
+    return cov<InputType, OutputType>(v1, v2)
+           / ( sd<InputType, OutputType>(v1) * sd<InputType, OutputType>(v2) );
+  }
+
+  /**
+   * @return The weighted Pearson correlation coefficient of two std::vectors.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @param w A std::vector of weights.
+   * @param normalizeWeights Tell if weights should be normalized so that they sum to 1.
+   * @throw DimensionException If the two std::vector do not have the same length.
+   */
+  template<class InputType, class OutputType>
+  static OutputType cor(const std::vector<InputType>& v1, const std::vector<InputType>& v2, const std::vector<InputType>& w, bool normalizeWeights = true) throw (DimensionException)
+  {
+    if (normalizeWeights)
+    {
+      std::vector<InputType> wn = w / sum(w);
+      return cov<InputType, OutputType>(v1, v2, wn, false, false)
+             / ( sd<InputType, OutputType>(v1, wn, false, false) * sd<InputType, OutputType>(v2, wn, false, false) );
+    }
+    else
+    {
+      return cov<InputType, OutputType>(v1, v2, w, false, false)
+             / ( sd<InputType, OutputType>(v1, w, false, false) * sd<InputType, OutputType>(v2, w, false, false) );
+    }
+  }
+
+  /**
+   * @return Compute the Shannon entropy indice of a vector of frequencies.
+   *
+   * The elements of the vector should contain frequencies
+   * of each modality of the variable and sum to one. This verification is left to the user
+   * though.
+   *
+   * @author Julien Dutheil
+   * @see shannonDiscrete for computing the shannon indice of a sample, discrete version.
+   * @see shannonContinuous for computing the shannon indice of a sample, continuous version.
+   *
+   * @param v The input std::vector.
+   * @param base The base of the logarithm to use.
+   */
+  template<class InputType, class OutputType>
+  static OutputType shannon(const std::vector<InputType>& v, double base = 2.7182818)
+  {
+    OutputType s = 0;
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      if (v[i] > 0) s += static_cast<OutputType>(v[i] * std::log(v[i]) / std::log(base));
+    }
+    return -s;
+  }
+
+  /**
+   * @return Compute the Shannon entropy indice of a vector.
+   *
+   * This is the discrete version. The vector is supposed to be a finite sample from
+   * a discrete distribution. The counts of each observed state are computed and used
+   * to compute the discrete entropy.
+   *
+   * @author Julien Dutheil
+   * @see shannonContinuous for the continuous version.
+   * @see shannon for direct computation from frequencies.
+   *
+   * @param v The input std::vector.
+   * @param base The base of the logarithm to use.
+   */
+  template<class InputType, class OutputType>
+  static OutputType shannonDiscrete(const std::vector<InputType>& v, double base = 2.7182818)
+  {
+    std::map<InputType, double> counts;
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      counts[v[i]]++;
+    }
+    OutputType s = 0;
+    double n = static_cast<double>(v.size());
+    for (typename std::map<InputType, double>::iterator it = counts.begin(); it != counts.end(); it++)
+    {
+      s += static_cast<OutputType>((it->second / n) * std::log(it->second / n) / std::log(base));
+    }
+    return -s;
+  }
+
+  /**
+   * @return Compute mutual information index from two samples from discrete variables.
+   *
+   * This is the discrete version. Each vector is supposed to be a finite sample from
+   * a discrete distribution. The counts of each (joint) observed state are computed
+   * and used to compute the discrete mutual information.
+   *
+   * @author Julien Dutheil
+   * @see miContinuous.
+   *
+   * @param v1 The first input vector.
+   * @param v2 The second input vector.
+   * @param base The base of the logarithm to use.
+   * @throw DimensionException if the two vectors do not have the same lengths.
+   */
+  template<class InputType, class OutputType>
+  static OutputType miDiscrete(const std::vector<InputType>& v1, const std::vector<InputType>& v2, double base = 2.7182818) throw (DimensionException)
+  {
+    if (v1.size() != v2.size())
+      throw DimensionException("VectorTools::miDiscrete. The two samples must have the same length.", v2.size(), v1.size());
+    std::map<InputType, double> counts1;
+    std::map<InputType, double> counts2;
+    std::map<InputType, std::map<InputType, double> > counts12;
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      counts1[v1[i]]++;
+      counts2[v2[i]]++;
+      counts12[v1[i]][v2[i]]++;
+    }
+    OutputType s = 0;
+    double n = static_cast<double>(v1.size());
+    for (typename std::map<InputType, std::map<InputType, double> >::iterator it1 = counts12.begin(); it1 != counts12.end(); it1++)
+    {
+      for (typename std::map<InputType, double>::iterator it2 = it1->second.begin(); it2 != it1->second.end(); it2++)
+      {
+        s += static_cast<OutputType>((it2->second / n) * std::log(it2->second * n / (counts1[it1->first] * counts2[it2->first])) / std::log(base));
+      }
+    }
+    return s;
+  }
+
+  /**
+   * @return Compute the Shannon entropy indice of a sample from a continuous variable.
+   *
+   * This is the continuous version. The vector is supposed to be a finite sample from
+   * a continuous distribution. The density is of the distribution is estimated using
+   * a kernel method, and is used to compute the continuous entropy.
+   *
+   * Reference: Ivan Kojadinovic (2004) _Computational Statistics & Data Analysis_, 46:269-294
+   *
+   * @author Julien Dutheil
+   * @see shannon For the discrete version.
+   *
+   * @param v The input std::vector.
+   * @param base The base of the logarithm to use.
+   */
+  template<class InputType, class OutputType>
+  static OutputType shannonContinuous(const std::vector<InputType>& v, double base = 2.7182818)
+  {
+    LinearMatrix<InputType> m(1, v.size());
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      m(0, i) = v[i];
+    }
+    AdaptiveKernelDensityEstimation kd(m);
+    OutputType s = 0;
+    std::vector<double> x(1);
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      x[0] = static_cast<double>(v[i]);
+      s += static_cast<OutputType>(std::log(kd.kDensity(x)) / std::log(base));
+    }
+    return -s / static_cast<double>(v.size());
+  }
+
+  /**
+   * @return Compute mutual information index from two samples from continuous variables.
+   *
+   * This is the continuous version. Each vector is supposed to be a finite sample from
+   * a continuous distribution. The density is of the distribution is estimated using
+   * a kernel method, as well as the joint density, and are used to compute the continuous
+   * mutual information.
+   *
+   * Reference: Ivan Kojadinovic (2004) _Computational Statistics & Data Analysis_, 46:269-294
+   *
+   * @author Julien Dutheil
+   * @see miDiscrete For the discrete version.
+   * @warning This function is experimental. Notably, bad kernel density estimates may lead to negative MI :(
+   *
+   * @param v1 The first input vector.
+   * @param v2 The second input vector.
+   * @param base The base of the logarithm to use.
+   * @throw DimensionException if the two vectors do not have the same lengths.
+   */
+  template<class InputType, class OutputType>
+  static OutputType miContinuous(const std::vector<InputType>& v1, const std::vector<InputType>& v2, double base = 2.7182818) throw (DimensionException)
+  {
+    if (v1.size() != v2.size())
+      throw DimensionException("VectorTools::miContinuous. The two samples must have the same length.", v2.size(), v1.size());
+    LinearMatrix<InputType> m1(1, v1.size());
+    LinearMatrix<InputType> m2(1, v2.size());
+    LinearMatrix<InputType> m12(2, v1.size());
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      m1(0, i) = m12(0, i) = v1[i];
+      m2(0, i) = m12(1, i) = v2[i];
+    }
+    AdaptiveKernelDensityEstimation kd1(m1);
+    AdaptiveKernelDensityEstimation kd2(m2);
+    AdaptiveKernelDensityEstimation kd12(m12);
+    OutputType s = 0;
+    std::vector<double> x1(1);
+    std::vector<double> x2(1);
+    std::vector<double> x12(2);
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      x1[0] = x12[0] = static_cast<double>(v1[i]);
+      x2[0] = x12[1] = static_cast<double>(v2[i]);
+      s += static_cast<OutputType>(std::log(kd12.kDensity(x12) / (kd1.kDensity(x1) * kd2.kDensity(x2))) / std::log(base));
+    }
+    return s / static_cast<double>(v1.size());
+  }
+
+  /**
+   * @return 'true' if the two std::vectors contains the same elements, whatever their order in the container.
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   */
+  template<class T>
+  static bool haveSameElements(const std::vector<T>& v1, const std::vector<T>& v2)
+  {
+    std::vector<T> u1(v1);
+    std::vector<T> u2(v2);
+    if (u1.size() != u2.size()) return false;
+    std::sort(u1.begin(), u1.end());
+    std::sort(u2.begin(), u2.end());
+    return u1 == u2;
+  }
+
+  /**
+   * @return 'true' if the two std::vectors contains the same elements, <b>in the same frequency</b>, whatever their order in the container.
+   *
+   * @warning The two input std::vectors will be sorted.
+   *
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   */
+  template<class T>
+  static bool haveSameElements(std::vector<T>& v1, std::vector<T>& v2)
+  {
+    if (v1.size() != v2.size()) return false;
+    std::sort(v1.begin(), v1.end());
+    std::sort(v2.begin(), v2.end());
+    return v1 == v2;
+  }
+
+  /**
+   * @return 'true' if a the input std::vector contains the given element.
+   * @param vec The std::vector to check.
+   * @param el The element to look for.
+   */
+  template<class T>
+  static bool contains(const std::vector<T>& vec, T el)
+  {
+    for (size_t i = 0; i < vec.size(); i++)
+    {
+      if (vec[i] == el) return true;
+    }
+    return false;
+  }
+
+  /**
+   * @return 'true' if a the first std::vector contains all elements of the second std::vector.
+   *
+   * @warning The two input std::vectors will be sorted.
+   *
+   * @param v1 The first std::vector to check.
+   * @param v2 The second std::vector to check.
+   */
+  template<class T>
+  static bool containsAll(std::vector<T>& v1, std::vector<T>& v2)
+  {
+    std::sort(v1.begin(), v1.end());
+    std::sort(v2.begin(), v2.end());
+    size_t j = 0;
+    for (size_t i = 0; i < v2.size(); i++)
+    {
+      if (i > 0 && v2[i] == v2[i - 1]) continue;
+      while (j < v1.size() - 1 && v1[j] < v2[i]) j++;
+      if (v1[j] != v2[i]) return false;
+    }
+    return true;
+  }
+
+  /**
+   * @return A std::vector which is the union of two std::vectors passed as input.
+   * Duplicate element will be removed.
+   * @param vec1 Vector 1.
+   * @param vec2 Vector 2.
+   */
+  template<class T>
+  static std::vector<T> vectorUnion(const std::vector<T>& vec1, const std::vector<T>& vec2)
+  {
+    std::vector<T> unionEl = vec1;
+    for (size_t j = 0; j < vec2.size(); j++)
+    {
+      if (!contains(unionEl, vec2[j]))
+        unionEl.push_back(vec2[j]);
+    }
+    return unionEl;
+  }
+
+  /**
+   * @return A std::vector which is the union of all std::vectors passed as input.
+   * Duplicate element will be removed.
+   * @param vecElementL A std::vector of std::vectors.
+   */
+  template<class T>
+  static std::vector<T> vectorUnion(const std::vector< std::vector<T> >& vecElementL)
+  {
+    std::vector<T> unionEl;
+    for (size_t i = 0; i < vecElementL.size(); i++)
+    {
+      for (size_t j = 0; j < vecElementL[i].size(); j++)
+      {
+        if (!contains(unionEl, vecElementL[i][j]))
+          unionEl.push_back(vecElementL[i][j]);
+      }
+    }
+    return unionEl;
+  }
+
+  /**
+   * @return A std::vector which is the intersection of two std::vectors passed as input.
+   * @param vec1 Vector 1.
+   * @param vec2 Vector 2.
+   */
+  template<class T>
+  static std::vector<T> vectorIntersection(const std::vector<T>& vec1, const std::vector<T>& vec2)
+  {
+    std::vector<T> interEl;
+    for (size_t i = 0; i < vec1.size(); i++)
+    {
+      if (contains(vec2, vec1[i])) interEl.push_back(vec1[i]);
+    }
+    return interEl;
+  }
+
+  /**
+   * @return A std::vector which is the intersection of all std::vectors passed as input.
+   * @param vecElementL A std::vector of std::vectors.
+   */
+  template<class T>
+  static std::vector<T> vectorIntersection(const std::vector< std::vector<T> >& vecElementL)
+  {
+    if (vecElementL.size() == 1) return vecElementL[0];
+    std::vector<T> interEl;
+    if (vecElementL.size() == 0) return interEl;
+    for (size_t i = 0; i < vecElementL[0].size(); i++)
+    {
+      bool test = true;
+      for (size_t j = 1; test && j < vecElementL.size(); j++)
+      {
+        if (!contains(vecElementL[j], vecElementL[0][i])) test = false;
+      }
+      if (test) interEl.push_back(vecElementL[0][i]);
+    }
+    return interEl;
+  }
+
+  /**
+   * @brief Append the content of a std::vector to another one.
+   * @param vec1 Vector 1.
+   * @param vec2 Vector 2.
+   */
+  template<class T>
+  static void append(std::vector<T>& vec1, const std::vector<T>& vec2)
+  {
+    vec1.insert(vec1.end(), vec2.begin(), vec2.end());
+    // for(size_t i = 0; i < vec2.size(); i++)
+    // {
+    //  vec1.push_back(vec2[i]);
+    // }
+  }
+
+  /**
+   * @brief Prepend the content of a std::vector to another one.
+   * @param vec1 Vector 1.
+   * @param vec2 Vector 2.
+   */
+  template<class T>
+  static void prepend(std::vector<T>& vec1, const std::vector<T>& vec2)
+  {
+    vec1.insert(vec1.begin(), vec2.begin(), vec2.end());
+  }
+
+
+  /**
+   * @return A single std::vector made of the concatenation of the std::vectors passed as input.
+   * @param vecElementL A std::vector of std::vectors.
+   */
+  template<class T>
+  static std::vector<T> append(const std::vector< std::vector<T> >& vecElementL)
+  {
+    if (vecElementL.size() == 1) return vecElementL[0];
+    std::vector<T> v;
+    if (vecElementL.size() == 0) return v;
+    for (size_t i = 0; i < vecElementL[0].size(); i++)
+    {
+      v.push_back(vecElementL[0][i]);
+    }
+    return v;
+  }
+
+  /**
+   * @brief Extend the content of a std::vector with another one. Only the elements not present in the first vector will be added.
+   * @param vec1 Vector 1.
+   * @param vec2 Vector 2.
+   */
+  template<class T>
+  static void extend(std::vector<T>& vec1, const std::vector<T>& vec2)
+  {
+    for (size_t i = 0; i < vec2.size(); i++)
+    {
+      if (!contains(vec1, vec2[i]))
+        vec1.push_back(vec2[i]);
+    }
+  }
+
+  /**
+   * @return A single std::vector made of the repetion of the std::vectors passed as input.
+   * @param vec A std::vector.
+   * @param n the number of repetitions
+   */
+  template<class T>
+  static std::vector<T> rep(const std::vector<T>& vec, size_t n)
+  {
+    if (n == 1) return vec;
+    std::vector<T> v;
+    if (n == 0) return v;
+    v.resize(vec.size() * n);
+    for (size_t i = 0; i < v.size(); i++)
+    {
+      v[i] = vec[i % vec.size()];
+    }
+    return v;
+  }
+
+  /**
+   * @brief This function returns the difference of two std::vectors.
+   *
+   * @warning The two input std::vectors will be sorted. As a consequence, the output std::vector will be also sorted.
+   *
+   * @param v1 First std::vector.
+   * @param v2 Second std::vector.
+   * @param v3 A std::vector to be populated with all elements in v1 that are not found in v2.
+   */
+  template<class T>
+  static void diff(std::vector<T>& v1, std::vector<T>& v2, std::vector<T>& v3)
+  {
+    if (v2.size() == 0) append(v3, v1);
+    std::sort(v1.begin(), v1.end());
+    std::sort(v2.begin(), v2.end());
+    size_t j = 0;
+    for (size_t i = 0; i < v1.size(); i++)
+    {
+      if (i > 0 && v1[i] == v1[i - 1]) continue;
+      while (j < v2.size() - 1 && v2[j] < v1[i]) j++;
+      if (v2[j] != v1[i]) v3.push_back(v1[i]);
+    }
+  }
+
+  /**
+   * @brief Test function.
+   * @return true if all tests are passed.
+   */
+  static bool test();
+};
+} // end of namespace bpp.
+
+#endif  // _VECTORTOOLS_H_
+
diff --git a/src/Bpp/Seq/Alphabet/AbstractAlphabet.cpp b/src/Bpp/Seq/Alphabet/AbstractAlphabet.cpp
deleted file mode 100644
index 79a1d73..0000000
--- a/src/Bpp/Seq/Alphabet/AbstractAlphabet.cpp
+++ /dev/null
@@ -1,317 +0,0 @@
-//
-// File: AbstractAlphabet.cpp
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "AbstractAlphabet.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Utils/MapTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <ctype.h>
-#include <map>
-#include <iostream>
-
-using namespace std;
-
-/******************************************************************************/
-
-void AbstractAlphabet::updateMaps_(size_t pos, const AlphabetState& st) {
-  if (letters_.find(st.getLetter()) == letters_.end())
-    letters_[st.getLetter()] = pos;
-  else
-    throw Exception("AbstractAlphabet::updateMaps_. A state with the same character code already exists! " + st.getLetter() + ".");
-  if (nums_.find(st.getNum()) == nums_.end())
-    nums_[st.getNum()] = pos;
-  else
-    nums_[st.getNum()] = min(pos, nums_[st.getNum()]);
-}
-
-/******************************************************************************/
-
-void AbstractAlphabet::registerState(AlphabetState* st) throw (Exception) {
-  // Add the state to the vector
-  alphabet_.push_back(st);
-  // Update the maps
-  updateMaps_(alphabet_.size() - 1, *st);
-}
-
-/******************************************************************************/
-
-void AbstractAlphabet::setState(size_t pos, AlphabetState* st)
-  throw (Exception, IndexOutOfBoundsException) {
-    if (pos > alphabet_.size())
-      throw IndexOutOfBoundsException("AbstractAlphabet::setState: incorect position", pos, 0, alphabet_.size());
-    // Delete the state if not empty
-    if (alphabet_[pos] != 0)
-      delete alphabet_[pos];
-    // Put the state in the vector
-    alphabet_[pos] = st;
-    // Update the maps
-    updateMaps_(pos, *st);
-  }
-
-/******************************************************************************/
-
-const AlphabetState& AbstractAlphabet::getState(const std::string& letter) const throw (BadCharException) {
-  map<string, size_t>::const_iterator it = letters_.find(letter);
-  if (it == letters_.end())
-    throw BadCharException(letter, "AbstractAlphabet::getState(string): Specified base unknown", this);
-  return * (alphabet_[it->second]);
-}
-
-/******************************************************************************/
-
-size_t AbstractAlphabet::getStateIndex(const std::string& letter) const throw (BadCharException) {
-  map<string, size_t>::const_iterator it = letters_.find(letter);
-  if (it == letters_.end())
-    throw BadCharException(letter, "AbstractAlphabet::getStateIndex(string): Specified base unknown", this);
-  return it->second;
-}
-
-/******************************************************************************/
-
-const AlphabetState& AbstractAlphabet::getState(int num) const throw (BadIntException) {
-  map<int, size_t>::const_iterator it = nums_.find(num);
-  if (it == nums_.end())
-    throw BadIntException(num, "AbstractAlphabet::getState(int): Specified base unknown", this);
-  return *(alphabet_[it->second]);
-}
-
-/******************************************************************************/
-
-size_t AbstractAlphabet::getStateIndex(int num) const throw (BadIntException) {
-  map<int, size_t>::const_iterator it = nums_.find(num);
-  if (it == nums_.end())
-    throw BadIntException(num, "AbstractAlphabet::getStateIndex(int): Specified base unknown", this);
-  return it->second;
-}
-
-/******************************************************************************/
-
-AlphabetState& AbstractAlphabet::getState(const std::string& letter) throw (BadCharException) {
-  map<string, size_t>::iterator it = letters_.find(letter);
-  if (it == letters_.end())
-    throw BadCharException(letter, "AbstractAlphabet::getState(string): Specified base unknown", this);
-  return * (alphabet_[it->second]);
-}
-
-/******************************************************************************/
-
-AlphabetState& AbstractAlphabet::getState(int num) throw (BadIntException) {
-  map<int, size_t>::iterator it = nums_.find(num);
-  if (it == nums_.end())
-    throw BadIntException(num, "AbstractAlphabet::getState(int): Specified base unknown", this);
-  return * (alphabet_[it->second]);
-}
-
-/******************************************************************************/
-
-AlphabetState& AbstractAlphabet::getStateAt(size_t pos) throw (IndexOutOfBoundsException) {
-  if (pos > alphabet_.size())
-    throw IndexOutOfBoundsException("AbstractAlphabet::getStateAt: incorect position", pos, 0, alphabet_.size());
-  return * (alphabet_[pos]);
-}
-
-/******************************************************************************/
-
-const AlphabetState& AbstractAlphabet::getStateAt(size_t pos) const throw (IndexOutOfBoundsException) {
-  if (pos > alphabet_.size())
-    throw IndexOutOfBoundsException("AbstractAlphabet::getStateAt: incorect position", pos, 0, alphabet_.size());
-  return * (alphabet_[pos]);
-}
-
-/******************************************************************************/
-
-std::string AbstractAlphabet::getName(const std::string& state) const throw (BadCharException)
-{
-  return (getState(state)).getName();
-}
-
-/******************************************************************************/
-
-std::string AbstractAlphabet::getName(int state) const throw (BadIntException)
-{
-  return (getState(state)).getName();
-}
-
-/******************************************************************************/
-
-int AbstractAlphabet::charToInt(const std::string& state) const throw (BadCharException)
-{
-  return getState(state).getNum();
-}
-
-/******************************************************************************/
-
-std::string AbstractAlphabet::intToChar(int state) const throw (BadIntException)
-{
-  return (getState(state)).getLetter();
-}
-
-/******************************************************************************/
-
-bool AbstractAlphabet::isIntInAlphabet(int state) const
-{
-  map<int, size_t>::const_iterator it = nums_.find(state);
-  if (it != nums_.end())
-    return true;
-  return false;
-}
-
-/******************************************************************************/
-
-bool AbstractAlphabet::isCharInAlphabet(const std::string& state) const
-{
-  map<string, size_t>::const_iterator it = letters_.find(state);
-  if (it != letters_.end())
-    return true;
-  return false;
-}	
-
-/******************************************************************************/
-
-std::vector<int> AbstractAlphabet::getAlias(int state) const throw (BadIntException) 
-{
-  if (!isIntInAlphabet(state)) throw BadIntException(state, "AbstractAlphabet::getAlias(int): Specified base unknown.");
-  vector<int> v(1);
-  v[0] = state;
-  return v;
-}
-
-/******************************************************************************/
-
-std::vector<std::string> AbstractAlphabet::getAlias(const std::string& state) const throw (BadCharException) 
-{
-  if (!isCharInAlphabet(state)) throw BadCharException(state, "AbstractAlphabet::getAlias(char): Specified base unknown.");
-  vector<string> v(1);
-  v[0] = state;
-  return v;
-}
-
-/******************************************************************************/
-
-int AbstractAlphabet::getGeneric(const std::vector<int>& states) const throw (BadIntException) {
-  map<int, int> m;
-  for (unsigned int i = 0 ; i < states.size() ; ++i) {
-    vector<int> tmp_s = this->getAlias(states[i]); // get the states for generic characters
-    for (unsigned int j = 0 ; j < tmp_s.size() ; ++j) {
-      m[tmp_s[j]] ++; // add each state to the list
-    }
-  }
-  vector<int> ve = MapTools::getKeys(m);
-
-  string key;
-  for (unsigned int i = 0 ; i < ve.size() ; ++i) {
-    if (!isIntInAlphabet(ve[i])) throw BadIntException(ve[i], "AbstractAlphabet::getGeneric(const vector<int>): Specified base unknown.");
-    key += "_" + TextTools::toString(ve[i]);
-  }
-  int v;
-  if (ve.size() == 1) {
-    v = ve[0];
-  } else {
-    v = this->getUnknownCharacterCode();
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-std::string AbstractAlphabet::getGeneric(const std::vector<std::string>& states) const throw (AlphabetException) {
-  map <string, int> m;
-  for (unsigned int i = 0 ; i < states.size() ; ++i) {
-    vector<string> tmp_s = this->getAlias(states[i]); // get the states for generic characters
-    for (unsigned int j = 0 ; j < tmp_s.size() ; ++j) {
-      m[tmp_s[j]] ++; // add each state to the list
-    }
-  }
-  vector<string> ve = MapTools::getKeys(m);
-
-  string key;
-  for (unsigned int i = 0 ; i < ve.size() ; ++i) {
-    if (!isCharInAlphabet(ve[i])) throw BadCharException(ve[i], "AbstractAlphabet::getAlias(const vector<string>): Specified base unknown.");
-    key += TextTools::toString(ve[i]);
-  }
-  string v;
-  if (ve.size() == 1) {
-    v = ve[0];
-  } else {
-    throw CharStateNotSupportedException("AbstractAlphabet::getAlias(const vector<string>): No generic char state.");
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-const std::vector<int>& AbstractAlphabet::getSupportedInts() const
-{
-  if(intList_.size() != alphabet_.size())
-  {
-    intList_.resize(alphabet_.size());
-    charList_.resize(alphabet_.size());
-    for (size_t i = 0; i < alphabet_.size(); ++i)
-    {
-      intList_[i]  = alphabet_[i]->getNum();
-      charList_[i] = alphabet_[i]->getLetter();
-    }
-  }
-  return intList_;
-}
-
-/******************************************************************************/
-
-const std::vector<std::string>& AbstractAlphabet::getSupportedChars() const
-{
-  if(charList_.size() != alphabet_.size())
-  {
-    intList_.resize(alphabet_.size());
-    charList_.resize(alphabet_.size());
-    for (size_t i = 0; i < alphabet_.size(); ++i)
-    {
-      intList_[i]  = alphabet_[i]->getNum();
-      charList_[i] = alphabet_[i]->getLetter();
-    }
-  }
-  return charList_;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Alphabet/AbstractAlphabet.h b/src/Bpp/Seq/Alphabet/AbstractAlphabet.h
deleted file mode 100644
index 8a0a8ed..0000000
--- a/src/Bpp/Seq/Alphabet/AbstractAlphabet.h
+++ /dev/null
@@ -1,276 +0,0 @@
-//
-// File: AbstractAlphabet.h
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ABSTRACTALPHABET_H_
-#define _ABSTRACTALPHABET_H_
-
-#include "Alphabet.h"
-#include "AlphabetState.h"
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <string>
-#include <vector>
-#include <map>
-
-namespace bpp
-{
-
-  /**
-   * @brief A partial implementation of the Alphabet interface.
-   *
-   * It contains a vector of AlphabetState.
-   * All methods are based uppon this vector
-   * but do not provide any method to initialize it.
-   * This is up to each constructor of the derived classes.
-   *
-   * @see Alphabet
-   */
-  class AbstractAlphabet:
-    public Alphabet
-  {
-  private:
-		
-    /**
-     * @brief Alphabet: vector of AlphabetState.
-     */
-    std::vector<AlphabetState*> alphabet_;
-    /**
-     * @name maps used to quick search for letter and num.
-     * @{
-     */
-    std::map<std::string, size_t> letters_;
-    std::map<int, size_t> nums_;
-    /** @} */
-    /**
-     * @brief Update the private maps letters_ and nums_ when adding a state.
-     *
-     * @param pos The index of the state in the alphabet_ vector.
-     * @param st The state that have been added or modified
-     */
-    void updateMaps_(size_t pos, const AlphabetState& st);
-
-  protected:
-    /**
-     * @name Available codes
-     *
-     * These vectors will be computed the first time you call the getAvailableInts or getAvailableChars method.
-     *
-     * @{
-     */
-    mutable std::vector<std::string> charList_;
-    mutable std::vector<int> intList_;
-    /** @} */
-
-  public:
-		
-    AbstractAlphabet(): alphabet_(), letters_(), nums_(), charList_(), intList_() {}
-
-    AbstractAlphabet(const AbstractAlphabet& alph) : alphabet_(), letters_(alph.letters_), nums_(alph.nums_), charList_(alph.charList_), intList_(alph.intList_)
-    {
-      for (size_t i = 0; i < alph.alphabet_.size(); ++i)
-        alphabet_.push_back(new AlphabetState(*alph.alphabet_[i]));
-    }
-
-    AbstractAlphabet& operator=(const AbstractAlphabet& alph)
-    {
-      for (size_t i = 0 ; i < alphabet_.size() ; ++i)
-        delete alphabet_[i];
-
-      for (size_t i = 0; i < alph.alphabet_.size(); ++i)
-        alphabet_.push_back(new AlphabetState(*alph.alphabet_[i]));
-
-      letters_  = alph.letters_;
-      nums_     = alph.nums_;
-      charList_ = alph.charList_;
-      intList_  = alph.intList_;
-
-      return *this;
-    }
-
-#ifndef NO_VIRTUAL_COV
-    virtual AbstractAlphabet* clone() const = 0;
-#endif
-
-    virtual ~AbstractAlphabet()
-    {
-      for (size_t i = 0 ; i < alphabet_.size() ; ++i)
-        delete alphabet_[i];
-    }
-	
-  public:
-    /**
-     * @name Implement these methods from the Alphabet interface.
-     *
-     * @{
-     */
-    size_t getNumberOfStates() const { return alphabet_.size(); }
-    unsigned int getNumberOfChars() const { return static_cast<unsigned int>(alphabet_.size()); }
-    std::string getName(const std::string& state) const throw (BadCharException);
-    std::string getName(int state) const throw (BadIntException);
-    int charToInt(const std::string& state) const throw (BadCharException);
-    std::string intToChar(int state) const throw (BadIntException);
-    bool isIntInAlphabet(int state) const;
-    bool isCharInAlphabet(const std::string& state) const;
-    std::vector<int> getAlias(int state) const throw (BadIntException);
-    std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException);
-    int getGeneric(const std::vector<int>& states) const throw (BadIntException);
-    std::string getGeneric(const std::vector<std::string>& states) const throw (AlphabetException);
-    const std::vector<int>& getSupportedInts() const;
-    const std::vector<std::string>& getSupportedChars() const;
-    int getGapCharacterCode() const { return -1; }
-    bool isGap(int state) const { return state == -1; }
-    bool isGap(const std::string& state) const { return charToInt(state) == -1; }
-    /** @} */
-
-    /**
-     * @name Specific methods to access AlphabetState
-     * @{
-     */
-    /**
-     * @brief Get a state at a position in the alphabet_ vector.
-     *
-     * This method must be overloaded in specialized classes to send back
-     * a reference of the corect type.
-     *
-     * @param stateIndex The index of the state in the alphabet_ vector.
-     * @throw IndexOutOfBoundsException If the index is invalid.
-     */
-    virtual AlphabetState& getStateAt(size_t stateIndex) throw (IndexOutOfBoundsException);
-    
-    /**
-     * @brief Get a state at a position in the alphabet_ vector.
-     *
-     * This method must be overloaded in specialized classes to send back
-     * a reference of the corect type.
-     *
-     * @param stateIndex The index of the state in the alphabet_ vector.
-     * @throw IndexOutOfBoundsException If the index is invalid.
-     */
-    virtual const AlphabetState& getStateAt(size_t stateIndex) const throw (IndexOutOfBoundsException);
-
-    /**
-     * @brief Get a state by its letter.
-     *
-     * This method must be overloaded in specialized classes to send back
-     * a reference of the corect type.
-     *
-     * @param letter The letter of the state to find.
-     * @throw BadCharException If the letter is not in the Alphabet.
-     */
-    const AlphabetState& getState(const std::string& letter) const throw (BadCharException);
-
-    AlphabetState& getState(const std::string& letter) throw (BadCharException);
-    
-    /**
-     * @brief Get a state by its num.
-     *
-     * This method must be overloaded in specialized classes to send back
-     * a reference of the corect type.
-     *
-     * @param num The num of the state to find.
-     * @throw BadIntException If the num is not in the Alphabet.
-     */
-    const AlphabetState& getState(int num) const throw (BadIntException);
-
-    AlphabetState& getState(int num) throw (BadIntException);
-
-    int getIntCodeAt(size_t stateIndex) const throw (IndexOutOfBoundsException) {
-      return getStateAt(stateIndex).getNum();
-    }
-
-    const std::string& getCharCodeAt(size_t stateIndex) const throw (IndexOutOfBoundsException) {
-      return getStateAt(stateIndex).getLetter();
-    }
-
-    size_t getStateIndex(int state) const throw (BadIntException);
-    
-    size_t getStateIndex(const std::string& state) const throw (BadCharException);
-    /** @} */
-
-  protected:
-    /**
-     * @brief Add a state to the Alphabet.
-     *
-     * @param st The state to add.
-     * @throw Exception If a wrong alphabet state is provided.
-     */
-    virtual void registerState(AlphabetState* st) throw (Exception);
-    
-    /**
-     * @brief Set a state in the Alphabet.
-     *
-     * @param pos The index of the state in the alphabet_ vector.
-     * @param st The new state to put in the Alphabet.
-     * @throw Exception If a wrong alphabet state is provided.
-     * @throw IndexOutOfBoundsException If an incorrect index is provided.
-     */
-    virtual void setState(size_t pos, AlphabetState* st) throw (Exception, IndexOutOfBoundsException);
-    
-    /**
-     * @brief Resize the private alphabet_ vector.
-     *
-     * @param size The new size of the Alphabet.
-     */
-    void resize(size_t size) { alphabet_.resize(size); }
-    
-    /**
-     * @brief Re-update the maps using the alphabet_ vector content.
-     */
-    void remap() {
-      letters_.clear();
-      nums_.clear();
-      for (size_t i = 0; i < alphabet_.size(); ++i) {
-        updateMaps_(i, *alphabet_[i]);
-      }
-    }
-
-    unsigned int getStateCodingSize() const { return 1; }
-
-    bool equals(const Alphabet& alphabet) const {
-      return getAlphabetType() == alphabet.getAlphabetType();
-    }
-  };
-
-} //end of namespace bpp.
-
-#endif // _ABSTRACTALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/Alphabet.h b/src/Bpp/Seq/Alphabet/Alphabet.h
deleted file mode 100644
index ca4b927..0000000
--- a/src/Bpp/Seq/Alphabet/Alphabet.h
+++ /dev/null
@@ -1,459 +0,0 @@
-//
-// File: Alphabet.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Tue Jul 22 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ALPHABET_H_
-#define _ALPHABET_H_
-
-#include <string>
-#include <vector>
-
-#include "AlphabetExceptions.h"
-#include "AlphabetState.h"
-
-#include <Bpp/Clonable.h>
-
-/**
- * @mainpage
- *
- * @par
- * This library provides classes to store and analyse biological sequences.
- * Each position in a sequences is coded by a int. An object implementing the bpp::Alphabet
- * interface is used to make the relation between the int code and its more common character
- * representation. Support for DNA, RNA, protein and codon sequences is provided. The
- * bpp::AlphabetTools provides tools to deal with Alphabet objects.
- * The basic bpp::Sequence class contains the code sequence, a name for the sequence
- * and optionally comments. More elaborated classes can be built by inheriting this class.
- * The bpp::SequenceTools static class provides simple analysis tools, like base frequencies measures,
- * concatenation, etc. 
- * 
- * @par
- * SeqLib also provides tools to perform <i>in silico</i> molecular biology, like complementation,
- * transcription, translation, etc. All these methods are particular cases of alphabet translation, and are implemented
- * via the interface bpp::Translator. Of particular interest are the classes bpp::NucleicAcidsReplication,
- * bpp::DNAToRNA and bpp::GeneticCode + derivatives.
- *
- * @par
- * Sequence collections are stored as <em>containers</em>. The simplest container implements the
- * bpp::SequenceContainer interface, providing access to sequences by their name.
- * The bpp::OrderedSequenceContainer adds access by position in the container.
- * The simplest implementation of this interface is the bpp::VectorSequenceContainer, which stores the sequences
- * as a vector of bpp::Sequence objects (or instances inheriting from this class).
- * Input/output from various file formats is provided, including fasta (bpp::Fasta), GenBank (bpp::GenBank) and Mase (bpp::Mase).
- * Tools dealing with containers can be found in the bpp::SequenceContainerTools static class.
- *
- * @par
- * Support for alignments is provided via the bpp::SiteContainer interface, which enables site access.
- * Sites are stored as a distinct class, similar to a "vertical" sequence, called bpp::Site.
- * It shares several methods with the bpp::Sequence object, although it does not contain a name but
- * a position attribute. This attribute can be used to track the position of sites when handling
- * alignments (for instance after removing all gap-containing sites).
- * There are currently two implementations of the bpp::SiteContainer interface:
- * - bpp::AlignedSequenceContainer, inheriting from bpp::VectorSequenceContainer and adding the site access.
- *   Sequence access is hence in @f$o(1)@f$ and site access in @f$o(n)@f$, n being the total number of sites.
- * - bpp::VectorSiteContainer is a symmetric implementation, storing the data as a vector of bpp::Site objects,
- *   providing site access in @f$o(1)@f$ but sequence access in @f$o(m)@f$, m being the total number of sequences.
- * The static classes bpp::SiteTools and bpp::SiteContainerTools provide some tools (for instance: pairwise alignment) to deal respectively with
- * bpp::Site and bpp::SiteContainer objects. I/O is provided for several formats, including Clustal (bpp::Clustal) and Phylip (bpp::Phylip).
- *
- * @par
- * Bio++ SeqLib also contains support for sequence properties, like amino-acids biochemical properties.
- * The interfaces bpp::AlphabetIndex1 and bpp::AlphabetIndex2 provides methods to deal with indices in 1 and 2 dimensions
- * respectively. Several basic properties are provided, together with input from the AAIndex databases.
- */
-
-namespace bpp
-{
-
-/**
- * @brief The Alphabet interface.
- * 
- * An alphabet object defines all the states allowed for a particular type of
- * sequence. These states are coded as a string and an integer.
- * The string description is the one found in the text (human comprehensive)
- * description of sequences, typically in sequence files.
- * However, for computionnal needs, this is often more efficient to store the sequences as
- * a vector of integers.
- * The link between the two descriptions is made <i>via</i>
- * the Alphabet classes, and the two methods intToChar() and charToInt().
- * The Alphabet interface also provides other methods, like getting the full name
- * of the states and so on.
- *
- * An Alphabet object in itself stores the states as AlphabetStates object, in a
- * potentially arbitrary but consistent series. All states are then indexed from
- * 0 to 'numbersOfChars'. The number of states is equal to the number of string
- * representations, but is usually higher than the number of int representation,
- * as several characters can correspond to the same state (for instance X, N and ?
- * in nucleotide alphabets).
- * 
- * The alphabet objects may throw several exceptions derived of the AlphabetException
- * class.
- *
- * @see AlphabetException, BadCharException, BadIntException 
- */
-  class Alphabet:
-    public virtual Clonable
-{
-  public:
-    Alphabet() {}
-    virtual ~Alphabet() {}
-
-  /**
-   * @name The Clonable interface
-   *
-   * @{
-   */
-#ifndef NO_VIRTUAL_COV
-  Alphabet* clone() const = 0;
-#endif
-  
-  /** @} */
-
-  public:
-    
-    /**
-     * @brief Get the complete name of a state given its int description.
-     *
-     * In case of several states with identical number (i.e. N and X for nucleic alphabets),
-     * this method returns the name of the first found in the vector.
-     *
-     * @param state The int description of the given state.
-     * @return The name of the state.
-     * @throw BadIntException When state is not a valid integer.
-     */
-    virtual std::string getName(int state) const throw (BadIntException)  = 0;
-        
-    /**
-     * @brief Get the complete name of a state given its string description.
-     *
-     * In case of several states with identical number (i.e. N and X for nucleic alphabets),
-     * this method will return the name of the first found in the vector.
-     *
-     * @param state The string description of the given state.
-     * @return The name of the state.
-     * @throw BadCharException When state is not a valid char description.
-     */
-    virtual std::string getName(const std::string& state) const throw (BadCharException) = 0;
-
-    /**
-     * @return The int code of a given state.
-     * @param stateIndex The index of the state to fetch.
-     */
-    virtual int getIntCodeAt(size_t stateIndex) const throw (IndexOutOfBoundsException) = 0;
-
-    /**
-     * @return The char code of a given state.
-     * @param stateIndex The index of the state to fetch.
-     */
-    virtual const std::string& getCharCodeAt(size_t stateIndex) const throw (IndexOutOfBoundsException) = 0;
-
-    /**
-     * @return The indices of the states with corresponding int code.
-     */
-    virtual size_t getStateIndex(int state) const throw (BadIntException) = 0;
-    
-    /**
-     * @return The index of the state with corresponding char code.
-     */
-    virtual size_t getStateIndex(const std::string& state) const throw (BadCharException) = 0;
-
-    /**
-     * @name Tests
-     *
-     * @{
-     */
-
-    /**
-     * @brief Tell if a state (specified by its int description) is allowed by the
-     * the alphabet.
-     *
-     * @param state The int description.
-     * @return 'true' if the state in known.
-     */
-    virtual bool isIntInAlphabet(int state) const = 0;
-    
-    /**
-     * @brief Tell if a state (specified by its string description) is allowed by the
-     * the alphabet.
-     *
-     * @param state The string description.
-     * @return 'true' if the state in known.
-     */
-    virtual bool isCharInAlphabet(const std::string& state) const = 0;
-    /** @} */
-
-    /**
-     * @name State access
-     *
-     * @{
-     */
-
-    /**
-     * @brief Get a state given its index.
-     *
-     * @param stateIndex The index of the state.
-     * @return The AlphabetState.
-     * @throw IndexOutOfBoundsException When index is not a valid.
-     */
-    virtual const AlphabetState& getStateAt(size_t stateIndex) const throw (IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Get a state given its int description.
-     *
-     * Note: several states can share the same int values. This function will return one.
-     *
-     * @param state The int description.
-     * @return The AlphabetState.
-     * @throw BadIntException When state is not a valid integer.
-     */
-    virtual const AlphabetState& getState(int state) const throw (BadIntException) = 0;
-
-    /**
-     * @brief Get a state given its string description.
-     *
-     * @param state The string description.
-     * @return The AlphabetState.
-     * @throw BadCharException When state is not a valid string.
-     */
-    virtual const AlphabetState& getState(const std::string& state) const throw (BadCharException) = 0;
-
-    /** @} */
-        
-    /**
-     * @name Conversion methods
-     *
-     * @{
-     */
-
-    /**
-     * @brief Give the string description of a state given its int description.
-     *
-     * @param state The int description.
-     * @return The string description.
-     * @throw BadIntException When state is not a valid integer.
-     */
-    virtual std::string intToChar(int state) const throw (BadIntException) = 0;
-        
-    /**
-     * @brief Give the int description of a state given its string description.
-     *
-     * @param state The string description.
-     * @return The int description.
-     * @throw BadCharException When state is not a valid char description.
-     */
-    virtual int charToInt(const std::string& state) const throw (BadCharException) = 0;
-    /** @} */
-        
-    /**
-     * @name Sizes.
-     *
-     * @{
-     */
- 
-    /**
-     * @brief This is a convenient  alias for getNumberOfChars(), returning a size_t
-     * instead of unsigned int.
-     *
-     * This funcion is typically used il loops over all states of an alphabet.
-     */
-    virtual size_t getNumberOfStates() const = 0;
-   
-    /**
-     * @brief Get the number of supported characters in this alphabet,
-     * including generic characters (e.g. return 20 for DNA alphabet).
-     *
-     * @return The total number of supported character descriptions.
-     */
-    virtual unsigned int getNumberOfChars() const = 0;
-        
-    /**
-     * @brief Get the number of <strong>distinct</strong> states in alphabet (e.g. return 15 for DNA alphabet).
-     * This is the number of integers used for state description.
-     *
-     * @return The number of distinct states.
-     */
-    virtual unsigned int getNumberOfTypes() const = 0;
-        
-    /**
-     * @brief Get the number of <strong>resolved</strong> states in the alphabet (e.g. return 4 for DNA alphabet).
-     * This is the method you'll need in most cases.
-     *
-     * @return The number of resolved states.
-     */
-    virtual unsigned int getSize() const = 0;
-    
-    /** @} */
-        
-    /**
-     * @name Utilitary methods
-     *
-     * @{
-     */
-    
-    /**
-     * @brief Get all resolved states that match a generic state.
-     *
-     * If the given state is not a generic code then the output vector will contain this unique code.
-     *
-     * @param state The alias to resolve.
-     * @return A vector of resolved states.
-     * @throw BadIntException When state is not a valid integer.
-     */
-    virtual std::vector<int> getAlias(int state) const throw (BadIntException) = 0;
-    
-    /**
-     * @brief Get all resolved states that match a generic state.
-     *
-     * If the given state is not a generic code then the output vector will contain this unique code.
-     *
-     * @param state The alias to resolve.
-     * @return A vector of resolved states.
-     * @throw BadCharException When state is not a valid char description.
-     */
-    virtual std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException) = 0;
-
-    /**
-     * @brief Get the generic state that match a set of states.
-     *
-     * If the given states contain generic code, each generic code is first resolved and then the new generic state is returned.
-     * If only a single resolved state is given the function return this state.
-     *
-     * @param states A vector of states to resolve.
-     * @return A int code for the computed state.
-     * @throw BadIntException When a state is not a valid integer.
-     */
-    virtual int getGeneric(const std::vector<int>& states) const throw (BadIntException) = 0;
-
-    /**
-     * @brief Get the generic state that match a set of states.
-     *
-     * If the given states contain generic code, each generic code is first resolved and then the new generic state is returned.
-     * If only a single resolved state is given the function return this state.
-     *
-     * @param states A vector of states to resolve.
-     * @return A string code for the computed state.
-     * @throw BadCharException when a state is not a valid char description.
-     * @throw CharStateNotSupportedException when the alphabet does not support Char state for unresolved state.
-     */
-    virtual std::string getGeneric(const std::vector<std::string>& states) const throw (AlphabetException) = 0;
-
-    /**
-     * @return A list of all supported int codes.
-     *
-     * Note for developers of new alphabets:
-     * we return a const reference here since the list is supposed to be
-     * stored within the class and should not be modified outside the class.
-     */
-    virtual const std::vector<int>& getSupportedInts() const = 0;
-    
-    /**
-     * @return A list of all supported character codes.
-     *
-     * Note for developers of new alphabets:
-     * we return a const reference here since the list is supposed to be
-     * stored within the class and should not be modified outside the class.
-     */
-    virtual const std::vector<std::string>& getSupportedChars() const = 0;
-    
-    /**
-     * @return The int code for unknown characters.
-     */
-    virtual int getUnknownCharacterCode() const = 0;
-
-    /**
-     * @return The int code for gap characters.
-     */
-    virtual int getGapCharacterCode() const = 0;
-
-    /**
-     * @param state The state to test.
-     * @return 'True' if the state is a gap.
-     */
-    virtual bool isGap(int state) const = 0;
-
-    /**
-     * @param state The state to test.
-     * @return 'True' if the state is a gap.
-     */
-    virtual bool isGap(const std::string& state) const = 0;
-
-    /**
-     * @param state The state to test.
-     * @return 'True' if the state is unresolved.
-     */
-    virtual bool isUnresolved(int state) const = 0;
-
-    /**
-     * @param state The state to test.
-     * @return 'True' if the state is unresolved.
-     */
-    virtual bool isUnresolved(const std::string& state) const = 0;
-
-    /** @} */
-
-    /**
-     * @brief Identification method.
-     *
-     * Used to tell if two alphabets describe the same type of sequences.
-     * For instance, this method is used by sequence containers to compare two alphabets and
-     * allow or deny addition of sequences.
-     *
-     * @return A text describing the alphabet.
-     */
-    virtual std::string getAlphabetType() const = 0;
-
-    /**
-     * @brief Get the size of the string coding a state.
-     * @return The size of the tring coding each states in the Alphabet.
-     * @author Sylvain Gaillard
-     */
-    virtual unsigned int getStateCodingSize() const = 0;
-
-    /**
-     * @brief Comparison of alphabets
-     *
-     * @return true If the two instances are of the same class.
-     */
-    virtual bool equals(const Alphabet& alphabet) const = 0;
-};
-
-} //end of namespace bpp.
-
-#endif // _ALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/AlphabetExceptions.h b/src/Bpp/Seq/Alphabet/AlphabetExceptions.h
deleted file mode 100644
index 1f04a37..0000000
--- a/src/Bpp/Seq/Alphabet/AlphabetExceptions.h
+++ /dev/null
@@ -1,213 +0,0 @@
-//
-// File: AlphabetExceptions.h
-// Created by: Julien Dutheil
-// Created on: Mon Nov  3 16:41:53 2003
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ALPHABETEXCEPTIONS_H_
-#define _ALPHABETEXCEPTIONS_H_
-
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <vector>
-
-namespace bpp
-{
-
-class Alphabet;
-
-/**
- * @brief The alphabet exception base class.
- * 
- * @see Alphabet, Exception
- */
-class AlphabetException:
-  public Exception
-{
-	private:
-		const Alphabet* alphabet_;
-			
-	public:
-		/**
-		 * @brief Build a new AlphabetException object.
-		 * 
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param alpha A const pointer toward the alphabet that threw the exception.
-		 */
-		AlphabetException(const std::string& text, const Alphabet* alpha = 0);
-		
-    AlphabetException(const AlphabetException& ae): Exception(ae), alphabet_(ae.alphabet_) {}
-    AlphabetException& operator=(const AlphabetException& ae)
-    {
-      Exception::operator=(ae);
-      alphabet_ = ae.alphabet_;
-      return *this;
-    }
-	
-		virtual ~AlphabetException() throw () {}
-        
-	public:
-		/**
-		 * @brief Get the alphabet that threw the exception.
-		 * 
-		 * @return a const pointer toward the alphabet.
-		 */
-		virtual const Alphabet* getAlphabet() const { return alphabet_; }
-};
-
-/**
- * @brief An alphabet exception thrown when trying to specify a bad char to the alphabet.
- */
-class BadCharException:
-  public AlphabetException
-{
-	protected:
-    std::string c_;
-	
-	public:
-		/**
-		 * @brief Build a new BadCharException.
-		 * 
-		 * @param badChar The faulty character.
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param alpha A const pointer toward the alphabet that threw the exception.
-		 */
-		BadCharException(const std::string & badChar, const std::string & text = "", const Alphabet * alpha = 0);
-	
-		virtual ~BadCharException() throw() {};
-	
-	public:
-		/**
-		 * @brief Get the character that threw the exception.
-		 * 
-		 * @return the faulty character.
-		 */
-		virtual std::string getBadChar() const;
-};
-
-/**
- * @brief An alphabet exception thrown when trying to specify a bad int to the alphabet.
- */
-class BadIntException:
-  public AlphabetException
-{
-	protected:
-		int i_;
-	
-	public:
-		/**
-		 * @brief Build a new BadIntException.
-		 * @param badInt The faulty integer.
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param alpha A const pointer toward the alphabet that threw the exception.
-		 */
-		BadIntException(int badInt, const std::string& text = "", const Alphabet* alpha = 0);
-	
-		virtual ~BadIntException() throw() {}
-
-	public:
-		/**
-		 * @brief Get the integer that threw the exception.
-		 * 
-		 * @return the faulty integer.
-		 */
-		virtual int getBadInt() const;
-};
-
-/**
- * @brief Exception thrown when two alphabets do not match.
- *
- * Typically, this may occur when you try to add a bad sequence to a container,
- * or concatenate two kinds of sequences, and so on.
- */
-class AlphabetMismatchException : public Exception
-{
-	private:
-		const Alphabet* alphabet1_, * alphabet2_;
-	
-	public:
-           
-		/**
-		 * @brief Build a new AlphabetMismatchException object.
-     *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param alpha1 A const pointer toward the first alphabet.
-		 * @param alpha2 A const pointer toward the second alphabet, i.e. the one which does not match with the first.
-		 */
-		AlphabetMismatchException(const std::string& text = "", const Alphabet* alpha1 = 0, const Alphabet* alpha2 = 0);
-	
-    AlphabetMismatchException(const AlphabetMismatchException& ame): Exception(ame), alphabet1_(ame.alphabet1_), alphabet2_(ame.alphabet2_) {}
-    AlphabetMismatchException& operator=(const AlphabetMismatchException& ame)
-    {
-      Exception::operator=(ame);
-      alphabet1_ = ame.alphabet1_;
-      alphabet2_ = ame.alphabet2_;
-      return *this;
-    }
-
-		virtual ~AlphabetMismatchException() throw() {}
-
-	public:
-		/**
-		 * @brief Get the alphabets that do not match.
-     *
-		 * @return a vector of pointers toward the alphabets.
-		 */
-    std::vector<const Alphabet *> getAlphabets() const;
-};
-
-/**
- * @brief Exception thrown in case no character is available for a certain state in an alphabet.
- */
-class CharStateNotSupportedException : public AlphabetException
-{
-  public:
-    /**
-     * @brief Build a new CharStateNotSupportedException.
-     *
-     * @param text A message to be passed to the exception hierarchy.
-     * @param alpha A const pointer toward the alphabet that threw the exception.
-     */
-    CharStateNotSupportedException(const std::string & text = "", const Alphabet * alpha = 0);
-
-    virtual ~CharStateNotSupportedException() throw() {};
-};
-
-} //end of namespace bpp.
-
-#endif	//_ALPHABETEXCEPTIONS_H_
-
diff --git a/src/Bpp/Seq/Alphabet/AlphabetState.h b/src/Bpp/Seq/Alphabet/AlphabetState.h
deleted file mode 100644
index 8893add..0000000
--- a/src/Bpp/Seq/Alphabet/AlphabetState.h
+++ /dev/null
@@ -1,132 +0,0 @@
-// 
-// File:    AlphabetState.h
-// Author:  Sylvain Gaillard
-// Created: 29/07/2009 13:56:01
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (July 29, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ALPHABETSTATE_H_
-#define _ALPHABETSTATE_H_
-
-#include <Bpp/Clonable.h>
-
-// From the STL
-#include <string>
-
-namespace bpp {
-  /**
-   * @brief This is the base class to describe states in an Alphabet.
-   *
-   * @author Sylvain Gaillard
-   */
-  class AlphabetState: public virtual Clonable {
-    private:
-      int num_;
-      std::string letter_;
-      std::string name_;
-
-    public:
-      AlphabetState(int num, const std::string& letter, const std::string& name): num_(num), letter_(letter), name_(name) {}
-
-      // Class destructor
-      virtual ~AlphabetState() {}
-
-    public:
-      /**
-       * @name The Clonable interface.
-       * @{
-       */
-#ifdef NO_VIRTUAL_COV
-      Clonable*
-#else
-      AlphabetState*
-#endif
-      clone() const { return new AlphabetState(* this); }
-      /** @} */
-      /**
-       * @brief Get the state's number.
-       *
-       * @return The state's number (i.e. -1 for gap (-)).
-       */
-      int getNum() const { return num_; }
-      /**
-       * @brief Set the state's number.
-       *
-       * @param num The state's number.
-       */
-      void setNum(int num) { num_ = num; }
-
-      /** 
-       * @brief Get the letter(s) corresponding to the state.
-       *
-       * The letter is a string because it may more than one char
-       * (for instance: codon).
-       *
-       * @return The state's letter.
-       */
-      const std::string& getLetter() const { return letter_; }
-      /**
-       * @brief Set the letter(s) of the state.
-       *
-       * @param letter The state's letter.
-       */
-      void setLetter(const std::string& letter) { letter_ = letter; }
-
-      /**
-       * @brief Get the name of the state.
-       *
-       * @return The full name of the state (i.e. Adenine).
-       */
-      const std::string& getName() const { return name_; }
-      /**
-       * @brief Set the name of the state.
-       *
-       * @param name The state's name
-       */
-      void setName(const std::string& name) { name_ = name; }
-
-      /**
-       * @brief operator ==
-       *
-       * Comparison is done on state num
-       */
-      bool operator == (AlphabetState& l2) {
-        return getNum() == l2.getNum();
-      }
-  };
-}
-
-#endif // _ALPHABETSTATE_H_
-
diff --git a/src/Bpp/Seq/Alphabet/AlphabetTools.cpp b/src/Bpp/Seq/Alphabet/AlphabetTools.cpp
deleted file mode 100644
index 645e0e3..0000000
--- a/src/Bpp/Seq/Alphabet/AlphabetTools.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// File: AlphabetTools.cpp
-// Created by: Julien Dutheil
-// Created on: Fri Oct 10 17:27:39 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "AlphabetTools.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <ctype.h>
-#include <iostream>
-
-using namespace std;
-
-/**********************************************************************************************/
-
-const DNA AlphabetTools::DNA_ALPHABET;
-const RNA AlphabetTools::RNA_ALPHABET;
-const ProteicAlphabet AlphabetTools::PROTEIN_ALPHABET;
-const DefaultAlphabet AlphabetTools::DEFAULT_ALPHABET;
-
-/**********************************************************************************************/
-
-int AlphabetTools::getType(char state)
-{
-  if (state == '-')
-    return -1;
-  state = static_cast<char>(toupper(static_cast<int>(state))); // toupper works on int
-  bool d = DNA_ALPHABET.isCharInAlphabet(TextTools::toString(state));
-  bool r = RNA_ALPHABET.isCharInAlphabet(TextTools::toString(state));
-  bool p = PROTEIN_ALPHABET.isCharInAlphabet(TextTools::toString(state));
-
-  if (!d && !r && !p)
-    return 0;  // Unknown character
-  else if (d && !r && !p)
-    return 1;  // DNA specific
-  else if (!d && r && !p)
-    return 2;  // RNA specific
-  else if (!d && !r && p)
-    return 3;  // Protein specific
-  else if (d && r && !p)
-    return 4;  // Nucleotide specific
-  else if (d && !r && p)
-    return 5;  // DNA or Protein specific
-  else if (!d && r && p)
-    return 6;  // RNA or Protein specific
-  else
-    return 7;  // Non-specific character
-}
-
-/**********************************************************************************************/
-
-bool AlphabetTools::checkAlphabetCodingSize(const Alphabet& alphabet) throw (AlphabetException)
-{
-  if (alphabet.getNumberOfChars() == 0)
-    return true;  // Will this really happen?
-  size_t size = alphabet.intToChar(0).size();
-  for (int i = 1; i < static_cast<int>(alphabet.getNumberOfTypes()); ++i)
-  {
-    if (alphabet.intToChar(i).size() != size)
-      return false;
-  }
-  return true;
-}
-
-/**********************************************************************************************/
-
-bool AlphabetTools::checkAlphabetCodingSize(const Alphabet* alphabet) throw (AlphabetException)
-{
-  return checkAlphabetCodingSize(*alphabet);
-}
-
-/**********************************************************************************************/
-
-unsigned int AlphabetTools::getAlphabetCodingSize(const Alphabet& alphabet) throw (AlphabetException)
-{
-  if (!checkAlphabetCodingSize(alphabet))
-    throw AlphabetException("Bad alphabet in function Alphabet::getAlphabetCodingSize().");
-  return static_cast<unsigned int>(alphabet.intToChar(0).size());
-}
-
-/**********************************************************************************************/
-
-unsigned int AlphabetTools::getAlphabetCodingSize(const Alphabet* alphabet) throw (AlphabetException)
-{
-  return getAlphabetCodingSize(*alphabet);
-}
-
-/**********************************************************************************************/
-
diff --git a/src/Bpp/Seq/Alphabet/AlphabetTools.h b/src/Bpp/Seq/Alphabet/AlphabetTools.h
deleted file mode 100644
index 3d3b356..0000000
--- a/src/Bpp/Seq/Alphabet/AlphabetTools.h
+++ /dev/null
@@ -1,231 +0,0 @@
-//
-// File: AlphabetTools.h
-// Created by: Julien Dutheil
-// Created on: Fri Oct 10 17:27:39 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _ALPHABETTOOLS_H_
-#define _ALPHABETTOOLS_H_
-
-#include "DNA.h"
-#include "RNA.h"
-#include "ProteicAlphabet.h"
-#include "DefaultAlphabet.h"
-#include "CodonAlphabet.h"
-#include "RNY.h"
-#include "BinaryAlphabet.h"
-#include <Bpp/Numeric/VectorTools.h>
-
-#include <typeinfo>
-
-namespace bpp
-{
-/**
- * @brief Utilitary functions dealing with alphabets.
- */
-class AlphabetTools
-{
-public:
-  static const DNA DNA_ALPHABET;
-  static const RNA RNA_ALPHABET;
-  static const ProteicAlphabet PROTEIN_ALPHABET;
-  static const DefaultAlphabet DEFAULT_ALPHABET;
-
-public:
-  AlphabetTools() {}
-  virtual ~AlphabetTools() {}
-
-public:
-  /**
-   * @brief Character identification method for sequence's alphabet identification
-   *
-   * Return :
-   * - -1 gap
-   * - 1 DNA specific (no character!)
-   * - 2 RNA specific (U)
-   * - 3 Protein specific (characters E, F, I, L, P, Q)
-   * - 4 Nucleotide specific (no character)
-   * - 5 DNA or Protein specific (T)
-   * - 6 RNA or Protein specific (no character)
-   * - 7 Any alphabet (A, B, C, D, G, H, J, K, M, N, O, R, S, V, W, X, Y, Z, 0)
-   * - 0 Unknown character
-   *
-   * @param state The character to test.
-   * @return The type code.
-   */
-  static int getType(char state);
-
-  /**
-   * @brief This checks that all characters in the alphabet are coded by a string of same length.
-   *
-   * This method is used when states are coded by more than one character, typically: codon alphabets.
-   *
-   * @param alphabet The alphabet to check.
-   * @return True if all text description have the same length (e.g. 3 for codon alphabet).
-   */
-  static bool checkAlphabetCodingSize(const Alphabet& alphabet) throw (AlphabetException);
-
-  /**
-   * @brief This checks that all characters in the alphabet are coded by a string of same length.
-   *
-   * This function performs the same work as the previous one, but deals with pointers
-   * instead of reference. This may be more convenient since we often use pointers on alphabets.
-   *
-   * @param alphabet a pointer toward the alphabet to check.
-   * @return True if all text description have the same length (e.g. 3 for codon alphabet).
-   */
-  static bool checkAlphabetCodingSize(const Alphabet* alphabet) throw (AlphabetException);
-
-  /**
-   * @brief In case that all states in the given alphabet have a string description of same length,
-   * send this length; e.g. 3 for codon alphabets.
-   *
-   * @param alphabet The alphabet to analyse.
-   * @return The common size of all text descriptionif there is one. Else throws an AlphabetException.
-   */
-  static unsigned int getAlphabetCodingSize(const Alphabet& alphabet) throw (AlphabetException);
-
-  /**
-   * @brief In case that all states in the given alphabet have a string description of same length,
-   * send this length; e.g. 3 for codon alphabets.
-   *
-   * This function performs the same work as the previous one, but deals with pointers
-   * instead of reference. This may be more convenient since we often use pointers on alphabets.
-   *
-   * @param alphabet a pointer toward the alphabet to analyse.
-   * @return The common size of all text descriptionif there is one. Else throws an AlphabetException.
-   */
-  static unsigned int getAlphabetCodingSize(const Alphabet* alphabet) throw (AlphabetException);
-
-  /**
-   * @return True if the alphabet is an instanciation of the NucleicAlphabet class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isNucleicAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<NucleicAlphabet>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the DNA class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isDNAAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<DNA>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the RNA class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isRNAAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<RNA>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the ProteicAlphabet class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isProteicAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<ProteicAlphabet>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the Codon class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isCodonAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<CodonAlphabet>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the WordAlphabet class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isWordAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<WordAlphabet>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the RNY class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isRNYAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<RNY>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the BinaryAlphabet class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isBinaryAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<BinaryAlphabet>(alphabet); }
-
-  /**
-   * @return True if the alphabet is an instanciation of the DefaultAlphabet class.
-   * @param alphabet The alphabet to check.
-   */
-  static bool isDefaultAlphabet(const Alphabet* alphabet) { return alphabetInheritsFrom<DefaultAlphabet>(alphabet); }
-
-  /**
-   * @brief Tell if two characters match according to a given alphabet.
-   *
-   * Example (DNA):
-   * @verbatim
-   * A,T: false
-   * A,A: true
-   * A,N: true
-   * A,Y: false
-   * N,Y: true
-   * N,N: true
-   * @endverbatim
-   *
-   * @return True if the two characters are identical, or are compatible if at least one of them is a generic character.
-   * @param alphabet The alphabet to use.
-   * @param i First character to check.
-   * @param j Secondt character to check.
-   */
-  static bool match(const Alphabet* alphabet, int i, int j)
-  {
-    std::vector<int> a = alphabet->getAlias(i);
-    std::vector<int> b = alphabet->getAlias(j);
-    std::vector<int> u = VectorTools::vectorIntersection(a, b);
-    return u.size() > 0;
-  }
-
-private:
-  template<class Y>
-  static bool alphabetInheritsFrom(const Alphabet* alphabet)
-  {
-    try
-    {
-      const Y* t = dynamic_cast<const Y*>(alphabet);
-      return t != 0; // Solves strange behavior in new gcc?
-    }
-    catch (std::exception& e)
-    {
-      return false;
-    }
-  }
-};
-} // end of namespace bpp.
-
-#endif  // _ALPHABETTOOLS_H_
-
diff --git a/src/Bpp/Seq/Alphabet/BinaryAlphabet.cpp b/src/Bpp/Seq/Alphabet/BinaryAlphabet.cpp
deleted file mode 100644
index 522b812..0000000
--- a/src/Bpp/Seq/Alphabet/BinaryAlphabet.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// File: BinaryAlphabet.cpp
-// Authors: Laurent Gueguen
-// Created on: 2009
-//
-
-/*
-   Copyright or � or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-
-#include "BinaryAlphabet.h"
-#include "AlphabetState.h"
-
-// From Utils:
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-BinaryAlphabet::BinaryAlphabet()
-{
-  // Alphabet content definition
-  registerState(new AlphabetState(-1, "-", "Gap"));
-
-  for (int i = 0; i < 2; i++)
-  {
-    registerState(new AlphabetState(i, TextTools::toString(i), ""));
-  }
-}
-
diff --git a/src/Bpp/Seq/Alphabet/BinaryAlphabet.h b/src/Bpp/Seq/Alphabet/BinaryAlphabet.h
deleted file mode 100644
index 563af67..0000000
--- a/src/Bpp/Seq/Alphabet/BinaryAlphabet.h
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-// File: BinaryAlphabet.h
-// Author: L Gueguen
-//
-
-/*
-   Copyright or � or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _BINARYALPHABET_H_
-#define _BINARYALPHABET_H_
-
-#include "AbstractAlphabet.h"
-
-namespace bpp
-{
-/**
- * @brief The BinaryAlphabet class, letters are 0 and 1.
- * @author Laurent Gueguen
- *
- */
-class BinaryAlphabet :
-  public AbstractAlphabet
-{
-public:
-  // class constructor
-  BinaryAlphabet();
-
-  BinaryAlphabet(const BinaryAlphabet& bia) : AbstractAlphabet(bia) {}
-
-  BinaryAlphabet& operator=(const BinaryAlphabet& bia)
-  {
-    AbstractAlphabet::operator=(bia);
-
-    return *this;
-  }
-
-  BinaryAlphabet* clone() const
-  {
-    return new BinaryAlphabet(*this);
-  }
-  
-  // class destructor
-  virtual ~BinaryAlphabet() {}
-
-public:
-  unsigned int getSize() const { return 2; }
-  unsigned int getNumberOfTypes() const { return 2; }
-  std::string getAlphabetType() const { return "Binary alphabet"; }
-  int getUnknownCharacterCode() const { return 3; }
-  bool isUnresolved(int state) const { return state == 3; }
-  bool isUnresolved(const std::string& state) const { return false; }
-};
-} // end of namespace bpp.
-
-#endif // _BINARYALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.cpp b/src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.cpp
deleted file mode 100644
index 7acc094..0000000
--- a/src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// File: CaseMaskedAlphabet.cpp
-// Created by: Julien Dutheil
-// Created on: Sun Sep 05 2010
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "CaseMaskedAlphabet.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-//From the STL:
-#include <vector>
-#include <iostream>
-
-using namespace std;
-
-CaseMaskedAlphabet::CaseMaskedAlphabet(const LetterAlphabet* nocaseAlphabet) :
-  LetterAlphabet(true),
-  nocaseAlphabet_(nocaseAlphabet)
-{
-  vector<string> chars = nocaseAlphabet_->getSupportedChars();
-  for (size_t i = 0; i < chars.size(); ++i) {
-    AlphabetState* state = nocaseAlphabet_->getState(chars[i]).clone();
-    registerState(state);
-    char c = *chars[i].c_str();
-    if (isalpha(c)) {
-      if (isupper(c)) {
-        registerState(new AlphabetState(state->getNum() + 100, TextTools::toLower(state->getLetter()), string("Masked ") + state->getName()));
-      }
-    }
-  }
-}
-
-int CaseMaskedAlphabet::getMaskedEquivalentState(int state) const
-  throw (BadIntException)
-{
-  if (!isIntInAlphabet(state))
-    throw BadIntException(state, "CaseMaskedAlphabet::getMaskedEquivalentState. Unsupported state code.");
-  if (state >= 100) return state;
-  else {
-    state += 100;
-    if (!isIntInAlphabet(state))
-      throw BadIntException(state, "CaseMaskedAlphabet::getMaskedEquivalentState. State has masked equivalent.");
-    return state;
-  }
-}
-
-const string CaseMaskedAlphabet::getMaskedEquivalentState(const string& state) const
-  throw (BadCharException, BadIntException)
-{
-  if (!isCharInAlphabet(state))
-    throw BadCharException(state, "CaseMaskedAlphabet::getMaskedEquivalentState. Unsupported state code.");
-  int code = charToInt(state);
-  if (code >= 100) return state;
-  else {
-    code += 100;
-    if (!isIntInAlphabet(code))
-      throw BadIntException(code, "CaseMaskedAlphabet::getMaskedEquivalentState. State has masked equivalent.");
-    return intToChar(code);
-  }
-}
-
-
diff --git a/src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.h b/src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.h
deleted file mode 100644
index 5c90a29..0000000
--- a/src/Bpp/Seq/Alphabet/CaseMaskedAlphabet.h
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// File: CaseMaskedAlphabet.h
-// Created by: Julien Dutheil
-// Created on: Sun Sep 05 2010
-//
-
-/*
-  Copyright or © or Copr. CNRS, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _CASEMASKEDALPHABET_H_
-#define _CASEMASKEDALPHABET_H_
-
-#include "LetterAlphabet.h"
-
-//From the STL:
-#include <string>
-
-namespace bpp
-{
-
-/**
- * @brief Case-sensitive letter alphabet.
- *
- * This alphabet is used for parsing comodity.
- * It takes as input another LetterAlphabet and will create duplicate any aphanumerical and upper case state,
- * by creating a lower case version of the state, also named "masked" state.
- * Helper functions are provided to determine whether a given state is masked or unmasked.
- */
-  class CaseMaskedAlphabet :
-    public LetterAlphabet
-  {
-  public:
-    const LetterAlphabet* nocaseAlphabet_;
-
-  public:
-    CaseMaskedAlphabet(const LetterAlphabet* nocaseAlphabet);
-
-    CaseMaskedAlphabet(const CaseMaskedAlphabet& cma) :
-      LetterAlphabet(cma), nocaseAlphabet_(cma.nocaseAlphabet_) {}
-
-    CaseMaskedAlphabet& operator=(const CaseMaskedAlphabet& cma) {
-      LetterAlphabet::operator=(cma);
-      nocaseAlphabet_ = cma.nocaseAlphabet_;
-      return *this;
-    }
-
-    CaseMaskedAlphabet* clone() const
-    {
-      return new CaseMaskedAlphabet(*this);
-    }
-    
-  public:
-    unsigned int getSize() const { return nocaseAlphabet_->getSize(); }
-    unsigned int getNumberOfTypes() const { return nocaseAlphabet_->getNumberOfTypes(); }
-    std::string getAlphabetType() const { return "Default alphabet"; }
-    int getUnknownCharacterCode() const { return nocaseAlphabet_->getUnknownCharacterCode(); }
-    bool isUnresolved(int state) const { return nocaseAlphabet_->isUnresolved(state); }
-    bool isUnresolved(const std::string& state) const { return nocaseAlphabet_->isUnresolved(state); }
-
-    const Alphabet* getUnmaskedAlphabet() const { return nocaseAlphabet_; }
-
-    bool isMasked(int state) const { return state >= 100; }
-    bool isMasked(const std::string& state) const {
-      char c = state.c_str()[0];
-      return isMasked(c);
-    }
-    bool isMasked(char state) const {
-      return isalpha(state) && !isupper(state);
-    }
-
-    /**
-     * @brief Get the masked state equivalent to the input one.
-     *
-     * If the input state is masked, returns it "as is".
-     * @param state The input state.
-     * @throw BadIntException if the input state is not supported, or if there is no quivallent masked state.
-     */
-    int getMaskedEquivalentState(int state) const throw (BadIntException);
-    /**
-     * @brief Get the masked state equivalent to the input one.
-     *
-     * If the input state is masked, returns it "as is".
-     * @param state The input state.
-     * @throw BadCharException if the input state is not supported.
-     * @throw BadIntException if there is no equivalent masked state.
-     */
-    const std::string getMaskedEquivalentState(const std::string& state) const throw (BadCharException, BadIntException);
-
-  };
-
-} // end of namespace bpp
-
-#endif //_CASEMASKEDALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/CodonAlphabet.h b/src/Bpp/Seq/Alphabet/CodonAlphabet.h
deleted file mode 100644
index b08f0e3..0000000
--- a/src/Bpp/Seq/Alphabet/CodonAlphabet.h
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-// File: CodonAlphabet.h
-// Created by: Julien Dutheil
-// Created on: Sun Oct 12 17:41:56 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL license under French law and
-abiding by the rules of distribution of free software. You can use,
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info".
-
-As a counterpart to the access to the source code and rights to copy,
-modify and redistribute granted by the license, users are provided
-only with a limited warranty and the software's author, the holder of
-the economic rights, and the successive licensors have only limited
-liability.
-
-In this respect, the user's attention is drawn to the risks associated
-with loading, using, modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean that it is complicated to manipulate, and that also
-therefore means that it is reserved for developers and experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards
-their requirements in conditions enabling the security of their
-systems and/or data to be ensured and, more generally, to use and
-operate it in the same conditions as regards security.
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _CODONALPHABET_H_
-#define _CODONALPHABET_H_
-
-#include "WordAlphabet.h"
-#include "NucleicAlphabet.h"
-
-// From the STL:
-#include <string>
-
-
-namespace bpp
-{
-
-/**
- * @brief Codon alphabet class.
- * @author Laurent Guéguen, Julien Dutheil
- * 
- * A codon alphabet object is a particular case of WordAlphabet with three letters. 
- * Since codons are made of 3 nucleic bases (RNA or DNA), this class
- * has a NucleicAlphabet field used to check char description. This
- * nucleic alphabet is passed to the constructor. This class also adds
- * some methods specific to codon manipulation.
- */
-class CodonAlphabet:
-  public WordAlphabet
-{
-public: // Constructor and destructor.
-		
-  /**
-   * @brief Builds a new codon alphabet from a nucleic alphabet.
-   * 
-   * @param alpha The nucleic alphabet to be used.
-   */
-  CodonAlphabet(const NucleicAlphabet* alpha) :
-    WordAlphabet(alpha, 3) {}
-
-  CodonAlphabet(const CodonAlphabet& bia) : WordAlphabet(bia) {}
-
-  CodonAlphabet& operator=(const CodonAlphabet& bia)
-  {
-    WordAlphabet::operator=(bia);
-    return *this;
-  }
-  
-  CodonAlphabet* clone() const
-  {
-    return new CodonAlphabet(*this);
-  }
-
-  virtual ~CodonAlphabet() {}
-  
-  std::string getAlphabetType() const
-  {
-    return "Codon alphabet("+ vAbsAlph_[0]->getAlphabetType() + ")";
-  }
-
-  
-public:
-  
-  /**
-   * @name Codon specific methods
-   *
-   * @{
-   */
-
-  /**
-   * @brief Get the int code for a codon given the int code of the three underlying positions.
-   *
-   * The int code of each position must match the nucleic alphabet specified for this alphabet.
-   * @param pos1 Int description for position 1.
-   * @param pos2 Int description for position 2.
-   * @param pos3 Int description for position 3.
-   * @return The int code of the codon.
-   */
-  virtual int getCodon(int pos1, int pos2, int pos3) const throw (BadIntException);
-  
-  /**
-   * @brief Get the char code for a codon given the char code of the three underlying positions.
-   *
-   * The char code of each position must match the nucleic alphabet specified for this alphabet.
-   * NB: This performs pos1 + pos2 + pos3 after checking for each position validity.
-   * @param pos1 Char description for position 1.
-   * @param pos2 Char description for position 2.
-   * @param pos3 Char description for position 3.
-   * @return The Char code of the codon.
-   */
-  virtual std::string getCodon(const std::string& pos1, const std::string& pos2, const std::string& pos3) const throw (BadCharException);
-  
-  /**
-   * @brief Get the int code of the first position of a codon given its int description.
-   * 
-   * @param codon The int description of the codon.
-   * @return The int description of the first position of the codon.
-   */
-  virtual int getFirstPosition(int codon) const throw (BadIntException);
-  
-  /**
-   * @brief Get the int code of the second position of a codon given its int description.
-   * 
-   * @param codon The int description of the codon.
-   * @return The int description of the second position of the codon.
-   */
-  virtual int getSecondPosition(int codon) const throw (BadIntException);
-  
-  /**
-   * @brief Get the int code of the third position of a codon given its int description.
-   * 
-   * @param codon The int description of the codon.
-   * @return The int description of the third position of the codon.
-   */
-  virtual int getThirdPosition(int codon) const throw (BadIntException);
-  
-  /**
-   * @brief Get the char code of the first position of a codon given its char description.
-   * 
-   * @param codon The char description of the codon.
-   * @return The char description of the first position of the codon.
-   */
-  virtual std::string getFirstPosition (const std::string& codon) const throw (BadCharException);
-  
-  /**
-   * @brief Get the char code of the second position of a codon given its char description.
-   * 
-   * @param codon The char description of the codon.
-   * @return The char description of the second position of the codon.
-   */
-  virtual std::string getSecondPosition(const std::string& codon) const throw (BadCharException);
-  
-  /**
-   * @brief Get the char code of the third position of a codon given its char description.
-   * 
-   * @param codon The char description of the codon.
-   * @return The char description of the third position of the codon.
-   */
-  virtual std::string getThirdPosition(const std::string& codon) const throw (BadCharException);
-  
-  /**
-   * @return The nucleic alphabet associated to this codon alphabet.
-   */
-  virtual const NucleicAlphabet* const getNucleicAlphabet() const
-  {
-    return dynamic_cast<const NucleicAlphabet*>(vAbsAlph_[0]);
-  }
-  
-  /** @} */
-};
-
-} //end of namespace bpp.
-
-#endif	//_CODONALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/DNA.cpp b/src/Bpp/Seq/Alphabet/DNA.cpp
deleted file mode 100644
index e6cdf0d..0000000
--- a/src/Bpp/Seq/Alphabet/DNA.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-//
-// File: DNA.cpp
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "DNA.h"
-#include "AlphabetState.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Utils/MapTools.h>
-
-using namespace bpp;
-
-// From STL:
-#include <map>
-
-using namespace std;
-
-/******************************************************************************/
-
-DNA::DNA(bool exclamationMarkCountsAsGap)
-{
-	// Alphabet content definition
-	// all unresolved bases use n°14
-  registerState(new NucleicAlphabetState(-1, "-",  0, "Gap"));
-  registerState(new NucleicAlphabetState( 0, "A",  1, "Adenine"));
-  registerState(new NucleicAlphabetState( 1, "C",  2, "Cytosine"));
-  registerState(new NucleicAlphabetState( 2, "G",  4, "Guanine"));
-  registerState(new NucleicAlphabetState( 3, "T",  8, "Thymine"));
-  registerState(new NucleicAlphabetState( 4, "M",  3, "Adenine or Cytosine"));
-  registerState(new NucleicAlphabetState( 5, "R",  5, "Purine (Adenine or Guanine)"));
-  registerState(new NucleicAlphabetState( 6, "W",  9, "Adenine or Thymine"));
-  registerState(new NucleicAlphabetState( 7, "S",  6, "Cytosine or Guanine"));
-  registerState(new NucleicAlphabetState( 8, "Y", 10, "Pyrimidine (Cytosine or Thymine)"));
-  registerState(new NucleicAlphabetState( 9, "K", 12, "Guanine or Thymine"));
-  registerState(new NucleicAlphabetState(10, "V",  7, "Adenine or Cytosine or Guanine"));
-  registerState(new NucleicAlphabetState(11, "H", 11, "Adenine or Cytosine or Thymine"));
-  registerState(new NucleicAlphabetState(12, "D", 13, "Adenine or Guanine or Thymine"));
-  registerState(new NucleicAlphabetState(13, "B", 14, "Cytosine or Guanine or Thymine"));
-  registerState(new NucleicAlphabetState(14, "N", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "X", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "O", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "0", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "?", 15, "Unresolved base"));
-  if (exclamationMarkCountsAsGap)
-    registerState(new NucleicAlphabetState(-1, "!", 0, "Frameshift"));
-  else
-    registerState(new NucleicAlphabetState(14, "!", 15, "Unresolved base"));
-}
-
-/******************************************************************************/
-
-std::vector<int> DNA::getAlias(int state) const throw (BadIntException) 
-{
-	if (!isIntInAlphabet(state))
-    throw BadIntException(state, "DNA::getAlias(int): Specified base unknown.");
-	vector<int> v;
-  const NucleicAlphabetState& st = getState(state);
-  if (state == -1)
-    v.push_back(-1);
-  if (st.getBinaryCode() & 1)
-    v.push_back(0);
-  if (st.getBinaryCode() & 2)
-    v.push_back(1);
-  if (st.getBinaryCode() & 4)
-    v.push_back(2);
-  if (st.getBinaryCode() & 8)
-    v.push_back(3);
-	return v;
-}
-
-
-/******************************************************************************/
-
-std::vector<std::string> DNA::getAlias(const std::string& state) const throw (BadCharException) 
-{
-  string locstate = TextTools::toUpper(state);
-	if(!isCharInAlphabet(locstate)) throw BadCharException(locstate, "DNA::getAlias(int): Specified base unknown.");
-  vector<int> vi = this->getAlias(this->charToInt(state));
-	vector<string> v;
-  for (unsigned int i = 0 ; i < vi.size() ; i++)
-    v.push_back(this->intToChar(vi[i]));
-	return v;
-}
-
-/******************************************************************************/
-
-int DNA::getGeneric(const std::vector<int>& states) const throw (BadIntException)
-{
-  int v = 0;
-  for (size_t i = 0 ; i < states.size() ; ++i) {
-    if (!isIntInAlphabet(states[i])) throw BadIntException(states[i], "DNA::getGeneric(const vector<int>& states): Specified base unknown.");
-    v |= getState(states[i]).getBinaryCode();
-  }
-  return getStateByBinCode(v).getNum();
-}
-
-/******************************************************************************/
-
-std::string DNA::getGeneric(const std::vector<std::string>& states) const throw (BadCharException)
-{
-  vector<int> vi;
-  for (unsigned int i = 0 ; i < states.size() ; ++i) {
-    if (!isCharInAlphabet(states[i])) throw BadCharException(states[i], "DNA::getGeneric(const vector<string>& states): Specified base unknown.");
-    vi.push_back(this->charToInt(states[i]));
-  }
-  return intToChar(getGeneric(vi));
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Alphabet/DNA.h b/src/Bpp/Seq/Alphabet/DNA.h
deleted file mode 100644
index 668cfa4..0000000
--- a/src/Bpp/Seq/Alphabet/DNA.h
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// File: DNA.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Tue Jul 22 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _DNA_H_
-#define _DNA_H_
-
-#include "NucleicAlphabet.h"
-
-//From the STL:
-#include <string>
-#include <vector>
-
-namespace bpp
-{
-
-/**
- * @brief This alphabet is used to deal with DNA sequences.
- *
- * It supports all 4 nucleotides (A, T, G and C) with their standard denomination.
- * Gaps are coded by '-', unresolved characters are coded by 'X, N, O, 0 or ?'.
- * Extensive support for generic characters (e.g. 'P', 'Y', etc.) is provided.
- */
-  class DNA:
-    public NucleicAlphabet
-  {
-  public:
-    /**
-     * @param exclamationMarkCountsAsGap If yes, '!' characters are replaced by gaps.
-     * Otherwise, they are counted as unknown characters.
-     */
-    DNA(bool exclamationMarkCountsAsGap = false);
-
-    DNA(const DNA& bia) : NucleicAlphabet(bia) {}
-
-    DNA& operator=(const DNA& bia)
-    {
-      NucleicAlphabet::operator=(bia);
-      return *this;
-    }
-
-    DNA* clone() const
-    {
-      return new DNA(*this);
-    }
-    
-    virtual ~DNA() {}
-	
-  public:
-    std::vector<int> getAlias(int state) const throw (BadIntException);
-    std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException);
-    int getGeneric(const std::vector<int>& states) const throw (BadIntException);
-    std::string getGeneric(const std::vector<std::string>& states) const throw (BadCharException);
-    std::string getAlphabetType() const { return "DNA alphabet"; }
-  };
-
-} //end of namespace bpp.
-
-#endif // _DNA_H_
-
diff --git a/src/Bpp/Seq/Alphabet/IntegerAlphabet.h b/src/Bpp/Seq/Alphabet/IntegerAlphabet.h
deleted file mode 100644
index a586b08..0000000
--- a/src/Bpp/Seq/Alphabet/IntegerAlphabet.h
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// File: BinaryAlphabet.h
-// Author: L Gueguen
-// Created on: vendredi 20 septembre 2013, � 23h 01
-//
-
-/*
-   Copyright or � or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _INTEGERALPHABET_H_
-#define _INTEGERALPHABET_H_
-
-#include "AbstractAlphabet.h"
-
-namespace bpp
-{
-/**
- * @brief The Integer Alphabet class, letters are from 0 to a given number, MAX.
- * @author Laurent Gueguen
- *
- */
-class IntegerAlphabet :
-  public AbstractAlphabet
-{
-private:
-  unsigned int MAX_;
-
-public:
-  // class constructor
-  IntegerAlphabet(unsigned int max);
-
-  IntegerAlphabet(const IntegerAlphabet& bia) : AbstractAlphabet(bia), MAX_(bia.MAX_) {}
-
-  IntegerAlphabet& operator=(const IntegerAlphabet& bia)
-  {
-    AbstractAlphabet::operator=(bia);
-    MAX_=bia.MAX_;
-    
-    return *this;
-  }
-
-  IntegerAlphabet* clone() const
-  {
-    return new IntegerAlphabet(*this);
-  }
-  // class destructor
-  virtual ~IntegerAlphabet() {}
-
-public:
-  unsigned int getSize() const { return MAX_ + 1; }
-
-  unsigned int getNumberOfTypes() const { return MAX_ + 1; }
-  
-  std::string getAlphabetType() const { return "Integer alphabet"; }
-  
-  int getUnknownCharacterCode() const { return static_cast<int>(MAX_); }
-  
-  bool isUnresolved(int state) const { return state == static_cast<int>(MAX_); }
-  
-  bool isUnresolved(const std::string& state) const { return false; }
-};
-} // end of namespace bpp.
-
-#endif // _INTEGERALPHABET_H_
diff --git a/src/Bpp/Seq/Alphabet/LetterAlphabet.h b/src/Bpp/Seq/Alphabet/LetterAlphabet.h
deleted file mode 100644
index e323abc..0000000
--- a/src/Bpp/Seq/Alphabet/LetterAlphabet.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// 
-// File:    LetterAlphabet.h
-// Author:  Sylvain Gaillard
-// Created: 11/09/2009 14:31:05
-// 
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (September 11, 2009)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _LETTERALPHABET_
-#define _LETTERALPHABET_
-
-// From the STL
-#include <string>
-#include <vector>
-#include <iostream>
-
-// From Seq
-#include "AbstractAlphabet.h"
-
-namespace bpp {
-  /**
-   * @brief Specialized partial implementation of Alphabet using single letters.
-   *
-   * @author Sylvain Gaillard
-   */
-  class LetterAlphabet:
-    public AbstractAlphabet
-  {
-  private:
-    static const int LETTER_UNDEF_VALUE;
-    std::vector<int> letters_;
-    bool caseSensitive_;
-
-  public:
-    LetterAlphabet(bool caseSensitive = false): letters_(256, LETTER_UNDEF_VALUE), caseSensitive_(caseSensitive) {}
-
-    LetterAlphabet(const LetterAlphabet& bia) : AbstractAlphabet(bia), letters_(bia.letters_), caseSensitive_(bia.caseSensitive_) {}
-
-    LetterAlphabet& operator=(const LetterAlphabet& bia)
-    {
-      AbstractAlphabet::operator=(bia);
-      letters_=bia.letters_;
-      caseSensitive_=bia.caseSensitive_;
-
-      return *this;
-      
-    }
-    
-#ifndef NO_VIRTUAL_COV
-    virtual LetterAlphabet* clone() const = 0;
-#endif
-
-    virtual ~LetterAlphabet() {}
-
-  public:
-    bool isCharInAlphabet(char state) const {
-      return letters_[static_cast<unsigned int>(state)] != LETTER_UNDEF_VALUE;
-    }
-    bool isCharInAlphabet(const std::string& state) const {
-      return isCharInAlphabet(state[0]);
-    }
-    int charToInt(const std::string &state) const throw (BadCharException) {
-      if (!isCharInAlphabet(state))
-        throw BadCharException(state, "LetterAlphabet::charToInt: Unknown state", this);
-      return letters_[static_cast<unsigned int>(state[0])];
-    }
-
-  protected:
-    void registerState(AlphabetState* st) throw (Exception) {
-      AbstractAlphabet::registerState(st);
-      if (caseSensitive_) {
-        letters_[static_cast<unsigned int>(st->getLetter()[0])] = st->getNum();
-      } else {
-        letters_[static_cast<unsigned int>(tolower(st->getLetter()[0]))] = st->getNum();
-        letters_[static_cast<unsigned int>(toupper(st->getLetter()[0]))] = st->getNum();
-      }
-    }
-
-    void setState(size_t pos, AlphabetState* st) throw (Exception, IndexOutOfBoundsException) {
-      AbstractAlphabet::setState(pos, st);
-      if (caseSensitive_) {
-        letters_[static_cast<unsigned int>(st->getLetter()[0])] = st->getNum();
-      } else {
-        letters_[static_cast<unsigned int>(tolower(st->getLetter()[0]))] = st->getNum();
-        letters_[static_cast<unsigned int>(toupper(st->getLetter()[0]))] = st->getNum();
-      }
-    }
-
-  };
-}
-
-#endif // _LETTERALPHABET_
diff --git a/src/Bpp/Seq/Alphabet/NucleicAlphabet.h b/src/Bpp/Seq/Alphabet/NucleicAlphabet.h
deleted file mode 100644
index 2001d83..0000000
--- a/src/Bpp/Seq/Alphabet/NucleicAlphabet.h
+++ /dev/null
@@ -1,281 +0,0 @@
-//
-// File: NucleicAlphabet.h
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _NUCLEICALPHABET_H_
-#define _NUCLEICALPHABET_H_
-
-#include "LetterAlphabet.h"
-#include "NucleicAlphabetState.h"
-
-#include <map>
-#include <iostream>
-#include <typeinfo>
-
-namespace bpp
-{
-
-/**
- * @brief The abstract base class for nucleic alphabets.
- *
- * This class only implements a few methods, it is mainly designed for methods/classes
- * that will require to work with both RNA and DNA.
- */
-  class NucleicAlphabet :
-    public LetterAlphabet
-  {
-  private:
-    std::map<int, size_t> binCodes_;
-    void updateBinMaps_(size_t pos, const NucleicAlphabetState& st) {
-      if (binCodes_.find(st.getBinaryCode()) == binCodes_.end())
-        binCodes_[st.getBinaryCode()] = pos;
-    }
-
-  public:
-    NucleicAlphabet(): LetterAlphabet(), binCodes_() {}
-
-    NucleicAlphabet(const NucleicAlphabet& bia) : LetterAlphabet(bia), binCodes_(bia.binCodes_) {}
-
-    NucleicAlphabet& operator=(const NucleicAlphabet& bia)
-    {
-      LetterAlphabet::operator=(bia);
-      binCodes_ = bia.binCodes_;
-      return *this;
-    }
-
-#ifndef NO_VIRTUAL_COV
-    virtual NucleicAlphabet* clone() const = 0;
-#endif
-
-    virtual ~NucleicAlphabet() {}
-
-  protected:
-    /**
-     * @name Overloaded methods from AbstractAlphabet
-     * @{
-     */
-    void registerState(AlphabetState* st) throw (Exception) {
-      NucleicAlphabetState* nst = dynamic_cast<NucleicAlphabetState*>(st);
-      if (!nst)
-        throw Exception("NucleicAlphabet::registerState. Incorrect alphabet type.");
-      LetterAlphabet::registerState(nst);
-      updateBinMaps_(getNumberOfChars(), *nst);
-    }
-
-    void setState(size_t pos, AlphabetState* st) throw (Exception, IndexOutOfBoundsException) {
-      NucleicAlphabetState* nst = dynamic_cast<NucleicAlphabetState*>(st);
-      if (!nst)
-        throw Exception("NucleicAlphabet::setState. Incorrect alphabet type.");
-      LetterAlphabet::setState(pos, nst);
-      updateBinMaps_(pos, *nst);
-    }
-
-    /** @} */
-
-  public:
-    /**
-     * @name Overloaded methods from AbstractAlphabet
-     * @{
-     */
-    const NucleicAlphabetState& getStateAt(size_t stateIndex) const
-      throw (IndexOutOfBoundsException) {
-      return dynamic_cast<const NucleicAlphabetState&>(
-        AbstractAlphabet::getStateAt(stateIndex)
-        );
-    }
-    NucleicAlphabetState& getStateAt(size_t stateIndex)
-      throw (IndexOutOfBoundsException) {
-      return dynamic_cast<NucleicAlphabetState&>(
-        AbstractAlphabet::getStateAt(stateIndex)
-        );
-    }
-    const NucleicAlphabetState& getState(const std::string& letter) const
-      throw (BadCharException) {
-      return dynamic_cast<const NucleicAlphabetState&>(
-        AbstractAlphabet::getState(letter)
-        );
-    }
-    const NucleicAlphabetState& getState(int num) const
-      throw (BadIntException) {
-      return dynamic_cast<const NucleicAlphabetState&>(
-        AbstractAlphabet::getState(num)
-        );
-    }
-    /** @} */
-
-    /**
-     * @name Specific methods
-     * @{
-     */
-
-    /**
-     * @brief Get a state by its binary representation.
-     * 
-     * @param code The binary representation as an unsigned char.
-     * @return The NucleicAlphabetState.
-     * @throw BadIntException If the code is not a valide state.
-     * @author Sylvain Gaillard
-     */
-    const NucleicAlphabetState& getStateByBinCode(int code) const
-      throw (BadIntException) {
-      std::map<int, size_t>::const_iterator it = binCodes_.find(code);
-      if (it == binCodes_.end())
-        throw BadIntException(code, "NucleicAlphabet::getState(unsigned char): Binary code not in alphabet", this);
-      return getStateAt(it->second);
-    }
-
-    /**
-     * @brief Subtract states
-     *
-     * Get the remaining state when subtracting one state to another.
-     *
-     * @code
-     * int a = alpha->charToInt("A");
-     * int m = alpha->charToInt("M");
-     * int c = alpha->subtract(m, a);
-     * 
-     * cout << alpha->intToChar(c) << endl;
-     *
-     * // should print C because M - A = C
-     * @endcode
-     *
-     * @param s1 the first state as an int
-     * @param s2 the second state as an int
-     * @throw BadIntException if one of the states is not valide.
-     * @return The remaining state as an int
-     * @author Sylvain Gaillard
-     */
-    int subtract(int s1, int s2) const throw (BadIntException) {
-      return getStateByBinCode(getState(s1).getBinaryCode() & ~ getState(s2).getBinaryCode()).getNum();
-    }
-
-    /**
-     * @brief Subtract states
-     *
-     * Get the remaining state when subtracting one state to another.
-     *
-     * @code
-     * string a = "A";
-     * string m = "M";
-     * 
-     * cout << alpha->subtract(m, a) << endl;
-     *
-     * // should print C because M - A = C
-     * @endcode
-     *
-     * @param s1 the first state as a string
-     * @param s2 the second state as a string
-     * @throw BadCharException if one of the states is not valide.
-     * @return The remaining state as a string
-     * @author Sylvain Gaillard
-     */
-    std::string subtract(const std::string& s1, const std::string& s2) const throw (BadCharException) {
-      return intToChar(subtract(charToInt(s1), charToInt(s2)));
-    }
-
-    /**
-     * @brief Get the overlap between to states
-     *
-     * Get the overlapping states between two steps.
-     *
-     * @code
-     * int m = alpha->charToInt("M");
-     * int r = alpha->charToInt("R");
-     * int a = alpha->getOverlap(m, r);
-     *
-     * cout << alpha->intToChar(a) << endl;
-     *
-     * // should print A because M = A/C and R = A/G
-     * @endcode
-     *
-     * @param s1 the first state as an int
-     * @param s2 the second state as an int
-     * @throw BadIntException if one of the states is not valid
-     * @return The overlapping state
-     * @author Sylvain Gaillard
-     */
-    int getOverlap(int s1, int s2) const throw (BadIntException) {
-      return getStateByBinCode(getState(s1).getBinaryCode() & getState(s2).getBinaryCode()).getNum();
-    }
-
-    /**
-     * @brief Get the overlap between to states
-     *
-     * Get the overlapping states between two steps.
-     *
-     * @code
-     * string m = "M";
-     * string r = R;
-     *
-     * cout << alpha->getOverlap(m, r) << endl;
-     *
-     * // should print A because M = A/C and R = A/G
-     * @endcode
-     *
-     * @param s1 the first state as a string
-     * @param s2 the second state as a string
-     * @throw BadCharException if one of the states is not valid
-     * @return The overlapping state
-     * @author Sylvain Gaillard
-     */
-    std::string getOverlap(const std::string& s1, const std::string& s2) const throw (BadCharException) {
-      return intToChar(getOverlap(charToInt(s1), charToInt(s2)));
-    }
-
-    /** @} */
-	
-  public:
-    // return 4 : A, C, G, T (or U)
-    unsigned int getSize() const { return 4; }
-
-    // return 15 : gap isn't included, generic unresolved bases (N, X, ?, O, 0) count for one
-    unsigned int getNumberOfTypes() const { return 15; }
-    
-    int getUnknownCharacterCode() const { return 14; }
-
-    bool isUnresolved(int state) const { return state > 3; }
-    bool isUnresolved(const std::string& state) const { return charToInt(state) > 3; }
-
-  };
-
-} //end of namespace bpp.
-
-#endif // _NUCLEICALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/NucleicAlphabetState.h b/src/Bpp/Seq/Alphabet/NucleicAlphabetState.h
deleted file mode 100644
index c275d82..0000000
--- a/src/Bpp/Seq/Alphabet/NucleicAlphabetState.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// 
-// File:    NucleicAlphabetState.h
-// Author:  Sylvain Gaillard
-// Created: 31/07/2009
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (July 29, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _NUCLEICALPHABETSTATE_H_
-#define _NUCLEICALPHABETSTATE_H_
-
-// From the STL
-#include <string>
-#include <bitset>
-
-namespace bpp {
-  /**
-   * @brief This is the base class to describe states in a NucleicAlphabet.
-   *
-   * This class store a binary code for each state.
-   * This binary code is of length 4, one bit per nucleotid.
-   * For DNA alphabet, this code looks like this:
-   * <table>
-   * <tr><th>Letter</th><th>Binary code</th><th>int value</th></tr>
-   * <tr><td>-</td><td>0000</td><td>0</td></tr>
-   * <tr><td>A</td><td>0001</td><td>1</td></tr>
-   * <tr><td>C</td><td>0010</td><td>2</td></tr>
-   * <tr><td>G</td><td>0100</td><td>4</td></tr>
-   * <tr><td>T</td><td>1000</td><td>8</td></tr>
-   * <tr><td>N</td><td>1111</td><td>15</td></tr>
-   * <tr><td>...</td><td></td><td></td></tr>
-   * <tr><td>M</td><td>0011</td><td>3</td></tr>
-   * <tr><td>W</td><td>1001</td><td>9</td></tr>
-   * <tr><td>...</td><td></td><td></td></tr>
-   * <tr><td>V</td><td>0111</td><td>7</td></tr>
-   * </table>
-   * This notation allows the use of bitwize operations like:
-   *   - build a generic state from to states
-   * @code
-   * A | G = R  <=>  0001 | 0100 = 0101
-   * @endcode
-   *   - extract a state from an unresolved one by subtraction of an other state
-   * @code
-   * S & ~ C = G  <=>  0110 & ~ 0010 = 0100
-   * @endcode
-   *
-   * The binary code is stored as a char because it's the smallest memory word
-   * that can be allocated. A char is 8 bits long allowing the use of this
-   * class with Alphabet of at least 8 resolved states (enough for known
-   * nucleic alphabets!).
-   *
-   * @author Sylvain Gaillard
-   */
-  class NucleicAlphabetState: public AlphabetState {
-    private:
-      int binCode_;
-
-    public:
-      NucleicAlphabetState(int num, const std::string& letter, unsigned char code, const std::string& name):
-        AlphabetState(num, letter, name), binCode_(code) {}
-
-      // Class destructor
-      virtual ~NucleicAlphabetState() {}
-
-    public:
-      NucleicAlphabetState* clone() const {
-        return new NucleicAlphabetState(* this);
-      }
-      /**
-       * @brief Get the state's binary representation.
-       *
-       * @return The state's binary representation.
-       */
-      int getBinaryCode() const { return binCode_; }
-      /**
-       * @brief Set the state's binary representation.
-       *
-       * @param code The state's binary representation.
-       */
-      void setBinaryCode(int code) { binCode_ = code; }
-  };
-}
-
-#endif // _NUCLEICALPHABETSTATE_H_
-
diff --git a/src/Bpp/Seq/Alphabet/NumericAlphabet.cpp b/src/Bpp/Seq/Alphabet/NumericAlphabet.cpp
deleted file mode 100644
index b93192b..0000000
--- a/src/Bpp/Seq/Alphabet/NumericAlphabet.cpp
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-// File: NumericAlphabet.cpp
-// Created by: Laurent Gueguen
-// Created on: March 2010
-//
-
-/*
-   Copyright or � or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide
-   classes for sequences analysis.
-
-   This software is governed by the CeCILL license under French law and
-   abiding by the rules of distribution of free software. You can use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and rights to copy,
-   modify and redistribute granted by the license, users are provided
-   only with a limited warranty and the software's author, the holder of
-   the economic rights, and the successive licensors have only limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading, using, modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean that it is complicated to manipulate, and that also
-   therefore means that it is reserved for developers and experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards
-   their requirements in conditions enabling the security of their
-   systems and/or data to be ensured and, more generally, to use and
-   operate it in the same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "NumericAlphabet.h" // class's header file
-
-#include <Bpp/Text/TextTools.h>
-
-#include <iostream>
-#include <typeinfo>
-
-using namespace std;
-using namespace bpp;
-
-/****************************************************************************************/
-
-NumericAlphabet::NumericAlphabet(const UniformDiscreteDistribution& pd) :
-  AbstractAlphabet(), pdd_(pd.clone()), values_()
-{
-  
-  // Alphabet size definition
-  size_t size = pdd_->getNumberOfCategories();
-
-  Vdouble vd = pdd_->getCategories();
-  
-  for (size_t i = 0; i < size; ++i){
-    registerState(new AlphabetNumericState(static_cast<int>(i), vd[i], TextTools::toString(vd[i]), TextTools::toString(vd[i])));
-  }
-}
-
-NumericAlphabet::NumericAlphabet(const NumericAlphabet& na) :
-  AbstractAlphabet(na),
-  pdd_(na.pdd_->clone()),
-  values_(na.values_)
-{}
-
-NumericAlphabet& NumericAlphabet::operator=(const NumericAlphabet& na) 
-{
-  AbstractAlphabet::operator=(na);
-  pdd_ = na.pdd_->clone();
-  return *this;
-}
-
-/****************************************************************************************/
-
-void NumericAlphabet::setState(size_t stateIndex, AlphabetState* st) throw (Exception)
-{
-  try {
-    AbstractAlphabet::setState(stateIndex, st);
-    double x = dynamic_cast<AlphabetNumericState*>(st)->getValue();
-    if (values_.find(x) == values_.end())
-    values_[x] = stateIndex;  
-  } catch(std::bad_cast&) {
-    throw Exception("NumericAlphabet::setState. Incorrect alphabet type.");
-  }
-}
-
-void NumericAlphabet::registerState(AlphabetState* st) throw (Exception)
-{
-  try {
-    AbstractAlphabet::registerState(st);
-    double x = dynamic_cast<AlphabetNumericState*>(st)->getValue();
-    if (values_.find(x) == values_.end())
-      values_[x] = getSize();
-  } catch(std::bad_cast&) {
-    throw Exception("NumericAlphabet::registerState. Incorrect alphabet type.");
-  }
-}
-
-
-vector<int> NumericAlphabet::getAlias(int state) const throw (BadIntException)
-{
-  vector<int> v;
-  v.push_back(state);
-  return v;
-}
-
-vector<string> NumericAlphabet::getAlias(const string& state) const throw (BadCharException)
-{
-  vector<string> v;
-  v.push_back(state);
-  return v;
-}
-
-/****************************************************************************************/
-
-bool NumericAlphabet::isGap(int state) const
-{
-  return false;
-}
-
-bool NumericAlphabet::containsGap(const string& state) const throw (BadCharException)
-{
-  return false;
-}
-
-bool NumericAlphabet::isUnresolved(const string& state) const
-{
-  return false;
-}
-
-bool NumericAlphabet::isUnresolved(int state) const
-{
-  return false;
-}
-
-unsigned int NumericAlphabet::getSize() const
-{
-  return static_cast<unsigned int>(values_.size());
-}
-
-unsigned int NumericAlphabet::getNumberOfTypes() const
-{
-  return static_cast<unsigned int>(values_.size());
-}  
-
-void NumericAlphabet::remap()
-{
-  AbstractAlphabet::remap();
-  values_.clear();
-  for (size_t pos = 0 ; pos < getSize() ; pos++) {
-    double x = getStateAt(pos).getValue();
-    if (values_.find(x) == values_.end())
-      values_[x] = pos;
-  }
-}
-
-/************************************************************/
-
-double NumericAlphabet::getDelta() const
-{
-  return (pdd_->getUpperBound() - pdd_->getLowerBound()) / static_cast<double>(pdd_->getNumberOfCategories());
-}
-
-double NumericAlphabet::intToValue(int state) const throw (BadIntException)
-{
-  return static_cast<const AlphabetNumericState& >(getState(state)).getValue();
-}
-
-size_t NumericAlphabet::getValueIndex(double value) const
-{
-  map<double, size_t>::const_iterator it = values_.find(pdd_->getValueCategory(value));
-  return it->second;
-}
-
-AlphabetNumericState& NumericAlphabet::getStateAt(size_t stateIndex) throw (IndexOutOfBoundsException)
-{
-  return static_cast<AlphabetNumericState&>(AbstractAlphabet::getStateAt(stateIndex));
-}
-
-const AlphabetNumericState& NumericAlphabet::getStateAt(size_t stateIndex) const throw (IndexOutOfBoundsException)
-{
-  return static_cast<const AlphabetNumericState&>(AbstractAlphabet::getStateAt(stateIndex));
-}
diff --git a/src/Bpp/Seq/Alphabet/NumericAlphabet.h b/src/Bpp/Seq/Alphabet/NumericAlphabet.h
deleted file mode 100644
index 54ea5f9..0000000
--- a/src/Bpp/Seq/Alphabet/NumericAlphabet.h
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-// File: NumericAlphabet.h
-// Created by: Laurent Gueguen
-// Created on: March 2010
-//
-
-/*
-  Copyright or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL license under French law and
-  abiding by the rules of distribution of free software. You can use,
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info".
-
-  As a counterpart to the access to the source code and rights to copy,
-  modify and redistribute granted by the license, users are provided
-  only with a limited warranty and the software's author, the holder of
-  the economic rights, and the successive licensors have only limited
-  liability.
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading, using, modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean that it is complicated to manipulate, and that also
-  therefore means that it is reserved for developers and experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards
-  their requirements in conditions enabling the security of their
-  systems and/or data to be ensured and, more generally, to use and
-  operate it in the same conditions as regards security.
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-
-#ifndef _NUMERICALPHABET_H_
-#define _NUMERICALPHABET_H_
-
-#include "AbstractAlphabet.h"
-#include "AlphabetNumericState.h"
-
-#include <Bpp/Numeric/Prob/UniformDiscreteDistribution.h>
-
-#include <string>
-
-/**
- * @brief This alphabet is used to deal NumericAlphabet
- * @author Laurent Guéguen
- */
-
-namespace bpp
-{
-  class NumericAlphabet : public AbstractAlphabet
-  {
-  private:
-    const UniformDiscreteDistribution* pdd_;
-
-    std::map<double, size_t> values_;
-  
-  public:
-
-    NumericAlphabet(const UniformDiscreteDistribution&);
-
-    virtual ~NumericAlphabet() { delete pdd_;}
-
-    NumericAlphabet(const NumericAlphabet&);
-
-    NumericAlphabet& operator=(const NumericAlphabet&);
-
-    NumericAlphabet* clone() const
-    {
-      return new NumericAlphabet(*this);
-    }
-  
-  public:
-    void setState(size_t pos, AlphabetState* st) throw (Exception);
-    void registerState(AlphabetState* st) throw (Exception);
-  
-    bool containsGap(const std::string& state) const throw (BadCharException);
-
-    unsigned int getSize() const;
-    unsigned int getNumberOfTypes() const;
-    int getUnknownCharacterCode() const { return -1; }
-    bool isGap(int state) const;
-    std::vector<int> getAlias(int state) const throw (BadIntException);
-    std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException);
-    bool isUnresolved(int state) const;
-    bool isUnresolved(const std::string& state) const;
-
-    std::string getAlphabetType() const { return "Numeric alphabet"; }
-
-    AlphabetNumericState& getStateAt(size_t stateIndex)  throw (IndexOutOfBoundsException);
-    const AlphabetNumericState& getStateAt(size_t stateIndex) const throw (IndexOutOfBoundsException);
-    
-    /**
-     * @ brief Specific methods
-     *
-     */
-
-    /**
-     * @brief Returns the difference between successive values
-     *
-     */
-    double getDelta() const;
-
-    /**
-     * @brief Returns the value for the character number 
-     *
-     */
-    double intToValue(int state) const throw (BadIntException);
-
-    /**
-     * @brief Returns the CategoryIndex of the category to which the value belongs.
-     *
-     */
-    size_t getValueIndex(double value) const;
-
-    /**
-     * @brief Re-update the maps.
-     */
-    void remap();
-  
-  };
-}
-#endif // _NUMERICALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/ProteicAlphabet.cpp b/src/Bpp/Seq/Alphabet/ProteicAlphabet.cpp
deleted file mode 100644
index d400680..0000000
--- a/src/Bpp/Seq/Alphabet/ProteicAlphabet.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-//
-// File: ProteicAlphabet.cpp
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "ProteicAlphabet.h"
-#include "ProteicAlphabetState.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Utils/MapTools.h>
-
-using namespace bpp;
-using namespace std;
-
-// From STL:
-#include <map>
-
-/******************************************************************************/
-
-ProteicAlphabet::ProteicAlphabet()
-{
-  // Alphabet content definition
-  registerState(new ProteicAlphabetState(-1, "-", "GAP", "Gap"));
-  registerState(new ProteicAlphabetState( 0, "A", "ALA", "Alanine"));
-  registerState(new ProteicAlphabetState( 1, "R", "ARG", "Arginine"));
-  registerState(new ProteicAlphabetState( 2, "N", "ASN", "Asparagine"));
-  registerState(new ProteicAlphabetState( 3, "D", "ASP", "Asparatic Acid"));
-  registerState(new ProteicAlphabetState( 4, "C", "CYS", "Cysteine"));
-  registerState(new ProteicAlphabetState( 5, "Q", "GLN", "Glutamine"));
-  registerState(new ProteicAlphabetState( 6, "E", "GLU", "Glutamic acid"));
-  registerState(new ProteicAlphabetState( 7, "G", "GLY", "Glycine"));
-  registerState(new ProteicAlphabetState( 8, "H", "HIS", "Histidine"));
-  registerState(new ProteicAlphabetState( 9, "I", "ILE", "Isoleucine"));
-  registerState(new ProteicAlphabetState(10, "L", "LEU", "Leucine"));
-  registerState(new ProteicAlphabetState(11, "K", "LYS", "Lysine"));
-  registerState(new ProteicAlphabetState(12, "M", "MET", "Methionine"));
-  registerState(new ProteicAlphabetState(13, "F", "PHE", "Phenylalanine"));
-  registerState(new ProteicAlphabetState(14, "P", "PRO", "Proline"));
-  registerState(new ProteicAlphabetState(15, "S", "SER", "Serine"));
-  registerState(new ProteicAlphabetState(16, "T", "THR", "Threonine"));
-  registerState(new ProteicAlphabetState(17, "W", "TRP", "Tryptophan"));
-  registerState(new ProteicAlphabetState(18, "Y", "TYR", "Tyrosine"));
-  registerState(new ProteicAlphabetState(19, "V", "VAL", "Valine"));
-  registerState(new ProteicAlphabetState(20, "B", "B", "N or D"));
-  registerState(new ProteicAlphabetState(21, "Z", "Z", "Q or E"));
-  registerState(new ProteicAlphabetState(22, "X", "X", "Unresolved amino acid"));
-  registerState(new ProteicAlphabetState(22, "O", "O", "Unresolved amino acid"));
-  registerState(new ProteicAlphabetState(22, "0", "0", "Unresolved amino acid"));
-  registerState(new ProteicAlphabetState(22, "?", "?", "Unresolved amino acid"));
-  registerState(new ProteicAlphabetState(-2, "*", "STOP", "Stop"));
-}
-
-/******************************************************************************/
-
-string ProteicAlphabet::getAbbr(const string& aa) const throw (AlphabetException)
-{
-  string AA = TextTools::toUpper(aa);
-  return getState(aa).getAbbreviation();
-}
-
-/******************************************************************************/
-
-string ProteicAlphabet::getAbbr(int aa) const throw (AlphabetException)
-{
-  return getState(aa).getAbbreviation();
-}
-
-/******************************************************************************/
-
-vector<int> ProteicAlphabet::getAlias(int state) const throw (BadIntException)
-{
-  if (!isIntInAlphabet(state))
-    throw BadIntException(state, "ProteicAlphabet::getAlias(int): Specified base unknown.");
-  vector<int> v;
-  if (state == 20)  // N or D
-  {
-    v.resize(2); v[0] = 2; v[1] = 3;
-  }
-  else if (state == 21)  // Q or E
-  {
-    v.resize(2); v[0] = 5; v[1] = 6;
-  }
-  else if (state == 22)  // all!
-  {
-    v.resize(20);
-    for (size_t i = 0; i < 20; i++)
-    {
-      v[i] = static_cast<int>(i);
-    }
-  }
-  else
-  {
-    v.resize(1); v[0] = state;
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-vector<string> ProteicAlphabet::getAlias(const string& state) const throw (BadCharException)
-{
-  string locstate = TextTools::toUpper(state);
-  if (!isCharInAlphabet(locstate))
-    throw BadCharException(locstate, "ProteicAlphabet::getAlias(int): Specified base unknown.");
-  vector<string> v;
-  if (locstate == "B")  // N or D
-  {
-    v.resize(2); v[0] = "N"; v[1] = "D";
-  }
-  else if (locstate == "Z")  // Q or E
-  {
-    v.resize(2); v[0] = "Q"; v[1] = "E";
-  }
-  else if (locstate == "X"
-           || locstate == "O"
-           || locstate == "0"
-           || locstate == "?")  // all!
-  {
-    v.resize(20);
-    for (int i = 0; i < 20; i++)
-    {
-      v[static_cast<size_t>(i)] = getState(i).getLetter();
-    }
-  }
-  else
-  {
-    v.resize(1); v[0] = locstate;
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-int ProteicAlphabet::getGeneric(const vector<int>& states) const throw (BadIntException)
-{
-  map<int, int> m;
-  for (unsigned int i = 0; i < states.size(); ++i)
-  {
-    vector<int> tmp_s = this->getAlias(states[i]); // get the states for generic characters
-    for (unsigned int j = 0; j < tmp_s.size(); ++j)
-    {
-      m[tmp_s[j]]++; // add each state to the list
-    }
-  }
-  vector<int> ve = MapTools::getKeys(m);
-
-  string key;
-  for (unsigned int i = 0; i < ve.size(); ++i)
-  {
-    if (!isIntInAlphabet(ve[i]))
-      throw BadIntException(ve[i], "ProteicAlphabet::getGeneric(const vector<int>): Specified base unknown.");
-    key += "_" + TextTools::toString(ve[i]);
-  }
-  map<string, int> g;
-  g["_2_3"] = 20;
-  g["_5_6"] = 21;
-  int v;
-  map<string, int>::iterator it = g.find(key);
-  if (ve.size() == 1)
-  {
-    v = ve[0];
-  }
-  else if (it != g.end())
-  {
-    v = it->second;
-  }
-  else
-  {
-    v = 22;
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-string ProteicAlphabet::getGeneric(const vector<string>& states) const throw (BadCharException)
-{
-  map<string, int> m;
-  for (unsigned int i = 0; i < states.size(); ++i)
-  {
-    vector<string> tmp_s = this->getAlias(states[i]); // get the states for generic characters
-    for (unsigned int j = 0; j < tmp_s.size(); ++j)
-    {
-      m[tmp_s[j]]++; // add each state to the list
-    }
-  }
-  vector<string> ve = MapTools::getKeys(m);
-
-  string key;
-  for (unsigned int i = 0; i < ve.size(); ++i)
-  {
-    if (!isCharInAlphabet(ve[i]))
-      throw BadCharException(ve[i], "ProteicAlphabet::getAlias(const vector<string>): Specified base unknown.");
-    key += TextTools::toString(ve[i]);
-  }
-  map<string, string> g;
-  g["DN"] = "B";
-  g["EQ"] = "Z";
-  string v;
-  map<string, string>::iterator it = g.find(key);
-  if (ve.size() == 1)
-  {
-    v = ve[0];
-  }
-  else if (it != g.end())
-  {
-    v = it->second;
-  }
-  else
-  {
-    v = "?";
-  }
-  return v;
-}
-
-/******************************************************************************/
diff --git a/src/Bpp/Seq/Alphabet/ProteicAlphabet.h b/src/Bpp/Seq/Alphabet/ProteicAlphabet.h
deleted file mode 100644
index 98274ac..0000000
--- a/src/Bpp/Seq/Alphabet/ProteicAlphabet.h
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-// File: ProteicAlphabet.h
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-
-#ifndef _PROTEICALPHABET_H_
-#define _PROTEICALPHABET_H_
-
-#include "LetterAlphabet.h"
-#include "ProteicAlphabetState.h"
-
-namespace bpp
-{
-
-/**
- * @brief This alphabet is used to deal with proteins.
- *
- * It supports all 20 amino-acids with their standard denomination.
- * Gaps are coded by '-', unresolved characters are coded by 'X'.
- */
-
-  class ProteicAlphabet:
-    public LetterAlphabet
-  {
-    /**
-     * @name Overloaded methods from AbstractAlphabet
-     * @{
-     */
-  public:
-    const ProteicAlphabetState& getState(const std::string& letter) const
-      throw (BadCharException)
-    {
-      return dynamic_cast<const ProteicAlphabetState&>(
-        AbstractAlphabet::getState(letter)
-        );
-    }
-    
-    const ProteicAlphabetState& getState(int num) const
-      throw (BadIntException)
-    {
-      return dynamic_cast<const ProteicAlphabetState&>(
-        AbstractAlphabet::getState(num)
-        );
-    }
-
-  protected:
-    
-    const ProteicAlphabetState& getStateAt(size_t pos) const
-      throw (IndexOutOfBoundsException)
-    {
-      return dynamic_cast<const ProteicAlphabetState&>(
-        AbstractAlphabet::getStateAt(pos)
-        );
-    }
-    
-    ProteicAlphabetState& getStateAt(size_t pos)
-      throw (IndexOutOfBoundsException)
-    {
-      return dynamic_cast<ProteicAlphabetState&>(
-        AbstractAlphabet::getStateAt(pos)
-        );
-    }
-    
-    /** @} */
-  public:
-    ProteicAlphabet();
-
-    ProteicAlphabet(const ProteicAlphabet& bia) : LetterAlphabet(bia) {}
-
-    ProteicAlphabet& operator=(const ProteicAlphabet& bia)
-    {
-      LetterAlphabet::operator=(bia);
-      return *this;
-    }
-
-    ProteicAlphabet* clone() const
-    {
-      return new ProteicAlphabet(*this);
-    }
-
-
-    virtual ~ProteicAlphabet() {}
-
-    
-  public:
-    unsigned int getSize() const { return 20; }
-    unsigned int getNumberOfTypes() const { return 23; }
-    int getUnknownCharacterCode() const { return 22; }
-    std::vector<int> getAlias(int state) const throw (BadIntException);
-    std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException);
-    int getGeneric(const std::vector<int>& states) const throw (BadIntException);
-    std::string getGeneric(const std::vector<std::string>& states) const throw (BadCharException);
-    bool isUnresolved(int state) const { return state > 19; }
-    bool isUnresolved(const std::string& state) const { return charToInt(state) > 19; }
-    std::string getAlphabetType() const { return "Proteic alphabet"; }
-	
-  public:
-
-    /**
-     * @name Specific methods
-     *
-     * @{
-     */
-    
-    /**
-     * @brief Get the abbreviation (3 letter code) for a state coded as char.
-     *
-     * @param aa Char description of the amino-acid to analyse.
-     */
-    std::string getAbbr(const std::string & aa) const throw (AlphabetException);
-	
-    /**
-     * @brief Get the abbreviation (3 letter code) for a state coded as int.
-     *
-     * @param aa Int description of the amino-acid to analyse.
-     */
-    std::string getAbbr(int aa) const throw (AlphabetException);
-    /** @} */
-		
-  };
-
-} //end of namespace bpp.
-
-#endif // _PROTEICALPHABET_H_
-
diff --git a/src/Bpp/Seq/Alphabet/ProteicAlphabetState.h b/src/Bpp/Seq/Alphabet/ProteicAlphabetState.h
deleted file mode 100644
index 9b6d735..0000000
--- a/src/Bpp/Seq/Alphabet/ProteicAlphabetState.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// 
-// File:    ProteicAlphabetState.h
-// Author:  Sylvain Gaillard
-// Created: 29/07/2009 13:56:01
-// 
-
-/*
-Copyright or © or Copr. CNRS, (July 29, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _PROTEICALPHABETSTATE_H_
-#define _PROTEICALPHABETSTATE_H_
-
-// From the STL
-#include <string>
-
-namespace bpp {
-  /**
-   * @brief This is the base class to describe states in a ProteicAlphabet.
-   *
-   * @author Sylvain Gaillard
-   */
-  class ProteicAlphabetState: public AlphabetState {
-    private:
-      std::string abbr_;
-
-    public:
-      ProteicAlphabetState(int num, const std::string & letter, const std::string & abbr, const std::string & name): AlphabetState(num, letter, name), abbr_(abbr) {}
-
-      // Class destructor
-      virtual ~ProteicAlphabetState() {}
-
-    public:
-      ProteicAlphabetState * clone() const {
-        return new ProteicAlphabetState(* this);
-      }
-      /**
-       * @brief Get the state's abbreviation.
-       *
-       * @return The state's abbreviation.
-       */
-      const std::string & getAbbreviation() const { return abbr_; }
-      /**
-       * @brief Set the state's abbreviation.
-       *
-       * @param abbr The state's abbreviation.
-       */
-      void setAbbreviation(const std::string & abbr) { abbr_ = abbr; }
-  };
-}
-
-#endif // _PROTEICALPHABETSTATE_H_
-
diff --git a/src/Bpp/Seq/Alphabet/RNA.cpp b/src/Bpp/Seq/Alphabet/RNA.cpp
deleted file mode 100644
index e117b0b..0000000
--- a/src/Bpp/Seq/Alphabet/RNA.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-//
-// File: RNA.cpp
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Jul 22 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "RNA.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Utils/MapTools.h>
-
-using namespace bpp;
-
-// From STL:
-#include <map>
-
-using namespace std;
-
-/******************************************************************************/
-// class constructor
-RNA::RNA(bool exclamationMarkCountsAsGap)
-{
-	// Alphabet content definition
-	// all unresolved bases use n°14
-  registerState(new NucleicAlphabetState(-1, "-",  0, "Gap"));
-  registerState(new NucleicAlphabetState( 0, "A",  1, "Adenine"));
-  registerState(new NucleicAlphabetState( 1, "C",  2, "Cytosine"));
-  registerState(new NucleicAlphabetState( 2, "G",  4, "Guanine"));
-  registerState(new NucleicAlphabetState( 3, "U",  8, "Uracile"));
-  registerState(new NucleicAlphabetState( 4, "M",  3, "Adenine or Cytosine"));
-  registerState(new NucleicAlphabetState( 5, "R",  5, "Purine (Adenine or Guanine)"));
-  registerState(new NucleicAlphabetState( 6, "W",  9, "Adenine or Uracile"));
-  registerState(new NucleicAlphabetState( 7, "S",  6, "Cytosine or Guanine"));
-  registerState(new NucleicAlphabetState( 8, "Y", 10, "Pyrimidine (Cytosine or Uracile)"));
-  registerState(new NucleicAlphabetState( 9, "K", 12, "Guanine or Uracile"));
-  registerState(new NucleicAlphabetState(10, "V",  7, "Adenine or Cytosine or Guanine"));
-  registerState(new NucleicAlphabetState(11, "H", 11, "Adenine or Cytosine or Uracile"));
-  registerState(new NucleicAlphabetState(12, "D", 13, "Adenine or Guanine or Uracile"));
-  registerState(new NucleicAlphabetState(13, "B", 14, "Cytosine or Guanine or Uracile"));
-  registerState(new NucleicAlphabetState(14, "N", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "X", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "O", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "0", 15, "Unresolved base"));
-  registerState(new NucleicAlphabetState(14, "?", 15, "Unresolved base"));
-  if (exclamationMarkCountsAsGap)
-    registerState(new NucleicAlphabetState(-1, "!", 0, "Frameshift"));
-  else
-    registerState(new NucleicAlphabetState(14, "!", 15, "Unresolved base"));
-}
-
-/******************************************************************************/
-
-std::vector<int> RNA::getAlias(int state) const throw (BadIntException) 
-{
-	if (!isIntInAlphabet(state))
-    throw BadIntException(state, "DNA::getAlias(int): Specified base unknown.");
-	vector<int> v;
-  const NucleicAlphabetState& st = getState(state);
-  if (state == -1)
-    v.push_back(-1);
-  if (st.getBinaryCode() & 1)
-    v.push_back(0);
-  if (st.getBinaryCode() & 2)
-    v.push_back(1);
-  if (st.getBinaryCode() & 4)
-    v.push_back(2);
-  if (st.getBinaryCode() & 8)
-    v.push_back(3);
-	return v;
-}
-
-
-/******************************************************************************/
-
-std::vector<std::string> RNA::getAlias(const std::string & state) const throw (BadCharException) 
-{
-  string locstate = TextTools::toUpper(state);
-	if(!isCharInAlphabet(locstate)) throw BadCharException(locstate, "RNA::getAlias(int): Specified base unknown.");
-  vector<int> vi = this->getAlias(this->charToInt(state));
-	vector<string> v;
-  for (unsigned int i = 0 ; i < vi.size() ; i++)
-    v.push_back(this->intToChar(vi[i]));
-	return v;
-}
-
-/******************************************************************************/
-
-int RNA::getGeneric(const std::vector<int> & states) const throw (BadIntException)
-{
-  int v = 0;
-  for (size_t i = 0 ; i < states.size() ; ++i) {
-    if (!isIntInAlphabet(states[i])) throw BadIntException(states[i], "RNA::getGeneric(const vector<int>& states): Specified base unknown.");
-    v |= getState(states[i]).getBinaryCode();
-  }
-  return getStateByBinCode(v).getNum();
-}
-
-/******************************************************************************/
-
-std::string RNA::getGeneric(const std::vector<std::string> & states) const throw (BadCharException)
-{
-  vector<int> vi;
-  for (unsigned int i = 0 ; i < states.size() ; ++i) {
-    if (!isCharInAlphabet(states[i])) throw BadCharException(states[i], "DNA::getGeneric(const vector<string>& states): Specified base unknown.");
-    vi.push_back(this->charToInt(states[i]));
-  }
-  return intToChar(getGeneric(vi));
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Alphabet/RNA.h b/src/Bpp/Seq/Alphabet/RNA.h
deleted file mode 100644
index 7fe56ef..0000000
--- a/src/Bpp/Seq/Alphabet/RNA.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// File: RNA.h
-// Created by: Guillaume Deuchst
-// Created on: Tue Jul 22 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _RNA_H_
-#define _RNA_H_
-
-#include "NucleicAlphabet.h"
-
-//From the STL:
-#include <string>
-
-namespace bpp
-{
-
-/**
- * @brief This alphabet is used to deal with RNA sequences.
- *
- * It supports all 4 nucleotides (A, U, G and C) with their standard denomination.
- * Gaps are coded by '-', unresolved characters are coded by 'X, N, O, 0 or ?'.
- * Extensive support for generic characters (e.g. 'P', 'Y', etc.) is provided.
- */
-  class RNA:
-    public NucleicAlphabet
-  {
-  public:
-    /**
-     * @param exclamationMarkCountsAsGap If yes, '!' characters are replaced by gaps.
-     * Otherwise, they are counted as unknown characters.
-     */
-    RNA(bool exclamationMarkCountsAsGap = false);
-
-    RNA(const RNA& bia) : NucleicAlphabet(bia) {}
-
-    RNA& operator=(const RNA& bia)
-    {
-      NucleicAlphabet::operator=(bia);
-      return *this;
-    }
-
-    RNA* clone() const
-    {
-      return new RNA(*this);
-    }
-
-    virtual ~RNA() {}
-
-  public:
-    std::vector<int> getAlias(int state) const throw (BadIntException);
-    std::vector<std::string> getAlias(const std::string & state) const throw (BadCharException);
-    int getGeneric(const std::vector<int> & states) const throw (BadIntException);
-    std::string getGeneric(const std::vector<std::string> & states) const throw (BadCharException);
-    std::string getAlphabetType() const { return "RNA alphabet"; }
-  };
-
-} //end of namespace bpp.
-
-#endif // _RNA_H_
diff --git a/src/Bpp/Seq/Alphabet/RNY.cpp b/src/Bpp/Seq/Alphabet/RNY.cpp
deleted file mode 100644
index 8088897..0000000
--- a/src/Bpp/Seq/Alphabet/RNY.cpp
+++ /dev/null
@@ -1,533 +0,0 @@
-//
-// File: RNY.cpp
-// Created by: Laurent Gueguen
-// Created on: Tue Jul 31 2007
-//
-
-/*
-   Copyright or � or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide
-   classes for sequences analysis.
-
-   This software is governed by the CeCILL license under French law and
-   abiding by the rules of distribution of free software. You can use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and rights to copy,
-   modify and redistribute granted by the license, users are provided
-   only with a limited warranty and the software's author, the holder of
-   the economic rights, and the successive licensors have only limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading, using, modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean that it is complicated to manipulate, and that also
-   therefore means that it is reserved for developers and experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards
-   their requirements in conditions enabling the security of their
-   systems and/or data to be ensured and, more generally, to use and
-   operate it in the same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "RNY.h" // class's header file
-
-// From Utils:
-#include <Bpp/Text/TextTools.h>
-#include "AlphabetTools.h"
-
-#include <iostream>
-using namespace std;
-using namespace bpp;
-
-/****************************************************************************************/
-
-RNY::RNY(const NucleicAlphabet& na) : nuclalph_(na)
-{
-  // Initialization:
-  vector<AlphabetState*> states;
-  for (int i = 0; i < 351; ++i)
-  {
-    states.push_back(new AlphabetState(i, TextTools::toString(i), ""));
-  }
-
-  // Alphabet content definition:
-
-  string s1;
-
-  if (AlphabetTools::isDNAAlphabet(&na))
-    s1 = "RCT-";
-  else 
-    s1 = "RCU-";
-  
-  string s2;
- 
-  if (AlphabetTools::isDNAAlphabet(&na))
-    s2 = "AGCT-";
-  else
-    s2 = "AGCU-";
-  
-  string s3 = "AGY-";
-  string s = "   ";
-
-
-  // NNN (0->35)
-
-  for (size_t i = 0; i < 3; ++i)
-  {
-    for (size_t j = 0; j < 4; ++j)
-    {
-      for (size_t k = 0; k < 3; ++k)
-      {
-        size_t l = i * 12 + j * 3 + k;
-        s[0] = s1[i];
-        s[1] = s2[j];
-        s[2] = s3[k];
-        states[l] = new AlphabetState(static_cast<int>(l), s, s);
-      }
-    }
-  }
-
-  // NN- (50->83)
-
-  for (size_t i = 0; i < 3; ++i)
-  {
-    for (size_t j = 0; j < 4; ++j)
-    {
-      size_t l = 50 + 12 * i + j * 3;
-      s[0] = s1[i];
-      s[1] = s2[j];
-      s[2] = s3[3];
-      states[l] = new AlphabetState(static_cast<int>(l), s, s);
-    }
-  }
-
-  // N-N (100->126)
-
-  for (size_t i = 0; i < 3; ++i)
-  {
-    for (size_t k = 0; k < 3; ++k)
-    {
-      size_t l = 100 + 12 * i + k;
-      s[0] = s1[i];
-      s[1] = s2[4];
-      s[2] = s3[k];
-      states[l] = new AlphabetState(static_cast<int>(l), s, s);
-    }
-  }
-
-  // N-- (150->152)
-
-  for (size_t i = 0; i < 3; ++i)
-  {
-    size_t l = 150 + 12 * i;
-    s[0] = s1[i];
-    s[1] = s2[4];
-    s[2] = s3[3];
-    states[l] = new AlphabetState(static_cast<int>(l), s, s);
-  }
-
-  // -NN (200->211)
-
-  for (size_t j = 0; j < 4; ++j)
-  {
-    for (size_t k = 0; k < 3; ++k)
-    {
-      size_t l = 200 + j * 3 + k;
-      s[0] = s1[3];
-      s[1] = s2[j];
-      s[2] = s3[k];
-      states[l] = new AlphabetState(static_cast<int>(l), s, s);
-    }
-  }
-
-
-  // -N- (250->253)
-
-  for (size_t j = 0; j < 4; ++j)
-  {
-    size_t l = 250 + 3 * j;
-    s[0] = s1[3];
-    s[1] = s2[j];
-    s[2] = s3[3];
-    states[l] = new AlphabetState(static_cast<int>(l), s, s);
-  }
-
-  // --N (300->302)
-
-  for (size_t k = 0; k < 3; ++k)
-  {
-    size_t l = 300 + k;
-    s[0] = s1[3];
-    s[1] = s2[4];
-    s[2] = s3[k];
-    states[l] = new AlphabetState(static_cast<int>(l), s, s);
-  }
-
-
-  // --- (350)
-
-  s[0] = s1[3];
-  s[1] = s2[4];
-  s[2] = s3[3];
-  states[350] = new AlphabetState(350, s, s);
-
-  // Register all states:
-  for (size_t i = 0; i < states.size(); ++i)
-    registerState(states[i]);
-}
-
-/****************************************************************************************/
-
-vector<int> RNY::getAlias(int state) const throw (BadIntException)
-{
-  if (!isIntInAlphabet(state))
-    throw BadIntException(state, "RNY::getAlias(int): Specified base unknown.");
-  vector<int> v;
-
-  int qs = state / 50;
-  int rs = state % 50;
-  int i, j, k;
-
-  switch (qs)
-  {
-  case 0: // NNN
-    v.resize(1);
-    v[0] = rs;
-    break;
-  case 1: // NN-
-    v.resize(3);
-    for (k = 0; k < 3; ++k)
-    {
-      v[static_cast<size_t>(k)] = k + rs;
-    }
-    break;
-  case 2: // N-N
-    v.resize(4);
-    for (j = 0; j < 4; ++j)
-    {
-      v[static_cast<size_t>(j)] = 3 * j + rs;
-    }
-    break;
-  case 3: // N--
-    v.resize(12);
-    for (j = 0; j < 4; ++j)
-    {
-      for (k = 0; k < 3; ++k)
-      {
-        v[static_cast<size_t>(3 * j + k)] = rs + 3 * j + k;
-      }
-    }
-    break;
-  case 4: // -NN
-    v.resize(3);
-    for (i = 0; i < 3; ++i)
-    {
-      v[static_cast<size_t>(i)] = 12 * i + rs;
-    }
-    break;
-  case 5: // -N-
-    v.resize(9);
-    for (i = 0; i < 3; ++i)
-    {
-      for (k = 0; k < 3; ++k)
-      {
-        v[static_cast<size_t>(3 * i + k)] = rs + 12 * i + k;
-      }
-    }
-    break;
-  case 6: // --N
-    v.resize(12);
-    for (i = 0; i < 3; ++i)
-    {
-      for (j = 0; j < 4; ++j)
-      {
-        v[static_cast<size_t>(4 * i + j)] = rs + 12 * i + 3 * j;
-      }
-    }
-    break;
-  case 7: // ---
-    v.resize(36);
-    for (i = 0; i < 3; ++i)
-    {
-      for (j = 0; j < 4; ++j)
-      {
-        for (k = 0; k < 3; ++k)
-        {
-          v[static_cast<size_t>(12 * i + 3 * j + k)] = 12 * i + 3 * j + k;
-        }
-      }
-    }
-    break;
-  }
-  return v;
-}
-
-const NucleicAlphabet& RNY::getLetterAlphabet() const
-{
-  return nuclalph_;
-}
-
-/****************************************************************************************/
-
-vector<string> RNY::getAlias(const string& state) const throw (BadCharException)
-{
-  if (!isCharInAlphabet(state))
-    throw BadCharException(state, "RNY::getAlias(int): Specified base unknown.");
-
-  vector<int> v = getAlias(charToInt(state));
-  vector<string> s;
-  size_t size = v.size();
-  s.resize(size);
-
-  for (size_t i = 0; i < size; i++)
-  {
-    s[i] = AbstractAlphabet::intToChar(v[i]);
-  }
-  return s;
-}
-
-/****************************************************************************************/
-
-string RNY::getRNY(const string& pos1, const string& pos2, const string& pos3) const throw (BadCharException)
-{
-  string tr;
-
-  if (pos1 == "A" || pos1 == "G")
-    tr = "R";
-  else
-    tr = pos1;
-
-  tr += pos2;
-
-  if (pos3 == "T" || pos3 == "U" || pos3 == "C")
-    tr += "Y";
-  else
-    tr += pos3;
-
-  // teste triplet;
-  charToInt(tr);
-  return tr;
-}
-
-/**************************************************************************************/
-int RNY::getRNY(int i, int j, int k, const Alphabet& alph) const throw (BadCharException)
-{
-  if (! AlphabetTools::isNucleicAlphabet(&alph))
-  {
-    throw AlphabetException ("RNY::getRNY : Sequence must be Nucleic",
-                             &alph);
-  }
-
-  char li = alph.intToChar(i)[0];
-  char lj = alph.intToChar(j)[0];
-  char lk = alph.intToChar(k)[0];
-
-  int r = 0;
-  int s = 0;
-
-  switch (li)
-  {
-  case 'A':
-  case 'G':
-    r += 0;
-    break;
-  case 'C':
-    r += 1;
-    break;
-  case 'T':
-  case 'U':
-    r += 2;
-    break;
-  case '-':
-  case 'N':
-    s += 1;
-    break;
-  default:
-    throw BadCharException(&li, "RNY::getRNY(int,int;int,alph): Specified base unknown.");
-  }
-
-  r *= 4;
-  s *= 2;
-
-  switch (lj)
-  {
-  case 'A':
-    r += 0;
-    break;
-  case 'G':
-    r += 1;
-    break;
-  case 'C':
-    r += 2;
-    break;
-  case 'T':
-  case 'U':
-    r += 3;
-    break;
-  case '-':
-  case 'N':
-    s += 1;
-    break;
-  default:
-    throw BadCharException(&lj, "RNY::getRNY(int,int;int,alph): Specified base unknown.");
-  }
-
-  r *= 3;
-  s *= 2;
-
-  switch (lk)
-  {
-  case 'A':
-    r += 0;
-    break;
-  case 'G':
-    r += 1;
-    break;
-  case 'C':
-  case 'T':
-  case 'U':
-    r += 2;
-    break;
-  case '-':
-  case 'N':
-    s += 1;
-    break;
-  default:
-    throw BadCharException(&lk, "RNY::getRNY(int,int;int,alph): Specified base unknown.");
-  }
-
-  return 50 * s + r;
-}
-
-/****************************************************************************************/
-bool RNY::isGap(int state) const
-{
-  return state == 350;
-}
-
-bool RNY::containsGap(const string& state) const throw (BadCharException)
-{
-  return state.find("-") != string::npos;
-}
-
-bool RNY::isUnresolved(const string& state) const
-{
-  return containsGap(state);
-}
-
-bool RNY::isUnresolved(int state) const
-{
-  return state >= 50 && state != 350;
-}
-
-/****************************************************************************************/
-
-int RNY::charToInt(const string& state) const throw (BadCharException)
-{
-  if (state.size() != 3)
-    throw BadCharException(state, "RNY::charToInt", this);
-  else
-    return AbstractAlphabet::charToInt(state);
-}
-
-
-/************************************************************/
-
-string RNY::intToChar(int state) const throw (BadIntException)
-{
-  int i, j, k, l;
-  for (i = 0; i < 3; ++i)
-  {
-    for (j = 0; j < 4; ++j)
-    {
-      for (k = 0; k < 3; ++k)
-      {
-        l = i * 12 + j * 3 + k;
-        if (getState(l).getNum() == state)
-          return getState(l).getLetter();
-      }
-    }
-  }
-
-  // NN- (50->83)
-
-  for (i = 0; i < 3; ++i)
-  {
-    for (j = 0; j < 4; ++j)
-    {
-      l = 50 + 12 * i + j * 3;
-      if (getState(l).getNum() == state)
-        return getState(l).getLetter();
-    }
-  }
-
-  // N-N (100->126)
-
-  for (i = 0; i < 3; ++i)
-  {
-    for (k = 0; k < 3; ++k)
-    {
-      l = 100 + 12 * i + k;
-      if (getState(l).getNum() == state)
-        return getState(l).getLetter();
-    }
-  }
-
-  // N-- (150->152)
-
-  for (i = 0; i < 3; ++i)
-  {
-    l = 150 + 12 * i;
-    if (getState(l).getNum() == state)
-      return getState(l).getLetter();
-  }
-
-  // -NN (200->211)
-
-  for (j = 0; j < 4; ++j)
-  {
-    for (k = 0; k < 3; ++k)
-    {
-      l = 200 + j * 3 + k;
-      if (getState(l).getNum() == state)
-        return getState(l).getLetter();
-    }
-  }
-
-
-  // -N- (250->253)
-
-  for (j = 0; j < 4; ++j)
-  {
-    l = 250 + 3 * j;
-    if (getState(l).getNum() == state)
-      return getState(l).getLetter();
-  }
-
-  // --N (300->302)
-
-  for (k = 0; k < 3; ++k)
-  {
-    l = 300 + k;
-    if (getState(l).getNum() == state)
-      return getState(l).getLetter();
-  }
-
-
-  // --- (350)
-
-  l = 350;
-  if (getState(l).getNum() == state)
-    return getState(l).getLetter();
-
-  throw BadIntException(state, "RNY::intToChar: Specified base unknown", this);
-  return "XXX";
-}
diff --git a/src/Bpp/Seq/Alphabet/RNY.h b/src/Bpp/Seq/Alphabet/RNY.h
deleted file mode 100644
index 63c30a2..0000000
--- a/src/Bpp/Seq/Alphabet/RNY.h
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// File: RNY.h
-// Created by: Laurent Gueguen
-// Created on: Tue Jul 31 2007
-//
-
-/*
-   Copyright or � or Copr. CNRS, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL license under French law and
-   abiding by the rules of distribution of free software. You can use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and rights to copy,
-   modify and redistribute granted by the license, users are provided
-   only with a limited warranty and the software's author, the holder of
-   the economic rights, and the successive licensors have only limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading, using, modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean that it is complicated to manipulate, and that also
-   therefore means that it is reserved for developers and experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards
-   their requirements in conditions enabling the security of their
-   systems and/or data to be ensured and, more generally, to use and
-   operate it in the same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-
-#ifndef _RNY_H_
-#define _RNY_H_
-
-#include "AbstractAlphabet.h"
-#include "NucleicAlphabet.h"
-
-#include <string>
-
-/**
- * @brief This alphabet is used to deal quotiented triplet RNY +
- * combinations with "-".
- *
- * More explicitly, a quotiented triplet RNY is defined on the alphabet
- * 
- * @f\{C,T,R\} x \{A,C,G,T\} x \{ A,G,Y\}@f.
- *
- * Triplet "---" is the only triplet defined as gap. Other triplets
- * with "-" are defined as unresolved.
- *
- * @author Laurent Gu�guen
- */
-
-namespace bpp
-{
-class RNY : public AbstractAlphabet
-{
-private:
-  const NucleicAlphabet&  nuclalph_;
-
-public:
-  RNY(const NucleicAlphabet&);
-
-  RNY(const RNY& bia) : AbstractAlphabet(bia), nuclalph_(bia.nuclalph_) {}
-
-  RNY& operator=(const RNY& bia)
-  {
-    AbstractAlphabet::operator=(bia);
-//  nuclalph_=bia.nuclalph_;
-    return *this;
-  }
-
-  RNY* clone() const
-  {
-    return new RNY(*this);
-  }
-
-  ~RNY() {}
-
-public:
-  int charToInt(const std::string& state) const throw (BadCharException);
-  std::string intToChar(int state) const throw (BadIntException);
-
-  bool containsGap(const std::string& state) const throw (BadCharException);
-
-  unsigned int getSize() const { return 36; }
-  unsigned int getNumberOfTypes() const { return 80; }
-  int getUnknownCharacterCode() const { return 350; }
-  bool isGap(int state) const;
-  std::vector<int   > getAlias(      int state) const throw (BadIntException);
-  std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException);
-  bool isUnresolved(int state) const;
-  bool isUnresolved(const std::string& state) const;
-
-  std::string getAlphabetType() const { return "RNY alphabet"; }
-
-  const NucleicAlphabet& getLetterAlphabet() const;
-
-public:
-  /**
-   * @brief Get the char code for a triplet given the char code of the three underlying positions.
-   *
-   * The char code of each position must match the nucleic alphabet specified for this alphabet.
-   * NB: This performs pos1 + pos2 + pos3 after checking for each position validity.
-   * @param pos1 Char description for position 1.
-   * @param pos2 Char description for position 2.
-   * @param pos3 Char description for position 3.
-   * @return The Char code of the triplet.
-   */
-  std::string getRNY(const std::string&, const std::string&, const std::string&) const throw (BadCharException);
-
-  int getRNY(int, int, int, const Alphabet&) const throw (BadCharException);
-};
-}
-
-#endif // _RNY_H_
-
diff --git a/src/Bpp/Seq/Alphabet/WordAlphabet.cpp b/src/Bpp/Seq/Alphabet/WordAlphabet.cpp
deleted file mode 100644
index 2008f7f..0000000
--- a/src/Bpp/Seq/Alphabet/WordAlphabet.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-//
-// File: WordAlphabet.h
-// Authors: Laurent Gueguen
-//          Sylvain Gaillard
-// Created on: Sun Dec 28 2008
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "WordAlphabet.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-WordAlphabet::WordAlphabet(const vector<const Alphabet*>& vAlpha) :
-  AbstractAlphabet(),
-  vAbsAlph_(vAlpha)
-{
-  build_();
-}
-
-WordAlphabet::WordAlphabet(const Alphabet* pAlpha, unsigned int num) :
-  AbstractAlphabet(),
-  vAbsAlph_(0)
-{
-  for (unsigned int i = 0; i < num; i++)
-  {
-    vAbsAlph_.push_back(pAlpha);
-  }
-
-  build_();
-}
-
-void WordAlphabet::build_()
-{
-  size_t size = 1;
-
-  for (size_t i = 0; i < vAbsAlph_.size(); ++i)
-  {
-    size *= vAbsAlph_[i]->getSize();
-  }
-
-  vector<AlphabetState*> states(size + 2);
-
-  string s = "";
-  for (size_t i = 0; i < vAbsAlph_.size(); ++i)
-  {
-    s += "-";
-  }
-
-  states[0] = new AlphabetState(-1, s, "gap");
-
-  for (size_t i = 0; i < size; ++i)
-  {
-    states[i + 1] = new AlphabetState(static_cast<int>(i), "", "");
-  }
-
-  size_t lr = size;
-  char c;
-  for (size_t na = 0; na < vAbsAlph_.size(); ++na)
-  {
-    lr /= vAbsAlph_[na]->getSize();
-    size_t j = 1;
-    int i = 0;
-    while (j <= size)
-    {
-      c = vAbsAlph_[na]->intToChar(i)[0];
-
-      for (size_t k = 0; k < lr; k++)
-      {
-        states[j]->setLetter(states[j]->getLetter() + c);
-        j++;
-        // alphabet[j++].letter += c;
-      }
-
-      if (++i == static_cast<int>(vAbsAlph_[na]->getSize()))
-        i = 0;
-    }
-  }
-
-  s = "";
-  for (size_t i = 0; i < vAbsAlph_.size(); ++i)
-  {
-    s += "N";
-  }
-
-  states[size + 1] = new AlphabetState(static_cast<int>(size), s, "Unresolved");
-
-  //Now register all states once for all:
-  for (size_t i = 0; i < states.size(); ++i) {
-    registerState(states[i]);
-  }
-  //jdutheil on 24/07/14: this should not be necessary anymore.
-  //remap();
-}
-
-/******************************************************************************/
-
-std::string WordAlphabet::getAlphabetType() const
-{
-  string s = "Word alphabet:";
-  for (unsigned int i = 0; i < vAbsAlph_.size(); i++)
-  {
-    s += " " +  vAbsAlph_[i]->getAlphabetType();
-  }
-
-  return s;
-}
-
-bool WordAlphabet::hasUniqueAlphabet() const
-{
-  string s = vAbsAlph_[0]->getAlphabetType();
-  for (unsigned int i = 1; i < vAbsAlph_.size(); i++)
-  {
-    if (vAbsAlph_[i]->getAlphabetType() != s)
-      return false;
-  }
-  return true;
-}
-
-bool WordAlphabet::containsUnresolved(const std::string& state) const throw (BadCharException)
-{
-  size_t s = vAbsAlph_.size();
-  if (state.length() != s)
-    throw BadCharException(state, "WordAlphabet::containsUnresolved", this);
-
-  for (size_t i = 0; i < vAbsAlph_.size(); i++)
-  {
-    if (vAbsAlph_[i]->isUnresolved(state.substr(i, 1)))
-    {
-      return true;
-    }
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-bool WordAlphabet::containsGap(const std::string& state) const throw (BadCharException)
-{
-  size_t s = vAbsAlph_.size();
-  if (state.length() != s)
-    throw BadCharException(state, "WordAlphabet::containsGap", this);
-
-  for (size_t i = 0; i < vAbsAlph_.size(); i++)
-  {
-    if (vAbsAlph_[i]->isGap(state.substr(i, 1)))
-      return true;
-  }
-
-  return false;
-}
-
-/******************************************************************************/
-
-std::string WordAlphabet::getName(const std::string& state) const throw (BadCharException)
-{
-  if (state.size() != vAbsAlph_.size())
-    throw BadCharException(state, "WordAlphabet::getName", this);
-  if (containsUnresolved(state))
-    return getStateAt(getSize() + 1).getName();
-  if (containsGap(state))
-    return getStateAt(0).getName();
-  else
-    return AbstractAlphabet::getName(state);
-}
-
-/******************************************************************************/
-
-std::vector<int> WordAlphabet::getAlias(int state) const throw (BadIntException)
-{
-  if (!isIntInAlphabet(state))
-    throw BadIntException(state, "WordAlphabet::getAlias(int): Specified base unknown.");
-  vector<int> v;
-  size_t s = getSize();
-
-  if (static_cast<size_t>(state) == s)
-  {
-    v.resize(s);
-    for (size_t i = 0; i < s; ++i)
-    {
-      v[i] = static_cast<int>(i);
-    }
-  }
-  else
-  {
-    v.resize(1); v[0] = state;
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-std::vector<std::string> WordAlphabet::getAlias(const std::string& state) const throw (BadCharException)
-{
-  string locstate = TextTools::toUpper(state);
-  if (!isCharInAlphabet(locstate))
-    throw BadCharException(locstate, "WordAlphabet::getAlias(string): Specified base unknown.");
-  vector<string> v;
-
-  size_t s = getSize();
-
-  string st = "";
-  for (size_t i = 0; i < vAbsAlph_.size(); ++i)
-  {
-    st += "N";
-  }
-
-  if (locstate == st)
-  {
-    v.resize(s);
-    for (size_t i = 0; i < s; ++i)
-    {
-      v[i] = intToChar(static_cast<int>(i));
-    }
-  }
-  else
-  {
-    v.resize(1); v[0] = state;
-  }
-  return v;
-}
-
-/******************************************************************************/
-
-int WordAlphabet::getGeneric(const std::vector<int>& states) const throw (BadIntException)
-{
-  return states[0];
-}
-
-/******************************************************************************/
-
-std::string WordAlphabet::getGeneric(const std::vector<std::string>& states) const throw (BadCharException)
-{
-  return states[0];
-}
-
-/******************************************************************************/
-
-int WordAlphabet::getWord(const std::vector<int>& vint, size_t pos) const throw (IndexOutOfBoundsException)
-{
-  if (vint.size() < pos + vAbsAlph_.size())
-    throw IndexOutOfBoundsException("WordAlphabet::getWord", pos, 0, vint.size() - vAbsAlph_.size());
-
-  vector<string> vs;
-  for (size_t i = 0; i < vAbsAlph_.size(); i++)
-  {
-    vs.push_back(vAbsAlph_[i]->intToChar(vint[i + pos]));
-  }
-
-  return charToInt(getWord(vs)); // This can't throw a BadCharException!
-}
-
-/****************************************************************************************/
-
-std::string WordAlphabet::getWord(const std::vector<string>& vpos, size_t pos) const throw (IndexOutOfBoundsException, BadCharException)
-{
-  if (vpos.size() < pos + vAbsAlph_.size())
-    throw IndexOutOfBoundsException("WordAlphabet::getWord", pos, 0, vpos.size() - vAbsAlph_.size());
-
-  string s = "";
-  for (size_t i = 0; i < vAbsAlph_.size(); i++)
-  {
-    s += vpos[pos + i];
-  }
-  // test
-  charToInt(s);
-  return s;
-}
-
-/****************************************************************************************/
-
-Sequence* WordAlphabet::translate(const Sequence& sequence, size_t pos) const throw (AlphabetMismatchException, Exception)
-{
-  if ((!hasUniqueAlphabet()) or
-      (sequence.getAlphabet()->getAlphabetType() != vAbsAlph_[0]->getAlphabetType()))
-    throw AlphabetMismatchException("No matching alphabets", sequence.getAlphabet(), vAbsAlph_[0]);
-
-  vector<int> v1 = sequence.getContent();
-  vector<int> v2;
-
-  size_t s = sequence.size();
-  unsigned int l = getLength();
-  size_t i = pos;
-
-  while (i + l <= s)
-  {
-    v2.push_back(getWord(v1, i));
-    i += l;
-  }
-
-  return new BasicSequence(sequence.getName(), v2, this);
-}
-
-/****************************************************************************************/
-
-Sequence* WordAlphabet::reverse(const Sequence& sequence) const throw (AlphabetMismatchException, Exception)
-{
-  if ((!hasUniqueAlphabet()) or
-      (sequence.getAlphabet()->getAlphabetType() != getAlphabetType()))
-    throw AlphabetMismatchException("No matching alphabets");
-
-  Sequence* pseq = new BasicSequence(sequence.getName(), "", getNAlphabet(0));
-
-  size_t s = sequence.size();
-  for (size_t i = 0; i < s; i++)
-  {
-    pseq->append(getPositions(sequence[i]));
-  }
-
-  return pseq;
-}
-
-/****************************************************************************************/
-
diff --git a/src/Bpp/Seq/Alphabet/WordAlphabet.h b/src/Bpp/Seq/Alphabet/WordAlphabet.h
deleted file mode 100644
index e03d219..0000000
--- a/src/Bpp/Seq/Alphabet/WordAlphabet.h
+++ /dev/null
@@ -1,345 +0,0 @@
-//
-// File: WordAlphabet.h
-// Created by: Laurent Gueguen
-// Created on: Sun Dec 28 2008
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL license under French law and
-   abiding by the rules of distribution of free software. You can use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and rights to copy,
-   modify and redistribute granted by the license, users are provided
-   only with a limited warranty and the software's author, the holder of
-   the economic rights, and the successive licensors have only limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading, using, modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean that it is complicated to manipulate, and that also
-   therefore means that it is reserved for developers and experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards
-   their requirements in conditions enabling the security of their
-   systems and/or data to be ensured and, more generally, to use and
-   operate it in the same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _WORDALPHABET_H_
-#define _WORDALPHABET_H_
-
-#include "AbstractAlphabet.h"
-
-// From the STL:
-#include <string>
-#include <vector>
-
-#include "../Sequence.h"
-
-namespace bpp
-{
-/**
- * @brief The base class for word alphabets.
- *
- * These alphabets are compounds of several alphabets. The only
- * constraint on these alphabets is that their words have length one
- * (so it is not possible to make WordAlphabets from other
- * WordAlphabets). The construction is made from a vector of pointers
- * to AbstractAlphabets.
- *
- * The strings of the WordAlphabet are concatenations of the strings
- * of the Alphabets. They are made from the resolved letters of the
- * Alphabets.
- */
-class WordAlphabet :
-  public AbstractAlphabet
-{
-protected:
-  std::vector<const Alphabet* > vAbsAlph_;
-
-public:
-  // Constructor and destructor.
-  /**
-   * @brief Builds a new word alphabet from a vector of Alphabets.
-   *
-   * The unit alphabets are not owned by the world alphabet, and won't
-   * be destroyed when this instance is destroyed.
-   *
-   * @param vAlpha The vector of Alphabets to be used.
-   */
-  WordAlphabet(const std::vector<const Alphabet*>& vAlpha);
-
-  /**
-   * @brief Builds a new word alphabet from a pointer to number of
-   * Alphabets.
-   *
-   * @param pAlpha The Pointer to the Alphabet to be used.
-   * @param num the length of the words.
-   */
-  WordAlphabet(const Alphabet* pAlpha, unsigned int num);
-
-  WordAlphabet(const WordAlphabet& bia) : AbstractAlphabet(bia), vAbsAlph_(bia.vAbsAlph_) {}
-
-  WordAlphabet& operator=(const WordAlphabet& bia)
-  {
-    AbstractAlphabet::operator=(bia);
-    vAbsAlph_=bia.vAbsAlph_;
-    return *this;
-  }
-
-  WordAlphabet* clone() const
-  {
-    return new WordAlphabet(*this);
-  }
-
-  virtual ~WordAlphabet() {}
-
-public:
-  /**
-   * @name Methods redefined from Alphabet
-   *
-   * @{
-   */
-  /**
-   * @brief Get the complete name of a state given its string description.
-   *
-   * In case of undefined characters (i.e. N and X for nucleic alphabets),
-   * this method will return the name of the undefined word.
-   *
-   * @param state The string description of the given state.
-   * @return The name of the state.
-   * @throw BadCharException When state is not a valid char description.
-   */
-  std::string getName(const std::string& state) const throw (BadCharException);
-
-  int charToInt(const std::string& state) const throw (BadCharException)
-  {
-    if (state.size() != vAbsAlph_.size())
-      throw BadCharException(state, "WordAlphabet::charToInt", this);
-    if (containsUnresolved(state))
-      return static_cast<int>(getSize());
-    if (containsGap(state))
-      return -1;
-    else return AbstractAlphabet::charToInt(state);
-  }
-
-  unsigned int getSize() const
-  {
-    return getNumberOfChars() - 2;
-  }
-
-  /** @} */
-
-  /**
-   * @brief Returns True if the Alphabet of the letters in the word
-   * are the same type.
-   *
-   */
-  bool hasUniqueAlphabet() const;
-
-  /**
-   * @brief Returns the length of the word
-   *
-   */
-  unsigned int getLength() const
-  {
-    return static_cast<unsigned int>(vAbsAlph_.size());
-  }
-
-
-  /**
-   * @brief Returns the number of resolved states + one for unresolved
-   *
-   */
-  unsigned int getNumberOfTypes() const
-  {
-    return getNumberOfChars() - 1;
-  }
-
-  std::string getAlphabetType() const;
-
-  int getUnknownCharacterCode() const
-  {
-    return static_cast<int>(getSize());
-  }
-
-  bool isUnresolved(int state) const { return state == getUnknownCharacterCode(); }
-  bool isUnresolved(const std::string& state) const { return charToInt(state) == getUnknownCharacterCode(); }
-
-  std::vector<int> getAlias(int state) const throw (BadIntException);
-  std::vector<std::string> getAlias(const std::string& state) const throw (BadCharException);
-  int getGeneric(const std::vector<int>& states) const throw (BadIntException);
-  std::string getGeneric(const std::vector<std::string>& states) const throw (BadCharException);
-
-private:
-  /**
-   * @name Inner utilitary functions
-   *
-   * @{
-   */
-  bool containsUnresolved(const std::string& state) const throw (BadCharException);
-  bool containsGap(const std::string& state) const throw (BadCharException);
-  void build_();
-  /** @} */
-
-public:
-  /**
-   * @name Word specific methods
-   *
-   * @{
-   */
-
-  /**
-   * @brief Get the pointer to the Alphabet  of the n-position.
-   *
-   * @param n The position in the word (starting at 0).
-   * @return The pointer to the Alphabet of the n-position.
-   */
-  const Alphabet* getNAlphabet(size_t n) const
-  {
-    if (n >= vAbsAlph_.size())
-      throw IndexOutOfBoundsException("WordAlphabet::getNPosition", n, 0, vAbsAlph_.size());
-
-    return vAbsAlph_[n];
-  }
-
-  /**
-   * @brief Get the int code for a word given the int code of the underlying positions.
-   *
-   * The int code of each position must match the corresponding alphabet specified at this position.
-   * @param vint description for all the positions.
-   * @param pos the start position to match in the vector.
-   * @return The int code of the word.
-   * @throw IndexOutOfBoundsException In case of wrong position.
-   */
-  virtual int getWord(const std::vector<int>& vint, size_t pos = 0) const throw (IndexOutOfBoundsException);
-
-  /**
-   * @brief Get the char code for a word given the char code of the
-   * underlying positions.
-   *
-   * The char code of each position must match the corresponding alphabet specified at this position.
-   * @param vpos vector description for all the positions.
-   * @param pos the start position to match in the vector.
-   * @return The string of the word.
-   * @throw IndexOutOfBoundsException In case of wrong position.
-   */
-  virtual std::string getWord(const std::vector<std::string>& vpos, size_t pos = 0) const throw (IndexOutOfBoundsException, BadCharException);
-
-  /**
-   * @brief Get the int code of the n-position of a word given its int description.
-   *
-   * @param word The int description of the word.
-   * @param n The position in the word (starting at 0).
-   * @return The int description of the n-position of the word.
-   */
-  int getNPosition(int word, size_t n) const throw (BadIntException)
-  {
-    if (n >= vAbsAlph_.size())
-      throw IndexOutOfBoundsException("WordAlphabet::getNPosition", n, 0, vAbsAlph_.size());
-
-    std::string s = intToChar(word);
-    return vAbsAlph_[n]->charToInt(s.substr(n, 1));
-  }
-
-  /**
-   * @brief Get the int codes of each position of a word given its int description.
-   *
-   * @param word The int description of the word.
-   * @return The int description of the positions of the codon.
-   */
-
-  std::vector<int> getPositions(int word) const throw (BadIntException)
-  {
-    std::string s = intToChar(word);
-    std::vector<int> positions;
-    for (size_t i = 0; i < s.size(); i++)
-    {
-      positions.push_back(vAbsAlph_[i]->charToInt(s.substr(i, 1)));
-    }
-
-    return positions;
-  }
-  /**
-   * @brief Get the char code of the n-position of a word given its char description.
-   *
-   * @param word The char description of the word.
-   * @param n The position in the word (starting at 0).
-   * @return The char description of the n-position of the word.
-   */
-  std::string getNPosition(const std::string& word, size_t n) const throw (BadCharException)
-  {
-    if (n > vAbsAlph_.size())
-      throw BadCharException("", "WordAlphabet::getNPosition", this);
-    // Test:
-    charToInt(word);
-
-    return "" + word.substr(n, 1);
-  }
-
-
-  /**
-   * @brief Get the char codes of each position of a word given its char description.
-   *
-   * @param word The char description of the word.
-   * @return The char description of the three positions of the word.
-   */
-
-  std::vector<std::string> getPositions(const std::string& word) const throw (BadCharException)
-  {
-    charToInt(word);
-    std::vector<std::string> positions;
-    for (size_t i = 0; i < word.size(); i++)
-    {
-      positions.push_back(word.substr(i, 1));
-    }
-
-    return positions;
-  }
-
-  /**
-   * @brief Translate a whole sequence from letters alphabet to words alphabet.
-   *
-   * @param sequence A sequence in letters alphabet.
-   * @param pos the start postion (default 0)
-   * @return The corresponding sequence in words alphabet.
-   * @throw AlphabetMismatchException If the sequence alphabet do not match the source alphabet.
-   * @throw Exception                 Other kind of error, depending on the implementation.
-   */
-  Sequence* translate(const Sequence &sequence, size_t = 0) const throw (AlphabetMismatchException, Exception);
-
-  /**
-   * @brief Translate a whole sequence from words alphabet to letters alphabet.
-   *
-   * @param sequence A sequence in words alphabet.
-   * @return The corresponding sequence in letters alphabet.
-   * @throw AlphabetMismatchException If the sequence alphabet do not match the target alphabet.
-   * @throw Exception                 Other kind of error, depending on the implementation.
-   */
-  Sequence* reverse(const Sequence& sequence) const throw (AlphabetMismatchException, Exception);
-
-  /** @} */
-
-  /**
-   * @name Overloaded AbstractAlphabet methods.
-   * @{
-   */
-  unsigned int getStateCodingSize() const { return static_cast<unsigned int>(vAbsAlph_.size()); }
-  /** @} */
-};
-} // end of namespace bpp.
-
-#endif  // _WORDALPHABET_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAChargeIndex.h b/src/Bpp/Seq/AlphabetIndex/AAChargeIndex.h
deleted file mode 100644
index c722b9b..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAChargeIndex.h
+++ /dev/null
@@ -1,151 +0,0 @@
-//
-// File: AAChargeIndex.h
-// Created by: Julien Dutheil
-// Created on: Tue May 02 13:34 2006
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AACHARGEINDEX_H_
-#define _AACHARGEINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Charge of each amino acid.
- *
- * @code
- * Database: AAindex1
- * Entry: FAUJ880111
- *
- * H FAUJ880111
- * D Positive charge (Fauchere et al., 1988)
- * R LIT:1414114 PMID:3209351
- * A Fauchere, J.L., Charton, M., Kier, L.B., Verloop, A. and Pliska, V.
- * T Amino acid side chain parameters for correlation studies in biology and
- *   pharmacology
- * J Int. J. Peptide Protein Res. 32, 269-278 (1988)
- * C ZIMJ680104    0.813
- * I    A/L     R/K     N/M     D/F     C/P     Q/S     E/T     G/W     H/Y     I/V
- *      0.      1.      0.      0.      0.      0.      0.      0.      1.      0.
- *      0.      1.      0.      0.      0.      0.      0.      0.      0.      0.
- * //
- * @endcode
- *
- * @code
- * Database: AAindex1
- * Entry: FAUJ880111
- *
- * H FAUJ880112
- * D Negative charge (Fauchere et al., 1988)
- * R LIT:1414114 PMID:3209351
- * A Fauchere, J.L., Charton, M., Kier, L.B., Verloop, A. and Pliska, V.
- * T Amino acid side chain parameters for correlation studies in biology and
- *   pharmacology
- * J Int. J. Peptide Protein Res. 32, 269-278 (1988)
- * C RICJ880106    0.849
- * I    A/L     R/K     N/M     D/F     C/P     Q/S     E/T     G/W     H/Y     I/V
- *       0.      0.      0.      1.      0.      0.      1.      0.      0.      0.
- *       0.      0.      0.      0.      0.      0.      0.      0.      0.      0. * Soit:
- * //
- * @endcode
- *
- * Hence, combining the two:
- * @code
- * I    A/L     R/K     N/M     D/F     C/P     Q/S     E/T     G/W     H/Y     I/V
- *       0.      1.      0.     -1.      0.      0.     -1.      0.      1.      0.
- *       0.      1.      0.      0.      0.      0.      0.      0.      0.      0.
- * @endcode
- */
-class AAChargeIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> charge_;
-
-public:
-  AAChargeIndex() :
-    charge_()
-  {
-    charge_.resize(20);
-    charge_[ 0] =  0.; // A
-    charge_[ 1] =  1.; // R
-    charge_[ 2] =  0.; // N
-    charge_[ 3] = -1.; // D
-    charge_[ 4] =  0.; // C
-    charge_[ 5] =  0.; // Q
-    charge_[ 6] = -1.; // E
-    charge_[ 7] =  0.; // G
-    charge_[ 8] =  1.; // H
-    charge_[ 9] =  0.; // I
-    charge_[10] =  0.; // L
-    charge_[11] =  1.; // K
-    charge_[12] =  0.; // M
-    charge_[13] =  0.; // F
-    charge_[14] =  0.; // P
-    charge_[15] =  0.; // S
-    charge_[16] =  0.; // T
-    charge_[17] =  0.; // W
-    charge_[18] =  0.; // Y
-    charge_[19] =  0.; // V
-  }
-
-  virtual ~AAChargeIndex() {}
-
-  AAChargeIndex* clone() const { return new AAChargeIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAChargeIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return charge_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return charge_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(charge_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AACHARGEINDEX_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAChenGuHuangHydrophobicityIndex.h b/src/Bpp/Seq/AlphabetIndex/AAChenGuHuangHydrophobicityIndex.h
deleted file mode 100644
index f83acaf..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAChenGuHuangHydrophobicityIndex.h
+++ /dev/null
@@ -1,122 +0,0 @@
-//
-// File: AAChenGuHuangHydrophobicityIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AACHENGUHUANGHYDROPHOBICITYINDEX_H_
-#define _AACHENGUHUANGHYDROPHOBICITYINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Hydrophobicity of each amino acid, according to Table 1 in Chen, Gu and Huang, BMC Bioinformatics 2006.
- *
- * @code
- * Database: AAChenGuHuangHydrophobicity
- * Entry: CHENH06
- *
- * H FAUJ880111
- * D Hydrophobicity (Chen et al., 2006)
- * R PMCID:PMC1780123 PMID:17217506
- * A Hang Chen, Fei Gu, and Zhengge Huang.
- * T Improved Chou-Fasman method for protein secondary structure prediction
- * J BMC Bioinformatics. 2006; 7(Suppl 4): S14.  (2006)
- * //
- * @endcode
- *
- */
-class AAChenGuHuangHydrophobicityIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> hydrophobicity_;
-
-public:
-  AAChenGuHuangHydrophobicityIndex() :
-    hydrophobicity_()
-  {
-    hydrophobicity_.resize(20);
-    hydrophobicity_[ 0] =  0.87; // A
-    hydrophobicity_[ 1] =  0.85; // R
-    hydrophobicity_[ 2] =  0.09; // N
-    hydrophobicity_[ 3] =  0.66; // D
-    hydrophobicity_[ 4] =  1.52; // C
-    hydrophobicity_[ 5] =  0.00; // Q
-    hydrophobicity_[ 6] =  0.67; // E
-    hydrophobicity_[ 7] =  0.00; // G
-    hydrophobicity_[ 8] =  0.87; // H
-    hydrophobicity_[ 9] =  3.15; // I
-    hydrophobicity_[10] =  2.17; // L
-    hydrophobicity_[11] =  1.64; // K
-    hydrophobicity_[12] =  1.67; // M
-    hydrophobicity_[13] =  2.87; // F
-    hydrophobicity_[14] =  2.77; // P
-    hydrophobicity_[15] =  0.07; // S
-    hydrophobicity_[16] =  0.07; // T
-    hydrophobicity_[17] =  3.77; // W
-    hydrophobicity_[18] =  2.76; // Y
-    hydrophobicity_[19] =  1.87; // V
-  }
-
-  virtual ~AAChenGuHuangHydrophobicityIndex() {}
-
-  AAChenGuHuangHydrophobicityIndex* clone() const { return new AAChenGuHuangHydrophobicityIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAChenGuHuangHydrophobicityIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return hydrophobicity_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return hydrophobicity_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(hydrophobicity_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AACHENGUHUANGHYDROPHOBICITYINDEX_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAChouFasmanAHelixIndex.h b/src/Bpp/Seq/AlphabetIndex/AAChouFasmanAHelixIndex.h
deleted file mode 100644
index c2ff6e3..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAChouFasmanAHelixIndex.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: AAChouFasmanAHelixIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AACHUFASMANAHELIXINDEX_H_
-#define _AACHUFASMANAHELIXINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief A-Helix score for the Chou-Fasman algorithm of secondary structure prediction, according to http://prowl.rockefeller.edu/aainfo/chou.htm
- *
- *
- */
-class AAChouFasmanAHelixIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> aHelix_;
-
-public:
-  AAChouFasmanAHelixIndex() :
-    aHelix_()
-  {
-    aHelix_.resize(20);
-    aHelix_[ 0] =  142; // A
-    aHelix_[ 1] =  98; // R
-    aHelix_[ 2] =  67; // N
-    aHelix_[ 3] =  101; // D
-    aHelix_[ 4] =  70; // C
-    aHelix_[ 5] =  111; // Q
-    aHelix_[ 6] =  151; // E
-    aHelix_[ 7] =  57; // G
-    aHelix_[ 8] =  100; // H
-    aHelix_[ 9] =  108; // I
-    aHelix_[10] =  121; // L
-    aHelix_[11] =  114; // K
-    aHelix_[12] =  145; // M
-    aHelix_[13] =  113; // F
-    aHelix_[14] =  57; // P
-    aHelix_[15] =  77; // S
-    aHelix_[16] =  83; // T
-    aHelix_[17] =  108; // W
-    aHelix_[18] =  69; // Y
-    aHelix_[19] =  106; // V
-  }
-
-  virtual ~AAChouFasmanAHelixIndex() {}
-
-  AAChouFasmanAHelixIndex* clone() const { return new AAChouFasmanAHelixIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAChouFasmanAHelixIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return aHelix_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return aHelix_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(aHelix_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AACHUFASMANAHELIXINDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAChouFasmanBSheetIndex.h b/src/Bpp/Seq/AlphabetIndex/AAChouFasmanBSheetIndex.h
deleted file mode 100644
index db1040b..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAChouFasmanBSheetIndex.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: AAChouFasmanBSheetIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AACHUFASMANBSHEETINDEX_H_
-#define _AACHUFASMANBSHEETINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief B-sheet score for the Chou-Fasman algorithm of secondary structure prediction, according to http://prowl.rockefeller.edu/aainfo/chou.htm
- *
- *
- */
-class AAChouFasmanBSheetIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> bSheet_;
-
-public:
-  AAChouFasmanBSheetIndex() :
-    bSheet_()
-  {
-    bSheet_.resize(20);
-    bSheet_[ 0] =  83; // A
-    bSheet_[ 1] =  93; // R
-    bSheet_[ 2] =  89; // N
-    bSheet_[ 3] =  54; // D
-    bSheet_[ 4] =  119; // C
-    bSheet_[ 5] =  110; // Q
-    bSheet_[ 6] =  37; // E
-    bSheet_[ 7] =  75; // G
-    bSheet_[ 8] =  87; // H
-    bSheet_[ 9] =  160; // I
-    bSheet_[10] =  130; // L
-    bSheet_[11] =  74; // K
-    bSheet_[12] =  105; // M
-    bSheet_[13] =  138; // F
-    bSheet_[14] =  55; // P
-    bSheet_[15] =  75; // S
-    bSheet_[16] =  119; // T
-    bSheet_[17] =  137; // W
-    bSheet_[18] =  147; // Y
-    bSheet_[19] =  170; // V
-  }
-
-  virtual ~AAChouFasmanBSheetIndex() {}
-
-  AAChouFasmanBSheetIndex* clone() const { return new AAChouFasmanBSheetIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAChouFasmanBSheetIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return bSheet_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return bSheet_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(bSheet_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AACHUFASMANBSHEETINDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAChouFasmanTurnIndex.h b/src/Bpp/Seq/AlphabetIndex/AAChouFasmanTurnIndex.h
deleted file mode 100644
index d19022a..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAChouFasmanTurnIndex.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: AAChouFasmanTurnIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AACHUFASMANTURNINDEX_H_
-#define _AACHUFASMANTURNINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Turn score for the Chou-Fasman algorithm of secondary structure prediction, according to http://prowl.rockefeller.edu/aainfo/chou.htm
- *
- *
- */
-class AAChouFasmanTurnIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> turn_;
-
-public:
-  AAChouFasmanTurnIndex() :
-    turn_()
-  {
-    turn_.resize(20);
-    turn_[ 0] =  66; // A
-    turn_[ 1] =  95; // R
-    turn_[ 2] =  156; // N
-    turn_[ 3] =  146; // D
-    turn_[ 4] =  119; // C
-    turn_[ 5] =  98; // Q
-    turn_[ 6] =  74; // E
-    turn_[ 7] =  156; // G
-    turn_[ 8] =  95; // H
-    turn_[ 9] =  47; // I
-    turn_[10] =  59; // L
-    turn_[11] =  101; // K
-    turn_[12] =  60; // M
-    turn_[13] =  60; // F
-    turn_[14] =  152; // P
-    turn_[15] =  143; // S
-    turn_[16] =  96; // T
-    turn_[17] =  96; // W
-    turn_[18] =  114; // Y
-    turn_[19] =  50; // V
-  }
-
-  virtual ~AAChouFasmanTurnIndex() {}
-
-  AAChouFasmanTurnIndex* clone() const { return new AAChouFasmanTurnIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAChouFasmanTurnIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return turn_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return turn_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(turn_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AACHUFASMANTURNINDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.cpp b/src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.cpp
deleted file mode 100644
index d6edd0e..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// File: AAIndex1Entry.cpp
-// Created by: Julien Dutheil
-// Created on: Fri Jan 19 17:07 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "AAIndex1Entry.h"
-#include "../Alphabet/AlphabetTools.h"
-#include <Bpp/Io/FileTools.h>
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-
-using namespace bpp;
-using namespace std;
-
-AAIndex1Entry::AAIndex1Entry(std::istream& input) throw (IOException) :
-  property_(20),
-  alpha_(&AlphabetTools::PROTEIN_ALPHABET)
-{
-  // Parse entry:
-  string line;
-  bool ok = false;
-  do
-  {
-    line = FileTools::getNextLine(input);
-    if (line[0] == 'I')
-    {
-      string line1 = FileTools::getNextLine(input);
-      string line2 = FileTools::getNextLine(input);
-      StringTokenizer st1(line1, " ");
-      StringTokenizer st2(line2, " ");
-      if (st1.numberOfRemainingTokens() != 10 || st1.numberOfRemainingTokens() != 10)
-        break;
-      // Amino acids are in the same order in the AAIndex1 database than in the ProteicAlphabet class:
-      for (unsigned int i = 0; i < 10; i++)
-      {
-        property_[i] = TextTools::toDouble(st1.nextToken());
-      }
-      for (unsigned int i = 10; i < 20; i++)
-      {
-        property_[i] = TextTools::toDouble(st2.nextToken());
-      }
-      // Jump to next entry...
-      FileTools::getNextLine(input);
-      ok = true;
-    }
-  }
-  while (!ok);
-  if (!ok)
-    throw IOException("AAIndex1Entry: invalid AAIndex1 entry.");
-}
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.h b/src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.h
deleted file mode 100644
index 4500772..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAIndex1Entry.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// File: AAIndex1Entry.h
-// Created by: Julien Dutheil
-// Created on: Fri Jan 19 17:07 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AAINDEX1ENTRY_H_
-#define _AAINDEX1ENTRY_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-
-namespace bpp
-{
-/**
- * @brief Create a AlphabetIndex1 object from an AAIndex2 entry.
- */
-class AAIndex1Entry :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> property_;
-  const ProteicAlphabet* alpha_;
-
-public:
-  /**
-   * @brief Create a new AAIndex1Entry from an input stream.
-   *
-   * @param input The input stream to use.
-   * @throw IOException if the stream content does not follow the AAIndex1 database entry format.
-   */
-  AAIndex1Entry(std::istream& input) throw (IOException);
-
-  AAIndex1Entry(const AAIndex1Entry& index) :
-    property_(index.property_),
-    alpha_(index.alpha_)
-  {}
-
-  AAIndex1Entry& operator=(const AAIndex1Entry& index)
-  {
-    property_ = index.property_;
-    alpha_ = index.alpha_;
-    return *this;
-  }
-
-  virtual ~AAIndex1Entry() {}
-
-  AAIndex1Entry* clone() const { return new AAIndex1Entry(*this); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "KleinAANetChargeIndex::getIndex(). Invalid state.", alpha_);
-    return property_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return property_[static_cast<size_t>(alpha_->charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(property_); }
-
-  const Alphabet* getAlphabet() const { return alpha_; }
-};
-} // end of namespace bpp.
-
-#endif // _AAINDEX1ENTRY_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.cpp b/src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.cpp
deleted file mode 100644
index fa4a554..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-// File: AAIndex2Entry.cpp
-// Created by: Julien Dutheil
-// Created on: Fri Jan 19 17:07 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "AAIndex2Entry.h"
-#include "../Alphabet/AlphabetTools.h"
-
-using namespace bpp;
-using namespace std;
-
-#include <Bpp/Io/FileTools.h>
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-
-AAIndex2Entry::AAIndex2Entry(std::istream& input, bool sym) throw (IOException) :
-  property_(20, 20),
-  alpha_(&AlphabetTools::PROTEIN_ALPHABET),
-  sym_(sym)
-{
-  // Parse entry:
-  string line;
-  bool ok = false;
-  bool diag = false;
-  do
-  {
-    line = FileTools::getNextLine(input);
-    if (line[0] == 'M')
-    {
-      for (size_t i = 0; i < 20; ++i)
-      {
-        line = FileTools::getNextLine(input);
-        StringTokenizer st1(line, " ");
-        if (i == 0 && st1.numberOfRemainingTokens() == 1)
-        {
-          // Lower triangle only:
-          diag = true;
-        }
-        // Amino acids are in the same order in the AAIndex1 database than in the ProteicAlphabet class:
-        if (diag)
-        {
-          if (st1.numberOfRemainingTokens() != i + 1)
-            break;
-          for (size_t j = 0; j <= i; ++j)
-          {
-            property_(i, j) = TextTools::toDouble(st1.nextToken());
-          }
-        }
-        else
-        {
-          if (st1.numberOfRemainingTokens() != 20)
-            break;
-          for (size_t j = 0; j < 20; ++j)
-          {
-            property_(i, j) = TextTools::toDouble(st1.nextToken());
-          }
-        }
-      }
-      // Jump to next entry...
-      FileTools::getNextLine(input);
-      ok = true;
-    }
-  }
-  while (!ok);
-  if (!ok)
-    throw IOException("AAIndex2Entry: invalid AAIndex2 entry.");
-  if (!diag)
-    sym_ = false;
-}
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.h b/src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.h
deleted file mode 100644
index cad39e3..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAIndex2Entry.h
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: AAIndex2Entry.h
-// Created by: Julien Dutheil
-// Created on: Fri Jan 19 17:07 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AAINDEX2ENTRY_H_
-#define _AAINDEX2ENTRY_H_
-
-#include "AlphabetIndex2.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-/**
- * @brief Create a AlphabetIndex2 object from an AAIndex2 entry.
- */
-class AAIndex2Entry :
-  public virtual AlphabetIndex2
-{
-private:
-  LinearMatrix<double> property_;
-  const ProteicAlphabet* alpha_;
-  bool sym_;
-
-public:
-  /**
-   * @brief Create a new AAIndex2Entry from an input stream.
-   *
-   * @param input The input stream to use.
-   * @param sym Tell if the matrix is symmetric.
-   * This option as an effect only if the matrix is specified as a triangle in the entry.
-   * If sym==true, the oher triangle will be built by symmetry.
-   * If sym==false, the other triangle will be set to (-) the given triangle.
-   * If the input matrix is square, it will be considered non-symetric.
-   * @throw IOException if the stream content does not follow the AAIndex2 database entry format.
-   */
-  AAIndex2Entry(std::istream& input, bool sym = true) throw (IOException);
-
-  AAIndex2Entry(const AAIndex2Entry& index) :
-    property_(index.property_),
-    alpha_(index.alpha_),
-    sym_(index.sym_)
-  {}
-
-  AAIndex2Entry& operator=(const AAIndex2Entry& index)
-  {
-    property_ = index.property_;
-    alpha_ = index.alpha_;
-    sym_ = index.sym_;
-    return *this;
-  }
-
-  virtual ~AAIndex2Entry() {}
-
-public:
-  const Alphabet* getAlphabet() const { return alpha_; }
-
-  AAIndex2Entry* clone() const { return new AAIndex2Entry(*this); }
-
-  double getIndex(int state1, int state2) const throw (BadIntException)
-  {
-    size_t stateIndex1 = alpha_->getStateIndex(state1);
-    size_t stateIndex2 = alpha_->getStateIndex(state2);
-    return property_(stateIndex1, stateIndex2);
-  }
-
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException)
-  {
-    size_t stateIndex1 = alpha_->getStateIndex(state1);
-    size_t stateIndex2 = alpha_->getStateIndex(state2);
-    return property_(stateIndex1, stateIndex2);
-  }
-
-  LinearMatrix<double>* getIndexMatrix() const { return new LinearMatrix<double>(property_); }
-
-  bool isSymmetric() const { return sym_; }
-
-};
-} // end of namespace bpp.
-
-#endif // _AAINDEX2ENTRY_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAMassIndex.h b/src/Bpp/Seq/AlphabetIndex/AAMassIndex.h
deleted file mode 100644
index 4eb4618..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAMassIndex.h
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-// File: AAMassIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AAMASSINDEX_H_
-#define _AAMASSINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Mass (dalton) of each amino acid, according to http://www.imb-jena.de/IMAGE_AA.html.
- */
-class AAMassIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> mass_;
-
-public:
-  AAMassIndex() :
-    mass_()
-  {
-    mass_.resize(20);
-    mass_[ 0] =  71.09; // A
-    mass_[ 1] =  156.19; // R
-    mass_[ 2] =  114.11; // N
-    mass_[ 3] =  115.09; // D
-    mass_[ 4] =  103.15; // C
-    mass_[ 5] =  128.14; // Q
-    mass_[ 6] =  129.12; // E
-    mass_[ 7] =  57.05; // G
-    mass_[ 8] =  137.14; // H
-    mass_[ 9] =  113.16; // I
-    mass_[10] =  113.16; // L
-    mass_[11] =  128.17; // K
-    mass_[12] =  131.19; // M
-    mass_[13] =  147.18; // F
-    mass_[14] =  97.12; // P
-    mass_[15] =  87.08; // S
-    mass_[16] =  101.11; // T
-    mass_[17] =  186.12; // W
-    mass_[18] =  163.18; // Y
-    mass_[19] =  99.14; // V
-  }
-
-  virtual ~AAMassIndex() {}
-
-  AAMassIndex* clone() const { return new AAMassIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAMassIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return mass_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return mass_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(mass_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AAMASSINDEX_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AASEA1030Index.h b/src/Bpp/Seq/AlphabetIndex/AASEA1030Index.h
deleted file mode 100644
index ec52747..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AASEA1030Index.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// File: AASEA1030Index.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AASEA1030INDEX_H_
-#define _AASEA1030INDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Percentage of amino acids having a Solvent Exposed Area between 10 and 30 Angström^2 for each type of amino acid, according to http://prowl.rockefeller.edu/aainfo/access.htm.
- */
-class AASEA1030Index :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> sea1030_;
-
-public:
-  AASEA1030Index() :
-    sea1030_()
-  {
-    sea1030_.resize(20);
-    sea1030_[ 0] =  0.17; // A
-    sea1030_[ 1] =  0.11; // R
-    sea1030_[ 2] =  0.08; // N
-    sea1030_[ 3] =  0.10; // D
-    sea1030_[ 4] =  0.14; // C
-    sea1030_[ 5] =  0.09; // Q
-    sea1030_[ 6] =  0.03; // E
-    sea1030_[ 7] =  0.13; // G
-    sea1030_[ 8] =  0.15; // H
-    sea1030_[ 9] =  0.14; // I
-    sea1030_[10] =  0.10; // L
-    sea1030_[11] =  0.05; // K
-    sea1030_[12] =  0.36; // M
-    sea1030_[13] =  0.16; // F
-    sea1030_[14] =  0.09; // P
-    sea1030_[15] =  0.10; // S
-    sea1030_[16] =  0.13; // T
-    sea1030_[17] =  0.07; // W
-    sea1030_[18] =  0.13; // Y
-    sea1030_[19] =  0.10; // V
-  }
-
-  virtual ~AASEA1030Index() {}
-
-  AASEA1030Index* clone() const { return new AASEA1030Index(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AASEA1030Index::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return sea1030_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return sea1030_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(sea1030_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AASEA1030INDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AASEAInf10Index.h b/src/Bpp/Seq/AlphabetIndex/AASEAInf10Index.h
deleted file mode 100644
index 8cdb3d1..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AASEAInf10Index.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// File: AASEAInf10Index.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AASEAINF10INDEX_H_
-#define _AASEAINF10INDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Percentage of amino acids having a Solvent Exposed Area below 10 Angström^2 for each type of amino acid, according to http://prowl.rockefeller.edu/aainfo/access.htm.
- */
-class AASEAInf10Index :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> seaInf10_;
-
-public:
-  AASEAInf10Index() :
-    seaInf10_()
-  {
-    seaInf10_.resize(20);
-    seaInf10_[ 0] =  0.35; // A
-    seaInf10_[ 1] =  0.05; // R
-    seaInf10_[ 2] =  0.10; // N
-    seaInf10_[ 3] =  0.09; // D
-    seaInf10_[ 4] =  0.54; // C
-    seaInf10_[ 5] =  0.10; // Q
-    seaInf10_[ 6] =  0.04; // E
-    seaInf10_[ 7] =  0.36; // G
-    seaInf10_[ 8] =  0.19; // H
-    seaInf10_[ 9] =  0.47; // I
-    seaInf10_[10] =  0.49; // L
-    seaInf10_[11] =  0.02; // K
-    seaInf10_[12] =  0.20; // M
-    seaInf10_[13] =  0.42; // F
-    seaInf10_[14] =  0.13; // P
-    seaInf10_[15] =  0.20; // S
-    seaInf10_[16] =  0.16; // T
-    seaInf10_[17] =  0.44; // W
-    seaInf10_[18] =  0.20; // Y
-    seaInf10_[19] =  0.50; // V
-  }
-
-  virtual ~AASEAInf10Index() {}
-
-  AASEAInf10Index* clone() const { return new AASEAInf10Index(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AASEAInf10Index::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return seaInf10_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return seaInf10_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(seaInf10_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AASEAINF10INDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AASEASup30Index.h b/src/Bpp/Seq/AlphabetIndex/AASEASup30Index.h
deleted file mode 100644
index 524ebaa..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AASEASup30Index.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// File: AASEASup30Index.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AASEASUP30INDEX_H_
-#define _AASEASUP30INDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Percentage of amino acids having a Solvent Exposed Area above 30 Angström^2 for each type of amino acid, according to http://prowl.rockefeller.edu/aainfo/access.htm
- */
-class AASEASup30Index :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> seaSup30_;
-
-public:
-  AASEASup30Index() :
-    seaSup30_()
-  {
-    seaSup30_.resize(20);
-    seaSup30_[ 0] =  0.48; // A
-    seaSup30_[ 1] =  0.84; // R
-    seaSup30_[ 2] =  0.82; // N
-    seaSup30_[ 3] =  0.81; // D
-    seaSup30_[ 4] =  0.32; // C
-    seaSup30_[ 5] =  0.81; // Q
-    seaSup30_[ 6] =  0.93; // E
-    seaSup30_[ 7] =  0.51; // G
-    seaSup30_[ 8] =  0.66; // H
-    seaSup30_[ 9] =  0.39; // I
-    seaSup30_[10] =  0.41; // L
-    seaSup30_[11] =  0.93; // K
-    seaSup30_[12] =  0.44; // M
-    seaSup30_[13] =  0.42; // F
-    seaSup30_[14] =  0.78; // P
-    seaSup30_[15] =  0.70; // S
-    seaSup30_[16] =  0.71; // T
-    seaSup30_[17] =  0.49; // W
-    seaSup30_[18] =  0.67; // Y
-    seaSup30_[19] =  0.40; // V
-  }
-
-  virtual ~AASEASup30Index() {}
-
-  AASEASup30Index* clone() const { return new AASEASup30Index(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AASEASup30Index::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return seaSup30_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return seaSup30_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(seaSup30_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AASEASUP30INDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AASurfaceIndex.h b/src/Bpp/Seq/AlphabetIndex/AASurfaceIndex.h
deleted file mode 100644
index f62e1dd..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AASurfaceIndex.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// File: AASurfaceIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AASURFACEINDEX_H_
-#define _AASURFACEINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Surface (Angström^2) of each amino acid, according to http://www.imb-jena.de/IMAGE_AA.html
- */
-class AASurfaceIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> surface_;
-
-public:
-  AASurfaceIndex() :
-    surface_()
-  {
-    surface_.resize(20);
-    surface_[ 0] =  115; // A
-    surface_[ 1] =  225; // R
-    surface_[ 2] =  160; // N
-    surface_[ 3] =  150; // D
-    surface_[ 4] =  135; // C
-    surface_[ 5] =  180; // Q
-    surface_[ 6] =  190; // E
-    surface_[ 7] =  75; // G
-    surface_[ 8] =  195; // H
-    surface_[ 9] =  175; // I
-    surface_[10] =  170; // L
-    surface_[11] =  200; // K
-    surface_[12] =  185; // M
-    surface_[13] =  210; // F
-    surface_[14] =  145; // P
-    surface_[15] =  115; // S
-    surface_[16] =  140; // T
-    surface_[17] =  255; // W
-    surface_[18] =  230; // Y
-    surface_[19] =  155; // V
-  }
-
-  virtual ~AASurfaceIndex() {}
-
-  AASurfaceIndex* clone() const { return new AASurfaceIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AASurfaceIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return surface_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return surface_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(surface_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AASURFACEINDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AAVolumeIndex.h b/src/Bpp/Seq/AlphabetIndex/AAVolumeIndex.h
deleted file mode 100644
index c10bd55..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AAVolumeIndex.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: AAVolumeIndex.h
-// Created by: Bastien Boussau
-// Created on: Fri Jan 14 10:31 2011
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _AAVOLUMEINDEX_H_
-#define _AAVOLUMEINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-/**
- * @brief Volume (Angström^3) of each amino acid, according to http://www.imb-jena.de/IMAGE_AA.html
- *
- *
- */
-class AAVolumeIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> volume_;
-
-public:
-  AAVolumeIndex() :
-    volume_()
-  {
-    volume_.resize(20);
-    volume_[ 0] =  115; // A
-    volume_[ 1] =  225; // R
-    volume_[ 2] =  160; // N
-    volume_[ 3] =  150; // D
-    volume_[ 4] =  135; // C
-    volume_[ 5] =  180; // Q
-    volume_[ 6] =  190; // E
-    volume_[ 7] =  75; // G
-    volume_[ 8] =  195; // H
-    volume_[ 9] =  175; // I
-    volume_[10] =  170; // L
-    volume_[11] =  200; // K
-    volume_[12] =  185; // M
-    volume_[13] =  210; // F
-    volume_[14] =  145; // P
-    volume_[15] =  115; // S
-    volume_[16] =  140; // T
-    volume_[17] =  255; // W
-    volume_[18] =  230; // Y
-    volume_[19] =  155; // V
-  }
-
-  virtual ~AAVolumeIndex() {}
-
-  AAVolumeIndex* clone() const { return new AAVolumeIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "AAVolumeIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return volume_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return volume_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(volume_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _AAVOLUMEINDEX_H_
-
-
diff --git a/src/Bpp/Seq/AlphabetIndex/AlphabetIndex2.h b/src/Bpp/Seq/AlphabetIndex/AlphabetIndex2.h
deleted file mode 100644
index de34679..0000000
--- a/src/Bpp/Seq/AlphabetIndex/AlphabetIndex2.h
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-// File: AlphabetIndex2.h
-// Created by: Julien Dutheil
-// Created on: Mon Feb 21 17:42 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _ALPHABETINDEX2_H_
-#define _ALPHABETINDEX2_H_
-
-#include "../Alphabet/Alphabet.h"
-#include <Bpp/Clonable.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-// From the STL:
-#include <string>
-
-namespace bpp
-{
-/**
- * @brief Two dimensionnal alphabet index interface.
- *
- * Derivatives of this interface implement distances between two states.
- */
-class AlphabetIndex2 : public Clonable
-{
-public:
-  AlphabetIndex2() {}
-  virtual ~AlphabetIndex2() {}
-
-public:
-  virtual AlphabetIndex2* clone() const = 0;
-
-  /**
-   * @brief Get the index associated to a pair of states.
-   *
-   * @param state1 First state to consider, as a int value.
-   * @param state2 Second state to consider, as a int value.
-   * @return The index associated to the pair of states.
-   */
-  virtual double getIndex(int state1, int state2) const = 0;
-
-  /**
-   * @brief Get the index associated to a pair of states.
-   *
-   * @param state1 First state to consider, as a string value.
-   * @param state2 Second state to consider, as a string value.
-   * @return The index associated to the pair of states.
-   */
-  virtual double getIndex(const std::string& state1, const std::string& state2) const = 0;
-
-  /**
-   * @brief Get the alphabet associated to this index.
-   *
-   * @return Alphabet The alphabet associated to this index.
-   */
-  virtual const Alphabet* getAlphabet() const = 0;
-
-  /**
-   * @return A matrix object with all indices.
-   */
-  virtual Matrix<double>* getIndexMatrix() const = 0;
-  
-  /**
-   * @return True if the index is symatric (that is, index(i,j) == index(j, i)).
-   */
-  virtual bool isSymmetric() const = 0;
-};
-} // end of namespace bpp.
-
-#endif // _ALPHABETINDEX2_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.cpp b/src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.cpp
deleted file mode 100644
index 7eba9d2..0000000
--- a/src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-//
-// File: DefaultNucleotideScore.cpp
-// Created by: Julien Dutheil
-// Created on: Fri Jan 19 10:30 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "DefaultNucleotideScore.h"
-
-// from the STL:
-#include <string>
-
-using namespace std;
-using namespace bpp;
-
-DefaultNucleotideScore::DefaultNucleotideScore(const NucleicAlphabet* alphabet) :
-  distanceMatrix_(4, 4),
-  alpha_(alphabet)
-{
-  // Load the matrix:
-  distanceMatrix_(0, 0) = 10;
-  distanceMatrix_(0, 1) = -3;
-  distanceMatrix_(0, 2) = -1;
-  distanceMatrix_(0, 3) = -4;
-
-  distanceMatrix_(1, 0) = -3;
-  distanceMatrix_(1, 1) = 9;
-  distanceMatrix_(1, 2) = -5;
-  distanceMatrix_(1, 3) = 0;
-
-  distanceMatrix_(2, 0) = -1;
-  distanceMatrix_(2, 1) = -5;
-  distanceMatrix_(2, 2) = 7;
-  distanceMatrix_(2, 3) = -3;
-
-  distanceMatrix_(3, 0) = -4;
-  distanceMatrix_(3, 1) = 0;
-  distanceMatrix_(3, 2) = -3;
-  distanceMatrix_(3, 3) = 8;
-}
-
-double DefaultNucleotideScore::getIndex(int state1, int state2) const
-throw (BadIntException)
-{
-  if (alpha_->isGap(state1) || !alpha_->isIntInAlphabet(state1))
-    throw BadIntException(state1, "DefaultNucleotideScore::getIndex(). Invalid state1.", alpha_);
-  if (alpha_->isGap(state2) || !alpha_->isIntInAlphabet(state2))
-    throw BadIntException(state2, "DefaultNucleotideScore::getIndex(). Invalid state1.", alpha_);
-  if (!alpha_->isUnresolved(state1) && !alpha_->isUnresolved(state2))
-    return distanceMatrix_(
-        static_cast<size_t>(state1),
-        static_cast<size_t>(state2));
-  vector<int> states1 = alpha_->getAlias(state1);
-  vector<int> states2 = alpha_->getAlias(state2);
-  double score = -5;
-  double tmp_score;
-  for (size_t i = 0; i < states1.size(); i++)
-  {
-    for (size_t j = 0; j < states2.size(); j++)
-    {
-      tmp_score = getIndex(states1[i], states2[j]);
-      if (tmp_score > score)
-        score = tmp_score;
-    }
-  }
-  return score / static_cast<double>(states1.size() + states2.size() - 1);
-}
-
-double DefaultNucleotideScore::getIndex(const std::string& state1, const std::string& state2) const
-throw (BadCharException)
-{
-  return distanceMatrix_(
-      static_cast<size_t>(alpha_->charToInt(state1)),
-      static_cast<size_t>(alpha_->charToInt(state2)));
-}
-
-LinearMatrix<double>* DefaultNucleotideScore::getIndexMatrix() const
-{
-  return new LinearMatrix<double>(distanceMatrix_);
-}
-
diff --git a/src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.h b/src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.h
deleted file mode 100644
index 30609cb..0000000
--- a/src/Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// File: DefaultNucleotideScore.h
-// Created by: Julien Dutheil
-// Created on: Fri Jan 19 10:30 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _DEFAULTNUCLEOTIDESCORE_H_
-#define _DEFAULTNUCLEOTIDESCORE_H_
-
-// from the STL:
-#include <string>
-
-#include "AlphabetIndex2.h"
-#include "../Alphabet/NucleicAlphabet.h"
-#include "../Alphabet/AlphabetExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-/**
- * @brief Default Substitution Matrix for nucleotide alignments.
- */
-class DefaultNucleotideScore :
-  public virtual AlphabetIndex2
-{
-private:
-  LinearMatrix<double> distanceMatrix_;
-  const NucleicAlphabet* alpha_;
-
-public:
-  /**
-   * @brief Build a new DefaultNucleotideScore object.
-   *
-   * @param alphabet The alphabet to use.
-   */
-  DefaultNucleotideScore(const NucleicAlphabet* alphabet);
-
-  DefaultNucleotideScore(const DefaultNucleotideScore& dns) :
-    distanceMatrix_(dns.distanceMatrix_),
-    alpha_(dns.alpha_) {}
-
-  DefaultNucleotideScore& operator=(const DefaultNucleotideScore& dns)
-  {
-    distanceMatrix_ = dns.distanceMatrix_;
-    alpha_ = dns.alpha_;
-    return *this;
-  }
-
-  virtual ~DefaultNucleotideScore() {}
-
-public:
-  /**
-   * @name Methods from the AlphabetIndex2 interface.
-   *
-   * @{
-   */
-  /**
-   * @copydoc bpp::AlphabetIndex2::getIndex()
-   *
-   * If states are unresolved, takes the best score of all possible matches
-   * and divides it by the number of different states.
-   * @author Sylvain Gaillard
-   */
-  double getIndex(int state1, int state2) const throw (BadIntException);
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException);
-  const Alphabet* getAlphabet() const { return alpha_; }
-  DefaultNucleotideScore* clone() const { return new DefaultNucleotideScore(*this); }
-  LinearMatrix<double>* getIndexMatrix() const;
-  bool isSymmetric() const { return true; }
-  /** @} */
-};
-} // end of namespace bpp.
-
-#endif // _DEFAULTNUCLEOTIDESCORE_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.cpp b/src/Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.cpp
deleted file mode 100644
index 0399981..0000000
--- a/src/Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-// File: GranthamAAChemicalDistance.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Feb 21 17:42 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-// from the STL:
-#include <string>
-
-#include "GranthamAAChemicalDistance.h"
-#include "../Alphabet/AlphabetTools.h"
-#include <Bpp/Numeric/NumTools.h>
-
-using namespace bpp;
-
-short int GranthamAAChemicalDistance::SIGN_NONE = 0;
-short int GranthamAAChemicalDistance::SIGN_ARBITRARY = 1;
-short int GranthamAAChemicalDistance::SIGN_PC1 = 2;
-
-GranthamAAChemicalDistance::GranthamAAChemicalDistance() :
-  distanceMatrix_(20, 20),
-  signMatrix_(20, 20),
-  alpha_(&AlphabetTools::PROTEIN_ALPHABET),
-  sign_(0)
-{
-  // Load the matrix:
-  #include "__GranthamMatrixCode"
-}
-GranthamAAChemicalDistance::~GranthamAAChemicalDistance() {}
-
-double GranthamAAChemicalDistance::getIndex(int state1, int state2) const
-throw (BadIntException)
-{
-  size_t stateIndex1 = alpha_->getStateIndex(state1);
-  size_t stateIndex2 = alpha_->getStateIndex(state2);
-  double d = distanceMatrix_(stateIndex1, stateIndex2);
-  if (sign_ == SIGN_NONE)
-    return NumTools::abs<double>(d);
-  if (sign_ == SIGN_PC1)
-    return signMatrix_(stateIndex1, stateIndex2) * NumTools::abs<double>(d);
-  return d;
-}
-
-double GranthamAAChemicalDistance::getIndex(const std::string& state1, const std::string& state2) const
-throw (BadCharException)
-{
-  return getIndex(alpha_->charToInt(state1), alpha_->charToInt(state2));
-}
-
-Matrix<double>* GranthamAAChemicalDistance::getIndexMatrix() const
-{
-  RowMatrix<double>* m = new RowMatrix<double>(distanceMatrix_);
-  if (sign_ == SIGN_NONE)
-  {
-    for (size_t i = 0; i < 20; ++i)
-    {
-      for (size_t j = 0; j < 20; ++j)
-      {
-        (*m)(i, j) = NumTools::abs<double>((*m)(i, j));
-      }
-    }
-  }
-  else if (sign_ == SIGN_PC1)
-  {
-    for (size_t i = 0; i < 20; ++i)
-    {
-      for (size_t j = 0; j < 20; ++j)
-      {
-        (*m)(i, j) = signMatrix_(i, j) * NumTools::abs<double>((*m)(i, j));
-      }
-    }
-  }
-  return m;
-}
-
diff --git a/src/Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.h b/src/Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.h
deleted file mode 100644
index 19037d5..0000000
--- a/src/Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.h
+++ /dev/null
@@ -1,158 +0,0 @@
-//
-// File: GranthamAAChemicalDistance.h
-// Created by: Julien Dutheil
-// Created on: Mon Feb 21 17:42 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _GRANTHAMAACHEMICALDISTANCE_H_
-#define _GRANTHAMAACHEMICALDISTANCE_H_
-
-// from the STL:
-#include <string>
-
-#include "AlphabetIndex2.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-/**
- * @brief Grantham (1974) Amino-Acid chemical distance.
- *
- * Two kinds of matrix can be built:
- * - a symmetric one, with \f$I_{i,j} = I_{i,j}\f$,
- * - or a non-symmetric one, with \f$I_{i,j} = -I_{i,j}\f$.
- * In the second case, which one of the two entries between \f$I_{i,j}\f$ and \f$I_{i,j}\f$ is positive is arbitrary by default.
- * It is also possible to use the coordinate on a principal component analysis between the elementary propoerties of the distance instead (setPC1Sign(true)).
- * The following R code was use in order to get those signs:
- * @code
- * library(seqinr)
- * data(aaindex)
- * data<-data.frame(composition=aaindex[["GRAR740101"]]$I,
- *                     polarity=aaindex[["GRAR740102"]]$I,
- *                       volume=aaindex[["GRAR740103"]]$I)
- * library(ade4)
- * pca<-dudi.pca(data)
- *
- * plot(pca$li[, 1:2], type="n")
- * text(pca$li[, 1:2], rownames(data))
- *
- * s.corcircle(pca$co)
- * layout(matrix(1:3,nrow=1))
- * a1<-pca$li[,1]; names(a1)<-rownames(data); dotchart(sort(a1))
- * a2<-pca$li[,2]; names(a2)<-rownames(data); dotchart(sort(a2))
- * a3<-pca$li[,3]; names(a3)<-rownames(data); dotchart(sort(a3))
- *
- * x<-pca$li[,1] #Contains the coordinates on the first axis.
- * m<-matrix(nrow=20, ncol=20)
- * for(i in 1:length(x))
- *   for(j in 1:length(x))
- *     m[i,j]<-sign(x[j] - x[i])
- *
- * @endcode
- *
- * Reference:
- * Grantham, R.
- * Amino acid difference formula to help explain protein evolution
- * Science 185, 862-864 (1974)
- *
- * Data from AAIndex2 database, Accession Number GRAR740104.
- */
-class GranthamAAChemicalDistance :
-  public virtual AlphabetIndex2
-{
-private:
-  LinearMatrix<double> distanceMatrix_;
-  LinearMatrix<double> signMatrix_;
-  const ProteicAlphabet* alpha_;
-  short int sign_;
-
-public:
-  GranthamAAChemicalDistance();
-
-  GranthamAAChemicalDistance(const GranthamAAChemicalDistance& gd) :
-    distanceMatrix_(gd.distanceMatrix_),
-    signMatrix_(gd.signMatrix_),
-    alpha_(gd.alpha_),
-    sign_(gd.sign_)
-  {}
-
-  GranthamAAChemicalDistance& operator=(const GranthamAAChemicalDistance& gd)
-  {
-    distanceMatrix_ = gd.distanceMatrix_;
-    signMatrix_ = gd.signMatrix_;
-    alpha_ = gd.alpha_;
-    sign_ = gd.sign_;
-    return *this;
-  }
-
-  virtual ~GranthamAAChemicalDistance();
-
-public:
-  /**
-   * @name Methods from the AlphabetIndex2 interface.
-   *
-   * @{
-   */
-  double getIndex(int state1, int state2) const throw (BadIntException);
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException);
-  const Alphabet* getAlphabet() const { return alpha_; }
-  GranthamAAChemicalDistance* clone() const { return new GranthamAAChemicalDistance(); }
-  Matrix<double>* getIndexMatrix() const;
-  /** @} */
-
-public:
-  void setSymmetric(bool yn) { sign_ = (yn ? SIGN_NONE : SIGN_ARBITRARY); }
-  bool isSymmetric() const { return sign_ == SIGN_NONE; }
-  /**
-   * @brief The sign of the distance is computed using the coordinate on the first axis
-   * of a principal component analysis with the 3 elementary properties (Volume, Polarity, Composition).
-   * Otherwise, use the default arbitrary sign. Using this option will lead isSymmetric to return false.
-   *
-   * @param yn Tell is the PC1-based sign should be used instead of the arbitrary one.
-   */
-  void setPC1Sign(bool yn) { sign_ = (yn ? SIGN_PC1 : SIGN_ARBITRARY); }
-
-  static short int SIGN_ARBITRARY;
-  static short int SIGN_PC1;
-  static short int SIGN_NONE;
-};
-} // end of namespace bpp.
-
-#endif // _GRANTHAMAACHEMICALDISTANCE_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/GranthamAAPolarityIndex.h b/src/Bpp/Seq/AlphabetIndex/GranthamAAPolarityIndex.h
deleted file mode 100644
index cf66348..0000000
--- a/src/Bpp/Seq/AlphabetIndex/GranthamAAPolarityIndex.h
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// File: GranthamAAPolarityIndex.h
-// Created by: Julien Dutheil
-// Created on: Tue Apr 21 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _GRANTHAMAAPOLARITYINDEX_H_
-#define _GRANTHAMAAPOLARITYINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-
-namespace bpp
-{
-/**
- * @brief Polarity index used in Grantham (1974).
- *
- * @code
- * Database: AAindex1
- * Entry: GRAR740102
- *
- * H GRAR740102
- * D Polarity (Grantham, 1974)
- * R LIT:2004143b PMID:4843792
- * A Grantham, R.
- * T Amino acid difference formula to help explain protein evolution
- * J Science 185, 862-864 (1974)
- * I    A/L     R/K     N/M     D/F     C/P     Q/S     E/T     G/W     H/Y     I/V
- *      8.1    10.5    11.6    13.0     5.5    10.5    12.3     9.0    10.4     5.2
- *      4.9    11.3     5.7     5.2     8.0     9.2     8.6     5.4     6.2     5.9
- * //
- * @endcode
- */
-class GranthamAAPolarityIndex :
-  public virtual AlphabetIndex1
-{
-private:
-  std::vector<double> polarity_;
-
-public:
-  GranthamAAPolarityIndex() :
-    polarity_()
-  {
-    polarity_.resize(20);
-    polarity_[ 0] =  8.1; // A
-    polarity_[ 1] = 10.5; // R
-    polarity_[ 2] = 11.6; // N
-    polarity_[ 3] = 13.0; // D
-    polarity_[ 4] =  5.5; // C
-    polarity_[ 5] = 10.5; // Q
-    polarity_[ 6] = 12.3; // E
-    polarity_[ 7] =  9.0; // G
-    polarity_[ 8] = 10.4; // H
-    polarity_[ 9] =  5.2; // I
-    polarity_[10] =  4.9; // L
-    polarity_[11] = 11.3; // K
-    polarity_[12] =  5.7; // M
-    polarity_[13] =  5.2; // F
-    polarity_[14] =  8.0; // P
-    polarity_[15] =  9.2; // S
-    polarity_[16] =  8.6; // T
-    polarity_[17] =  5.4; // W
-    polarity_[18] =  6.2; // Y
-    polarity_[19] =  5.9; // V
-  }
-
-  virtual ~GranthamAAPolarityIndex() {}
-
-  GranthamAAPolarityIndex* clone() const { return new GranthamAAPolarityIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "GranthamAAPolarityIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return polarity_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return polarity_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(polarity_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _GRANTHAMAAPOLARITYINDEX_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/GranthamAAVolumeIndex.h b/src/Bpp/Seq/AlphabetIndex/GranthamAAVolumeIndex.h
deleted file mode 100644
index 7d3d790..0000000
--- a/src/Bpp/Seq/AlphabetIndex/GranthamAAVolumeIndex.h
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// File: GranthamAAVolumeIndex.h
-// Created by: Julien Dutheil
-// Created on: Tue Apr 21 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _GRANTHAMAAVOLUMEINDEX_H_
-#define _GRANTHAMAAVOLUMEINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-
-// From the STL:
-#include <vector>
-
-namespace bpp
-{
-/**
- * @brief Volume index used in Grantham (1974).
- *
- * @code
- * Database: AAindex1
- * Entry: GRAR740103
- *
- * H GRAR740103
- * D Volume (Grantham, 1974)
- * R LIT:2004143b PMID:4843792
- * A Grantham, R.
- * T Amino acid difference formula to help explain protein evolution
- * J Science 185, 862-864 (1974)
- * I    A/L     R/K     N/M     D/F     C/P     Q/S     E/T     G/W     H/Y     I/V
- *      31.    124.     56.     54.     55.     85.     83.      3.     96.    111.
- *     111.    119.    105.    132.    32.5     32.     61.    170.    136.     84.
- * //
- * @endcode
- */
-class GranthamAAVolumeIndex :
-  public virtual AlphabetIndex1
-{
-private:
-  std::vector<double> volume_;
-
-public:
-  GranthamAAVolumeIndex() :
-    volume_()
-  {
-    volume_.resize(20);
-    volume_[ 0] =  31.; // A
-    volume_[ 1] = 124.; // R
-    volume_[ 2] =  56.; // N
-    volume_[ 3] =  54.; // D
-    volume_[ 4] =  55.; // C
-    volume_[ 5] =  85.; // Q
-    volume_[ 6] =  83.; // E
-    volume_[ 7] =   3.; // G
-    volume_[ 8] =  96.; // H
-    volume_[ 9] = 111.; // I
-    volume_[10] = 111.; // L
-    volume_[11] = 119.; // K
-    volume_[12] = 105.; // M
-    volume_[13] = 132.; // F
-    volume_[14] =  32.5; // P
-    volume_[15] =  32.; // S
-    volume_[16] =  61.; // T
-    volume_[17] = 170.; // W
-    volume_[18] = 136.; // Y
-    volume_[19] =  84.; // V
-  }
-
-  virtual ~GranthamAAVolumeIndex() {}
-
-  GranthamAAVolumeIndex* clone() const { return new GranthamAAVolumeIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "GranthamAAVolumeIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return volume_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return volume_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(volume_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _GRANTHAMAAVOLUMEINDEX_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/KleinAANetChargeIndex.h b/src/Bpp/Seq/AlphabetIndex/KleinAANetChargeIndex.h
deleted file mode 100644
index 3d834ea..0000000
--- a/src/Bpp/Seq/AlphabetIndex/KleinAANetChargeIndex.h
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// File: KleinAANetChargeIndex.h
-// Created by: Julien Dutheil
-// Created on: Wed Aug 31 17:48 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _KLEINAANETCHARGEINDEX_H_
-#define _KLEINAANETCHARGEINDEX_H_
-
-#include "AlphabetIndex1.h"
-#include "../Alphabet/ProteicAlphabet.h"
-
-namespace bpp
-{
-/**
- * @brief Charge of each amino acid.
- *
- * @code
- * Database: AAindex
- * Entry: KLEP840101
- *
- * H KLEP840101
- * D Net charge (Klein et al., 1984)
- * R LIT:1008055 PMID:6547351
- * A Klein, P., Kanehisa, M. and DeLisi, C.
- * T Prediction of protein function from sequence properties: Discriminant
- * analysis of a data base
- * J Biochim. Biophys. Acta 787, 221-226 (1984)
- * C ZIMJ680104    0.941
- * I    A/L     R/K     N/M     D/F     C/P     Q/S     E/T     G/W     H/Y     I/V
- *       0.      1.      0.     -1.      0.      0.     -1.      0.      0.      0.
- *       0.      1.      0.      0.      0.      0.      0.      0.      0.      0.
- * //
- * @endcode
- */
-class KleinAANetChargeIndex :
-  public AlphabetIndex1
-{
-private:
-  std::vector<double> charge_;
-
-public:
-  KleinAANetChargeIndex() : charge_()
-  {
-    charge_.resize(20);
-    charge_[ 0] =  0.; // A
-    charge_[ 1] =  1.; // R
-    charge_[ 2] =  0.; // N
-    charge_[ 3] = -1.; // D
-    charge_[ 4] =  0.; // C
-    charge_[ 5] =  0.; // Q
-    charge_[ 6] = -1.; // E
-    charge_[ 7] =  0.; // G
-    charge_[ 8] =  0.; // H
-    charge_[ 9] =  0.; // I
-    charge_[10] =  0.; // L
-    charge_[11] =  1.; // K
-    charge_[12] =  0.; // M
-    charge_[13] =  0.; // F
-    charge_[14] =  0.; // P
-    charge_[15] =  0.; // S
-    charge_[16] =  0.; // T
-    charge_[17] =  0.; // W
-    charge_[18] =  0.; // Y
-    charge_[19] =  0.; // V
-  }
-
-  virtual ~KleinAANetChargeIndex() {}
-
-  KleinAANetChargeIndex* clone() const { return new KleinAANetChargeIndex(); }
-
-public:
-  double getIndex(int state) const throw (BadIntException)
-  {
-    if (state < 0 || state > 19) throw BadIntException(state, "KleinAANetChargeIndex::getIndex(). Invalid state.", &AlphabetTools::PROTEIN_ALPHABET);
-    return charge_[static_cast<size_t>(state)];
-  }
-
-  double getIndex(const std::string& state) const throw (BadCharException)
-  {
-    return charge_[static_cast<size_t>(AlphabetTools::PROTEIN_ALPHABET.charToInt(state))];
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(charge_); }
-
-  const Alphabet* getAlphabet() const { return &AlphabetTools::PROTEIN_ALPHABET; }
-};
-} // end of namespace bpp.
-
-#endif // _KLEINAANETCHARGEINDEX_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.h b/src/Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.h
deleted file mode 100644
index 75974f3..0000000
--- a/src/Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.h
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// File: MiyataAAChemicalDistance.h
-// Created by: Julien Dutheil
-// Created on: Mon Feb 21 17:42 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _MIYATAAACHEMICALDISTANCE_H_
-#define _MIYATAAACHEMICALDISTANCE_H_
-
-// from the STL:
-#include <string>
-
-#include "AlphabetIndex2.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-/**
- * @brief Miyata et al. (1979) Amino-Acid chemical distance.
- *
- * Two kinds of matrix can be built:
- * - a symmetric one, with \f$I_{i,j} = I_{i,j}\f$,
- * - or a non-symmetric one, with \f$I_{i,j} = -I_{i,j}\f$.
- *
- * Reference:
- * Miyata, T., Miyazawa, S. and Yasunaga, T.
- * Two types of amino acid substitutions in protein evolution
- * J. Mol. Evol. 12, 219-236 (1979)
- *
- * Data from AAIndex2 database, Accession Number MIYT790101.
- */
-class MiyataAAChemicalDistance :
-  public virtual AlphabetIndex2
-{
-private:
-  LinearMatrix<double> distanceMatrix_;
-  const ProteicAlphabet* alpha_;
-  bool sym_;
-
-public:
-  MiyataAAChemicalDistance();
-
-  MiyataAAChemicalDistance(const MiyataAAChemicalDistance& md) :
-    distanceMatrix_(md.distanceMatrix_),
-    alpha_(md.alpha_),
-    sym_(md.sym_)
-  {}
-
-  MiyataAAChemicalDistance& operator=(const MiyataAAChemicalDistance& md)
-  {
-    distanceMatrix_ = md.distanceMatrix_;
-    alpha_ = md.alpha_;
-    sym_ = md.sym_;
-    return *this;
-  }
-
-  virtual ~MiyataAAChemicalDistance() {}
-
-  MiyataAAChemicalDistance* clone() const { return new MiyataAAChemicalDistance(); }
-
-public:
-  /**
-   * @name Methods from the AlphabetIndex2 interface.
-   *
-   * @{
-   */
-  double getIndex(int state1, int state2) const throw (BadIntException);
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException);
-  const Alphabet* getAlphabet() const { return alpha_; }
-  Matrix<double>* getIndexMatrix() const;
-  /** @} */
-
-public:
-  void setSymmetric(bool yn) { sym_ = yn; }
-  bool isSymmetric() const { return sym_; }
-};
-} // end of namespace bpp.
-
-#endif // _MIYATAAACHEMICALDISTANCE_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/SimpleIndexDistance.h b/src/Bpp/Seq/AlphabetIndex/SimpleIndexDistance.h
deleted file mode 100644
index 71818cb..0000000
--- a/src/Bpp/Seq/AlphabetIndex/SimpleIndexDistance.h
+++ /dev/null
@@ -1,134 +0,0 @@
-//
-// File: SimpleIndexDistance.h
-// Created by: Julien Dutheil
-// Created on: Tue Apr 21 2005
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _SIMPLEINDEXDISTANCE_H_
-#define _SIMPLEINDEXDISTANCE_H_
-
-// from the STL:
-#include <string>
-
-#include "AlphabetIndex1.h"
-#include "AlphabetIndex2.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include "../Alphabet/AlphabetExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-/**
- * @brief Simple dissimilarity distance.
- *
- * Take a one-dimensional index end return the difference between the
- * indexes of two states.
- */
-class SimpleIndexDistance :
-  public virtual AlphabetIndex2
-{
-private:
-  std::auto_ptr<AlphabetIndex1> index_;
-  bool sym_;
-
-public:
-  SimpleIndexDistance(AlphabetIndex1* index) :
-    index_(index),
-    sym_(false)
-  {}
-
-  SimpleIndexDistance(const SimpleIndexDistance& sid) :
-    index_(dynamic_cast<AlphabetIndex1*>(sid.index_->clone())),
-    sym_(sid.sym_)
-  {}
-
-  SimpleIndexDistance& operator=(const SimpleIndexDistance& sid)
-  {
-    index_.reset(dynamic_cast<AlphabetIndex1*>(sid.index_->clone()));
-    sym_ = sid.sym_;
-    return *this;
-  }
-
-  virtual ~SimpleIndexDistance() {}
-
-public:
-  double getIndex(int state1, int state2) const throw (BadIntException)
-  {
-    double d = index_->getIndex(state2) - index_->getIndex(state1);
-    return sym_ ? NumTools::abs<double>(d) : d;
-  }
-
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException)
-  {
-    double d = index_->getIndex(state2) - index_->getIndex(state1);
-    return sym_ ? NumTools::abs<double>(d) : d;
-  }
-
-  const Alphabet* getAlphabet() const { return index_->getAlphabet(); }
-
-  SimpleIndexDistance* clone() const { return new SimpleIndexDistance(*this); }
-
-  Matrix<double>* getIndexMatrix() const
-  {
-    size_t n = index_->getAlphabet()->getSize(); //We should change to "supported ints" there...
-    RowMatrix<double>* m = new RowMatrix<double>(n, n);
-    for (size_t i = 0; i < n; ++i)
-    {
-      for (size_t j = 0; j < n; ++j)
-      {
-        (*m)(i, j) = getIndex(static_cast<int>(i), static_cast<int>(j));
-      }
-    }
-    return m;
-  }
-
-public:
-  void setSymmetric(bool yn) { sym_ = yn; }
-  bool isSymmetric() const { return sym_; }
-  /**
-   * @return The AlphabetIndex1 object associated to this object.
-   */
-  const AlphabetIndex1& getAlphabetIndex1() const { return *index_; }
-  /**
-   * @return The AlphabetIndex1 object associated to this object.
-   */
-  AlphabetIndex1& getAlphabetIndex1() { return *index_; }
-};
-} // end of namespace bpp.
-
-#endif // _SIMPLEINDEXDISTANCE_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/SimpleScore.h b/src/Bpp/Seq/AlphabetIndex/SimpleScore.h
deleted file mode 100644
index 4590c39..0000000
--- a/src/Bpp/Seq/AlphabetIndex/SimpleScore.h
+++ /dev/null
@@ -1,106 +0,0 @@
-//
-// File: SimpleScore.h
-// Created by: Julien Dutheil
-// Created on: Fri May 04 09:35 2007
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _SIMPLESCORE_H_
-#define _SIMPLESCORE_H_
-
-// from the STL:
-#include <string>
-
-#include "AlphabetIndex2.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Alphabet/AlphabetExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-/**
- * @brief Simple Substitution Matrix, with match and mismatch penalties.
- */
-class SimpleScore :
-  public virtual AlphabetIndex2
-{
-private:
-  LinearMatrix<double> distanceMatrix_;
-  const Alphabet* alphabet_;
-
-public:
-  /**
-   * @brief Build a new simpleScore object.
-   *
-   * @param alphabet The alphabet to use.
-   * @param match Matching score.
-   * @param mismatch Mismatching penalty.
-   */
-  SimpleScore(const Alphabet* alphabet, double match, double mismatch);
-
-  SimpleScore(const SimpleScore& sc) :
-    distanceMatrix_(sc.distanceMatrix_),
-    alphabet_(sc.alphabet_)
-  {}
-
-  SimpleScore& operator=(const SimpleScore& sc)
-  {
-    distanceMatrix_ = sc.distanceMatrix_;
-    alphabet_ = sc.alphabet_;
-    return *this;
-  }
-
-  virtual ~SimpleScore() {}
-
-  SimpleScore* clone() const { return new SimpleScore(*this); }
-
-public:
-  /**
-   * @name Methods from the AlphabetIndex2 interface.
-   *
-   * @{
-   */
-  double getIndex(int state1, int state2) const throw (BadIntException);
-  double getIndex(const std::string& state1, const std::string& state2) const throw (BadCharException);
-  const Alphabet* getAlphabet() const { return alphabet_; }
-  LinearMatrix<double>* getIndexMatrix() const;
-  bool isSymmetric() const { return true; }
-  /** @} */
-};
-} // end of namespace bpp.
-
-#endif // _SIMPLESCORE_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/UserAlphabetIndex1.h b/src/Bpp/Seq/AlphabetIndex/UserAlphabetIndex1.h
deleted file mode 100644
index f2e16d9..0000000
--- a/src/Bpp/Seq/AlphabetIndex/UserAlphabetIndex1.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: UserAlphabetIndex1.h
-// Created by: Laurent Guéguen
-// Created on: vendredi 29 mars 2013, à 13h 05
-//
-
-/*
-   Copyright or © or Copr. CNRS, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _USERALPHABETINDEX1_H_
-#define _USERALPHABETINDEX1_H_
-
-#include "AlphabetIndex1.h"
-
-// From the STL:
-#include <vector>
-
-namespace bpp
-{
-  /**
-   * @brief Alphabet index given by user.
-   */
-
-  class UserAlphabetIndex1 :
-  public virtual AlphabetIndex1
-{
-private:
-  const Alphabet* alph_;
-  std::vector<double> index_;
-  
-public:
-  UserAlphabetIndex1(const Alphabet* alph) :
-  alph_(alph),
-  index_(alph->getSize(),0)
-  {}
-
-  UserAlphabetIndex1(const UserAlphabetIndex1& uAlph) :
-    alph_(uAlph.alph_),//->clone()),
-    index_(uAlph.index_)
-  {}
-
-  UserAlphabetIndex1& operator=(const UserAlphabetIndex1& uAlph)
-  {
-    alph_  = uAlph.alph_;//->clone();
-    index_ = uAlph.index_;
-    return *this;
-  }    
-  
-  virtual ~UserAlphabetIndex1() {}
-
-  UserAlphabetIndex1* clone() const { return new UserAlphabetIndex1(*this); }
-
-public:
-  double getIndex(int state) const
-  {
-    return index_[alph_->getStateIndex(state)];
-  }
-
-  void setIndex(int state, double val) 
-  {
-    index_[alph_->getStateIndex(state)] = val;
-  }
-
-  double getIndex(const std::string& state) const
-  {
-    return index_[alph_->getStateIndex(state)];
-  }
-
-  void setIndex(const std::string& state, double val) 
-  {
-    index_[alph_->getStateIndex(state)] = val;
-  }
-
-  std::vector<double>* getIndexVector() const { return new std::vector<double>(index_); }
-
-  const Alphabet* getAlphabet() const { return alph_; }
-};
-} // end of namespace bpp.
-
-#endif // _USERALPHABETINDEX1_H_
-
diff --git a/src/Bpp/Seq/AlphabetIndex/__BLOSUM50MatrixCode b/src/Bpp/Seq/AlphabetIndex/__BLOSUM50MatrixCode
deleted file mode 100644
index 39923fd..0000000
--- a/src/Bpp/Seq/AlphabetIndex/__BLOSUM50MatrixCode
+++ /dev/null
@@ -1,400 +0,0 @@
-distanceMatrix_(0,0) = 5;
-distanceMatrix_(0,1) = -2;
-distanceMatrix_(0,2) = -1;
-distanceMatrix_(0,3) = -2;
-distanceMatrix_(0,4) = -1;
-distanceMatrix_(0,5) = -1;
-distanceMatrix_(0,6) = -1;
-distanceMatrix_(0,7) = 0;
-distanceMatrix_(0,8) = -2;
-distanceMatrix_(0,9) = -1;
-distanceMatrix_(0,10) = -2;
-distanceMatrix_(0,11) = -1;
-distanceMatrix_(0,12) = -1;
-distanceMatrix_(0,13) = -3;
-distanceMatrix_(0,14) = -1;
-distanceMatrix_(0,15) = 1;
-distanceMatrix_(0,16) = 0;
-distanceMatrix_(0,17) = -3;
-distanceMatrix_(0,18) = -2;
-distanceMatrix_(0,19) = 0;
-distanceMatrix_(1,0) = -2;
-distanceMatrix_(1,1) = 7;
-distanceMatrix_(1,2) = -1;
-distanceMatrix_(1,3) = -2;
-distanceMatrix_(1,4) = -4;
-distanceMatrix_(1,5) = 1;
-distanceMatrix_(1,6) = 0;
-distanceMatrix_(1,7) = -3;
-distanceMatrix_(1,8) = 0;
-distanceMatrix_(1,9) = -4;
-distanceMatrix_(1,10) = -3;
-distanceMatrix_(1,11) = 3;
-distanceMatrix_(1,12) = -2;
-distanceMatrix_(1,13) = -3;
-distanceMatrix_(1,14) = -3;
-distanceMatrix_(1,15) = -1;
-distanceMatrix_(1,16) = -1;
-distanceMatrix_(1,17) = -3;
-distanceMatrix_(1,18) = -1;
-distanceMatrix_(1,19) = -3;
-distanceMatrix_(2,0) = -1;
-distanceMatrix_(2,1) = -1;
-distanceMatrix_(2,2) = 7;
-distanceMatrix_(2,3) = 2;
-distanceMatrix_(2,4) = -2;
-distanceMatrix_(2,5) = 0;
-distanceMatrix_(2,6) = 0;
-distanceMatrix_(2,7) = 0;
-distanceMatrix_(2,8) = 1;
-distanceMatrix_(2,9) = -3;
-distanceMatrix_(2,10) = -4;
-distanceMatrix_(2,11) = 0;
-distanceMatrix_(2,12) = -2;
-distanceMatrix_(2,13) = -4;
-distanceMatrix_(2,14) = -2;
-distanceMatrix_(2,15) = 1;
-distanceMatrix_(2,16) = 0;
-distanceMatrix_(2,17) = -4;
-distanceMatrix_(2,18) = -2;
-distanceMatrix_(2,19) = -3;
-distanceMatrix_(3,0) = -2;
-distanceMatrix_(3,1) = -2;
-distanceMatrix_(3,2) = 2;
-distanceMatrix_(3,3) = 8;
-distanceMatrix_(3,4) = -4;
-distanceMatrix_(3,5) = 0;
-distanceMatrix_(3,6) = 2;
-distanceMatrix_(3,7) = -1;
-distanceMatrix_(3,8) = -1;
-distanceMatrix_(3,9) = -4;
-distanceMatrix_(3,10) = -4;
-distanceMatrix_(3,11) = -1;
-distanceMatrix_(3,12) = -4;
-distanceMatrix_(3,13) = -5;
-distanceMatrix_(3,14) = -1;
-distanceMatrix_(3,15) = 0;
-distanceMatrix_(3,16) = -1;
-distanceMatrix_(3,17) = -5;
-distanceMatrix_(3,18) = -3;
-distanceMatrix_(3,19) = -4;
-distanceMatrix_(4,0) = -1;
-distanceMatrix_(4,1) = -4;
-distanceMatrix_(4,2) = -2;
-distanceMatrix_(4,3) = -4;
-distanceMatrix_(4,4) = 13;
-distanceMatrix_(4,5) = -3;
-distanceMatrix_(4,6) = -3;
-distanceMatrix_(4,7) = -3;
-distanceMatrix_(4,8) = -3;
-distanceMatrix_(4,9) = -2;
-distanceMatrix_(4,10) = -2;
-distanceMatrix_(4,11) = -3;
-distanceMatrix_(4,12) = -2;
-distanceMatrix_(4,13) = -2;
-distanceMatrix_(4,14) = -4;
-distanceMatrix_(4,15) = -1;
-distanceMatrix_(4,16) = -1;
-distanceMatrix_(4,17) = -5;
-distanceMatrix_(4,18) = -3;
-distanceMatrix_(4,19) = -1;
-distanceMatrix_(5,0) = -1;
-distanceMatrix_(5,1) = 1;
-distanceMatrix_(5,2) = 0;
-distanceMatrix_(5,3) = 0;
-distanceMatrix_(5,4) = -3;
-distanceMatrix_(5,5) = 7;
-distanceMatrix_(5,6) = 2;
-distanceMatrix_(5,7) = -2;
-distanceMatrix_(5,8) = 1;
-distanceMatrix_(5,9) = -3;
-distanceMatrix_(5,10) = -2;
-distanceMatrix_(5,11) = 2;
-distanceMatrix_(5,12) = 0;
-distanceMatrix_(5,13) = -4;
-distanceMatrix_(5,14) = -1;
-distanceMatrix_(5,15) = 0;
-distanceMatrix_(5,16) = -1;
-distanceMatrix_(5,17) = -1;
-distanceMatrix_(5,18) = -1;
-distanceMatrix_(5,19) = -3;
-distanceMatrix_(6,0) = -1;
-distanceMatrix_(6,1) = 0;
-distanceMatrix_(6,2) = 0;
-distanceMatrix_(6,3) = 2;
-distanceMatrix_(6,4) = -3;
-distanceMatrix_(6,5) = 2;
-distanceMatrix_(6,6) = 6;
-distanceMatrix_(6,7) = -3;
-distanceMatrix_(6,8) = 0;
-distanceMatrix_(6,9) = -4;
-distanceMatrix_(6,10) = -3;
-distanceMatrix_(6,11) = 1;
-distanceMatrix_(6,12) = -2;
-distanceMatrix_(6,13) = -3;
-distanceMatrix_(6,14) = -1;
-distanceMatrix_(6,15) = -1;
-distanceMatrix_(6,16) = -1;
-distanceMatrix_(6,17) = -3;
-distanceMatrix_(6,18) = -2;
-distanceMatrix_(6,19) = -3;
-distanceMatrix_(7,0) = 0;
-distanceMatrix_(7,1) = -3;
-distanceMatrix_(7,2) = 0;
-distanceMatrix_(7,3) = -1;
-distanceMatrix_(7,4) = -3;
-distanceMatrix_(7,5) = -2;
-distanceMatrix_(7,6) = -3;
-distanceMatrix_(7,7) = 8;
-distanceMatrix_(7,8) = -2;
-distanceMatrix_(7,9) = -4;
-distanceMatrix_(7,10) = -4;
-distanceMatrix_(7,11) = -2;
-distanceMatrix_(7,12) = -3;
-distanceMatrix_(7,13) = -4;
-distanceMatrix_(7,14) = -2;
-distanceMatrix_(7,15) = 0;
-distanceMatrix_(7,16) = -2;
-distanceMatrix_(7,17) = -3;
-distanceMatrix_(7,18) = -3;
-distanceMatrix_(7,19) = -4;
-distanceMatrix_(8,0) = -2;
-distanceMatrix_(8,1) = 0;
-distanceMatrix_(8,2) = 1;
-distanceMatrix_(8,3) = -1;
-distanceMatrix_(8,4) = -3;
-distanceMatrix_(8,5) = 1;
-distanceMatrix_(8,6) = 0;
-distanceMatrix_(8,7) = -2;
-distanceMatrix_(8,8) = 10;
-distanceMatrix_(8,9) = -4;
-distanceMatrix_(8,10) = -3;
-distanceMatrix_(8,11) = 0;
-distanceMatrix_(8,12) = -1;
-distanceMatrix_(8,13) = -1;
-distanceMatrix_(8,14) = -2;
-distanceMatrix_(8,15) = -1;
-distanceMatrix_(8,16) = -2;
-distanceMatrix_(8,17) = -3;
-distanceMatrix_(8,18) = 2;
-distanceMatrix_(8,19) = -4;
-distanceMatrix_(9,0) = -1;
-distanceMatrix_(9,1) = -4;
-distanceMatrix_(9,2) = -3;
-distanceMatrix_(9,3) = -4;
-distanceMatrix_(9,4) = -2;
-distanceMatrix_(9,5) = -3;
-distanceMatrix_(9,6) = -4;
-distanceMatrix_(9,7) = -4;
-distanceMatrix_(9,8) = -4;
-distanceMatrix_(9,9) = 5;
-distanceMatrix_(9,10) = 2;
-distanceMatrix_(9,11) = -3;
-distanceMatrix_(9,12) = 2;
-distanceMatrix_(9,13) = 0;
-distanceMatrix_(9,14) = -3;
-distanceMatrix_(9,15) = -3;
-distanceMatrix_(9,16) = -1;
-distanceMatrix_(9,17) = -3;
-distanceMatrix_(9,18) = -1;
-distanceMatrix_(9,19) = 4;
-distanceMatrix_(10,0) = -2;
-distanceMatrix_(10,1) = -3;
-distanceMatrix_(10,2) = -4;
-distanceMatrix_(10,3) = -4;
-distanceMatrix_(10,4) = -2;
-distanceMatrix_(10,5) = -2;
-distanceMatrix_(10,6) = -3;
-distanceMatrix_(10,7) = -4;
-distanceMatrix_(10,8) = -3;
-distanceMatrix_(10,9) = 2;
-distanceMatrix_(10,10) = 5;
-distanceMatrix_(10,11) = -3;
-distanceMatrix_(10,12) = 3;
-distanceMatrix_(10,13) = 1;
-distanceMatrix_(10,14) = -4;
-distanceMatrix_(10,15) = -3;
-distanceMatrix_(10,16) = -1;
-distanceMatrix_(10,17) = -2;
-distanceMatrix_(10,18) = -1;
-distanceMatrix_(10,19) = 1;
-distanceMatrix_(11,0) = -1;
-distanceMatrix_(11,1) = 3;
-distanceMatrix_(11,2) = 0;
-distanceMatrix_(11,3) = -1;
-distanceMatrix_(11,4) = -3;
-distanceMatrix_(11,5) = 2;
-distanceMatrix_(11,6) = 1;
-distanceMatrix_(11,7) = -2;
-distanceMatrix_(11,8) = 0;
-distanceMatrix_(11,9) = -3;
-distanceMatrix_(11,10) = -3;
-distanceMatrix_(11,11) = 6;
-distanceMatrix_(11,12) = -2;
-distanceMatrix_(11,13) = -4;
-distanceMatrix_(11,14) = -1;
-distanceMatrix_(11,15) = 0;
-distanceMatrix_(11,16) = -1;
-distanceMatrix_(11,17) = -3;
-distanceMatrix_(11,18) = -2;
-distanceMatrix_(11,19) = -3;
-distanceMatrix_(12,0) = -1;
-distanceMatrix_(12,1) = -2;
-distanceMatrix_(12,2) = -2;
-distanceMatrix_(12,3) = -4;
-distanceMatrix_(12,4) = -2;
-distanceMatrix_(12,5) = 0;
-distanceMatrix_(12,6) = -2;
-distanceMatrix_(12,7) = -3;
-distanceMatrix_(12,8) = -1;
-distanceMatrix_(12,9) = 2;
-distanceMatrix_(12,10) = 3;
-distanceMatrix_(12,11) = -2;
-distanceMatrix_(12,12) = 7;
-distanceMatrix_(12,13) = 0;
-distanceMatrix_(12,14) = -3;
-distanceMatrix_(12,15) = -2;
-distanceMatrix_(12,16) = -1;
-distanceMatrix_(12,17) = -1;
-distanceMatrix_(12,18) = 0;
-distanceMatrix_(12,19) = 1;
-distanceMatrix_(13,0) = -3;
-distanceMatrix_(13,1) = -3;
-distanceMatrix_(13,2) = -4;
-distanceMatrix_(13,3) = -5;
-distanceMatrix_(13,4) = -2;
-distanceMatrix_(13,5) = -4;
-distanceMatrix_(13,6) = -3;
-distanceMatrix_(13,7) = -4;
-distanceMatrix_(13,8) = -1;
-distanceMatrix_(13,9) = 0;
-distanceMatrix_(13,10) = 1;
-distanceMatrix_(13,11) = -4;
-distanceMatrix_(13,12) = 0;
-distanceMatrix_(13,13) = 8;
-distanceMatrix_(13,14) = -4;
-distanceMatrix_(13,15) = -3;
-distanceMatrix_(13,16) = -2;
-distanceMatrix_(13,17) = 1;
-distanceMatrix_(13,18) = 4;
-distanceMatrix_(13,19) = -1;
-distanceMatrix_(14,0) = -1;
-distanceMatrix_(14,1) = -3;
-distanceMatrix_(14,2) = -2;
-distanceMatrix_(14,3) = -1;
-distanceMatrix_(14,4) = -4;
-distanceMatrix_(14,5) = -1;
-distanceMatrix_(14,6) = -1;
-distanceMatrix_(14,7) = -2;
-distanceMatrix_(14,8) = -2;
-distanceMatrix_(14,9) = -3;
-distanceMatrix_(14,10) = -4;
-distanceMatrix_(14,11) = -1;
-distanceMatrix_(14,12) = -3;
-distanceMatrix_(14,13) = -4;
-distanceMatrix_(14,14) = 10;
-distanceMatrix_(14,15) = -1;
-distanceMatrix_(14,16) = -1;
-distanceMatrix_(14,17) = -4;
-distanceMatrix_(14,18) = -3;
-distanceMatrix_(14,19) = -3;
-distanceMatrix_(15,0) = 1;
-distanceMatrix_(15,1) = -1;
-distanceMatrix_(15,2) = 1;
-distanceMatrix_(15,3) = 0;
-distanceMatrix_(15,4) = -1;
-distanceMatrix_(15,5) = 0;
-distanceMatrix_(15,6) = -1;
-distanceMatrix_(15,7) = 0;
-distanceMatrix_(15,8) = -1;
-distanceMatrix_(15,9) = -3;
-distanceMatrix_(15,10) = -3;
-distanceMatrix_(15,11) = 0;
-distanceMatrix_(15,12) = -2;
-distanceMatrix_(15,13) = -3;
-distanceMatrix_(15,14) = -1;
-distanceMatrix_(15,15) = 5;
-distanceMatrix_(15,16) = 2;
-distanceMatrix_(15,17) = -4;
-distanceMatrix_(15,18) = -2;
-distanceMatrix_(15,19) = -2;
-distanceMatrix_(16,0) = 0;
-distanceMatrix_(16,1) = -1;
-distanceMatrix_(16,2) = 0;
-distanceMatrix_(16,3) = -1;
-distanceMatrix_(16,4) = -1;
-distanceMatrix_(16,5) = -1;
-distanceMatrix_(16,6) = -1;
-distanceMatrix_(16,7) = -2;
-distanceMatrix_(16,8) = -2;
-distanceMatrix_(16,9) = -1;
-distanceMatrix_(16,10) = -1;
-distanceMatrix_(16,11) = -1;
-distanceMatrix_(16,12) = -1;
-distanceMatrix_(16,13) = -2;
-distanceMatrix_(16,14) = -1;
-distanceMatrix_(16,15) = 2;
-distanceMatrix_(16,16) = 5;
-distanceMatrix_(16,17) = -3;
-distanceMatrix_(16,18) = -2;
-distanceMatrix_(16,19) = 0;
-distanceMatrix_(17,0) = -3;
-distanceMatrix_(17,1) = -3;
-distanceMatrix_(17,2) = -4;
-distanceMatrix_(17,3) = -5;
-distanceMatrix_(17,4) = -5;
-distanceMatrix_(17,5) = -1;
-distanceMatrix_(17,6) = -3;
-distanceMatrix_(17,7) = -3;
-distanceMatrix_(17,8) = -3;
-distanceMatrix_(17,9) = -3;
-distanceMatrix_(17,10) = -2;
-distanceMatrix_(17,11) = -3;
-distanceMatrix_(17,12) = -1;
-distanceMatrix_(17,13) = 1;
-distanceMatrix_(17,14) = -4;
-distanceMatrix_(17,15) = -4;
-distanceMatrix_(17,16) = -3;
-distanceMatrix_(17,17) = 15;
-distanceMatrix_(17,18) = 2;
-distanceMatrix_(17,19) = -3;
-distanceMatrix_(18,0) = -2;
-distanceMatrix_(18,1) = -1;
-distanceMatrix_(18,2) = -2;
-distanceMatrix_(18,3) = -3;
-distanceMatrix_(18,4) = -3;
-distanceMatrix_(18,5) = -1;
-distanceMatrix_(18,6) = -2;
-distanceMatrix_(18,7) = -3;
-distanceMatrix_(18,8) = 2;
-distanceMatrix_(18,9) = -1;
-distanceMatrix_(18,10) = -1;
-distanceMatrix_(18,11) = -2;
-distanceMatrix_(18,12) = 0;
-distanceMatrix_(18,13) = 4;
-distanceMatrix_(18,14) = -3;
-distanceMatrix_(18,15) = -2;
-distanceMatrix_(18,16) = -2;
-distanceMatrix_(18,17) = 2;
-distanceMatrix_(18,18) = 8;
-distanceMatrix_(18,19) = -1;
-distanceMatrix_(19,0) = 0;
-distanceMatrix_(19,1) = -3;
-distanceMatrix_(19,2) = -3;
-distanceMatrix_(19,3) = -4;
-distanceMatrix_(19,4) = -1;
-distanceMatrix_(19,5) = -3;
-distanceMatrix_(19,6) = -3;
-distanceMatrix_(19,7) = -4;
-distanceMatrix_(19,8) = -4;
-distanceMatrix_(19,9) = 4;
-distanceMatrix_(19,10) = 1;
-distanceMatrix_(19,11) = -3;
-distanceMatrix_(19,12) = 1;
-distanceMatrix_(19,13) = -1;
-distanceMatrix_(19,14) = -3;
-distanceMatrix_(19,15) = -2;
-distanceMatrix_(19,16) = 0;
-distanceMatrix_(19,17) = -3;
-distanceMatrix_(19,18) = -1;
-distanceMatrix_(19,19) = 5;
diff --git a/src/Bpp/Seq/AlphabetIndex/__GranthamMatrixCode b/src/Bpp/Seq/AlphabetIndex/__GranthamMatrixCode
deleted file mode 100644
index b1f9dcf..0000000
--- a/src/Bpp/Seq/AlphabetIndex/__GranthamMatrixCode
+++ /dev/null
@@ -1,827 +0,0 @@
-//library(seqinr)
-//data(aaindex)
-
-distanceMatrix_(0,0) = 0;
-distanceMatrix_(1,0) = 112;
-distanceMatrix_(1,1) = 0;
-distanceMatrix_(2,0) = 111;
-distanceMatrix_(2,1) = 86;
-distanceMatrix_(2,2) = 0;
-distanceMatrix_(3,0) = 126;
-distanceMatrix_(3,1) = 96;
-distanceMatrix_(3,2) = 23;
-distanceMatrix_(3,3) = 0;
-distanceMatrix_(4,0) = 195;
-distanceMatrix_(4,1) = 180;
-distanceMatrix_(4,2) = 139;
-distanceMatrix_(4,3) = 154;
-distanceMatrix_(4,4) = 0;
-distanceMatrix_(5,0) = 91;
-distanceMatrix_(5,1) = 43;
-distanceMatrix_(5,2) = 46;
-distanceMatrix_(5,3) = 61;
-distanceMatrix_(5,4) = 154;
-distanceMatrix_(5,5) = 0;
-distanceMatrix_(6,0) = 107;
-distanceMatrix_(6,1) = 54;
-distanceMatrix_(6,2) = 42;
-distanceMatrix_(6,3) = 45;
-distanceMatrix_(6,4) = 170;
-distanceMatrix_(6,5) = 29;
-distanceMatrix_(6,6) = 0;
-distanceMatrix_(7,0) = 60;
-distanceMatrix_(7,1) = 125;
-distanceMatrix_(7,2) = 80;
-distanceMatrix_(7,3) = 94;
-distanceMatrix_(7,4) = 159;
-distanceMatrix_(7,5) = 87;
-distanceMatrix_(7,6) = 98;
-distanceMatrix_(7,7) = 0;
-distanceMatrix_(8,0) = 86;
-distanceMatrix_(8,1) = 29;
-distanceMatrix_(8,2) = 68;
-distanceMatrix_(8,3) = 81;
-distanceMatrix_(8,4) = 174;
-distanceMatrix_(8,5) = 24;
-distanceMatrix_(8,6) = 40;
-distanceMatrix_(8,7) = 98;
-distanceMatrix_(8,8) = 0;
-distanceMatrix_(9,0) = 94;
-distanceMatrix_(9,1) = 97;
-distanceMatrix_(9,2) = 149;
-distanceMatrix_(9,3) = 168;
-distanceMatrix_(9,4) = 198;
-distanceMatrix_(9,5) = 109;
-distanceMatrix_(9,6) = 134;
-distanceMatrix_(9,7) = 135;
-distanceMatrix_(9,8) = 94;
-distanceMatrix_(9,9) = 0;
-distanceMatrix_(10,0) = 96;
-distanceMatrix_(10,1) = 102;
-distanceMatrix_(10,2) = 153;
-distanceMatrix_(10,3) = 172;
-distanceMatrix_(10,4) = 198;
-distanceMatrix_(10,5) = 113;
-distanceMatrix_(10,6) = 138;
-distanceMatrix_(10,7) = 138;
-distanceMatrix_(10,8) = 99;
-distanceMatrix_(10,9) = 5;
-distanceMatrix_(10,10) = 0;
-distanceMatrix_(11,0) = 106;
-distanceMatrix_(11,1) = 26;
-distanceMatrix_(11,2) = 94;
-distanceMatrix_(11,3) = 101;
-distanceMatrix_(11,4) = 202;
-distanceMatrix_(11,5) = 53;
-distanceMatrix_(11,6) = 56;
-distanceMatrix_(11,7) = 127;
-distanceMatrix_(11,8) = 32;
-distanceMatrix_(11,9) = 102;
-distanceMatrix_(11,10) = 107;
-distanceMatrix_(11,11) = 0;
-distanceMatrix_(12,0) = 84;
-distanceMatrix_(12,1) = 91;
-distanceMatrix_(12,2) = 142;
-distanceMatrix_(12,3) = 160;
-distanceMatrix_(12,4) = 196;
-distanceMatrix_(12,5) = 101;
-distanceMatrix_(12,6) = 126;
-distanceMatrix_(12,7) = 127;
-distanceMatrix_(12,8) = 87;
-distanceMatrix_(12,9) = 10;
-distanceMatrix_(12,10) = 15;
-distanceMatrix_(12,11) = 95;
-distanceMatrix_(12,12) = 0;
-distanceMatrix_(13,0) = 113;
-distanceMatrix_(13,1) = 97;
-distanceMatrix_(13,2) = 158;
-distanceMatrix_(13,3) = 177;
-distanceMatrix_(13,4) = 205;
-distanceMatrix_(13,5) = 116;
-distanceMatrix_(13,6) = 140;
-distanceMatrix_(13,7) = 153;
-distanceMatrix_(13,8) = 100;
-distanceMatrix_(13,9) = 21;
-distanceMatrix_(13,10) = 22;
-distanceMatrix_(13,11) = 102;
-distanceMatrix_(13,12) = 28;
-distanceMatrix_(13,13) = 0;
-distanceMatrix_(14,0) = 27;
-distanceMatrix_(14,1) = 103;
-distanceMatrix_(14,2) = 91;
-distanceMatrix_(14,3) = 108;
-distanceMatrix_(14,4) = 169;
-distanceMatrix_(14,5) = 76;
-distanceMatrix_(14,6) = 93;
-distanceMatrix_(14,7) = 42;
-distanceMatrix_(14,8) = 77;
-distanceMatrix_(14,9) = 95;
-distanceMatrix_(14,10) = 98;
-distanceMatrix_(14,11) = 103;
-distanceMatrix_(14,12) = 87;
-distanceMatrix_(14,13) = 114;
-distanceMatrix_(14,14) = 0;
-distanceMatrix_(15,0) = 99;
-distanceMatrix_(15,1) = 110;
-distanceMatrix_(15,2) = 46;
-distanceMatrix_(15,3) = 65;
-distanceMatrix_(15,4) = 112;
-distanceMatrix_(15,5) = 68;
-distanceMatrix_(15,6) = 80;
-distanceMatrix_(15,7) = 56;
-distanceMatrix_(15,8) = 89;
-distanceMatrix_(15,9) = 142;
-distanceMatrix_(15,10) = 145;
-distanceMatrix_(15,11) = 121;
-distanceMatrix_(15,12) = 135;
-distanceMatrix_(15,13) = 155;
-distanceMatrix_(15,14) = 74;
-distanceMatrix_(15,15) = 0;
-distanceMatrix_(16,0) = 58;
-distanceMatrix_(16,1) = 71;
-distanceMatrix_(16,2) = 65;
-distanceMatrix_(16,3) = 85;
-distanceMatrix_(16,4) = 149;
-distanceMatrix_(16,5) = 42;
-distanceMatrix_(16,6) = 65;
-distanceMatrix_(16,7) = 59;
-distanceMatrix_(16,8) = 47;
-distanceMatrix_(16,9) = 89;
-distanceMatrix_(16,10) = 92;
-distanceMatrix_(16,11) = 78;
-distanceMatrix_(16,12) = 81;
-distanceMatrix_(16,13) = 103;
-distanceMatrix_(16,14) = 38;
-distanceMatrix_(16,15) = 58;
-distanceMatrix_(16,16) = 0;
-distanceMatrix_(17,0) = 148;
-distanceMatrix_(17,1) = 101;
-distanceMatrix_(17,2) = 174;
-distanceMatrix_(17,3) = 181;
-distanceMatrix_(17,4) = 215;
-distanceMatrix_(17,5) = 130;
-distanceMatrix_(17,6) = 152;
-distanceMatrix_(17,7) = 184;
-distanceMatrix_(17,8) = 115;
-distanceMatrix_(17,9) = 61;
-distanceMatrix_(17,10) = 61;
-distanceMatrix_(17,11) = 110;
-distanceMatrix_(17,12) = 67;
-distanceMatrix_(17,13) = 40;
-distanceMatrix_(17,14) = 147;
-distanceMatrix_(17,15) = 177;
-distanceMatrix_(17,16) = 128;
-distanceMatrix_(17,17) = 0;
-distanceMatrix_(18,0) = 112;
-distanceMatrix_(18,1) = 77;
-distanceMatrix_(18,2) = 143;
-distanceMatrix_(18,3) = 160;
-distanceMatrix_(18,4) = 194;
-distanceMatrix_(18,5) = 99;
-distanceMatrix_(18,6) = 122;
-distanceMatrix_(18,7) = 147;
-distanceMatrix_(18,8) = 83;
-distanceMatrix_(18,9) = 33;
-distanceMatrix_(18,10) = 36;
-distanceMatrix_(18,11) = 85;
-distanceMatrix_(18,12) = 36;
-distanceMatrix_(18,13) = 22;
-distanceMatrix_(18,14) = 110;
-distanceMatrix_(18,15) = 144;
-distanceMatrix_(18,16) = 92;
-distanceMatrix_(18,17) = 37;
-distanceMatrix_(18,18) = 0;
-distanceMatrix_(19,0) = 64;
-distanceMatrix_(19,1) = 96;
-distanceMatrix_(19,2) = 133;
-distanceMatrix_(19,3) = 152;
-distanceMatrix_(19,4) = 192;
-distanceMatrix_(19,5) = 96;
-distanceMatrix_(19,6) = 121;
-distanceMatrix_(19,7) = 109;
-distanceMatrix_(19,8) = 84;
-distanceMatrix_(19,9) = 29;
-distanceMatrix_(19,10) = 32;
-distanceMatrix_(19,11) = 97;
-distanceMatrix_(19,12) = 21;
-distanceMatrix_(19,13) = 50;
-distanceMatrix_(19,14) = 68;
-distanceMatrix_(19,15) = 124;
-distanceMatrix_(19,16) = 69;
-distanceMatrix_(19,17) = 88;
-distanceMatrix_(19,18) = 55;
-distanceMatrix_(19,19) = 0;
-distanceMatrix_(0,1) = -112;
-distanceMatrix_(0,2) = -111;
-distanceMatrix_(0,3) = -126;
-distanceMatrix_(0,4) = -195;
-distanceMatrix_(0,5) = -91;
-distanceMatrix_(0,6) = -107;
-distanceMatrix_(0,7) = -60;
-distanceMatrix_(0,8) = -86;
-distanceMatrix_(0,9) = -94;
-distanceMatrix_(0,10) = -96;
-distanceMatrix_(0,11) = -106;
-distanceMatrix_(0,12) = -84;
-distanceMatrix_(0,13) = -113;
-distanceMatrix_(0,14) = -27;
-distanceMatrix_(0,15) = -99;
-distanceMatrix_(0,16) = -58;
-distanceMatrix_(0,17) = -148;
-distanceMatrix_(0,18) = -112;
-distanceMatrix_(0,19) = -64;
-distanceMatrix_(1,2) = -86;
-distanceMatrix_(1,3) = -96;
-distanceMatrix_(1,4) = -180;
-distanceMatrix_(1,5) = -43;
-distanceMatrix_(1,6) = -54;
-distanceMatrix_(1,7) = -125;
-distanceMatrix_(1,8) = -29;
-distanceMatrix_(1,9) = -97;
-distanceMatrix_(1,10) = -102;
-distanceMatrix_(1,11) = -26;
-distanceMatrix_(1,12) = -91;
-distanceMatrix_(1,13) = -97;
-distanceMatrix_(1,14) = -103;
-distanceMatrix_(1,15) = -110;
-distanceMatrix_(1,16) = -71;
-distanceMatrix_(1,17) = -101;
-distanceMatrix_(1,18) = -77;
-distanceMatrix_(1,19) = -96;
-distanceMatrix_(2,3) = -23;
-distanceMatrix_(2,4) = -139;
-distanceMatrix_(2,5) = -46;
-distanceMatrix_(2,6) = -42;
-distanceMatrix_(2,7) = -80;
-distanceMatrix_(2,8) = -68;
-distanceMatrix_(2,9) = -149;
-distanceMatrix_(2,10) = -153;
-distanceMatrix_(2,11) = -94;
-distanceMatrix_(2,12) = -142;
-distanceMatrix_(2,13) = -158;
-distanceMatrix_(2,14) = -91;
-distanceMatrix_(2,15) = -46;
-distanceMatrix_(2,16) = -65;
-distanceMatrix_(2,17) = -174;
-distanceMatrix_(2,18) = -143;
-distanceMatrix_(2,19) = -133;
-distanceMatrix_(3,4) = -154;
-distanceMatrix_(3,5) = -61;
-distanceMatrix_(3,6) = -45;
-distanceMatrix_(3,7) = -94;
-distanceMatrix_(3,8) = -81;
-distanceMatrix_(3,9) = -168;
-distanceMatrix_(3,10) = -172;
-distanceMatrix_(3,11) = -101;
-distanceMatrix_(3,12) = -160;
-distanceMatrix_(3,13) = -177;
-distanceMatrix_(3,14) = -108;
-distanceMatrix_(3,15) = -65;
-distanceMatrix_(3,16) = -85;
-distanceMatrix_(3,17) = -181;
-distanceMatrix_(3,18) = -160;
-distanceMatrix_(3,19) = -152;
-distanceMatrix_(4,5) = -154;
-distanceMatrix_(4,6) = -170;
-distanceMatrix_(4,7) = -159;
-distanceMatrix_(4,8) = -174;
-distanceMatrix_(4,9) = -198;
-distanceMatrix_(4,10) = -198;
-distanceMatrix_(4,11) = -202;
-distanceMatrix_(4,12) = -196;
-distanceMatrix_(4,13) = -205;
-distanceMatrix_(4,14) = -169;
-distanceMatrix_(4,15) = -112;
-distanceMatrix_(4,16) = -149;
-distanceMatrix_(4,17) = -215;
-distanceMatrix_(4,18) = -194;
-distanceMatrix_(4,19) = -192;
-distanceMatrix_(5,6) = -29;
-distanceMatrix_(5,7) = -87;
-distanceMatrix_(5,8) = -24;
-distanceMatrix_(5,9) = -109;
-distanceMatrix_(5,10) = -113;
-distanceMatrix_(5,11) = -53;
-distanceMatrix_(5,12) = -101;
-distanceMatrix_(5,13) = -116;
-distanceMatrix_(5,14) = -76;
-distanceMatrix_(5,15) = -68;
-distanceMatrix_(5,16) = -42;
-distanceMatrix_(5,17) = -130;
-distanceMatrix_(5,18) = -99;
-distanceMatrix_(5,19) = -96;
-distanceMatrix_(6,7) = -98;
-distanceMatrix_(6,8) = -40;
-distanceMatrix_(6,9) = -134;
-distanceMatrix_(6,10) = -138;
-distanceMatrix_(6,11) = -56;
-distanceMatrix_(6,12) = -126;
-distanceMatrix_(6,13) = -140;
-distanceMatrix_(6,14) = -93;
-distanceMatrix_(6,15) = -80;
-distanceMatrix_(6,16) = -65;
-distanceMatrix_(6,17) = -152;
-distanceMatrix_(6,18) = -122;
-distanceMatrix_(6,19) = -121;
-distanceMatrix_(7,8) = -98;
-distanceMatrix_(7,9) = -135;
-distanceMatrix_(7,10) = -138;
-distanceMatrix_(7,11) = -127;
-distanceMatrix_(7,12) = -127;
-distanceMatrix_(7,13) = -153;
-distanceMatrix_(7,14) = -42;
-distanceMatrix_(7,15) = -56;
-distanceMatrix_(7,16) = -59;
-distanceMatrix_(7,17) = -184;
-distanceMatrix_(7,18) = -147;
-distanceMatrix_(7,19) = -109;
-distanceMatrix_(8,9) = -94;
-distanceMatrix_(8,10) = -99;
-distanceMatrix_(8,11) = -32;
-distanceMatrix_(8,12) = -87;
-distanceMatrix_(8,13) = -100;
-distanceMatrix_(8,14) = -77;
-distanceMatrix_(8,15) = -89;
-distanceMatrix_(8,16) = -47;
-distanceMatrix_(8,17) = -115;
-distanceMatrix_(8,18) = -83;
-distanceMatrix_(8,19) = -84;
-distanceMatrix_(9,10) = -5;
-distanceMatrix_(9,11) = -102;
-distanceMatrix_(9,12) = -10;
-distanceMatrix_(9,13) = -21;
-distanceMatrix_(9,14) = -95;
-distanceMatrix_(9,15) = -142;
-distanceMatrix_(9,16) = -89;
-distanceMatrix_(9,17) = -61;
-distanceMatrix_(9,18) = -33;
-distanceMatrix_(9,19) = -29;
-distanceMatrix_(10,11) = -107;
-distanceMatrix_(10,12) = -15;
-distanceMatrix_(10,13) = -22;
-distanceMatrix_(10,14) = -98;
-distanceMatrix_(10,15) = -145;
-distanceMatrix_(10,16) = -92;
-distanceMatrix_(10,17) = -61;
-distanceMatrix_(10,18) = -36;
-distanceMatrix_(10,19) = -32;
-distanceMatrix_(11,12) = -95;
-distanceMatrix_(11,13) = -102;
-distanceMatrix_(11,14) = -103;
-distanceMatrix_(11,15) = -121;
-distanceMatrix_(11,16) = -78;
-distanceMatrix_(11,17) = -110;
-distanceMatrix_(11,18) = -85;
-distanceMatrix_(11,19) = -97;
-distanceMatrix_(12,13) = -28;
-distanceMatrix_(12,14) = -87;
-distanceMatrix_(12,15) = -135;
-distanceMatrix_(12,16) = -81;
-distanceMatrix_(12,17) = -67;
-distanceMatrix_(12,18) = -36;
-distanceMatrix_(12,19) = -21;
-distanceMatrix_(13,14) = -114;
-distanceMatrix_(13,15) = -155;
-distanceMatrix_(13,16) = -103;
-distanceMatrix_(13,17) = -40;
-distanceMatrix_(13,18) = -22;
-distanceMatrix_(13,19) = -50;
-distanceMatrix_(14,15) = -74;
-distanceMatrix_(14,16) = -38;
-distanceMatrix_(14,17) = -147;
-distanceMatrix_(14,18) = -110;
-distanceMatrix_(14,19) = -68;
-distanceMatrix_(15,16) = -58;
-distanceMatrix_(15,17) = -177;
-distanceMatrix_(15,18) = -144;
-distanceMatrix_(15,19) = -124;
-distanceMatrix_(16,17) = -128;
-distanceMatrix_(16,18) = -92;
-distanceMatrix_(16,19) = -69;
-distanceMatrix_(17,18) = -37;
-distanceMatrix_(17,19) = -88;
-distanceMatrix_(18,19) = -55;
-
-//data<-data.frame(composition=aaindex[["GRAR740101"]]$I,polarity=aaindex[["GRAR740102"]]$I,volume=aaindex[["GRAR740103"]]$I)
-//library(ade4)
-//pca<-dudi.pca(data)
-//
-//plot(pca$li[,1:2],type="n")
-//text(pca$li[,1:2],rownames(data))
-//
-//s.corcircle(pca$co)
-//layout(matrix(1:3,nrow=1))
-//a1<-pca$li[,1]; names(a1)<-rownames(data); dotchart(sort(a1))
-//a2<-pca$li[,2]; names(a2)<-rownames(data); dotchart(sort(a2))
-//a3<-pca$li[,3]; names(a3)<-rownames(data); dotchart(sort(a3))
-//
-//x<-pca$li[,1]
-//m<-matrix(nrow=20, ncol=20)
-//unlink("tmp.cpp")
-//for(i in 1:length(x))
-//  for(j in 1:length(x))
-//  {
-//    m[i,j]<-sign(x[j] - x[i])
-//    cat("signMatrix_(",(i-1),", ",(j-1),") = ", m[i,j], ";\n",sep="",file="tmp.cpp",append=TRUE)
-//  }
-
-signMatrix_(0, 0) = 0;
-signMatrix_(0, 1) = 1;
-signMatrix_(0, 2) = -1;
-signMatrix_(0, 3) = -1;
-signMatrix_(0, 4) = -1;
-signMatrix_(0, 5) = -1;
-signMatrix_(0, 6) = -1;
-signMatrix_(0, 7) = -1;
-signMatrix_(0, 8) = -1;
-signMatrix_(0, 9) = 1;
-signMatrix_(0, 10) = 1;
-signMatrix_(0, 11) = 1;
-signMatrix_(0, 12) = 1;
-signMatrix_(0, 13) = 1;
-signMatrix_(0, 14) = -1;
-signMatrix_(0, 15) = -1;
-signMatrix_(0, 16) = -1;
-signMatrix_(0, 17) = 1;
-signMatrix_(0, 18) = 1;
-signMatrix_(0, 19) = 1;
-signMatrix_(1, 0) = -1;
-signMatrix_(1, 1) = 0;
-signMatrix_(1, 2) = -1;
-signMatrix_(1, 3) = -1;
-signMatrix_(1, 4) = -1;
-signMatrix_(1, 5) = -1;
-signMatrix_(1, 6) = -1;
-signMatrix_(1, 7) = -1;
-signMatrix_(1, 8) = -1;
-signMatrix_(1, 9) = 1;
-signMatrix_(1, 10) = 1;
-signMatrix_(1, 11) = 1;
-signMatrix_(1, 12) = 1;
-signMatrix_(1, 13) = 1;
-signMatrix_(1, 14) = -1;
-signMatrix_(1, 15) = -1;
-signMatrix_(1, 16) = -1;
-signMatrix_(1, 17) = 1;
-signMatrix_(1, 18) = 1;
-signMatrix_(1, 19) = 1;
-signMatrix_(2, 0) = 1;
-signMatrix_(2, 1) = 1;
-signMatrix_(2, 2) = 0;
-signMatrix_(2, 3) = -1;
-signMatrix_(2, 4) = -1;
-signMatrix_(2, 5) = 1;
-signMatrix_(2, 6) = 1;
-signMatrix_(2, 7) = 1;
-signMatrix_(2, 8) = 1;
-signMatrix_(2, 9) = 1;
-signMatrix_(2, 10) = 1;
-signMatrix_(2, 11) = 1;
-signMatrix_(2, 12) = 1;
-signMatrix_(2, 13) = 1;
-signMatrix_(2, 14) = 1;
-signMatrix_(2, 15) = 1;
-signMatrix_(2, 16) = 1;
-signMatrix_(2, 17) = 1;
-signMatrix_(2, 18) = 1;
-signMatrix_(2, 19) = 1;
-signMatrix_(3, 0) = 1;
-signMatrix_(3, 1) = 1;
-signMatrix_(3, 2) = 1;
-signMatrix_(3, 3) = 0;
-signMatrix_(3, 4) = 1;
-signMatrix_(3, 5) = 1;
-signMatrix_(3, 6) = 1;
-signMatrix_(3, 7) = 1;
-signMatrix_(3, 8) = 1;
-signMatrix_(3, 9) = 1;
-signMatrix_(3, 10) = 1;
-signMatrix_(3, 11) = 1;
-signMatrix_(3, 12) = 1;
-signMatrix_(3, 13) = 1;
-signMatrix_(3, 14) = 1;
-signMatrix_(3, 15) = 1;
-signMatrix_(3, 16) = 1;
-signMatrix_(3, 17) = 1;
-signMatrix_(3, 18) = 1;
-signMatrix_(3, 19) = 1;
-signMatrix_(4, 0) = 1;
-signMatrix_(4, 1) = 1;
-signMatrix_(4, 2) = 1;
-signMatrix_(4, 3) = -1;
-signMatrix_(4, 4) = 0;
-signMatrix_(4, 5) = 1;
-signMatrix_(4, 6) = 1;
-signMatrix_(4, 7) = 1;
-signMatrix_(4, 8) = 1;
-signMatrix_(4, 9) = 1;
-signMatrix_(4, 10) = 1;
-signMatrix_(4, 11) = 1;
-signMatrix_(4, 12) = 1;
-signMatrix_(4, 13) = 1;
-signMatrix_(4, 14) = 1;
-signMatrix_(4, 15) = 1;
-signMatrix_(4, 16) = 1;
-signMatrix_(4, 17) = 1;
-signMatrix_(4, 18) = 1;
-signMatrix_(4, 19) = 1;
-signMatrix_(5, 0) = 1;
-signMatrix_(5, 1) = 1;
-signMatrix_(5, 2) = -1;
-signMatrix_(5, 3) = -1;
-signMatrix_(5, 4) = -1;
-signMatrix_(5, 5) = 0;
-signMatrix_(5, 6) = -1;
-signMatrix_(5, 7) = -1;
-signMatrix_(5, 8) = 1;
-signMatrix_(5, 9) = 1;
-signMatrix_(5, 10) = 1;
-signMatrix_(5, 11) = 1;
-signMatrix_(5, 12) = 1;
-signMatrix_(5, 13) = 1;
-signMatrix_(5, 14) = 1;
-signMatrix_(5, 15) = -1;
-signMatrix_(5, 16) = 1;
-signMatrix_(5, 17) = 1;
-signMatrix_(5, 18) = 1;
-signMatrix_(5, 19) = 1;
-signMatrix_(6, 0) = 1;
-signMatrix_(6, 1) = 1;
-signMatrix_(6, 2) = -1;
-signMatrix_(6, 3) = -1;
-signMatrix_(6, 4) = -1;
-signMatrix_(6, 5) = 1;
-signMatrix_(6, 6) = 0;
-signMatrix_(6, 7) = -1;
-signMatrix_(6, 8) = 1;
-signMatrix_(6, 9) = 1;
-signMatrix_(6, 10) = 1;
-signMatrix_(6, 11) = 1;
-signMatrix_(6, 12) = 1;
-signMatrix_(6, 13) = 1;
-signMatrix_(6, 14) = 1;
-signMatrix_(6, 15) = -1;
-signMatrix_(6, 16) = 1;
-signMatrix_(6, 17) = 1;
-signMatrix_(6, 18) = 1;
-signMatrix_(6, 19) = 1;
-signMatrix_(7, 0) = 1;
-signMatrix_(7, 1) = 1;
-signMatrix_(7, 2) = -1;
-signMatrix_(7, 3) = -1;
-signMatrix_(7, 4) = -1;
-signMatrix_(7, 5) = 1;
-signMatrix_(7, 6) = 1;
-signMatrix_(7, 7) = 0;
-signMatrix_(7, 8) = 1;
-signMatrix_(7, 9) = 1;
-signMatrix_(7, 10) = 1;
-signMatrix_(7, 11) = 1;
-signMatrix_(7, 12) = 1;
-signMatrix_(7, 13) = 1;
-signMatrix_(7, 14) = 1;
-signMatrix_(7, 15) = -1;
-signMatrix_(7, 16) = 1;
-signMatrix_(7, 17) = 1;
-signMatrix_(7, 18) = 1;
-signMatrix_(7, 19) = 1;
-signMatrix_(8, 0) = 1;
-signMatrix_(8, 1) = 1;
-signMatrix_(8, 2) = -1;
-signMatrix_(8, 3) = -1;
-signMatrix_(8, 4) = -1;
-signMatrix_(8, 5) = -1;
-signMatrix_(8, 6) = -1;
-signMatrix_(8, 7) = -1;
-signMatrix_(8, 8) = 0;
-signMatrix_(8, 9) = 1;
-signMatrix_(8, 10) = 1;
-signMatrix_(8, 11) = 1;
-signMatrix_(8, 12) = 1;
-signMatrix_(8, 13) = 1;
-signMatrix_(8, 14) = -1;
-signMatrix_(8, 15) = -1;
-signMatrix_(8, 16) = -1;
-signMatrix_(8, 17) = 1;
-signMatrix_(8, 18) = 1;
-signMatrix_(8, 19) = 1;
-signMatrix_(9, 0) = -1;
-signMatrix_(9, 1) = -1;
-signMatrix_(9, 2) = -1;
-signMatrix_(9, 3) = -1;
-signMatrix_(9, 4) = -1;
-signMatrix_(9, 5) = -1;
-signMatrix_(9, 6) = -1;
-signMatrix_(9, 7) = -1;
-signMatrix_(9, 8) = -1;
-signMatrix_(9, 9) = 0;
-signMatrix_(9, 10) = 1;
-signMatrix_(9, 11) = -1;
-signMatrix_(9, 12) = -1;
-signMatrix_(9, 13) = 1;
-signMatrix_(9, 14) = -1;
-signMatrix_(9, 15) = -1;
-signMatrix_(9, 16) = -1;
-signMatrix_(9, 17) = 1;
-signMatrix_(9, 18) = -1;
-signMatrix_(9, 19) = -1;
-signMatrix_(10, 0) = -1;
-signMatrix_(10, 1) = -1;
-signMatrix_(10, 2) = -1;
-signMatrix_(10, 3) = -1;
-signMatrix_(10, 4) = -1;
-signMatrix_(10, 5) = -1;
-signMatrix_(10, 6) = -1;
-signMatrix_(10, 7) = -1;
-signMatrix_(10, 8) = -1;
-signMatrix_(10, 9) = -1;
-signMatrix_(10, 10) = 0;
-signMatrix_(10, 11) = -1;
-signMatrix_(10, 12) = -1;
-signMatrix_(10, 13) = 1;
-signMatrix_(10, 14) = -1;
-signMatrix_(10, 15) = -1;
-signMatrix_(10, 16) = -1;
-signMatrix_(10, 17) = 1;
-signMatrix_(10, 18) = -1;
-signMatrix_(10, 19) = -1;
-signMatrix_(11, 0) = -1;
-signMatrix_(11, 1) = -1;
-signMatrix_(11, 2) = -1;
-signMatrix_(11, 3) = -1;
-signMatrix_(11, 4) = -1;
-signMatrix_(11, 5) = -1;
-signMatrix_(11, 6) = -1;
-signMatrix_(11, 7) = -1;
-signMatrix_(11, 8) = -1;
-signMatrix_(11, 9) = 1;
-signMatrix_(11, 10) = 1;
-signMatrix_(11, 11) = 0;
-signMatrix_(11, 12) = 1;
-signMatrix_(11, 13) = 1;
-signMatrix_(11, 14) = -1;
-signMatrix_(11, 15) = -1;
-signMatrix_(11, 16) = -1;
-signMatrix_(11, 17) = 1;
-signMatrix_(11, 18) = 1;
-signMatrix_(11, 19) = 1;
-signMatrix_(12, 0) = -1;
-signMatrix_(12, 1) = -1;
-signMatrix_(12, 2) = -1;
-signMatrix_(12, 3) = -1;
-signMatrix_(12, 4) = -1;
-signMatrix_(12, 5) = -1;
-signMatrix_(12, 6) = -1;
-signMatrix_(12, 7) = -1;
-signMatrix_(12, 8) = -1;
-signMatrix_(12, 9) = 1;
-signMatrix_(12, 10) = 1;
-signMatrix_(12, 11) = -1;
-signMatrix_(12, 12) = 0;
-signMatrix_(12, 13) = 1;
-signMatrix_(12, 14) = -1;
-signMatrix_(12, 15) = -1;
-signMatrix_(12, 16) = -1;
-signMatrix_(12, 17) = 1;
-signMatrix_(12, 18) = 1;
-signMatrix_(12, 19) = -1;
-signMatrix_(13, 0) = -1;
-signMatrix_(13, 1) = -1;
-signMatrix_(13, 2) = -1;
-signMatrix_(13, 3) = -1;
-signMatrix_(13, 4) = -1;
-signMatrix_(13, 5) = -1;
-signMatrix_(13, 6) = -1;
-signMatrix_(13, 7) = -1;
-signMatrix_(13, 8) = -1;
-signMatrix_(13, 9) = -1;
-signMatrix_(13, 10) = -1;
-signMatrix_(13, 11) = -1;
-signMatrix_(13, 12) = -1;
-signMatrix_(13, 13) = 0;
-signMatrix_(13, 14) = -1;
-signMatrix_(13, 15) = -1;
-signMatrix_(13, 16) = -1;
-signMatrix_(13, 17) = 1;
-signMatrix_(13, 18) = -1;
-signMatrix_(13, 19) = -1;
-signMatrix_(14, 0) = 1;
-signMatrix_(14, 1) = 1;
-signMatrix_(14, 2) = -1;
-signMatrix_(14, 3) = -1;
-signMatrix_(14, 4) = -1;
-signMatrix_(14, 5) = -1;
-signMatrix_(14, 6) = -1;
-signMatrix_(14, 7) = -1;
-signMatrix_(14, 8) = 1;
-signMatrix_(14, 9) = 1;
-signMatrix_(14, 10) = 1;
-signMatrix_(14, 11) = 1;
-signMatrix_(14, 12) = 1;
-signMatrix_(14, 13) = 1;
-signMatrix_(14, 14) = 0;
-signMatrix_(14, 15) = -1;
-signMatrix_(14, 16) = -1;
-signMatrix_(14, 17) = 1;
-signMatrix_(14, 18) = 1;
-signMatrix_(14, 19) = 1;
-signMatrix_(15, 0) = 1;
-signMatrix_(15, 1) = 1;
-signMatrix_(15, 2) = -1;
-signMatrix_(15, 3) = -1;
-signMatrix_(15, 4) = -1;
-signMatrix_(15, 5) = 1;
-signMatrix_(15, 6) = 1;
-signMatrix_(15, 7) = 1;
-signMatrix_(15, 8) = 1;
-signMatrix_(15, 9) = 1;
-signMatrix_(15, 10) = 1;
-signMatrix_(15, 11) = 1;
-signMatrix_(15, 12) = 1;
-signMatrix_(15, 13) = 1;
-signMatrix_(15, 14) = 1;
-signMatrix_(15, 15) = 0;
-signMatrix_(15, 16) = 1;
-signMatrix_(15, 17) = 1;
-signMatrix_(15, 18) = 1;
-signMatrix_(15, 19) = 1;
-signMatrix_(16, 0) = 1;
-signMatrix_(16, 1) = 1;
-signMatrix_(16, 2) = -1;
-signMatrix_(16, 3) = -1;
-signMatrix_(16, 4) = -1;
-signMatrix_(16, 5) = -1;
-signMatrix_(16, 6) = -1;
-signMatrix_(16, 7) = -1;
-signMatrix_(16, 8) = 1;
-signMatrix_(16, 9) = 1;
-signMatrix_(16, 10) = 1;
-signMatrix_(16, 11) = 1;
-signMatrix_(16, 12) = 1;
-signMatrix_(16, 13) = 1;
-signMatrix_(16, 14) = 1;
-signMatrix_(16, 15) = -1;
-signMatrix_(16, 16) = 0;
-signMatrix_(16, 17) = 1;
-signMatrix_(16, 18) = 1;
-signMatrix_(16, 19) = 1;
-signMatrix_(17, 0) = -1;
-signMatrix_(17, 1) = -1;
-signMatrix_(17, 2) = -1;
-signMatrix_(17, 3) = -1;
-signMatrix_(17, 4) = -1;
-signMatrix_(17, 5) = -1;
-signMatrix_(17, 6) = -1;
-signMatrix_(17, 7) = -1;
-signMatrix_(17, 8) = -1;
-signMatrix_(17, 9) = -1;
-signMatrix_(17, 10) = -1;
-signMatrix_(17, 11) = -1;
-signMatrix_(17, 12) = -1;
-signMatrix_(17, 13) = -1;
-signMatrix_(17, 14) = -1;
-signMatrix_(17, 15) = -1;
-signMatrix_(17, 16) = -1;
-signMatrix_(17, 17) = 0;
-signMatrix_(17, 18) = -1;
-signMatrix_(17, 19) = -1;
-signMatrix_(18, 0) = -1;
-signMatrix_(18, 1) = -1;
-signMatrix_(18, 2) = -1;
-signMatrix_(18, 3) = -1;
-signMatrix_(18, 4) = -1;
-signMatrix_(18, 5) = -1;
-signMatrix_(18, 6) = -1;
-signMatrix_(18, 7) = -1;
-signMatrix_(18, 8) = -1;
-signMatrix_(18, 9) = 1;
-signMatrix_(18, 10) = 1;
-signMatrix_(18, 11) = -1;
-signMatrix_(18, 12) = -1;
-signMatrix_(18, 13) = 1;
-signMatrix_(18, 14) = -1;
-signMatrix_(18, 15) = -1;
-signMatrix_(18, 16) = -1;
-signMatrix_(18, 17) = 1;
-signMatrix_(18, 18) = 0;
-signMatrix_(18, 19) = -1;
-signMatrix_(19, 0) = -1;
-signMatrix_(19, 1) = -1;
-signMatrix_(19, 2) = -1;
-signMatrix_(19, 3) = -1;
-signMatrix_(19, 4) = -1;
-signMatrix_(19, 5) = -1;
-signMatrix_(19, 6) = -1;
-signMatrix_(19, 7) = -1;
-signMatrix_(19, 8) = -1;
-signMatrix_(19, 9) = 1;
-signMatrix_(19, 10) = 1;
-signMatrix_(19, 11) = -1;
-signMatrix_(19, 12) = 1;
-signMatrix_(19, 13) = 1;
-signMatrix_(19, 14) = -1;
-signMatrix_(19, 15) = -1;
-signMatrix_(19, 16) = -1;
-signMatrix_(19, 17) = 1;
-signMatrix_(19, 18) = 1;
-signMatrix_(19, 19) = 0;
diff --git a/src/Bpp/Seq/AlphabetIndex/__MiyataMatrixCode b/src/Bpp/Seq/AlphabetIndex/__MiyataMatrixCode
deleted file mode 100644
index 9929985..0000000
--- a/src/Bpp/Seq/AlphabetIndex/__MiyataMatrixCode
+++ /dev/null
@@ -1,400 +0,0 @@
-distanceMatrix_(0,0) = 0;
-distanceMatrix_(1,0) = 2.92;
-distanceMatrix_(1,1) = 0;
-distanceMatrix_(2,0) = 1.78;
-distanceMatrix_(2,1) = 2.04;
-distanceMatrix_(2,2) = 0;
-distanceMatrix_(3,0) = 2.37;
-distanceMatrix_(3,1) = 2.34;
-distanceMatrix_(3,2) = 0.65;
-distanceMatrix_(3,3) = 0;
-distanceMatrix_(4,0) = 1.39;
-distanceMatrix_(4,1) = 3.06;
-distanceMatrix_(4,2) = 2.83;
-distanceMatrix_(4,3) = 3.48;
-distanceMatrix_(4,4) = 0;
-distanceMatrix_(5,0) = 1.92;
-distanceMatrix_(5,1) = 1.13;
-distanceMatrix_(5,2) = 0.99;
-distanceMatrix_(5,3) = 1.47;
-distanceMatrix_(5,4) = 2.48;
-distanceMatrix_(5,5) = 0;
-distanceMatrix_(6,0) = 2.46;
-distanceMatrix_(6,1) = 1.45;
-distanceMatrix_(6,2) = 0.85;
-distanceMatrix_(6,3) = 0.9;
-distanceMatrix_(6,4) = 3.26;
-distanceMatrix_(6,5) = 0.84;
-distanceMatrix_(6,6) = 0;
-distanceMatrix_(7,0) = 0.91;
-distanceMatrix_(7,1) = 3.58;
-distanceMatrix_(7,2) = 1.96;
-distanceMatrix_(7,3) = 2.37;
-distanceMatrix_(7,4) = 2.22;
-distanceMatrix_(7,5) = 2.48;
-distanceMatrix_(7,6) = 2.78;
-distanceMatrix_(7,7) = 0;
-distanceMatrix_(8,0) = 2.17;
-distanceMatrix_(8,1) = 0.82;
-distanceMatrix_(8,2) = 1.29;
-distanceMatrix_(8,3) = 1.72;
-distanceMatrix_(8,4) = 2.56;
-distanceMatrix_(8,5) = 0.32;
-distanceMatrix_(8,6) = 0.96;
-distanceMatrix_(8,7) = 2.78;
-distanceMatrix_(8,8) = 0;
-distanceMatrix_(9,0) = 2.69;
-distanceMatrix_(9,1) = 2.49;
-distanceMatrix_(9,2) = 3.37;
-distanceMatrix_(9,3) = 3.98;
-distanceMatrix_(9,4) = 1.63;
-distanceMatrix_(9,5) = 2.57;
-distanceMatrix_(9,6) = 3.39;
-distanceMatrix_(9,7) = 3.6;
-distanceMatrix_(9,8) = 2.45;
-distanceMatrix_(9,9) = 0;
-distanceMatrix_(10,0) = 2.76;
-distanceMatrix_(10,1) = 2.62;
-distanceMatrix_(10,2) = 3.49;
-distanceMatrix_(10,3) = 4.1;
-distanceMatrix_(10,4) = 1.65;
-distanceMatrix_(10,5) = 2.7;
-distanceMatrix_(10,6) = 3.53;
-distanceMatrix_(10,7) = 3.67;
-distanceMatrix_(10,8) = 2.59;
-distanceMatrix_(10,9) = 0.14;
-distanceMatrix_(10,10) = 0;
-distanceMatrix_(11,0) = 2.96;
-distanceMatrix_(11,1) = 0.4;
-distanceMatrix_(11,2) = 1.84;
-distanceMatrix_(11,3) = 2.05;
-distanceMatrix_(11,4) = 3.27;
-distanceMatrix_(11,5) = 1.06;
-distanceMatrix_(11,6) = 1.14;
-distanceMatrix_(11,7) = 3.54;
-distanceMatrix_(11,8) = 0.79;
-distanceMatrix_(11,9) = 2.84;
-distanceMatrix_(11,10) = 2.98;
-distanceMatrix_(11,11) = 0;
-distanceMatrix_(12,0) = 2.42;
-distanceMatrix_(12,1) = 2.29;
-distanceMatrix_(12,2) = 3.08;
-distanceMatrix_(12,3) = 3.69;
-distanceMatrix_(12,4) = 1.46;
-distanceMatrix_(12,5) = 2.3;
-distanceMatrix_(12,6) = 3.13;
-distanceMatrix_(12,7) = 3.34;
-distanceMatrix_(12,8) = 2.19;
-distanceMatrix_(12,9) = 0.29;
-distanceMatrix_(12,10) = 0.41;
-distanceMatrix_(12,11) = 2.63;
-distanceMatrix_(12,12) = 0;
-distanceMatrix_(13,0) = 3.23;
-distanceMatrix_(13,1) = 2.47;
-distanceMatrix_(13,2) = 3.7;
-distanceMatrix_(13,3) = 4.27;
-distanceMatrix_(13,4) = 2.24;
-distanceMatrix_(13,5) = 2.81;
-distanceMatrix_(13,6) = 3.59;
-distanceMatrix_(13,7) = 4.14;
-distanceMatrix_(13,8) = 2.63;
-distanceMatrix_(13,9) = 0.61;
-distanceMatrix_(13,10) = 0.63;
-distanceMatrix_(13,11) = 2.85;
-distanceMatrix_(13,12) = 0.82;
-distanceMatrix_(13,13) = 0;
-distanceMatrix_(14,0) = 0.06;
-distanceMatrix_(14,1) = 2.9;
-distanceMatrix_(14,2) = 1.8;
-distanceMatrix_(14,3) = 2.4;
-distanceMatrix_(14,4) = 1.33;
-distanceMatrix_(14,5) = 1.92;
-distanceMatrix_(14,6) = 2.48;
-distanceMatrix_(14,7) = 0.97;
-distanceMatrix_(14,8) = 2.15;
-distanceMatrix_(14,9) = 2.62;
-distanceMatrix_(14,10) = 2.7;
-distanceMatrix_(14,11) = 2.94;
-distanceMatrix_(14,12) = 2.36;
-distanceMatrix_(14,13) = 3.17;
-distanceMatrix_(14,14) = 0;
-distanceMatrix_(15,0) = 0.51;
-distanceMatrix_(15,1) = 2.74;
-distanceMatrix_(15,2) = 1.31;
-distanceMatrix_(15,3) = 1.87;
-distanceMatrix_(15,4) = 1.84;
-distanceMatrix_(15,5) = 1.65;
-distanceMatrix_(15,6) = 2.06;
-distanceMatrix_(15,7) = 0.85;
-distanceMatrix_(15,8) = 1.94;
-distanceMatrix_(15,9) = 2.95;
-distanceMatrix_(15,10) = 3.04;
-distanceMatrix_(15,11) = 2.71;
-distanceMatrix_(15,12) = 2.67;
-distanceMatrix_(15,13) = 3.45;
-distanceMatrix_(15,14) = 0.56;
-distanceMatrix_(15,15) = 0;
-distanceMatrix_(16,0) = 0.9;
-distanceMatrix_(16,1) = 2.03;
-distanceMatrix_(16,2) = 1.4;
-distanceMatrix_(16,3) = 2.05;
-distanceMatrix_(16,4) = 1.45;
-distanceMatrix_(16,5) = 1.12;
-distanceMatrix_(16,6) = 1.83;
-distanceMatrix_(16,7) = 1.7;
-distanceMatrix_(16,8) = 1.32;
-distanceMatrix_(16,9) = 2.14;
-distanceMatrix_(16,10) = 2.25;
-distanceMatrix_(16,11) = 2.1;
-distanceMatrix_(16,12) = 1.86;
-distanceMatrix_(16,13) = 2.6;
-distanceMatrix_(16,14) = 0.87;
-distanceMatrix_(16,15) = 0.89;
-distanceMatrix_(16,16) = 0;
-distanceMatrix_(17,0) = 4.23;
-distanceMatrix_(17,1) = 2.72;
-distanceMatrix_(17,2) = 4.39;
-distanceMatrix_(17,3) = 4.88;
-distanceMatrix_(17,4) = 3.34;
-distanceMatrix_(17,5) = 3.42;
-distanceMatrix_(17,6) = 4.08;
-distanceMatrix_(17,7) = 5.13;
-distanceMatrix_(17,8) = 3.16;
-distanceMatrix_(17,9) = 1.72;
-distanceMatrix_(17,10) = 1.73;
-distanceMatrix_(17,11) = 3.11;
-distanceMatrix_(17,12) = 1.89;
-distanceMatrix_(17,13) = 1.11;
-distanceMatrix_(17,14) = 4.17;
-distanceMatrix_(17,15) = 4.38;
-distanceMatrix_(17,16) = 3.5;
-distanceMatrix_(17,17) = 0;
-distanceMatrix_(18,0) = 3.18;
-distanceMatrix_(18,1) = 2.02;
-distanceMatrix_(18,2) = 3.42;
-distanceMatrix_(18,3) = 3.95;
-distanceMatrix_(18,4) = 2.38;
-distanceMatrix_(18,5) = 2.48;
-distanceMatrix_(18,6) = 3.22;
-distanceMatrix_(18,7) = 4.08;
-distanceMatrix_(18,8) = 2.27;
-distanceMatrix_(18,9) = 0.86;
-distanceMatrix_(18,10) = 0.94;
-distanceMatrix_(18,11) = 2.42;
-distanceMatrix_(18,12) = 0.93;
-distanceMatrix_(18,13) = 0.48;
-distanceMatrix_(18,14) = 3.12;
-distanceMatrix_(18,15) = 3.33;
-distanceMatrix_(18,16) = 2.45;
-distanceMatrix_(18,17) = 1.06;
-distanceMatrix_(18,18) = 0;
-distanceMatrix_(19,0) = 1.85;
-distanceMatrix_(19,1) = 2.43;
-distanceMatrix_(19,2) = 2.76;
-distanceMatrix_(19,3) = 3.4;
-distanceMatrix_(19,4) = 0.86;
-distanceMatrix_(19,5) = 2.13;
-distanceMatrix_(19,6) = 2.97;
-distanceMatrix_(19,7) = 2.76;
-distanceMatrix_(19,8) = 2.11;
-distanceMatrix_(19,9) = 0.85;
-distanceMatrix_(19,10) = 0.91;
-distanceMatrix_(19,11) = 2.7;
-distanceMatrix_(19,12) = 0.62;
-distanceMatrix_(19,13) = 1.43;
-distanceMatrix_(19,14) = 1.79;
-distanceMatrix_(19,15) = 2.15;
-distanceMatrix_(19,16) = 1.42;
-distanceMatrix_(19,17) = 2.51;
-distanceMatrix_(19,18) = 1.52;
-distanceMatrix_(19,19) = 0;
-distanceMatrix_(0,1) = -2.92;
-distanceMatrix_(0,2) = -1.78;
-distanceMatrix_(0,3) = -2.37;
-distanceMatrix_(0,4) = -1.39;
-distanceMatrix_(0,5) = -1.92;
-distanceMatrix_(0,6) = -2.46;
-distanceMatrix_(0,7) = -0.91;
-distanceMatrix_(0,8) = -2.17;
-distanceMatrix_(0,9) = -2.69;
-distanceMatrix_(0,10) = -2.76;
-distanceMatrix_(0,11) = -2.96;
-distanceMatrix_(0,12) = -2.42;
-distanceMatrix_(0,13) = -3.23;
-distanceMatrix_(0,14) = -0.06;
-distanceMatrix_(0,15) = -0.51;
-distanceMatrix_(0,16) = -0.9;
-distanceMatrix_(0,17) = -4.23;
-distanceMatrix_(0,18) = -3.18;
-distanceMatrix_(0,19) = -1.85;
-distanceMatrix_(1,2) = -2.04;
-distanceMatrix_(1,3) = -2.34;
-distanceMatrix_(1,4) = -3.06;
-distanceMatrix_(1,5) = -1.13;
-distanceMatrix_(1,6) = -1.45;
-distanceMatrix_(1,7) = -3.58;
-distanceMatrix_(1,8) = -0.82;
-distanceMatrix_(1,9) = -2.49;
-distanceMatrix_(1,10) = -2.62;
-distanceMatrix_(1,11) = -0.4;
-distanceMatrix_(1,12) = -2.29;
-distanceMatrix_(1,13) = -2.47;
-distanceMatrix_(1,14) = -2.9;
-distanceMatrix_(1,15) = -2.74;
-distanceMatrix_(1,16) = -2.03;
-distanceMatrix_(1,17) = -2.72;
-distanceMatrix_(1,18) = -2.02;
-distanceMatrix_(1,19) = -2.43;
-distanceMatrix_(2,3) = -0.65;
-distanceMatrix_(2,4) = -2.83;
-distanceMatrix_(2,5) = -0.99;
-distanceMatrix_(2,6) = -0.85;
-distanceMatrix_(2,7) = -1.96;
-distanceMatrix_(2,8) = -1.29;
-distanceMatrix_(2,9) = -3.37;
-distanceMatrix_(2,10) = -3.49;
-distanceMatrix_(2,11) = -1.84;
-distanceMatrix_(2,12) = -3.08;
-distanceMatrix_(2,13) = -3.7;
-distanceMatrix_(2,14) = -1.8;
-distanceMatrix_(2,15) = -1.31;
-distanceMatrix_(2,16) = -1.4;
-distanceMatrix_(2,17) = -4.39;
-distanceMatrix_(2,18) = -3.42;
-distanceMatrix_(2,19) = -2.76;
-distanceMatrix_(3,4) = -3.48;
-distanceMatrix_(3,5) = -1.47;
-distanceMatrix_(3,6) = -0.9;
-distanceMatrix_(3,7) = -2.37;
-distanceMatrix_(3,8) = -1.72;
-distanceMatrix_(3,9) = -3.98;
-distanceMatrix_(3,10) = -4.1;
-distanceMatrix_(3,11) = -2.05;
-distanceMatrix_(3,12) = -3.69;
-distanceMatrix_(3,13) = -4.27;
-distanceMatrix_(3,14) = -2.4;
-distanceMatrix_(3,15) = -1.87;
-distanceMatrix_(3,16) = -2.05;
-distanceMatrix_(3,17) = -4.88;
-distanceMatrix_(3,18) = -3.95;
-distanceMatrix_(3,19) = -3.4;
-distanceMatrix_(4,5) = -2.48;
-distanceMatrix_(4,6) = -3.26;
-distanceMatrix_(4,7) = -2.22;
-distanceMatrix_(4,8) = -2.56;
-distanceMatrix_(4,9) = -1.63;
-distanceMatrix_(4,10) = -1.65;
-distanceMatrix_(4,11) = -3.27;
-distanceMatrix_(4,12) = -1.46;
-distanceMatrix_(4,13) = -2.24;
-distanceMatrix_(4,14) = -1.33;
-distanceMatrix_(4,15) = -1.84;
-distanceMatrix_(4,16) = -1.45;
-distanceMatrix_(4,17) = -3.34;
-distanceMatrix_(4,18) = -2.38;
-distanceMatrix_(4,19) = -0.86;
-distanceMatrix_(5,6) = -0.84;
-distanceMatrix_(5,7) = -2.48;
-distanceMatrix_(5,8) = -0.32;
-distanceMatrix_(5,9) = -2.57;
-distanceMatrix_(5,10) = -2.7;
-distanceMatrix_(5,11) = -1.06;
-distanceMatrix_(5,12) = -2.3;
-distanceMatrix_(5,13) = -2.81;
-distanceMatrix_(5,14) = -1.92;
-distanceMatrix_(5,15) = -1.65;
-distanceMatrix_(5,16) = -1.12;
-distanceMatrix_(5,17) = -3.42;
-distanceMatrix_(5,18) = -2.48;
-distanceMatrix_(5,19) = -2.13;
-distanceMatrix_(6,7) = -2.78;
-distanceMatrix_(6,8) = -0.96;
-distanceMatrix_(6,9) = -3.39;
-distanceMatrix_(6,10) = -3.53;
-distanceMatrix_(6,11) = -1.14;
-distanceMatrix_(6,12) = -3.13;
-distanceMatrix_(6,13) = -3.59;
-distanceMatrix_(6,14) = -2.48;
-distanceMatrix_(6,15) = -2.06;
-distanceMatrix_(6,16) = -1.83;
-distanceMatrix_(6,17) = -4.08;
-distanceMatrix_(6,18) = -3.22;
-distanceMatrix_(6,19) = -2.97;
-distanceMatrix_(7,8) = -2.78;
-distanceMatrix_(7,9) = -3.6;
-distanceMatrix_(7,10) = -3.67;
-distanceMatrix_(7,11) = -3.54;
-distanceMatrix_(7,12) = -3.34;
-distanceMatrix_(7,13) = -4.14;
-distanceMatrix_(7,14) = -0.97;
-distanceMatrix_(7,15) = -0.85;
-distanceMatrix_(7,16) = -1.7;
-distanceMatrix_(7,17) = -5.13;
-distanceMatrix_(7,18) = -4.08;
-distanceMatrix_(7,19) = -2.76;
-distanceMatrix_(8,9) = -2.45;
-distanceMatrix_(8,10) = -2.59;
-distanceMatrix_(8,11) = -0.79;
-distanceMatrix_(8,12) = -2.19;
-distanceMatrix_(8,13) = -2.63;
-distanceMatrix_(8,14) = -2.15;
-distanceMatrix_(8,15) = -1.94;
-distanceMatrix_(8,16) = -1.32;
-distanceMatrix_(8,17) = -3.16;
-distanceMatrix_(8,18) = -2.27;
-distanceMatrix_(8,19) = -2.11;
-distanceMatrix_(9,10) = -0.14;
-distanceMatrix_(9,11) = -2.84;
-distanceMatrix_(9,12) = -0.29;
-distanceMatrix_(9,13) = -0.61;
-distanceMatrix_(9,14) = -2.62;
-distanceMatrix_(9,15) = -2.95;
-distanceMatrix_(9,16) = -2.14;
-distanceMatrix_(9,17) = -1.72;
-distanceMatrix_(9,18) = -0.86;
-distanceMatrix_(9,19) = -0.85;
-distanceMatrix_(10,11) = -2.98;
-distanceMatrix_(10,12) = -0.41;
-distanceMatrix_(10,13) = -0.63;
-distanceMatrix_(10,14) = -2.7;
-distanceMatrix_(10,15) = -3.04;
-distanceMatrix_(10,16) = -2.25;
-distanceMatrix_(10,17) = -1.73;
-distanceMatrix_(10,18) = -0.94;
-distanceMatrix_(10,19) = -0.91;
-distanceMatrix_(11,12) = -2.63;
-distanceMatrix_(11,13) = -2.85;
-distanceMatrix_(11,14) = -2.94;
-distanceMatrix_(11,15) = -2.71;
-distanceMatrix_(11,16) = -2.1;
-distanceMatrix_(11,17) = -3.11;
-distanceMatrix_(11,18) = -2.42;
-distanceMatrix_(11,19) = -2.7;
-distanceMatrix_(12,13) = -0.82;
-distanceMatrix_(12,14) = -2.36;
-distanceMatrix_(12,15) = -2.67;
-distanceMatrix_(12,16) = -1.86;
-distanceMatrix_(12,17) = -1.89;
-distanceMatrix_(12,18) = -0.93;
-distanceMatrix_(12,19) = -0.62;
-distanceMatrix_(13,14) = -3.17;
-distanceMatrix_(13,15) = -3.45;
-distanceMatrix_(13,16) = -2.6;
-distanceMatrix_(13,17) = -1.11;
-distanceMatrix_(13,18) = -0.48;
-distanceMatrix_(13,19) = -1.43;
-distanceMatrix_(14,15) = -0.56;
-distanceMatrix_(14,16) = -0.87;
-distanceMatrix_(14,17) = -4.17;
-distanceMatrix_(14,18) = -3.12;
-distanceMatrix_(14,19) = -1.79;
-distanceMatrix_(15,16) = -0.89;
-distanceMatrix_(15,17) = -4.38;
-distanceMatrix_(15,18) = -3.33;
-distanceMatrix_(15,19) = -2.15;
-distanceMatrix_(16,17) = -3.5;
-distanceMatrix_(16,18) = -2.45;
-distanceMatrix_(16,19) = -1.42;
-distanceMatrix_(17,18) = -1.06;
-distanceMatrix_(17,19) = -2.51;
-distanceMatrix_(18,19) = -1.52;
diff --git a/src/Bpp/Seq/App/SequenceApplicationTools.cpp b/src/Bpp/Seq/App/SequenceApplicationTools.cpp
deleted file mode 100644
index a253854..0000000
--- a/src/Bpp/Seq/App/SequenceApplicationTools.cpp
+++ /dev/null
@@ -1,599 +0,0 @@
-//
-// File: SequenceApplicationTools.cpp
-// Created by: Julien Dutheil
-// Created on: Fri Oct 21 13:13
-// from file old ApplicationTools.h created on Sun Dec 14 09:36:26 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "SequenceApplicationTools.h"
-#include "../Alphabet/BinaryAlphabet.h"
-#include "../Alphabet/DefaultAlphabet.h"
-#include "../Alphabet/CodonAlphabet.h"
-#include "../Alphabet/AlphabetTools.h"
-#include "../GeneticCode/EchinodermMitochondrialGeneticCode.h"
-#include "../GeneticCode/InvertebrateMitochondrialGeneticCode.h"
-#include "../GeneticCode/StandardGeneticCode.h"
-#include "../GeneticCode/VertebrateMitochondrialGeneticCode.h"
-#include "../GeneticCode/YeastMitochondrialGeneticCode.h"
-#include "../GeneticCode/AscidianMitochondrialGeneticCode.h"
-#include "../GeneticCode/MoldMitochondrialGeneticCode.h"
-#include "../Io/BppOSequenceReaderFormat.h"
-#include "../Io/BppOAlignmentReaderFormat.h"
-#include "../Io/BppOSequenceWriterFormat.h"
-#include "../Io/BppOAlignmentWriterFormat.h"
-#include "../Io/BppOAlphabetIndex1Format.h"
-#include "../Io/BppOAlphabetIndex2Format.h"
-#include "../Io/MaseTools.h"
-#include "../SiteTools.h"
-#include "../SequenceTools.h"
-#include <Bpp/App/ApplicationTools.h>
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/KeyvalTools.h>
-#include <Bpp/App/NumCalcApplicationTools.h>
-#include <Bpp/Numeric/Random/RandomTools.h>
-
-using namespace bpp;
-using namespace std;
-
-/******************************************************************************/
-
-Alphabet* SequenceApplicationTools::getAlphabet(
-  map<string, string>& params,
-  const string& suffix,
-  bool suffixIsOptional,
-  bool verbose,
-  bool allowGeneric,
-  int warn) throw (Exception)
-{
-  Alphabet* chars;
-  string alphtt = ApplicationTools::getStringParameter("alphabet", params, "DNA", suffix, suffixIsOptional, warn);
-
-  string alphabet = "";
-  map<string, string> args;
-  int flag = 0;
-
-  KeyvalTools::parseProcedure(alphtt, alphabet, args);
-  unsigned int lg = 1;
-
-  if (alphabet == "Word")
-  {
-    if (args.find("length") == args.end())
-      throw Exception("Missing length parameter for Word alphabet");
-    lg = TextTools::to<unsigned int>(args["length"]);
-    if (args.find("letter") == args.end())
-      throw Exception("Missing letter alphabet for Word alphabet");
-    alphabet = args["letter"];
-    flag = 1;
-  }
-  else if (alphabet == "RNY")
-  {
-    if (args.find("letter") == args.end())
-      throw Exception("Missing letter alphabet for RNY alphabet");
-    alphabet = args["letter"];
-    flag = 2;
-  }
-
-  if (alphabet == "Binary")
-    chars = new BinaryAlphabet();
-  else if (alphabet == "DNA")
-  {
-    bool mark = ApplicationTools::getBooleanParameter("bangAsGap", args, false, "", true, warn + 1);
-    chars = new DNA(mark);
-  }
-  else if (alphabet == "RNA")
-  {
-    bool mark = ApplicationTools::getBooleanParameter("bangAsGap", args, false, "", true, warn + 1);
-    chars = new RNA(mark);
-  }
-  else if (alphabet == "Protein")
-    chars = new ProteicAlphabet();
-  else if (allowGeneric && alphabet == "Generic")
-    chars = new DefaultAlphabet();
-  else if (alphabet == "Codon")
-  {
-    if (args.find("letter") == args.end())
-      throw Exception("Missing 'letter' argument in Codon :" + alphabet);
-    if (args.find("type") != args.end())
-      throw Exception("'type' argument in Codon is deprecated and has been superseded by the 'genetic_code' option.");
-
-    string alphnDesc = ApplicationTools::getStringParameter("letter", args, "RNA");
-    string alphn;
-    map<string, string> alphnArgs;
-    KeyvalTools::parseProcedure(alphnDesc, alphn, alphnArgs);
-
-    NucleicAlphabet* pnalph;
-    if (alphn == "RNA")
-    {
-      bool mark = ApplicationTools::getBooleanParameter("bangAsGap", alphnArgs, false, "", true, warn + 1);
-      pnalph = new RNA(mark);
-    }
-    else if (alphn == "DNA")
-    {
-      bool mark = ApplicationTools::getBooleanParameter("bangAsGap", alphnArgs, false, "", true, warn + 1);
-      pnalph = new DNA(mark);
-    }
-    else
-      throw Exception("Alphabet not known in Codon : " + alphn);
-
-
-    chars = new CodonAlphabet(pnalph);
-    alphabet = alphabet + "(" + alphn + ")";
-  }
-  else
-    throw Exception("Alphabet not known: " + alphabet);
-
-  if (flag == 1)
-  {
-    chars = new WordAlphabet(chars, lg);
-    string al = " ";
-    for (unsigned i = 0; i < lg; i++)
-    {
-      al += alphabet + " ";
-    }
-    alphabet = "Word(" + al + ")";
-  }
-  else if (flag == 2)
-  {
-    if (AlphabetTools::isNucleicAlphabet(chars))
-    {
-      chars = new RNY(*(dynamic_cast<NucleicAlphabet*>(chars)));
-      alphabet = "RNY(" + alphabet + ")";
-    }
-    else
-      throw Exception("RNY needs a Nucleic Alphabet, instead of " + alphabet);
-  }
-
-
-  if (verbose)
-    ApplicationTools::displayResult("Alphabet type ", alphabet);
-  return chars;
-}
-
-/******************************************************************************/
-
-GeneticCode* SequenceApplicationTools::getGeneticCode(
-  const NucleicAlphabet* alphabet,
-  const string& description) throw (Exception)
-{
-  GeneticCode* geneCode;
-  if (description.find("EchinodermMitochondrial") != string::npos || description.find("9") != string::npos)
-    geneCode = new EchinodermMitochondrialGeneticCode(alphabet);
-  else if (description.find("InvertebrateMitochondrial") != string::npos || description.find("5") != string::npos)
-    geneCode = new InvertebrateMitochondrialGeneticCode(alphabet);
-  else if (description.find("Standard") != string::npos || description.find("1") != string::npos)
-    geneCode = new StandardGeneticCode(alphabet);
-  else if (description.find("VertebrateMitochondrial") != string::npos || description.find("2") != string::npos)
-    geneCode = new VertebrateMitochondrialGeneticCode(alphabet);
-  else if (description.find("YeastMitochondrial") != string::npos || description.find("3") != string::npos)
-    geneCode = new YeastMitochondrialGeneticCode(alphabet);
-  else if (description.find("AscidianMitochondrial") != string::npos || description.find("13") != string::npos)
-    geneCode = new AscidianMitochondrialGeneticCode(alphabet);
-  else if (description.find("MoldMitochondrial") != string::npos || description.find("4") != string::npos)
-    geneCode = new MoldMitochondrialGeneticCode(alphabet);
-  else
-    throw Exception("Unknown GeneticCode: " + description);
-  return geneCode;
-}
-
-/******************************************************************************/
-
-AlphabetIndex1* SequenceApplicationTools::getAlphabetIndex1(const Alphabet* alphabet, const string& description, const string& message, bool verbose)
-throw (Exception)
-{
-  BppOAlphabetIndex1Format reader(alphabet, message, verbose);
-  return reader.read(description);
-}
-
-AlphabetIndex2* SequenceApplicationTools::getAlphabetIndex2(const Alphabet* alphabet, const string& description, const string& message, bool verbose)
-throw (Exception)
-{
-  BppOAlphabetIndex2Format reader(alphabet, message, verbose);
-  return reader.read(description);
-}
-
-/******************************************************************************/
-SequenceContainer* SequenceApplicationTools::getSequenceContainer(
-  const Alphabet* alpha,
-  map<string, string>& params,
-  const string& suffix,
-  bool suffixIsOptional,
-  bool verbose,
-  int warn)
-{
-  string sequenceFilePath = ApplicationTools::getAFilePath("input.sequence.file", params, true, true, suffix, suffixIsOptional, "none", warn);
-  string sequenceFormat = ApplicationTools::getStringParameter("input.sequence.format", params, "Fasta()", suffix, suffixIsOptional, warn);
-  BppOSequenceReaderFormat bppoReader(warn);
-  auto_ptr<ISequence> iSeq(bppoReader.read(sequenceFormat));
-  if (verbose)
-  {
-    ApplicationTools::displayResult("Sequence file " + suffix, sequenceFilePath);
-    ApplicationTools::displayResult("Sequence format " + suffix, iSeq->getFormatName());
-  }
-  SequenceContainer* sequences = iSeq->readSequences(sequenceFilePath, alpha);
-
-  return sequences;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer* SequenceApplicationTools::getSiteContainer(
-  const Alphabet* alpha,
-  map<string, string>& params,
-  const string& suffix,
-  bool suffixIsOptional,
-  bool verbose,
-  int warn)
-{
-  string sequenceFilePath = ApplicationTools::getAFilePath("input.sequence.file", params, true, true, suffix, suffixIsOptional, "none", warn);
-  string sequenceFormat = ApplicationTools::getStringParameter("input.sequence.format", params, "Fasta()", suffix, suffixIsOptional, warn);
-  BppOAlignmentReaderFormat bppoReader(warn);
-  auto_ptr<IAlignment> iAln(bppoReader.read(sequenceFormat));
-  map<string, string> args(bppoReader.getUnparsedArguments());
-  if (verbose)
-  {
-    ApplicationTools::displayResult("Sequence file " + suffix, sequenceFilePath);
-    ApplicationTools::displayResult("Sequence format " + suffix, iAln->getFormatName());
-  }
-
-  const Alphabet* alpha2;
-  if (AlphabetTools::isRNYAlphabet(alpha))
-    alpha2 = &dynamic_cast<const RNY*>(alpha)->getLetterAlphabet();
-  else
-    alpha2 = alpha;
-
-  const SequenceContainer* seqCont = iAln->readAlignment(sequenceFilePath, alpha2);
-
-  VectorSiteContainer* sites2 = new VectorSiteContainer(*dynamic_cast<const OrderedSequenceContainer*>(seqCont));
-  delete seqCont;
-
-  VectorSiteContainer* sites;
-
-  if (AlphabetTools::isRNYAlphabet(alpha))
-  {
-    const SequenceTools ST;
-    sites = new VectorSiteContainer(alpha);
-    for (unsigned int i = 0; i < sites2->getNumberOfSequences(); i++)
-    {
-      sites->addSequence(*(ST.RNYslice(sites2->getSequence(i))));
-    }
-    delete sites2;
-  }
-  else
-    sites = sites2;
-
-
-  
-  // Look for site selection:
-  if (iAln->getFormatName() == "MASE file")
-  {
-    // getting site set:
-    string siteSet = ApplicationTools::getStringParameter("siteSelection", args, "none", suffix, suffixIsOptional, warn + 1);
-    if (siteSet != "none")
-    {
-      VectorSiteContainer* selectedSites;
-      try
-      {
-        selectedSites = dynamic_cast<VectorSiteContainer*>(MaseTools::getSelectedSites(*sites, siteSet));
-        if (verbose)
-          ApplicationTools::displayResult("Set found", TextTools::toString(siteSet) + " sites.");
-      }
-      catch (IOException& ioe)
-      {
-        throw ioe;
-      }
-      if (selectedSites->getNumberOfSites() == 0)
-      {
-        throw Exception("Site set '" + siteSet + "' is empty.");
-      }
-      delete sites;
-      sites = selectedSites;
-    }
-  }
-  else
-  {
-    // getting site set:
-    size_t nbSites = sites->getNumberOfSites();
-    
-    string siteSet = ApplicationTools::getStringParameter("input.site.selection", params, "none", suffix, suffixIsOptional, warn + 1);
-
-    VectorSiteContainer* selectedSites=0;
-    if (siteSet != "none")
-    {
-      vector<size_t> vSite;
-      try {
-        vector<int> vSite1 = NumCalcApplicationTools::seqFromString(siteSet);
-        for (size_t i = 0; i < vSite1.size(); ++i){
-          int x = (vSite1[i] >= 0 ? vSite1[i] : static_cast<int>(nbSites) + vSite1[i]);
-          if (x >= 0)
-            vSite.push_back(static_cast<size_t>(x-1));
-          else
-            throw Exception("SequenceApplicationTools::getSiteContainer(). Incorrect negative index: " + TextTools::toString(x));
-        }
-        selectedSites = dynamic_cast<VectorSiteContainer*>(SiteContainerTools::getSelectedSites(*sites, vSite));
-      }
-      catch (Exception& e)
-      {
-        string seln;
-        map<string, string> selArgs;
-        KeyvalTools::parseProcedure(siteSet, seln, selArgs);
-        if (seln == "Sample")
-        {
-          size_t n = ApplicationTools::getParameter<size_t>("n", selArgs, nbSites, "", true, warn + 1);
-          bool replace = ApplicationTools::getBooleanParameter("replace", selArgs, false, "", true, warn + 1);
-
-          vSite.resize(n);
-          vector<size_t> vPos;
-          for (size_t p = 0; p < nbSites; ++p)
-            vPos.push_back(p);
-          
-          RandomTools::getSample(vPos, vSite, replace);
-
-          selectedSites = dynamic_cast<VectorSiteContainer*>(SiteContainerTools::getSelectedSites(*sites, vSite));
-          if (replace)
-            selectedSites->reindexSites();
-        }
-      }
-
-      if (verbose)
-        ApplicationTools::displayResult("Selected sites", TextTools::toString(siteSet));
-
-      if (selectedSites && (selectedSites->getNumberOfSites() == 0))
-      {
-        throw Exception("Site set '" + siteSet + "' is empty.");
-      }
-      delete sites;
-      sites = selectedSites;
-    }
-  }
-  return sites;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer* SequenceApplicationTools::getSitesToAnalyse(
-  const SiteContainer& allSites,
-  map<string, string>& params,
-  string suffix,
-  bool suffixIsOptional,
-  bool gapAsUnknown,
-  bool verbose,
-  int warn)
-{
-  // Fully resolved sites, i.e. without jokers and gaps:
-  SiteContainer* sitesToAnalyse;
-  VectorSiteContainer* sitesToAnalyse2;
-
-  string option = ApplicationTools::getStringParameter("input.sequence.sites_to_use", params, "complete", suffix, suffixIsOptional, warn);
-  if (verbose)
-    ApplicationTools::displayResult("Sites to use", option);
-  if (option == "all")
-  {
-    sitesToAnalyse = new VectorSiteContainer(allSites);
-    string maxGapOption = ApplicationTools::getStringParameter("input.sequence.max_gap_allowed", params, "100%", suffix, suffixIsOptional, warn);
-
-    if (maxGapOption[maxGapOption.size() - 1] == '%')
-    {
-      double gapFreq = TextTools::toDouble(maxGapOption.substr(0, maxGapOption.size() - 1)) / 100.;
-      if (gapFreq < 1)
-      {
-        if (verbose)
-          ApplicationTools::displayTask("Remove sites with gaps", true);
-        for (size_t i = sitesToAnalyse->getNumberOfSites(); i > 0; --i)
-        {
-          if (verbose)
-            ApplicationTools::displayGauge(sitesToAnalyse->getNumberOfSites() - i, sitesToAnalyse->getNumberOfSites() - 1, '=');
-          map<int, double> freq;
-          SiteTools::getFrequencies(sitesToAnalyse->getSite(i - 1), freq);
-          if (freq[-1] > gapFreq)
-            sitesToAnalyse->deleteSite(i - 1);
-        }
-        if (verbose)
-          ApplicationTools::displayTaskDone();
-      }
-    }
-    else
-    {
-      size_t gapNum = TextTools::to<size_t>(maxGapOption);
-      if (gapNum < sitesToAnalyse->getNumberOfSequences())
-      {
-        if (verbose)
-          ApplicationTools::displayTask("Remove sites with gaps", true);
-        for (size_t i = sitesToAnalyse->getNumberOfSites(); i > 0; i--)
-        {
-          if (verbose)
-            ApplicationTools::displayGauge(sitesToAnalyse->getNumberOfSites() - i, sitesToAnalyse->getNumberOfSites() - 1, '=');
-          map<int, size_t> counts;
-          SiteTools::getCounts(sitesToAnalyse->getSite(i - 1), counts);
-          if (counts[-1] > gapNum)
-            sitesToAnalyse->deleteSite(i - 1);
-        }
-        if (verbose)
-          ApplicationTools::displayTaskDone();
-      }
-    }
-
-    string maxUnresolvedOption = ApplicationTools::getStringParameter("input.sequence.max_unresolved_allowed", params, "100%", suffix, suffixIsOptional, warn);
-
-    int sAlph = static_cast<int>(sitesToAnalyse->getAlphabet()->getSize());
-
-    if (maxUnresolvedOption[maxUnresolvedOption.size() - 1] == '%')
-    {
-      double unresolvedFreq = TextTools::toDouble(maxUnresolvedOption.substr(0, maxUnresolvedOption.size() - 1)) / 100.;
-      if (unresolvedFreq < 1)
-      {
-        if (verbose)
-          ApplicationTools::displayTask("Remove unresolved sites", true);
-        for (size_t i = sitesToAnalyse->getNumberOfSites(); i > 0; --i)
-        {
-          if (verbose)
-            ApplicationTools::displayGauge(sitesToAnalyse->getNumberOfSites() - i, sitesToAnalyse->getNumberOfSites() - 1, '=');
-          map<int, double> freq;
-          SiteTools::getFrequencies(sitesToAnalyse->getSite(i - 1), freq);
-          double x = 0;
-          for (int l = 0; l < sAlph; ++l)
-          {
-            x += freq[l];
-          }
-          if (1 - x > unresolvedFreq)
-            sitesToAnalyse->deleteSite(i - 1);
-        }
-        if (verbose)
-          ApplicationTools::displayTaskDone();
-      }
-    }
-    else
-    {
-      size_t nbSeq = sitesToAnalyse->getNumberOfSequences();
-      size_t unresolvedNum = TextTools::to<size_t>(maxUnresolvedOption);
-      if (unresolvedNum < nbSeq)
-      {
-        if (verbose)
-          ApplicationTools::displayTask("Remove sites with gaps", true);
-        for (size_t i = sitesToAnalyse->getNumberOfSites(); i > 0; i--)
-        {
-          if (verbose)
-            ApplicationTools::displayGauge(sitesToAnalyse->getNumberOfSites() - i, sitesToAnalyse->getNumberOfSites() - 1, '=');
-          map<int, size_t> counts;
-          SiteTools::getCounts(sitesToAnalyse->getSite(i - 1), counts);
-          size_t x = 0;
-          for (int l = 0; l < sAlph; l++)
-          {
-            x += counts[l];
-          }
-
-          if (nbSeq - x > unresolvedNum)
-            sitesToAnalyse->deleteSite(i - 1);
-        }
-        if (verbose)
-          ApplicationTools::displayTaskDone();
-      }
-    }
-
-    if (gapAsUnknown)
-    {
-      SiteContainerTools::changeGapsToUnknownCharacters(*sitesToAnalyse);
-    }
-  }
-  else if (option == "complete")
-  {
-    sitesToAnalyse = SiteContainerTools::getCompleteSites(allSites);
-    size_t nbSites = sitesToAnalyse->getNumberOfSites();
-    if (verbose)
-      ApplicationTools::displayResult("Complete sites", TextTools::toString(nbSites));
-  }
-  else if (option == "nogap")
-  {
-    sitesToAnalyse = SiteContainerTools::getSitesWithoutGaps(allSites);
-    size_t nbSites = sitesToAnalyse->getNumberOfSites();
-    if (verbose)
-      ApplicationTools::displayResult("Sites without gap", TextTools::toString(nbSites));
-  }
-  else
-  {
-    throw Exception("Option '" + option + "' unknown in parameter 'sequence.sites_to_use'.");
-  }
-
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(sitesToAnalyse->getAlphabet());
-  if (ca)
-  {
-    option = ApplicationTools::getStringParameter("input.sequence.remove_stop_codons", params, "no", suffix, true, warn);
-    if ((option != "") && verbose)
-      ApplicationTools::displayResult("Remove Stop Codons", option);
-
-    if (option == "yes")
-    {
-      string codeDesc = ApplicationTools::getStringParameter("genetic_code", params, "Standard", "", true, warn);
-      auto_ptr<GeneticCode> gCode(getGeneticCode(ca->getNucleicAlphabet(), codeDesc));
-      sitesToAnalyse2 = dynamic_cast<VectorSiteContainer*>(SiteContainerTools::removeStopCodonSites(*sitesToAnalyse, *gCode));
-      delete sitesToAnalyse;
-    }
-    else
-      sitesToAnalyse2 = dynamic_cast<VectorSiteContainer*>(sitesToAnalyse);
-  }
-  else
-    sitesToAnalyse2 = dynamic_cast<VectorSiteContainer*>(sitesToAnalyse);
-
-  return sitesToAnalyse2;
-}
-
-/******************************************************************************/
-
-void SequenceApplicationTools::writeSequenceFile(
-  const SequenceContainer& sequences,
-  map<string, string>& params,
-  const string& suffix,
-  bool verbose,
-  int warn)
-{
-  string sequenceFilePath = ApplicationTools::getAFilePath("output.sequence.file", params, true, false, suffix, false, "none", warn);
-  string sequenceFormat   = ApplicationTools::getStringParameter("output.sequence.format", params, "Fasta", suffix, false, warn);
-  BppOSequenceWriterFormat bppoWriter(warn);
-  auto_ptr<OSequence> oSeq(bppoWriter.read(sequenceFormat));
-  if (verbose)
-  {
-    ApplicationTools::displayResult("Output sequence file " + suffix, sequenceFilePath);
-    ApplicationTools::displayResult("Output sequence format " + suffix, oSeq->getFormatName());
-  }
-
-  // Write sequences:
-  oSeq->writeSequences(sequenceFilePath, sequences, true);
-}
-
-/******************************************************************************/
-
-void SequenceApplicationTools::writeAlignmentFile(
-  const SiteContainer& sequences,
-  map<string, string>& params,
-  const string& suffix,
-  bool verbose,
-  int warn)
-{
-  string sequenceFilePath = ApplicationTools::getAFilePath("output.sequence.file", params, true, false, suffix, false, "none", warn);
-  string sequenceFormat   = ApplicationTools::getStringParameter("output.sequence.format", params, "Fasta", suffix, false, warn);
-  BppOAlignmentWriterFormat bppoWriter(warn);
-  auto_ptr<OAlignment> oAln(bppoWriter.read(sequenceFormat));
-  if (verbose)
-  {
-    ApplicationTools::displayResult("Output alignment file " + suffix, sequenceFilePath);
-    ApplicationTools::displayResult("Output alignment format " + suffix, oAln->getFormatName());
-  }
-
-  // Write sequences:
-  oAln->writeAlignment(sequenceFilePath, sequences, true);
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/App/SequenceApplicationTools.h b/src/Bpp/Seq/App/SequenceApplicationTools.h
deleted file mode 100644
index ae2ecbe..0000000
--- a/src/Bpp/Seq/App/SequenceApplicationTools.h
+++ /dev/null
@@ -1,288 +0,0 @@
-//
-// File: SequenceApplicationTools.h
-// Created by: Julien Dutheil
-// Created on: Fri Oct 21 13:13
-// from file old ApplicationTools.h created on Sun Dec 14 09:36:26 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use,
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info".
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability.
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or
-  data to be ensured and,  more generally, to use and operate it in the
-  same conditions as regards security.
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEAPPLICATIONTOOLS_H_
-#define _SEQUENCEAPPLICATIONTOOLS_H_
-
-#include "../Alphabet/Alphabet.h"
-#include "../GeneticCode/GeneticCode.h"
-#include "../AlphabetIndex/AlphabetIndex1.h"
-#include "../AlphabetIndex/AlphabetIndex2.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSiteContainer.h"
-
-#include <map>
-#include <string>
-
-namespace bpp
-{
-/**
- * @brief This class provides some common tools for applications.
- *
- * The functions parse some option file, create corresponding objects and send
- * a pointer toward it.
- *
- * The option files are supposed to follow this simple format:
- * @code
- * parameterName = parameterContent
- * @endcode
- * with one parameter per line.
- *
- * @see ApplicationTools
- */
-  class SequenceApplicationTools
-  {  
-  public:
-    SequenceApplicationTools() {}
-    virtual ~SequenceApplicationTools() {}
-
-  public:
-    /**
-     * @brief Build an Alphabet object according to options.
-     *
-     * Options used are:
-     * - alphabet = [DNA|RNA|Protein], the alphabet type to use.
-     *            = [DNA|RNA|Protein](length=n) a word-alphabet of
-     *                 words with length n
-     *            = [EchinodermMitochondrialCodonAlphabet
-     *                   | InvertebrateMitochondrialCodonAlphabet
-     *                   | InvertebrateMitochondrialCodonAlphabet
-     *                   | StandardCodonAlphabet
-     *                   | VertebrateMitochondrialCodonAlphabet]([alphn=NA|RNA])
-     *                  a codon-alphabet
-     *
-     * @param params  The attribute map where options may be found.
-     * @param suffix  A suffix to be applied to each attribute name.
-     * @param suffixIsOptional Tell if the suffix is absolutely required.
-     * @param verbose Print some info to the 'message' output stream.
-     * @param allowGeneric Tell if generic alphabets can be used.
-     * @param warn Set the warning level (0: always display warnings, >0 display warnings on demand).
-     * @return A new Alphabet object according to options specified.
-     */
-    static Alphabet* getAlphabet(
-      std::map<std::string, std::string>& params,
-      const std::string& suffix = "",
-      bool suffixIsOptional = true,
-      bool verbose = true,
-      bool allowGeneric = false,
-      int warn = 1) throw (Exception);
-
-    /**
-     * @brief Build a GeneticCode object according to options.
-     *
-     * @param alphabet pointer to the NucleicAlphabet
-     * @param description for the name of the GeneticCode:
-     *    [EchinodermMitochondrialGeneticCode
-     *    | InvertebrateMitochondrialGeneticCode
-     *    | InvertebrateMitochondrialGeneticCode
-     *    | StandardGeneticCode
-     *    | VertebrateMitochondrialGeneticCode]
-     * @return A new GeneticCode object
-     * @throw Exception in case of bad description.
-     */
-    static GeneticCode* getGeneticCode(const NucleicAlphabet* alphabet, const std::string& description) throw (Exception);
-
-    /**
-     * @brief Build a AlphabetIndex1 object for a given alphabet.
-     *
-     * @param alphabet The alphabet to use. This is currently only used for assessing the type of distance allowed.
-     * @param description Which distance to use. See the Bio++ Program Suite reference manual for a description of the syntax.
-     * @param message To be displayed when parsing.
-     * @param verbose Tell if some info should be displayed while parsing.
-     * @return A new AlphabetIndex1 object.
-     * @throw Exception in case of bad description.
-     */
-    static AlphabetIndex1* getAlphabetIndex1(
-        const Alphabet* alphabet,
-        const std::string& description,
-        const std::string& message = "Alphabet distance:",
-        bool verbose = true) throw (Exception);
-
-
-    /**
-     * @brief Build a AlphabetIndex2 object for a given alphabet.
-     *
-     * @param alphabet The alphabet to use. This is currently only used for assessing the type of distance allowed.
-     * @param description Which distance to use. See the Bio++ Program Suite reference manual for a description of the syntax.
-     * @param message To be displayed when parsing.
-     * @return A new AlphabetIndex2 object.
-     * @param verbose Tell if some info should be displayed while parsing.
-     * @throw Exception in case of bad description.
-     */
-    static AlphabetIndex2* getAlphabetIndex2(
-        const Alphabet* alphabet,
-        const std::string& description,
-        const std::string& message = "Alphabet distance:",
-        bool verbose = true) throw (Exception);
-
-
-    /**
-     * @brief Build a SequenceContainer object according to options.
-     *
-     * The sequences do not have to be aligned.
-     * The supported sequence formats are Fasta, DCSE, Clustal, Mase, Phylip and GenBank.
-     *
-     * See the Bio++ program suite manual for a full description of the syntax.
-     *
-     * @param alpha   The alphabet to use in the container.
-     * @param params  The attribute map where options may be found.
-     * @param suffix  A suffix to be applied to each attribute name.
-     * @param suffixIsOptional Tell if the suffix is absolutely required.
-     * @param verbose Print some info to the 'message' output stream.
-     * @param warn Set the warning level (0: always display warnings, >0 display warnings on demand).
-     * @return A new VectorSequenceContainer object according to options specified.
-     * @see getSiteContainer to read an alignment.
-     */
-
-    static SequenceContainer* getSequenceContainer(
-      const Alphabet* alpha,
-      std::map<std::string, std::string>& params,
-      const std::string& suffix = "",
-      bool suffixIsOptional = true,
-      bool verbose = true,
-      int warn = 1);
-
-    /**
-     * @brief Build a SiteContainer object according to options.
-     *
-     * Sequences in file must be aligned.
-     * The supported sequence formats are Fasta, DCSE, Clustal, Mase and Phylip.
-     *
-     * See the Bio++ program suite manual for a full description of the syntax.
-     *
-     * @param alpha   The alphabet to use in the container.
-     * @param params  The attribute map where options may be found.
-     * @param suffix  A suffix to be applied to each attribute name.
-     * @param suffixIsOptional Tell if the suffix is absolutely required.
-     * @param verbose Print some info to the 'message' output stream.
-     * @param warn Set the warning level (0: always display warnings, >0 display warnings on demand).
-     * @return A new VectorSiteContainer object according to options specified.
-     */
-    static VectorSiteContainer* getSiteContainer(
-      const Alphabet* alpha,
-      std::map<std::string, std::string>& params,
-      const std::string& suffix = "",
-      bool suffixIsOptional = true,
-      bool verbose = true,
-      int warn = 1);
-
-    /**
-     * @brief Retrieves sites suitable for the analysis.
-     *
-     * Options used are:
-     * - sequence.sites_to_use = [all|complete|nogap].
-     *
-     * If the 'complete' option is used, only fully resolve site will be taken
-     * into account.
-     * If the 'nogap' option is used, only sites without gap will be taken into
-     * account.
-     * If 'gapAsUnknown' is set to true and the all option is selected, gaps will
-     * be changed to 'unknown' character is sequences.
-     *
-     * - sequence.max_gap_allowed = [57%|30]
-     * If a % sign fallow the number, it is taken to be a frequence (in percent).
-     * This specify the maximum amount of gaps allowed for each site.
-     * Sites not satisfying this amount will be removed.
-     * A value of 100% will remove all gap-only sites, a value >100% will keep all sites.
-     *
-     * @param allSites The site container from which sites must be retrieved.
-     * @param params   The attribute map where options may be found.
-     * @param suffix   A suffix to be applied to each attribute name.
-     * @param suffixIsOptional Tell if the suffix is absolutely required.
-     * @param gapAsUnknown Convert gaps to unknown characters.
-     * @param verbose Print some info to the 'message' output stream.
-     * @param warn Set the warning level (0: always display warnings, >0 display warnings on demand).
-     * @return A new VectorSiteContainer object containing sites of interest.
-     */
-    static VectorSiteContainer* getSitesToAnalyse(
-      const SiteContainer& allSites,
-      std::map<std::string, std::string>& params,
-      std::string suffix = "",
-      bool suffixIsOptional = true,
-      bool gapAsUnknown = true,
-      bool verbose = true,
-      int warn = 1);
-
-    /**
-     * @brief Write a sequence file according to options.
-     *
-     * The supported sequence formats are Fasta and Mase.
-     *
-     * See the Bio++ program suite manual for a full description of the syntax.
-     *
-     * @see writeSequenceFile(SiteContainer) for writing alignments, with more output formats.
-     *
-     * @param sequences The sequences to write.
-     * @param params  The attribute map where options may be found.
-     * @param suffix  A suffix to be applied to each attribute name.
-     * @param verbose Print some info to the 'message' output stream.
-     * @param warn Set the warning level (0: always display warnings, >0 display warnings on demand).
-     */
-    static void writeSequenceFile(
-      const SequenceContainer& sequences,
-      std::map<std::string, std::string>& params,
-      const std::string& suffix = "",
-      bool verbose = true,
-      int warn = 1);
-
-    /**
-     * @brief Write a sequence alignment file according to options.
-     *
-     * The supported sequence formats are Fasta, Mase and Phylip.
-     *
-     * See the Bio++ program suite manual for a full description of the syntax.
-     *
-     * @param sequences The aligned sequences to write.
-     * @param params  The attribute map where options may be found.
-     * @param suffix  A suffix to be applied to each attribute name.
-     * @param verbose Print some info to the 'message' output stream.
-     * @param warn Set the warning level (0: always display warnings, >0 display warnings on demand).
-     */
-    static void writeAlignmentFile(
-      const SiteContainer& sequences,
-      std::map<std::string, std::string>& params,
-      const std::string& suffix = "",
-      bool verbose = true,
-      int warn = 1);
-  };
-} // end of namespace bpp.
-
-#endif // _SEQUENCEAPPLICATIONTOOLS_H_
-
diff --git a/src/Bpp/Seq/CodonSiteTools.cpp b/src/Bpp/Seq/CodonSiteTools.cpp
deleted file mode 100644
index c706a09..0000000
--- a/src/Bpp/Seq/CodonSiteTools.cpp
+++ /dev/null
@@ -1,837 +0,0 @@
-//
-// File CodonSiteTools.cpp
-// Author : Sylvain Glémin
-// Last modification : October 2004
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "CodonSiteTools.h"
-#include "Alphabet/CodonAlphabet.h"
-#include "Alphabet/DNA.h"
-#include "Alphabet/AlphabetTools.h"
-#include "SiteTools.h"
-#include "GeneticCode/GeneticCode.h"
-#include "GeneticCode/StandardGeneticCode.h"
-#include <Bpp/Utils/MapTools.h>
-#include <Bpp/Numeric/NumTools.h>
-#include <Bpp/Numeric/VectorTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <cmath>
-
-using namespace std;
-
-/******************************************************************************/
-
-bool CodonSiteTools::hasGapOrStop(const Site& site, const GeneticCode& gCode) throw (AlphabetException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::hasGapOrStop: alphabet is not CodonAlphabet", site.getAlphabet());
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (site[i] < 0)
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-bool CodonSiteTools::hasStop(const Site& site, const GeneticCode& gCode) throw (AlphabetException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::hasStop: alphabet is not CodonAlphabet", site.getAlphabet());
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (gCode.isStop(site[i]))
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-bool CodonSiteTools::isMonoSitePolymorphic(const Site& site) throw (AlphabetException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::isMonoSitePolymorphic: alphabet is not CodonAlphabet", site.getAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::isMonoSitePolymorphic: Incorrect specified site", &site);
-
-  // Global polymorphism checking
-  if (SiteTools::isConstant(site))
-    return false;
-  // initialisation of the 3 sub-sites ot the codon
-  vector<int> pos1, pos2, pos3;
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(site.getAlphabet());
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    pos1.push_back(ca->getFirstPosition(site[i]));
-    pos2.push_back(ca->getSecondPosition(site[i]));
-    pos3.push_back(ca->getThirdPosition(site[i]));
-  }
-  const NucleicAlphabet* na = ca->getNucleicAlphabet();
-  Site s1(pos1, na), s2(pos2, na), s3(pos3, na);
-  // polymorphism checking for each sub-sites
-  size_t nbpol = 0;
-  if (!SiteTools::isConstant(s1))
-    nbpol++;
-  if (!SiteTools::isConstant(s2))
-    nbpol++;
-  if (!SiteTools::isConstant(s3))
-    nbpol++;
-  if (nbpol > 1)
-    return false;
-  return true;
-}
-
-/******************************************************************************/
-
-bool CodonSiteTools::isSynonymousPolymorphic(const Site& site, const GeneticCode& gCode)
-throw (AlphabetException, AlphabetMismatchException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::isSynonymousPolymorphic: alphabet is not CodonAlphabet", site.getAlphabet());
-  if (!site.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::isSynonymousPolymorphic: site and genetic code have not the same codon alphabet.", site.getAlphabet(), gCode.getSourceAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::isSynonymousPolymorphic: Incorrect specified site", &site);
-
-  // Global polymorphism checking
-  if (SiteTools::isConstant(site))
-    return false;
-
-  // Synonymous polymorphism checking
-  vector<int> prot;
-  int first_aa = gCode.translate(site[0]);
-  for (size_t i = 1; i < site.size(); i++)
-  {
-    int aa = gCode.translate(site[i]);
-    if (aa != first_aa)
-      return false;
-  }
-  return true;
-}
-
-/******************************************************************************/
-
-Site* CodonSiteTools::generateCodonSiteWithoutRareVariant(const Site& site, const GeneticCode& gCode, double freqmin)
-throw (AlphabetException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::generateCodonSiteWithoutRareVariant: alphabet is not CodonAlphabet", site.getAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::generateCodonSiteWithoutRareVariant: Incorrect specified site", &site);
-
-  if (SiteTools::isConstant(site))
-  {
-    Site* noRareVariant = new Site(site);
-    return noRareVariant;
-  }
-  else
-  {
-    // Computation
-    map<int, double> freqcodon;
-    SiteTools::getFrequencies(site, freqcodon);
-    const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(site.getAlphabet());
-    const NucleicAlphabet* na = ca->getNucleicAlphabet();
-    int newcodon = -1;
-    for (map<int, double>::iterator it = freqcodon.begin(); it != freqcodon.end(); it++)
-    {
-      if (it->second > freqmin && !gCode.isStop(it->first))
-      {
-        newcodon = it->first;
-        break;
-      }
-    }
-    vector<int> pos1, pos2, pos3;
-    for (size_t i = 0; i < site.size(); i++)
-    {
-      pos1.push_back(ca->getFirstPosition(site[i]));
-      pos2.push_back(ca->getSecondPosition(site[i]));
-      pos3.push_back(ca->getThirdPosition(site[i]));
-    }
-    Site s1(pos1, na), s2(pos2, na), s3(pos3, na);
-    map<int, double> freq1;
-    SiteTools::getFrequencies(s1, freq1);
-    map<int, double> freq2;
-    SiteTools::getFrequencies(s2, freq2);
-    map<int, double> freq3;
-    SiteTools::getFrequencies(s3, freq3);
-    vector<int> codon;
-    for (size_t i = 0; i < site.size(); i++)
-    {
-      if (freq1[s1.getValue(i)] > freqmin && freq2[s2.getValue(i)] > freqmin && freq3[s3.getValue(i)] > freqmin)
-      {
-        codon.push_back(site.getValue(i));
-      }
-      else
-        codon.push_back(newcodon);
-    }
-    Site* noRareVariant = new Site(codon, ca);
-    return noRareVariant;
-  }
-}
-
-/******************************************************************************/
-
-size_t CodonSiteTools::numberOfDifferences(int i, int j, const CodonAlphabet& ca)
-{
-  size_t nbdif = 0;
-  if (ca.getFirstPosition(i) != ca.getFirstPosition(j))
-    nbdif++;
-  if (ca.getSecondPosition(i) != ca.getSecondPosition(j))
-    nbdif++;
-  if (ca.getThirdPosition(i) != ca.getThirdPosition(j))
-    nbdif++;
-  return nbdif;
-}
-
-/******************************************************************************/
-
-double CodonSiteTools::numberOfSynonymousDifferences(int i, int j, const GeneticCode& gCode, bool minchange)
-{
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(gCode.getSourceAlphabet());
-  vector<int> ci = ca->getPositions(i);
-  vector<int> cj = ca->getPositions(j);
-
-  switch (numberOfDifferences(i, j, *ca))
-  {
-  case 0: return 0;
-  case 1:
-  {
-    if (gCode.areSynonymous(i, j))
-      return 1;
-    return 0;
-  }
-  case 2:
-  {
-    if (gCode.areSynonymous(i, j))
-      return 2;
-    vector<double> path(2, 0); // Vector of number of synonymous changes per path (2 here)
-    vector<double> weight(2, 1); // Weight to exclude path through stop codon
-    if (ci[0] == cj[0])
-    {
-      int trans1 = ca->getCodon(ci[0], cj[1], ci[2]); // transitory codon between NcNiNi et NcNjNj: NcNjNi, Nc = identical site
-      int trans2 = ca->getCodon(ci[0], ci[1], cj[2]); // transitory codon between NcNiNi et NcNjNj: NcNiNj, Nc = identical site
-      if (!gCode.isStop(trans1))
-      {
-        if (gCode.areSynonymous(i, trans1))
-          path[0]++;
-        if (gCode.areSynonymous(trans1, j))
-          path[0]++;
-      }
-      else
-        weight[0] = 0;
-      if (!gCode.isStop(trans2))
-      {
-        if (gCode.areSynonymous(i, trans2))
-          path[1]++;
-        if (gCode.areSynonymous(trans2, j))
-          path[1]++;
-      }
-      else
-        weight[1] = 0;
-    }
-    if (ci[1] == cj[1])
-    {
-      int trans1 = ca->getCodon(cj[0], ci[1], ci[2]); // transitory codon between NiNcNi et NjNcNj: NjNcNi, Nc = identical site
-      int trans2 = ca->getCodon(ci[0], ci[1], cj[2]); // transitory codon between NiNcNi et NjNcNj: NiNcNj, Nc = identical site
-      if (!gCode.isStop(trans1))
-      {
-        if (gCode.areSynonymous(i, trans1))
-          path[0]++;
-        if (gCode.areSynonymous(trans1, j))
-          path[0]++;
-      }
-      else
-        weight[0] = 0;
-      if (!gCode.isStop(trans2))
-      {
-        if (gCode.areSynonymous(i, trans2))
-          path[1]++;
-        if (gCode.areSynonymous(trans2, j))
-          path[1]++;
-      }
-      else
-        weight[1] = 0;
-    }
-    if (ci[2] == cj[2])
-    {
-      int trans1 = ca->getCodon(cj[0], ci[1], ci[2]); // transitory codon between NiNiNc et NjNjNc: NjNiNc, Nc = identical site
-      int trans2 = ca->getCodon(ci[0], cj[1], ci[2]); // transitory codon between NiNiNc et NjNjNc: NiNjNc, Nc = identical site
-      if (!gCode.isStop(trans1))
-      {
-        if (gCode.areSynonymous(i, trans1))
-          path[0]++;
-        if (gCode.areSynonymous(trans1, j))
-          path[0]++;
-      }
-      else
-        weight[0] = 0;
-      if (!gCode.isStop(trans2))
-      {
-        if (gCode.areSynonymous(i, trans2))
-          path[1]++;
-        if (gCode.areSynonymous(trans2, j))
-          path[1]++;
-      }
-      else
-        weight[1] = 0;
-    }
-    if (minchange)
-      return VectorTools::max(path);
-
-    double nbdif = 0;
-    for (size_t k = 0; k < 2; k++)
-    {
-      nbdif += path[k] * weight[k];
-    }
-
-    return nbdif / VectorTools::sum(weight);
-  }
-  case 3:
-  {
-    vector<double> path(6, 0);
-    vector<double> weight(6, 1);
-    // First transitory codons
-    int trans100 = ca->getCodon(cj[0], ci[1], ci[2]);
-    int trans010 = ca->getCodon(ci[0], cj[1], ci[2]);
-    int trans001 = ca->getCodon(ci[0], ci[1], cj[2]);
-    // Second transitory codons
-    int trans110 = ca->getCodon(cj[0], cj[1], ci[2]);
-    int trans101 = ca->getCodon(cj[0], ci[1], cj[2]);
-    int trans011 = ca->getCodon(ci[0], cj[1], cj[2]);
-    // Paths
-    if (!gCode.isStop(trans100))
-    {
-      if (gCode.areSynonymous(i, trans100))
-      {
-        path[0]++; path[1]++;
-      }
-      if (!gCode.isStop(trans110))
-      {
-        if (gCode.areSynonymous(trans100, trans110))
-          path[0]++;
-        if (gCode.areSynonymous(trans110, j))
-          path[0]++;
-      }
-      else
-        weight[0] = 0;
-      if (!gCode.isStop(trans101))
-      {
-        if (gCode.areSynonymous(trans100, trans101))
-          path[1]++;
-        if (gCode.areSynonymous(trans101, j))
-          path[1]++;
-      }
-      else
-        weight[1] = 0;
-    }
-    else
-    {
-      weight[0] = 0; weight[1] = 0;
-    }
-    if (!gCode.isStop(trans010))
-    {
-      if (gCode.areSynonymous(i, trans010))
-      {
-        path[2]++; path[3]++;
-      }
-      if (!gCode.isStop(trans110))
-      {
-        if (gCode.areSynonymous(trans010, trans110))
-          path[2]++;
-        if (gCode.areSynonymous(trans110, j))
-          path[2]++;
-      }
-      else
-        weight[2] = 0;
-      if (!gCode.isStop(trans011))
-      {
-        if (gCode.areSynonymous(trans010, trans011))
-          path[3]++;
-        if (gCode.areSynonymous(trans011, j))
-          path[3]++;
-      }
-      else
-        weight[3] = 0;
-    }
-    else
-    {
-      weight[2] = 0; weight[3] = 0;
-    }
-    if (!gCode.isStop(trans001))
-    {
-      if (gCode.areSynonymous(i, trans001))
-      {
-        path[4]++; path[5]++;
-      }
-      if (!gCode.isStop(trans101))
-      {
-        if (gCode.areSynonymous(trans001, trans101))
-          path[4]++;
-        if (gCode.areSynonymous(trans101, j))
-          path[4]++;
-      }
-      else
-        weight[4] = 0;
-      if (!gCode.isStop(trans011))
-      {
-        if (gCode.areSynonymous(trans001, trans011))
-          path[5]++;
-        if (gCode.areSynonymous(trans011, j))
-          path[5]++;
-      }
-      else
-        weight[5] = 0;
-    }
-    else
-    {
-      weight[4] = 0; weight[5] = 0;
-    }
-    if (minchange)
-      return VectorTools::max(path);
-
-    double nbdif = 0;
-    for (size_t k = 0; k < 6; k++)
-    {
-      nbdif += path[k] * weight[k];
-    }
-
-    return nbdif / VectorTools::sum(weight);
-  }
-  }
-  // This line is never reached but sends a warning if not there:
-  return 0.;
-}
-
-/******************************************************************************/
-
-double CodonSiteTools::piSynonymous(const Site& site, const GeneticCode& gCode, bool minchange)
-throw (AlphabetException, AlphabetMismatchException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::piSynonymous: alphabet is not CodonAlphabet", site.getAlphabet());
-  if (!site.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::piSynonymous: site and genetic code have not the same codon alphabet.", site.getAlphabet(), gCode.getSourceAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::piSynonymous: Incorrect specified site", &site);
-
-  // General polymorphism checking
-  if (SiteTools::isConstant(site))
-    return 0;
-  // Computation
-  map<int, double> freq;
-  SiteTools::getFrequencies(site, freq);
-  double pi = 0;
-  for (map<int, double>::iterator it1 = freq.begin(); it1 != freq.end(); it1++)
-  {
-    for (map<int, double>::iterator it2 = freq.begin(); it2 != freq.end(); it2++)
-    {
-      pi += (it1->second) * (it2->second) * (numberOfSynonymousDifferences(it1->first, it2->first, gCode, minchange));
-    }
-  }
-  size_t n = site.size();
-  return pi * static_cast<double>(n / (n - 1));
-}
-
-/******************************************************************************/
-
-double CodonSiteTools::piNonSynonymous(const Site& site, const GeneticCode& gCode, bool minchange)
-throw (AlphabetException, AlphabetMismatchException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::piNonSynonymous: alphabet is not CodonAlphabet", site.getAlphabet());
-  if (!site.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::piNonSynonymous: site and genetic code have not the same codon alphabet.", site.getAlphabet(), gCode.getSourceAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::piSynonymous: Incorrect specified site", &site);
-
-  // General polymorphism checking
-  if (SiteTools::isConstant(site))
-    return 0;
-  if (isSynonymousPolymorphic(site, gCode))
-    return 0;
-  // Computation
-  map<int, double> freq;
-  SiteTools::getFrequencies(site, freq);
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(site.getAlphabet());
-  double pi = 0;
-  for (map<int, double>::iterator it1 = freq.begin(); it1 != freq.end(); it1++)
-  {
-    for (map<int, double>::iterator it2 = freq.begin(); it2 != freq.end(); it2++)
-    {
-      double nbtot = static_cast<double>(numberOfDifferences(it1->first, it2->first, *ca));
-      double nbsyn = numberOfSynonymousDifferences(it1->first, it2->first, gCode, minchange);
-      pi += (it1->second) * (it2->second) * (nbtot - nbsyn);
-    }
-  }
-  size_t n = site.size();
-  return pi * static_cast<double>(n / (n - 1));
-}
-
-/******************************************************************************/
-
-double CodonSiteTools::numberOfSynonymousPositions(int i, const GeneticCode& gCode, double ratio) throw (Exception)
-{
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(gCode.getSourceAlphabet());
-  if (gCode.isStop(i))
-    return 0;
-  if (ca->isUnresolved(i))
-    return 0;
-  double nbsynpos = 0.0;
-  vector<int> codon = ca->getPositions(i);
-  int acid = gCode.translate(i);
-  for (size_t pos = 0; pos < 3; ++pos)
-  {
-    for (int an = 0; an < 4; ++an)
-    {
-      if (an == codon[pos])
-        continue;
-      vector<int> mutcodon = codon;
-      mutcodon[pos] = an;
-      int intcodon = ca->getCodon(mutcodon[0], mutcodon[1], mutcodon[2]);
-      if (gCode.isStop(intcodon))
-        continue;
-      int altacid = gCode.translate(intcodon);
-      if (altacid == acid)   // if synonymous
-      {
-        if (((codon[pos] == 0 || codon[pos] == 2) && (mutcodon[pos] == 1 || mutcodon[pos] == 3)) ||
-            ((codon[pos] == 1 || codon[pos] == 3) && (mutcodon[pos] == 0 || mutcodon[pos] == 2)))   // if it is a transversion
-        {
-          nbsynpos = nbsynpos + 1 / (ratio + 2);
-        }
-        else   // if transition
-        {
-          nbsynpos = nbsynpos + ratio / (ratio + 2);
-        }
-      }
-    }
-  }
-  return nbsynpos;
-}
-
-/******************************************************************************/
-
-double CodonSiteTools::meanNumberOfSynonymousPositions(const Site& site, const GeneticCode& gCode, double ratio)
-throw (AlphabetException, AlphabetMismatchException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::meanNumberOfSynonymousPositions: alphabet is not CodonAlphabet", site.getAlphabet());
-  if (!site.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::meanNumberOfSynonymousPositions: site and genetic code have not the same codon alphabet.", site.getAlphabet(), gCode.getSourceAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::meanNumberOfSynonymousPositions: Incorrect specified site", &site);
-
-  // Computation
-  double NbSyn = 0;
-  map<int, double> freq;
-  SiteTools::getFrequencies(site, freq);
-  for (map<int, double>::iterator it = freq.begin(); it != freq.end(); it++)
-  {
-    NbSyn += (it->second) * numberOfSynonymousPositions(it->first, gCode, ratio);
-  }
-  return NbSyn;
-}
-
-/******************************************************************************/
-
-size_t CodonSiteTools::numberOfSubsitutions(const Site& site, const GeneticCode& gCode, double freqmin)
-throw (AlphabetException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::numberOfSubsitutions: alphabet is not CodonAlphabet", site.getAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::numberOfSubsitutions: Incorrect specified site", &site);
-
-  if (SiteTools::isConstant(site))
-    return 0;
-  Site* newsite;
-  if (freqmin > 1. / static_cast<double>(site.size()))
-    newsite = CodonSiteTools::generateCodonSiteWithoutRareVariant(site, gCode, freqmin);
-  else
-    newsite = new Site(site);
-  // Computation
-  if (SiteTools::hasGap(*newsite))
-    return 0;
-  vector<int> pos1, pos2, pos3;
-
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(site.getAlphabet());
-
-  for (size_t i = 0; i < newsite->size(); i++)
-  {
-    pos1.push_back(ca->getFirstPosition(newsite->getValue(i)));
-    pos2.push_back(ca->getSecondPosition(newsite->getValue(i)));
-    pos3.push_back(ca->getThirdPosition(newsite->getValue(i)));
-  }
-
-  const NucleicAlphabet* na = ca->getNucleicAlphabet();
-
-  Site s1(pos1, na), s2(pos2, na), s3(pos3, na);
-  size_t Scodon = SiteTools::getNumberOfDistinctCharacters(*newsite) - 1;
-  size_t Sbase = SiteTools::getNumberOfDistinctCharacters(s1) + SiteTools::getNumberOfDistinctCharacters(s2) + SiteTools::getNumberOfDistinctCharacters(s3) - 3;
-  delete newsite;
-  if (Scodon >= Sbase)
-    return Scodon;
-  else
-    return Sbase;
-}
-
-/******************************************************************************/
-
-size_t CodonSiteTools::numberOfNonSynonymousSubstitutions(const Site& site, const GeneticCode& gCode, double freqmin)
-throw (AlphabetException, AlphabetMismatchException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(site.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::numberOfNonSynonymousSubstitutions: alphabet is not CodonAlphabet", site.getAlphabet());
-  if (!site.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::numberOfNonSynonymousSubstitutions: site and genetic code have not the same codon alphabet.", site.getAlphabet(), gCode.getSourceAlphabet());
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("CodonSiteTools::numberOfNonSynonymousSubstitutions: Incorrect specified site", &site);
-
-  if (SiteTools::isConstant(site))
-    return 0;
-  Site* newsite;
-  if (freqmin > 1. / static_cast<double>(site.size()))
-    newsite = generateCodonSiteWithoutRareVariant(site, gCode, freqmin);
-  else
-    newsite = new Site(site);
-  if (SiteTools::hasGap(*newsite))
-    return 0;
-  // computation
-  map<int, size_t> count;
-  SiteTools::getCounts(*newsite, count);
-  size_t NaSup = 0;
-  size_t Nminmin = 10;
-
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(site.getAlphabet());
-
-  for (map<int, size_t>::iterator it1 = count.begin(); it1 != count.end(); it1++)
-  {
-    size_t Nmin = 10;
-    for (map<int, size_t>::iterator it2 = count.begin(); it2 != count.end(); it2++)
-    {
-      size_t Ntot = numberOfDifferences(it1->first, it2->first, *ca);
-      size_t Ns = (size_t)numberOfSynonymousDifferences(it1->first, it2->first, gCode, true);
-      if (Nmin > Ntot - Ns && it1->first != it2->first)
-        Nmin = Ntot - Ns;
-    }
-    NaSup += Nmin;
-    if (Nmin < Nminmin)
-      Nminmin = Nmin;
-  }
-  delete newsite;
-  return NaSup - Nminmin;
-}
-
-/******************************************************************************/
-
-vector<size_t> CodonSiteTools::fixedDifferences(const Site& siteIn, const Site& siteOut, int i, int j, const GeneticCode& gCode)
-throw (AlphabetException, AlphabetMismatchException, EmptySiteException)
-{
-  // Alphabet checking
-  if (!AlphabetTools::isCodonAlphabet(siteIn.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::fixedDifferences: alphabet is not CodonAlphabet (siteIn)", siteIn.getAlphabet());
-  if (!AlphabetTools::isCodonAlphabet(siteOut.getAlphabet()))
-    throw AlphabetException("CodonSiteTools::fixedDifferences: alphabet is not CodonAlphabet (siteOut)", siteOut.getAlphabet());
-  if (!siteIn.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::fixedDifferences: siteIn and genetic code have not the same codon alphabet.", siteIn.getAlphabet(), gCode.getSourceAlphabet());
-  if (!siteOut.getAlphabet()->equals(*gCode.getSourceAlphabet()))
-    throw AlphabetMismatchException("CodonSiteTools::fixedDifferences: siteOut and genetic code have not the same codon alphabet.", siteOut.getAlphabet(), gCode.getSourceAlphabet());
-  // Empty site checking
-  if (siteIn.size() == 0)
-    throw EmptySiteException("CodonSiteTools::getFixedDifferences Incorrect specified site", &siteIn);
-  if (siteOut.size() == 0)
-    throw EmptySiteException("CodonSiteTools::getFixedDifferences Incorrect specified site", &siteOut);
-
-  const CodonAlphabet* ca = dynamic_cast<const CodonAlphabet*>(gCode.getSourceAlphabet());
-
-  size_t Ntot = numberOfDifferences(i, j, *ca);
-  size_t Ns = (size_t) numberOfSynonymousDifferences(i, j, gCode, true);
-  size_t Na = Ntot - Ns;
-  size_t Nfix = Ntot;
-  vector<int> pos1in, pos2in, pos3in, pos1out, pos2out, pos3out;
-
-  for (size_t k = 0; k < siteIn.size(); k++)
-  {
-    pos1in.push_back(ca->getFirstPosition(siteIn[k]));
-    pos2in.push_back(ca->getSecondPosition(siteIn[k]));
-    pos3in.push_back(ca->getThirdPosition(siteIn[k]));
-    pos1out.push_back(ca->getFirstPosition(siteOut[k]));
-    pos2out.push_back(ca->getSecondPosition(siteOut[k]));
-    pos3out.push_back(ca->getThirdPosition(siteOut[k]));
-  }
-  const NucleicAlphabet* na = ca->getNucleicAlphabet();
-
-  Site s1in(pos1in, na), s2in(pos2in, na), s3in(pos3in, na);
-  Site s1out(pos1out, na), s2out(pos2out, na), s3out(pos3out, na);
-  bool test1 = false;
-  bool test2 = false;
-  bool test3 = false;
-  if ( (!SiteTools::isConstant(s1in) || !SiteTools::isConstant(s1out)) && ca->getFirstPosition(i) != ca->getFirstPosition(j) )
-  {
-    test1 = true;
-    Nfix--;
-  }
-  if ( (!SiteTools::isConstant(s2in) || !SiteTools::isConstant(s2out)) && ca->getSecondPosition(i) != ca->getSecondPosition(j) )
-  {
-    test2 = true;
-    Nfix--;
-  }
-  if ( (!SiteTools::isConstant(s3in) || !SiteTools::isConstant(s3out)) && ca->getThirdPosition(i) != ca->getThirdPosition(j) )
-  {
-    test3 = true;
-    Nfix--;
-  }
-  // Suppression of differences when not fixed
-  vector<size_t> v(2);
-  if (Nfix == 0)
-  {
-    v[0] = 0;
-    v[1] = 0;
-    return v;
-  }
-  if (Nfix < Ntot)
-  {
-    if (Na == 0)
-      Ns = Nfix;
-    if (Ns == 0)
-      Na = Nfix;
-    else
-    {
-      if (Ntot == 3)
-      {
-        if (Nfix == 1)
-        {
-          if (test1 && test2)
-          {
-            Na = 0; Ns = 1;
-          }
-          if (test1 && test3)
-          {
-            Na = 1; Ns = 0;
-          }
-          if (test2 && test3)
-          {
-            Na--; Ns--;
-          }
-        }
-      }
-      if (Nfix == 2)
-      {
-        if (test1)
-        {
-          Na = 1; Ns = 1;
-        }
-        if (test2)
-          Na--;
-        if (test3)
-          Ns--;
-      }
-    }
-    if (Ntot == 2)
-    {
-      if (test1)
-      {
-        if (ca->getSecondPosition(i) == ca->getSecondPosition(j))
-          Na--;
-        else
-          Ns--;
-      }
-      if (test2)
-        Na--;
-      if (test3)
-        Ns--;
-    }
-  }
-  v[0] = Ns;
-  v[1] = Na;
-  return v;
-}
-
-/******************************************************************************/
-
-bool CodonSiteTools::isFourFoldDegenerated(const Site& site, const GeneticCode& gCode)
-{
-  if (!SiteTools::isConstant(site, true))
-  {
-    /** If non-synonymous mutation **/
-    if (!(CodonSiteTools::isSynonymousPolymorphic(site, gCode)))
-      return false;
-
-    for (size_t i = 0; i < site.size(); i++)
-    {
-      if (!(gCode.isFourFoldDegenerated(site.getValue(i))))
-      {
-        return false;
-      }
-    }
-  }
-  else
-  {
-    for (size_t i = 0; i < site.size(); i++)
-    {
-      if (!(gCode.isFourFoldDegenerated(site.getValue(i))))
-      {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/CodonSiteTools.h b/src/Bpp/Seq/CodonSiteTools.h
deleted file mode 100644
index 51d0857..0000000
--- a/src/Bpp/Seq/CodonSiteTools.h
+++ /dev/null
@@ -1,333 +0,0 @@
-//
-// File CodonSiteTools.h
-// Author : Sylvain Glémin
-// Last modification : November 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use,
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info".
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability.
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or
-data to be ensured and,  more generally, to use and operate it in the
-same conditions as regards security.
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _CODONSITETOOLS_H_
-#define _CODONSITETOOLS_H_
-
-#include "SymbolListTools.h"
-#include "Site.h"
-#include "Alphabet/CodonAlphabet.h"
-#include "GeneticCode/GeneticCode.h"
-
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <map>
-
-namespace bpp
-{
-
-/**
- * @brief Utilitary functions for codon sites.
- */
-
-class CodonSiteTools:
-  public SymbolListTools
-{
-	public:
-		CodonSiteTools() {}
-		virtual ~CodonSiteTools() {}
-
-	public:
-
-		/**
-		 * @brief Method to know if a codon site contains gap(s) or stop codons.
-		 *
-		 * @param site a Site
-     * @param gCode The genetic code according to which stop codons are specified.
-		 * @throw AlphabetException If the alphabet associated to the site is not a codon alphabet.
-		 */
-		static bool hasGapOrStop(const Site& site, const GeneticCode& gCode) throw (AlphabetException);
-
-		/**
-		 * @brief Method to know if a codon site contains stop codon or not
-		 *
-		 * @param site a Site
-     * @param gCode The genetic code according to which stop codons are specified.
-		 * @throw AlphabetException If the alphabet associated to the site is not a codon alphabet.
-		 */
-		static bool hasStop(const Site& site, const GeneticCode& gCode) throw (AlphabetException);
-
-		/**
-		 * @brief Method to know if a polymorphic codon site is polymorphic at only one site
-		 *
-		 * @param site a Site
-		 * @throw AlphabetException  If the alphabet associated to the site is not a codon alphabet.
-		 * @throw EmptySiteException If the site has size 0.
-		 */
-		static bool isMonoSitePolymorphic(const Site& site) throw (AlphabetException, EmptySiteException);
-
-		/**
-		 * @brief Method to know if polymorphism at a codon site is synonymous
-		 *
-		 * @param site a Site
-		 * @param gCode a GeneticCode
-		 * @throw AlphabetException          If the alphabet associated to the site is not a codon alphabet.
-		 * @throw AlphabetMismatchException  If the codon alphabet of the site do not match the codon alphabet of the genetic code.
-		 * @throw EmptySiteException         If the site has size 0.
-		 */
-    static bool isSynonymousPolymorphic(const Site& site, const GeneticCode& gCode)
-			  throw (AlphabetException, AlphabetMismatchException, EmptySiteException);
-
-		/**
-		 * @brief generate a codon site without rare variants
-		 *
-		 * Rare variants are replaced by the most frequent allele.
-		 * This method is used to exclude rare variants in some analyses as in McDonald-Kreitman Test
-		 * (McDonald & Kreitman, 1991, Nature 351 pp652-654).
-		 * For an application, see for example (Fay et al. 2001, Genetics 158 pp 1227-1234).
-		 *
-		 * @param site a Site
-     * @param gCode The genetic code according to which stop codons are specified.
-		 * @param freqmin a double, allele in frequency stricly lower than freqmin are replaced
-		 * @throw AlphabetException  If the alphabet associated to the site is not a codon alphabet.
-		 * @throw EmptySiteException If the site has size 0.
-		 *
-		 */
-	  static Site* generateCodonSiteWithoutRareVariant(const Site& site, const GeneticCode& gCode, double freqmin)
-			  throw(AlphabetException, EmptySiteException);
-
-
-		/**
-		 * @brief Compute the number of differences between two codons
-		 *
-		 * @param i a int
-		 * @param j a int
-		 * @param ca a CodonAlphabet
-		 */
-	  static size_t numberOfDifferences(int i, int j, const CodonAlphabet& ca);
-
-		/**
-		 * @brief Compute the number of synonymous differences between two codons
-		 *
-		 * For complex codon:
-		 * If minchange = false (default option) the different paths are equally weighted.
-		 * If minchange = true the path with the minimum number of non-synonymous change is chosen.
-		 * Paths included stop codons are excluded.
-		 * @param i a int
-		 * @param j a int
-		 * @param gCode a GeneticCode
-		 * @param minchange a boolean set by default to false
-		 */
-   	static double numberOfSynonymousDifferences(int i, int j, const GeneticCode& gCode, bool minchange=false);
-
-		/**
-		 * @brief Compute the synonymous pi per codon site
-		 *
-		 * The following formula is used:
-		 * @f[
-		 * pi = frac{n}{n-1}\sum_{i,j}x_{i}x_{j}P_{ij}
-		 * @f]
-		 * where n is the number of sequence, \f$x_i\f$ and \f$x_j\f$ the frequencies of each codon type occuring at the site
-		 * \f$P_{i,j}\f$ the number of synonymous difference between these codons.
-		 * Be careful: here, pi is not normalized by the number of synonymous sites.
-		 *
-		 * If minchange = false (default option) the different paths are equally weighted.
-		 * If minchange = true the path with the minimum number of non-synonymous change is chosen.
-		 *
-		 * @param site a Site
-		 * @param gCode a GeneticCode
-		 * @param minchange a boolean set by default to false
-		 * @throw AlphabetException          If the alphabet associated to the site is not a codon alphabet.
-		 * @throw AlphabetMismatchException  If the codon alphabet of the site do not match the codon alphabet of the genetic code.
-		 * @throw EmptySiteException         If the site has size 0.
-		 */
-		static double piSynonymous(const Site& site, const GeneticCode& gCode, bool minchange = false)
-			  throw (AlphabetException, AlphabetMismatchException, EmptySiteException);
-
-		/**
-		 * @brief Compute the non-synonymous pi per codon site
-		 *
-		 * The following formula is used:
-		 * @f[
-		 * pi = frac{n}{n-1}\sum_{i,j}x_{i}x_{j}P_{ij}
-		 * @f]
-		 * where n is the number of sequence, \f$x_i\f$ and \f$x_j\f$ the frequencies of each codon type occuring at the site
-		 * \f$P_{i,j}\f$ the number of nonsynonymous difference between these codons.
-		 * Be careful: here, pi is not normalized by the number of non-synonymous sites.
-		 * If minchange = false (default option) the different paths are equally weighted.
-		 * If minchange = true the path with the minimum number of non-synonymous change is chosen.
-		 *
-		 * @param site a Site
-		 * @param gCode a GeneticCode
-		 * @param minchange a boolean set by default to false
-		 * @throw AlphabetException         If the alphabet associated to the site is not a codon alphabet.
-		 * @throw AlphabetMismatchException If the codon alphabet of the site do not match the codon alphabet of the genetic code.
-		 * @throw EmptySiteException        If the site has size 0.
-		 */
-		static double piNonSynonymous(const Site& site, const GeneticCode& gCode, bool minchange = false)
-			  throw (AlphabetException, AlphabetMismatchException, EmptySiteException);
-
-
-		/**
-		 * @brief Return the number of synonymous positions of a codon
-		 *
-		 * A site is consider as x% synonymous if x% of the possible mutations are synonymous
-		 * Transition/transversion ratio can be taken into account (use the variable ratio)
-		 *
-     * Unresolved codons and stop codon will return a value of 0.
-     *
-		 * @param i a int
-		 * @param gCode a GeneticCode
-		 * @param ratio a double set by default to 1
-		 */
-		static double numberOfSynonymousPositions(int i, const GeneticCode& gCode,  double ratio = 1.0) throw (Exception);
-
-		/**
-		 * @brief Return the mean number of synonymous positions per codon site
-		 *
-		 * A site is consider as x% synonymous if x% of the possible mutations are synonymous
-		 * Transition/transversion ratio can be taken into account (use the variable ratio)
-		 * The mean is computed over the VectorSite.
-		 *
-     * Unresolved and stop codons are counted as 0.
-     *
-		 * @param site a Site
-		 * @param gCode a GeneticCode
-		 * @param ratio a double 			Set by default to 1
-		 * @throw AlphabetException         If the alphabet associated to the site is not a codon alphabet.
-		 * @throw AlphabetMismatchException If the codon alphabet of the site do not match the codon alphabet of the genetic code.
-		 * @throw EmptySiteException        If the site has size 0.
-		 */
-		static double meanNumberOfSynonymousPositions(const Site& site, const GeneticCode& gCode, double ratio = 1)
-			  throw (AlphabetException, AlphabetMismatchException, EmptySiteException);
-
-		/**
-		 * @brief Return the number of subsitutions per codon site
-		 *
-		 * No recombination is assumed, that is in complex codon homoplasy is assumed.
-		 * Example:
-     * @code
-		 * ATT
-		 * ATT
-		 * ATT
-		 * ATC
-		 * ATC
-		 * AGT
-		 * AGT
-		 * AGC
-     * @endcode
-		 * Here, 3 substitutions are counted. Assuming that the last codon (AGC) is a recombinant between ATC and AGT
-		 * would have lead to counting only 2 subsitutions.
-		 *
-		 * Rare variants (<= freqmin) can be excluded.
-		 *
-		 * @param site a Site
-		 * @param gCode a GeneticCode
-		 * @param freqmin a double 	 To exclude snp in frequency strictly lower than freqmin (by default freqmin = 0)
-		 * @throw AlphabetException  If the alphabet associated to the site is not a codon alphabet.
-		 * @throw EmptySiteException If the site has size 0.
-		 */
-		static size_t numberOfSubsitutions(const Site& site, const GeneticCode& gCode, double freqmin = 0.)
-			  throw(AlphabetException, EmptySiteException);
-
-		/**
-		 * @brief Return the number of Non Synonymous subsitutions per codon site.
-		 *
-		 * It is assumed that the path linking amino acids only involved one substitution by step.
-		 *
-		 * Rare variants (<= freqmin) can be excluded.
-		 * In case of complex codon, the path that gives the minimum number of non-synonymous changes
-		 * is chosen. The argument minchange=true is sent to numberOfSynonymousDifferences used in this method.
-		 * Otherwise, a non-integer number could be return.
-		 *
-		 * @param site a Site
-		 * @param gCode a GeneticCode
-		 * @param freqmin a double 			To exclude snp in frequency strictly lower than freqmin (by default freqmin = 0).
-		 * @throw AlphabetException         If the alphabet associated to the site is not a codon alphabet.
-		 * @throw AlphabetMismatchException If the codon alphabet of the site do not match the codon alphabet of the genetic code.
-		 * @throw EmptySiteException        If the site has size 0.
-		 */
-		static size_t numberOfNonSynonymousSubstitutions(const Site& site, const GeneticCode& gCode, double freqmin = 0.)
-			  throw (AlphabetException, AlphabetMismatchException, EmptySiteException);
-
-		/**
-		 * @brief Return a vector with the number of fixed synonymous and non-synonymous differences per codon site
-		 *
-		 * Compute the number of synonymous and non-synonymous differences between
-		 * the concensus codon of SiteIn (i) and SiteOut (j), which are fixed within each alignement.
-		 * Example:
-     * @code
-		 * SiteIn
-		 *	ATT
-		 *	ATT
-		 *	ATC
-     * @endcode
-     * @code
-		 * SiteOut
-		 *	CTA
-		 *	CTA
-		 *	CTA
-     * @endcode
-		 * Here, the first position is non-synonymous different and fixed,
-		 * the third position is synonymous different but not fixed (polymorphic in SiteIn).
-		 * The return vector is thus [0,1].
-		 * In case of complex codon, the path that gives the minimum number of non-synonymous changes
-		 * is chosen. The argument minchange=true is sent to numberOfSynonymousDifferences used in this method.
-		 * Otherwise, a non-integer number could be return.
-		 *
-		 * Rare variants (<= freqmin) can be excluded.
-		 *
-		 * @param siteIn a Site
-		 * @param siteOut a Site
-		 * @param i an integer
-		 * @param j an integer
-		 * @param gCode a GeneticCode
-		 * @throw AlphabetException         If the alphabet associated to one of the sites is not a codon alphabet.
-		 * @throw AlphabetMismatchException If the codon alphabet each the site do not match the codon alphabet of the genetic code.
-		 * @throw EmptySiteException        If one of the sites has size 0.
-		 */
-		static std::vector<size_t> fixedDifferences(const Site& siteIn, const Site& siteOut, int i, int j, const GeneticCode& gCode)
-			  throw (AlphabetException, AlphabetMismatchException, EmptySiteException);
-    
-    /**
-     * @return True if all sequences have a fourfold degenerated codon in the site
-     * (that is, if a mutation in the fourth position does not change the aminoacid).
-     * @author Benoit Nabholz, Annabelle Haudry
-     * @param site The site to analyze.
-     * @param gCode The genetic code to use.
-     */
-    static bool isFourFoldDegenerated(const Site& site, const GeneticCode& gCode);
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_CONDONSITETOOLS_H_
-
diff --git a/src/Bpp/Seq/Container/AbstractSequenceContainer.h b/src/Bpp/Seq/Container/AbstractSequenceContainer.h
deleted file mode 100644
index d0718d9..0000000
--- a/src/Bpp/Seq/Container/AbstractSequenceContainer.h
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-// File AbstractSequenceContainer.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ABSTRACTSEQUENCECONTAINER_H_
-#define _ABSTRACTSEQUENCECONTAINER_H_
-
-#include "../Alphabet/Alphabet.h"
-#include "../Sequence.h"
-#include "SequenceContainer.h"
-#include "OrderedSequenceContainer.h"
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-/**
- * @brief Partial implementation of the OrderedSequenceContainer interface.
- *
- * This abstract class provides an alphabet and comments, with associated methods.
- */
-class AbstractSequenceContainer:
-  public virtual OrderedSequenceContainer
-{
-	private:
-
-		/**
-		 * @brief The container's alphabet.
-		 */
-		const Alphabet* alphabet_;
-
-    /**
-     * @brief The container's comments.
-     */
-		Comments comments_;
-
-	public:
-
-		/**
-		 * @brief This constructor initialize the alphabet pointer.
-		 *
-		 * This constructor is to be called by constructors of derived classes.
-		 *
-		 * @param alpha The alphabet to be associated to this container.
-		 */
-		AbstractSequenceContainer(const Alphabet* alpha):
-      alphabet_(alpha), comments_() {}
-		
-    AbstractSequenceContainer(const AbstractSequenceContainer& sc):
-      alphabet_(sc.alphabet_), comments_(sc.comments_) {}
-    
-    AbstractSequenceContainer& operator=(const AbstractSequenceContainer& sc)
-    {
-      alphabet_ = sc.alphabet_;
-      comments_ = sc.comments_;
-      return *this;
-    }
-
-    /**
-     * @brief Copy constructor from any SequenceContainer object.
-     *
-     * @param sc Another sequence container.
-     */
-    AbstractSequenceContainer(const SequenceContainer& sc):
-      alphabet_(sc.getAlphabet()), comments_(sc.getGeneralComments()) {}
-
-    /**
-     * @brief Assignation operator from any SequenceContainer object.
-     *
-     * @param sc Another sequence container.
-     */
-    AbstractSequenceContainer& operator=(const SequenceContainer& sc)
-    {
-      alphabet_ = sc.getAlphabet();
-      comments_ = sc.getGeneralComments();
-      return *this;
-    }
-
-		virtual ~AbstractSequenceContainer() {}
-		
-	public:
-	
-		/**
-		 * @name From the SequenceContainer interface
-		 *
-		 * @{
-		 */
-		const Alphabet* getAlphabet() const { return alphabet_; }
-		const std::vector<int>& getContent(const std::string& name) const throw (SequenceNotFoundException)
-    {
-	    return getSequence(name).getContent();
-    }
-
-    std::string toString(const std::string& name) const throw (SequenceNotFoundException)
-    {
-      return getSequence(name).toString();
-    }
-
-		const Comments& getComments(const std::string& name) const throw (SequenceNotFoundException)
-    {
-      return getSequence(name).getComments();
-    }
-
-		void setComments(const std::string& name, const Comments& comments) throw (SequenceNotFoundException);
-		const Comments& getGeneralComments() const
-    {
-      return comments_;
-    }
-
-		void setGeneralComments(const Comments& comments)
-    {
-      comments_ = comments;
-    }
-
-		void deleteGeneralComments()
-    {
-      comments_.clear();
-    }
-
-		/** @} */
-
-		/**
-		 * @name From the OrderedSequenceContainer interface
-		 *
-		 * @{
-		 */
-		virtual const std::string& getName(size_t sequenceIndex) const throw (IndexOutOfBoundsException)
-    {
-	    return getSequence(sequenceIndex).getName();
-    }
-    
-		virtual const std::vector<int>& getContent(size_t sequenceIndex) const throw (IndexOutOfBoundsException)
-    {
-	    return getSequence(sequenceIndex).getContent();
-    }
-		
-    virtual std::string toString(size_t sequenceIndex) const throw (IndexOutOfBoundsException)
-    {
-      return getSequence(sequenceIndex).toString();
-    }
-
-		virtual const Comments& getComments(size_t sequenceIndex) const throw (IndexOutOfBoundsException)
-    {
-      return getSequence(sequenceIndex).getComments();
-    }
-
-		virtual void setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException) = 0;
-		/** @} */
-
-};
-
-} //end of namespace bpp.
-
-#endif // _ABSTRACTSEQUENCECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/AlignedSequenceContainer.cpp b/src/Bpp/Seq/Container/AlignedSequenceContainer.cpp
deleted file mode 100644
index 64b4275..0000000
--- a/src/Bpp/Seq/Container/AlignedSequenceContainer.cpp
+++ /dev/null
@@ -1,523 +0,0 @@
-//
-// File: AlignedSequenceContainer.cpp
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Friday August 22 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "AlignedSequenceContainer.h"
-
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-/***************************************************************************/
-
-AlignedSequenceContainer::AlignedSequenceContainer(const OrderedSequenceContainer& osc) throw (SequenceNotAlignedException) :
-  VectorSequenceContainer(osc.getAlphabet()),
-  // We can't call the copy constructor because we want to use the overloaded addSequence method !!!
-  positions_(),
-  length_(),
-  sites_()
-{
-  // Initializing
-  for (unsigned int i = 0; i < osc.getNumberOfSequences(); i++)
-  {
-    addSequence(osc.getSequence(i), true);
-  }
-
-  if (osc.getNumberOfSequences() > 0)
-    length_ = getSequence(0).size();  // the overloaded
-  else
-    length_ = 0;
-
-  reindexSites();
-  sites_.resize(length_);
-  setGeneralComments(osc.getGeneralComments());
-}
-
-/***************************************************************************/
-
-AlignedSequenceContainer& AlignedSequenceContainer::operator=(const AlignedSequenceContainer& asc)
-{
-  VectorSequenceContainer::operator=(asc);
-
-  // Initializing
-  length_    = asc.getNumberOfSites();
-  positions_ = asc.getSitePositions();
-  sites_.resize(length_);
-
-  return *this;
-}
-
-/***************************************************************************/
-
-AlignedSequenceContainer& AlignedSequenceContainer::operator=(const SiteContainer& sc)
-{
-  VectorSequenceContainer::operator=(sc);
-
-  // Initializing
-  length_    = sc.getNumberOfSites();
-  positions_ = sc.getSitePositions();
-  sites_.resize(length_);
-
-  return *this;
-}
-
-/***************************************************************************/
-
-AlignedSequenceContainer& AlignedSequenceContainer::operator=(const OrderedSequenceContainer& osc) throw (SequenceNotAlignedException)
-{
-  VectorSequenceContainer::operator=(osc);
-
-  // Initializing
-  length_ = 0;
-  reindexSites();
-  sites_.resize(length_);
-
-  return *this;
-}
-
-/** Class destructor: *********************************************************/
-
-AlignedSequenceContainer::~AlignedSequenceContainer()
-{
-  // delete all sites:
-  for (unsigned int i = 0; i < sites_.size(); i++)
-  {
-    if (sites_[i])
-      delete sites_[i];
-  }
-}
-
-/***************************************************************************/
-
-const Site& AlignedSequenceContainer::getSite(size_t i) const throw (IndexOutOfBoundsException)
-{
-  if (i >= length_)
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::getSite", i, 0, getNumberOfSites() - 1);
-
-  // Main loop : for all sequences
-  size_t n = getNumberOfSequences();
-  std::vector<int> site(n);
-  for (size_t j = 0; j < n; j++)
-  {
-    site[j] = getSequence(j)[i];
-  }
-
-  if (sites_[i])
-    delete sites_[i];
-  sites_[i] = new Site(site, getAlphabet(), positions_[i]);
-  return *sites_[i];
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::setSite(size_t pos, const Site& site, bool checkPositions) throw (Exception)
-{
-  // New site's alphabet and site container's alphabet matching verification
-  if (pos >= getNumberOfSites())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::setSite", pos, 0, getNumberOfSites() - 1);
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("AlignedSequenceContainer::setSite", getAlphabet(), site.getAlphabet());
-
-  std::vector<int> s = site.getContent();
-
-  // Check size:
-  if (s.size() != getNumberOfSequences())
-    throw SiteException("AlignedSequenceContainer::setSite, site does not have the appropriate length", &site);
-
-  // Check position:
-  int position = site.getPosition();
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < positions_.size(); i++)
-    {
-      if (positions_[i] == position)
-        throw SiteException("AlignedSequenceContainer::setSite: Site position already exists in container", &site);
-    }
-  }
-
-  // For all sequences
-  for (size_t j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).setElement(pos, s[j]);
-  }
-  positions_[pos] = site.getPosition();
-}
-
-/******************************************************************************/
-
-Site* AlignedSequenceContainer::removeSite(size_t pos) throw (IndexOutOfBoundsException)
-{
-  if (pos >= getNumberOfSites())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::removeSite", pos, 0, getNumberOfSites() - 1);
-
-  // Get old site
-  getSite(pos); // Creates the site!
-  Site* old = sites_[pos];
-
-  // For all sequences
-  for (size_t j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).deleteElement(pos);
-  }
-
-  // Delete site's position
-  positions_.erase(positions_.begin() + static_cast<ptrdiff_t>(pos));
-  length_--;
-
-  // Actualizes the 'sites' vector:
-  if (sites_[pos])
-    delete sites_[pos];
-  sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(pos));
-
-  // Send result
-  return old;
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::deleteSite(size_t pos) throw (IndexOutOfBoundsException)
-{
-  if (pos >= getNumberOfSites())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::deleteSite", pos, 0, getNumberOfSites() - 1);
-
-  // For all sequences
-  for (size_t j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).deleteElement(pos);
-  }
-
-  // Delete site's position
-  positions_.erase(positions_.begin() + static_cast<ptrdiff_t>(pos));
-  length_--;
-
-  // Actualizes the 'sites' vector:
-  if (sites_[pos])
-    delete sites_[pos];
-  sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(pos));
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException, Exception)
-{
-  if (siteIndex + length > getNumberOfSites())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::deleteSites", siteIndex + length, 0, getNumberOfSites() - 1);
-
-  // For all sequences
-  for (size_t j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).deleteElements(siteIndex, length);
-  }
-
-  // Delete site's siteIndexition
-  positions_.erase(positions_.begin() + static_cast<ptrdiff_t>(siteIndex),
-      positions_.begin() + static_cast<ptrdiff_t>(siteIndex + length));
-  length_ -= length;
-
-  // Actualizes the 'sites' vector:
-  for (size_t i = siteIndex; i < siteIndex + length; ++i)
-  {
-    if (sites_[i])
-      delete sites_[i];
-  }
-  sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(siteIndex),
-      sites_.begin() + static_cast<ptrdiff_t>(siteIndex + length));
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::addSite(const Site& site, bool checkPositions) throw (Exception)
-{
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("AlignedSequenceContainer::addSite");
-
-  // Initializing
-  std::vector<int> s = site.getContent();
-
-  // Check size:
-  if (s.size() != getNumberOfSequences())
-    throw SiteException("AlignedSequenceContainer::addSite, site does not have the appropriate length", &site);
-
-  // Check position:
-
-  int position = site.getPosition();
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (unsigned int i = 0; i < positions_.size(); i++)
-    {
-      if (positions_[i] == position)
-        throw SiteException("AlignedSequenceContainer::addSite: Site position already exists in container", &site);
-    }
-  }
-
-  // For all sequences
-  for (unsigned int j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).addElement(s[j]);
-  }
-
-  length_++;
-  positions_.push_back(position);
-
-  // Actualizes the 'sites' vector:
-  sites_.push_back(0);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::addSite(const Site& site, int position, bool checkPositions) throw (Exception)
-{
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("AlignedSequenceContainer::addSite");
-
-  // Initializing
-  std::vector<int> s = site.getContent();
-
-  // Check size:
-  if (s.size() != getNumberOfSequences())
-    throw SiteException("AlignedSequenceContainer::addSite, site does not have the appropriate length", &site);
-
-  // Check position:
-
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (unsigned int i = 0; i < positions_.size(); i++)
-    {
-      if (positions_[i] == position)
-        throw SiteException("AlignedSequenceContainer::addSite: Site position already exists in container", &site);
-    }
-  }
-
-  // For all sequences
-  for (unsigned int j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).addElement(s[j]);
-  }
-
-  length_++;
-  positions_.push_back(position);
-
-  // Actualizes the 'sites' vector:
-  sites_.push_back(0);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::addSite(const Site& site, size_t siteIndex, bool checkPositions) throw (Exception)
-{
-  if (siteIndex >= getNumberOfSites())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::addSite", siteIndex, 0, getNumberOfSites() - 1);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("AlignedSequenceContainer::addSite", getAlphabet(), site.getAlphabet());
-
-  std::vector<int> s = site.getContent();
-
-  // Check size:
-  if (s.size() != getNumberOfSequences())
-    throw SiteException("AlignedSequenceContainer::addSite, site does not have the appropriate length", &site);
-
-  // Check position:
-  int position = site.getPosition();
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < positions_.size(); i++)
-    {
-      if (positions_[i] == position)
-        throw SiteException("AlignedSequenceContainer::addSite: Site position already exists in container", &site);
-    }
-  }
-
-  // For all sequences
-  for (size_t j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).addElement(siteIndex, site[j]);
-  }
-
-  length_++;
-  positions_.insert(positions_.begin() + static_cast<ptrdiff_t>(siteIndex), position);
-
-  // Actualizes the 'sites' vector:
-  sites_.insert(sites_.begin() + static_cast<ptrdiff_t>(siteIndex), 0);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::addSite(const Site& site, size_t siteIndex, int position, bool checkPositions) throw (Exception)
-{
-  if (siteIndex >= getNumberOfSites())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::addSite", siteIndex, 0, getNumberOfSites() - 1);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("AlignedSequenceContainer::addSite", getAlphabet(), site.getAlphabet());
-
-  std::vector<int> s = site.getContent();
-
-  // Check size:
-  if (s.size() != getNumberOfSequences())
-    throw SiteException("AlignedSequenceContainer::addSite, site does not have the appropriate length", &site);
-
-  // Check position:
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < positions_.size(); i++)
-    {
-      if (positions_[i] == position)
-        throw SiteException("AlignedSequenceContainer::addSite: Site position already exists in container", &site);
-    }
-  }
-
-  // For all sequences
-  for (size_t j = 0; j < getNumberOfSequences(); j++)
-  {
-    getSequence_(j).addElement(siteIndex, site[j]);
-  }
-
-  length_++;
-  positions_.insert(positions_.begin() + static_cast<ptrdiff_t>(siteIndex), position);
-
-  // Actualizes the 'sites' vector:
-  sites_.insert(sites_.begin() + static_cast<ptrdiff_t>(siteIndex), 0);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::reindexSites()
-{
-  positions_.resize(length_);
-  for (size_t i = 0; i < length_; i++)
-  {
-    positions_[i] = static_cast<int>(i + 1); // start with 1.
-  }
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::setSequence(size_t i, const Sequence& sequence, bool checkName) throw (Exception)
-{
-  if (i >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::setSequence", i, 0, getNumberOfSequences() - 1);
-  // if container has only one sequence
-  if (getNumberOfSequences() == 1)
-    length_ = sequence.size();
-  if (checkSize_(sequence))
-    VectorSequenceContainer::setSequence(i, sequence, checkName);
-  else
-    throw SequenceNotAlignedException("AlignedSequenceContainer::setSequence", &sequence);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::setSequence(const string& name, const Sequence& sequence, bool checkName) throw (Exception)
-{
-  // if container has only one sequence
-  if (getNumberOfSequences() == 1)
-    length_ = sequence.size();
-  if (checkSize_(sequence))
-    VectorSequenceContainer::setSequence(name, sequence, checkName);
-  else
-    throw SequenceNotAlignedException("AlignedSequenceContainer::setSequence", &sequence);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::addSequence(const Sequence& sequence, bool checkName) throw (Exception)
-{
-  // if container has only one sequence
-  if (length_ == 0)
-  {
-    length_ = sequence.size();
-    sites_.resize(length_);
-    reindexSites();
-  }
-  if (checkSize_(sequence))
-    VectorSequenceContainer::addSequence(sequence, checkName);
-  else
-    throw SequenceNotAlignedException("AlignedSequenceContainer::addSequence", &sequence);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::addSequence(const Sequence& sequence, size_t i, bool checkName) throw (Exception)
-{
-  if (i >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("AlignedSequenceContainer::addSequence", i, 0, getNumberOfSequences() - 1);
-  // if container has only one sequence
-  if (length_ == 0)
-    length_ = sequence.size();
-  if (checkSize_(sequence))
-    VectorSequenceContainer::addSequence(sequence, i, checkName);
-  else
-    throw SequenceNotAlignedException("AlignedSequenceContainer::addSequence", &sequence);
-}
-
-/******************************************************************************/
-
-void AlignedSequenceContainer::clear()
-{
-  length_ = 0;
-  VectorSequenceContainer::clear();
-}
-
-/******************************************************************************/
-
-AlignedSequenceContainer* AlignedSequenceContainer::createEmptyContainer() const
-{
-  AlignedSequenceContainer* asc = new AlignedSequenceContainer(getAlphabet());
-  asc->setGeneralComments(getGeneralComments());
-  return asc;
-}
-
-/******************************************************************************/
-
-
diff --git a/src/Bpp/Seq/Container/AlignedSequenceContainer.h b/src/Bpp/Seq/Container/AlignedSequenceContainer.h
deleted file mode 100644
index 10824ba..0000000
--- a/src/Bpp/Seq/Container/AlignedSequenceContainer.h
+++ /dev/null
@@ -1,202 +0,0 @@
-//
-// File AlignedSequenceContainer.h
-// Created by: Guillaume Deuchst
-// //             Julien Dutheil
-// Last modification : Friday August 22 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ALIGNEDSEQUENCECONTAINER_H_
-#define _ALIGNEDSEQUENCECONTAINER_H_
-
-#include "../Site.h"
-#include "SiteContainer.h"
-#include "OrderedSequenceContainer.h"
-#include "VectorSequenceContainer.h"
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <string>
-
-namespace bpp
-{
-
-/**
- * @brief Aligned sequences container.
- *
- * This class inherits from the VectorSequenceContainer and add site access.
- * Sequence addition methods are re-defined to check for sequence lengths.
- * Sequence access is in \f$O(1)\f$, and site access in \f$O(n)\f$, where
- * \f$n\f$ is the number of sequences in the container.
- *
- * See VectorSiteContainer for an alternative implementation.
- * 
- * @see VectorSequenceContainer, Sequence, Site, VectorSiteContainer
- */
-class AlignedSequenceContainer:
-  public virtual VectorSequenceContainer,
-  public virtual SiteContainer
-{
-  private:
-    // Integer std::vector that contains sites's positions
-    std::vector<int> positions_;
-    
-    size_t length_; // Number of sites for verifications before sequence's insertion in sequence container
-  
-    /**
-     * This is used in order to implement the SiteContainer interface.
-     * A SiteContainer is expected to work on Site objects, but this class
-     * -- since it is a VectorSequenceContainer -- has its data sored as
-     * Sequence object. When the SiteContainer method getSite() is invoked
-     * it creates a new Site object and send the address of it.
-     * To avoid memory leaks, this object is put into a std::vector so that it can be
-     * destroyed when the container is destroyed.
-     */
-    mutable std::vector<Site*> sites_;
-    
-  public:
-    /**
-     * @brief Build a new empty container with the specified alphabet.
-     *
-     * @param alpha The alphabet to use.
-     */
-    AlignedSequenceContainer(const Alphabet* alpha):
-      VectorSequenceContainer(alpha),
-      positions_(),
-      length_(0),
-      sites_()
-    {
-      reindexSites();
-    }
-    
-    /**
-     * @brief Copy constructor.
-     *
-     * @param asc The container to copy.
-     */
-    AlignedSequenceContainer(const AlignedSequenceContainer& asc):
-      VectorSequenceContainer(asc),
-      positions_(asc.getSitePositions()),
-      length_(asc.getNumberOfSites()),
-      sites_(asc.getNumberOfSites())
-    {}
-
-    /**
-     * @brief Convert any SiteContainer object into a AlignedSequenceContainer object.
-     *
-     * @param sc The container to copy.
-     */
-    AlignedSequenceContainer(const SiteContainer& sc):
-      VectorSequenceContainer(sc),
-      positions_(sc.getSitePositions()),
-      length_(sc.getNumberOfSites()),
-      sites_(sc.getNumberOfSites())
-    {}
-
-    /**
-     * @brief Try to coerce an OrderedSequenceContainer object into an AlignedSequenceContainer object.
-     *
-     * Sequences in osc will be considered alligned, and have the same number of sites.
-     * 
-     * @param osc The ordered container to coerce.
-     * @throw SequenceNotAlignedException If sequences in osc do not have the same length.
-     */
-    AlignedSequenceContainer(const OrderedSequenceContainer& osc) throw (SequenceNotAlignedException);
-
-    AlignedSequenceContainer& operator=(const AlignedSequenceContainer& asc);
-    AlignedSequenceContainer& operator=(const            SiteContainer&  sc);
-    AlignedSequenceContainer& operator=(const OrderedSequenceContainer& osc) throw (SequenceNotAlignedException);
-
-    virtual ~AlignedSequenceContainer();
-
-  public:
-
-    /**
-     * @name The Clonable interface.
-     *
-     * @{
-     */
-    AlignedSequenceContainer* clone() const { return new AlignedSequenceContainer(*this); }
-    /** @} */
-
-    /**
-     * @name The SiteContainer interface implementation:
-     *
-     * @{
-     */
-    const Site& getSite(size_t siteIndex) const throw (IndexOutOfBoundsException);
-    void        setSite(size_t siteIndex, const Site& site, bool checkPosition = true) throw (Exception);
-    Site *   removeSite(size_t siteIndex) throw (IndexOutOfBoundsException);
-    void     deleteSite(size_t siteIndex) throw (IndexOutOfBoundsException);
-    void    deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException, Exception);
-    void addSite(const Site& site, bool checkPosition = true) throw (Exception);
-    void addSite(const Site& site, int position, bool checkPosition = true) throw (Exception);
-    void addSite(const Site& site, size_t siteIndex, bool checkPosition = true) throw (Exception);
-    void addSite(const Site& site, size_t siteIndex, int position, bool checkPosition = true) throw (Exception);
-    size_t getNumberOfSites() const { return length_; }
-    Vint getSitePositions() const { return positions_; }
-    void reindexSites();
-    void clear();
-    AlignedSequenceContainer* createEmptyContainer() const;
-    /** @} */
-
-    /**
-     * @name Redefinition of VectorSequenceContainer methods, to check for sequence lengths.
-     *
-     * @{
-     */
-    void setSequence(const std::string& name, const Sequence& sequence, bool checkName = true) throw (Exception);
-    void setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName = true) throw (Exception);
-
-    void addSequence(const Sequence& sequence, bool checkName = true) throw (Exception);
-    void addSequence(const Sequence& sequence, size_t sequenceIndex, bool checkName = true) throw (Exception);
-    /** @} */
-    
-  
-  protected:
-    /**
-     * @brief Check sequence's size before insertion in sequence container.
-     * 
-     * @param sequence The sequence to check.
-     * @return True if sequence length = number of sites in container.
-     */
-    bool checkSize_(const Sequence& sequence) { return (sequence.size() == length_); }
-
-};
-
-} //end of namespace bpp.
-
-#endif // _ALIGNEDSEQUENCECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/CompressedVectorSiteContainer.cpp b/src/Bpp/Seq/Container/CompressedVectorSiteContainer.cpp
deleted file mode 100644
index 427ed8c..0000000
--- a/src/Bpp/Seq/Container/CompressedVectorSiteContainer.cpp
+++ /dev/null
@@ -1,597 +0,0 @@
-//
-// File: CompressedCompressedVectorSiteContainer.cpp
-// Created by: Julien Dutheil
-// Created on: Wed Dec  16 12:08 2009
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "CompressedVectorSiteContainer.h"
-#include <Bpp/Text/TextTools.h>
-
-#include <iostream>
-
-using namespace std;
-
-using namespace bpp;
-
-/** Class constructors: *******************************************************/
-
-CompressedVectorSiteContainer::CompressedVectorSiteContainer(
-  const std::vector<const Site*>& vs,
-  const Alphabet* alpha)
-throw (Exception) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  index_(0),
-  names_(0),
-  comments_(0),
-  sequences_(0)
-{
-  if (vs.size() == 0) throw Exception("CompressedVectorSiteContainer::CompressedVectorSiteContainer. Empty site set.");
-  // Seq names and comments:
-  size_t nbSeq = vs[0]->size();
-  names_.resize(nbSeq);
-  comments_.resize(nbSeq);
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    names_[i]    = "Seq_" + TextTools::toString(i);
-    comments_[i] = new Comments();
-  }
-  // Now try to add each site:
-  for (size_t i = 0; i < vs.size(); i++)
-  {
-    addSite(*vs[i]); // This may throw an exception if position argument already exists or is size is not valid.
-  }
-
-  sequences_.resize(nbSeq);
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer::CompressedVectorSiteContainer(size_t size, const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  index_(0),
-  names_(size),
-  comments_(size),
-  sequences_(size)
-{
-  // Seq names and comments:
-  for (size_t i = 0; i < size; i++)
-  {
-    names_[i]    = "Seq_" + TextTools::toString(i);
-    comments_[i] = new Comments();
-  }
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer::CompressedVectorSiteContainer(const std::vector<std::string>& names, const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  index_(0),
-  names_(names.size()),
-  comments_(names.size()),
-  sequences_(names.size())
-{
-  // Seq names and comments:
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    names_[i]    = names[i];
-    comments_[i] = new Comments();
-  }
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer::CompressedVectorSiteContainer(const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  index_(0),
-  names_(0),
-  comments_(0),
-  sequences_(0)
-{}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer::CompressedVectorSiteContainer(const CompressedVectorSiteContainer& vsc) :
-  AbstractSequenceContainer(vsc),
-  sites_(vsc.sites_.size()),
-  index_(vsc.index_),
-  names_(vsc.names_),
-  comments_(vsc.getNumberOfSequences()),
-  sequences_(vsc.getNumberOfSequences())
-{
-  // Now try to add each site:
-  sites_.resize(vsc.sites_.size());
-  for (size_t i = 0; i < vsc.sites_.size(); i++)
-  {
-    sites_[i] = dynamic_cast<Site*>(vsc.sites_[i]->clone());
-  }
-  for (size_t i = 0; i < vsc.getNumberOfSites(); i++)
-  {
-    addSite(vsc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  for (size_t i = 0; i < vsc.getNumberOfSequences(); i++)
-  {
-    comments_[i] = new Comments(vsc.getComments(i));
-  }
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer::CompressedVectorSiteContainer(const SiteContainer& sc) :
-  AbstractSequenceContainer(sc.getAlphabet()),
-  sites_(0),
-  index_(0),
-  names_(sc.getSequencesNames()),
-  comments_(sc.getNumberOfSequences()),
-  sequences_(sc.getNumberOfSequences())
-{
-  // Now try to add each site:
-  for (size_t i = 0; i < sc.getNumberOfSites(); i++)
-  {
-    addSite(sc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  for (size_t i = 0; i < sc.getNumberOfSequences(); i++)
-  {
-    comments_[i] = new Comments(sc.getComments(i));
-  }
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer& CompressedVectorSiteContainer::operator=(const CompressedVectorSiteContainer& vsc)
-{
-  AbstractSequenceContainer::operator=(vsc);
-  // Seq names:
-  names_ = vsc.names_;
-  // Now try to add each site:
-  sites_.resize(vsc.sites_.size());
-  for (size_t i = 0; i < vsc.sites_.size(); i++)
-  {
-    sites_[i] = dynamic_cast<Site*>(vsc.sites_[i]->clone());
-  }
-  index_ = vsc.index_;
-  // Seq comments:
-  size_t nbSeq = vsc.getNumberOfSequences();
-  comments_.resize(nbSeq);
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    comments_[i] = new Comments(vsc.getComments(i));
-  }
-  sequences_.resize(nbSeq);
-
-  return *this;
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer& CompressedVectorSiteContainer::operator=(const SiteContainer& sc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(sc);
-  // Seq names:
-  names_ = sc.getSequencesNames();
-  // Now try to add each site:
-  for (size_t i = 0; i < sc.getNumberOfSites(); i++)
-  {
-    addSite(sc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  size_t nbSeq = sc.getNumberOfSequences();
-  comments_.resize(nbSeq);
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    comments_[i] = new Comments(sc.getComments(i));
-  }
-  sequences_.resize(nbSeq);
-
-  return *this;
-}
-
-/******************************************************************************/
-
-const Site& CompressedVectorSiteContainer::getSite(size_t i) const throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSites())
-    throw IndexOutOfBoundsException("CompressedVectorSiteContainer::getSite.", i, 0, getNumberOfSites() - 1);
-  return *sites_[index_[i]];
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::setSite(size_t pos, const Site& site, bool checkPositions) throw (Exception)
-{
-  if (pos >= getNumberOfSites()) throw IndexOutOfBoundsException("CompressedVectorSiteContainer::setSite.", pos, 0, getNumberOfSites() - 1);
-
-  // Check size:
-  if (site.size() != getNumberOfSequences()) throw SiteException("AlignedSequenceContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("CompressedVectorSiteContainer::setSite", getAlphabet(), site.getAlphabet());
-  
-  size_t current = index_[pos];
-  size_t siteIndex = getSiteIndex_(site);
-  if (siteIndex == current)
-  {
-    //Nothing to do here, this is the same site.
-  }
-  else if (siteIndex < sites_.size())
-  {
-    //The new site is already in the list, si we just update the index:
-    index_[pos] = siteIndex;
-
-    //We have to check if the previous pattern was unique, and if so, remove it and update indices:
-    bool test = true;
-    for (size_t i = 0; test && i < index_.size(); ++i)
-    {
-      if (index_[i] == current)
-      {
-        //There is another site, so nothing to do...
-        test = false;
-      }
-    }
-    if (test)
-    {
-      //There was no other site pointing toward this pattern, so we remove it.
-      delete sites_[current];
-      sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(current));
-      //Now we have to correct all indices:
-      for (size_t i = 0; i < index_.size(); ++i)
-      {
-        if (index_[i] > current) index_[i]--;
-      }
-    }
-  }
-  else
-  {
-    //This is a new pattern, and we have to add it to the list...
-    Site* copy = dynamic_cast<Site*>(site.clone());
-
-    //Now we have to check if the previous pattern was unique, and if so,
-    //replace it with the new one. Otherwise, add the new site at the end of the list.
-    bool test = true;
-    for (size_t i = 0; test && i < index_.size(); ++i)
-    {
-      if (i != pos && index_[i] == current)
-      {
-        //There is another site, so nothing to do...
-        test = false;
-      }
-    }
-    if (test)
-    {
-      //There was no other site pointing toward this pattern, so we remove it.
-      delete sites_[current];
-      sites_[current] = copy;
-    }
-    else
-    {
-      //We add the site at the end:
-      sites_.push_back(copy);
-      index_[pos] = siteIndex;
-    }
-  }
-}
-
-/******************************************************************************/
-
-Site* CompressedVectorSiteContainer::removeSite(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSites()) throw IndexOutOfBoundsException("CompressedVectorSiteContainer::removeSite.", i, 0, getNumberOfSites() - 1);
-  //Here we return a copy of the site, as it will not necessarily be removed from the set, so we don't want to delete it.
-  Site* site = dynamic_cast<Site *>(sites_[index_[i]]->clone());
-  deleteSite(i);
-  return site;
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::deleteSite(size_t siteIndex) throw (IndexOutOfBoundsException)
-{
-  if (siteIndex >= getNumberOfSites())
-    throw IndexOutOfBoundsException("CompressedVectorSiteContainer::deleteSite.", siteIndex, 0, getNumberOfSites() - 1);
-  //Here we need to check whether the pattern corresponding to this site is unique:
-  size_t current = index_[siteIndex];
-  bool test = true;
-  for (size_t j = 0; test && j < index_.size(); ++j)
-  {
-    if (j != siteIndex && index_[j] == current)
-    {
-      //There is a nother site, so nothing to...
-      test = false;
-    }
-  }
-  if (test)
-  {
-    //There was no other site pointing toward this pattern, so we remove it.
-    delete sites_[current];
-    sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(current));
-    //Now we have to correct all indices:
-    for (size_t j = 0; j < index_.size(); ++j)
-    {
-      if (index_[j] > current) index_[j]--;
-    }
-  }
-  index_.erase(index_.begin() + static_cast<ptrdiff_t>(siteIndex));
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException)
-{
-  //This may be optimized later:
-  for (size_t i = 0; i < length; ++i) {
-    deleteSite(siteIndex + i);
-  }
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::addSite(const Site& site, bool checkPositions) throw (Exception)
-{
-  // Check size:
-  if (site.size() != getNumberOfSequences()) throw SiteException("CompressedVectorSiteContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("CompressedVectorSiteContainer::addSite", getAlphabet(), site.getAlphabet());
-  }
-
-  size_t siteIndex = getSiteIndex_(site);
-  if (siteIndex == sites_.size())
-  {
-    //This is a new pattern:
-    Site* copy = dynamic_cast<Site*>(site.clone());
-    sites_.push_back(copy);
-  }
-  index_.push_back(siteIndex);
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::addSite(const Site& site, size_t siteIndex, bool checkPositions) throw (Exception)
-{
-  if (siteIndex >= getNumberOfSites()) throw IndexOutOfBoundsException("CompressedVectorSiteContainer::addSite", siteIndex, 0, getNumberOfSites() - 1);
-
-  // Check size:
-  if (site.size() != getNumberOfSequences()) throw SiteException("CompressedVectorSiteContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("CompressedVectorSiteContainer::addSite", getAlphabet(), site.getAlphabet());
-  }
-
-  size_t index = getSiteIndex_(site);
-  if (index == sites_.size())
-  {
-    //This is a new pattern:
-    Site* copy = dynamic_cast<Site*>(site.clone());
-    sites_.push_back(copy);
-  }
-  index_.insert(index_.begin() + static_cast<ptrdiff_t>(siteIndex), index);
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::reindexSites()
-{
-  int pos = 1; // first position is 1.
-  for (vector<Site*>::iterator i = sites_.begin(); i < sites_.end(); i++)
-  {
-    (*i)->setPosition(pos++);
-  }
-}
-
-/******************************************************************************/
-
-Vint CompressedVectorSiteContainer::getSitePositions() const
-{
-  size_t n = getNumberOfSites();
-  Vint positions(n);
-  for (size_t i = 0; i < n; i++)
-  {
-    positions[i] = sites_[index_[i]]->getPosition();
-  }
-  return positions;
-}
-
-/******************************************************************************/
-
-const Sequence& CompressedVectorSiteContainer::getSequence(size_t i) const throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSequences()) throw IndexOutOfBoundsException("CompressedVectorSiteContainer::getSequence.", i, 0, getNumberOfSequences() - 1);
-
-  // Main loop : for all sites
-  size_t n = getNumberOfSites();
-  vector<int> sequence(n);
-  for (size_t j = 0; j < n; j++)
-  {
-    sequence[j] = sites_[index_[j]]->getContent()[i];
-  }
-  if (sequences_[i]) delete sequences_[i];
-  sequences_[i] = new BasicSequence(names_[i], sequence, *comments_[i], getAlphabet());
-  return *sequences_[i];
-}
-
-/******************************************************************************/
-
-const Sequence& CompressedVectorSiteContainer::getSequence(const std::string& name) const throw (SequenceNotFoundException)
-{
-  // Look for sequence name:
-  size_t pos = getSequencePosition(name);
-  return getSequence(pos);
-}
-
-/******************************************************************************/
-
-bool CompressedVectorSiteContainer::hasSequence(const string& name) const
-{
-  //Look for sequence name:
-  for (size_t pos = 0; pos < names_.size(); pos++) {
-    if (names_[pos] == name) return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-size_t CompressedVectorSiteContainer::getSequencePosition(const std::string& name) const throw (SequenceNotFoundException)
-{
-  // Look for sequence name:
-  for (size_t pos = 0; pos < names_.size(); pos++)
-  {
-    if (names_[pos] == name) return pos;
-  }
-  throw SequenceNotFoundException("CompressedVectorSiteContainer::getSequencePosition().", name);
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::clear()
-{
-  // Must delete all sites in the container:
-  for (size_t i = 0; i < sites_.size(); i++)
-  {
-    delete sites_[i];
-  }
-
-  // must delete all comments too:
-  for (size_t i = 0; i < comments_.size(); i++)
-  {
-    if (comments_[i]) delete comments_[i];
-  }
-
-  // Delete all sequences retrieved:
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    if (sequences_[i]) delete (sequences_[i]);
-  }
-
-  // Delete all sites pointers
-  sites_.clear();
-  index_.clear();
-  names_.clear();
-  comments_.clear();
-  sequences_.clear();
-}
-
-/******************************************************************************/
-
-vector<string> CompressedVectorSiteContainer::getSequencesNames() const
-{
-   vector<string> seqnames(names_.size());
-  for (size_t i = 0; i < names_.size(); i++)
-  {
-    seqnames[i] = names_[i];
-  }
-  return seqnames;
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::setSequencesNames(
-  const vector<string>& names,
-  bool checkNames)
-throw (Exception)
-{
-  if (names.size() != getNumberOfSequences())
-    throw IndexOutOfBoundsException("CompressedVectorSiteContainer::setSequenceNames: bad number of names.", names.size(), getNumberOfSequences(), getNumberOfSequences());
-  if (checkNames)
-  {
-    for (size_t i = 0; i < names.size(); i++)
-    {
-      // For all names in vector : throw exception if name already exists
-      for (size_t j = 0; j < i; j++)
-      {
-        if (names[j] == names[i])
-          throw Exception("CompressedVectorSiteContainer::setSequencesNames : Sequence's name already exists in container");
-      }
-    }
-  }
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    names_[i] = names[i];
-  }
-}
-
-/******************************************************************************/
-
-void CompressedVectorSiteContainer::setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException)
-{
-  comments_[sequenceIndex] = new Comments(comments);
-}
-
-/******************************************************************************/
-
-CompressedVectorSiteContainer* CompressedVectorSiteContainer::createEmptyContainer() const
-{
-   CompressedVectorSiteContainer* vsc = new CompressedVectorSiteContainer(getAlphabet());
-   vsc->setGeneralComments(getGeneralComments());
-  return vsc;
-}
-
-/******************************************************************************/
-
-size_t CompressedVectorSiteContainer::getSiteIndex_(const Site& site)
-{
-  size_t pos = sites_.size();
-  bool test;
-  for (size_t i = 0; i < sites_.size(); ++i)
-  {
-    test = true;
-    for (size_t j = 0; test && j < site.size(); ++j) //site is supposed to have the correct size, that is the same as all the ones in the container.
-    {
-      if (site[j] != (*sites_[i])[j])
-        test = false;
-    }
-    if (test)
-    {
-      pos = i;
-      break;
-    }
-  }
-  return pos;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/CompressedVectorSiteContainer.h b/src/Bpp/Seq/Container/CompressedVectorSiteContainer.h
deleted file mode 100644
index b720583..0000000
--- a/src/Bpp/Seq/Container/CompressedVectorSiteContainer.h
+++ /dev/null
@@ -1,290 +0,0 @@
-//
-// File: CompressedVectorSiteContainer.h
-// Created by: Julien Dutheil
-// Created on: Wed Dec  16 12:08 2009
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _COMPRESSEDVECTORSITECONTAINER_H_
-#define _COMPRESSEDVECTORSITECONTAINER_H_
-
-#include "../Site.h"
-#include "SiteContainer.h"
-#include "AbstractSequenceContainer.h"
-#include "AlignedSequenceContainer.h"
-#include "OrderedSequenceContainer.h"
-#include <Bpp/Numeric/VectorTools.h>
-
-// From the STL library:
-#include <string>
-#include <vector>
-#include <iostream>
-
-namespace bpp
-{
-/**
- * @brief A low memory, yet restricted, version of the VectorSiteContainer class.
- *
- * This implementation is very similar to VectorSiteContainer, but identical sites
- * are stored only once, which significantly reduce memory usage in the case of
- * containers where the number of sites is large compared to the number of sequences.
- * site access is as fast as in the standard VectorSiteContainer class, but site
- * addition takes more time, as the new site must be first compared to the existing set.
- * A major restriction of this container is that you can't add or remove sequences.
- * The number of sequences is fixed after the first site has been added.
- *
- * @warning Since the data is compressed, the sites given as input are modified. The
- * major pratical consequence is that the 'position' attribute of sites will be lost.
- * Instead, the position will correspond to the position in the compressed container.
- * In addition, this container may lead to unexpected behavior if used with derived
- * classes of Site. Use with care then...
- *
- * @see Sequence, Site, VectorSiteContainer
- */
-class CompressedVectorSiteContainer :
-  public AbstractSequenceContainer,
-  // This container implements the SequenceContainer interface
-  // and use the AbstractSequenceContainer adapter.
-  public virtual SiteContainer        // This container is a SiteContainer.
-{
-protected:
-  std::vector<Site*> sites_; //A set of unique sites.
-  std::vector<size_t> index_; //For all sites, give the actual position in the set.
-  std::vector<std::string> names_;
-  std::vector<Comments*> comments_; // Sequences comments.
-  mutable std::vector<Sequence*> sequences_; // To store pointer toward sequences retrieved (cf. AlignedSequenceContainer).
-
-public:
-  /**
-   * @brief Build a new container from a set of sites.
-   *
-   * @param vs A std::vector of sites.
-   * @param alpha The common alphabet for all sites.
-   * @throw Exception If sites differ in size or in alphabet.
-   */
-  CompressedVectorSiteContainer(const std::vector<const Site*>& vs, const Alphabet* alpha) throw (Exception);
-  /**
-   * @brief Build a new empty container with specified size.
-   *
-   * @param size Number of sequences in the container.
-   * @param alpha The alphabet for this container.
-   */
-  CompressedVectorSiteContainer(size_t size, const Alphabet* alpha);
-  /**
-   * @brief Build a new empty container with specified sequence names.
-   *
-   * @param names Sequence names. This will set the number of sequences in the container.
-   * @param alpha The alphabet for this container.
-   */
-  CompressedVectorSiteContainer(const std::vector<std::string>& names, const Alphabet* alpha);
-
-  /**
-   * @brief Build a new empty container.
-   *
-   * @param alpha The alphabet for this container.
-   */
-  CompressedVectorSiteContainer(const Alphabet* alpha);
-
-  CompressedVectorSiteContainer(const CompressedVectorSiteContainer& vsc);
-  CompressedVectorSiteContainer(const SiteContainer& sc);
-
-  CompressedVectorSiteContainer& operator=(const CompressedVectorSiteContainer& vsc);
-  CompressedVectorSiteContainer& operator=(const SiteContainer& sc);
-
-  virtual ~CompressedVectorSiteContainer() { clear(); }
-
-public:
-  /**
-   * @name The Clonable interface.
-   *
-   * @{
-   */
-  CompressedVectorSiteContainer* clone() const { return new CompressedVectorSiteContainer(*this); }
-  /** @} */
-
-  /**
-   * @name The SiteContainer interface implementation:
-   *
-   * @{
-   */
-  const Site& getSite(size_t siteIndex) const throw (IndexOutOfBoundsException);
-  void        setSite(size_t siteIndex, const Site& site, bool checkPosition = false) throw (Exception);
-  Site*    removeSite(size_t siteIndex) throw (IndexOutOfBoundsException);
-  void     deleteSite(size_t siteIndex) throw (IndexOutOfBoundsException);
-  void    deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException);
-  void        addSite(const Site& site,                                       bool checkPosition = false) throw (Exception);
-  void        addSite(const Site& site,                         int position, bool checkPosition = false) throw (Exception)
-  {
-    addSite(site, checkPosition);
-  }
-  void        addSite(const Site& site, size_t siteIndex,               bool checkPosition = false) throw (Exception);
-  void        addSite(const Site& site, size_t siteIndex, int position, bool checkPosition = false) throw (Exception)
-  {
-    addSite(site, siteIndex, checkPosition);
-  }
-  size_t getNumberOfSites() const { return index_.size(); }
-  void reindexSites();
-  Vint getSitePositions() const;
-  /** @} */
-
-  // Theses methods are implemented for this class:
-
-  /**
-   * @name The SequenceContainer interface.
-   *
-   * @{
-   */
-  void setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException);
-
-  // Method to get a sequence object from sequence container
-  const Sequence& getSequence(size_t sequenceIndex) const throw (IndexOutOfBoundsException);
-  const Sequence& getSequence(const std::string& name) const throw (SequenceNotFoundException);
-  bool hasSequence(const std::string& name) const;
-
-  // Methods to get position of a sequence in sequence container from his name
-  // This method is used by delete and remove methods
-  size_t getSequencePosition(const std::string& name) const throw (SequenceNotFoundException);
-
-  Sequence* removeSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::removeSequence.");
-  }
-
-  Sequence* removeSequence(const std::string& name) throw (SequenceNotFoundException, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::removeSequence.");
-  }
-
-  void deleteSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::deleteSequence.");
-  }
-
-  void deleteSequence(const std::string& name) throw (SequenceNotFoundException, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::deleteSequence.");
-  }
-
-  size_t getNumberOfSequences() const { return names_.size(); }
-
-  std::vector<std::string> getSequencesNames() const;
-
-  void setSequencesNames(const std::vector<std::string>& names, bool checkNames = true) throw (Exception);
-
-  void clear();
-
-  CompressedVectorSiteContainer* createEmptyContainer() const;
-
-  int& valueAt(const std::string& sequenceName, size_t elementIndex) throw (SequenceNotFoundException, IndexOutOfBoundsException)
-  {
-    if (elementIndex >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::operator(std::string, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[index_[elementIndex]])[getSequencePosition(sequenceName)];
-  }
-  const int& valueAt(const std::string& sequenceName, size_t elementIndex) const throw (SequenceNotFoundException, IndexOutOfBoundsException)
-  {
-    if (elementIndex >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::operator(std::string, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[index_[elementIndex]])[getSequencePosition(sequenceName)];
-  }
-  int& operator()(const std::string& sequenceName, size_t elementIndex)
-  {
-    return (*sites_[index_[elementIndex]])[getSequencePosition(sequenceName)];
-  }
-  const int& operator()(const std::string& sequenceName, size_t elementIndex) const
-  {
-    return (*sites_[index_[elementIndex]])[getSequencePosition(sequenceName)];
-  }
-
-  int& valueAt(size_t sequenceIndex, size_t elementIndex) throw (IndexOutOfBoundsException)
-  {
-    if (sequenceIndex >= getNumberOfSequences()) throw IndexOutOfBoundsException("VectorSiteContainer::operator(size_t, size_t).", sequenceIndex, 0, getNumberOfSequences() - 1);
-    if (elementIndex  >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::operator(size_t, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[index_[elementIndex]])[sequenceIndex];
-  }
-  const int& valueAt(size_t sequenceIndex, size_t elementIndex) const throw (IndexOutOfBoundsException)
-  {
-    if (sequenceIndex >= getNumberOfSequences()) throw IndexOutOfBoundsException("VectorSiteContainer::operator(size_t, size_t).", sequenceIndex, 0, getNumberOfSequences() - 1);
-    if (elementIndex  >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::operator(size_t, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[index_[elementIndex]])[sequenceIndex];
-  }
-  int& operator()(size_t sequenceIndex, size_t elementIndex)
-  {
-    return (*sites_[index_[elementIndex]])[sequenceIndex];
-  }
-  const int& operator()(size_t sequenceIndex, size_t elementIndex) const
-  {
-    return (*sites_[index_[elementIndex]])[sequenceIndex];
-  }
-  /** @} */
-
-  void addSequence(const Sequence& sequence, bool checkName = true) throw (Exception, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::addSequence.");
-  }
-  
-  void addSequence(const Sequence& sequence, size_t sequenceIndex, bool checkName = true) throw (Exception, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::addSequence.");
-  }
-
-  void setSequence(const std::string& name, const Sequence& sequence, bool checkName) throw (Exception, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::setSequence.");
-  }
-
-  void setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName) throw (Exception, NotImplementedException)
-  {
-    //Implementing this function would involve (partially) decompressing the data...
-    throw NotImplementedException("CompressedVectorSiteContainer::setSequence.");
-  }
-
-protected:
-  /**
-   * @return The position of the site in the compressed set. If the site is not found,
-   * this will return the number of sites in the compressed set.
-   */
-  size_t getSiteIndex_(const Site& site);
-};
-
-} // end of namespace bpp.
-
-#endif  // _COMPRESSEDVECTORSITECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/MapSequenceContainer.cpp b/src/Bpp/Seq/Container/MapSequenceContainer.cpp
deleted file mode 100644
index a601853..0000000
--- a/src/Bpp/Seq/Container/MapSequenceContainer.cpp
+++ /dev/null
@@ -1,466 +0,0 @@
-//
-// File MapSequenceContainer.cpp
-// Authors : Guillaume Deuchst
-//           Julien Dutheil
-//           Sylvain Gaillard
-// Last modification : Monday July 19 2004
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "MapSequenceContainer.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-using namespace std;
-
-/******************************************************************************/
-
-MapSequenceContainer::MapSequenceContainer(const map<string, Sequence*>& ms, const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha), sequences_() 
-{
-  for (map<string, Sequence*>::const_iterator it = ms.begin(); it != ms.end(); it++)
-  {    
-    addSequence(it->first, *it->second);
-  }
-}
-
-/******************************************************************************/
-
-MapSequenceContainer::MapSequenceContainer(const MapSequenceContainer& msc) :
-  AbstractSequenceContainer(msc.getAlphabet()), sequences_()
-{ 
-  for (unsigned int i = 0; i < msc.getNumberOfSequences(); i++)
-    addSequence(msc.getKey(i), msc.getSequence(i), false);
-}
-
-/******************************************************************************/
-
-MapSequenceContainer& MapSequenceContainer::operator=(const MapSequenceContainer& msc) 
-{
-  clear();
-  AbstractSequenceContainer::operator=(msc);
-  
-  // Sequences insertion
-  vector<string> keys = msc.getKeys();
-  for (unsigned int i = 0 ; i < getNumberOfSequences(); i++)
-  {
-    addSequence(keys[i], msc.getSequence(i), false);
-  }
-
-  return * this;
-}
-
-/******************************************************************************/
-
-MapSequenceContainer::~MapSequenceContainer() 
-{
-  clear();
-}
-
-/******************************************************************************/
-
-const Sequence& MapSequenceContainer::getSequence(size_t i) const throw (IndexOutOfBoundsException)
-{
-  // Specified sequence existence verification
-  if (i < sequences_.size())
-  {
-    map<string, Sequence*>::const_iterator it = sequences_.begin();
-    for (unsigned int j = 0; j < i; j++) it++;
-    return *it->second;
-  }
-  throw IndexOutOfBoundsException("MapSequenceContainer::getSequence", i, 0, sequences_.size() - 1);
-}
-
-/******************************************************************************/
-
-const Sequence& MapSequenceContainer::getSequence(const string& name) const throw (SequenceNotFoundException)
-{
-  // Specified sequence name research into all sequences
-  for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    if (it->second->getName() == name)
-      return *it->second;
-  throw SequenceNotFoundException("MapSequenceContainer::getSequence", name);
-}
-
-/******************************************************************************/
-
-bool MapSequenceContainer::hasSequence(const string& name) const
-{
-  // Specified sequence name research into all sequences
-  for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    if (it->second->getName() == name)
-      return true;
-  return false;
-}
-
-/******************************************************************************/
-
-Sequence& MapSequenceContainer::getSequence_(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= sequences_.size())
-    throw IndexOutOfBoundsException("MapSequenceContainer::getSequence", i, 0, sequences_.size() - 1);
-  map<string, Sequence*>::iterator it = sequences_.begin();
-  for (size_t j = 0; j < i; j++) it++;
-  return *it->second;
-}
-
-/******************************************************************************/
-
-Sequence& MapSequenceContainer::getSequence_(const string& name) throw (SequenceNotFoundException)
-{
-  // Specified sequence name research into all sequences
-  for (map<string, Sequence*>::iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    if (it->second->getName() == name)
-      return *it->second;
-  throw SequenceNotFoundException("MapSequenceContainer::getSequence", name);
-}
-
-/******************************************************************************/
-
-const Sequence& MapSequenceContainer::getSequenceByKey(const string& key) const
-  throw (SequenceNotFoundException)
-{
-  map<string, Sequence*>::const_iterator it = sequences_.find(key);
-  if (it == sequences_.end())
-    throw SequenceNotFoundException("MapSequenceContainer::getSequenceByKey", key);
-  return *it->second;
-}
-
-/******************************************************************************/
-
-size_t MapSequenceContainer::getSequencePosition(const string& name)
-  const throw (SequenceNotFoundException)
-{
-  // Specified sequence name research into all sequences
-  size_t pos = 0;
-  for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-  {
-    if (it->second->getName() == name) return pos;
-    pos++;
-  }
-
-  throw SequenceNotFoundException("MapSequenceContainer::getSequencePosition", name);
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::setSequence(size_t i, const Sequence& sequence, bool checkNames)
-    throw (IndexOutOfBoundsException)
-{
-  // Sequence's name existence checking
-  if (checkNames)
-  {
-    size_t j = 0;
-    // For all names in map : throw exception if name already exists
-    for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    {
-      if (it->second->getName() == sequence.getName()) 
-        if (j != i) throw Exception("MapSequenceContainer::setSequence : Sequence's name already exists in container");
-      j++;
-    }
-  }
-
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-  {
-    // Delete old sequence
-    delete sequences_[getKey(i)];
-    // New sequence insertion in sequence container
-    sequences_[getKey(i)] = dynamic_cast<Sequence*>(sequence.clone());
-  }
-  else
-    throw AlphabetMismatchException("MapSequenceContainer::setSequence", getAlphabet(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::setSequence(const string& name, const Sequence& sequence, bool checkNames) throw (SequenceNotFoundException)
-{
-  // Sequence's name existence checking
-  if (checkNames)
-  {
-    // For all names in map : throw exception if name already exists
-    for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    {
-      if (it->second->getName() == name) 
-        if (it->second->getName() != name) 
-          throw Exception("MapSequenceContainer::setSequence : Sequence's name already exists in container");
-    }
-  }
-
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-  {
-    // Delete old sequence
-    delete sequences_[name];
-    // New sequence insertion in sequence container
-    sequences_[name] = dynamic_cast<Sequence*>(sequence.clone());
-  }
-  else
-    throw AlphabetMismatchException("MapSequenceContainer::setSequence", getAlphabet(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::setSequenceByKey(const string& key, const Sequence& sequence, bool checkNames) throw (SequenceNotFoundException)
-{
-  // Sequence's name existence checking
-  if (checkNames)
-  {
-    // For all names in map : throw exception if name already exists
-    for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    {
-      if (it->second->getName() == sequence.getName()) 
-        if (it->first != key) 
-          throw Exception("MapSequenceContainer::setSequenceByKey : Sequence's name already exists in container");
-    }
-  }
-
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-  {
-    // Delete old sequence
-    delete sequences_[key];
-    // New sequence insertion in sequence container
-    sequences_[key] = dynamic_cast<Sequence*>(sequence.clone());
-  }
-  else
-    throw AlphabetMismatchException("MapSequenceContainer::setSequenceByKey", getAlphabet(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-Sequence* MapSequenceContainer::removeSequence(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= sequences_.size())
-    throw IndexOutOfBoundsException("MapSequenceContainer::removeSequence", i, 0, sequences_.size() - 1);
-  map<string, Sequence*>::iterator it = sequences_.begin();
-  for (size_t j = 0; j < i; j++) it++;
-  Sequence* old = it->second;
-  sequences_.erase(it);  
-  return old;
-}
-
-/******************************************************************************/
-
-Sequence* MapSequenceContainer::removeSequence(const string& name) throw (SequenceNotFoundException)
-{
-  for (map<string, Sequence*>::iterator it = sequences_.begin(); it != sequences_.end(); it++) {
-    if (it->second->getName() == name)
-    {
-      Sequence* old = it->second;
-      sequences_.erase(it);
-      return old;
-    }
-  }
-  throw SequenceNotFoundException("MapSequenceContainer::removeSequence", name);
-}
-
-/******************************************************************************/
-
-Sequence* MapSequenceContainer::removeSequenceByKey(const string& key)throw (SequenceNotFoundException)
-{
-  map<string, Sequence*>::iterator it = sequences_.find(key);
-  if (it == sequences_.end())
-    throw SequenceNotFoundException("MapSequenceContainer::removeSequenceByKey", key);
-  
-  Sequence* old = it->second;
-  sequences_.erase(key);
-  return old;
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::deleteSequence(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= sequences_.size())
-    throw IndexOutOfBoundsException("MapSequenceContainer::deleteSequence", i, 0, sequences_.size() - 1);
-  map<string, Sequence*>::iterator it = sequences_.begin();
-  for (size_t j = 0; j < i; j++) it++;
-  delete it->second;
-  sequences_.erase(it);
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::deleteSequence(const string& name) throw (SequenceNotFoundException)
-{
-  for (map<string, Sequence*>::iterator it = sequences_.begin(); it != sequences_.end(); it++) {
-    if (it->second->getName() == name)
-    {
-      delete it->second;
-      sequences_.erase(it);
-      return;
-    }
-  }
-  throw SequenceNotFoundException("MapSequenceContainer::deleteSequence", name);
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::deleteSequenceByKey(const string& key) throw (SequenceNotFoundException)
-{
-  map<string, Sequence*>::iterator it = sequences_.find(key);
-  if (it == sequences_.end())
-    throw SequenceNotFoundException("MapSequenceContainer::deleteSequenceByKey", key);  
-  delete it->second;
-  sequences_.erase(key);
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::addSequence(const string& key, const Sequence& sequence, bool checkNames) throw (Exception)
-{
-  // Sequence's name existence checking
-  if (checkNames)
-  {
-    // For all names in map : throw exception if name already exists
-    for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    {
-      if (it->second->getName() == sequence.getName()) 
-        throw Exception("MapSequenceContainer::addSequence: Sequence '" + sequence.getName() + ", already exists in container");
-    }
-  }
-  
-  // Check if the key is not used
-  for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    if (key == it->first)
-      throw Exception("MapSequenceContainer::addSequence: key already in use. (" + key + ")");
-  
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-    sequences_.insert(make_pair(key, dynamic_cast<Sequence*>(sequence.clone())));
-  else throw AlphabetMismatchException("MapSequenceContainer::addSequence", getAlphabet(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-vector<string> MapSequenceContainer::getKeys() const
-{
-  vector<string> keys;
-  for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    keys.push_back(it->first);
-  return keys;
-}
-
-/******************************************************************************/
-
-string MapSequenceContainer::getKey(size_t pos) const throw (IndexOutOfBoundsException)
-{
-  if (pos >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("MapSequenceContainer::getKey", pos, 0, sequences_.size() - 1);
-  map<string, Sequence*>::const_iterator it = sequences_.begin();
-  for (size_t i = 0; i < pos; i++) it++;
-  return it->first;
-}
-
-/******************************************************************************/
-
-string MapSequenceContainer::getKey(const string& name) const throw (SequenceNotFoundException)
-{
-  try
-  {
-    return getKey(getSequencePosition(name));
-  }
-  catch (SequenceNotFoundException & snfe)
-  {
-    throw SequenceNotFoundException("MapSequenceContainer::getKey", snfe.getSequenceId());
-  }
-}
-  
-/******************************************************************************/
-
-void MapSequenceContainer::setComments(size_t pos, const Comments& comments) throw (IndexOutOfBoundsException)
-{
-  if (pos >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("MapSequenceContainer::setComments", pos, 0, sequences_.size() - 1);
-  map<string, Sequence*>::iterator it = sequences_.begin();
-  for (size_t i = 0 ; i < pos ; i++) it++;
-  it->second->setComments(comments);
-}
-
-/******************************************************************************/
-
-vector<string> MapSequenceContainer::getSequencesNames() const
-{
-  vector<string> names;
-  for (map<string, Sequence*>::const_iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    names.push_back(it->second->getName());
-  return names;
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::setSequencesNames(const vector<string>& names, bool checkNames) throw (Exception)
-{
-  if (names.size() != getNumberOfSequences())
-    throw IndexOutOfBoundsException("MapSequenceContainer::setSequenceNames : bad number of names", names.size(), getNumberOfSequences(), getNumberOfSequences());
-  if (checkNames) {
-    // check if there is no repeat names in teh vector
-    for (size_t i = 0 ; i < names.size() ; i++)
-      for (unsigned int j = 0 ; j < i ; j++)
-        if (names[j] == names[i])
-          throw Exception("MapSequenceContainer::setSequencesNames: Sequence's name already exists in container");
-  }
-  map<string, Sequence*>::iterator it = sequences_.begin();
-  for (size_t i = 0 ; i < names.size() ; i++)
-  {
-    it->second->setName(names[i]);
-    it++;
-  }
-}
-
-/******************************************************************************/
-
-void MapSequenceContainer::clear()
-{
-  // Delete sequences
-  for (map<string, Sequence *>::iterator it = sequences_.begin(); it != sequences_.end(); it++)
-    delete it->second;
-  // Delete all sequence pointers
-  sequences_.clear();
-}
-
-/******************************************************************************/
-
-MapSequenceContainer* MapSequenceContainer::createEmptyContainer() const
-{ 
-  MapSequenceContainer* msc = new MapSequenceContainer(getAlphabet());
-  msc->setGeneralComments(getGeneralComments());
-  return msc;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/MapSequenceContainer.h b/src/Bpp/Seq/Container/MapSequenceContainer.h
deleted file mode 100644
index d75e1f4..0000000
--- a/src/Bpp/Seq/Container/MapSequenceContainer.h
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// File MapSequenceContainer.h
-// Authors : Guillaume Deuchst
-//           Julien Dutheil
-//           Sylvain Gaillard
-// Last modification : Friday June 25 2004
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _MAPSEQUENCECONTAINER_H_
-#define _MAPSEQUENCECONTAINER_H_
-
-#include "../Alphabet/Alphabet.h"
-#include "../Sequence.h"
-#include "AbstractSequenceContainer.h"
-
-#include <string>
-#include <map>
-
-namespace bpp
-{
-
-/**
- * @brief MapSequenceContainer class
- *
- * Sequences are stored using a key std::string, in a map object.
- * Sequences are ordered according to the key order (defined by the < operator).
- * 
- */
-
-class MapSequenceContainer:
-  public AbstractSequenceContainer
-{
-	private:
-    std::map<std::string, Sequence*> sequences_;
-        
-	public:
-		MapSequenceContainer(const std::map<std::string, Sequence*>& ms, const Alphabet* alpha);
-		MapSequenceContainer(const Alphabet* alpha):
-      AbstractSequenceContainer(alpha), sequences_() {}
-
-		MapSequenceContainer(const MapSequenceContainer& msc);
-		MapSequenceContainer& operator=(const MapSequenceContainer& msc);
-
-		virtual ~MapSequenceContainer();
-
-	public:
-		/**
-		 * @brief Get a sequence.
-		 *
-		 * @param key The key of the sequence to retrieve.
-		 * @return The sequence associated to the given key.
-		 * @throw SequenceNotFoundException If no sequence is associated to the given key.
-		 */
-		const Sequence& getSequenceByKey(const std::string& key)  const throw (SequenceNotFoundException);
-
-		/**
-		 * @brief Set a sequence.
-		 *
-		 * @param key The key of the sequence.
-		 * @param sequence The new sequence that will be associated to the key.
-		 * @param checkNames Tell is the sequence name must be checked.
-		 * @throw SequenceNotFoundException If no sequence is associated to the given key.
-		 */
-		void setSequenceByKey(const std::string& key , const Sequence& sequence, bool checkNames = true) throw (SequenceNotFoundException);
-
-		/**
-		 * @brief Remove a sequence.
-		 * 
-		 * @param key The key of the sequence.
-		 * @return The sequence previously associated to the given key.
-		 * @throw SequenceNotFoundException If no sequence is associated to the given key.
-		 */
-		Sequence* removeSequenceByKey(const std::string& key) throw (SequenceNotFoundException);
-
-		/**
-		 * @brief Delete a sequence.
-		 * 
-		 * @param key The key of the sequence.
-		 * @throw SequenceNotFoundException If no sequence is associated to the given key.
-		 */
-		void deleteSequenceByKey(const std::string& key) throw (SequenceNotFoundException);
-
-		/**
-		 * @brief Add a sequence and key.
-		 * 
-		 * @param key The key of the new sequence.
-		 * @param sequence The new sequence that will be associated to the key.
-		 * @param checkNames Tell is the sequence name must be checked.
-		 */
-		void addSequence(const std::string& key, const Sequence& sequence, bool checkNames = true) throw (Exception);
-
-		/**
-		 * @return All sequences keys.
-		 */
-		std::vector<std::string> getKeys() const;
-
-		/**
-		 * @return The key of a given sequence specified by its position in the container.
-		 * @param pos The index of the sequence.
-		 * @throw IndexOutOfBoundsException If pos is not a valid index.
-		 */
-		std::string getKey(size_t pos) const throw (IndexOutOfBoundsException);
-
-		/**
-		 * @return The key of a given sequence specified by its name.
-		 * @param name The name of the sequence.
-		 * @throw SequenceNotFoundException If no sequence was found with the given name.
-		 */
-		std::string getKey(const std::string& name) const throw (SequenceNotFoundException);
-
-		/**
-		 * @name The clonable interface
-		 * 
-		 * @{
-		 */
-		MapSequenceContainer* clone() const { return new MapSequenceContainer(*this); }
-		/**
-		 * @}
-		 */
-
-		/**
-		 * @name The SequenceContainer interface implementation:
-		 *
-		 * @{
-		 */
-		const Sequence& getSequence(const std::string& name) const throw (SequenceNotFoundException);
-
-		bool hasSequence(const std::string& name) const;
-    
-    /**
-     * @brief The SequenceContainer method. Calls the addSeqeucne(key, Sequence) method while using the resut of sequence.getName() as a key.
-     */
-		void addSequence(const Sequence& sequence, bool checkNames = true) throw (Exception)
-    {
-      addSequence(sequence.getName(), sequence, checkNames);
-    }
-		void setSequence(const std::string& name, const Sequence& sequence, bool checkName = true) throw (SequenceNotFoundException);
-		Sequence* removeSequence(const std::string& name) throw (SequenceNotFoundException);
-		void deleteSequence(const std::string& name) throw (SequenceNotFoundException);
-		size_t getNumberOfSequences() const { return sequences_.size(); }
-		void clear();
-		MapSequenceContainer* createEmptyContainer() const;
-
-    int& valueAt(const std::string& sequenceName, size_t elementIndex) throw (SequenceNotFoundException, IndexOutOfBoundsException)
-    {
-      return getSequence_(sequenceName)[elementIndex];
-    }
-    const int& valueAt(const std::string& sequenceName, size_t elementIndex) const throw (SequenceNotFoundException, IndexOutOfBoundsException)
-    {
-      return getSequence(sequenceName)[elementIndex];
-    }
-    int& operator()(const std::string& sequenceName, size_t elementIndex)
-    {
-      return getSequence_(sequenceName)[elementIndex];
-    }
-    const int& operator()(const std::string & sequenceName, size_t elementIndex) const
-    {
-      return getSequence(sequenceName)[elementIndex];
-    }
-
-    int& valueAt(size_t sequenceIndex, size_t elementIndex) throw (IndexOutOfBoundsException)
-    {
-      return getSequence_(sequenceIndex)[elementIndex];
-    }
-    const int& valueAt(size_t sequenceIndex, size_t elementIndex) const throw (IndexOutOfBoundsException)
-    {
-      return getSequence(sequenceIndex)[elementIndex];
-    }    
-    int& operator()(size_t sequenceIndex, size_t elementIndex)
-    {
-      return getSequence_(sequenceIndex)[elementIndex];
-    }
-    const int& operator()(size_t sequenceIndex, size_t elementIndex) const
-    {
-      return getSequence(sequenceIndex)[elementIndex];
-    }    
-		/** @} */
-
-		/**
-		 * @name The OrderedSequenceContainer interface implementation:
-		 *
-		 * @{
-		 */
-		const Sequence& getSequence(size_t sequenceIndex) const throw (IndexOutOfBoundsException);
-		size_t getSequencePosition(const std::string& name) const throw (SequenceNotFoundException);
-		void            setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName = true) throw (IndexOutOfBoundsException);
-		Sequence*    removeSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException);
-		void         deleteSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException);
-		void setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException);
-		std::vector<std::string> getSequencesNames() const;
-		void setSequencesNames(const std::vector<std::string>& names, bool checkNames) throw (Exception);
-		/** @} */
-
-		/**
-		 * @name AbstractSequenceContainer methods.
-		 *
-		 * @{
-		 */
-		Sequence& getSequence_(size_t i) throw (IndexOutOfBoundsException);
-		Sequence& getSequence_(const std::string& name) throw (SequenceNotFoundException);
-		/** @} */
-};
-
-} //end of namespace bpp.
-
-#endif // _MAPSEQUENCECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/OrderedSequenceContainer.h b/src/Bpp/Seq/Container/OrderedSequenceContainer.h
deleted file mode 100644
index c7a0ffe..0000000
--- a/src/Bpp/Seq/Container/OrderedSequenceContainer.h
+++ /dev/null
@@ -1,246 +0,0 @@
-//
-// File OrderedSequenceContainer.h
-// Author: Guillaume Deuchst
-//         Julien Dutheil
-// Last modification : Tuesday August 7 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ORDEREDSEQUENCECONTAINER_H_
-#define _ORDEREDSEQUENCECONTAINER_H_
-
-#include "../Sequence.h"
-#include "SequenceContainer.h"
-
-namespace bpp
-{
-
-/**
- * @brief The OrderedSequenceContainer interface.
- *
- * Interface to manage indexed containers.
- * Sequences may be accessed via their indice, <i>i.e.</i> their position in the container.
- */
-class OrderedSequenceContainer:
-  public virtual SequenceContainer
-{
-	public:
-		OrderedSequenceContainer() {}
-		virtual ~OrderedSequenceContainer() {}
-
-	public:
-		/**
-		 * @brief Get the content of a sequence.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @return The content of the sequence as a vector of integers.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in the container.
-		 */
-		virtual const std::vector<int>& getContent(size_t sequenceIndex) const throw (IndexOutOfBoundsException) = 0;
-		
-		/**
-		 * @brief Convert a particular sequence to a string.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @return A string describing the content of the sequence.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in the container.
-		 */
-		virtual std::string toString(size_t sequenceIndex) const throw (IndexOutOfBoundsException) = 0;
-
-		/**
-		 * @brief Retrieve a sequence object from the container.
-
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @return A reference toward the Sequence object with corresponding name.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in the container.
-		 */
-		virtual const Sequence& getSequence(size_t sequenceIndex) const throw (IndexOutOfBoundsException) = 0;
-
-		/**
-		 * @brief Replace a sequence in the container.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @param sequence      The sequence to add.
-		 * @param checkName     Tell if the container must check if the name of the sequence
-		 * is already used in the container before adding it.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in the container.
-		 * @throw Exception Any other kind of exception.
-		 */
-		virtual void setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName) throw (Exception) = 0;
-
-		/**
-		 * @brief Extract (and remove) a sequence from the container.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @throw IndexOutOfBoundsException If the name does not match any sequence in
-		 * the container.
-		 */
-		virtual Sequence* removeSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException, Exception) = 0;
-
-		/**
-		 * @brief Delete a sequence of the container.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in
-		 * the container.
-		 */
-		virtual void deleteSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException, Exception) = 0;
-
-		/**
-		 * @brief Get the name of a particular sequence.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @return The name of the sequence at position 'sequenceIndex'.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in
-		 * the container.
-		 */
-		virtual const std::string& getName(size_t sequenceIndex) const throw (IndexOutOfBoundsException) = 0;
-
-		/**
-		 * @brief Get comments of a particular sequence.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @return The comments associated to sequence at position 'sequenceIndex'.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in
-		 * the container.
-		 */
-		virtual const Comments& getComments(size_t sequenceIndex) const throw (IndexOutOfBoundsException) = 0;
-
-		/**
-		 * @brief Set the comments of a particular sequence.
-		 *
-		 * @param sequenceIndex The position of the sequence.
-		 * @param comments      The comments to set to sequence with position 'i'.
-		 * @throw IndexOutOfBoundsException If the position does not match any sequence in
-		 * the container.
-		 */
-		virtual void setComments(size_t sequenceIndex, const Comments & comments) throw (IndexOutOfBoundsException) = 0;
-		
-		/**
-		 * @brief Get the position of a sequence in sequence container from its name.
-		 *
-		 * @param name The name of the sequence.
-		 * @return The position of the sequence with name 'name', if it exists.
-		 * @throw SequenceNotFoundException If no sequence with name 'name' could be found.
-		 */
-		virtual size_t getSequencePosition(const std::string & name) const throw (SequenceNotFoundException) = 0;
-
-    /**
-     * @name Provide direct access to sequences content.
-     *
-     * @warning These operators allow you to modifiy the content of the sequences.
-     * No checking is performed for your modifications, so use with care, or
-     * consider using the setContent() methods.
-     *
-     * @{
-     */
-
-    virtual int& valueAt(const std::string& sequenceName, size_t elementIndex) throw (SequenceNotFoundException, IndexOutOfBoundsException) = 0;
-
-    virtual const int& valueAt(const std::string& sequenceName, size_t elementIndex) const throw (SequenceNotFoundException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Element access operator.
-     *
-     * Allows direct access to the data stored in the container.
-     * 
-     * @param sequenceIndex The sequence position.
-     * @param elementIndex The element position within the sequence.
-     * @throw IndexOutOfBoundsException If a position is not valid.
-     */
-    virtual int& valueAt(size_t sequenceIndex, size_t elementIndex) throw (IndexOutOfBoundsException) = 0;
-    
-    /**
-     * @brief Element access operator.
-     *
-     * Allows direct access to the data stored in the container.
-     * 
-     * @param sequenceIndex The sequence position.
-     * @param elementIndex The element position within the sequence.
-     * @throw IndexOutOfBoundsException If a position is not valid.
-     */
-    virtual const int& valueAt(size_t sequenceIndex, size_t elementIndex) const throw (IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Element access operator.
-     *
-     * Allows direct access to the data stored in the container.
-     * This method is faster then the valueAt function, but input
-     * parameters are not checked!
-     * 
-     * @param sequenceIndex The sequence position.
-     * @param elementIndex The element position within the sequence.
-     */
-    virtual int& operator()(size_t sequenceIndex, size_t elementIndex) = 0;
-    
-    /**
-     * @brief Element access operator.
-     *
-     * Allows direct access to the data stored in the container.
-     * This method is faster then the valueAt function, but input
-     * parameters are not checked!
-     * 
-     * @param sequenceIndex The sequence position.
-     * @param elementIndex The element position within the sequence.
-     */
-    virtual const int& operator()(size_t sequenceIndex, size_t elementIndex) const = 0;
-    /** @} */
-	
-  public:
-		
-		/**
-		 * @name SequenceContainer methods.
-		 *
-		 * @{
-		 */
-		virtual const std::vector<int>& getContent(const std::string& name) const throw (SequenceNotFoundException) = 0;  
-		virtual std::string toString(const std::string& name) const throw (SequenceNotFoundException) = 0;  
-		virtual const Sequence& getSequence(const std::string& name) const throw (SequenceNotFoundException) = 0;
-		virtual void setSequence(const std::string& name, const Sequence& sequence, bool checkName) throw (Exception) = 0;
-		virtual Sequence* removeSequence(const std::string& name) throw (SequenceNotFoundException, Exception) = 0;
-		virtual void deleteSequence(const std::string& name) throw (SequenceNotFoundException, Exception) = 0;
-		virtual size_t getNumberOfSequences() const = 0;
-		virtual std::vector<std::string> getSequencesNames() const = 0;
-		virtual void setSequencesNames(const std::vector<std::string> & names, bool checkNames) throw (Exception) = 0;
-		virtual const Comments& getComments(const std::string& name) const throw (SequenceNotFoundException) = 0;
-		virtual void setComments(const std::string& name, const Comments& comments) throw (SequenceNotFoundException) = 0;
-		/** @} */
-};
-
-} //end of namespace bpp.
-
-#endif	//_ORDEREDSEQUENCECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/SequenceContainer.h b/src/Bpp/Seq/Container/SequenceContainer.h
deleted file mode 100644
index 85294a7..0000000
--- a/src/Bpp/Seq/Container/SequenceContainer.h
+++ /dev/null
@@ -1,316 +0,0 @@
-//
-// File: SequenceContainer.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Fri Jul 25 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCECONTAINER_H_
-#define _SEQUENCECONTAINER_H_
-
-#include "../Alphabet/Alphabet.h"
-#include "../Sequence.h"
-#include "SequenceContainerExceptions.h"
-#include <Bpp/Clonable.h>
-
-// From the STL:
-#include <string>
-
-namespace bpp
-{
-
-/**
- * @brief The SequenceContainer interface.
- *
- * This interface is the most general one in the container hierarchy.
- * No assumption is made on the sequences in the container (no ordering, no alignment).
- * Sequences may be retrieved using their names, which must be unique.
- *
- * The container is the only one responsible for the allocation/destruction of sequences it
- * contains. This means that any sequence passed to it will be <strong>copied</strong> into the container.
- * The container also provides methods that send const pointers towards these sequences
- * (without performing any copy of the underlying objects).
- *
- * Notes :
- * 1. methods for adding sequences to the container are not declared here
- * (so they can't be used throught this interface),
- * because these methods take sequence container's type specific parameters
- * (i.e. a key for map sequence containers);
- * 2. to delete a sequence from a container, one must use the appropriate method
- * (removeSequence() and deleteSequence()).
- * These methods performs a few check, and properly update pointers.
- * You should never delete a sequence from a container by yourself.
- *
- * @see Sequence
- */
-
-class SequenceContainer:
-  public virtual Clonable
-{
-	public:
-		SequenceContainer() {}
-		virtual ~SequenceContainer() {}
-
-	public:
-		/**
-		 * @brief Get sequence container's alphabet.
-		 *
-		 * @return The alphabet associated to this container.
-		 */
-		virtual const Alphabet* getAlphabet() const = 0;
-		
-		/**
-		 * @brief Get the content of a sequence.
-		 *
-		 * @param name The name of the sequence.
-		 * @return The content of the sequence as a vector of integers.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in the container.
-		 */
-		virtual const std::vector<int>& getContent(const std::string& name) const throw (SequenceNotFoundException) = 0;  
-		
-		/**
-		 * @brief Convert a particular sequence to a string.
-		 *
-		 * @param name The name of the sequence.
-		 * @return A string describing the content of the sequence.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in the container.
-		 */
-		virtual std::string toString(const std::string& name) const throw (SequenceNotFoundException) = 0;  
-
-		/**
-		 * @brief Retrieve a sequence object from the container.
-		 *
-		 * @param name The name of the sequence.
-		 * @return A reference toward the Sequence with corresponding name.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in the container.
-		 */
-		virtual const Sequence& getSequence(const std::string& name) const throw (SequenceNotFoundException) = 0;
-
-		/**
-		 * @brief Check if a sequence with a given name is present in the container.
-		 *
-		 * @param name The name of the sequence.
-		 * @return True if a sequence with the given name is present in the container.
-		 */
-		virtual bool hasSequence(const std::string& name) const = 0;
-
-		/**
-		 * @brief Add a sequence to the container.
-		 *
-		 * @param sequence  The sequence to add.
-		 * @param checkName Tell if the container must check if the name of the sequence
-		 * is already used in the container before adding it.
-		 * @throw Exception Any other kind of exception, if the name of the sequence is
-		 * already used, are whatever else depending on the implementation.
-		 */
-		virtual void addSequence(const Sequence& sequence, bool checkName) throw (Exception) = 0;
-
-		/**
-		 * @brief Replace a sequence in the container.
-		 *
-		 * @param name      The name of the sequence.
-		 * @param sequence  The sequence to add.
-		 * @param checkName Tell if the container must check if the name of the sequence
-		 * is already used in the container before adding it.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in
-		 * the container.
-		 * @throw Exception Any other kind of exception, if the name of the sequence is
-		 * already used, are whatever else depending on the implementation.
-		 */
-		virtual void setSequence(const std::string& name, const Sequence& sequence, bool checkName) throw (Exception) = 0;
-
-		/**
-		 * @brief Extract (and remove) a sequence from the container.
-		 *
-		 * @param name The name of the sequence.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in
-		 * the container.
-		 */
-		virtual Sequence* removeSequence(const std::string& name) throw (SequenceNotFoundException, Exception) = 0;
-		
-		/**
-		 * @brief Delete a sequence of the container.
-		 *
-		 * @param name The name of the sequence.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in
-		 * the container.
-		 */
-		virtual void deleteSequence(const std::string& name) throw (SequenceNotFoundException, Exception) = 0;
-
-		/**
-		 * @brief Get the number of sequences in the container.
-		 *
-		 * @return The number of sequences in the container.
-		 */
-		virtual size_t getNumberOfSequences() const = 0;
-
-		/**
-		 * @brief Get all the names of the sequences in the container.
-		 *
-		 * @return A vector of strings with all sequence names.
-		 */
-		virtual std::vector<std::string> getSequencesNames() const = 0;
-		
-		/**
-		 * @brief Set all sequence names.
-		 *
-		 * @param names A vector of strings with all sequence names.
-		 * Its size must be strictly equal to the the size of the container (the number of
-		 * sequences).
-		 * @param checkNames Tell if the container must check if the name of the sequence
-		 * is already used in the container before adding it.
-		 * @throw Exception If there are redundant names in the input vector.
-		 */
-		virtual void setSequencesNames(const std::vector<std::string>& names, bool checkNames) throw (Exception) = 0;
-
-		/**
-		 * @brief Get comments of a particular sequence.
-		 *
-		 * @param name The name of the sequence.
-		 * @return The comments associated to sequence with name 'name'.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in
-		 * the container.
-		 */
-		virtual const Comments& getComments(const std::string& name) const throw (SequenceNotFoundException) = 0;
-		
-		/**
-		 * @brief Set the comments of a particular sequence.
-		 *
-		 * @param name     The name of the sequence.
-		 * @param comments The comments to set to sequence with name 'name'.
-		 * @throw SequenceNotFoundException If the name does not match any sequence in
-		 * the container.
-		 */
-		virtual void setComments(const std::string& name, const Comments& comments) throw (SequenceNotFoundException) = 0;
-		
-		/**
-		 * @brief Get the comments of this container.
-		 *
-		 * @return The comments associated to this container.
-		 */
-		virtual const Comments& getGeneralComments() const = 0;
-
-		/**
-		 * @brief Set the comments of this container.
-		 *
-		 * @param comments The comments to be associated to this container.
-		 */
-		virtual void setGeneralComments(const Comments& comments) = 0;
-		
-		/**
-		 * @brief Delete the comments associated to this container.
-		 */
-		virtual void deleteGeneralComments() = 0;
-
-		/**
-		 * @brief Delete all sequences in the container.
-		 */
-		virtual void clear() = 0;
-
-		/**
-		 * @brief Return a copy of this container, but with no sequence inside.
-		 *
-		 * This method creates a new SequenceContainer objet.
-		 * The class of this container depends on the derivative class.
-		 *
-		 * @return A new empty container, with the same alphabet as this one.
-		 */
-		virtual SequenceContainer* createEmptyContainer() const = 0;
-
-    /**
-     * @name Provide direct access to sequences content.
-     *
-     * @warning These operators allow you to modifiy the content of the sequences.
-     * No checking is performed for your modifications, so use with care, or
-     * consider using the setContent() methods.
-     *
-     * @{
-     */
-    
-    /**
-     * @brief Element access function.
-     *
-     * Allows direct access to the data stored in the container.
-     * 
-     * @param sequenceName The sequence name.
-     * @param elementIndex The element position within the sequence.
-     * @throw SequenceNotFoundException If no corresponding sequence is found in the container.
-     * @throw IndexOutOfBoundsException If the element position is not valid.
-     */
-    virtual int& valueAt(const std::string& sequenceName, size_t elementIndex) throw (SequenceNotFoundException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Element access function.
-     *
-     * Allows direct access to the data stored in the container.
-     * 
-     * @param sequenceName The sequence name.
-     * @param elementIndex The element position within the sequence.
-     * @throw SequenceNotFoundException If no corresponding sequence is found in the container.
-     * @throw IndexOutOfBoundsException If the element position is not valid.
-     */
-    virtual const int& valueAt(const std::string& sequenceName, size_t elementIndex) const throw (SequenceNotFoundException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Element access operator.
-     *
-     * Allows direct access to the data stored in the container.
-     * This method is faster then the valueAt function, but input
-     * parameters are not checked!
-     * 
-     * @param sequenceName The sequence name.
-     * @param elementIndex The element position within the sequence.
-     */
-    virtual int& operator()(const std::string& sequenceName, size_t elementIndex) = 0;
-
-    /**
-     * @brief Element access operator.
-     *
-     * Allows direct access to the data stored in the container.
-     * This method is faster then the valueAt function, but input
-     * parameters are not checked!
-     * 
-     * @param sequenceName The sequence name.
-     * @param elementIndex The element position within the sequence.
-     */
-    virtual const int& operator()(const std::string& sequenceName, size_t elementIndex) const = 0;
-    /** @} */
-};
-
-} //end of namespace bpp.
-
-#endif	// _SEQUENCECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/SequenceContainerExceptions.h b/src/Bpp/Seq/Container/SequenceContainerExceptions.h
deleted file mode 100644
index c4f612d..0000000
--- a/src/Bpp/Seq/Container/SequenceContainerExceptions.h
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-// File: SequenceContainerExceptions.h
-// Created by: Julien Dutheil
-// Created on: Mon Nov  3 17:00:05 2003
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCECONTAINEREXCEPTIONS_H_
-#define _SEQUENCECONTAINEREXCEPTIONS_H_
-
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-class SequenceContainer;
-
-/**
- * @brief Exception thrown when a sequence is not found The sequence not found exception base class.
- */
-class SequenceNotFoundException :
-  public Exception
-{
-
-	protected:
-
-		/**
-		 * @brief The id of the sequence that was to be found.
-		 */
-		const std::string id;
-	
-	public:
-
-		/**
-		 * @brief Build a new SequenceNotFoundException object.
-		 *
-		 * @param text  A message to be passed to the exception hierarchy.
-		 * @param seqId A the id of the sequence that was to be found.
-		 */
-		SequenceNotFoundException(const char * text, const char * seqId = "") :
-    	Exception("SequenceNotFoundException: " + std::string(text) + "(" + seqId + ")"),
-	    id(seqId) {};
-
-		/**
-		 * @brief Build a new SequenceNotFoundException object.
-		 *
-		 * @param text  A message to be passed to the exception hierarchy.
-		 * @param seqId A the id of the sequence that was to be found.
-		 */
-		SequenceNotFoundException(const std::string & text, const std::string & seqId = "") :
-    	Exception("SequenceNotFoundException: " + text + "(" + seqId + ")"),
-	    id(seqId) {};
-	
-		// Class destructor
-		virtual ~SequenceNotFoundException() throw() {}
-	
-	public:
-
-		/**
-		 * @brief Get the id of the sequence that was to be found.
-		 *
-		 * @return The id of the sequence that was to be found.
-		 */
-		virtual const std::string getSequenceId() const { return id; }
-};
-
-/**
- * @brief Exception thrown when an empty container is found.
- */
-class EmptyContainerException :
-  public Exception
-{
-
-	private:
-
-		/**
-		 * @brief The empty container.
-     */
-		const SequenceContainer *container_;
-	
-	public:
-
-		/**
-		 * @brief Build a new EmptyContainerException object.
-		 *
-		 * @param text  A message to be passed to the exception hierarchy.
-		 * @param container The empty container.
-		 */
-		EmptyContainerException(const std::string& text, const SequenceContainer* container) :
-    	Exception("EmptyContainerException: " + text),
-	    container_(container) {};
-      
-    EmptyContainerException(const EmptyContainerException& ece):
-      Exception(ece), container_(ece.container_) {}
-	
-    EmptyContainerException& operator=(const EmptyContainerException& ece)
-    {
-      Exception::operator=(ece);
-      container_ = ece.container_;
-      return *this;
-    }
-	
-		// Class destructor
-		virtual ~EmptyContainerException() throw() {}
-	
-	public:
-
-		/**
-		 * @return The empty container.
-		 */
-		virtual const SequenceContainer* getContainer() const { return container_; }
-};
-
-} //end of namespace bpp.
-
-#endif	//_SEQUENCECONTAINEREXCEPTIONS_H_
-
diff --git a/src/Bpp/Seq/Container/SequenceContainerTools.cpp b/src/Bpp/Seq/Container/SequenceContainerTools.cpp
deleted file mode 100644
index f0cb500..0000000
--- a/src/Bpp/Seq/Container/SequenceContainerTools.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-//
-// File: SequenceContainerTools.cpp
-// Created by: Julien Dutheil
-// Created on: Sat Oct  4 09:18:34 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "SequenceContainerTools.h"
-#include "VectorSequenceContainer.h"
-#include "../Alphabet/CodonAlphabet.h"
-
-// From bpp-core:
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-/******************************************************************************/
-
-SequenceContainer* SequenceContainerTools::createContainerOfSpecifiedSize(const Alphabet* alphabet, size_t size)
-{
-  VectorSequenceContainer* vsc = new VectorSequenceContainer(alphabet);
-  for (size_t i = 0; i < size; ++i)
-  {
-    vsc->addSequence(BasicSequence(TextTools::toString(i), "", alphabet), false);
-  }
-  return vsc;
-}
-
-/******************************************************************************/
-
-SequenceContainer* SequenceContainerTools::createContainerWithSequenceNames(
-  const Alphabet* alphabet,
-  const vector<string>& seqNames)
-throw (Exception)
-{
-  SequenceContainer* sc = createContainerOfSpecifiedSize(alphabet, seqNames.size());
-  sc->setSequencesNames(seqNames, true);
-  return sc;
-}
-
-/******************************************************************************/
-
-void SequenceContainerTools::getSelectedSequences(
-  const OrderedSequenceContainer& sequences,
-  const SequenceSelection& selection,
-  SequenceContainer& outputCont) throw (Exception)
-{
-  bool checkNames = outputCont.getNumberOfSequences() > 0;
-  for (size_t i = 0; i < selection.size(); i++)
-  {
-    outputCont.addSequence(sequences.getSequence(selection[i]), checkNames);
-  }
-}
-
-/******************************************************************************/
-
-void SequenceContainerTools::getSelectedSequences(
-  const SequenceContainer& sequences,
-  const std::vector<std::string>& selection,
-  SequenceContainer& outputCont, bool strict) throw (Exception)
-{
-  bool checkNames = outputCont.getNumberOfSequences() > 0;
-  for (size_t i = 0; i < selection.size(); i++)
-  {
-    if (strict)
-    {
-      outputCont.addSequence(sequences.getSequence(selection[i]), checkNames);
-    }
-    else
-    {
-      if (sequences.hasSequence(selection[i]))
-        outputCont.addSequence(sequences.getSequence(selection[i]), checkNames);
-    }
-  }
-}
-
-/******************************************************************************/
-
-void SequenceContainerTools::keepOnlySelectedSequences(
-  OrderedSequenceContainer& sequences,
-  const SequenceSelection& selection)
-{
-  vector<string> names = sequences.getSequencesNames();
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    // We need to do this because after removal the indices will not be the same!
-    // another solution would be to sort decreasingly the indices...
-    bool test = false;
-    for (size_t j = 0; j < selection.size() && !test; j++)
-    {
-      test = (selection[j] == i);
-    }
-    if (!test)
-      sequences.deleteSequence(names[i]);
-    // WARNING: what if selection contains several times the same indice? ...
-  }
-}
-
-/******************************************************************************/
-
-bool SequenceContainerTools::sequencesHaveTheSameLength(const SequenceContainer& sequences)
-{
-  vector<string> seqNames = sequences.getSequencesNames();
-  if (seqNames.size() <= 1)
-    return true;
-  size_t length = sequences.getSequence(seqNames[0]).size();
-  for (size_t i = 1; i < seqNames.size(); i++)
-  {
-    if (sequences.getSequence(seqNames[i]).size() != length)
-      return false;
-  }
-  return true;
-}
-
-/******************************************************************************/
-
-void SequenceContainerTools::getFrequencies(const SequenceContainer& sequences, std::map<int, double>& f, double pseudoCount)
-{
-  double n = 0;
-  vector<string> names = sequences.getSequencesNames();
-  for (size_t j = 0; j < names.size(); j++)
-  {
-    vector<int> seq = sequences.getContent(names[j]);
-    for (size_t i = 0; i < seq.size(); i++)
-    {
-      f[seq[i]]++;
-    }
-    n += static_cast<double>(seq.size());
-  }
-
-  if (pseudoCount != 0)
-  {
-    const Alphabet* pA = sequences.getAlphabet();
-    for (int i = 0; i < static_cast<int>(pA->getSize()); i++)
-    {
-      f[i] += pseudoCount;
-    }
-
-    n += pseudoCount * static_cast<double>(pA->getSize());
-  }
-
-  for (map<int, double>::iterator i = f.begin(); i != f.end(); i++)
-  {
-    i->second = i->second / n;
-  }
-}
-
-/******************************************************************************/
-
-void SequenceContainerTools::getCounts(const SequenceContainer& sequences, std::map<int, int>& f)
-{
-  size_t n = 0;
-  vector<string> names = sequences.getSequencesNames();
-  for (size_t j = 0; j < names.size(); j++)
-  {
-    vector<int> seq = sequences.getContent(names[j]);
-    for (size_t i = 0; i < seq.size(); i++)
-    {
-      f[seq[i]]++;
-    }
-    n += seq.size();
-  }
-}
-
-/******************************************************************************/
-
-SequenceContainer* SequenceContainerTools::getCodonPosition(const SequenceContainer& sequences, size_t pos) throw (AlphabetException)
-{
-  const CodonAlphabet* calpha = dynamic_cast<const CodonAlphabet*>(sequences.getAlphabet());
-  if (!calpha)
-    throw AlphabetException("SequenceContainerTools::getCodonPosition. Input sequences should be of type codon.");
-  vector<string> names = sequences.getSequencesNames();
-  VectorSequenceContainer* newcont = new VectorSequenceContainer(calpha->getNucleicAlphabet());
-  for (size_t j = 0; j < names.size(); j++)
-  {
-    vector<int> seq = sequences.getContent(names[j]);
-    vector<int> newseq(seq.size());
-    for (size_t i = 0; i < seq.size(); i++)
-    {
-      newseq[i] = calpha->getNPosition(seq[i], pos);
-    }
-    BasicSequence s(names[j], newseq, sequences.getComments(names[j]), calpha->getNucleicAlphabet());
-    newcont->addSequence(s);
-  }
-  return newcont;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/SequenceContainerTools.h b/src/Bpp/Seq/Container/SequenceContainerTools.h
deleted file mode 100644
index def3050..0000000
--- a/src/Bpp/Seq/Container/SequenceContainerTools.h
+++ /dev/null
@@ -1,299 +0,0 @@
-//
-// File: SequenceContainerTools.h
-// Created by: Julien Dutheil
-//             Sylvain Gaillard
-// Created on: Sat Oct  4 09:18:34 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use,
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info".
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability.
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or
-data to be ensured and,  more generally, to use and operate it in the
-same conditions as regards security.
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCECONTAINERTOOLS_H_
-#define _SEQUENCECONTAINERTOOLS_H_
-
-// From the STL:
-#include <string>
-#include <vector>
-#include <map>
-#include <memory>
-
-#include "SequenceContainer.h"
-#include "OrderedSequenceContainer.h"
-
-namespace bpp
-{
-
-  typedef std::vector<size_t> SequenceSelection;
-  typedef std::vector<size_t> SiteSelection;
-/**
- * @brief Utilitary methods dealing with sequence containers.
- */
-class SequenceContainerTools
-{
-
-  public:
-    SequenceContainerTools() {}
-     virtual ~SequenceContainerTools() {}
-  
-  public:
-    /**
-     * @brief Create a container with @f$n at f$ void sequences.
-     *
-     * A new VectorSequenceContainer with the specified alphabet is created.
-     * The destruction of this new container is up to the user.
-     * Sequences have name "0", "1",... "n-1" and no content and comments.
-     *
-     * @param alphabet The alphabet to use in the container.
-     * @param size     The number of sequences in the container.
-     * @return A pointer toward a newly created container.
-     */
-    static SequenceContainer* createContainerOfSpecifiedSize(const Alphabet* alphabet, size_t size);
-
-    /**
-     * @brief Create a container with specified names.
-     *
-     * A new VectorSequenceContainer with the specified alphabet is created.
-     * The destruction of this new container is up to the user.
-     * Sequences have the specified names and no content and comments.
-     *
-     * @param alphabet The alphabet to use in the container.
-     * @param seqNames The names of the sequences.
-     * @return A pointer toward a newly created container.
-     * @throw Exception If two sequence names are not unique.
-     */
-    static SequenceContainer* createContainerWithSequenceNames(
-      const Alphabet* alphabet,
-      const std::vector<std::string>& seqNames)
-      throw (Exception);
- 
-    /**
-     * @brief Generic function which creates a new container from another one,
-     * by specifying the class of sequence to be stored.
-     *
-     * Compared to several copy constructors, this function allows to change the class of
-     * the inner sequence class used for storing sequences.
-     * The function used the addSequence method, so that it can also be used to
-     * concatenate containers.
-     *
-     * @param input The container to copy.
-     * @param output The container where new sequences will be appended.
-     */
-    template<class ContFrom, class ContTo, class Seq>
-    static void convertContainer(const ContFrom& input, ContTo& output) {
-      for (size_t i = 0; i < input.getNumberOfSequences(); ++i) {
-        std::auto_ptr<Seq> seq(new Seq(input.getSequence(i)));
-        output.addSequence(*seq);
-      }
-    }
-
-    /**
-     * @brief Add a specified set of sequences from a container to another.
-     *
-     * Sequences are specified by their position, beginning at 0.
-     * Name verification will be performed, only if the output container is not empty,
-     * based on the assumption that the container passed as argument is a correct one.
-     * Redundant selection is not checked, so be careful with what you're doing!
-     *
-     * @author Julien Dutheil
-     *
-     * @param sequences The container from wich sequences are to be taken.
-     * @param selection The positions of all sequences to retrieve.
-     * @param outputCont A container where the selection should be added.
-     * @throw Exception In case of bad sequence name, alphabet mismatch, etc.
-     */
-    static void getSelectedSequences(const OrderedSequenceContainer& sequences, const SequenceSelection& selection, SequenceContainer& outputCont) throw (Exception);
-
-    /**
-     * @brief Add a specified set of sequences from a container to another.
-     *
-     * Sequences are specified by their names.
-     * Name verification will be performed, only if the output container is not empty,
-     * based on the assumption that the container passed as argument is a correct one.
-     * Redundant selection is not checked, so be careful with what you're doing!
-     *
-     * @author Julien Dutheil
-     *
-     * @param sequences The container from wich sequences are to be taken.
-     * @param selection The names of all sequences to retrieve.
-     * @param outputCont A container where the selection should be added.
-     * @param strict If yes, trying to select a sequence that is not present
-     * will raise an exception. If no, only available sequence will be added.
-     * @throw Exception In case of bad sequence name, alphabet mismatch, etc.
-     */
-    static void getSelectedSequences(const SequenceContainer& sequences, const std::vector<std::string>& selection, SequenceContainer& outputCont, bool strict = true) throw (Exception);
-
-    /**
-     * @brief Remove all sequences that are not in a given selection from a given container.
-     *
-     * A new VectorSequenceContainer is created with specified sequences.
-     * The destruction of the container is up to the user.
-     * Sequences are specified by their position, beginning at 0.
-     * Redundant selection is not checked, so be careful with what you're doing!
-     *
-     * @param sequences The container from wich sequences are to be taken.
-     * @param selection The positions of all sequences to retrieve.
-     * @return A new container with all selected sequences.
-     */
-    static void keepOnlySelectedSequences(OrderedSequenceContainer& sequences, const SequenceSelection& selection);
-    
-    /**
-     * @brief Check if all sequences in a SequenceContainer have the same length.
-     *
-     * @param sequences The container to check.
-     * @return True is all sequence have the same length.
-     */
-    static bool sequencesHaveTheSameLength(const SequenceContainer& sequences);
-  
-    /**
-     * @brief Compute base counts
-     *
-     * Example of usage: getting the GC count from a sequence container.
-     * <code>
-     *   map<int, int> counts;
-     *  SequenceContainerTools::getCounts(myContainer, counts); //My container is previously defined.
-     *   int GCcontent = counts[1] + counts[2] ;
-     * </code>
-     *
-     * States are stored as their int code.
-     */
-
-  static void getCounts(const SequenceContainer& sequences, std::map<int, int>&);
-
-  /**
-   * @brief Compute base frequencies.
-   *
-   * Example of usage: getting the GC content from a sequence container.
-   * <code>
-   *  map<int, double> freqs;
-   *  SequenceContainerTools::getFrequencies(myContainer, freqs); //My container is previously defined.
-   *   double GCcontent = (freqs[1] + freqs[2]) / (freqs[0] + freqs[1] + freqs[2] + freqs[3]);
-   * </code>
-   *
-   * States are stored as their int code.
-   */
-  
-  static void  getFrequencies(const SequenceContainer& sequences, std::map<int, double>& f, double pseudoCount = 0);
-  
-    /**
-     * @brief Append all the sequences of a SequenceContainer to the end of another.
-     *
-     * @param seqCont1 The SequenceContainer in which the sequences will be added.
-     * @param seqCont2 The SequenceContainer from which the sequences are taken.
-     * @param checkNames Tell if the sequence names should be check for unicity.
-     */
-    static void append(SequenceContainer& seqCont1, const SequenceContainer& seqCont2, bool checkNames = true)
-    throw (Exception)
-    {
-      std::vector<std::string> seqNames = seqCont2.getSequencesNames();
-      for (size_t i = 0; i < seqNames.size(); i++)
-        seqCont1.addSequence(seqCont2.getSequence(seqNames[i]), checkNames);
-    }
-    /**
-     * @brief Append all the sequences of a SequenceContainer to the end of another, OrderedSequenceContainer implementation.
-     *
-     * @param seqCont1 The SequenceContainer in which the sequences will be added.
-     * @param seqCont2 The SequenceContainer from which the sequences are taken.
-     * @param checkNames Tell if the sequence names should be check for unicity.
-     */
-    static void append(SequenceContainer& seqCont1, const OrderedSequenceContainer& seqCont2, bool checkNames=true)
-    throw (Exception)
-    {
-      for (size_t i = 0; i < seqCont2.getNumberOfSequences(); i++)
-        seqCont1.addSequence(seqCont2.getSequence(i), checkNames);
-    }
-    
-    /**
-     * @brief Concatenate the sequences from two containers.
-     *
-     * This method will not check the original sequence names for unicity. If sequences do not have a unique name,
-     * then the resulting merged container will contain the first sequence with the given duplicated name.
-     *
-     * @author Julien Dutheil
-     *
-     * @param seqCont1 First container.
-     * @param seqCont2 Second container. This container must contain sequences with the same names as in seqcont1.
-     * Additional sequences will be ignored.
-     * @param outputCont Output sequence container to which concatenated sequences will be added.
-     * @throw AlphabetMismatchException If the alphabet in the 3 containers do not match.
-     */
-    static void merge(const SequenceContainer& seqCont1, const SequenceContainer& seqCont2, SequenceContainer& outputCont)
-    throw (Exception)
-    {
-      if (seqCont1.getAlphabet()->getAlphabetType() != seqCont2.getAlphabet()->getAlphabetType())
-        throw AlphabetMismatchException("SequenceContainerTools::merge.", seqCont1.getAlphabet(), seqCont2.getAlphabet());
-
-      std::vector<std::string> seqNames = seqCont1.getSequencesNames();
-      for (size_t i = 0; i < seqNames.size(); i++)
-      {
-        BasicSequence tmp = seqCont1.getSequence(seqNames[i]);
-        tmp.append(seqCont2.getContent(seqNames[i]));
-        outputCont.addSequence(tmp, false);
-      }
-    }
-
-    /**
-     * @brief Convert a SequenceContainer with a new alphabet.
-     *
-     * This method assume that the original container has proper sequence names.
-     * Names will be checked only if the output container is not empty.
-     * @param seqCont The container to convert.
-     * @param outputCont A container (most likely empty) with an alphabet into which the container will be converted.
-     */
-    static void convertAlphabet(const SequenceContainer& seqCont, SequenceContainer& outputCont)
-    throw (Exception)
-    {  
-      std::vector<std::string> seqNames = seqCont.getSequencesNames();
-      bool checkNames = outputCont.getNumberOfSequences() > 0;
-      for (size_t i = 0; i < seqNames.size(); i++)
-      {
-        BasicSequence seq(seqNames[i], seqCont.toString(seqNames[i]), outputCont.getAlphabet());
-        outputCont.addSequence(seq, checkNames);
-      }
-    }
-
-    /**
-     * @brief Extract a certain position (1, 2 or 3) from a container of codon sequences and returns the resulting nucleotide container.
-     *
-     * @param sequences The input sequence container, with codon alphabet.
-     * @param pos       The codon position to retrieve.
-     * @return          A SequenceContainer with a nucleotide alphabet.
-     * @throw AlphabetException If input sequences are not registered with a codon alphabet.
-     */
-    static SequenceContainer* getCodonPosition(const SequenceContainer& sequences, size_t pos) throw (AlphabetException);
-
-};
-
-} //end of namespace bpp.
-
-#endif  //_SEQUENCECONTAINERTOOLS_H_
-
diff --git a/src/Bpp/Seq/Container/SiteContainer.h b/src/Bpp/Seq/Container/SiteContainer.h
deleted file mode 100644
index 9da0f9c..0000000
--- a/src/Bpp/Seq/Container/SiteContainer.h
+++ /dev/null
@@ -1,183 +0,0 @@
-//
-// File SiteContainer.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _SITECONTAINER_H_
-#define _SITECONTAINER_H_
-
-#include "../Site.h"
-#include "OrderedSequenceContainer.h"
-#include "SequenceContainerExceptions.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/VectorTools.h>
-
-// From the STL:
-#include <string>
-
-namespace bpp
-{
-/**
- * @brief The SiteContainer interface.
- *
- * Container implementing the SiteContainer interface deal with <em>aligned</em> sequences.
- * This interface provides methods to retrieve, add or set sites in the alignment.
- * As for SequenceContainers, the maintenance of Sites is up to the container.
- * All site objects are cloned befored being added and retrieved.
- * All sites stored are deleted in the destructor of the container or after having called the deleteSite() method.
- */
-class SiteContainer :
-  public virtual OrderedSequenceContainer
-{
-public:
-  SiteContainer() {}
-  virtual ~SiteContainer() {}
-
-  SiteContainer* clone() const = 0;
-
-public:
-  /**
-   * @brief Get a site from the container.
-   *
-   * @param siteIndex The position of the site in the container.
-   * @return A site objet corresponding to site i in the alignment.
-   * @throw IndexOutOfBoundsException If the specified site does not exists.
-   */
-  virtual const Site& getSite(size_t siteIndex) const throw (IndexOutOfBoundsException) = 0;
-
-  /**
-   * @brief Set a site in the container.
-   *
-   * @param siteIndex     The position of the site in the container.
-   * @param site          The site to set.
-   * @param checkPosition Look if the position of the new site match a position attribute in the container.
-   * @throw Exception If the specified site does not exists or is not correct.
-   */
-  virtual void setSite(size_t siteIndex, const Site& site, bool checkPosition) throw (Exception) = 0;
-
-  /**
-   * @brief Add a site in the container.
-   *
-   * @param site          The site to add.
-   * @param checkPosition Look if the position of the new site match a position attribute in the container.
-   * @throw Exception If the specified site does not exists or is not correct.
-   */
-  virtual void addSite(const Site& site, bool checkPosition) throw (Exception) = 0;
-
-  /**
-   * @brief Add a site in the container.
-   *
-   * @param site          The site to add.
-   * @param position      The new position of the site, to superseed the one in 'site'.
-   * @param checkPosition Look if the position of the new site match a position attribute in the container.
-   * @throw Exception If the specified site does not exists or is not correct.
-   */
-  virtual void addSite(const Site& site, int position, bool checkPosition) throw (Exception) = 0;
-
-  /**
-   * @brief Add a site in the container.
-   *
-   * @param site          The site to add.
-   * @param siteIndex     The position where to insert the site.
-   * @param checkPosition Look if the position of the new site match a position attribute in the container.
-   * @throw Exception If the specified site does not exists or is not correct.
-   */
-  virtual void addSite(const Site& site, size_t siteIndex, bool checkPosition) throw (Exception) = 0;
-
-  /**
-   * @brief Add a site in the container.
-   *
-   * @param site          The site to add.
-   * @param siteIndex     The position where to insert the site.
-   * @param position      The new position of the site, to superseed the one in 'site'.
-   * @param checkPosition Look if the position of the new site match a position attribute in the container.
-   * @throw Exception If the specified site does not exists or is not correct.
-   */
-  virtual void addSite(const Site& site, size_t siteIndex, int position, bool checkPosition) throw (Exception) = 0;
-
-  /**
-   * @brief Remove a site from the container.
-   *
-   * The site is not deleted, a pointer toward it is returned.
-   *
-   * @param siteIndex The position of the site in the container.
-   * @return A pointer toward site i in the alignment.
-   * @throw IndexOutOfBoundsException If the specified site does not exists.
-   */
-  virtual Site* removeSite(size_t siteIndex) throw (IndexOutOfBoundsException, Exception) = 0;
-
-  /**
-   * @brief Delete a site in the container.
-   *
-   * @param siteIndex The position of the site in the container.
-   * @throw IndexOutOfBoundsException If the specified site does not exists.
-   */
-  virtual void deleteSite(size_t siteIndex) throw (IndexOutOfBoundsException, Exception) = 0;
-
-  /**
-   * @brief Delete a continuous range of sites in the container.
-   *
-   * @param siteIndex The position of the first site in the container.
-   * @param length The length of the region to delete, starting at pposition siteIndex.
-   * @throw IndexOutOfBoundsException If the specified range is not valid.
-   */
-  virtual void deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException, Exception) = 0;
-
-
-  /**
-   * @brief Get the number of sites in the container.
-   *
-   * @return The number of sites in the container.
-   */
-  virtual size_t getNumberOfSites() const = 0;
-
-  /**
-   * @brief Set all positions attributes.
-   */
-  virtual void reindexSites() = 0;
-
-  /**
-   * @brief Get all position attributes of sites.
-   *
-   * @return A vector with all site positions.
-   */
-  virtual Vint getSitePositions() const = 0;
-};
-} // end of namespace bpp.
-
-#endif  // _SITECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/SiteContainerIterator.cpp b/src/Bpp/Seq/Container/SiteContainerIterator.cpp
deleted file mode 100644
index a5d5039..0000000
--- a/src/Bpp/Seq/Container/SiteContainerIterator.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-//
-// File: SiteContainerIterator.cpp
-// Created by: Julien Dutheil
-// Created on: Sun Oct 19 12:47:16 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SiteContainerIterator.h"
-#include "../SiteTools.h"
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-/******************************************************************************/
-	
-AbstractSiteContainerIterator::AbstractSiteContainerIterator(const SiteContainer& sites) :
-  sites_(&sites),
-  currentPosition_(0)
-{}
-
-/******************************************************************************/
-	
-SimpleSiteContainerIterator::SimpleSiteContainerIterator(const SiteContainer& sites): AbstractSiteContainerIterator(sites) {}
-
-const Site* SimpleSiteContainerIterator::nextSite()
-{
-	const Site* s = &sites_->getSite(static_cast<size_t>(currentPosition_));
-	currentPosition_++;
-	return s;
-}
-
-bool SimpleSiteContainerIterator::hasMoreSites() const
-{
-	return currentPosition_ < static_cast<int>(sites_->getNumberOfSites());
-}
-
-/******************************************************************************/
-	
-NoGapSiteContainerIterator::NoGapSiteContainerIterator(const SiteContainer& sites): AbstractSiteContainerIterator(sites)
-{
-	currentPosition_ = nextSiteWithoutGapPosition(-1);
-}
-
-const Site* NoGapSiteContainerIterator::nextSite()
-{
-	const Site* s = &sites_->getSite(static_cast<size_t>(currentPosition_));
-	currentPosition_ = nextSiteWithoutGapPosition(currentPosition_);
-	return s;
-}
-
-bool NoGapSiteContainerIterator::hasMoreSites() const
-{
-	return currentPosition_ < static_cast<int>(sites_->getNumberOfSites());
-}
-
-int NoGapSiteContainerIterator::nextSiteWithoutGapPosition(int current) const
-{
-	size_t position = static_cast<size_t>(current + 1);
-	while (position < sites_->getNumberOfSites() && SiteTools::hasGap(sites_->getSite(position)))
-    position++;
-	return static_cast<int>(position);
-}
-
-int NoGapSiteContainerIterator::previousSiteWithoutGapPosition(int current) const
-{
-	int position = current - 1;
-	while (position >= 0 && SiteTools::hasGap(sites_->getSite(static_cast<size_t>(position))))
-    position--;
-	return position;
-}
-
-/******************************************************************************/
-	
-CompleteSiteContainerIterator::CompleteSiteContainerIterator(const SiteContainer & sites): AbstractSiteContainerIterator(sites)
-{
-	currentPosition_ = nextCompleteSitePosition(-1);
-}
-
-const Site* CompleteSiteContainerIterator::nextSite()
-{
-	const Site* s = &sites_->getSite(static_cast<size_t>(currentPosition_));
-	currentPosition_ = nextCompleteSitePosition(currentPosition_);
-	return s;
-}
-
-bool CompleteSiteContainerIterator::hasMoreSites() const
-{
-	return currentPosition_ < static_cast<int>(sites_->getNumberOfSites());
-}
-
-int CompleteSiteContainerIterator::nextCompleteSitePosition(int current) const
-{
-  size_t position = static_cast<size_t>(current + 1);
-	while (position < sites_->getNumberOfSites() && !SiteTools::isComplete(sites_->getSite(position)))
-    position++;
-	return static_cast<int>(position);
-}
-
-int CompleteSiteContainerIterator::previousCompleteSitePosition(int current) const
-{
-  int position = current - 1;
-	while (position >= 0 && !SiteTools::isComplete(sites_->getSite(static_cast<size_t>(position))))
-    position --;
-	return position;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/SiteContainerIterator.h b/src/Bpp/Seq/Container/SiteContainerIterator.h
deleted file mode 100644
index d2b1fa8..0000000
--- a/src/Bpp/Seq/Container/SiteContainerIterator.h
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-// File: SiteContainerIterator.h
-// Created by: Julien Dutheil
-// Created on: Sun Oct 19 12:47:16 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SITECONTAINERITERATOR_H_
-#define _SITECONTAINERITERATOR_H_
-
-#include "../Site.h"
-#include "../SiteIterator.h"
-#include "SiteContainer.h"
-
-namespace bpp
-{
-
-/**
- * @brief Partial implementation of the SiteIterator interface, allowing to loop over a site container.
- */
-class AbstractSiteContainerIterator :
-  public virtual ConstSiteIterator
-{
-	protected:
-		const SiteContainer* sites_;
-		int currentPosition_;
-	
-	public:
-		AbstractSiteContainerIterator(const SiteContainer& sites);
-		
-    AbstractSiteContainerIterator(const AbstractSiteContainerIterator& asi) :
-      sites_(asi.sites_),
-      currentPosition_(asi.currentPosition_) {}
-    
-    AbstractSiteContainerIterator& operator=(const AbstractSiteContainerIterator& asi)
-    {
-      sites_ = asi.sites_;
-      currentPosition_ = asi.currentPosition_;
-      return *this;
-    }
-
-		virtual ~AbstractSiteContainerIterator() {}
-	
-};
-
-/**
- * @brief Loop over all sites in a SiteContainer.
- */
-class SimpleSiteContainerIterator: public AbstractSiteContainerIterator
-{
-	public:
-		SimpleSiteContainerIterator(const SiteContainer& sites);
-		virtual ~SimpleSiteContainerIterator() {}
-	
-	public:
-		const Site* nextSite();
-		bool hasMoreSites() const;
-};
-
-/**
- * @brief Loop over all sites without gaps in a SiteContainer.
- */
-class NoGapSiteContainerIterator: public AbstractSiteContainerIterator
-{
-	public:
-		NoGapSiteContainerIterator(const SiteContainer & sites);
-		virtual ~NoGapSiteContainerIterator() {}
-	
-	public:
-		const Site* nextSite();
-		bool hasMoreSites() const;
-		int nextSiteWithoutGapPosition(int current) const;
-		int previousSiteWithoutGapPosition(int current) const;
-};
-
-/**
- * @brief Loop over all complete sites in a SiteContainer
- * (i.e. sites without gap and unresolved characters).
- */
-class CompleteSiteContainerIterator: public AbstractSiteContainerIterator
-{
-	public:
-		CompleteSiteContainerIterator(const SiteContainer & sites);
-		virtual ~CompleteSiteContainerIterator() {}
-	
-	public:
-		const Site * nextSite();
-		bool hasMoreSites() const;
-		int nextCompleteSitePosition(int current) const;
-		int previousCompleteSitePosition(int current) const;
-};
-
-} //end of namespace bpp.
-
-#endif	//_SITEITERATOR_H_
-
diff --git a/src/Bpp/Seq/Container/SiteContainerTools.cpp b/src/Bpp/Seq/Container/SiteContainerTools.cpp
deleted file mode 100644
index afc51c3..0000000
--- a/src/Bpp/Seq/Container/SiteContainerTools.cpp
+++ /dev/null
@@ -1,1082 +0,0 @@
-//
-// File: SiteContainerTools.cpp
-// Created by: Julien Dutheil
-//             Sylvain Glémin
-// Created on: Fri Dec 12 18:55:06 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "SiteContainerTools.h"
-#include "SequenceContainerTools.h"
-#include "VectorSiteContainer.h"
-#include "SiteContainerIterator.h"
-#include "../SiteTools.h"
-#include "../CodonSiteTools.h"
-#include "../Alphabet/AlphabetTools.h"
-#include "../SequenceTools.h"
-#include <Bpp/App/ApplicationTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <vector>
-#include <deque>
-#include <string>
-
-using namespace std;
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::getSitesWithoutGaps(const SiteContainer& sites)
-{
-  vector<string> seqNames = sites.getSequencesNames();
-  VectorSiteContainer* noGapCont = new VectorSiteContainer(seqNames.size(), sites.getAlphabet());
-  noGapCont->setSequencesNames(seqNames, false);
-  NoGapSiteContainerIterator ngsi(sites);
-  while (ngsi.hasMoreSites())
-  {
-    noGapCont->addSite(*ngsi.nextSite());
-  }
-  return noGapCont;
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::getCompleteSites(const SiteContainer& sites)
-{
-  vector<string> seqNames = sites.getSequencesNames();
-  VectorSiteContainer* noGapCont = new VectorSiteContainer(seqNames.size(), sites.getAlphabet());
-  noGapCont->setSequencesNames(seqNames, false);
-  CompleteSiteContainerIterator csi(sites);
-  while (csi.hasMoreSites())
-  {
-    noGapCont->addSite(*csi.nextSite());
-  }
-  return noGapCont;
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::getSelectedSites(
-  const SiteContainer& sequences,
-  const SiteSelection& selection)
-{
-  vector<string> seqNames = sequences.getSequencesNames();
-  VectorSiteContainer* sc = new VectorSiteContainer(seqNames.size(), sequences.getAlphabet());
-  sc->setSequencesNames(seqNames, false);
-  for (unsigned int i = 0; i < selection.size(); i++)
-  {
-    sc->addSite(sequences.getSite(selection[i]), false);
-    // We do not check names, we suppose that the container passed as an argument is correct.
-    // WARNING: what if selection contains many times the same indice? ...
-  }
-  sc->setGeneralComments(sequences.getGeneralComments());
-  return sc;
-}
-
-/******************************************************************************/
-SiteContainer* SiteContainerTools::getSelectedPositions(
-  const SiteContainer& sequences,
-  const SiteSelection& selection)
-{
-  size_t wsize = sequences.getAlphabet()->getStateCodingSize();
-  if (wsize > 1)
-  {
-    if (selection.size() % wsize != 0)
-      throw IOException("SiteContainerTools::getSelectedPositions: Positions selection is not compatible with the alphabet in use in the container.");
-    SiteSelection selection2;
-    for (size_t i = 0; i < selection.size(); i += wsize)
-    {
-      if (selection[i] % wsize != 0)
-        throw IOException("SiteContainerTools::getSelectedPositions: Positions selection is not compatible with the alphabet in use in the container.");
-
-      for (size_t j = 1; j < wsize; ++j)
-      {
-        if (selection[i + j] != (selection[i + j - 1] + 1))
-          throw IOException("SiteContainerTools::getSelectedPositions: Positions selection is not compatible with the alphabet in use in the container.");
-      }
-      selection2.push_back(selection[i] / wsize);
-    }
-    return getSelectedSites(sequences, selection2);
-  }
-  else
-  {
-    return getSelectedSites(sequences, selection);
-  }
-}
-
-/******************************************************************************/
-
-Sequence* SiteContainerTools::getConsensus(const SiteContainer& sc, const std::string& name, bool ignoreGap, bool resolveUnknown)
-{
-  Vint consensus;
-  SimpleSiteContainerIterator ssi(sc);
-  const Site* site;
-  while (ssi.hasMoreSites())
-  {
-    site = ssi.nextSite();
-    map<int, double> freq;
-    SiteTools::getFrequencies(*site, freq, resolveUnknown);
-    double max = 0;
-    int cons = -1; // default result
-    if (ignoreGap)
-    {
-      for (map<int, double>::iterator it = freq.begin(); it != freq.end(); it++)
-      {
-        if (it->second > max && it->first != -1)
-        {
-          max = it->second;
-          cons = it->first;
-        }
-      }
-    }
-    else
-    {
-      for (map<int, double>::iterator it = freq.begin(); it != freq.end(); it++)
-      {
-        if (it->second > max)
-        {
-          max = it->second;
-          cons = it->first;
-        }
-      }
-    }
-    consensus.push_back(cons);
-  }
-  Sequence* seqConsensus = new BasicSequence(name, consensus, sc.getAlphabet());
-  return seqConsensus;
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::changeGapsToUnknownCharacters(SiteContainer& sites)
-{
-  // NB: use iterators for a better algorithm?
-  int unknownCode = sites.getAlphabet()->getUnknownCharacterCode();
-  for (unsigned int i = 0; i < sites.getNumberOfSites(); i++)
-  {
-    for (unsigned int j = 0; j < sites.getNumberOfSequences(); j++)
-    {
-      int* element = &sites(j, i);
-      if (sites.getAlphabet()->isGap(*element))
-        *element = unknownCode;
-    }
-  }
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::changeUnresolvedCharactersToGaps(SiteContainer& sites)
-{
-  // NB: use iterators for a better algorithm?
-  int gapCode = sites.getAlphabet()->getGapCharacterCode();
-  for (unsigned int i = 0; i < sites.getNumberOfSites(); i++)
-  {
-    for (unsigned int j = 0; j < sites.getNumberOfSequences(); j++)
-    {
-      int* element = &sites(j, i);
-      if (sites.getAlphabet()->isUnresolved(*element))
-        *element = gapCode;
-    }
-  }
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::removeGapOnlySites(const SiteContainer& sites)
-{
-  vector<string> seqNames = sites.getSequencesNames();
-  VectorSiteContainer* noGapCont = new VectorSiteContainer(seqNames.size(), sites.getAlphabet());
-  noGapCont->setSequencesNames(seqNames, false);
-  for (unsigned int i = 0; i < sites.getNumberOfSites(); i++)
-  {
-    const Site* site = &sites.getSite(i);
-    if (!SiteTools::isGapOnly(*site))
-      noGapCont->addSite(*site);
-  }
-  return noGapCont;
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::removeGapOnlySites(SiteContainer& sites)
-{
-  size_t n = sites.getNumberOfSites();
-  size_t i = n;
-  while (i > 1)
-  {
-    ApplicationTools::displayGauge(n - i + 1, n);
-    const Site* site = &sites.getSite(i - 1);
-    if (SiteTools::isGapOnly(*site))
-    {
-      size_t end = i;
-      while (SiteTools::isGapOnly(*site) && i > 1)
-      {
-        --i;
-        site = &sites.getSite(i - 1);
-      }
-      sites.deleteSites(i, end - i);
-    }
-    else
-    {
-      --i;
-    }
-  }
-  ApplicationTools::displayGauge(n, n);
-  const Site* site = &sites.getSite(0);
-  if (SiteTools::isGapOnly(*site))
-    sites.deleteSite(0);
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::removeGapOrUnresolvedOnlySites(const SiteContainer& sites)
-{
-  vector<string> seqNames = sites.getSequencesNames();
-  VectorSiteContainer* noGapCont = new VectorSiteContainer(seqNames.size(), sites.getAlphabet());
-  noGapCont->setSequencesNames(seqNames, false);
-  for (unsigned int i = 0; i < sites.getNumberOfSites(); i++)
-  {
-    const Site* site = &sites.getSite(i);
-    if (!SiteTools::isGapOrUnresolvedOnly(*site))
-      noGapCont->addSite(*site, false);
-  }
-  return noGapCont;
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::removeGapOrUnresolvedOnlySites(SiteContainer& sites)
-{
-  size_t n = sites.getNumberOfSites();
-  size_t i = n;
-  while (i > 1)
-  {
-    ApplicationTools::displayGauge(n - i + 1, n);
-    const Site* site = &sites.getSite(i - 1);
-    if (SiteTools::isGapOnly(*site))
-    {
-      size_t end = i;
-      while (SiteTools::isGapOrUnresolvedOnly(*site) && i > 1)
-      {
-        --i;
-        site = &sites.getSite(i - 1);
-      }
-      sites.deleteSites(i, end - i);
-    }
-    else
-    {
-      --i;
-    }
-  }
-  ApplicationTools::displayGauge(n, n);
-  const Site* site = &sites.getSite(0);
-  if (SiteTools::isGapOrUnresolvedOnly(*site))
-    sites.deleteSite(0);
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::removeGapSites(const SiteContainer& sites, double maxFreqGaps)
-{
-  vector<string> seqNames = sites.getSequencesNames();
-  VectorSiteContainer* noGapCont = new VectorSiteContainer(seqNames.size(), sites.getAlphabet());
-  noGapCont->setSequencesNames(seqNames, false);
-  for (unsigned int i = 0; i < sites.getNumberOfSites(); ++i) {
-    map<int, double> freq;
-    SiteTools::getFrequencies(sites.getSite(i), freq);
-    if (freq[-1] <= maxFreqGaps)
-      noGapCont->addSite(sites.getSite(i), false);
-  }
-  return noGapCont;
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::removeGapSites(SiteContainer& sites, double maxFreqGaps)
-{
-  for (size_t i = sites.getNumberOfSites(); i > 0; i--) {
-    map<int, double> freq;
-    SiteTools::getFrequencies(sites.getSite(i - 1), freq);
-    if (freq[-1] > maxFreqGaps)
-      sites.deleteSite(i - 1);
-  }
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::removeStopCodonSites(const SiteContainer& sites, const GeneticCode& gCode)  throw (AlphabetException)
-{
-  const CodonAlphabet* pca = dynamic_cast<const CodonAlphabet*>(sites.getAlphabet());
-  if (!pca)
-    throw AlphabetException("Not a Codon Alphabet", sites.getAlphabet());
-  vector<string> seqNames = sites.getSequencesNames();
-  VectorSiteContainer* noStopCont = new VectorSiteContainer(seqNames.size(), sites.getAlphabet());
-  noStopCont->setSequencesNames(seqNames, false);
-  for (size_t i = 0; i < sites.getNumberOfSites(); i++)
-  {
-    const Site* site = &sites.getSite(i);
-    if (!CodonSiteTools::hasStop(*site, gCode))
-      noStopCont->addSite(*site, false);
-  }
-  return noStopCont;
-}
-
-/******************************************************************************/
-
-SiteContainer* SiteContainerTools::resolveDottedAlignment(
-  const SiteContainer& dottedAln,
-  const Alphabet* resolvedAlphabet) throw (AlphabetException, Exception)
-{
-  if (!AlphabetTools::isDefaultAlphabet(dottedAln.getAlphabet()))
-    throw AlphabetException("SiteContainerTools::resolveDottedAlignment. Alignment alphabet should of class 'DefaultAlphabet'.", dottedAln.getAlphabet());
-
-  // First we look for the reference sequence:
-  size_t n = dottedAln.getNumberOfSequences();
-  if (n == 0)
-    throw Exception("SiteContainerTools::resolveDottedAlignment. Input alignment contains no sequence.");
-
-  const Sequence* refSeq = 0;
-  for (size_t i = 0; i < n; ++i) // Test each sequence
-  {
-    const Sequence* seq = &dottedAln.getSequence(i);
-    bool isRef = true;
-    for (unsigned int j = 0; isRef && j < seq->size(); ++j) // For each site in the sequence
-    {
-      if (seq->getChar(j) == ".")
-        isRef = false;
-    }
-    if (isRef) // We found the reference sequence!
-    {
-      refSeq = new BasicSequence(*seq);
-    }
-  }
-  if (!refSeq)
-    throw Exception("SiteContainerTools::resolveDottedAlignment. No reference sequence was found in the input alignment.");
-
-  // Now we build a new VectorSiteContainer:
-  VectorSiteContainer* sites = new VectorSiteContainer(n, resolvedAlphabet);
-
-  // We add each site one by one:
-  size_t m = dottedAln.getNumberOfSites();
-  string state;
-  for (unsigned int i = 0; i < m; ++i)
-  {
-    string resolved = refSeq->getChar(i);
-    const Site* site = &dottedAln.getSite(i);
-    Site resolvedSite(resolvedAlphabet, site->getPosition());
-    for (unsigned int j = 0; j < n; j++)
-    {
-      state = site->getChar(j);
-      if (state == ".")
-      {
-        state = resolved;
-      }
-      resolvedSite.addElement(state);
-    }
-    // Add the new site:
-    sites->addSite(resolvedSite);
-  }
-
-  // Seq sequence names:
-  sites->setSequencesNames(dottedAln.getSequencesNames());
-
-  // Delete the copied sequence:
-  delete refSeq;
-
-  // Return result:
-  return sites;
-}
-
-/******************************************************************************/
-
-std::map<size_t, size_t> SiteContainerTools::getSequencePositions(const Sequence& seq)
-{
-  map<size_t, size_t> tln;
-  if (seq.size() == 0)
-    return tln;
-  unsigned int count = 0;
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (seq[i] != -1)
-    {
-      count++;
-      tln[i + 1] = count;
-    }
-  }
-  return tln;
-}
-
-/******************************************************************************/
-
-std::map<size_t, size_t> SiteContainerTools::getAlignmentPositions(const Sequence& seq)
-{
-  map<size_t, size_t> tln;
-  if (seq.size() == 0)
-    return tln;
-  unsigned int count = 0;
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (seq[i] != -1)
-    {
-      count++;
-      tln[count] = i + 1;
-    }
-  }
-  return tln;
-}
-
-/******************************************************************************/
-
-std::map<size_t, size_t> SiteContainerTools::translateAlignment(const Sequence& seq1, const Sequence& seq2)
-throw (AlphabetMismatchException, Exception)
-{
-  if (seq1.getAlphabet()->getAlphabetType() != seq2.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::translateAlignment", seq1.getAlphabet(), seq2.getAlphabet());
-  map<size_t, size_t> tln;
-  if (seq1.size() == 0)
-    return tln;
-  unsigned int count1 = 0;
-  unsigned int count2 = 0;
-  if (seq2.size() == 0)
-    throw Exception("SiteContainerTools::translateAlignment. Sequences do not match at position " + TextTools::toString(count1 + 1) + " and " + TextTools::toString(count2 + 1) + ".");
-  int state1 = seq1[count1];
-  int state2 = seq2[count2];
-  bool end = false;
-  while (!end)
-  {
-    while (state1 == -1)
-    {
-      count1++;
-      if (count1 < seq1.size())
-        state1 = seq1[count1];
-      else
-        break;
-    }
-    while (state2 == -1)
-    {
-      count2++;
-      if (count2 < seq2.size())
-        state2 = seq2[count2];
-      else
-        break;
-    }
-    if (state1 != state2)
-      throw Exception("SiteContainerTools::translateAlignment. Sequences do not match at position " + TextTools::toString(count1 + 1) + " and " + TextTools::toString(count2 + 1) + ".");
-    tln[count1 + 1] = count2 + 1; // Count start at 1
-    if (count1 == seq1.size() - 1)
-      end = true;
-    else
-    {
-      if (count2 == seq2.size() - 1)
-      {
-        state1 = seq1[++count1];
-        while (state1 == -1)
-        {
-          count1++;
-          if (count1 < seq1.size())
-            state1 = seq1[count1];
-          else
-            break;
-        }
-        if (state1 == -1)
-          end = true;
-        else
-          throw Exception("SiteContainerTools::translateAlignment. Sequences do not match at position " + TextTools::toString(count1 + 1) + " and " + TextTools::toString(count2 + 1) + ".");
-      }
-      else
-      {
-        state1 = seq1[++count1];
-        state2 = seq2[++count2];
-      }
-    }
-  }
-  return tln;
-}
-
-/******************************************************************************/
-
-std::map<size_t, size_t> SiteContainerTools::translateSequence(const SiteContainer& sequences, size_t i1, size_t i2)
-{
-  const Sequence* seq1 = &sequences.getSequence(i1);
-  const Sequence* seq2 = &sequences.getSequence(i2);
-  map<size_t, size_t> tln;
-  size_t count1 = 0; // Sequence 1 counter
-  size_t count2 = 0; // Sequence 2 counter
-  int state1;
-  int state2;
-  for (size_t i = 0; i <  sequences.getNumberOfSites(); i++)
-  {
-    state1 = (*seq1)[i];
-    if (state1 != -1)
-      count1++;
-    state2 = (*seq2)[i];
-    if (state2 != -1)
-      count2++;
-    if (state1 != -1)
-    {
-      tln[count1] = (state2 == -1 ? 0 : count2);
-    }
-  }
-  return tln;
-}
-
-/******************************************************************************/
-
-AlignedSequenceContainer* SiteContainerTools::alignNW(
-  const Sequence& seq1,
-  const Sequence& seq2,
-  const AlphabetIndex2& s,
-  double gap)
-throw (AlphabetMismatchException)
-{
-  if (seq1.getAlphabet()->getAlphabetType() != seq2.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::alignNW", seq1.getAlphabet(), seq2.getAlphabet());
-  if (seq1.getAlphabet()->getAlphabetType() != s.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::alignNW", seq1.getAlphabet(), s.getAlphabet());
-  // Check that sequences have no gap!
-  auto_ptr<Sequence> s1(seq1.clone());
-  SequenceTools::removeGaps(*s1);
-  auto_ptr<Sequence> s2(seq2.clone());
-  SequenceTools::removeGaps(*s2);
-
-  // 1) Initialize matrix:
-  RowMatrix<double> m(s1->size() + 1, s2->size() + 1);
-  RowMatrix<char>   p(s1->size(), s2->size());
-  double choice1, choice2, choice3, mx;
-  char px;
-  for (size_t i = 0; i <= s1->size(); i++)
-  {
-    m(i, 0) = static_cast<double>(i) * gap;
-  }
-  for (size_t j = 0; j <= s2->size(); j++)
-  {
-    m(0, j) = static_cast<double>(j) * gap;
-  }
-  for (size_t i = 1; i <= s1->size(); i++)
-  {
-    for (size_t j = 1; j <= s2->size(); j++)
-    {
-      choice1 = m(i - 1, j - 1) + static_cast<double>(s.getIndex((*s1)[i - 1], (*s2)[j - 1]));
-      choice2 = m(i - 1, j) + gap;
-      choice3 = m(i, j - 1) + gap;
-      mx = choice1; px = 'd'; // Default in case of equality of scores.
-      if (choice2 > mx)
-      {
-        mx = choice2; px = 'u';
-      }
-      if (choice3 > mx)
-      {
-        mx = choice3; px = 'l';
-      }
-      m(i, j) = mx;
-      p(i - 1, j - 1) = px;
-    }
-  }
-
-  // 2) Get alignment:
-  deque<int> a1, a2;
-  size_t i = s1->size(), j = s2->size();
-  char c;
-  while (i > 0 && j > 0)
-  {
-    c = p(i - 1, j - 1);
-    if (c == 'd')
-    {
-      a1.push_front((*s1)[i - 1]);
-      a2.push_front((*s2)[j - 1]);
-      i--;
-      j--;
-    }
-    else if (c == 'u')
-    {
-      a1.push_front((*s1)[i - 1]);
-      a2.push_front(-1);
-      i--;
-    }
-    else
-    {
-      a1.push_front(-1);
-      a2.push_front((*s2)[j - 1]);
-      j--;
-    }
-  }
-  while (i > 0)
-  {
-    a1.push_front((*s1)[i - 1]);
-    a2.push_front(-1);
-    i--;
-  }
-  while (j > 0)
-  {
-    a1.push_front(-1);
-    a2.push_front((*s2)[j - 1]);
-    j--;
-  }
-  s1->setContent(vector<int>(a1.begin(), a1.end()));
-  s2->setContent(vector<int>(a2.begin(), a2.end()));
-  AlignedSequenceContainer* asc = new AlignedSequenceContainer(s1->getAlphabet());
-  asc->addSequence(*s1, false);
-  asc->addSequence(*s2, false); // Do not check for sequence names.
-  return asc;
-}
-
-/******************************************************************************/
-
-AlignedSequenceContainer* SiteContainerTools::alignNW(
-  const Sequence& seq1,
-  const Sequence& seq2,
-  const AlphabetIndex2& s,
-  double opening,
-  double extending)
-throw (AlphabetMismatchException)
-{
-  if (seq1.getAlphabet()->getAlphabetType() != seq2.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::alignNW", seq1.getAlphabet(), seq2.getAlphabet());
-  if (seq1.getAlphabet()->getAlphabetType() != s.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::alignNW", seq1.getAlphabet(), s.getAlphabet());
-  // Check that sequences have no gap!
-  auto_ptr<Sequence> s1(seq1.clone());
-  SequenceTools::removeGaps(*s1);
-  auto_ptr<Sequence> s2(seq2.clone());
-  SequenceTools::removeGaps(*s2);
-
-  // 1) Initialize matrix:
-  RowMatrix<double> m(s1->size() + 1, s2->size() + 1);
-  RowMatrix<double> v(s1->size() + 1, s2->size() + 1);
-  RowMatrix<double> h(s1->size() + 1, s2->size() + 1);
-  RowMatrix<char>   p(s1->size(), s2->size());
-
-  double choice1, choice2, choice3, mx;
-  char px;
-  m(0, 0) = 0.;
-  for (size_t i = 0; i <= s1->size(); i++)
-  {
-    v(i, 0) = log(0.);
-  }
-  for (size_t j = 0; j <= s2->size(); j++)
-  {
-    h(0, j) = log(0.);
-  }
-  for (size_t i = 1; i <= s1->size(); i++)
-  {
-    m(i, 0) = h(i, 0) = opening + static_cast<double>(i) * extending;
-  }
-  for (size_t j = 1; j <= s2->size(); j++)
-  {
-    m(0, j) = v(0, j) = opening + static_cast<double>(j) * extending;
-  }
-
-  for (size_t i = 1; i <= s1->size(); i++)
-  {
-    for (size_t j = 1; j <= s2->size(); j++)
-    {
-      choice1 = m(i - 1, j - 1) + s.getIndex((*s1)[i - 1], (*s2)[j - 1]);
-      choice2 = h(i - 1, j - 1) + opening + extending;
-      choice3 = v(i - 1, j - 1) + opening + extending;
-      mx = choice1; // Default in case of equality of scores.
-      if (choice2 > mx)
-      {
-        mx = choice2;
-      }
-      if (choice3 > mx)
-      {
-        mx = choice3;
-      }
-      m(i, j) = mx;
-
-      choice1 = m(i, j - 1) + opening + extending;
-      choice2 = h(i, j - 1) + extending;
-      mx = choice1; // Default in case of equality of scores.
-      if (choice2 > mx)
-      {
-        mx = choice2;
-      }
-      h(i, j) = mx;
-
-      choice1 = m(i - 1, j) + opening + extending;
-      choice2 = v(i - 1, j) + extending;
-      mx = choice1; // Default in case of equality of scores.
-      if (choice2 > mx)
-      {
-        mx = choice2;
-      }
-      v(i, j) = mx;
-
-      px = 'd';
-      if (v(i, j) > m(i, j))
-        px = 'u';
-      if (h(i, j) > m(i, j))
-        px = 'l';
-      p(i - 1, j - 1) = px;
-    }
-  }
-
-  // 2) Get alignment:
-  deque<int> a1, a2;
-  size_t i = s1->size(), j = s2->size();
-  char c;
-  while (i > 0 && j > 0)
-  {
-    c = p(i - 1, j - 1);
-    if (c == 'd')
-    {
-      a1.push_front((*s1)[i - 1]);
-      a2.push_front((*s2)[j - 1]);
-      i--;
-      j--;
-    }
-    else if (c == 'u')
-    {
-      a1.push_front((*s1)[i - 1]);
-      a2.push_front(-1);
-      i--;
-    }
-    else
-    {
-      a1.push_front(-1);
-      a2.push_front((*s2)[j - 1]);
-      j--;
-    }
-  }
-  while (i > 0)
-  {
-    a1.push_front((*s1)[i - 1]);
-    a2.push_front(-1);
-    i--;
-  }
-  while (j > 0)
-  {
-    a1.push_front(-1);
-    a2.push_front((*s2)[j - 1]);
-    j--;
-  }
-  s1->setContent(vector<int>(a1.begin(), a1.end()));
-  s2->setContent(vector<int>(a2.begin(), a2.end()));
-  AlignedSequenceContainer* asc = new AlignedSequenceContainer(s1->getAlphabet());
-  asc->addSequence(*s1, false);
-  asc->addSequence(*s2, false); // Do not check for sequence names.
-  return asc;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer* SiteContainerTools::sampleSites(const SiteContainer& sites, size_t nbSites, vector<size_t>* index)
-{
-  VectorSiteContainer* sample = new VectorSiteContainer(sites.getSequencesNames(), sites.getAlphabet());
-  for (size_t i = 0; i < nbSites; i++)
-  {
-    size_t pos = static_cast<size_t>(RandomTools::giveIntRandomNumberBetweenZeroAndEntry(static_cast<int>(sites.getNumberOfSites())));
-    sample->addSite(sites.getSite(pos), false);
-    if (index)
-      index->push_back(pos);
-  }
-  return sample;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer* SiteContainerTools::bootstrapSites(const SiteContainer& sites)
-{
-  return sampleSites(sites, sites.getNumberOfSites());
-}
-
-/******************************************************************************/
-
-const string SiteContainerTools::SIMILARITY_ALL         = "all sites";
-const string SiteContainerTools::SIMILARITY_NOFULLGAP   = "no full gap";
-const string SiteContainerTools::SIMILARITY_NODOUBLEGAP = "no double gap";
-const string SiteContainerTools::SIMILARITY_NOGAP       = "no gap";
-
-/******************************************************************************/
-
-double SiteContainerTools::computeSimilarity(const Sequence& seq1, const Sequence& seq2, bool dist, const std::string& gapOption, bool unresolvedAsGap) throw (SequenceNotAlignedException, AlphabetMismatchException, Exception)
-{
-  if (seq1.size() != seq2.size())
-    throw SequenceNotAlignedException("SiteContainerTools::computeSimilarity.", &seq2);
-  if (seq1.getAlphabet()->getAlphabetType() != seq2.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::computeSimilarity.", seq1.getAlphabet(), seq2.getAlphabet());
-
-  const Alphabet* alpha = seq1.getAlphabet();
-  unsigned int s = 0;
-  unsigned int t = 0;
-  for (size_t i = 0; i < seq1.size(); i++)
-  {
-    int x = seq1[i];
-    int y = seq2[i];
-    int gapCode = alpha->getGapCharacterCode();
-    if (unresolvedAsGap)
-    {
-      if (alpha->isUnresolved(x))
-        x = gapCode;
-      if (alpha->isUnresolved(y))
-        y = gapCode;
-    }
-    if (gapOption == SIMILARITY_ALL)
-    {
-      t++;
-      if (x == y && !alpha->isGap(x) && !alpha->isGap(y))
-        s++;
-    }
-    else if (gapOption == SIMILARITY_NODOUBLEGAP)
-    {
-      if (!alpha->isGap(x) || !alpha->isGap(y))
-      {
-        t++;
-        if (x == y)
-          s++;
-      }
-    }
-    else if (gapOption == SIMILARITY_NOGAP)
-    {
-      if (!alpha->isGap(x) && !alpha->isGap(y))
-      {
-        t++;
-        if (x == y)
-          s++;
-      }
-    }
-    else
-      throw Exception("SiteContainerTools::computeSimilarity. Invalid gap option: " + gapOption);
-  }
-  double r = (t == 0 ? 0. : static_cast<double>(s) / static_cast<double>(t));
-  return dist ? 1 - r : r;
-}
-
-/******************************************************************************/
-
-DistanceMatrix* SiteContainerTools::computeSimilarityMatrix(const SiteContainer& sites, bool dist, const std::string& gapOption, bool unresolvedAsGap)
-{
-  size_t n = sites.getNumberOfSequences();
-  DistanceMatrix* mat = new DistanceMatrix(sites.getSequencesNames());
-  string pairwiseGapOption = gapOption;
-  SiteContainer* sites2;
-  if (gapOption == SIMILARITY_NOFULLGAP)
-  {
-    if (unresolvedAsGap)
-    {
-      SiteContainer* tmp = removeGapOrUnresolvedOnlySites(sites);
-      sites2 = new AlignedSequenceContainer(*tmp);
-      delete tmp;
-    }
-    else
-    {
-      SiteContainer* tmp = removeGapOnlySites(sites);
-      sites2 = new AlignedSequenceContainer(*tmp);
-      delete tmp;
-    }
-    pairwiseGapOption = SIMILARITY_ALL;
-  }
-  else
-  {
-    sites2 = new AlignedSequenceContainer(sites);
-  }
-
-  for (size_t i = 0; i < n; i++)
-  {
-    (*mat)(i, i) = dist ? 0. : 1.;
-    const Sequence* seq1 = &sites2->getSequence(i);
-    for (size_t j = i + 1; j < n; j++)
-    {
-      const Sequence* seq2 = &sites2->getSequence(j);
-      (*mat)(i, j) = (*mat)(j, i) = computeSimilarity(*seq1, *seq2, dist, pairwiseGapOption, unresolvedAsGap);
-    }
-  }
-  delete sites2;
-  return mat;
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::merge(SiteContainer& seqCont1, const SiteContainer& seqCont2, bool leavePositionAsIs)
-throw (AlphabetMismatchException, Exception)
-{
-  if (seqCont1.getAlphabet()->getAlphabetType() != seqCont2.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SiteContainerTools::merge.", seqCont1.getAlphabet(), seqCont2.getAlphabet());
-
-
-  vector<string> seqNames1 = seqCont1.getSequencesNames();
-  vector<string> seqNames2 = seqCont2.getSequencesNames();
-  const SiteContainer* seqCont2bis = 0;
-  bool del = false;
-  if (seqNames1 == seqNames2)
-  {
-    seqCont2bis = &seqCont2;
-  }
-  else
-  {
-    // We shall reorder sequences first:
-    SiteContainer* seqCont2ter = new VectorSiteContainer(seqCont2.getAlphabet());
-    SequenceContainerTools::getSelectedSequences(seqCont2, seqNames1, *seqCont2ter);
-    seqCont2bis = seqCont2ter;
-    del = true;
-  }
-
-  if (leavePositionAsIs)
-  {
-    for (size_t i = 0; i < seqCont2bis->getNumberOfSites(); i++)
-    {
-      seqCont1.addSite(seqCont2bis->getSite(i), false);
-    }
-  }
-  else
-  {
-    int offset = static_cast<int>(seqCont1.getNumberOfSites());
-    for (size_t i = 0; i < seqCont2bis->getNumberOfSites(); i++)
-    {
-      seqCont1.addSite(seqCont2bis->getSite(i), offset + seqCont2bis->getSite(i).getPosition(), false);
-    }
-  }
-
-  if (del)
-    delete seqCont2bis;
-}
-
-/******************************************************************************/
-
-void SiteContainerTools::getSequencePositions(const SiteContainer& sites, Matrix<size_t>& positions)
-{
-  positions.resize(sites.getNumberOfSequences(), sites.getNumberOfSites());
-  int gap = sites.getAlphabet()->getGapCharacterCode();
-  for (size_t i = 0; i < sites.getNumberOfSequences(); ++i) {
-    const Sequence& seq = sites.getSequence(i);
-    unsigned int pos = 0;
-    for (size_t j = 0; j < sites.getNumberOfSites(); ++j) {
-      if (seq[j] != gap) {
-        ++pos;
-        positions(i, j) = pos;
-      } else {
-        positions(i, j) = 0;
-      }
-    }
-  }
-}
-
-/******************************************************************************/
-
-vector<int> SiteContainerTools::getColumnScores(const Matrix<size_t>& positions1, const Matrix<size_t>& positions2, int na)
-{
-  if (positions1.getNumberOfRows() != positions2.getNumberOfRows())
-    throw Exception("SiteContainerTools::getColumnScores. The two input alignments must have the same number of sequences!");
-  vector<int> scores(positions1.getNumberOfColumns());
-  for (size_t i = 0; i < positions1.getNumberOfColumns(); ++i) {
-    //Find an anchor point:
-    size_t whichSeq = 0;
-    size_t whichPos = 0;
-    for (size_t j = 0; j < positions1.getNumberOfRows(); ++j) {
-      if (positions1(j, i) > 0) {
-        whichSeq = j;
-        whichPos = positions1(j, i);
-        break;
-      }
-    }
-    if (whichPos == 0) {
-      //No anchor found, this alignment column is only made of gaps. We assign a score of 'na' and move to the next column.
-      scores[i] = na;
-      continue;
-    }
-    //We look for the anchor in the reference alignment:
-    size_t i2 = 0;
-    bool found = false;
-    for (size_t j = 0; !found && j < positions2.getNumberOfColumns(); ++j) {
-      if (positions2(whichSeq, j) == whichPos) {
-        i2 = j;
-        found = true;
-      }
-    }
-    if (!found) {
-      throw Exception("SiteContainerTools::getColumnScores(). Position " + TextTools::toString(whichPos) + " of sequence " + TextTools::toString(whichSeq) + " not found in reference alignment. Please make sure the two indexes are built from the same data!");
-    }
-    //Now we compare all pairs of sequences between the two positions:
-    bool test = true;
-    for (size_t j = 0; test && j < positions1.getNumberOfRows(); ++j) {
-      test = (positions1(j, i) == positions2(j, i2));
-    }
-    scores[i] = test ? 1 : 0;
-  }
-  return scores;
-}
-
-/******************************************************************************/
-
-vector<double> SiteContainerTools::getSumOfPairsScores(const Matrix<size_t>& positions1, const Matrix<size_t>& positions2, double na)
-{
-  if (positions1.getNumberOfRows() != positions2.getNumberOfRows())
-    throw Exception("SiteContainerTools::getColumnScores. The two input alignments must have the same number of sequences!");
-  vector<double> scores(positions1.getNumberOfColumns());
-  for (size_t i = 0; i < positions1.getNumberOfColumns(); ++i) {
-    //For all positions in alignment 1...
-    size_t countAlignable = 0;
-    size_t countAligned   = 0;
-    for (size_t j = 0; j < positions1.getNumberOfRows(); ++j) {
-      //Get the corresponding column in alignment 2:
-      size_t whichPos = positions1(j, i);
-      if (whichPos == 0) {
-        //No position for this sequence here.
-        continue;
-      }
-      //We look for the position in the second alignment:
-      size_t i2 = 0;
-      bool found = false;
-      for (size_t k = 0; !found && k < positions2.getNumberOfColumns(); ++k) {
-        if (positions2(j, k) == whichPos) {
-          i2 = k;
-          found = true;
-        }
-      }
-      if (!found) {
-        throw Exception("SiteContainerTools::getColumnScores(). Position " + TextTools::toString(whichPos) + " of sequence " + TextTools::toString(j) + " not found in reference alignment. Please make sure the two indexes are built from the same data!");
-      }
-
-      //Now we check all other positions and see if they are aligned with this one:
-      for (size_t k = j + 1; k < positions1.getNumberOfRows(); ++k) {
-        size_t whichPos2 = positions1(k, i);
-        if (whichPos2 == 0) {
-          //Empty position
-          continue;
-        }
-        countAlignable++;
-        //check position in alignment 2:
-        if (positions2(k, i2) == whichPos2)
-          countAligned++;
-      }
-    }
-    scores[i] = countAlignable == 0 ? na : static_cast<double>(countAligned) / static_cast<double>(countAlignable);
-  }
-  return scores;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/SiteContainerTools.h b/src/Bpp/Seq/Container/SiteContainerTools.h
deleted file mode 100644
index 4150196..0000000
--- a/src/Bpp/Seq/Container/SiteContainerTools.h
+++ /dev/null
@@ -1,497 +0,0 @@
-//
-// File: SiteContainerTools.h
-// Created by: Julien Dutheil
-// Created on: Fri Dec 12 18:55:06 2003
-//
-
-#ifndef _SITECONTAINERTOOLS_H_
-#define _SITECONTAINERTOOLS_H_
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use,
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info".
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability.
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or
-  data to be ensured and,  more generally, to use and operate it in the
-  same conditions as regards security.
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SiteContainer.h"
-#include "VectorSiteContainer.h"
-#include "AlignedSequenceContainer.h"
-#include "../AlphabetIndex/AlphabetIndex2.h"
-#include "../DistanceMatrix.h"
-#include "../GeneticCode/GeneticCode.h"
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-//From the STL:
-#include <vector>
-#include <map>
-
-namespace bpp
-{
-
-  typedef std::vector<size_t> SiteSelection;
-
-/**
- * @brief Some utililitary methods to deal with site containers.
- */
-  class SiteContainerTools
-  {
-  public:
-    SiteContainerTools() {}
-    virtual ~SiteContainerTools() {}
-
-  public:
-
-    /**
-     * @brief Retrieves sites without gaps from SiteContainer.
-     *
-     * This function build a new SiteContainer instance with only sites without gaps.
-     * The container passed as input is not modified, all sites are copied.
-     *
-     * @param sites The container to analyse.
-     * @return A pointer toward a new SiteContainer with only sites with no gaps.
-     */
-    static SiteContainer* getSitesWithoutGaps(const SiteContainer& sites);
-
-    /**
-     * @brief Retrieves complete sites from SiteContainer.
-     *
-     * This function build a new SiteContainer instance with only complete sites,
-     * i.e. site with fully resolved states (no gap, no unknown caracters).
-     * The container passed as input is not modified, all sites are copied.
-     *
-     * @param sites The container to analyse.
-     * @return A pointer toward a new SiteContainer with only complete sites.
-     */
-    static SiteContainer* getCompleteSites(const SiteContainer& sites);
-
-    /**
-     * @brief Get a site set without gap-only sites.
-     *
-     * This function build a new SiteContainer instance without sites with only gaps.
-     * The container passed as input is not modified, all sites are copied.
-     *
-     * @see removeGapOnlySites(SiteContainer& sites)
-     * @param sites The container to analyse.
-     * @return A pointer toward a new SiteContainer.
-     */
-    static SiteContainer* removeGapOnlySites(const SiteContainer& sites);
-
-    /**
-     * @brief Remove gap-only sites from a site set.
-     *
-     * @param sites The container where the sites have to be removed.
-     */
-    static void removeGapOnlySites(SiteContainer& sites);
-
-    /**
-     * @brief Get a site set without gap/unresolved-only sites.
-     *
-     * This function build a new SiteContainer instance without sites with only gaps or unresolved characters.
-     * The container passed as input is not modified, all sites are copied.
-     *
-     * @param sites The container to analyse.
-     * @return A pointer toward a new SiteContainer.
-     */
-    static SiteContainer* removeGapOrUnresolvedOnlySites(const SiteContainer& sites);
-		
-    /**
-     * @brief Remove gap/unresolved-only sites from a site set.
-     *
-     * @param sites The container where the sites have to be removed.
-     */
-    static void removeGapOrUnresolvedOnlySites(SiteContainer& sites);
-
-    /**
-     * @brief Get a siteset with sites with less than a given amount of gaps.
-     *
-     * @param sites The container from which the sites have to be removed.
-     * @param maxFreqGaps The maximum frequency of gaps in each site.
-     * @return A pointer toward a new SiteContainer.
-     */
-    static SiteContainer* removeGapSites(const SiteContainer& sites, double maxFreqGaps);
-
-    /**
-     * @brief Remove sites with a given amount of gaps.
-     *
-     * @param sites The container from which the sites have to be removed.
-     * @param maxFreqGaps The maximum frequency of gaps in each site.
-     */
-    static void removeGapSites(SiteContainer& sites, double maxFreqGaps);
-
-    /**
-     * @brief Get a site set without stop codons, if the alphabet is a CodonAlphabet, otherwise throws an Exception.
-     *
-     * This function build a new SiteContainer instance without sites that have at least a stop codon.
-     * The container passed as input is not modified, all sites are copied.
-     *
-     * @param sites The container to analyse.
-     * @param gCode the genetic code to use to determine stop codons.
-     * @return A pointer toward a new SiteContainer.
-     */
-    static SiteContainer* removeStopCodonSites(const SiteContainer& sites, const GeneticCode& gCode) throw (AlphabetException);
-
-    /**
-     * @brief Create a new container with a specified set of sites.
-     *
-     * A new VectorSiteContainer is created with specified sites.
-     * The destruction of the container is up to the user.
-     * Sites are specified by their indice, beginning at 0.
-     * No position verification is performed, based on the assumption that
-     * the container passed as an argument is a correct one.
-     * Redundant selection is not checked, so be careful with what you're doing!
-     *
-     * @param sequences The container from wich sequences are to be taken.
-     * @param selection The positions of all sites to retrieve.
-     * @return A new container with all selected sites.
-     */
-    static SiteContainer* getSelectedSites(const SiteContainer& sequences, const SiteSelection& selection);
-
-    /**
-     * @brief Create a new container with a specified set of positions.
-     *
-     * A new VectorSiteContainer is created with specified.
-     * The destruction of the container is up to the user.
-     *
-     * Positions are specified by their indice, beginning at 0, and
-     * are converted to site positions given the length of the words
-     * of the alphaber.
-     *
-     * No position verification is performed, based on the assumption that
-     * the container passed as an argument is a correct one.
-     * Redundant selection is not checked, so be careful with what you're doing!
-     *
-     * @param sequences The container from wich sequences are to be taken.
-     * @param selection The positions to retrieve.
-     * @return A new container with all selected sites.
-     */
-    
-    static SiteContainer* getSelectedPositions(const SiteContainer& sequences, const SiteSelection& selection);
-
-    /**
-     * @brief create the consensus sequence of the alignment.
-     *
-     * In case of ambiguity (for instance a AATT site), one state will be chosen arbitrarily.
-     *
-     * @param sc a site container
-     * @param name the name of the sequence object that will be created. 
-     * @param ignoreGap Tell if gap must be counted or not. If not (true option), only fully gapped sites will result in a gap in the consensus sequence. 
-     * @param resolveUnknown Tell is unknnown characters must resolved. In a DNA sequence for instance, N will be counted as A=1/4, T=1/4, G=1/4 and C=1/4. Otherwise it will be counted as N=1.
-     * If this option is set to true, a consensus sequence will never contain an unknown character.
-     * @return A new Sequence object with the consensus sequence.
-     */
-    static Sequence* getConsensus(const SiteContainer& sc, const std::string& name = "consensus", bool ignoreGap = true, bool resolveUnknown = false);
-    
-    /**
-     * @brief Change all gaps to unknown state in a container, according to its alphabet.
-     *
-     * For DNA alphabets, this change all '-' to 'N'.
-     *
-     * @param sites The container to be modified.
-     */
-    static void changeGapsToUnknownCharacters(SiteContainer& sites);
-
-    /**
-     * @brief Change all unresolved characters to gaps in a container, according to its alphabet.
-     *
-     * For DNA alphabets, this change all 'N', 'M', 'R', etc.  to '-'.
-     *
-     * @param sites The container to be modified.
-     */
-    static void changeUnresolvedCharactersToGaps(SiteContainer& sites);
-
-    /**
-     * @brief Resolve a container with "." notations.
-     *
-     * @code
-     * ATGCCGTTGG
-     * .C...A..C.
-     * ..A....C..
-     * @endcode
-     * will results in
-     * @code
-     * ATGCCGTTGG
-     * ACCCCATTCG
-     * ATACCGTCGG
-     * @endcode
-     * for instance.
-     * The first sequence is here called the "reference" sequence.
-     * It need not be the first in the container.
-     * The alphabet of the input alignment must be an instance of the DefaultAlphabet class, the only one which support dot characters.
-     * A new alignment is created and returned, with the specified alphabet.
-     *
-     * If several sequences that may be considered as reference are found, the first one is used.
-     * 
-     * @param dottedAln The input alignment.
-     * @param resolvedAlphabet The alphabet of the output alignment.
-     * @return A pointer toward a dynamically created SiteContainer with the specified alphabet (can be a DefaultAlphabet).
-     * @throw AlphabetException If the alphabet of the input alignment is not of class DefaultAlphabet, or if one character does not match with the output alphabet.
-     * @throw Exception If no reference sequence was found, or if the input alignment contains no sequence.
-     */
-    static SiteContainer* resolveDottedAlignment(const SiteContainer& dottedAln, const Alphabet* resolvedAlphabet) throw (AlphabetException, Exception);
-
-    /**
-     * @name Sequences coordinates.
-     *
-     * @see SequenceWalker For an alternative approach.
-     * @{
-     */
-
-    /**
-     * @brief Get the index of each sequence position in an aligned sequence.
-     *
-     * If the sequence contains no gap, the translated and the original positions are the same.
-     * Position numbers start at 1.
-     *
-     * @param seq The sequence to translate.
-     * @return A map with original sequence positions as keys, and translated positions as values.
-     */
-    static std::map<size_t, size_t> getSequencePositions(const Sequence& seq);
-
-    /**
-     * @brief Get the index of each alignment position in an aligned sequence.
-     *
-     * If the sequence contains no gap, the translated and the original positions are the same.
-     * Position numbers start at 1.
-     *
-     * @param seq The sequence to translate.
-     * @return A map with original alignement positions as keys, and translated positions as values.
-     */
-    static std::map<size_t, size_t> getAlignmentPositions(const Sequence& seq);
-
-    /**
-     * @brief Fill a numeric matrix with the size of the alignment, containing the each sequence position.
-     *
-     * Positions start at 1, gaps have "position" 0.
-     *
-     * @param sites The input alignment.
-     * @param positions A matrix object which is going to be resized and filled with the corresponding positions.
-     * @author Julien Dutheil
-     */
-    static void getSequencePositions(const SiteContainer& sites, Matrix<size_t>& positions);
-    /** @} */
-
-    /**
-     * @brief Translate alignement positions from an aligned sequence to the same sequence in a different alignment.
-     *
-     * Takes each position (starting at 1) in sequence 1, and look for the corresponding position in sequence 2.
-     * The two sequences must be the same, excepted for the gaps.
-     * If no sequence contains gaps, or if the gaps are at the same place in both sequences, the translated postion will be the same as the original positions.
-     * 
-     * @param seq1 The sequence to translate.
-     * @param seq2 The reference sequence.
-     * @return A map with original alignement positions as keys, and translated positions as values.
-     * @throw AlphabetMismatchException If the sequences do not share the same alphabet.
-     * @throw Exception If the sequence do not match.
-     */
-    static std::map<size_t, size_t> translateAlignment(const Sequence& seq1, const Sequence& seq2) throw (AlphabetMismatchException, Exception);
-
-    /**
-     * @brief Translate sequence positions from a sequence to another in the same alignment.
-     *
-     * Takes each position (starting at 1) in sequence 1, and look for the corresponding position in sequence 2 at the same site.
-     * If no corresponding position is available (i.e. if there is a gap in sequence 2 at the corresponding position), 0 is returned.
-     *
-     * @param sequences The alignment to use.
-     * @param i1 The index of the sequence to translate.
-     * @param i2 The index of the reference sequence.
-     * @return A map with original sequence positions as keys, and translated positions as values.
-     */
-    static std::map<size_t, size_t> translateSequence(const SiteContainer& sequences, size_t i1, size_t i2);
-
-    /**
-     * @brief Align two sequences using the Needleman-Wunsch dynamic algorithm.
-     *
-     * If the input sequences contain gaps, they will be ignored.
-     *
-     * @see BLOSUM50, DefaultNucleotideScore for score matrices.
-     *
-     * @param seq1 The first sequence.
-     * @param seq2 The second sequence.
-     * @param s The score matrix to use.
-     * @param gap Gap penalty.
-     * @return A new SiteContainer instance.
-     * @throw AlphabetMismatchException If the sequences and the score matrix do not share the same alphabet.
-     */
-    static AlignedSequenceContainer* alignNW(const Sequence& seq1, const Sequence& seq2, const AlphabetIndex2& s, double gap) throw (AlphabetMismatchException);
-
-    /**
-     * @brief Align two sequences using the Needleman-Wunsch dynamic algorithm.
-     *
-     * If the input sequences contain gaps, they will be ignored.
-     *
-     * @see BLOSUM50, DefaultNucleotideScore for score matrices.
-     *
-     * @param seq1 The first sequence.
-     * @param seq2 The second sequence.
-     * @param s The score matrix to use.
-     * @param opening Gap opening penalty.
-     * @param extending Gap extending penalty.
-     * @return A new SiteContainer instance.
-     * @throw AlphabetMismatchException If the sequences and the score matrix do not share the same alphabet.
-     */
-    static AlignedSequenceContainer* alignNW(const Sequence& seq1, const Sequence& seq2, const AlphabetIndex2& s, double opening, double extending) throw (AlphabetMismatchException);
-
-    /**
-     * @brief Sample sites in an alignment.
-     *
-     * Original site positions will be kept. The resulting container will hence probably have duplicated
-     * positions. You may wish to call the reindexSites() method on the returned container.
-     *
-     * Note: This method will be optimal with a container with vertical storage like VectorSiteContainer.
-     *
-     * @param sites An input alignment to sample.
-     * @param nbSites The size of the resulting container.
-     * @param index [out] If non-null the underlying vector will be appended with the original site indices.
-     * @return A sampled alignment with nbSites sites taken from the input one.
-     */
-    static VectorSiteContainer* sampleSites(const SiteContainer& sites, size_t nbSites, std::vector<size_t>* index = 0);
-
-    /**
-     * @brief Bootstrap sites in an alignment.
-     *
-     * Original site positions will be kept. The resulting container will hence probably have duplicated
-     * positions. You may wish to call the reindexSites() method on the returned container.
-     *
-     * Note: This method will be optimal with a container with vertical storage like VectorSiteContainer.
-     *
-     * @param sites An input alignment to sample.
-     * @return A sampled alignment with the same number of sites than the input one.
-     */
-    static VectorSiteContainer* bootstrapSites(const SiteContainer& sites);
-
-    /**
-     * @brief Compute the similarity/distance score between two aligned sequences.
-     *
-     * The similarity measures are computed as the proportion of identical match.
-     * The distance between the two sequences is defined as 1 - similarity.
-     * This function can be used with any type of alphabet.
-     *
-     * @param seq1 The first sequence.
-     * @param seq2 The second sequence.
-     * @param dist Shall we return a distance instead of similarity?
-     * @param gapOption How to deal with gaps:
-     * - SIMILARITY_ALL: all positions are used.
-     * - SIMILARITY_NODOUBLEGAP: ignore all positions with a gap in the two sequences.
-     * - SIMILARITY_NOGAP: ignore all positions with a gap in at least one of the two sequences.
-     * @param unresolvedAsGap Tell if unresolved characters must be considered as gaps when counting.
-     * If set to yes, the gap option will also apply to unresolved characters.
-     * @return The proportion of matches between the two sequences.
-     * @throw SequenceNotAlignedException If the two sequences do not have the same length.
-     * @throw AlphabetMismatchException If the two sequences do not share the same alphabet type.
-     * @throw Exception If an invalid gapOption is passed.
-     */
-    static double computeSimilarity(const Sequence& seq1, const Sequence& seq2, bool dist = false, const std::string& gapOption = SIMILARITY_NODOUBLEGAP, bool unresolvedAsGap = true) throw (SequenceNotAlignedException, AlphabetMismatchException, Exception);
-
-    /**
-     * @brief Compute the similarity matrix of an alignment.
-     *
-     * The similarity measures are computed as the proportion of identical match.
-     * The distance between the two sequences is defined as 1 - similarity.
-     * This function can be used with any type of alphabet.
-     * Several options concerning gaps and unresolved characters are proposed:
-     * - SIMILARITY_ALL: all positions are used.
-     * - SIMILARITY_NOFULLGAP: ignore positions with a gap in all the sequences in the alignment.
-     * - SIMILARITY_NODOUBLEGAP: ignore all positions with a gap in the two sequences for each pair.
-     * - SIMILARITY_NOGAP: ignore all positions with a gap in at least one of the two sequences for each pair.
-     *
-     *
-     * @see computeSimilarityMatrix
-     *
-     * @param sites The input alignment.
-     * @param dist Shall we return a distance instead of similarity?
-     * @param gapOption How to deal with gaps.
-     * @param unresolvedAsGap Tell if unresolved characters must be considered as gaps when counting.
-     * If set to yes, the gap option will also apply to unresolved characters.
-     * @return All pairwise similarity measures.
-     */
-    static DistanceMatrix* computeSimilarityMatrix(const SiteContainer& sites, bool dist = false, const std::string& gapOption = SIMILARITY_NOFULLGAP, bool unresolvedAsGap = true);
-
-    static const std::string SIMILARITY_ALL;
-    static const std::string SIMILARITY_NOFULLGAP;
-    static const std::string SIMILARITY_NODOUBLEGAP;
-    static const std::string SIMILARITY_NOGAP;
-
-    /**
-     * @brief Add the content of a site container to an exhisting one.
-     *
-     * The input containers are supposed to have unique sequence names.
-     * If it is not the case, several things can happen:
-     * - If the two containers have exactly the same names in the same order, then the content of the second one will be added as is to the first one.
-     * - If the second container does not have exactly the same sequences names or in a different order, then a reordered selection of the second contianer is created first,
-     *   and in that case, only the first sequence with a given name will be used and duplicated.
-     * In any case, note that the second container should always contains all the sequence names from the first one,
-     * otherwise an exception will be thrown.
-     *
-     * @author Julien Dutheil
-     *
-     * @param seqCont1 First container.
-     * @param seqCont2 Second container. This container must contain sequences with the same names as in seqcont1.
-     * Additional sequences will be ignored.
-     * @param leavePositionAsIs Tell is site position should be unchanged. Otherwise (the default) is to add the size of container 1 to the positions in container 2.
-     * @throw AlphabetMismatchException If the alphabet in the 2 containers do not match.
-     * @throw Exception If sequence names do not match.
-     */
-    static void merge(SiteContainer& seqCont1, const SiteContainer& seqCont2, bool leavePositionAsIs = false) throw (AlphabetMismatchException, Exception);
-
-    /**
-     * @brief Compare an alignment to a reference alignment, and compute the column scores.
-     *
-     * Calculations are made according to formula for the "CS" score in Thompson et al 1999, Nucleic Acids Research (1999):27(13);2682–2690.
-     *
-     * @param positions1 Alignment index for the test alignment.
-     * @param positions2 Alignment index for the reference alignment.
-     * @param na         The score to use if the tested column is full of gap.
-     * @return A vector of score, as 0 or 1.
-     * @see getSequencePositions for creating the alignment indexes.
-     * @warning The indexes for the two alignments must have the sequences in the exact same order!
-     * @author Julien Dutheil
-     */
-    static std::vector<int> getColumnScores(const Matrix<size_t>& positions1, const Matrix<size_t>& positions2, int na = 0);
-   
-    /**
-     * @brief Compare an alignment to a reference alignment, and compute the sum-of-pairs scores.
-     *
-     * Calculations are made according to formula for the "SPS" score in Thompson et al 1999, Nucleic Acids Research (1999):27(13);2682–2690.
-     *
-     * @param positions1 Alignment index for the test alignment.
-     * @param positions2 Alignment index for the reference alignment.
-     * @param na         The score to use if the tested column is not testable, that is not containing at least to residues.
-     * @return A vector of score, between 0 and 1 (+ na value).
-     * @see getSequencePositions for creating the alignment indexes.
-     * @warning The indexes for the two alignments must have the sequences in the exact same order!
-     * @author Julien Dutheil
-     */
-    static std::vector<double> getSumOfPairsScores(const Matrix<size_t>& positions1, const Matrix<size_t>& positions2, double na = 0);
-  };
-
-} //end of namespace bpp.
-
-#endif	//_SITECONTAINERTOOLS_H_
-
diff --git a/src/Bpp/Seq/Container/VectorSequenceContainer.cpp b/src/Bpp/Seq/Container/VectorSequenceContainer.cpp
deleted file mode 100644
index f6cb50e..0000000
--- a/src/Bpp/Seq/Container/VectorSequenceContainer.cpp
+++ /dev/null
@@ -1,399 +0,0 @@
-//
-// File VectorSequenceContainer.cpp
-// Author : Guillaume Deuchst
-//          Julien Dutheil
-// Last modification : Wednesday July 30 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "VectorSequenceContainer.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-using namespace std;
-
-/** Class constructors: *******************************************************/
-
-VectorSequenceContainer::VectorSequenceContainer(
-  const std::vector<const Sequence*>& vs,
-  const Alphabet* alpha)
-throw (AlphabetMismatchException) :
-  AbstractSequenceContainer(alpha),
-  sequences_()
-{
-  for (std::vector<const Sequence*>::const_iterator i = vs.begin(); i < vs.end(); i++)
-  {
-    addSequence(**i);
-  }
-}
-
-/** Copy constructors: ********************************************************/
-
-VectorSequenceContainer::VectorSequenceContainer(
-  const VectorSequenceContainer& vsc) :
-  AbstractSequenceContainer(vsc),
-  sequences_()
-{
-  size_t max = vsc.getNumberOfSequences();
-  for (size_t i = 0; i < max; i++)
-  {
-    addSequence(vsc.getSequence(i), false);
-  }
-}
-
-VectorSequenceContainer::VectorSequenceContainer(
-  const OrderedSequenceContainer& osc) :
-  AbstractSequenceContainer(osc.getAlphabet()),
-  sequences_()
-{
-  // Sequences insertion
-  for (unsigned int i = 0; i < osc.getNumberOfSequences(); i++)
-  {
-    addSequence(osc.getSequence(i), false);
-  }
-}
-
-VectorSequenceContainer::VectorSequenceContainer(
-  const SequenceContainer& sc) :
-  AbstractSequenceContainer(sc.getAlphabet()),
-  sequences_()
-{
-  // Sequences insertion
-  std::vector<std::string> names = sc.getSequencesNames();
-  for (unsigned int i = 0; i < names.size(); i++)
-  {
-    addSequence(sc.getSequence(names[i]), false);
-  }
-
-  setGeneralComments(sc.getGeneralComments());
-}
-
-/** Assignation operator: *****************************************************/
-
-VectorSequenceContainer& VectorSequenceContainer::operator=(
-  const VectorSequenceContainer& vsc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(vsc);
-
-  // Sequences insertion
-  size_t max = vsc.getNumberOfSequences();
-  for (size_t i = 0; i < max; i++)
-  {
-    addSequence(vsc.getSequence(i), false);
-  }
-
-  return *this;
-}
-
-VectorSequenceContainer& VectorSequenceContainer::operator=(
-  const OrderedSequenceContainer& osc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(osc);
-
-  // Sequences insertion
-  size_t max = osc.getNumberOfSequences();
-  for (unsigned int i = 0; i < max; i++)
-  {
-    addSequence(osc.getSequence(i), false);
-  }
-
-  return *this;
-}
-
-/******************************************************************************/
-
-VectorSequenceContainer& VectorSequenceContainer::operator=(
-  const SequenceContainer& sc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(sc);
-
-  // Seq names:
-  std::vector<std::string> names = sc.getSequencesNames();
-
-  for (unsigned int i = 0; i < names.size(); i++)
-  {
-    addSequence(sc.getSequence(names[i]), false);
-  }
-
-  return *this;
-}
-
-/******************************************************************************/
-
-const Sequence& VectorSequenceContainer::getSequence(size_t sequenceIndex) const throw (IndexOutOfBoundsException)
-{
-  // Specified sequence existence verification
-  if (sequenceIndex < sequences_.size())
-    return *sequences_[sequenceIndex];
-  throw IndexOutOfBoundsException("VectorSequenceContainer::getSequence.", sequenceIndex, 0, sequences_.size() - 1);
-}
-
-/******************************************************************************/
-
-bool VectorSequenceContainer::hasSequence(const string& name) const
-{
-  // Specified sequence name research into all sequences
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    if (sequences_[i]->getName() == name)
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-const Sequence& VectorSequenceContainer::getSequence(const string& name) const throw (SequenceNotFoundException)
-{
-  // Specified sequence name research into all sequences
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    if (sequences_[i]->getName() == name)
-      return *sequences_[i];
-  }
-  throw SequenceNotFoundException("VectorSequenceContainer::getSequence : Specified sequence doesn't exist", name);
-}
-
-/******************************************************************************/
-
-Sequence& VectorSequenceContainer::getSequence_(size_t sequenceIndex) throw (IndexOutOfBoundsException)
-{
-  // Specified sequence existence verification
-  if (sequenceIndex < sequences_.size())
-    return *sequences_[sequenceIndex];
-  throw IndexOutOfBoundsException("VectorSequenceContainer::getSequence.", sequenceIndex, 0, sequences_.size() - 1);
-}
-
-/******************************************************************************/
-
-Sequence& VectorSequenceContainer::getSequence_(const string& name) throw (SequenceNotFoundException)
-{
-  // Specified sequence name research into all sequences
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    if (sequences_[i]->getName() == name)
-      return *sequences_[i];
-  }
-  throw SequenceNotFoundException("VectorSequenceContainer::getSequence : Specified sequence doesn't exist", name);
-}
-
-/******************************************************************************/
-
-size_t VectorSequenceContainer::getSequencePosition(const string& name) const throw (SequenceNotFoundException)
-{
-  // Specified sequence name research into all sequences
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    if (sequences_[i]->getName() == name)
-      return i;
-  }
-  throw SequenceNotFoundException("VectorSequenceContainer::getSequencePosition : Specified sequence doesn't exist", name);
-}
-
-/******************************************************************************/
-
-void VectorSequenceContainer::setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName) throw (Exception)
-{
-  // Sequence's name existence checking
-  if (checkName)
-  {
-    // For all names in vector : throw exception if name already exists
-    for (size_t j = 0; j < sequences_.size(); j++)
-    {
-      if (sequences_[j]->getName() == sequence.getName())
-        if (j != sequenceIndex)
-          throw Exception("VectorSequenceContainer::setSequence : Sequence's name already exists in container");
-    }
-  }
-
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-  {
-    // Delete old sequence
-    delete sequences_[sequenceIndex];
-    // New sequence insertion in sequence container
-    sequences_[sequenceIndex] = dynamic_cast<Sequence*>(sequence.clone());
-  }
-  else
-    throw AlphabetMismatchException("VectorSequenceContainer::setSequence : Alphabets don't match", getAlphabet(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-Sequence* VectorSequenceContainer::removeSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException)
-{
-  // Copy sequence:
-  if (sequenceIndex >= sequences_.size())
-    throw IndexOutOfBoundsException("VectorSequenceContainer::removeSequence.", sequenceIndex, 0, sequences_.size() - 1);
-  Sequence* old = sequences_[sequenceIndex];
-  // Remove pointer toward old sequence:
-  sequences_.erase(sequences_.begin() + static_cast<ptrdiff_t>(sequenceIndex));
-  // Send copy:
-  return old;
-}
-
-/******************************************************************************/
-
-void VectorSequenceContainer::deleteSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException)
-{
-  // Delete sequence
-  if (sequenceIndex >= sequences_.size())
-    throw IndexOutOfBoundsException("VectorSequenceContainer::deleteSequence.", sequenceIndex, 0, sequences_.size() - 1);
-  delete sequences_[sequenceIndex];
-  // Remove pointer toward old sequence:
-  sequences_.erase(sequences_.begin() + static_cast<ptrdiff_t>(sequenceIndex));
-}
-
-/******************************************************************************/
-
-void VectorSequenceContainer::addSequence(const Sequence& sequence, bool checkName) throw (Exception)
-{
-  // Sequence's name existence checking
-  if (checkName)
-  {
-    // For all names in vector : throw exception if name already exists
-    for (size_t i = 0; i < sequences_.size(); i++)
-    {
-      if (sequences_[i]->getName() == sequence.getName())
-        throw Exception("VectorSequenceContainer::addSequence : Sequence '" + sequence.getName() + "' already exists in container");
-    }
-  }
-
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-  {
-    // push_back(new Sequence(sequence.getName(), sequence.getContent(), alphabet));
-    sequences_.push_back(dynamic_cast<Sequence*>(sequence.clone()));
-  }
-  else
-    throw AlphabetMismatchException("VectorSequenceContainer::addSequence : Alphabets don't match", getAlphabet(), sequence.getAlphabet());
-}
-
-void VectorSequenceContainer::addSequence(const Sequence& sequence, size_t sequenceIndex, bool checkName) throw (Exception)
-{
-  // Sequence's name existence checking
-  if (checkName)
-  {
-    // For all names in vector : throw exception if name already exists
-    for (size_t i = 0; i < sequences_.size(); i++)
-    {
-      if (sequences_[i]->getName() == sequence.getName())
-        throw Exception("VectorSequenceContainer::addSequence : Sequence '" + sequence.getName() + "' already exists in container");
-    }
-  }
-
-  // New sequence's alphabet and sequence container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() == getAlphabet()->getAlphabetType())
-  {
-    // insert(begin() + pos, new Sequence(sequence.getName(), sequence.getContent(), alphabet));
-    sequences_.insert(sequences_.begin() + static_cast<ptrdiff_t>(sequenceIndex), dynamic_cast<Sequence*>(sequence.clone()));
-  }
-  else
-    throw AlphabetMismatchException("VectorSequenceContainer::addSequence : Alphabets don't match", getAlphabet(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-std::vector<std::string> VectorSequenceContainer::getSequencesNames() const
-{
-  std::vector<std::string> names;
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    names.push_back(sequences_[i]->getName());
-  }
-  return names;
-}
-
-/******************************************************************************/
-
-void VectorSequenceContainer::setSequencesNames(
-  const std::vector<std::string>& names,
-  bool checkNames)
-throw (Exception)
-{
-  if (names.size() != getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSequenceContainer::setSequenceNames : bad number of names", names.size(), getNumberOfSequences(), getNumberOfSequences());
-  if (checkNames)
-  {
-    for (size_t i = 0; i < names.size(); i++)
-    {
-      // For all names in vector : throw exception if name already exists
-      for (size_t j = 0; j < i; j++)
-      {
-        if (names[j] == names[i])
-          throw Exception("VectorSiteContainer::setSequencesNames : Sequence's name already exists in container");
-      }
-    }
-  }
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    sequences_[i]->setName(names[i]);
-  }
-}
-
-/******************************************************************************/
-
-void VectorSequenceContainer::clear()
-{
-  // Delete sequences
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    delete sequences_[i];
-  }
-  // Delete all sequence pointers
-  sequences_.clear();
-}
-
-/******************************************************************************/
-
-void VectorSequenceContainer::setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException)
-{
-  sequences_[sequenceIndex]->setComments(comments);
-}
-
-/******************************************************************************/
-
-VectorSequenceContainer* VectorSequenceContainer::createEmptyContainer() const
-{
-  VectorSequenceContainer* vsc = new VectorSequenceContainer(getAlphabet());
-  vsc->setGeneralComments(getGeneralComments());
-  return vsc;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/VectorSequenceContainer.h b/src/Bpp/Seq/Container/VectorSequenceContainer.h
deleted file mode 100644
index fc467f6..0000000
--- a/src/Bpp/Seq/Container/VectorSequenceContainer.h
+++ /dev/null
@@ -1,306 +0,0 @@
-//
-// File VectorSequenceContainer.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _VECTORSEQUENCECONTAINER_H_
-#define _VECTORSEQUENCECONTAINER_H_
-
-#include "../Alphabet/Alphabet.h"
-#include "../Sequence.h"
-#include "AbstractSequenceContainer.h"
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <algorithm>
-#include <vector>
-
-namespace bpp
-{
-
-/**
- * @brief The VectorSequenceContainer class.
- *
- * This is the simplest implementation of the OrderedSequenceContainer interface.
- * Sequences are stored in a std::vector of pointers.
- * The container is responsible for the creation and destruction of the sequence
- * objects it contains.
- */
-class VectorSequenceContainer:
-  public AbstractSequenceContainer
-{
-  private:
-
-    /**
-     * @brief A std::vector of pointers toward the sequences stored in the container.
-     */
-    mutable std::vector<Sequence*> sequences_;
-        
-  public:
-    
-    /**
-     * @brief Build a new container from a std::vector of pointers toward sequence objects.
-     *
-     * The addSequence() method is called uppon each Sequence object, hence each sequence is
-     * <i>copied</i> into the container.
-     *
-     * @param vs    The std::vector of pointers toward sequence objects.
-     * @param alpha The alphabet to all sequences.
-     * @throw AlphabetMismatchException if one sequence does not match the specified alphabet.
-     */
-    VectorSequenceContainer(
-      const std::vector<const Sequence*>& vs, const Alphabet* alpha)
-      throw (AlphabetMismatchException);
-  
-    /**
-     * @brief Build an empty container that will contain sequences of a particular alphabet.
-     *
-     * @param alpha The alphabet of the container.
-     */
-    VectorSequenceContainer(const Alphabet* alpha): AbstractSequenceContainer(alpha), sequences_() {}
-    
-    /**
-     * @name Copy contructors:
-     *
-     * @{
-     */
-    
-    /**
-     * @brief Copy from a VectorSequenceContainer.
-     *
-     * @param vsc The VectorSequenceContainer to copy into this container.
-     */
-    VectorSequenceContainer(const VectorSequenceContainer& vsc);
-    
-    /**
-     * @brief Copy from an OrderedSequenceContainer.
-     *
-     * @param osc The OrderedSequenceContainer to copy into this container.
-     */
-    VectorSequenceContainer(const OrderedSequenceContainer& osc);
-
-    /**
-     * @brief Copy from a SequenceContainer.
-     *
-     * @param osc The SequenceContainer to copy into this container.
-     */
-    VectorSequenceContainer(const SequenceContainer& osc);
-
-    /** @} */
-
-    /**
-     * @brief Assign from a VectorSequenceContainer.
-     *
-     * @param vsc The VectorSequenceContainer to copy into this container.
-     */
-    VectorSequenceContainer& operator=(const VectorSequenceContainer& vsc);
-
-    /**
-     * @brief Copy from an OrderedSequenceContainer.
-     *
-     * @param osc The OrderedSequenceContainer to copy into this container.
-     */
-    VectorSequenceContainer& operator=(const OrderedSequenceContainer& osc);
-  
-    /**
-     * @brief Copy from a SequenceContainer.
-     *
-     * @param osc The SequenceContainer to copy into this container.
-     */
-    VectorSequenceContainer& operator=(const SequenceContainer& osc);
-
-    /**
-     * @brief Container destructor: delete all sequences in the container.
-     */
-    virtual ~VectorSequenceContainer() { clear(); }
-
-  public:
-    
-    /**
-     * @name The Clonable interface.
-     *
-     * @{
-     */
-    Clonable* clone() const { return new VectorSequenceContainer(*this); }
-    /** @} */
-
-    /**
-     * @name The SequenceContainer interface.
-     *
-     * @{
-     */
-    bool hasSequence(const std::string& name) const;
-  
-    const Sequence& getSequence(const std::string& name) const throw (SequenceNotFoundException);
-
-    void setSequence(const std::string& name, const Sequence& sequence, bool checkName = true) throw (Exception)
-    {
-      setSequence(getSequencePosition(name), sequence, checkName);
-    }
-
-    Sequence* removeSequence(const std::string& name) throw (SequenceNotFoundException)
-    {
-      return removeSequence(getSequencePosition(name));
-    }
-
-    void deleteSequence(const std::string& name) throw (SequenceNotFoundException)
-    {
-      deleteSequence(getSequencePosition(name));
-    }
-    
-    size_t getNumberOfSequences() const { return sequences_.size(); }
-    
-    std::vector<std::string> getSequencesNames() const;
-    void setSequencesNames(const std::vector<std::string>& names, bool checkNames = true) throw (Exception);
-    void clear();
-    VectorSequenceContainer * createEmptyContainer() const;
-    
-    int& valueAt(const std::string& sequenceName, size_t elementIndex) throw (SequenceNotFoundException, IndexOutOfBoundsException)
-    {
-      return getSequence_(sequenceName)[elementIndex];
-    }
-
-    const int& valueAt(const std::string& sequenceName, size_t elementIndex) const throw (SequenceNotFoundException, IndexOutOfBoundsException)
-    {
-      return getSequence(sequenceName)[elementIndex]; 
-    }
-
-    int& operator()(const std::string& sequenceName, size_t elementIndex)
-    {
-      return getSequence_(sequenceName)[elementIndex];
-    }
-
-    const int& operator()(const std::string& sequenceName, size_t elementIndex) const
-    {
-      return getSequence(sequenceName)[elementIndex]; 
-    }
-    
-    int& valueAt(size_t sequenceIndex, size_t elementIndex) throw (IndexOutOfBoundsException)
-    {
-      return getSequence_(sequenceIndex)[elementIndex];
-    }
-
-    const int& valueAt(size_t sequenceIndex, size_t elementIndex) const throw (IndexOutOfBoundsException)
-    {
-      return getSequence(sequenceIndex)[elementIndex];
-    }
-
-    int& operator()(size_t sequenceIndex, size_t elementIndex)
-    {
-      return getSequence_(sequenceIndex)[elementIndex];
-    }
-    const int & operator()(size_t sequenceIndex, size_t elementIndex) const
-    {
-      return getSequence(sequenceIndex)[elementIndex];
-    } 
-    /** @} */
-
-
-    /**
-     * @name The OrderedSequenceContainer interface.
-     *
-     * @{
-     */
-    void setComments(const std::string & name, const Comments& comments) throw (SequenceNotFoundException)
-    {
-      AbstractSequenceContainer::setComments(name, comments);
-    }
-
-    void setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException);
-    size_t getSequencePosition(const std::string& name) const throw (SequenceNotFoundException);
-    const Sequence& getSequence(size_t sequenceIndex) const throw (IndexOutOfBoundsException);
-    void  setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName = true) throw (Exception);
-    Sequence* removeSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException);
-    void deleteSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException);
-    /** @} */
-    
-    /**
-     * @name Add sequence to this container.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Add a sequence at the end of the container.
-     *
-     * The sequence is copied into the container.
-     * If checkNames is set to true, the method check if the name of the
-     * sequence is already used in the container, and sends an exception if it
-     * is the case. Otherwise, do not check the name: the method is hence faster,
-     * but use it at your own risks!
-     *
-     * @param sequence The sequence to add.
-     * @param checkName Tell if the method must check the name of the sequence
-     * before adding it.
-     * @throw Exception If the sequence couldn't be added to the container.
-     */
-    virtual void addSequence(const Sequence& sequence, bool checkName = true) throw (Exception);
-
-    /**
-     * @brief Add a sequence to the container at a particular position.
-     *
-     * The sequence is copied into the container.
-     * If checkName is set to true, the method check if the name of the
-     * sequence is already used in the container, and sends an exception if it
-     * is the case. Otherwise, do not check the name: the method is hence faster,
-     * but use it at your own risks!
-     *
-     * @param sequence The sequence to add.
-     * @param sequenceIndex The position where to insert the new sequence.
-     * All the following sequences will be pushed.
-     * @param checkName Tell if the method must check the name of the sequence
-     * before adding it.
-     * @throw Exception If the sequence couldn't be added to the container.
-     */
-    virtual void addSequence(const Sequence& sequence, size_t sequenceIndex, bool checkName = true) throw (Exception);
-
-  protected:
-
-    /**
-     * @name AbstractSequenceContainer methods.
-     *
-     * @{
-     */
-    Sequence& getSequence_(size_t i) throw (IndexOutOfBoundsException);
-    Sequence& getSequence_(const std::string& name) throw (SequenceNotFoundException);
-    /** @} */
-};
-
-} //end of namespace bpp.
-
-#endif // _VECTORSEQUENCECONTAINER_H_
-
diff --git a/src/Bpp/Seq/Container/VectorSiteContainer.cpp b/src/Bpp/Seq/Container/VectorSiteContainer.cpp
deleted file mode 100644
index 331539a..0000000
--- a/src/Bpp/Seq/Container/VectorSiteContainer.cpp
+++ /dev/null
@@ -1,862 +0,0 @@
-//
-// File: VectorSiteContainer.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Oct  6 11:50:40 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "VectorSiteContainer.h"
-
-#include <iostream>
-
-using namespace std;
-
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-/** Class constructors: *******************************************************/
-
-VectorSiteContainer::VectorSiteContainer(
-  const std::vector<const Site*>& vs,
-  const Alphabet* alpha,
-  bool checkPositions)
-throw (Exception) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  names_(0),
-  comments_(0),
-  sequences_(0)
-{
-  if (vs.size() == 0)
-    throw Exception("VectorSiteContainer::VectorSiteContainer. Empty site set.");
-  // Seq names and comments:
-  size_t nbSeq = vs[0]->size();
-  names_.resize(nbSeq);
-  comments_.resize(nbSeq);
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    names_[i]    = "Seq_" + TextTools::toString(i);
-    comments_[i] = new Comments();
-  }
-  // Now try to add each site:
-  for (size_t i = 0; i < vs.size(); i++)
-  {
-    addSite(*vs[i], checkPositions); // This may throw an exception if position argument already exists or is size is not valid.
-  }
-
-  sequences_.resize(nbSeq);
-}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(size_t size, const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  names_(size),
-  comments_(size),
-  sequences_(size)
-{
-  // Seq names and comments:
-  for (size_t i = 0; i < size; i++)
-  {
-    names_[i]    = string("Seq_") + TextTools::toString(i);
-    comments_[i] = new Comments();
-  }
-}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(const std::vector<std::string>& names, const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  names_(names.size()),
-  comments_(names.size()),
-  sequences_(names.size())
-{
-  // Seq names and comments:
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    names_[i]    = names[i];
-    comments_[i] = new Comments();
-  }
-}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(const Alphabet* alpha) :
-  AbstractSequenceContainer(alpha),
-  sites_(0),
-  names_(0),
-  comments_(0),
-  sequences_(0)
-{}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(const VectorSiteContainer& vsc) :
-  AbstractSequenceContainer(vsc),
-  sites_(0),
-  names_(vsc.names_),
-  comments_(vsc.getNumberOfSequences()),
-  sequences_(vsc.getNumberOfSequences())
-{
-  // Now try to add each site:
-  for (size_t i = 0; i < vsc.getNumberOfSites(); i++)
-  {
-    addSite(vsc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  for (size_t i = 0; i < vsc.getNumberOfSequences(); i++)
-  {
-    comments_[i] = new Comments(vsc.getComments(i));
-  }
-}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(const SiteContainer& sc) :
-  AbstractSequenceContainer(sc),
-  sites_(0),
-  names_(sc.getSequencesNames()),
-  comments_(sc.getNumberOfSequences()),
-  sequences_(sc.getNumberOfSequences())
-{
-  // Now try to add each site:
-  for (size_t i = 0; i < sc.getNumberOfSites(); i++)
-  {
-    addSite(sc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  for (size_t i = 0; i < sc.getNumberOfSequences(); i++)
-  {
-    comments_[i] = new Comments(sc.getComments(i));
-  }
-}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(const OrderedSequenceContainer& osc) :
-  AbstractSequenceContainer(osc),
-  sites_(0),
-  names_(0),
-  comments_(0),
-  sequences_(0)
-{
-  for (size_t i = 0; i < osc.getNumberOfSequences(); i++)
-  {
-    addSequence(osc.getSequence(i), false);
-  }
-  reindexSites();
-}
-
-/******************************************************************************/
-
-VectorSiteContainer::VectorSiteContainer(const SequenceContainer& sc) :
-  AbstractSequenceContainer(sc),
-  sites_(0),
-  names_(0),
-  comments_(0),
-  sequences_(0)
-{
-  vector<string> names = sc.getSequencesNames();
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    addSequence(sc.getSequence(names[i]), false);
-  }
-  reindexSites();
-}
-
-/******************************************************************************/
-
-VectorSiteContainer& VectorSiteContainer::operator=(const VectorSiteContainer& vsc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(vsc);
-  // Seq names:
-  names_.resize(vsc.getNumberOfSequences());
-  setSequencesNames(vsc.getSequencesNames(), true);
-  // Now try to add each site:
-  for (size_t i = 0; i < vsc.getNumberOfSites(); i++)
-  {
-    addSite(vsc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  size_t nbSeq = vsc.getNumberOfSequences();
-  comments_.resize(nbSeq);
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    comments_[i] = new Comments(vsc.getComments(i));
-  }
-  sequences_.resize(nbSeq);
-
-  return *this;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer& VectorSiteContainer::operator=(const SiteContainer& sc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(sc);
-  // Seq names:
-  names_.resize(sc.getNumberOfSequences());
-  setSequencesNames(sc.getSequencesNames(), true);
-  // Now try to add each site:
-  for (size_t i = 0; i < sc.getNumberOfSites(); i++)
-  {
-    addSite(sc.getSite(i), false); // We assume that positions are correct.
-  }
-  // Seq comments:
-  size_t nbSeq = sc.getNumberOfSequences();
-  comments_.resize(nbSeq);
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    comments_[i] = new Comments(sc.getComments(i));
-  }
-  sequences_.resize(nbSeq);
-
-  return *this;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer& VectorSiteContainer::operator=(const OrderedSequenceContainer& osc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(osc);
-
-  size_t nbSeq = osc.getNumberOfSequences();
-  for (size_t i = 0; i < nbSeq; i++)
-  {
-    addSequence(osc.getSequence(i), false);
-  }
-  reindexSites();
-
-  return *this;
-}
-
-/******************************************************************************/
-
-VectorSiteContainer& VectorSiteContainer::operator=(const SequenceContainer& sc)
-{
-  clear();
-  AbstractSequenceContainer::operator=(sc);
-
-  vector<string> names = sc.getSequencesNames();
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    addSequence(sc.getSequence(names[i]), false);
-  }
-  reindexSites();
-
-  return *this;
-}
-
-/******************************************************************************/
-
-const Site& VectorSiteContainer::getSite(size_t i) const throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::getSite.", i, 0, getNumberOfSites() - 1);
-  return *sites_[i];
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::setSite(size_t pos, const Site& site, bool checkPositions) throw (Exception)
-{
-  if (pos >= getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::setSite.", pos, 0, getNumberOfSites() - 1);
-
-  // Check size:
-  if (site.size() != getNumberOfSequences())
-    throw SiteException("AlignedSequenceContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("VectorSiteContainer::setSite", getAlphabet(), site.getAlphabet());
-
-  // Check position:
-  if (checkPositions)
-  {
-    int position = site.getPosition();
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < sites_.size(); i++)
-    {
-      if (sites_[i]->getPosition() == position)
-        throw SiteException("VectorSiteContainer::setSite: Site position already exists in container", &site);
-    }
-  }
-  delete sites_[pos];
-  sites_[pos] = dynamic_cast<Site*>(site.clone());
-}
-
-/******************************************************************************/
-
-Site* VectorSiteContainer::removeSite(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::removeSite.", i, 0, getNumberOfSites() - 1);
-  Site* site = sites_[i];
-  sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(i));
-  return site;
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::deleteSite(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::deleteSite.", i, 0, getNumberOfSites() - 1);
-  delete sites_[i];
-  sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(i));
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException)
-{
-  if (siteIndex + length > getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::deleteSites.", siteIndex + length, 0, getNumberOfSites() - 1);
-  for (size_t i = siteIndex; i < siteIndex + length; ++i)
-  {
-    delete sites_[i];
-  }
-  sites_.erase(sites_.begin() + static_cast<ptrdiff_t>(siteIndex), sites_.begin() + static_cast<ptrdiff_t>(siteIndex + length));
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::addSite(const Site& site, bool checkPositions) throw (Exception)
-{
-  // Check size:
-  if (site.size() != getNumberOfSequences())
-    throw SiteException("VectorSiteContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("VectorSiteContainer::addSite", getAlphabet(), site.getAlphabet());
-  }
-
-  // Check position:
-  if (checkPositions)
-  {
-    int position = site.getPosition();
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < sites_.size(); i++)
-    {
-      if (sites_[i]->getPosition() == position)
-        throw SiteException("VectorSiteContainer::addSite. Site position already exists in container", &site);
-    }
-  }
-
-  sites_.push_back(dynamic_cast<Site*>(site.clone()));
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::addSite(const Site& site, int position, bool checkPositions) throw (Exception)
-{
-  // Check size:
-  if (site.size() != getNumberOfSequences())
-    throw SiteException("VectorSiteContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("VectorSiteContainer::addSite", getAlphabet(), site.getAlphabet());
-  }
-
-  // Check position:
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < sites_.size(); i++)
-    {
-      if (sites_[i]->getPosition() == position)
-        throw SiteException("VectorSiteContainer::addSite. Site position already exists in container", &site);
-    }
-  }
-  Site* copy = dynamic_cast<Site*>(site.clone());
-  copy->setPosition(position);
-  sites_.push_back(copy);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::addSite(const Site& site, size_t siteIndex, bool checkPositions) throw (Exception)
-{
-  if (siteIndex >= getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::addSite", siteIndex, 0, getNumberOfSites() - 1);
-
-  // Check size:
-  if (site.size() != getNumberOfSequences())
-    throw SiteException("VectorSiteContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("VectorSiteContainer::addSite", getAlphabet(), site.getAlphabet());
-  }
-
-  // Check position:
-  if (checkPositions)
-  {
-    int position = site.getPosition();
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < sites_.size(); i++)
-    {
-      if (sites_[i]->getPosition() == position)
-        throw SiteException("VectorSiteContainer::addSite. Site position already exists in container", &site);
-    }
-  }
-
-  // insert(begin() + pos, new Site(site));
-  sites_.insert(sites_.begin() + static_cast<ptrdiff_t>(siteIndex), dynamic_cast<Site*>(site.clone()));
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::addSite(const Site& site, size_t siteIndex, int position, bool checkPositions) throw (Exception)
-{
-  if (siteIndex >= getNumberOfSites())
-    throw IndexOutOfBoundsException("VectorSiteContainer::addSite", siteIndex, 0, getNumberOfSites() - 1);
-
-  // Check size:
-  if (site.size() != getNumberOfSequences())
-    throw SiteException("VectorSiteContainer::addSite. Site does not have the appropriate length", &site);
-
-  // New site's alphabet and site container's alphabet matching verification
-  if (site.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("VectorSiteContainer::addSite", getAlphabet(), site.getAlphabet());
-  }
-
-  // Check position:
-  if (checkPositions)
-  {
-    // For all positions in vector : throw exception if position already exists
-    for (size_t i = 0; i < sites_.size(); i++)
-    {
-      if (sites_[i]->getPosition() == position)
-        throw SiteException("VectorSiteContainer::addSite. Site position already exists in container", &site);
-    }
-  }
-
-  Site* copy = dynamic_cast<Site*>(site.clone());
-  copy->setPosition(position);
-  sites_.insert(sites_.begin() + static_cast<ptrdiff_t>(siteIndex), copy);
-}
-
-/******************************************************************************/
-
-size_t VectorSiteContainer::getNumberOfSites() const
-{
-  return sites_.size();
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::reindexSites()
-{
-  int pos = 1; // first position is 1.
-  for (vector<Site*>::iterator i = sites_.begin(); i < sites_.end(); i++)
-  {
-    (*i)->setPosition(pos++);
-  }
-}
-
-/******************************************************************************/
-
-Vint VectorSiteContainer::getSitePositions() const
-{
-  Vint positions(sites_.size());
-  for (size_t i = 0; i < sites_.size(); i++)
-  {
-    positions[i] = sites_[i]->getPosition();
-  }
-  return positions;
-}
-
-/******************************************************************************/
-
-const Sequence& VectorSiteContainer::getSequence(size_t i) const throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSiteContainer::getSequence.", i, 0, getNumberOfSequences() - 1);
-
-  // Main loop : for all sites
-  size_t n = getNumberOfSites();
-  vector<int> sequence(n);
-  for (size_t j = 0; j < n; j++)
-  {
-    sequence[j] = sites_[j]->getContent()[i];
-  }
-  if (sequences_[i])
-    delete sequences_[i];
-  sequences_[i] = new BasicSequence(names_[i], sequence, *comments_[i], getAlphabet());
-  return *sequences_[i];
-}
-
-/******************************************************************************/
-
-const Sequence& VectorSiteContainer::getSequence(const string& name) const throw (SequenceNotFoundException)
-{
-  // Look for sequence name:
-  size_t pos = getSequencePosition(name);
-  return getSequence(pos);
-}
-
-/******************************************************************************/
-
-bool VectorSiteContainer::hasSequence(const string& name) const
-{
-  // Look for sequence name:
-  for (size_t pos = 0; pos < names_.size(); pos++)
-  {
-    if (names_[pos] == name)
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-size_t VectorSiteContainer::getSequencePosition(const string& name) const throw (SequenceNotFoundException)
-{
-  // Look for sequence name:
-  for (size_t pos = 0; pos < names_.size(); pos++)
-  {
-    if (names_[pos] == name)
-      return pos;
-  }
-  throw SequenceNotFoundException("VectorSiteContainer::getSequencePosition().", name);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::setSequence(const string& name, const Sequence& sequence, bool checkNames) throw (Exception)
-{
-  // Look for sequence name:
-  size_t pos = getSequencePosition(name);
-  setSequence(pos, sequence, checkNames);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::setSequence(size_t pos, const Sequence& sequence, bool checkNames)
-throw (Exception)
-{
-  if (pos >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSiteContainer::setSequence", pos, 0, getNumberOfSequences() - 1);
-
-  // New sequence's alphabet and site container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("VectorSiteContainer::addSite", getAlphabet(), sequence.getAlphabet());
-
-  // If the container has only one sequence, we set the size to the size of this sequence:
-  if (getNumberOfSequences() == 1)
-    realloc(sequence.size());
-
-  if (sequence.size() != sites_.size())
-    throw SequenceException("VectorSiteContainer::setSequence. Sequence has not the appropriate length.", &sequence);
-
-  if (checkNames)
-  {
-    for (size_t i = 0; i < names_.size(); i++)
-    {
-      if (i != pos && sequence.getName() == names_[i])
-        throw SequenceException("VectorSiteContainer::settSequence. Name already exists in container.", &sequence);
-    }
-  }
-  // Update name:
-  names_[pos] = sequence.getName();
-  // Update elements at each site:
-  for (size_t i = 0; i < sites_.size(); i++)
-  {
-    sites_[i]->setElement(pos, sequence.getValue(i));
-  }
-  // Update comments:
-  if (comments_[pos])
-    delete comments_[pos];
-  comments_[pos] = new Comments(sequence.getComments());
-  // Update sequences:
-  if (sequences_[pos])
-    delete sequences_[pos];
-  sequences_[pos] = 0;
-}
-
-/******************************************************************************/
-
-Sequence* VectorSiteContainer::removeSequence(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSiteContainer::removeSequence.", i, 0, getNumberOfSequences() - 1);
-
-  getSequence(i); // Actuallizes pointer.
-  Sequence* sequence = sequences_[i];
-  for (size_t j = 0; j < sites_.size(); j++)
-  {
-    // For each site:
-    sites_[j]->deleteElement(i);
-  }
-
-  // Now actualize names and comments:
-  names_.erase(names_.begin() + static_cast<ptrdiff_t>(i));
-  if (comments_[i])
-    delete comments_[i];
-  comments_.erase(comments_.begin() + static_cast<ptrdiff_t>(i));
-  // We remove the sequence, so the destruction of the sequence is up to the user:
-  // if (sequences_[i] != 0) delete sequences_[i];
-  sequences_.erase(sequences_.begin() + static_cast<ptrdiff_t>(i));
-  return sequence;
-}
-
-/******************************************************************************/
-
-Sequence* VectorSiteContainer::removeSequence(const string& name) throw (SequenceNotFoundException)
-{
-  // Look for sequence name:
-  size_t pos = getSequencePosition(name);
-  return removeSequence(pos);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::deleteSequence(size_t i) throw (IndexOutOfBoundsException)
-{
-  if (i >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSiteContainer::demeteSequence.", i, 0, getNumberOfSequences() - 1);
-  for (size_t j = 0; j < sites_.size(); j++)
-  {
-    sites_[j]->deleteElement(i);
-  }
-
-  // Now actualize names and comments:
-  names_.erase(names_.begin() + static_cast<ptrdiff_t>(i));
-  if (comments_[i])
-    delete comments_[i];
-  comments_.erase(comments_.begin() + static_cast<ptrdiff_t>(i));
-  if (sequences_[i])
-    delete sequences_[i];
-  sequences_.erase(sequences_.begin() + static_cast<ptrdiff_t>(i));
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::deleteSequence(const string& name) throw (SequenceNotFoundException)
-{
-  // Look for sequence name:
-  size_t pos = getSequencePosition(name);
-  deleteSequence(pos);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::addSequence(const Sequence& sequence, bool checkNames) throw (Exception)
-{
-  // If the container has no sequence, we set the size to the size of this sequence:
-  if (getNumberOfSequences() == 0)
-    realloc(sequence.size());
-
-  // New sequence's alphabet and site container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("VectorSiteContainer::addSequence", getAlphabet(), sequence.getAlphabet());
-
-  if (sequence.size() != sites_.size())
-    throw SequenceException("VectorSiteContainer::addSequence. Sequence has not the appropriate length: " + TextTools::toString(sequence.size()) + ", should be " + TextTools::toString(sites_.size()) + ".", &sequence);
-
-  if (checkNames)
-  {
-    for (size_t i = 0; i < names_.size(); i++)
-    {
-      if (sequence.getName() == names_[i])
-        throw SequenceException("VectorSiteContainer::addSequence. Name already exists in container.", &sequence);
-    }
-  }
-
-  // Append name:
-  names_.push_back(sequence.getName());
-
-  // Append elements at each site:
-  for (size_t i = 0; i < sites_.size(); i++)
-  {
-    sites_[i]->addElement(sequence.getValue(i));
-  }
-
-  // Append comments:
-  comments_.push_back(new Comments(sequence.getComments()));
-
-  // Sequences pointers:
-  sequences_.push_back(0);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::addSequence(
-  const Sequence& sequence,
-  size_t pos,
-  bool checkNames)
-throw (Exception)
-{
-  if (pos >= getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSiteContainer::addSequence.", pos, 0, getNumberOfSequences() - 1);
-  if (sequence.size() != sites_.size())
-    throw SequenceNotAlignedException("VectorSiteContainer::setSequence", &sequence);
-
-  // New sequence's alphabet and site container's alphabet matching verification
-  if (sequence.getAlphabet()->getAlphabetType() != getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("VectorSiteContainer::addSite", getAlphabet(), sequence.getAlphabet());
-  }
-
-  if (checkNames)
-  {
-    for (size_t i = 0; i < names_.size(); i++)
-    {
-      if (sequence.getName() == names_[i])
-        throw SequenceException("VectorSiteContainer::addSequence. Name already exists in container.", &sequence);
-    }
-  }
-
-  for (size_t i = 0; i < sites_.size(); i++)
-  {
-    // For each site:
-    sites_[i]->addElement(pos, sequence.getValue(i));
-  }
-  // Actualize names and comments:
-  names_.insert(names_.begin() + static_cast<ptrdiff_t>(pos), sequence.getName());
-  comments_.insert(comments_.begin() + static_cast<ptrdiff_t>(pos), new Comments(sequence.getComments()));
-  sequences_.insert(sequences_.begin() + static_cast<ptrdiff_t>(pos), 0);
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::clear()
-{
-  // Must delete all sites in the container:
-  for (size_t i = 0; i < sites_.size(); i++)
-  {
-    delete sites_[i];
-  }
-
-  // must delete all comments too:
-  for (size_t i = 0; i < comments_.size(); i++)
-  {
-    if (comments_[i] != 0)
-      delete comments_[i];
-  }
-
-  // Delete all sequences retrieved:
-  for (size_t i = 0; i < sequences_.size(); i++)
-  {
-    if (sequences_[i] != 0)
-      delete (sequences_[i]);
-  }
-
-  // Delete all sites pointers
-  sites_.clear();
-  names_.clear();
-  comments_.clear();
-  sequences_.clear();
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::realloc(size_t n)
-{
-  clear();
-  sites_.resize(n);
-  for (size_t i = 0; i < n; i++)
-  {
-    sites_[i] = new Site(getAlphabet());
-  }
-  reindexSites();
-}
-
-/******************************************************************************/
-
-vector<string> VectorSiteContainer::getSequencesNames() const
-{
-  return names_;
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::setSequencesNames(
-  const vector<string>& names,
-  bool checkNames)
-throw (Exception)
-{
-  if (names.size() != getNumberOfSequences())
-    throw IndexOutOfBoundsException("VectorSiteContainer::setSequenceNames: bad number of names.", names.size(), getNumberOfSequences(), getNumberOfSequences());
-  if (checkNames)
-  {
-    for (size_t i = 0; i < names.size(); i++)
-    {
-      // For all names in vector : throw exception if name already exists
-      for (size_t j = 0; j < i; j++)
-      {
-        if (names[j] == names[i])
-          throw Exception("VectorSiteContainer::setSequencesNames : Sequence's name already exists in container");
-      }
-    }
-  }
-  for (size_t i = 0; i < names.size(); i++)
-  {
-    names_[i] = names[i];
-  }
-}
-
-/******************************************************************************/
-
-void VectorSiteContainer::setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException)
-{
-  comments_[sequenceIndex] = new Comments(comments);
-}
-
-/******************************************************************************/
-
-VectorSiteContainer* VectorSiteContainer::createEmptyContainer() const
-{
-  VectorSiteContainer* vsc = new VectorSiteContainer(getAlphabet());
-  vsc->setGeneralComments(getGeneralComments());
-  return vsc;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Container/VectorSiteContainer.h b/src/Bpp/Seq/Container/VectorSiteContainer.h
deleted file mode 100644
index b66f54b..0000000
--- a/src/Bpp/Seq/Container/VectorSiteContainer.h
+++ /dev/null
@@ -1,240 +0,0 @@
-//
-// File: VectorSiteContainer.h
-// Created by: Julien Dutheil
-// Created on: Mon Oct  6 11:50:40 2003
-//
-
-/*
-   Copyright or © or Copr. CNRS, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _VECTORSITECONTAINER_H_
-#define _VECTORSITECONTAINER_H_
-
-#include "../Site.h"
-#include "SiteContainer.h"
-#include "AbstractSequenceContainer.h"
-#include "AlignedSequenceContainer.h"
-#include "OrderedSequenceContainer.h"
-#include <Bpp/Numeric/VectorTools.h>
-
-// From the STL library:
-#include <string>
-#include <vector>
-#include <iostream>
-
-namespace bpp
-{
-/**
- * @brief The VectorSiteContainer class.
- *
- * Sites are stored in a std::vector of pointers.
- * Site access is hence in \f$O(1)\f$, and sequence access in \f$O(l)\f$, where
- * \f$l\f$ is the number of sites in the container.
- *
- * See AlignedSequenceContainer for an alternative implementation.
- *
- * @see Sequence, Site, AlignedSequenceContainer
- */
-class VectorSiteContainer :
-  public AbstractSequenceContainer,
-  // This container implements the SequenceContainer interface
-  // and use the AbstractSequenceContainer adapter.
-  public virtual SiteContainer        // This container is a SiteContainer.
-{
-protected:
-  std::vector<Site*> sites_;
-  std::vector<std::string> names_;
-  std::vector<Comments*> comments_; // Sequences comments.
-  mutable std::vector<Sequence*> sequences_; // To store pointer toward sequences retrieves (cf. AlignedSequenceContainer).
-
-public:
-  /**
-   * @brief Build a new container from a set of sites.
-   *
-   * @param vs A std::vector of sites.
-   * @param alpha The common alphabet for all sites.
-   * @param checkPositions Check for the redundancy of site position tag. This may turn to be very time consuming!
-   * @throw Exception If sites differ in size or in alphabet.
-   */
-  VectorSiteContainer(const std::vector<const Site*>& vs, const Alphabet* alpha, bool checkPositions = true) throw (Exception);
-  /**
-   * @brief Build a new empty container with specified size.
-   *
-   * @param size Number of sequences in the container.
-   * @param alpha The alphabet for this container.
-   */
-  VectorSiteContainer(size_t size, const Alphabet* alpha);
-  /**
-   * @brief Build a new empty container with specified sequence names.
-   *
-   * @param names Sequence names. This will set the number of sequences in the container.
-   * @param alpha The alphabet for this container.
-   */
-  VectorSiteContainer(const std::vector<std::string>& names, const Alphabet* alpha);
-
-  /**
-   * @brief Build a new empty container.
-   *
-   * @param alpha The alphabet for this container.
-   */
-  VectorSiteContainer(const Alphabet* alpha);
-
-  VectorSiteContainer(const VectorSiteContainer& vsc);
-  VectorSiteContainer(const SiteContainer&  sc);
-  VectorSiteContainer(const OrderedSequenceContainer& osc);
-  VectorSiteContainer(const SequenceContainer&  sc);
-
-  VectorSiteContainer& operator=(const VectorSiteContainer& vsc);
-  VectorSiteContainer& operator=(const SiteContainer&  sc);
-  VectorSiteContainer& operator=(const OrderedSequenceContainer& osc);
-  VectorSiteContainer& operator=(const SequenceContainer&  sc);
-
-  virtual ~VectorSiteContainer() { clear(); }
-
-public:
-  /**
-   * @name The Clonable interface.
-   *
-   * @{
-   */
-  VectorSiteContainer* clone() const { return new VectorSiteContainer(*this); }
-  /** @} */
-
-  /**
-   * @name The SiteContainer interface implementation:
-   *
-   * @{
-   */
-  const Site& getSite(size_t siteIndex) const throw (IndexOutOfBoundsException);
-  void        setSite(size_t siteIndex, const Site& site, bool checkPosition = true) throw (Exception);
-  Site*    removeSite(size_t siteIndex) throw (IndexOutOfBoundsException);
-  void     deleteSite(size_t siteIndex) throw (IndexOutOfBoundsException);
-  void    deleteSites(size_t siteIndex, size_t length) throw (IndexOutOfBoundsException);
-  void        addSite(const Site& site,                                 bool checkPosition = true) throw (Exception);
-  void        addSite(const Site& site,                   int position, bool checkPosition = true) throw (Exception);
-  void        addSite(const Site& site, size_t siteIndex,               bool checkPosition = true) throw (Exception);
-  void        addSite(const Site& site, size_t siteIndex, int position, bool checkPosition = true) throw (Exception);
-  size_t getNumberOfSites() const;
-  void reindexSites();
-  Vint getSitePositions() const;
-  /** @} */
-
-  // Theses methods are implemented for this class:
-
-  /**
-   * @name The SequenceContainer interface.
-   *
-   * @{
-   */
-  void setComments(size_t sequenceIndex, const Comments& comments) throw (IndexOutOfBoundsException);
-
-  // Method to get a sequence object from sequence container
-  const Sequence& getSequence(size_t sequenceIndex) const throw (IndexOutOfBoundsException);
-  const Sequence& getSequence(const std::string& name) const throw (SequenceNotFoundException);
-  bool hasSequence(const std::string& name) const;
-
-  // Methods to get position of a sequence in sequence container from his name
-  // This method is used by delete and remove methods
-  size_t getSequencePosition(const std::string& name) const throw (SequenceNotFoundException);
-
-  Sequence* removeSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException);
-  Sequence* removeSequence(const std::string& name) throw (SequenceNotFoundException);
-
-  void deleteSequence(size_t sequenceIndex) throw (IndexOutOfBoundsException);
-  void deleteSequence(const std::string& name) throw (SequenceNotFoundException);
-
-  size_t getNumberOfSequences() const { return names_.size(); }
-
-  std::vector<std::string> getSequencesNames() const;
-
-  void setSequencesNames(const std::vector<std::string>& names, bool checkNames = true) throw (Exception);
-
-  void clear();
-
-  VectorSiteContainer* createEmptyContainer() const;
-
-  int& valueAt(const std::string& sequenceName, size_t elementIndex) throw (SequenceNotFoundException, IndexOutOfBoundsException)
-  {
-    if (elementIndex >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::valueAt(std::string, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[elementIndex])[getSequencePosition(sequenceName)];
-  }
-  const int& valueAt(const std::string& sequenceName, size_t elementIndex) const throw (SequenceNotFoundException, IndexOutOfBoundsException)
-  {
-    if (elementIndex >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::valueAt(std::string, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[elementIndex])[getSequencePosition(sequenceName)];
-  }
-  int& operator()(const std::string& sequenceName, size_t elementIndex)
-  {
-    return (*sites_[elementIndex])[getSequencePosition(sequenceName)];
-  }
-  const int& operator()(const std::string& sequenceName, size_t elementIndex) const
-  {
-    return (*sites_[elementIndex])[getSequencePosition(sequenceName)];
-  }
-
-  int& valueAt(size_t sequenceIndex, size_t elementIndex) throw (IndexOutOfBoundsException)
-  {
-    if (sequenceIndex >= getNumberOfSequences()) throw IndexOutOfBoundsException("VectorSiteContainer::valueAt(size_t, size_t).", sequenceIndex, 0, getNumberOfSequences() - 1);
-    if (elementIndex  >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::valueAt(size_t, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[elementIndex])[sequenceIndex];
-  }
-  const int& valueAt(size_t sequenceIndex, size_t elementIndex) const throw (IndexOutOfBoundsException)
-  {
-    if (sequenceIndex >= getNumberOfSequences()) throw IndexOutOfBoundsException("VectorSiteContainer::valueAt(size_t, size_t).", sequenceIndex, 0, getNumberOfSequences() - 1);
-    if (elementIndex  >= getNumberOfSites()) throw IndexOutOfBoundsException("VectorSiteContainer::valueAt(size_t, size_t).", elementIndex, 0, getNumberOfSites() - 1);
-    return (*sites_[elementIndex])[sequenceIndex];
-  }
-  int& operator()(size_t sequenceIndex, size_t elementIndex)
-  {
-    return (*sites_[elementIndex])[sequenceIndex];
-  }
-  const int& operator()(size_t sequenceIndex, size_t elementIndex) const
-  {
-    return (*sites_[elementIndex])[sequenceIndex];
-  }
-  /** @} */
-
-  void addSequence(const Sequence& sequence,                             bool checkName = true) throw (Exception);
-  void addSequence(const Sequence& sequence, size_t sequenceIndex, bool checkName = true) throw (Exception);
-
-  void setSequence(const std::string& name,    const Sequence& sequence, bool checkName) throw (Exception);
-  void setSequence(size_t sequenceIndex, const Sequence& sequence, bool checkName) throw (Exception);
-
-protected:
-  // Create n void sites:
-  void realloc(size_t n);
-};
-} // end of namespace bpp.
-
-#endif  // _VECTORSITECONTAINER_H_
-
diff --git a/src/Bpp/Seq/DNAToRNA.h b/src/Bpp/Seq/DNAToRNA.h
deleted file mode 100644
index b86f2be..0000000
--- a/src/Bpp/Seq/DNAToRNA.h
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// File: DNAToRNA.h
-// Created by: Julien Dutheil
-// Created on: Sun Oct 12 14:39:29 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _DNATORNA_H_
-#define _DNATORNA_H_
-
-#include "Transliterator.h"
-#include "Alphabet/DNA.h"
-#include "Alphabet/RNA.h"
-#include "Alphabet/AlphabetTools.h"
-
-namespace bpp
-{
-
-/**
- * @brief Reverse iterator to convert RNA to DNA.
- *
- * This only changes U to T characters.
- *
- * @see NucleicAcidsReplication
- */
-class DNAToRNA:
-  public AbstractReverseTransliterator
-{
-	private:
-		const Alphabet* dna_, * rna_;
-	
-	public:
-		DNAToRNA(): AbstractReverseTransliterator(), dna_(&AlphabetTools::DNA_ALPHABET), rna_(&AlphabetTools::RNA_ALPHABET) {}
-
-    DNAToRNA(const DNAToRNA& d2r): AbstractReverseTransliterator(d2r), dna_(d2r.dna_), rna_(d2r.rna_) {}
-    
-    DNAToRNA& operator=(const DNAToRNA& d2r)
-    {
-      AbstractReverseTransliterator::operator=(d2r);
-      dna_ = d2r.dna_;
-      rna_ = d2r.rna_;
-      return *this;
-    }
-		
-    virtual ~DNAToRNA() {}
-	
-	public:
-		virtual const Alphabet* getSourceAlphabet() const { return dna_; }
-		virtual const Alphabet* getTargetAlphabet() const { return rna_; }
-		int translate(int state) const throw (BadIntException);		
-    std::string translate(const std::string& state) const throw (BadCharException);		
-		Sequence* translate(const Sequence& sequence) const throw (AlphabetMismatchException, Exception)
-    {
-      return AbstractReverseTransliterator::translate(sequence);
-    }
-		int reverse(int state) const throw (BadIntException);
-    std::string reverse(const std::string& state) const throw (BadCharException);
-		Sequence* reverse(const Sequence& sequence) const throw (AlphabetMismatchException, Exception)
-    {
-      return AbstractReverseTransliterator::reverse(sequence);
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_DNATORNA_H_
-
diff --git a/src/Bpp/Seq/DistanceMatrix.h b/src/Bpp/Seq/DistanceMatrix.h
deleted file mode 100644
index 8945736..0000000
--- a/src/Bpp/Seq/DistanceMatrix.h
+++ /dev/null
@@ -1,256 +0,0 @@
-//
-// File: DistanceMatrix.h
-// Created on: Wed jun 08 10:39 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for phylogenetic data analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _DISTANCEMATRIX_H_
-#define _DISTANCEMATRIX_H_
-
-// From the STL:
-#include <vector>
-#include <string>
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/VectorExceptions.h> //DimensionException
-#include <Bpp/Numeric/Matrix/Matrix.h>
-
-namespace bpp
-{
-
-/**
- * @brief A Matrix class to store phylogenetic distances.
- */
-class DistanceMatrix:
-  public virtual Clonable
-{
-
-	private:
-    RowMatrix<double> distances_;
-    std::vector<std::string> names_;
-
-	public:
-
-    /**
-     * @brief Build a new distance matrix with specified names.
-     *
-     * The dimension of the matrix will be equal to the number of names
-     *
-     * @param names The names to use.
-     */
-		DistanceMatrix(const std::vector<std::string>& names):
-      distances_(names.size(), names.size()),
-      names_(names)
-		{
-			reset();
-		}
-
-		/**
-     * @brief Build a new distance matrix with specified size.
-     *
-     * Row names will be named 'Taxon 0', 'Taxon 1', and so on.
-     *
-     * @param n The size of the matrix.
-     */
-    DistanceMatrix(size_t n):
-      distances_(n, n), names_(n)
-		{
-      resize(n);
-		}
-
-		virtual ~DistanceMatrix() {}
-
-		DistanceMatrix(const DistanceMatrix& dist):
-      distances_(dist.distances_),
-      names_(dist.names_)	{}
-
-		DistanceMatrix& operator=(const DistanceMatrix& dist)
-		{
-			size_t n = dist.size();
-			resize(n);
-			for(size_t i = 0; i < n; ++i)
-      {
-				for(size_t j = 0; j < n; ++j)
-        {
-					distances_(i, j) = dist(i, j);
-				}
-			}
-			names_ = dist.names_;
-			return *this;
-		}
-
-    DistanceMatrix* clone() const { return new DistanceMatrix(*this); }
-		
-	public:
-
-    /**
-     * @brief Reset the distance matrix: all distances are set to 0.
-     */
-		void reset()
-		{
-			size_t n = size();
-			for (size_t i = 0; i < n; ++i)
-      {
-				for (size_t j = 0; j < n; ++j)
-        {
-					distances_(i, j) = 0;
-				}
-			}
-		}
-		
-    /**
-     * @return The dimension of the matrix.
-     */
-		size_t size() const { return names_.size(); }
-
-    /**
-     * @return The names associated to the matrix.
-     */
-    const std::vector<std::string>& getNames() const { return names_; }
-
-    /**
-     * @return The ith name.
-     * @param i Name index.
-     * @throw IndexOutOfBoundsException If i is not a valid index.
-     */
-    const std::string& getName(size_t i) const throw (IndexOutOfBoundsException)
-    { 
-      if (i >= size()) throw IndexOutOfBoundsException("DistanceMatrix::getName. Invalid indice.", i, 0, size());
-      return names_[i];
-    }
-    
-    /**
-     * @brief Set the ith name.
-     * 
-     * @param i Name index.
-     * @param name The new name.
-     * @throw IndexOutOfBoundsException If i is not a valid index.
-     */
-		void setName(size_t i, const std::string& name) throw (IndexOutOfBoundsException)
-		{
-			if (i >= size()) throw IndexOutOfBoundsException("DistanceMatrix::setName. Invalid indice.", i, 0, size());
-			names_[i] = name;
-		}
-
-    /**
-     * @brief Set the names associated to the matrix.
-     * 
-     * @param names Matrix names.
-     * @throw DimensionException If 'names' have not the same size as the matrix.
-     */
-		void setNames(const std::vector<std::string>& names) throw (DimensionException)
-		{
-			if (names.size() != names_.size()) throw DimensionException("DistanceMatrix::setNames. Invalid number of names.", names.size(), names_.size());
-			names_ = names;
-		}
-
-    /**
-     * @brief Get the index of a given name.
-     *
-     * @param name The name to look for.
-     * @return The position of the name.
-     * @throw Exception If no names are attached to this matrix, or if the name was not found.
-     */
-    size_t getNameIndex(const std::string& name) const throw (Exception);
-
-    /**
-     * @brief Change the dimension of the matrix.
-     *
-     * @param n the new dimension of the matrix.
-     */
-    void resize(size_t n) {
-      //RowMatrix<double>::resize(n, n);
-      distances_.resize(n, n);
-      names_.resize(n);
-			for (size_t i = 0; i < n; ++i)
-        names_[i] = "Taxon " + TextTools::toString(i);
-      reset();
-    }
-
-    /**
-     * @brief Access by name.
-     *
-     * @param iName Name 1 (row)
-     * @param jName Name 2 (column)
-     * @return A reference toward the specified distance.
-     * @throw Exception if the matrix has no name of if one of the name do not match existing names.
-     */
-    virtual const double& operator()(const std::string& iName, const std::string& jName) const throw (Exception)
-    {
-      size_t i = getNameIndex(iName);
-      size_t j = getNameIndex(jName);
-      //return operator()(i,j);
-      return distances_(i,j);
-    }
-
-    /**
-     * @brief Access by name.
-     *
-     * @param iName Name 1 (row)
-     * @param jName Name 2 (column)
-     * @return A reference toward the specified distance.
-     * @throw Exception if the matrix has no name of if one of the name do not match existing names.
-     */
-    virtual double& operator()(const std::string& iName, const std::string& jName) throw (Exception)
-    {
-      size_t i = getNameIndex(iName);
-      size_t j = getNameIndex(jName);
-      //return operator()(i,j);
-      return distances_(i,j);
-    }
-
-    virtual const double& operator()(size_t i, size_t j) const
-    {
-      //return RowMatrix<double>::operator()(i, j);
-      return distances_(i, j);
-    }
-    virtual double& operator()(size_t i, size_t j)
-    {
-      //return RowMatrix<double>::operator()(i, j);
-      return distances_(i, j);
-    }
-
-    virtual const Matrix<double>& asMatrix() const {
-      return distances_;
-    }
-    
-    virtual Matrix<double>& asMatrix() {
-      return distances_;
-    }
-};
-
-} //end of namespace bpp.
-
-#endif //_DISTANCEMATRIX_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.cpp
deleted file mode 100644
index b670804..0000000
--- a/src/Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: AscidianMitochondrialGeneticCode.h
-// Created by: Fidel Botero and Julien Dutheil
-// Created on: Thu Jun 13 11:32:00 CET 2013
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "AscidianMitochondrialGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-AscidianMitochondrialGeneticCode::AscidianMitochondrialGeneticCode(const NucleicAlphabet* alphabet) :
-  GeneticCode(alphabet) 
-{
-  tlnTable_[0] = 11; //AAA -> K
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = 7; //AGA -> G
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = 7; //AGG -> G
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 12; //ATA -> M
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 10; //CTA -> L
-  tlnTable_[29] = 10; //CTC -> L
-  tlnTable_[30] = 10; //CTG -> L
-  tlnTable_[31] = 10; //CTT -> L
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; //TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; //TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = 17; //TGA -> W
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.h b/src/Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.h
deleted file mode 100644
index 63bbf29..0000000
--- a/src/Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.h
+++ /dev/null
@@ -1,113 +0,0 @@
-//
-// File: AscidianMitochondrialGeneticCode.h
-// Created by: Fidel Botero and Julien Dutheil
-// Created on: Thu Jun 13 11:32:00 CET 2013
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ASCIDIANMITOCHONDRIALGENETICCODE_H_
-#define _ASCIDIANMITOCHONDRIALGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the ascidian mitochondrial genetic code as describe on the NCBI 
- *        web site: http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG13
- */
-class AscidianMitochondrialGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		AscidianMitochondrialGeneticCode(const NucleicAlphabet* alphabet);
-		
-    virtual ~AscidianMitochondrialGeneticCode() {}
-	
-    virtual AscidianMitochondrialGeneticCode* clone() const {
-      return new AscidianMitochondrialGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 2.; }
- 
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(4);
-      v[0] = 8;
-      v[1] = 10;
-      v[2] = 48;
-      v[3] = 50;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(4);
-      v[0] = "AGA";
-      v[1] = "AGG";
-      v[2] = "TAA";
-      v[4] = "TAG";
-      return v;
-    }
-    
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 12 || state == 46 || state == 62);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 12 || i == 46 || i == 62);
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_ASCIDIANMITOCHONDRIALGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.cpp
deleted file mode 100644
index b4af392..0000000
--- a/src/Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// File: EchinodermMitochondrialGeneticCode.cpp
-// Created by: Eric Bazin
-// Created on: 14 11:31:27 CET 2005
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "EchinodermMitochondrialGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-EchinodermMitochondrialGeneticCode::EchinodermMitochondrialGeneticCode(const NucleicAlphabet* alphabet) :
-  GeneticCode(alphabet) 
-{
-  tlnTable_[0] = 2; //AAA -> N
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = 15; //AGA -> S
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = 15; //AGG -> S
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 9; //ATA -> I
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 10; //CTA -> L
-  tlnTable_[29] = 10; //CTC -> L
-  tlnTable_[30] = 10; //CTG -> L
-  tlnTable_[31] = 10; //CTT -> L
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; //TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; //TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = 17; //TGA -> W
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.h b/src/Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.h
deleted file mode 100644
index e114dd5..0000000
--- a/src/Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.h
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// File: EchinodermMitochondrialGeneticCode.h
-// Created by: Eric Bazin
-// Created on: 14 11:31:27 CET 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ECHINODERMMITOCHONDRIALGENETICCODE_H_
-#define _ECHINODERMMITOCHONDRIALGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the Echinoderm and Faltworms
- * Mitochondrial genetic code as describe on the NCBI website:
- * http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG9
- */
-class EchinodermMitochondrialGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		EchinodermMitochondrialGeneticCode(const NucleicAlphabet* alphabet);
-
-		virtual ~EchinodermMitochondrialGeneticCode() {}
-
-    virtual EchinodermMitochondrialGeneticCode* clone() const {
-      return new EchinodermMitochondrialGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 2.; }
- 
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(2);
-      v[1] = 48;
-      v[2] = 50;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(2);
-      v[1] = "TAA";
-      v[2] = "TAG";
-      return v;
-    }
-    
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 46);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 46);
-    }
-   
-};
-
-} //end of namespace bpp.
-
-#endif	//_ECHINODERMMITOCHONDRIALGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/GeneticCode.cpp b/src/Bpp/Seq/GeneticCode/GeneticCode.cpp
deleted file mode 100644
index 13a60fa..0000000
--- a/src/Bpp/Seq/GeneticCode/GeneticCode.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-//
-// File: GeneticCode.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Oct 13 15:37:25 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "GeneticCode.h"
-#include "../SequenceTools.h"
-#include "../Alphabet/AlphabetTools.h"
-
-using namespace bpp;
-using namespace std;
-
-/**********************************************************************************************/
-
-StopCodonException::StopCodonException(const std::string& text, const std::string& codon) :
-  Exception("StopCodonException: " + text + "(" + codon + ")"),
-  codon_(codon) {}
-
-/**********************************************************************************************/
-
-int GeneticCode::translate(int state) const throw (BadIntException, Exception)
-{
-  if (isStop(state))
-    throw StopCodonException("GeneticCode::translate().", codonAlphabet_.intToChar(state)); 
-    
-  map<int, int>::const_iterator it = tlnTable_.find(state);
-  if (it == tlnTable_.end())
-    throw BadIntException(state, "GeneticCode::translate().");
-  
-  return it->second;
-}		
-
-/**********************************************************************************************/
-
-std::string GeneticCode::translate(const std::string& state) const throw (BadCharException, Exception)
-{
-  int x = codonAlphabet_.charToInt(state);
-  return proteicAlphabet_.intToChar(translate(x));
-}
-
-/**********************************************************************************************/
-
-vector<int> GeneticCode::getSynonymous(int aminoacid) const throw (BadIntException)
-{
-  // test:
-  proteicAlphabet_.intToChar(aminoacid);
-
-  vector<int> synonymes;
-  for (int i = 0; i < static_cast<int>(codonAlphabet_.getSize()); ++i)
-  {
-    try
-    {
-      if (translate(i) == aminoacid)
-        synonymes.push_back(i);
-    }
-    catch (StopCodonException)
-    { }
-  }
-  return synonymes;
-}
-
-/**********************************************************************************************/
-
-std::vector<std::string> GeneticCode::getSynonymous(const std::string& aminoacid) const throw (BadCharException)
-{
-  // test:
-  int aa = proteicAlphabet_.charToInt(aminoacid);
-
-  vector<string> synonymes;
-  for (int i = 0; i < static_cast<int>(codonAlphabet_.getSize()); ++i)
-  {
-    try
-    {
-      if (translate(i) == aa)
-        synonymes.push_back(codonAlphabet_.intToChar(i));
-    }
-    catch (StopCodonException)
-    { }
-  }
-  return synonymes;
-}
-
-/**********************************************************************************************/
-
-bool GeneticCode::isFourFoldDegenerated(int val) const
-{
-  if (isStop(val))
-    return false;
-
-  vector<int> codon = codonAlphabet_.getPositions(val);
-  int acid = translate(val);
-
-  // test all the substitution on third codon position
-  for (int an = 0; an < 4; an++)
-  {
-    if (an == codon[2])
-      continue;
-    vector<int> mutcodon = codon;
-    mutcodon[2] = an;
-    int intcodon = codonAlphabet_.getCodon(mutcodon[0], mutcodon[1], mutcodon[2]);
-    if (isStop(intcodon))
-      return false;
-    int altacid = translate(intcodon);
-    if (altacid != acid)   // if non-synonymous
-    {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-/**********************************************************************************************/
-
-Sequence* GeneticCode::getCodingSequence(const Sequence& sequence, bool lookForInitCodon, bool includeInitCodon) const throw (Exception)
-{
-  size_t initPos = 0;
-  size_t stopPos = sequence.size();
-  if (AlphabetTools::isCodonAlphabet(sequence.getAlphabet()))
-  {
-    // Look for AUG(or ATG) codon:
-    if (lookForInitCodon)
-    {
-      for (size_t i = 0; i < sequence.size(); i++)
-      {
-        vector<int> pos = codonAlphabet_.getPositions(sequence[i]);
-        if (pos[0] == 0 && pos[1] == 3 && pos[2] == 2)
-        {
-          initPos = includeInitCodon ? i : i + 1;
-          break;
-        }
-      }
-    }
-    // Look for stop codon:
-    for (size_t i = initPos; i < sequence.size(); i++)
-    {
-      if (isStop(sequence[i]))
-      {
-        stopPos = i;
-        break;
-      }
-    }
-  }
-  else if (AlphabetTools::isNucleicAlphabet(sequence.getAlphabet()))
-  {
-    // Look for AUG(or ATG) codon:
-    if (lookForInitCodon)
-    {
-      for (size_t i = 0; i < sequence.size() - 2; i++)
-      {
-        if (sequence[i] == 0 && sequence[i + 1] == 3 && sequence[i + 2] == 2)
-        {
-          initPos = includeInitCodon ? i : i + 3;
-          break;
-        }
-      }
-    }
-    // Look for stop codon:
-    const NucleicAlphabet* nucAlpha = codonAlphabet_.getNucleicAlphabet();
-    for (size_t i = initPos; i < sequence.size() - 2; i += 3)
-    {
-      string codon = nucAlpha->intToChar(sequence[i])
-                     + nucAlpha->intToChar(sequence[i + 1])
-                     + nucAlpha->intToChar(sequence[i + 2]);
-      if (isStop(codon))
-      {
-        stopPos = i;
-        break;
-      }
-    }
-  }
-  else
-    throw AlphabetMismatchException("Sequence must have alphabet of type nucleic or codon in GeneticCode::getCodingSequence.", 0, sequence.getAlphabet());
-
-  return SequenceTools::subseq(sequence, initPos, stopPos - 1);
-}
-
-/**********************************************************************************************/
-
diff --git a/src/Bpp/Seq/GeneticCode/GeneticCode.h b/src/Bpp/Seq/GeneticCode/GeneticCode.h
deleted file mode 100644
index e3b1aab..0000000
--- a/src/Bpp/Seq/GeneticCode/GeneticCode.h
+++ /dev/null
@@ -1,260 +0,0 @@
-//
-// File: GeneticCode.h
-// Created by: Julien Dutheil
-// Created on: Mon Oct 13 15:37:25 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _GENETICCODE_H_
-#define _GENETICCODE_H_
-
-#include "../Transliterator.h"
-#include "../Alphabet/CodonAlphabet.h"
-#include "../Alphabet/ProteicAlphabet.h"
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-  /**
-   * @brief Exception thrown when a stop codon is found.
-   */
-  class StopCodonException:
-    public Exception
-  {
-  private:
-    std::string codon_;
-			
-  public:
-    // Class constructor
-    StopCodonException(const std::string& text, const std::string& codon);
-	
-    // Class destructor
-    virtual ~StopCodonException() throw () {}
-		
-  public:
-    virtual const std::string& getCodon() const { return codon_; }
-  };
-
-  /**
-   * @brief Partial implementation of the Transliterator interface for genetic code object.
-   *
-   * A genetic code object if a translator from a codon alphabet to a proteic alphabet.
-   * Depending on the codon alphabet used, several genetic code can be implemented.
-   *
-   * @see CodonAlphabet, ProteicAlphabet
-   */
-  class GeneticCode:
-    public AbstractTransliterator,
-    public virtual Clonable
-  {
-  protected:
-    CodonAlphabet codonAlphabet_;
-    ProteicAlphabet proteicAlphabet_;
-    std::map<int, int> tlnTable_;
-	
-  public:
-    GeneticCode(const NucleicAlphabet* alphabet):
-      AbstractTransliterator(),
-      codonAlphabet_(alphabet),
-      proteicAlphabet_(),
-      tlnTable_()
-    {}
-
-    virtual ~GeneticCode() {}
-	
-    virtual GeneticCode* clone() const = 0;
-
-  public:
-    /**
-     * @name Methods form the Transliterator interface.
-     *
-     * @{
-     */
-    const CodonAlphabet* getSourceAlphabet() const { return &codonAlphabet_; }
-    const ProteicAlphabet* getTargetAlphabet() const { return &proteicAlphabet_; }
-    virtual int translate(int state) const throw (BadIntException, Exception);		
-    virtual std::string translate(const std::string& state) const throw (BadCharException, Exception);
-    virtual Sequence* translate(const Sequence& sequence) const throw (Exception)
-    {
-      return AbstractTransliterator::translate(sequence);	
-    }
-    /** @} */
-		
-  public:
-    /**
-     * @name Specific methods.
-     *
-     * @{
-     */
-    
-    /**
-     * @return The number of stop codons.
-     */
-    virtual size_t getNumberOfStopCodons() const = 0;
-
-    /**
-     * @return A vector will all int codes for stop codons.
-     */
-    virtual std::vector<int> getStopCodonsAsInt() const = 0;
-
-    /**
-     * @return A vector will all char codes for stop codons.
-     */
-    virtual std::vector<std::string> getStopCodonsAsChar() const = 0;
-
-    /**
-     * @brief Tells is a particular codon is a stop codon.
-     *
-     * @param state The numeric code for the state to test.
-     * @return True if the state corresponds to a stop codon.
-     * @throw BadIntException if the state is not supported by the alphabet.
-     */
-    virtual bool isStop(int state) const throw (BadIntException) = 0;
-
-    /**
-     * @brief Tells is a particular codon is a stop codon.
-     *
-     * @param state The character code for the state to test.
-     * @return True if the state corresponds to a stop codon.
-     * @throw BadCharException if the state is not supported by the alphabet.
-     */
-    virtual bool isStop(const std::string& state) const throw (BadCharException) = 0;
-    
-    /**
-     * @brief Tells is a particular codon is a start codon.
-     *
-     * @param state The numeric code for the state to test.
-     * @return True if the state corresponds to a start codon.
-     * @throw BadIntException if the state is not supported by the alphabet.
-     */
-    virtual bool isStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 14);
-    }
-
-    /**
-     * @brief Tells is a particular codon is a start codon.
-     *
-     * @param state The character code for the state to test.
-     * @return True if the state corresponds to a start codon.
-     * @throw BadCharException if the state is not supported by the alphabet.
-     */
-    virtual bool isStart(const std::string& state) const throw (BadCharException) {
-      return isStart(codonAlphabet_.charToInt(state));
-    }
- 
-    /**
-     * @brief Tells is a particular codon is an alternative start codon.
-     *
-     * @param state The numeric code for the state to test.
-     * @return True if the state corresponds to an alternative start codon.
-     * @throw BadIntException if the state is not supported by the alphabet.
-     */
-    virtual bool isAltStart(int state) const throw (BadIntException) = 0;
-
-    /**
-     * @brief Tells is a particular codon is an alternative start codon.
-     *
-     * @param state The character code for the state to test.
-     * @return True if the state corresponds to an alternative start codon.
-     * @throw BadCharException if the state is not supported by the alphabet.
-     */
-    virtual bool isAltStart(const std::string& state) const throw (BadCharException) = 0;
-    
-    /**
-     * @brief Tell if two codons are synonymous, that is, if they encode the same amino-acid.
-     *
-     * @param i The numeric code for the first codon.
-     * @param j The numeric code for the second codon.
-     * @return True if the two codons are synonymous.
-     * @throw BadIntException if at least one of the states is not supported by the alphabet.
-     */
-    bool areSynonymous(int i, int j) const throw (BadIntException)
-    {
-      return (translate(i) == translate(j));
-    }
-
-    /**
-     * @brief Tell if two codons are synonymous, that is, if they encode the same amino-acid.
-     *
-     * @param i The character code for the first codon.
-     * @param j The character code for the second codon.
-     * @return True if the two codons are synonymous.
-     * @throw BadCharException if at least one of the states is not supported by the alphabet.
-     */
-    bool areSynonymous(const std::string & i, const std::string & j) const throw (BadCharException)
-    {
-      return (translate(i) == translate(j));
-    }
-
-    std::vector<int> getSynonymous(int aminoacid) const throw (BadIntException);
-    
-    std::vector<std::string> getSynonymous(const std::string & aminoacid) const throw (BadCharException);
-
-    /**
-     * @return True if the specified codon is fourfold degenerated
-     * (that is, if a mutation in the fourth position does not change the aminoacid).
-     * @author Benoit Nabholz, Annabelle Haudry
-     * @param codon The codon to test.
-     */
-    bool isFourFoldDegenerated(int codon) const;
-
-    /**
-     * @brief Get the subsequence corresponding to the coding part of a given sequence.
-     *
-     * If lookForInitCodon if set to 'true', the subsequence will start at the first AUG motif,
-     * otherwise the subsequence will start at the begining of the sequence.
-     * The subsequence ends at the first stop codon (excluded) found, or the end of the sequence.
-     *
-     * The sequence may have a nucleotide or codon alphabet.
-     * The subsequence has the same alphabet, name and comments of the input sequence.
-     * In case of nucleotide sequence and if the lookForInitCodon option is checked, the phase
-     * will be determined from the sequence.
-     *
-     * @param sequence The sequence to parse.
-     * @param lookForInitCodon Tell if the AUG codon must be found.
-     * @param includeInitCodon (if lookForInitCodon is true) tell if the init codon must be included in the subsequence.
-     * @return A nucleotide/codon subsequence.
-     */
-    Sequence* getCodingSequence(const Sequence& sequence, bool lookForInitCodon = false, bool includeInitCodon = false) const throw (Exception);
-    /** @} */
-  };
-
-} //end of namespace bpp.
-
-#endif	//_GENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.cpp
deleted file mode 100644
index b52f8a2..0000000
--- a/src/Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: InvertebrateMitochondrialGeneticCode.cpp
-// Created by: Eric Bazin
-// Created on: wen mar  2 15:22:46 CET 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "InvertebrateMitochondrialGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-InvertebrateMitochondrialGeneticCode::InvertebrateMitochondrialGeneticCode(const NucleicAlphabet* alphabet) :
-  GeneticCode(alphabet) 
-{
-  tlnTable_[0] = 11; //AAA -> K
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = 15; //AGA -> S
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = 15; //AGG -> S
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 12; //ATA -> M
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 10; //CTA -> L
-  tlnTable_[29] = 10; //CTC -> L
-  tlnTable_[30] = 10; //CTG -> L
-  tlnTable_[31] = 10; //CTT -> L
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; //TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; //TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = 17; //TGA -> W
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.h b/src/Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.h
deleted file mode 100644
index d6b07a4..0000000
--- a/src/Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: InvertebrateMitochondrialGeneticCode.h
-// Created by: Eric Bazin
-// Created on: wen mar  2 15:22:46 CET 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-
-#ifndef _INVERTEBRATEMITOCHONDRIALGENETICCODE_H_
-#define _INVERTEBRATEMITOCHONDRIALGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the Invertebrate
- * Mitochondrial genetic code as describe on the NCBI website:
- * http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG5
- */
-class InvertebrateMitochondrialGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		InvertebrateMitochondrialGeneticCode(const NucleicAlphabet* alphabet);
-
-		virtual ~InvertebrateMitochondrialGeneticCode() {}
-	
-    virtual InvertebrateMitochondrialGeneticCode* clone() const {
-      return new InvertebrateMitochondrialGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 2.; }
- 
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(2);
-      v[1] = 48;
-      v[2] = 50;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(2);
-      v[1] = "TAA";
-      v[2] = "TAG";
-      return v;
-    }
-   
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 12 || state == 13 || state == 15 || state == 46 || state == 62);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 12 || i == 13 || i == 15 || i == 46 || i == 62);
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_INVERTEBRATEMITOCHONDRIALGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.cpp
deleted file mode 100644
index 0dd6adf..0000000
--- a/src/Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: MoldMitochondrialGeneticCode.cpp
-// Created by: Julien Dutheil
-// Created on: Thu Jun 13 11:52 CET 2013
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "MoldMitochondrialGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-MoldMitochondrialGeneticCode::MoldMitochondrialGeneticCode(const NucleicAlphabet* alphabet) :
-  GeneticCode(alphabet) 
-{
-  tlnTable_[0] = 11; //AAA -> K
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = 1; //AGA -> R
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = 1; //AGG -> R
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 9; //ATA -> I
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 10; //CTA -> L
-  tlnTable_[29] = 10; //CTC -> L
-  tlnTable_[30] = 10; //CTG -> L
-  tlnTable_[31] = 10; //CTT -> L
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; //TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; //TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = 17; //TGA -> W
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.h b/src/Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.h
deleted file mode 100644
index 0f1d7ab..0000000
--- a/src/Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: MoldMitochondrialGeneticCode.h
-// Created by: Julien Dutheil
-// Created on: Thu Jun 13 11:52 CET 2013
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-
-#ifndef _MOLDMITOCHONDRIALGENETICCODE_H_
-#define _MOLDMITOCHONDRIALGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the mold, protozoan, and coelenterate mitochondrial code
- * and the Mycoplasma/Spiroplasma code as describe on the NCBI website:
- * http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG4
- */
-class MoldMitochondrialGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		MoldMitochondrialGeneticCode(const NucleicAlphabet* alphabet);
-
-		virtual ~MoldMitochondrialGeneticCode() {}
-	
-    virtual MoldMitochondrialGeneticCode* clone() const {
-      return new MoldMitochondrialGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 2.; }
- 
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(2);
-      v[1] = 48;
-      v[2] = 50;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(2);
-      v[1] = "TAA";
-      v[2] = "TAG";
-      return v;
-    }
-   
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 12 || state == 13 || state == 15 || state == 30 || state == 46 || state == 60 || state == 62);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 12 || i == 13 || i == 15 || i == 30 || i == 46 || i == 60 || i == 62);
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_MOLDMITOCHONDRIALGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/StandardGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/StandardGeneticCode.cpp
deleted file mode 100644
index de6bcb5..0000000
--- a/src/Bpp/Seq/GeneticCode/StandardGeneticCode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: StandardGeneticCode.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Oct 13 15:39:17 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "StandardGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-StandardGeneticCode::StandardGeneticCode(const NucleicAlphabet* alphabet):
-  GeneticCode(alphabet)
-{
-  tlnTable_[0] = 11; //AAA -> K
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = 1; //AGA -> R
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = 1; //AGG -> R
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 9; //ATA -> I
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 10; //CTA -> L
-  tlnTable_[29] = 10; //CTC -> L
-  tlnTable_[30] = 10; //CTG -> L
-  tlnTable_[31] = 10; //CTT -> L
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; // TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; // TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = -99; // TGA -> STOP
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/StandardGeneticCode.h b/src/Bpp/Seq/GeneticCode/StandardGeneticCode.h
deleted file mode 100644
index f716e55..0000000
--- a/src/Bpp/Seq/GeneticCode/StandardGeneticCode.h
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// File: StandardGeneticCode.h
-// Created by: Julien Dutheil
-// Created on: Mon Oct 13 15:39:17 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _STANDARDGENETICCODE_H_
-#define _STANDARDGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the standard genetic code as describe on the NCBI 
- *        web site: http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG1
- */
-class StandardGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		StandardGeneticCode(const NucleicAlphabet* alphabet);
-		
-    virtual ~StandardGeneticCode() {}
-	
-    virtual StandardGeneticCode* clone() const {
-      return new StandardGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 3.; }
-    
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(3);
-      v[0] = 48;
-      v[1] = 50;
-      v[02] = 56;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(3);
-      v[0] = "TAA";
-      v[1] = "TAG";
-      v[2] = "TGA";
-      return v;
-    }
-    
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50 || state == 56);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50 || i == 56);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 62 || state == 30);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 62 || i == 30);
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_STANDARDGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.cpp
deleted file mode 100644
index f81ce00..0000000
--- a/src/Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: VertebrateMitochondrialGeneticCode.cpp
-// Created by: Eric Bazin
-// Created on: wen mar  2 16:01:59 CET 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "VertebrateMitochondrialGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-VertebrateMitochondrialGeneticCode::VertebrateMitochondrialGeneticCode(const NucleicAlphabet* alphabet) :
-  GeneticCode(alphabet) 
-{
-  tlnTable_[0] = 11; //AAA -> K
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = -99; //AGA -> STOP
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = -99; //AGG -> STOP
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 12; //ATA -> M
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 10; //CTA -> L
-  tlnTable_[29] = 10; //CTC -> L
-  tlnTable_[30] = 10; //CTG -> L
-  tlnTable_[31] = 10; //CTT -> L
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; //TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; //TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = 17; //TGA -> W
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.h b/src/Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.h
deleted file mode 100644
index b104338..0000000
--- a/src/Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.h
+++ /dev/null
@@ -1,113 +0,0 @@
-//
-// File: VertebrateMitochondrialGeneticCode.h
-// Created by: Eric Bazin
-// Created on: wen mar  2 16:01:59 CET 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _VERTEBRATEMITOCHONDRIALGENETICCODE_H_
-#define _VERTEBRATEMITOCHONDRIALGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the vertebrate mitochondrial genetic code as describe on the NCBI 
- *        web site: http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG2
- */
-class VertebrateMitochondrialGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		VertebrateMitochondrialGeneticCode(const NucleicAlphabet* alphabet);
-		
-    virtual ~VertebrateMitochondrialGeneticCode() {}
-	
-    virtual VertebrateMitochondrialGeneticCode* clone() const {
-      return new VertebrateMitochondrialGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 4.; }
- 
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(4);
-      v[0] = 8;
-      v[1] = 10;
-      v[2] = 48;
-      v[3] = 50;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(4);
-      v[0] = "AGA";
-      v[1] = "AGG";
-      v[2] = "TAA";
-      v[4] = "TAG";
-      return v;
-    }
-    
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50 || state == 8 || state == 10);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50 || i == 8 || i == 10);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 12 || state == 13 || state == 15 || state == 46);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 12 || i == 13 || i == 15 || i == 46);
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_VERTEBRATEMITOCHONDRIALGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.cpp b/src/Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.cpp
deleted file mode 100644
index 4fb6cfe..0000000
--- a/src/Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// File: YeastbrateMitochondrialGeneticCode.cpp
-// Created by: Benoit Nabholz
-// Created on: Sun Oct 10 14:33 CET 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "YeastMitochondrialGeneticCode.h"
-
-using namespace bpp;
-
-#include <iostream>
-
-using namespace std;
-
-YeastMitochondrialGeneticCode::YeastMitochondrialGeneticCode(const NucleicAlphabet* alphabet) :
-  GeneticCode(alphabet) 
-{
-  tlnTable_[0] = 11; //AAA -> K
-  tlnTable_[1] = 2; //AAC -> N
-  tlnTable_[2] = 11; //AAG -> K
-  tlnTable_[3] = 2; //AAT -> N
-  tlnTable_[4] = 16; //ACA -> T
-  tlnTable_[5] = 16; //ACC -> T
-  tlnTable_[6] = 16; //ACG -> T
-  tlnTable_[7] = 16; //ACT -> T
-  tlnTable_[8] = 15; //AGA -> S
-  tlnTable_[9] = 15; //AGC -> S
-  tlnTable_[10] = 15; //AGG -> S
-  tlnTable_[11] = 15; //AGT -> S
-  tlnTable_[12] = 12; //ATA -> M
-  tlnTable_[13] = 9; //ATC -> I
-  tlnTable_[14] = 12; //ATG -> M
-  tlnTable_[15] = 9; //ATT -> I
-  tlnTable_[16] = 5; //CAA -> Q
-  tlnTable_[17] = 8; //CAC -> H
-  tlnTable_[18] = 5; //CAG -> Q
-  tlnTable_[19] = 8; //CAT -> H
-  tlnTable_[20] = 14; //CCA -> P
-  tlnTable_[21] = 14; //CCC -> P
-  tlnTable_[22] = 14; //CCG -> P
-  tlnTable_[23] = 14; //CCT -> P
-  tlnTable_[24] = 1; //CGA -> R
-  tlnTable_[25] = 1; //CGC -> R
-  tlnTable_[26] = 1; //CGG -> R
-  tlnTable_[27] = 1; //CGT -> R
-  tlnTable_[28] = 16; //CTA -> T
-  tlnTable_[29] = 16; //CTC -> T
-  tlnTable_[30] = 16; //CTG -> T
-  tlnTable_[31] = 16; //CTT -> T
-  tlnTable_[32] = 6; //GAA -> E
-  tlnTable_[33] = 3; //GAC -> D
-  tlnTable_[34] = 6; //GAG -> E
-  tlnTable_[35] = 3; //GAT -> D
-  tlnTable_[36] = 0; //GCA -> A
-  tlnTable_[37] = 0; //GCC -> A
-  tlnTable_[38] = 0; //GCG -> A
-  tlnTable_[39] = 0; //GCT -> A
-  tlnTable_[40] = 7; //GGA -> G
-  tlnTable_[41] = 7; //GGC -> G
-  tlnTable_[42] = 7; //GGG -> G
-  tlnTable_[43] = 7; //GGT -> G
-  tlnTable_[44] = 19; //GTA -> V
-  tlnTable_[45] = 19; //GTC -> V
-  tlnTable_[46] = 19; //GTG -> V
-  tlnTable_[47] = 19; //GTT -> V
-  tlnTable_[48] = -99; //TAA -> STOP
-  tlnTable_[49] = 18; //TAC -> Y
-  tlnTable_[50] = -99; //TAG -> STOP
-  tlnTable_[51] = 18; //TAT -> Y
-  tlnTable_[52] = 15; //TCA -> S
-  tlnTable_[53] = 15; //TCC -> S
-  tlnTable_[54] = 15; //TCG -> S
-  tlnTable_[55] = 15; //TCT -> S
-  tlnTable_[56] = 17; //TGA -> W
-  tlnTable_[57] = 4; //TGC -> C
-  tlnTable_[58] = 17; //TGG -> W
-  tlnTable_[59] = 4; //TGT -> C
-  tlnTable_[60] = 10; //TTA -> L
-  tlnTable_[61] = 13; //TTC -> F
-  tlnTable_[62] = 10; //TTG -> L
-  tlnTable_[63] = 13; //TTT -> F
-  tlnTable_[codonAlphabet_.getUnknownCharacterCode()] = proteicAlphabet_.getUnknownCharacterCode();
-}
-
diff --git a/src/Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.h b/src/Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.h
deleted file mode 100644
index 5f382a7..0000000
--- a/src/Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.h
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// File: YeastbrateMitochondrialGeneticCode.h
-// Created by: Benoit Nabholz
-// Created on: Sun Oct 10 14:33 CET 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-
-#ifndef _YEASTMITOCHONDRIALGENETICCODE_H_
-#define _YEASTMITOCHONDRIALGENETICCODE_H_
-
-#include "GeneticCode.h"
-#include "../Alphabet/NucleicAlphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief This class implements the Invertebrate
- * Mitochondrial genetic code as describe on the NCBI website:
- * http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=t#SG3
- */
-class YeastMitochondrialGeneticCode:
-  public virtual GeneticCode
-{
-	public:
-		YeastMitochondrialGeneticCode(const NucleicAlphabet* alphaibet);
-
-		virtual ~YeastMitochondrialGeneticCode() {}
-	
-    virtual YeastMitochondrialGeneticCode* clone() const {
-      return new YeastMitochondrialGeneticCode(*this);
-    }
-
-  public:
-    size_t getNumberOfStopCodons() const { return 2.; }
- 
-    std::vector<int> getStopCodonsAsInt() const {
-      std::vector<int> v(2);
-      v[1] = 48;
-      v[2] = 50;
-      return v;
-    }
-
-    std::vector<std::string> getStopCodonsAsChar() const {
-      std::vector<std::string> v(2);
-      v[1] = "TAA";
-      v[2] = "TAG";
-      return v;
-    }
-    
-    bool isStop(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 48 || state == 50);
-    }
-    
-    bool isStop(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 48 || i == 50);
-    }
- 
-    bool isAltStart(int state) const throw (BadIntException) {
-      //Test:
-      codonAlphabet_.intToChar(state); //throw exception if invalid state!
-      return (state == 12);
-    }
-    
-    bool isAltStart(const std::string& state) const throw (BadCharException) {
-      int i = codonAlphabet_.charToInt(state);
-      return (i == 12);
-    }
-
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_YEASTMITOCHONDRIALGENETICCODE_H_
-
diff --git a/src/Bpp/Seq/Io/AbstractIAlignment.h b/src/Bpp/Seq/Io/AbstractIAlignment.h
deleted file mode 100644
index a0db42e..0000000
--- a/src/Bpp/Seq/Io/AbstractIAlignment.h
+++ /dev/null
@@ -1,185 +0,0 @@
-//
-// File: AbstractIAlignment.h
-// Created by: Julien Dutheil
-// Created on: mon 27 jun 16:30 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ABSTRACTIALIGNMENT_H_
-#define _ABSTRACTIALIGNMENT_H_
-
-#include "../Container/AlignedSequenceContainer.h"
-#include "../Alphabet/Alphabet.h"
-#include "ISequence.h"
-
-// From the STL:
-#include <string>
-#include <iostream>
-#include <fstream>
-
-namespace bpp
-{
-
-/**
- * @brief Partial implementation of the IAlignment interface, dedicated to alignment readers.
- */
-class AbstractIAlignment:
-  public virtual IAlignment
-{
-
-  public:
-    AbstractIAlignment() {}
-    virtual ~AbstractIAlignment() {}
-
-  public:
-
-    /**
-     * @name IAlignment methods:
-     *
-     * @{
-     */ 
- 
-    /**
-     * @brief Add sequences to a container from a stream.
-     *
-     * @param input  The input stream to read.
-     * @param sc     The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void readAlignment(std::istream& input, SiteContainer& sc) const throw (Exception)
-    {
-      appendAlignmentFromStream(input, sc);
-    }
- 
-    /**
-     * @brief Add sequences to a container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param sc    The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void readAlignment(const std::string& path, SiteContainer& sc) const throw (Exception)
-    {
-      appendAlignmentFromFile(path, sc);
-    }
- 
-    virtual
-#if defined(NO_VIRTUAL_COV)
-    SiteContainer*
-#else
-    AlignedSequenceContainer*
-#endif
-    readAlignment(const std::string& path , const Alphabet* alpha) const throw (Exception)
-    {
-      return readAlignmentFromFile(path, alpha);
-    }
- 
-    virtual
-#if defined(NO_VIRTUAL_COV)
-    SiteContainer*
-#else
-    AlignedSequenceContainer*
-#endif
-    readAlignment(std::istream& input, const Alphabet* alpha) const throw (Exception)
-    {
-      return readAlignmentFromStream(input, alpha);
-    }
-    /** @} */
-
-
-
-   
-  protected:
-    /**
-     * @brief Append sequences to a container from a stream.
-     * 
-     * This is the unique method to implement!
-     * 
-     * @param input  The input stream to read.
-     * @param sc     The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception) = 0;
-  
-    /**
-     * @brief Append sequences to a container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param sc    The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void appendAlignmentFromFile(const std::string& path, SiteContainer& sc) const throw (Exception)
-    {
-      std::ifstream input(path.c_str(), std::ios::in);
-      appendAlignmentFromStream(input, sc);
-      input.close();
-    }
-
-    /**
-     * @brief Read sequences from a stream.
-     * 
-     * @param input  The input stream to read.
-     * @param alpha  The alphabet to use.
-     * @return A sequence container.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual AlignedSequenceContainer* readAlignmentFromStream(std::istream& input, const Alphabet* alpha) const throw (Exception)
-    {
-      AlignedSequenceContainer* asc = new AlignedSequenceContainer(alpha);
-      appendAlignmentFromStream(input, *asc);
-      return asc;
-    }
-
-    /**
-     * @brief Read sequences from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param alpha The alphabet to use.
-     * @return A sequence container.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual AlignedSequenceContainer* readAlignmentFromFile(const std::string& path, const Alphabet* alpha) const throw (Exception)
-    {
-      AlignedSequenceContainer* asc = new AlignedSequenceContainer(alpha);
-      appendAlignmentFromFile(path, *asc);
-      return asc;
-    }
-
-};
-
-} //end of namespace bpp.
-
-#endif // _ABSTRACTIALIGNMENT_H_
-
diff --git a/src/Bpp/Seq/Io/AbstractISequence.h b/src/Bpp/Seq/Io/AbstractISequence.h
deleted file mode 100644
index c4fafb3..0000000
--- a/src/Bpp/Seq/Io/AbstractISequence.h
+++ /dev/null
@@ -1,182 +0,0 @@
-//
-// File: AbstractISequence.h
-// Created by: Julien Dutheil
-// Created on: ?
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ABSTRACTISEQUENCE_H_
-#define _ABSTRACTISEQUENCE_H_
-
-#include "ISequence.h"
-#include "../Container/VectorSequenceContainer.h"
-#include "../Alphabet/Alphabet.h"
-
-// From the STL:
-#include <string>
-#include <iostream>
-#include <fstream>
-
-namespace bpp
-{
-
-/**
- * @brief Partial implementation of the ISequence interface.
- */
-class AbstractISequence:
-  public virtual ISequence
-{
-
-  public: 
-    AbstractISequence() {}
-    virtual ~AbstractISequence() {}
-
-  public:
-
-    /**
-     * @name ISequence methods:
-     *
-     * @{
-     */ 
-    
-  public:
-    /**
-     * @brief Add sequences to a container from a stream.
-     *
-     * @param input  The input stream to read.
-     * @param sc     The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-   virtual void readSequences(std::istream& input, SequenceContainer& sc) const throw (Exception)
-    {
-      appendSequencesFromStream(input, sc);
-    }
- 
-   /**
-     * @brief Add sequences to a container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param sc    The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void readSequences(const std::string& path, SequenceContainer& sc) const throw (Exception)
-    {
-      appendSequencesFromFile(path, sc);
-    }
- 
-    virtual
-#if defined(NO_VIRTUAL_COV)
-    SequenceContainer*
-#else
-    VectorSequenceContainer*
-#endif
-    readSequences(std::istream& input, const Alphabet* alpha) const throw (Exception)
-    {
-      return readSequencesFromStream(input, alpha);
-    }
-
-    virtual
-#if defined(NO_VIRTUAL_COV)
-    SequenceContainer*
-#else
-    VectorSequenceContainer*
-#endif
-    readSequences(const std::string& path , const Alphabet* alpha) const throw (Exception)
-    {
-      return readSequencesFromFile(path, alpha);
-    }
-    /** @} */
- 
-   
-  protected:
-    /**
-     * @brief Append sequences to a container from a stream.
-     * 
-     * This is the unique method to implement!
-     * 
-     * @param input  The input stream to read.
-     * @param sc     The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void appendSequencesFromStream(std::istream& input, SequenceContainer& sc) const throw (Exception) = 0;
-  
-    /**
-     * @brief Append sequences to a container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param sc    The sequence container to update.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual void appendSequencesFromFile(const std::string& path, SequenceContainer& sc) const throw (Exception)
-    {
-      std::ifstream input(path.c_str(), std::ios::in);
-      appendSequencesFromStream(input, sc);
-      input.close();
-    }
-
-    /**
-     * @brief Read sequences from a stream.
-     * 
-     * @param input  The input stream to read.
-     * @param alpha  The alphabet to use.
-     * @return A sequence container.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual VectorSequenceContainer* readSequencesFromStream(std::istream& input, const Alphabet* alpha) const throw (Exception)
-    {
-      VectorSequenceContainer* vsc = new VectorSequenceContainer(alpha);
-      appendSequencesFromStream(input, *vsc);
-      return vsc;
-    }
-
-    /**
-     * @brief Append sequences to a container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param alpha The alphabet to use.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual VectorSequenceContainer* readSequencesFromFile(const std::string& path , const Alphabet* alpha) const throw (Exception)
-    {
-      VectorSequenceContainer* vsc = new VectorSequenceContainer(alpha);
-      appendSequencesFromFile(path, *vsc);
-      return vsc;
-    }
-};
-
-} //end of namespace bpp.
-
-#endif //_ABSTRACTISEQUENCE_H_
-
diff --git a/src/Bpp/Seq/Io/AbstractOSequence.h b/src/Bpp/Seq/Io/AbstractOSequence.h
deleted file mode 100644
index 2acc7c8..0000000
--- a/src/Bpp/Seq/Io/AbstractOSequence.h
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// File: AbstractOSequence.h
-// Created by: Julien Dutheil
-// Created on: ?
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ABSTRACTOSEQUENCE_H_
-#define _ABSTRACTOSEQUENCE_H_
-
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-#include "../Container/VectorSequenceContainer.h"
-
-// From the STL:
-#include <string>
-#include <fstream>
-
-namespace bpp
-{
-
-/**
- * @brief Partial implementation of the OSequence and OAlignment interfaces.
- */
-class AbstractOSequence:
-  public virtual OSequence,
-  public virtual OAlignment
-{
-
-	public: 
-		AbstractOSequence() {}
-		virtual ~AbstractOSequence() {}
-
-	public:
-
-		/**
-		 * @name OSequence methods:
-		 *
-		 * @{
-		 */ 
-		void writeSequences(std::ostream& output, const SequenceContainer& sc) const throw (Exception) = 0;
-		void writeSequences(const std::string& path, const SequenceContainer& sc, bool overwrite=true) const throw (Exception)
-		{
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-			writeSequences(output, sc);
-			output.close();
-		}
-		/** @} */
-    
-    /**
-		 * @name OAlignment methods:
-		 *
-     * As a SiteContainer is a specialization of SequenceContainer, it is assumed that a OSequence
-     * object can write aligned sequence just like a OAlignment object.
-     * Therefore it implements the OAlignment interface by down-casting the SiteContainer
-     * to a SequenceContainer. 
-		 * @{
-		 */ 
-		void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception)
-    {
-      writeSequences(output, dynamic_cast<const SequenceContainer&>(sc));
-    }
-		void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite=true) const throw (Exception)
-		{
-      writeSequences(path, dynamic_cast<const SequenceContainer&>(sc), overwrite);
-		}
-		/** @} */
-
-};
-
-} //end of namespace bpp.
-
-#endif //_ABSTRACTOSEQUENCE_H_
-
diff --git a/src/Bpp/Seq/Io/BppOAlignmentReaderFormat.cpp b/src/Bpp/Seq/Io/BppOAlignmentReaderFormat.cpp
deleted file mode 100644
index 2e812ef..0000000
--- a/src/Bpp/Seq/Io/BppOAlignmentReaderFormat.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// File: BppOAlignmentReaderFormat.cpp
-// Created by: Julien Dutheil
-// Created on: Friday September 15th, 22:06
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "BppOAlignmentReaderFormat.h"
-#include "Mase.h"
-#include "Phylip.h"
-#include "Fasta.h"
-#include "Clustal.h"
-#include "Dcse.h"
-#include "NexusIoSequence.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-
-#include <string>
-#include <memory>
-
-using namespace bpp;
-using namespace std;
-
-IAlignment* BppOAlignmentReaderFormat::read(const std::string& description) throw (Exception)
-{
-  unparsedArguments_.clear();
-  string format = "";
-  KeyvalTools::parseProcedure(description, format, unparsedArguments_);
-  auto_ptr<IAlignment> iAln;
-  if (format == "Mase")
-  {
-    iAln.reset(new Mase());
-  }
-  else if (format == "Phylip")
-  {
-    bool sequential = true, extended = true;
-    string split = "  ";
-    string order = ApplicationTools::getStringParameter("order", unparsedArguments_, "sequential", "", true, warningLevel_);
-    if (order == "sequential")
-      sequential = true;
-    else if (order == "interleaved")
-      sequential = false;
-    else
-      throw Exception("BppOAlignmentReaderFormat::read. Invalid argument 'order' for phylip format: " + order);
-    
-    string type = ApplicationTools::getStringParameter("type", unparsedArguments_, "extended", "", true, warningLevel_);
-    if (type == "extended")
-    {
-      extended = true;
-      split = ApplicationTools::getStringParameter("split", unparsedArguments_, "spaces", "", true, warningLevel_);
-      if (split == "spaces")
-        split = "  ";
-      else if (split == "tab")
-        split = "\t";
-      else
-        throw Exception("BppOAlignmentReaderFormat::read. Invalid argument 'split' for phylip format: " + split);
-    }
-    else if (type == "classic")
-      extended = false;
-    else
-      throw Exception("BppOAlignmentReaderFormat::read. Invalid argument 'type' for phylip format: " + type);
-    
-    iAln.reset(new Phylip(extended, sequential, 100, true, split));
-  }
-  else if (format == "Fasta")
-  {
-    bool strictNames = ApplicationTools::getBooleanParameter("strict_names", unparsedArguments_, false, "", true, warningLevel_);
-    bool extended    = ApplicationTools::getBooleanParameter("extended", unparsedArguments_, false, "", true, warningLevel_);
-    iAln.reset(new Fasta(100, true, extended, strictNames));
-  }
-  else if (format == "Clustal")
-  {
-    unsigned int extraSpaces = ApplicationTools::getParameter<unsigned int>("extraSpaces", unparsedArguments_, 0, "", true, warningLevel_);
-    iAln.reset(new Clustal(true, extraSpaces));
-  }
-  else if (format == "Dcse")
-  {
-    iAln.reset(new DCSE());
-  }
-  else if (format == "Nexus")
-  {
-    iAln.reset(new NexusIOSequence());
-  }
-  else
-  {
-    throw Exception("Sequence format '" + format + "' unknown.");
-  }
-
-  return iAln.release();
-}
-
diff --git a/src/Bpp/Seq/Io/BppOAlignmentReaderFormat.h b/src/Bpp/Seq/Io/BppOAlignmentReaderFormat.h
deleted file mode 100644
index 21d7ea9..0000000
--- a/src/Bpp/Seq/Io/BppOAlignmentReaderFormat.h
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// File: BppOAlignmentReaderFormat.h
-// Created by: Julien Dutheil
-// Created on: Friday September 15th, 22:04
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOALIGNMENTREADERFORMAT_H_
-#define _BPPOALIGNMENTREADERFORMAT_H_
-
-#include "IoSequenceFactory.h"
-
-namespace bpp
-{
-
-  /**
-   * @brief Sequence I/O in BppO format.
-   *
-   * Creates a new IAlignment object according to
-   * distribution description syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   *
-   */
-  class BppOAlignmentReaderFormat:
-    public virtual IOFormat
-  {
-  private:
-    std::map<std::string, std::string> unparsedArguments_;
-    int warningLevel_;
-
-  public:
-    BppOAlignmentReaderFormat(int warningLevel):
-      unparsedArguments_(), warningLevel_(warningLevel) {}
-    virtual ~BppOAlignmentReaderFormat() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "Alignment reader"; }
-
-    /**
-     * @brief Read a IAlignment object from a string.
-     *
-     * @param description A string describing the reader in the keyval syntax.
-     * @return A new IAlignment object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    IAlignment* read(const std::string& description) throw (Exception);
-
-    /**
-     * @return The arguments and their unparsed values from the last call of the read function, if there are any.
-     */
-    virtual const std::map<std::string, std::string>& getUnparsedArguments() const { return unparsedArguments_; }
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOALIGNMENTREADERFORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/BppOAlignmentWriterFormat.cpp b/src/Bpp/Seq/Io/BppOAlignmentWriterFormat.cpp
deleted file mode 100644
index 05268ae..0000000
--- a/src/Bpp/Seq/Io/BppOAlignmentWriterFormat.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// File: BppOAlignmentWriterFormat.cpp
-// Created by: Julien Dutheil
-// Created on: Friday September 15th, 22:12
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "BppOAlignmentWriterFormat.h"
-#include "Fasta.h"
-#include "Mase.h"
-#include "Clustal.h"
-#include "Phylip.h"
-#include "Stockholm.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-
-#include <string>
-#include <memory>
-
-using namespace bpp;
-using namespace std;
-
-OAlignment* BppOAlignmentWriterFormat::read(const std::string& description) throw (Exception)
-{
-  unparsedArguments_.clear();
-  string format = "";
-  KeyvalTools::parseProcedure(description, format, unparsedArguments_);
-  unsigned int ncol = ApplicationTools::getParameter<unsigned int>("length", unparsedArguments_, 100, "", true, warningLevel_);
-  auto_ptr<OAlignment> oAln;
-  if (format == "Fasta")
-  {
-    oAln.reset(new Fasta(ncol));
-  }
-  else if (format == "Mase")
-  {
-    oAln.reset(new Mase(ncol));
-  }
-  else if (format == "Clustal")
-  {
-    oAln.reset(new Clustal(ncol));
-  }
-  else if (format == "Phylip")
-  {
-    bool sequential = true, extended = true;
-    string split = "  ";
-    string order = ApplicationTools::getStringParameter("order", unparsedArguments_, "sequential", "", true, warningLevel_);
-    if (order == "sequential")
-      sequential = true;
-    else if (order == "interleaved")
-      sequential = false;
-    else
-      throw Exception("BppOAlignmentWriterFormat::read. Invalid argument 'order' for phylip format: " + order);
- 
-    string type = ApplicationTools::getStringParameter("type", unparsedArguments_, "extended", "", true, warningLevel_);
-    if (type == "extended")
-    {
-      extended = true;
-      split = ApplicationTools::getStringParameter("split", unparsedArguments_, "spaces", "", true, warningLevel_);
-      if (split == "spaces")
-        split = "  ";
-      else if (split == "tab")
-        split = "\t";
-      else
-        throw Exception("BppOAlignmentWriterFormat::read. Invalid argument 'split' for phylip format: " + split);
-    }
-    else if (type == "classic")
-      extended = false;
-    else
-      throw Exception("BppOAlignmentWriterFormat::read. Invalid argument 'type' for phylip format: " + type);
-    
-   oAln.reset(new Phylip(extended, sequential, ncol, true, split));
-  }
-  else if (format == "Stockholm")
-  {
-    oAln.reset(new Stockholm());
-  }
-  else
-  {
-    throw Exception("Sequence format '" + format + "' unknown.");
-  }
-
-  return oAln.release();
-}
-
diff --git a/src/Bpp/Seq/Io/BppOAlignmentWriterFormat.h b/src/Bpp/Seq/Io/BppOAlignmentWriterFormat.h
deleted file mode 100644
index 77a3a67..0000000
--- a/src/Bpp/Seq/Io/BppOAlignmentWriterFormat.h
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// File: BppOAlignmentWriterFormat.h
-// Created by: Julien Dutheil
-// Created on: Saturday September 15th, 22:10
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOALIGNMENTWRITERFORMAT_H_
-#define _BPPOALIGNMENTWRITERFORMAT_H_
-
-#include "IoSequenceFactory.h"
-
-namespace bpp
-{
-
-  /**
-   * @brief Sequence I/O in BppO format.
-   *
-   * Creates a new OAlignment object according to
-   * distribution description syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   *
-   */
-  class BppOAlignmentWriterFormat:
-    public virtual IOFormat
-  {
-  private:
-    std::map<std::string, std::string> unparsedArguments_;
-    int warningLevel_;
-
-  public:
-    BppOAlignmentWriterFormat(int warningLevel):
-      unparsedArguments_(),
-      warningLevel_(warningLevel) {}
-
-     virtual ~BppOAlignmentWriterFormat() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "Alignment writer"; }
-
-    /**
-     * @brief Read a OAlignment object from a string.
-     *
-     * @param description A string describing the reader in the keyval syntax.
-     * @return A new OAlignment object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    OAlignment* read(const std::string& description) throw (Exception);
-
-    /**
-     * @return The arguments and their unparsed values from the last call of the read function, if there are any.
-     */
-    virtual const std::map<std::string, std::string>& getUnparsedArguments() const { return unparsedArguments_; }
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOALIGNMENTWRITERFORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/BppOAlphabetIndex1Format.cpp b/src/Bpp/Seq/Io/BppOAlphabetIndex1Format.cpp
deleted file mode 100644
index ad8fda0..0000000
--- a/src/Bpp/Seq/Io/BppOAlphabetIndex1Format.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-//
-// File: BppOAlphabetIndex1Format.cpp
-// Created by: Julien Dutheil
-// Created on: Thursday Februar 07th, 16:30
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "BppOAlphabetIndex1Format.h"
-#include "../Alphabet/AlphabetTools.h"
-#include "../AlphabetIndex/GranthamAAPolarityIndex.h"
-#include "../AlphabetIndex/GranthamAAVolumeIndex.h"
-#include "../AlphabetIndex/KleinAANetChargeIndex.h"
-#include "../AlphabetIndex/AAChouFasmanAHelixIndex.h"
-#include "../AlphabetIndex/AAChouFasmanBSheetIndex.h"
-#include "../AlphabetIndex/AAChouFasmanTurnIndex.h"
-#include "../AlphabetIndex/AAChenGuHuangHydrophobicityIndex.h"
-#include "../AlphabetIndex/AASurfaceIndex.h"
-#include "../AlphabetIndex/AAMassIndex.h"
-#include "../AlphabetIndex/AAVolumeIndex.h"
-#include "../AlphabetIndex/AAChargeIndex.h"
-#include "../AlphabetIndex/AASEAInf10Index.h"
-#include "../AlphabetIndex/AASEA1030Index.h"
-#include "../AlphabetIndex/AASEASup30Index.h"
-#include "../AlphabetIndex/AAIndex1Entry.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-#include <Bpp/App/ApplicationTools.h>
-
-#include <string>
-#include <memory>
-
-using namespace bpp;
-using namespace std;
-
-AlphabetIndex1* BppOAlphabetIndex1Format::read(const std::string& description) throw (Exception)
-{
-  if (description != "None")
-  {
-    string name;
-    map<string, string> args;
-    KeyvalTools::parseProcedure(description, name, args);
-    if (verbose_)
-      ApplicationTools::displayResult(message_, description);
-
-    //Currently, only protein indices are supported:
-    if (!AlphabetTools::isProteicAlphabet(alphabet_))
-        throw Exception("BppOAlphabetIndex1Format::read. This index is only supported with a protein alphabet.");
-    if (name == "GranthamPolarity")
-    {
-      return new GranthamAAPolarityIndex();
-    }
-    else if (name == "GranthamVolume")
-    {
-      return new GranthamAAVolumeIndex();
-    }
-    else if (name == "KleinCharge")
-    {
-      return new KleinAANetChargeIndex();
-    }
-    else if (name == "ChouFasmanAHelix")
-    {
-      return new AAChouFasmanAHelixIndex();
-    }
-    else if (name == "ChouFasmanBSheet")
-    {
-      return new AAChouFasmanBSheetIndex();
-    }
-    else if (name == "ChouFasmanTurn")
-    {
-      return new AAChouFasmanTurnIndex();
-    }
-    else if (name == "ChenGuHuangHydrophobicity")
-    {
-      return new AAChenGuHuangHydrophobicityIndex();
-    }
-    else if (name == "Surface")
-    {
-      return new AASurfaceIndex();
-    }
-    else if (name == "Mass")
-    {
-      return new AAMassIndex();
-    }
-    else if (name == "Volume")
-    {
-      return new AAVolumeIndex();
-    }
-    else if (name == "Charge")
-    {
-      return new AAChargeIndex();
-    }
-    else if (name == "SEAMedium")
-    {
-      return new AASEA1030Index();
-    }
-    else if (name == "SEAHigh")
-    {
-      return new AASEASup30Index();
-    }
-    else if (name == "SEALow")
-    {
-      return new AASEAInf10Index();
-    }
-    else if (name == "User")
-    {
-      string aax1FilePath = ApplicationTools::getAFilePath("file", args, true, true, "", false);
-      ifstream aax1File(aax1FilePath.c_str(), ios::in);
-      AAIndex1Entry* I = new AAIndex1Entry (aax1File);
-      aax1File.close();
-      return I;
-    }
-    else
-    {
-      throw Exception("Invalid index1 '" + name + "'.");
-    }
-  }
-  else
-  {
-    return 0;
-  }
-}
-
diff --git a/src/Bpp/Seq/Io/BppOAlphabetIndex1Format.h b/src/Bpp/Seq/Io/BppOAlphabetIndex1Format.h
deleted file mode 100644
index 80083ca..0000000
--- a/src/Bpp/Seq/Io/BppOAlphabetIndex1Format.h
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// File: BppOAlphabetIndex1Format.h
-// Created by: Julien Dutheil
-// Created on: Thursday Februar 07th, 16:30
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOALPHABETINDEX1FORMAT_H_
-#define _BPPOALPHABETINDEX1FORMAT_H_
-
-#include <Bpp/Io/IoFormat.h>
-#include "../AlphabetIndex/AlphabetIndex1.h"
-
-// From the STL:
-#include <string>
-
-namespace bpp
-{
-
-  /**
-   * @brief AlphabetIndex1 I/O in BppO format.
-   *
-   * Enables the instanciation of AlphabetIndex1 objects according to
-   * the BppO syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   *
-   */
-  class BppOAlphabetIndex1Format:
-    public virtual IOFormat
-  {
-  private:
-    const Alphabet* alphabet_;
-    std::string message_;
-    bool verbose_;
-
-  public:
-    /**
-      * @param alphabet The alphabet for which indices should be built.
-      * The alphabet will be used to check that the instanciated index is compatible.
-      * @param message Some text describing what the index is intended for.
-      * @param verbose Tell if some messages should be printed while parsing.
-      */
-    BppOAlphabetIndex1Format(const Alphabet* alphabet, const std::string& message, bool verbose = true):
-      alphabet_(alphabet), message_(message), verbose_(verbose) {}
-
-    BppOAlphabetIndex1Format(const BppOAlphabetIndex1Format& format):
-      alphabet_(format.alphabet_),
-      message_(format.message_),
-      verbose_(format.verbose_) {}
-
-    BppOAlphabetIndex1Format& operator=(const BppOAlphabetIndex1Format& format)
-    {
-      alphabet_ = format.alphabet_;
-      message_  = format.message_;
-      verbose_  = format.verbose_;
-      return *this;
-    }
-
-    virtual ~BppOAlphabetIndex1Format() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "AlphabetIndex1"; }
-
-    /**
-     * @brief Read a AlphabetIndex1 object from a string.
-     *
-     * @param description A string describing the index in the keyval syntax.
-     * @return A new AlphabetIndex1 object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    AlphabetIndex1* read(const std::string& description) throw (Exception);
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOALPHABETINDEX1FORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/BppOAlphabetIndex2Format.cpp b/src/Bpp/Seq/Io/BppOAlphabetIndex2Format.cpp
deleted file mode 100644
index a1224fd..0000000
--- a/src/Bpp/Seq/Io/BppOAlphabetIndex2Format.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// File: BppOAlphabetIndex2Format.cpp
-// Created by: Julien Dutheil
-// Created on: Thursday Februar 07th, 19:26
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "BppOAlphabetIndex2Format.h"
-#include "BppOAlphabetIndex1Format.h"
-#include "../Alphabet/AlphabetTools.h"
-#include "../AlphabetIndex/BLOSUM50.h"
-#include "../AlphabetIndex/GranthamAAChemicalDistance.h"
-#include "../AlphabetIndex/MiyataAAChemicalDistance.h"
-#include "../AlphabetIndex/SimpleIndexDistance.h"
-#include "../AlphabetIndex/AAIndex2Entry.h"
-#include "../AlphabetIndex/AlphabetIndex1.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-#include <Bpp/App/ApplicationTools.h>
-
-#include <string>
-#include <memory>
-
-using namespace bpp;
-using namespace std;
-
-AlphabetIndex2* BppOAlphabetIndex2Format::read(const std::string& description) throw (Exception)
-{
-  if (description != "None")
-  {
-    string name;
-    map<string, string> args;
-    KeyvalTools::parseProcedure(description, name, args);
-    if (verbose_)
-      ApplicationTools::displayResult(message_, description);
-
-    //Currently, only protein indices are supported:
-    if (!AlphabetTools::isProteicAlphabet(alphabet_))
-        throw Exception("BppOAlphabetIndex2Format::read. This index is only supported with a protein alphabet.");
-    if (name == "Blosum50")
-    {
-      return new BLOSUM50();
-    }
-    else if (name == "Grantham")
-    {
-      bool sym = ApplicationTools::getBooleanParameter("symmetrical", args, true, "", true, 1);
-      GranthamAAChemicalDistance* M = new GranthamAAChemicalDistance();
-      M->setSymmetric(sym);
-      if (!sym) M->setPC1Sign(true);
-      return M;
-    }
-    else if (name == "Miyata")
-    {
-      bool sym = ApplicationTools::getBooleanParameter("symmetrical", args, true, "", true, 1);
-      MiyataAAChemicalDistance* M = new MiyataAAChemicalDistance();
-      M->setSymmetric(sym);
-      return M;
-    }
-    else if (name == "Diff")
-    {
-      string index1Desc = ApplicationTools::getStringParameter("index1", args, "None", "", true, 1);
-      bool sym = ApplicationTools::getBooleanParameter("symmetrical", args, true, "", true);
-      BppOAlphabetIndex1Format index1Reader(alphabet_, "" , false);
-      AlphabetIndex1* index1 = index1Reader.read(index1Desc);
-      if (index1) {
-        SimpleIndexDistance* M = new SimpleIndexDistance(index1);
-        M->setSymmetric(sym);
-        return M;
-      } else {
-        throw Exception("BppOAlphabetIndex2Format::read. Diff: index1 should be provided.");
-      }
-    }
-    else if (name == "User")
-    {
-      bool sym = ApplicationTools::getBooleanParameter("symmetrical", args, true, "", true, 1);
-      string aax2FilePath = ApplicationTools::getAFilePath("file", args, true, true, "", false);
-      ifstream aax2File(aax2FilePath.c_str(), ios::in);
-      AAIndex2Entry* M = new AAIndex2Entry(aax2File, sym);
-      aax2File.close();
-      return M;
-    }
-    else
-    {
-      throw Exception("Invalid index2 '" + name + "'.");
-    }
-  }
-  else
-  {
-    return 0;
-  }
-}
-
diff --git a/src/Bpp/Seq/Io/BppOAlphabetIndex2Format.h b/src/Bpp/Seq/Io/BppOAlphabetIndex2Format.h
deleted file mode 100644
index cbe65ff..0000000
--- a/src/Bpp/Seq/Io/BppOAlphabetIndex2Format.h
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// File: BppOAlphabetIndex2Format.h
-// Created by: Julien Dutheil
-// Created on: Thursday Februar 07th, 19:26
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOALPHABETINDEX2FORMAT_H_
-#define _BPPOALPHABETINDEX2FORMAT_H_
-
-#include <Bpp/Io/IoFormat.h>
-#include "../AlphabetIndex/AlphabetIndex2.h"
-
-// From the STL:
-#include <string>
-
-namespace bpp
-{
-
-  /**
-   * @brief AlphabetIndex2 I/O in BppO format.
-   *
-   * Enables the instanciation of AlphabetIndex2 objects according to
-   * the BppO syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   *
-   */
-  class BppOAlphabetIndex2Format:
-    public virtual IOFormat
-  {
-  private:
-    const Alphabet* alphabet_;
-    std::string message_;
-    bool verbose_;
-
-  public:
-    /**
-      * @param alphabet The alphabet for which indices should be built.
-      * The alphabet will be used to check that the instanciated index is compatible.
-      * @param message Some text describing what the index is intended for.
-      * @param verbose Tell if some messages should be printed while parsing.
-      */
-    BppOAlphabetIndex2Format(const Alphabet* alphabet, const std::string& message, bool verbose = true):
-      alphabet_(alphabet), message_(message), verbose_(verbose) {}
-
-    BppOAlphabetIndex2Format(const BppOAlphabetIndex2Format& format):
-      alphabet_(format.alphabet_),
-      message_(format.message_),
-      verbose_(format.verbose_) {}
-
-    BppOAlphabetIndex2Format& operator=(const BppOAlphabetIndex2Format& format)
-    {
-      alphabet_ = format.alphabet_;
-      message_  = format.message_;
-      verbose_  = format.verbose_;
-      return *this;
-    }
-
-    virtual ~BppOAlphabetIndex2Format() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "AlphabetIndex2"; }
-
-    /**
-     * @brief Read a AlphabetIndex1 object from a string.
-     *
-     * @param description A string describing the index in the keyval syntax.
-     * @return A new AlphabetIndex2 object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    AlphabetIndex2* read(const std::string& description) throw (Exception);
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOALPHABETINDEX2FORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/BppOSequenceReaderFormat.cpp b/src/Bpp/Seq/Io/BppOSequenceReaderFormat.cpp
deleted file mode 100644
index 1d6c3a9..0000000
--- a/src/Bpp/Seq/Io/BppOSequenceReaderFormat.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-// File: BppOSequenceReaderFormat.cpp
-// Created by: Julien Dutheil
-// Created on: Friday September 14th, 14:08
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "BppOSequenceReaderFormat.h"
-#include "Mase.h"
-#include "Phylip.h"
-#include "Fasta.h"
-#include "Clustal.h"
-#include "Dcse.h"
-#include "GenBank.h"
-#include "NexusIoSequence.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-
-#include <string>
-#include <memory>
-
-using namespace bpp;
-using namespace std;
-
-ISequence* BppOSequenceReaderFormat::read(const std::string& description) throw (Exception)
-{
-  unparsedArguments_.clear();
-  string format = "";
-  KeyvalTools::parseProcedure(description, format, unparsedArguments_);
-  auto_ptr<ISequence> iSeq;
-  if (format == "Mase")
-  {
-    iSeq.reset(new Mase());
-  }
-  else if (format == "Phylip")
-  {
-    bool sequential = true, extended = true;
-    string split = "  ";
-    string order = ApplicationTools::getStringParameter("order", unparsedArguments_, "sequential", "", true, warningLevel_);
-    if (order == "sequential")
-      sequential = true;
-    else if (order == "interleaved")
-      sequential = false;
-    else
-      throw Exception("BppOAlignmentReaderFormat::read. Invalid argument 'order' for phylip format: " + order);
-    
-    string type = ApplicationTools::getStringParameter("type", unparsedArguments_, "extended", "", true, warningLevel_);
-    if (type == "extended")
-    {
-      extended = true;
-      split = ApplicationTools::getStringParameter("split", unparsedArguments_, "spaces", "", true, warningLevel_);
-      if (split == "spaces")
-        split = "  ";
-      else if (split == "tab")
-        split = "\t";
-      else
-        throw Exception("BppOAlignmentReaderFormat::read. Invalid argument 'split' for phylip format: " + split);
-    }
-    else if (type == "classic")
-      extended = false;
-    else
-      throw Exception("BppOAlignmentReaderFormat::read. Invalid argument 'type' for phylip format: " + type);
-    
-    iSeq.reset(new Phylip(extended, sequential, 100, true, split));
-  }
-  else if (format == "Fasta")
-  {
-    bool strictNames = ApplicationTools::getBooleanParameter("strict_names", unparsedArguments_, false, "", true, warningLevel_);
-    bool extended    = ApplicationTools::getBooleanParameter("extended", unparsedArguments_, false, "", true, warningLevel_);
-    iSeq.reset(new Fasta(100, true, extended, strictNames));
-  }
-  else if (format == "Clustal")
-  {
-    unsigned int extraSpaces = ApplicationTools::getParameter<unsigned int>("extraSpaces", unparsedArguments_, 0, "", true, warningLevel_);
-    iSeq.reset(new Clustal(true, extraSpaces));
-  }
-  else if (format == "Dcse")
-  {
-    iSeq.reset(new DCSE());
-  }
-  else if (format == "GenBank")
-  {
-    iSeq.reset(new GenBank()); // This is required to remove a strict-aliasing warning in gcc 4.4
-  }
-  else if (format == "Nexus")
-  {
-    iSeq.reset(new NexusIOSequence());
-  }
-  else
-  {
-    throw Exception("Sequence format '" + format + "' unknown.");
-  }
-
-  return iSeq.release();
-}
-
diff --git a/src/Bpp/Seq/Io/BppOSequenceReaderFormat.h b/src/Bpp/Seq/Io/BppOSequenceReaderFormat.h
deleted file mode 100644
index 3b3edd5..0000000
--- a/src/Bpp/Seq/Io/BppOSequenceReaderFormat.h
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// File: BppOSequenceReaderFormat.h
-// Created by: Julien Dutheil
-// Created on: Friday September 14th, 14:08
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOSEQUENCEREADERFORMAT_H_
-#define _BPPOSEQUENCEREADERFORMAT_H_
-
-#include "IoSequenceFactory.h"
-
-namespace bpp
-{
-
-  /**
-   * @brief Sequence I/O in BppO format.
-   *
-   * Creates a new ISequence object according to
-   * distribution description syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   *
-   */
-  class BppOSequenceReaderFormat:
-    public virtual IOFormat
-  {
-  private:
-    std::map<std::string, std::string> unparsedArguments_;
-    int warningLevel_;
-
-  public:
-    BppOSequenceReaderFormat(int warningLevel):
-      unparsedArguments_(), warningLevel_(warningLevel) {}
-
-    virtual ~BppOSequenceReaderFormat() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "Sequence reader"; }
-
-    /**
-     * @brief Read a ISequence object from a string.
-     *
-     * @param description A string describing the reader in the keyval syntax.
-     * @return A new ISequence object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    ISequence* read(const std::string& description) throw (Exception);
-
-    /**
-     * @return The arguments and their unparsed values from the last call of the read function, if there are any.
-     */
-    virtual const std::map<std::string, std::string>& getUnparsedArguments() const { return unparsedArguments_; }
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOSEQUENCEREADERFORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.h b/src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.h
deleted file mode 100644
index 5b1af48..0000000
--- a/src/Bpp/Seq/Io/BppOSequenceStreamReaderFormat.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// File: BppOSequenceStreamReaderFormat.h
-// Created by: Julien Dutheil
-// Created on: Tuesday November 20th, 13:27
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOSEQUENCESTREAMREADERFORMAT_H_
-#define _BPPOSEQUENCESTREAMREADERFORMAT_H_
-
-#include "IoSequenceFactory.h"
-#include "ISequenceStream.h"
-
-namespace bpp
-{
-
-  /**
-   * @brief Sequence I/O in BppO format.
-   *
-   * Creates a new ISequenceStream object according to
-   * distribution description syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   */
-  class BppOSequenceStreamReaderFormat:
-    public virtual IOFormat
-  {
-  private:
-    std::map<std::string, std::string> unparsedArguments_;
-
-  public:
-    BppOSequenceStreamReaderFormat():
-      unparsedArguments_() {}
-    virtual ~BppOSequenceStreamReaderFormat() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "Sequence stream reader"; }
-
-    /**
-     * @brief Read a ISequenceStream object from a string.
-     *
-     * @param description A string describing the reader in the keyval syntax.
-     * @return A new ISequenceStream object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    ISequenceStream* read(const std::string& description) throw (Exception);
-
-    /**
-     * @return The arguments and their unparsed values from the last call of the read function, if there are any.
-     */
-    virtual const std::map<std::string, std::string>& getUnparsedArguments() const { return unparsedArguments_; }
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOSEQUENCESTREAMREADERFORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/BppOSequenceWriterFormat.cpp b/src/Bpp/Seq/Io/BppOSequenceWriterFormat.cpp
deleted file mode 100644
index 7685612..0000000
--- a/src/Bpp/Seq/Io/BppOSequenceWriterFormat.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-// File: BppOSequenceWriterFormat.cpp
-// Created by: Julien Dutheil
-// Created on: Friday September 15th, 21:20
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "BppOSequenceWriterFormat.h"
-#include "Fasta.h"
-#include "Mase.h"
-
-#include <Bpp/Text/KeyvalTools.h>
-
-#include <string>
-#include <memory>
-
-using namespace bpp;
-using namespace std;
-
-OSequence* BppOSequenceWriterFormat::read(const std::string& description) throw (Exception)
-{
-  unparsedArguments_.clear();
-  string format = "";
-  KeyvalTools::parseProcedure(description, format, unparsedArguments_);
-  unsigned int ncol = ApplicationTools::getParameter<unsigned int>("length", unparsedArguments_, 100, "", true, warningLevel_);
-  auto_ptr<OSequence> oSeq;
-  if (format == "Fasta")
-  {
-    oSeq.reset(new Fasta(ncol));
-  }
-  else if (format == "Mase")
-  {
-    oSeq.reset(new Mase(ncol));
-  }
-  else
-  {
-    throw Exception("Sequence format '" + format + "' unknown.");
-  }
-
-  return oSeq.release();
-}
-
diff --git a/src/Bpp/Seq/Io/BppOSequenceWriterFormat.h b/src/Bpp/Seq/Io/BppOSequenceWriterFormat.h
deleted file mode 100644
index 69fed19..0000000
--- a/src/Bpp/Seq/Io/BppOSequenceWriterFormat.h
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// File: BppOSequenceWriterFormat.h
-// Created by: Julien Dutheil
-// Created on: Saturday September 15th, 21:06
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 16, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for phylogenetic data analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use, 
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info". 
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability. 
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or 
-  data to be ensured and,  more generally, to use and operate it in the 
-  same conditions as regards security. 
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPPOSEQUENCEWRITERFORMAT_H_
-#define _BPPOSEQUENCEWRITERFORMAT_H_
-
-#include "IoSequenceFactory.h"
-
-namespace bpp
-{
-
-  /**
-   * @brief Sequence I/O in BppO format.
-   *
-   * Creates a new OSequence object according to
-   * distribution description syntax (see the Bio++ Program Suite
-   * manual for a detailed description of this syntax).
-   *
-   */
-  class BppOSequenceWriterFormat:
-    public virtual IOFormat
-  {
-  private:
-    std::map<std::string, std::string> unparsedArguments_;
-    int warningLevel_;
-
-  public:
-    BppOSequenceWriterFormat(int warningLevel):
-      unparsedArguments_(), warningLevel_(warningLevel) {}
-     virtual ~BppOSequenceWriterFormat() {}
-
-  public:
-    const std::string getFormatName() const { return "BppO"; }
-
-    const std::string getFormatDescription() const { return "Bpp Options format."; }
-
-		const std::string getDataType() const { return "Sequence reader"; }
-
-    /**
-     * @brief Read a OSequence object from a string.
-     *
-     * @param description A string describing the reader in the keyval syntax.
-     * @return A new OSequence object according to options specified.
-     * @throw Exception if an error occured.
-     */
-    OSequence* read(const std::string& description) throw (Exception);
-
-    /**
-     * @return The arguments and their unparsed values from the last call of the read function, if there are any.
-     */
-    virtual const std::map<std::string, std::string>& getUnparsedArguments() const { return unparsedArguments_; }
-
-  };
-
-} //end of namespace bpp.
-
-#endif //_BPPOSEQUENCEWRITERFORMAT_H_
-
diff --git a/src/Bpp/Seq/Io/Clustal.cpp b/src/Bpp/Seq/Io/Clustal.cpp
deleted file mode 100644
index 568b946..0000000
--- a/src/Bpp/Seq/Io/Clustal.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-//
-// File: Clustal.cpp
-// Created by: Julien Dutheil
-// Created on: ?
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Clustal.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-#include <iomanip>
-using namespace std;
-
-void Clustal::appendAlignmentFromStream(std::istream& input, SiteContainer & sc) const throw (Exception)
-{
-  // Checking the existence of specified file
-  if (!input) { throw IOException ("Clustal::read : fail to open file"); }
-
-  const Alphabet * alpha = sc.getAlphabet();
-  vector<BasicSequence> sequences;
-
-  string lineRead("");
-
-  Comments comments(1);
-  comments[0] = FileTools::getNextLine(input); // First line gives file generator.
-
-  lineRead = FileTools::getNextLine(input); // This is the first sequence of the first block.
-    
-  string::size_type beginSeq = 0;
-  unsigned int count = 0;
-  for (size_t i = lineRead.size(); i > 0; i--) {
-    char c = lineRead[i-1];
-    if (c == ' ') {
-      count++;
-      if (count == nbSpacesBeforeSeq_) {
-        beginSeq = i - 1 + nbSpacesBeforeSeq_;
-        break;
-      }
-    }
-    else count = 0;
-  }
-  if (beginSeq == 0) throw IOException("Clustal::read. Bad intput file.");
-
-  unsigned int countSequences = 0;
-
-  //Read first sequences block:
-  bool test = true;
-  do {
-    sequences.push_back(BasicSequence(TextTools::removeSurroundingWhiteSpaces(lineRead.substr(0, beginSeq - nbSpacesBeforeSeq_)), lineRead.substr(beginSeq), alpha));
-    getline(input, lineRead, '\n');
-    countSequences++;
-    test = !TextTools::isEmpty(lineRead) && !TextTools::isEmpty(lineRead.substr(0, beginSeq - nbSpacesBeforeSeq_));
-  }
-  while (input && test);
-
-  // Read other blocks
-  lineRead = FileTools::getNextLine(input); // Read first sequence of next block.
-  while (!TextTools::isEmpty(lineRead)) {
-    // Read next block:
-    for (unsigned int i = 0; i < countSequences; ++i) {
-      // Complete sequences
-      if (TextTools::isEmpty(lineRead))
-        throw IOException("Clustal::read. Bad intput file.");
-       sequences[i].append(lineRead.substr(beginSeq));
-      getline(input, lineRead, '\n');
-    }
-    //At this point, lineRead is the first line after the current block.
-    lineRead = FileTools::getNextLine(input);
-  }
-
-  for (unsigned int i = 0; i < countSequences; ++i)
-    sc.addSequence(sequences[i], checkNames_);
-  sc.setGeneralComments(comments);
-}
-
-void Clustal::writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception)
-{
-  output << "CLUSTAL W (1.81) multiple sequence alignment" << endl;
-  output << endl;
-  if (sc.getNumberOfSequences() == 0)
-    return;
-
-  vector<string> text;
-  size_t length = 0;
-  for (size_t i = 0; i < sc.getNumberOfSequences(); ++i ) {
-    const Sequence& seq = sc.getSequence(i);
-    if (seq.getName().size() > length)
-      length = seq.getName().size();
-    text.push_back(sc.getSequence(i).toString());
-  }
-  length += nbSpacesBeforeSeq_;
-  for (unsigned int j = 0; j < text[0].size(); j += charsByLine_) {
-    for (unsigned int i = 0; i < sc.getNumberOfSequences(); ++i ) {
-      output << TextTools::resizeRight(sc.getSequence(i).getName(), length);
-      output << text[i].substr(j, charsByLine_) << endl;
-    }
-    output << endl;
-  }
-}
-
diff --git a/src/Bpp/Seq/Io/Clustal.h b/src/Bpp/Seq/Io/Clustal.h
deleted file mode 100644
index a2cc858..0000000
--- a/src/Bpp/Seq/Io/Clustal.h
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// File: Clustal.h
-// Created by: Julien Dutheil
-// Created on: ?
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _CLUSTAL_H_
-#define _CLUSTAL_H_
-
-#include "AbstractIAlignment.h"
-#include "AbstractOAlignment.h"
-#include "../Container/SiteContainer.h"
-
-// From the STL:
-#include <iostream>
-
-namespace bpp
-{
-/**
- * @brief The clustal sequence file format.
- *
- * An AlignedSequenceContainer object is used instead of a VectorSequenceContainer.
- */
-class Clustal :
-  public AbstractIAlignment,
-  public AbstractOAlignment,
-  public virtual ISequence
-{
-private:
-  bool checkNames_;
-  unsigned int nbSpacesBeforeSeq_;
-  unsigned int charsByLine_;
-
-public:
-  /**
-   * @brief Build a new Clustal object.
-   *
-   * @param checkSequenceNames Tell if the names in the file should be checked for unicity (slower, in o(n*n) where n is the number of sequences).
-   * @param nbExtraSpacesBeforeSeq Specify the number of extra space characters separating the sequence name form content. The default is 5 (hence 6 spaces in total) for backward compatibility, using 0 will not allow for any space in the sequence names.
-   * @param charsByLine Number of character per line when writing file.
-   */
-  Clustal(bool checkSequenceNames = true, unsigned int nbExtraSpacesBeforeSeq = 5, unsigned int charsByLine = 100) throw (Exception) :
-    checkNames_(checkSequenceNames),
-    nbSpacesBeforeSeq_(nbExtraSpacesBeforeSeq + 1),
-    charsByLine_(charsByLine)
-  {}
-
-  virtual ~Clustal() {}
-
-public:
-  /**
-   * @name The AbstractIAlignment interface.
-   *
-   * @{
-   */
-  void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception);
-  /** @} */
-
-  /**
-   * @name The ISequence interface.
-   *
-   * As a SiteContainer is a subclass of SequenceContainer, we hereby implement the ISequence
-   * interface by downcasting the interface.
-   *
-   * @{
-   */
-  virtual SequenceContainer* readSequences(std::istream& input, const Alphabet* alpha) const throw (Exception) {
-    return readAlignment(input, alpha);
-  }
-  virtual SequenceContainer* readSequences(const std::string& path, const Alphabet* alpha) const throw (Exception) {
-    return readAlignment(path, alpha);
-  }
-  /** @} */
-
-  /**
-   * @name The AbstractOAlignment interface.
-   *
-   * @{
-   */
-  void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception);
-  void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-  {
-    AbstractOAlignment::writeAlignment(path, sc, overwrite);
-  }
-  /** @} */
-
-  /**
-   * @name The IOSequence interface.
-   *
-   * @{
-   */
-  const std::string getFormatName() const { return "Clustal"; }
-
-  const std::string getFormatDescription() const { return "The Clustal alignment tool output format."; }
-
-  /** @} */
-
-  /**
-   * @return true if the names are to be checked when reading sequences from files.
-   */
-  bool checkNames() const { return checkNames_; }
-
-  /**
-   * @brief Tell whether the sequence names should be checked when reading from files.
-   *
-   * @param yn whether the sequence names should be checked when reading from files.
-   */
-  void checkNames(bool yn) { checkNames_ = yn; }
-};
-} // end of namespace bpp.
-
-#endif // _CLUSTAL_H_
-
diff --git a/src/Bpp/Seq/Io/Dcse.cpp b/src/Bpp/Seq/Io/Dcse.cpp
deleted file mode 100644
index 8729deb..0000000
--- a/src/Bpp/Seq/Io/Dcse.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// File: DCSE.cpp
-// Created by: Julien Dutheil
-// Created on: Wed Mar 3 2004
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Dcse.h"
-#include "AbstractIAlignment.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-using namespace std;
-
-void DCSE::appendAlignmentFromStream(istream& input, SiteContainer& sc) const throw (Exception)
-{
-  // Checking the existence of specified file
-  if (!input) { throw IOException ("DCSE::read : fail to open file"); }
-
-  // Initialization
-  const Alphabet * alpha = sc.getAlphabet();
-  string line, name, sequence = "";
-
-  line = FileTools::getNextLine(input); // Copy current line in temporary string
-  //StringTokenizer st(line);
-  //st.nextToken();
-  //First line ignored for now!
-  //int n1 = TextTools::toInt(st.nextToken());
-  //int n2 = TextTools::toInt(st.nextToken());
-  //int nbSites = n2 - n1
-  //cout << nbSpecies << " species and " << nbSites << " sites." << endl;
-
-  // Main loop : for all file lines
-  while (!input.eof())
-  {
-    line = FileTools::getNextLine(input); // Copy current line in temporary string
-    if(line == "") break;
-    string::size_type endOfSeq = line.find("     ");
-    if(endOfSeq == line.npos) break;
-    sequence = string(line.begin(), line.begin() + static_cast<ptrdiff_t>(endOfSeq));
-    sequence = TextTools::removeWhiteSpaces(sequence);
-    sequence = TextTools::removeChar(sequence, '{');
-    sequence = TextTools::removeChar(sequence, '}');
-    sequence = TextTools::removeChar(sequence, '[');
-    sequence = TextTools::removeChar(sequence, ']');
-    sequence = TextTools::removeChar(sequence, '(');
-    sequence = TextTools::removeChar(sequence, ')');
-    sequence = TextTools::removeChar(sequence, '^');
-    name     = string(line.begin() + static_cast<ptrdiff_t>(endOfSeq + 1), line.end()),
-    name     = TextTools::removeFirstWhiteSpaces(name);
-    if(name.find("Helix numbering") == name.npos
-    && name.find("mask") == name.npos)
-      sc.addSequence(BasicSequence(name, sequence, alpha), true);
-  }
-}
-
-const string DCSE::getFormatName() const { return "DCSE"; }
-
-const string DCSE::getFormatDescription() const { return "RNA structure format"; }
-
diff --git a/src/Bpp/Seq/Io/Fasta.cpp b/src/Bpp/Seq/Io/Fasta.cpp
deleted file mode 100644
index e990910..0000000
--- a/src/Bpp/Seq/Io/Fasta.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-//
-// File: Fasta.cpp
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created: Tue Aug 21 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Fasta.h"
-
-#include <fstream>
-
-#include "../StringSequenceTools.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-using namespace std;
-
-/******************************************************************************/
-
-bool Fasta::nextSequence(istream& input, Sequence& seq) const throw (Exception) {
-  if (!input)
-    throw IOException("Fasta::nextSequence: can't read from istream input");
-  string seqname = "";
-  string content = "";
-  Comments seqcmts;
-  short seqcpt = 0;
-  string linebuffer = "";
-  char c;
-  while (!input.eof())
-  {
-    c = static_cast<char>(input.peek());
-    if (input.eof())
-      c = '\n';
-
-    // Sequence begining detection
-    if (c == '>')
-    {
-      // Stop if find a new sequence
-      if (seqcpt++)
-        break;
-    }
-    getline(input, linebuffer);
-    if (c == '>')
-    {
-      // Get the sequence name line
-      seqname = string(linebuffer.begin() + 1, linebuffer.end());
-    }
-    if (c != '>' && !TextTools::isWhiteSpaceCharacter(c)) {
-      // Sequence content
-      content += TextTools::toUpper(TextTools::removeWhiteSpaces(linebuffer));
-    }
-  }
-
-  bool res = (!input.eof());
-  // Sequence name and comments isolation
-  if (strictNames_ || extended_) {
-    size_t pos = seqname.find_first_of(" \t\n");
-    string seqcmt;
-    if (pos != string::npos) {
-      seqcmt = seqname.substr(pos + 1);
-      seqname = seqname.substr(0, pos);
-    }
-    if (extended_) {
-      StringTokenizer st(seqcmt, " \\", true, false);
-      while (st.hasMoreToken()) {
-        seqcmts.push_back(st.nextToken());
-      }
-    } else {
-      seqcmts.push_back(seqcmt);
-    }
-    seq.setComments(seqcmts);
-  }
-  seq.setName(seqname);
-  seq.setContent(content);
-  return res;
-}
-
-/******************************************************************************/
-
-void Fasta::writeSequence(ostream& output, const Sequence& seq) const throw (Exception)
-{
-  if (!output)
-    throw IOException("Fasta::writeSequence: can't write to ostream output");
-  // Sequence name
-  output << ">" << seq.getName();
-  // Sequence comments
-  if (extended_)
-  {
-    for (unsigned int i = 0 ; i < seq.getComments().size() ; i++)
-    {
-      output << " \\" << seq.getComments()[i];
-    }
-  }
-  output << endl;
-  // Sequence content
-  string buffer; // use a buffer to format sequence with states > 1 char
-  for (size_t i = 0 ; i < seq.size() ; ++i)
-  {
-    buffer += seq.getChar(i);
-    if (buffer.size() >= charsByLine_)
-    {
-      output << string(buffer.begin(), buffer.begin() + charsByLine_) << endl;
-      buffer.erase(0, charsByLine_);
-    }
-  }
-  output << string(buffer.begin(), buffer.end()) << endl;
-}
-
-/******************************************************************************/
-
-void Fasta::appendSequencesFromStream(istream& input, SequenceContainer& vsc) const throw (Exception)
-{
-  if (!input)
-    throw IOException("Fasta::appendFromStream: can't read from istream input");
-  char c = '\n';
-  char last_c;
-  bool header = false;
-  bool hasSeq = true;
-  string line = "";
-  Comments cmts;
-  while (!input.eof() && hasSeq)
-  {
-    last_c = c;
-    input.get(c);
-    // Header detection
-    if (extended_ && c == '#')
-    {
-      header = true;
-      continue;
-    }
-    // Header end detection
-    if (c == '\n')
-    {
-      if (extended_ && header)
-      {
-        if (line[0] == '\\')
-        {
-          line.erase(line.begin());
-          cmts.push_back(line);
-        }
-        line = "";
-        header = false;
-      }
-      continue;
-    }
-    // Header capture
-    if (header)
-    {
-      line.append(1, c);
-    }
-    // Sequence detection
-    if (c == '>' && last_c == '\n')
-    {
-      input.putback(c);
-      c = last_c;
-      BasicSequence tmpseq("", "", vsc.getAlphabet());
-      hasSeq = nextSequence(input, tmpseq);
-      vsc.addSequence(tmpseq, checkNames_);
-    }
-  }
-  if (extended_ && cmts.size()) {
-    vsc.setGeneralComments(cmts);
-  }
-}
-
-/******************************************************************************/
-
-void Fasta::writeSequences(ostream& output, const SequenceContainer& sc) const throw (Exception)
-{
-	if (!output)
-    throw IOException("Fasta::write: can't write to ostream output");
-
-  if (extended_)
-  {
-    // Loop for all general comments
-    for (unsigned int i = 0 ; i < sc.getGeneralComments().size() ; i++)
-    {
-      output << "#\\" << sc.getGeneralComments()[i] << endl;
-    }
-    output << endl;
-  }
-
-	// Main loop : for all sequences in vector container
-	vector<string> names = sc.getSequencesNames();
-	for (size_t i = 0; i < names.size(); ++i)
-  {
-    writeSequence(output, sc.getSequence(names[i]));
-	}
-}
-
-/******************************************************************************/
-
-// FileIndex class
-
-void Fasta::FileIndex::build(const std::string& path) throw (Exception) {
-  // open the file
-  std::ifstream f_in(path.c_str());
-  // get the size of the file
-  f_in.seekg(0, std::ios::end);
-  fileSize_ = f_in.tellg();
-  // feed the map
-  f_in.seekg(0, std::ios::beg);
-  streampos pos = f_in.tellg();
-  char ch;
-  std::string seq_id = "";
-  while (f_in.get(ch)) {
-    if (ch == '>') {
-      pos = static_cast<int>(f_in.tellg()) - 1;
-      std::getline(f_in, seq_id);
-      index_[seq_id] = pos;
-    }
-  }
-  f_in.close();
-}
-
-streampos Fasta::FileIndex::getSequencePosition(const std::string& id) const throw (Exception) {
-  std::map<std::string, streampos>::const_iterator it = index_.find(id);
-  if (it != index_.end()) {
-    return it->second;
-  }
-  throw Exception("Sequence not found: " + id);
-}
-
-void Fasta::FileIndex::read(const std::string& path) throw (Exception) {
-  std::ifstream f_in(path.c_str());
-  std::string line_buffer = "";
-  while (!f_in.eof()) {
-    std::getline(f_in, line_buffer);
-    if (bpp::TextTools::isEmpty(bpp::TextTools::removeSurroundingWhiteSpaces(line_buffer))) {
-      continue;
-    }
-    bpp::StringTokenizer tk(line_buffer, "\t");
-    index_[tk.getToken(0)] = bpp::TextTools::toInt(tk.getToken(1));
-  }
-  f_in.close();
-}
-
-void Fasta::FileIndex::write(const std::string& path) throw (Exception) {
-  std::ofstream f_out(path.c_str());
-  for (std::map<std::string, streampos>::const_iterator it = index_.begin() ; it != index_.end() ; ++it) {
-    f_out << it->first << "\t" << bpp::TextTools::toString(it->second) << std::endl;
-  }
-  f_out.close();
-}
-
-void Fasta::FileIndex::getSequence(const std::string& seqid, Sequence& seq, const std::string& path) const {
-  Fasta fs(60);
-  streampos seq_pos = this->getSequencePosition(seqid);
-  std::ifstream fasta(path.c_str());
-  fasta.seekg(seq_pos);
-  fs.nextSequence(fasta, seq);
-  fasta.close();
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Io/Fasta.h b/src/Bpp/Seq/Io/Fasta.h
deleted file mode 100644
index aae1d65..0000000
--- a/src/Bpp/Seq/Io/Fasta.h
+++ /dev/null
@@ -1,214 +0,0 @@
-//
-// File: Fasta.h
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created: Tue Aug 21 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _BPP_SEQ_IO_FASTA_H_
-#define _BPP_SEQ_IO_FASTA_H_
-
-#include "AbstractISequence.h"
-#include "AbstractIAlignment.h"
-#include "AbstractOSequence.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
-#include "ISequenceStream.h"
-#include "OSequenceStream.h"
-#include "SequenceFileIndex.h"
-
-namespace bpp
-{
-
-/**
- * @brief The fasta sequence file format.
- *
- * Read and write from/to Fasta files.
- */
-class Fasta:
-  public AbstractISequence,
-  public AbstractIAlignment,
-  public AbstractOSequence,
-  public virtual ISequenceStream,
-  public virtual OSequenceStream
-{
-  private:
-
-    /**
-     * @brief The maximum number of chars to be written on a line.
-     */
-    unsigned int charsByLine_; // Number of char by line (output only)
-    bool checkNames_;          // If names must be checked in container
-    bool extended_;            // If using HUPO-PSI extensions
-    bool strictNames_;         // If name is between '>' and first space
-
-  public:
-  
-    /**
-     * @brief Build a new Fasta object.
-     *
-     * @param charsByLine Number of character per line when writing files.
-     * @param checkSequenceNames  Tells if the names in the file should be checked for unicity (slower, in o(n*n) where n is the number of sequences).
-     * @param extended Tells if we should read general comments and sequence comments in HUPO-PSI format.
-     * @param strictSequenceNames Tells if the sequence names should be restricted to the characters between '>' and the first blank one.
-     */
-    Fasta(unsigned int charsByLine = 100, bool checkSequenceNames = true, bool extended = false, bool strictSequenceNames = false): charsByLine_(charsByLine), checkNames_(checkSequenceNames), extended_(extended), strictNames_(strictSequenceNames) {}
-
-    // Class destructor
-    virtual ~Fasta() {}
-
-  public:
-
-    /**
-     * @name The AbstractISequence interface.
-     *
-     * @{
-     */
-    void appendSequencesFromStream(std::istream& input, SequenceContainer& sc) const throw (Exception);
-    /** @} */
-
-    /**
-     * @name The AbstractIAlignment interface.
-     *
-     * @{
-     */
-    void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception) {
-      appendSequencesFromStream(input, sc); //This may raise an exception if sequences are not aligned!
-    }
-    /** @} */
-
-    /**
-     * @name The OSequence interface.
-     *
-     * @{
-     */
-    void writeSequences(std::ostream& output, const SequenceContainer& sc) const throw (Exception);
-    
-    void writeSequences(const std::string& path, const SequenceContainer& sc, bool overwrite=true) const throw (Exception)
-    {
-      AbstractOSequence::writeSequences(path, sc, overwrite);
-    }
-    /** @} */
-  
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const { return "FASTA file"; };
-    const std::string getFormatDescription() const
-    {
-      return "Sequence name (preceded by >) in one line, sequence content, no comments";
-    }
-    /** @} */
-
-    /**
-     * @name The ISequenceStream interface.
-     *
-     * @{
-     */
-    bool nextSequence(std::istream& input, Sequence& seq) const throw (Exception);
-    /** @} */
-
-    /**
-     * @name The OSequenceStream interface.
-     *
-     * @{
-     */
-    void writeSequence(std::ostream& output, const Sequence& seq) const throw (Exception);
-    /** @} */
-
-    /**
-     * @return true if the names are to be checked when reading sequences from files.
-     */
-    bool checkNames() const { return checkNames_; }
-
-    /**
-     * @brief Tell whether the sequence names should be checked when reading from files.
-     *
-     * @param yn whether the sequence names should be checked when reading from files.
-     */
-    void checkNames(bool yn) { checkNames_ = yn; }
-
-    /**
-     * @return true if the sequence name is restricted to be between '>' and the first space character.
-     */
-    bool strictNames() const { return strictNames_; }
-
-    /**
-     * @brief Tell wethed the sequence name should be restrected to the first non blank characters.
-     *
-     * @param yn whether the sequence names should be restrected.
-     */
-    void strictNames(bool yn) { strictNames_ = yn; }
-
-    /**
-     * @brief The SequenceFileIndex class for Fasta format
-     * @author Sylvain Gaillard
-     */
-    class FileIndex: SequenceFileIndex {
-      public:
-        FileIndex(): index_(), fileSize_(0) {}
-        ~FileIndex() {}
-        void build(const std::string& path) throw (Exception);
-        std::streampos getSequencePosition(const std::string& id) const throw (Exception);
-        size_t getNumberOfSequences() const throw (Exception) {
-          return index_.size();
-        }
-        /**
-         * @brief Read the index from a file
-         */
-        void read(const std::string& path) throw (Exception);
-        /**
-         * @brief Write the index to a file
-         */
-        void write(const std::string& path) throw (Exception);
-        /**
-         * @brief Get a sequence given its ID
-         */
-        void getSequence(const std::string& seqid, Sequence& seq, const std::string& path) const;
-      private:
-        std::map<std::string, std::streampos> index_;
-        std::streampos fileSize_;
-    };
-};
-
-} //end of namespace bpp.
-
-#endif // _BPP_SEQ_IO_FASTA_H_
-
diff --git a/src/Bpp/Seq/Io/ISequence.h b/src/Bpp/Seq/Io/ISequence.h
deleted file mode 100644
index 01584ea..0000000
--- a/src/Bpp/Seq/Io/ISequence.h
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-// File: ISequence.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Wed Jul 30 2003
-//
-
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ISEQUENCE_H_
-#define _ISEQUENCE_H_
-
-#include "IoSequence.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/SiteContainer.h"
-#include <Bpp/Exceptions.h>
-
-//From the STL:
-#include <iostream>
-#include <string>
-
-namespace bpp
-{
-
-/**
- * @brief The ISequence interface.
- *
- * This interface defines the basic methods for reading sequences from a file.
- * NB: This interface is effective only if the VIRTUAL_COV option is enabled (default behavior).
- */
-class ISequence :
-  public virtual IOSequence
-{
-  public:
-    ISequence() {}
-    virtual ~ISequence() {}
-
-  public:
-  
-    /**
-     * @brief Create a new container from a stream.
-     *
-     * @param input  The input stream to read.
-     * @param alpha The alphabet to be associated to the container.
-     * @return A new SequenceContainer object.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual SequenceContainer* readSequences(std::istream& input, const Alphabet* alpha) const throw (Exception) = 0;
-    /**
-     * @brief Create a new container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param alpha The alphabet to be associated to the container.
-     * @return A new SequenceContainer object.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual SequenceContainer* readSequences(const std::string& path, const Alphabet* alpha) const throw (Exception) = 0;
-
-};
-
-/**
- * @brief The IAlignment interface.
- *
- * This interface defines the basic methods for reading aligned sequences from a file.
- */
-class IAlignment:
-  public virtual IOSequence
-{
-  public:
-    IAlignment() {}
-    virtual ~IAlignment() {}
-
-  public:
-  
-    /**
-     * @brief Create a new container from a stream.
-     *
-     * @param input  The input stream to read.
-     * @param alpha The alphabet to be associated to the container.
-     * @return A new SiteContainer object.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual SiteContainer* readAlignment(std::istream& input, const Alphabet* alpha) const throw (Exception) = 0;
-    /**
-     * @brief Create a new container from a file.
-     *
-     * @param path  The path to the file to read.
-     * @param alpha The alphabet to be associated to the container.
-     * @return A new SiteContainer object.
-     * @throw Exception If the file is not in the specified format.
-     */
-    virtual SiteContainer* readAlignment(const std::string& path, const Alphabet* alpha) const throw (Exception) = 0;
-
-};
-
-} //end of namespace bpp.
-
-#endif  // _ISEQUENCE_H_
-
diff --git a/src/Bpp/Seq/Io/ISequenceStream.h b/src/Bpp/Seq/Io/ISequenceStream.h
deleted file mode 100644
index eb1cc09..0000000
--- a/src/Bpp/Seq/Io/ISequenceStream.h
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// File ISequenceStream.h
-// Author: Sylvain Gaillard
-// Created: 18/08/2009
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (August 18, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _ISEQUENCESTREAM_H_
-#define _ISEQUENCESTREAM_H_
-
-#include "IoSequenceStream.h"
-#include "../Sequence.h"
-#include "../Alphabet/Alphabet.h"
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-/**
- * @brief The ISequenceStream interface.
- *
- * Interface for streaming sequences input.
- *
- * @author Sylvain Gaillard
- */
-class ISequenceStream: public virtual IOSequenceStream
-{
-	public:
-		ISequenceStream() {}
-		virtual ~ISequenceStream() {}
-
-	public:
-    /**
-     * @brief Read sequence from stream.
-     *
-     * Read one sequence from a stream.
-     *
-     * @param input The stream to read.
-     * @param seq The sequence to fill.
-     * @return true if a sequence was read or false if not.
-     * @throw Exception IOExecption and Sequence related Exceptions.
-     */
-    virtual bool nextSequence(std::istream& input, Sequence& seq) const throw (Exception) = 0;
-
-};
-
-} //end of namespace bpp.
-
-#endif	// _ISEQUENCESTREAM_H_
-
diff --git a/src/Bpp/Seq/Io/IoSequenceFactory.cpp b/src/Bpp/Seq/Io/IoSequenceFactory.cpp
deleted file mode 100644
index 565cd9c..0000000
--- a/src/Bpp/Seq/Io/IoSequenceFactory.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// File IOSequenceFactory.cpp
-// Created by: Julien Dutheil
-// Created on: Tue 18/04/06 10:24
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "IoSequenceFactory.h"
-#include "Fasta.h"
-#include "Mase.h"
-#include "Clustal.h"
-#include "Dcse.h"
-#include "Phylip.h"
-#include "GenBank.h"
-#include "NexusIoSequence.h"
-
-using namespace bpp;
-using namespace std;
-
-const string IoSequenceFactory::FASTA_FORMAT              = "Fasta";
-const string IoSequenceFactory::MASE_FORMAT               = "Mase";  
-const string IoSequenceFactory::CLUSTAL_FORMAT            = "Clustal";
-const string IoSequenceFactory::DCSE_FORMAT               = "DCSE";  
-const string IoSequenceFactory::PHYLIP_FORMAT_INTERLEAVED = "Phylip I";  
-const string IoSequenceFactory::PHYLIP_FORMAT_SEQUENTIAL  = "Phylip S";  
-const string IoSequenceFactory::PAML_FORMAT_INTERLEAVED   = "PAML I";  
-const string IoSequenceFactory::PAML_FORMAT_SEQUENTIAL    = "PAML S";  
-const string IoSequenceFactory::GENBANK_FORMAT            = "GenBank";  
-const string IoSequenceFactory::NEXUS_FORMAT              = "Nexus";  
-
-ISequence* IoSequenceFactory::createReader(const string& format) throw (Exception)
-{
-       if(format == FASTA_FORMAT) return new Fasta();
-  else if(format == MASE_FORMAT) return new Mase();
-  else if(format == CLUSTAL_FORMAT) return new Clustal();
-  else if(format == DCSE_FORMAT) return new DCSE();
-  else if(format == PHYLIP_FORMAT_INTERLEAVED) return new Phylip(false, false);
-  else if(format == PHYLIP_FORMAT_SEQUENTIAL) return new Phylip(false, true);
-  else if(format == PAML_FORMAT_INTERLEAVED) return new Phylip(true, false);
-  else if(format == PAML_FORMAT_SEQUENTIAL) return new Phylip(true, true);
-  else if(format == GENBANK_FORMAT) return new GenBank();
-  else if(format == NEXUS_FORMAT) return new NexusIOSequence();
-  else throw Exception("Format " + format + " is not supported for sequences input.");
-}
-  
-IAlignment* IoSequenceFactory::createAlignmentReader(const string& format) throw (Exception)
-{
-       if(format == FASTA_FORMAT) return new Fasta();
-  else if(format == MASE_FORMAT) return new Mase();
-  else if(format == CLUSTAL_FORMAT) return new Clustal();
-  else if(format == DCSE_FORMAT) return new DCSE();
-  else if(format == PHYLIP_FORMAT_INTERLEAVED) return new Phylip(false, false);
-  else if(format == PHYLIP_FORMAT_SEQUENTIAL) return new Phylip(false, true);
-  else if(format == PAML_FORMAT_INTERLEAVED) return new Phylip(true, false);
-  else if(format == PAML_FORMAT_SEQUENTIAL) return new Phylip(true, true);
-  else if(format == NEXUS_FORMAT) return new NexusIOSequence();
-  else throw Exception("Format " + format + " is not supported for alignment input.");
-}
-  
-OSequence* IoSequenceFactory::createWriter(const string& format) throw (Exception)
-{
-       if(format == FASTA_FORMAT) return new Fasta();
-  else if(format == MASE_FORMAT) return new Mase();
-  else throw Exception("Format " + format + " is not supported for output.");
-}
-
-OAlignment* IoSequenceFactory::createAlignmentWriter(const string& format) throw (Exception)
-{
-       if (format == FASTA_FORMAT) return new Fasta();
-  else if (format == MASE_FORMAT) return new Mase();
-  else if (format == PHYLIP_FORMAT_INTERLEAVED) return new Phylip(false, false);
-  else if (format == PHYLIP_FORMAT_SEQUENTIAL) return new Phylip(false, true);
-  else if (format == PAML_FORMAT_INTERLEAVED) return new Phylip(true, false);
-  else if (format == PAML_FORMAT_SEQUENTIAL) return new Phylip(true, true);
-  else throw Exception("Format " + format + " is not supported for output.");
-}
-
diff --git a/src/Bpp/Seq/Io/IoSequenceFactory.h b/src/Bpp/Seq/Io/IoSequenceFactory.h
deleted file mode 100644
index 8c0cb98..0000000
--- a/src/Bpp/Seq/Io/IoSequenceFactory.h
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// File IoSequenceFactory.h
-// Created by: Julien Dutheil
-// Created on: Tue 18/04/06 10:24
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _IOSEQUENCEFACTORY_H_
-#define _IOSEQUENCEFACTORY_H_
-
-#include "ISequence.h"
-#include "OSequence.h"
-#include "../Alphabet/Alphabet.h"
-
-namespace bpp
-{
-
-/**
- * @brief Utilitary class for creating sequence readers and writers.
- */
-class IoSequenceFactory
-{
-  public:
-    static const std::string FASTA_FORMAT;  
-    static const std::string MASE_FORMAT;  
-    static const std::string CLUSTAL_FORMAT;  
-    static const std::string DCSE_FORMAT;  
-    static const std::string PHYLIP_FORMAT_INTERLEAVED;  
-    static const std::string PHYLIP_FORMAT_SEQUENTIAL;  
-    static const std::string PAML_FORMAT_INTERLEAVED;  
-    static const std::string PAML_FORMAT_SEQUENTIAL;  
-    static const std::string GENBANK_FORMAT;  
-    static const std::string NEXUS_FORMAT;  
-
-  public:
-
-    /**
-     * @brief Creates a new factory object.
-     *
-     * Example:
-     * @code
-     * Alphabet* alphabet = new DNA();
-     * ISequence* seqReader = IoSequenceFactory().createReader(IoSequenceFactory::FASTA_FORMAT);
-     * SequenceContainer* sequences = seqReader->read("file.fasta", alphabet);
-     * delete seqReader;
-     * @endcode
-     */
-    IoSequenceFactory() {}
-    virtual ~IoSequenceFactory() {}
-  
-    /**
-     * @brief Get a new dynamically created ISequence object.
-     *
-     * @param format The input file format.
-     * @return A pointer toward a new ISequence object.
-     * @throw Exception If the format name do not match any available format.
-     */
-    virtual ISequence* createReader(const std::string& format) throw (Exception);
-  
-    /**
-     * @brief Get a new dynamically created IAlignment object.
-     *
-     * @param format The input file format.
-     * @return A pointer toward a new IAlignment object.
-     * @throw Exception If the format name do not match any available format.
-     */
-    virtual IAlignment* createAlignmentReader(const std::string& format) throw (Exception);
-  
-    /**
-     * @brief Get a new dynamically created OSequence object.
-     *
-     * @param format The output file format.
-     * @return A pointer toward a new OSequence object.
-     * @throw Exception If the format name do not match any available format.
-     */
-    virtual OSequence* createWriter(const std::string& format) throw (Exception);
-    
-    /**
-     * @brief Get a new dynamically created OAlignment object.
-     *
-     * @param format The output file format.
-     * @return A pointer toward a new OAlignment object.
-     * @throw Exception If the format name do not match any available format.
-     */
-    virtual OAlignment* createAlignmentWriter(const std::string& format) throw (Exception);
-
-};
-
-} //end of namespace bpp.
-
-#endif //_IOSEQUENCEFACTORY_H_
-
diff --git a/src/Bpp/Seq/Io/Mase.cpp b/src/Bpp/Seq/Io/Mase.cpp
deleted file mode 100644
index 8014b89..0000000
--- a/src/Bpp/Seq/Io/Mase.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-//
-// File Mase.cpp
-// Author : Guillaume Deuchst
-//          Julien Dutheil
-// Last modification: Tuesday August 21 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Mase.h"
-#include "../StringSequenceTools.h"
-
-using namespace bpp;
-using namespace std;
-
-/****************************************************************************************/
-
-void Mase::appendSequencesFromStream(std::istream& input, SequenceContainer& vsc) const throw (Exception)
-{
-  if (!input) { throw IOException ("Mase::read : fail to open file"); }
-  
-  // Initialization
-  Comments seqComments, fileComments;
-  string temp, name, sequence = "";
-  bool comments = false;
-
-  // Get current general comments is VectorSequenceContainer
-  fileComments = vsc.getGeneralComments();
-
-  // Main loop : for all file lines
-  while (!input.eof())
-  {
-    getline(input, temp, '\n');  // Copy current line in temporary string
-    
-    // If first character is ;
-    if (temp[0] == ';')
-    {
-      // If second character is also ;
-      if (temp[1] == ';')
-      {
-        // File comments isolation
-        temp.erase(0,2);  // Characters ;; deletion
-        if(temp != "") fileComments.push_back(temp);
-      }
-      else
-      {
-        // If a name and a sequence were founded
-        if ((name != "") && (sequence != ""))
-        {
-          // New sequence creation, and addition in existing VectorSequenceContainer
-          vsc.addSequence(BasicSequence(name, sequence, seqComments, vsc.getAlphabet()), checkNames_);
-          name = "";
-          sequence = "";
-          seqComments.clear();
-        }
-        
-        // Sequence commentaries isolation
-        temp.erase(temp.begin());  // Character ; deletion
-        if (temp != "") seqComments.push_back(temp);
-        comments = true;
-      }
-    }
-    else
-    {
-      // If sequence commentaries were just isolated
-      if (comments)
-      {
-        // Sequence name isolation
-        name = temp;
-        comments = false;
-      }
-      else sequence += temp;  // Sequence isolation
-    }
-  }
-  
-  // Addition of the last sequence in file
-  if ((name != "") && (sequence != ""))
-  {
-    vsc.addSequence(BasicSequence(name, sequence, seqComments, vsc.getAlphabet()), checkNames_);
-  }
-
-  // Set new general comments in VectorSequenceContainer (old + new comments)
-  vsc.setGeneralComments(fileComments);
-}
-
-/****************************************************************************************/
-
-void Mase::writeSequences(ostream& output, const SequenceContainer& sc) const throw (Exception)
-{
-  // Checking the existence of specified file, and possibility to open it in write mode
-  if (!output) { throw IOException ("Mase::write : failed to open file"); }
-
-  Comments comments = sc.getGeneralComments();
-
-  // Writing all general comments in file
-  if (comments.size() == 0) {
-    output << ";;" << endl;
-  }
-  for (unsigned int i = 0 ; i < comments.size() ; i++) {
-    output << ";;" << comments[i] << endl;
-  }
-
-  string seq, temp = "";  // Initialization
-
-  // Main loop : for all sequences
-  vector<string> names = sc.getSequencesNames();
-  for (unsigned int i = 0 ; i < names.size() ; i ++)
-  {
-    comments = sc.getComments(names[i]);
-
-    // Writing all sequence comments in file
-    // If no comments are associated with current sequence, an empy commentary line will be writed
-    if (comments.size() == 0)
-    {
-      output << ";" << endl;
-    }
-    else
-    {
-      for (unsigned int j = 0 ; j < comments.size() ; j++)
-      {
-        output << ";" << comments[j] << endl;
-      }
-    }
-
-    // Sequence name writing
-    output << names[i] << endl;
-
-    // Sequence cutting to specified characters number per line
-    seq = sc.toString(names[i]);
-    while (seq != "")
-    {
-      if (seq.size() > charsByLine_)
-      {
-        temp = seq;
-        temp.erase(temp.begin() + charsByLine_ , temp.end());
-        output << temp  << endl;
-        seq.erase(seq.begin(), seq.begin() + charsByLine_);
-      }
-      else
-      {
-        output << seq << endl;
-        seq = "";
-      }
-    }
-  }
-}
-
-/****************************************************************************************/
-
-void Mase::readHeader_(std::istream& input, MaseHeader& header) const throw (Exception)
-{
-  do {
-    //Check if the line is a header line:
-    if (input.peek() == ';') {
-      char c;
-      input.get(c);
-      if (input.peek() == ';') {
-        input.get(c);
-        string line = FileTools::getNextLine(input);
-        
-        //Check the type of line...
-
-        //Site selection:
-        string::size_type index = line.find("# of");
-        if (index < line.npos) {
-          StringTokenizer st(string(line.begin() + static_cast<ptrdiff_t>(index + 4), line.end()), " \t=;");
-          st.nextToken(); //skip next word: may be 'regions' or 'segments' or else ;-)
-          unsigned int numberOfSegments = TextTools::to<unsigned int>(st.nextToken());
-          string name = st.unparseRemainingTokens();
-          //Then look for the set definition:
-          MultiRange<size_t> siteSelection;
-          while (siteSelection.size() < numberOfSegments) {
-            line = FileTools::getNextLine(input);
-            if (line[0] != ';' || line[1] != ';')
-              throw Exception("Mase::readHeader_(): corrupted file, site selection " + name + " is incomplete. Aborting.");
-            line = line.substr(2);
-            StringTokenizer st2(line);
-            while (st2.hasMoreToken()) {
-              StringTokenizer st3(st2.nextToken(), ",");
-              unsigned int begin = TextTools::to<unsigned int>(st3.nextToken());
-              unsigned int end   = TextTools::to<unsigned int>(st3.nextToken());
-              //WARNING!!! In the mase+ format, sites numerotation is 1-based, including, while ranges are 0-based, [a, b[:
-              siteSelection.addRange(Range<size_t>(begin - 1, end));
-            }
-            if (siteSelection.size() > numberOfSegments)
-              throw Exception("Mase::readHeader_(): incorrected file, found " + TextTools::toString(siteSelection.size()) + "segments while expected " + TextTools::toString(numberOfSegments));
-          }
-          header.setSiteSelection(name, siteSelection);
-        } else {
-          //Sequence selection:
-          index = line.find("@ of");
-          if (index < line.npos) {
-            StringTokenizer st(line.substr(index + 4), " \t=;");
-            st.nextToken(); //skip next word: may be 'sequences' or else ;-)
-            unsigned int numberOfSequences = TextTools::to<unsigned int>(st.nextToken());
-            string name = st.unparseRemainingTokens();
-            //The look for the set definition:
-            vector<size_t> sequenceSelection;
-            while (sequenceSelection.size() < numberOfSequences) {
-              line = FileTools::getNextLine(input);
-              if (line[0] != ';' || line[1] != ';')
-                throw Exception("Mase::readHeader_(): corrupted file, sequence selection " + name + " is incomplete. Aborting.");
-              line = line.substr(2);
-              StringTokenizer st2(line, ", ");
-              while (st2.hasMoreToken()) {
-                unsigned int pos = TextTools::to<unsigned int>(st2.nextToken());
-                //WARNING!!! In the mase+ format, sequence numerotation is 1-based 
-                sequenceSelection.push_back(pos);
-            }
-            if (sequenceSelection.size() > numberOfSequences)
-              throw Exception("Mase::readHeader_(): incorrected file, found " + TextTools::toString(sequenceSelection.size()) + "sequences while expected " + TextTools::toString(numberOfSequences));
-            }
-            header.setSequenceSelection(name, sequenceSelection);
-          } else {
-            //Tree:
-            index = line.find("$");
-            if (index < line.npos) {
-              string name = TextTools::removeSurroundingWhiteSpaces(line.substr(index + 1));
-              //Here we stop if the line ends with a ";"
-              string tree = "";
-              do {
-                line = FileTools::getNextLine(input);
-                if (line[0] != ';' || line[1] != ';')
-                  throw Exception("Mase::readHeader_(): corrupted file, tree " + name + " is incomplete. Aborting.");
-                line = TextTools::removeSurroundingWhiteSpaces(line.substr(2));
-                tree += line;
-              } while (! TextTools::endsWith(line, ";"));
-              header.setTree(name, tree);
-            }
-          }
-        }
-      } else {
-        input.putback(c);
-        break;
-      }
-    }
-  } while (true);
-}
-
-/****************************************************************************************/
-
-void Mase::writeHeader_(std::ostream& output, const MaseHeader& header) const
-{
-  //Write trees:
-  vector<string> treeNames = header.getTreeNames();
-  for (size_t i = 0; i < treeNames.size(); ++i) {
-    output << ";;$ " + treeNames[i] << endl;
-    output << ";;" + header.getTree(treeNames[i]);
-    output << endl;
-  }
-
-  //Write site selections:
-  vector<string> siteSelectionNames = header.getSiteSelectionNames();
-  for (size_t i = 0; i < siteSelectionNames.size(); ++i) {
-    MultiRange<size_t> ranges = header.getSiteSelection(siteSelectionNames[i]);
-    output << ";;# of segments=" << ranges.size() << " " << siteSelectionNames[i] << endl;
-    output << ";;";
-    for (unsigned int j = 0; j < ranges.size(); ++j) {
-      output << " " << (ranges.getRange(j).begin() + 1) << "," << ranges.getRange(j).end();
-      if ((j + 1) % 10 == 0)
-        output << endl << ";;";
-    }
-    output << endl;
-  }
-
-  //Write sequence selections:
-  vector<string> sequenceSelectionNames = header.getSequenceSelectionNames();
-  for (size_t i = 0; i < sequenceSelectionNames.size(); ++i) {
-    vector<size_t> set = header.getSequenceSelection(sequenceSelectionNames[i]);
-    output << ";;@ of species=" << set.size() << " " << sequenceSelectionNames[i] << endl;
-    output << ";;";
-    for (unsigned int j = 0; j < set.size(); ++j) {
-      output << " " << set[j];
-      if ((j + 1) % 10 == 0)
-        output << endl << ";;";
-    }
-    output << endl;
-  }
-}
-
-/****************************************************************************************/
-
diff --git a/src/Bpp/Seq/Io/Mase.h b/src/Bpp/Seq/Io/Mase.h
deleted file mode 100644
index 61ec8a0..0000000
--- a/src/Bpp/Seq/Io/Mase.h
+++ /dev/null
@@ -1,256 +0,0 @@
-//
-// File: Mase.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: ?
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _MASE_H_
-#define _MASE_H_
-
-#include "AbstractISequence.h"
-#include "AbstractIAlignment.h"
-#include "AbstractOSequence.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
-#include <Bpp/Numeric/Range.h>
-#include <Bpp/Utils/MapTools.h>
-
-namespace bpp
-{
-
-/**
- * @brief A class to store information from the header of Mase files.
- *
- * @author Julien Dutheil
- */
-class MaseHeader
-{
-  private:
-    mutable std::map<std::string, std::string> trees_;
-    mutable std::map<std::string, MultiRange<size_t> > siteSelections_;
-    mutable std::map<std::string, std::vector<size_t> > sequenceSelections_;
-
-  public:
-    MaseHeader(): trees_(), siteSelections_(), sequenceSelections_() {}
-    virtual ~MaseHeader() {}
-
-  public:
-    size_t getNumberOfTrees() const { return trees_.size(); }
-    size_t getNumberOfSiteSelections() const { return siteSelections_.size(); }
-    size_t getNumberOfSequenceSelections() const { return sequenceSelections_.size(); }
-
-    std::vector<std::string> getTreeNames() const { return MapTools::getKeys(trees_); }
-    std::vector<std::string> getSiteSelectionNames() const { return MapTools::getKeys(siteSelections_); }
-    std::vector<std::string> getSequenceSelectionNames() const { return MapTools::getKeys(sequenceSelections_); }
-
-    const std::string& getTree(const std::string& name) const throw (Exception) {
-      if (trees_.find(name) != trees_.end()) {
-        return trees_[name];
-      } else {
-        throw Exception("MaseHeader::getTree. No tree with name " + name);
-      }
-    }
-    const MultiRange<size_t>& getSiteSelection(const std::string& name) const throw (Exception) {
-      if (siteSelections_.find(name) != siteSelections_.end()) {
-        return siteSelections_[name];
-      } else {
-        throw Exception("MaseHeader::getSiteSelection. No site selection with name " + name);
-      }
-    }
-    const std::vector<size_t>& getSequenceSelection(const std::string& name) const throw (Exception) {
-      if (sequenceSelections_.find(name) != sequenceSelections_.end()) {
-        return sequenceSelections_[name];
-      } else {
-        throw Exception("MaseHeader::getSequenceSelection. No sequence selection with name " + name);
-      }
-    }
-
-    void setTree(const std::string& name, const std::string& tree) {
-      trees_[name] = tree;
-    }
-    void setSiteSelection(const std::string& name, const MultiRange<size_t>& ranges) {
-      siteSelections_[name] = ranges;
-    }
-    void setSequenceSelection(const std::string& name, const std::vector<size_t>& set) {
-      sequenceSelections_[name] = set;
-    }
-
-};
-
-/**
- * @brief The mase sequence file format.
- *
- * In addition to traditional read and write method, this class offers overloaded method
- * with MaseHeader objects, dedicated to header information storage. If used, then the header
- * of the mase file will be parsed accordingly. Otherwise, the header lines will be stored
- * as general comments.
- *
- * @see MaseTools for alternative way of parsing headers.
- */
-class Mase:
-  public AbstractISequence,
-  public AbstractIAlignment,
-  public AbstractOSequence
-{
-
-  private:
-
-    /**
-     * @brief The maximum number of chars to be written on a line.
-     */
-    unsigned int charsByLine_;
-    bool checkNames_;
-
-  public :
-    /**
-     * @brief Build a new Mase object.
-     *
-     * @param charsByLine Number of character per line when writing files.
-     * @param checkSequenceNames  Tell if the names in the file should be checked for unicity (slower, in o(n*n) where n is the number of sequences).
-     */
-    Mase(unsigned int charsByLine = 100, bool checkSequenceNames = true): charsByLine_(charsByLine), checkNames_(checkSequenceNames) {}
-
-    // Class destructor
-    virtual ~Mase() {}
-
-  public:
-
-    /**
-     * @name Reading method including header:
-     *
-     * @{
-     */
-    VectorSequenceContainer* readMeta(std::istream& input, const Alphabet* alpha, MaseHeader& header) const throw (Exception)
-    {
-      readHeader_(input, header);
-      return AbstractISequence::readSequences(input, alpha);
-    }
-    VectorSequenceContainer* readMeta(std::string& path, const Alphabet* alpha, MaseHeader& header) const throw (Exception)
-    {
-      std::ifstream input(path.c_str(), std::ios::in);
-      VectorSequenceContainer* sc = readMeta(input, alpha, header);
-      input.close();
-      return sc;
-    }
-    /** @} */
-    
-    /**
-     * @name The AbstractISequence interface.
-     *
-     * @{
-     */
-    void appendSequencesFromStream(std::istream& input, SequenceContainer& sc) const throw (Exception);
-    /** @} */
-
-    /**
-     * @name The AbstractIAlignment interface.
-     *
-     * @{
-     */
-    void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception) {
-      appendSequencesFromStream(input, sc); //This might cast an exception if sequences are not aligned! 
-    }
-    /** @} */
-
-
-    /**
-     * @name The OSequence interface.
-     *
-     * @{
-     */
-    void writeSequences(std::ostream& output, const SequenceContainer& sc) const throw (Exception);
-    void writeSequences(const std::string& path, const SequenceContainer& sc, bool overwrite = true) const throw (Exception)
-    {
-      AbstractOSequence::writeSequences(path, sc, overwrite);
-    }
-    /** @} */
-
-    /**
-     * @name Writing methods including header:
-     *
-     * @{
-     */
-    void writeMeta(std::ostream& output, const SequenceContainer& sc, const MaseHeader& header) const throw (Exception)
-    {
-      writeHeader_(output, header);
-      writeSequences(output, sc);
-    }
-    void writeMeta(const std::string& path, const SequenceContainer& sc, const MaseHeader& header, bool overwrite = true) const throw (Exception)
-    {
-			// Open file in specified mode
-      std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
-      writeHeader_(output, header);
-			writeSequences(output, sc);
-			output.close();
-    }
-    /** @} */
-
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const { return "MASE file"; }
-
-    const std::string getFormatDescription() const
-    {
-      return "Optional file comments (preceeded by ;;), sequence comments (preceeded by ;), sequence name, sequence";
-    }
-    /** @} */
-
-    /**
-     * @return true if the names are to be checked when reading sequences from files.
-     */
-    bool checkNames() const { return checkNames_; }
-
-    /**
-     * @brief Tell whether the sequence names should be checked when reading from files.
-     *
-     * @param yn whether the sequence names should be checked when reading from files.
-     */
-    void checkNames(bool yn) { checkNames_ = yn; }
-
-  private:
-    void readHeader_(std::istream& input, MaseHeader& header) const throw (Exception);
-    void writeHeader_(std::ostream& output, const MaseHeader& header) const;
-};
-
-} //end of namespace bpp.
-
-#endif // _MASE_H_
-
diff --git a/src/Bpp/Seq/Io/MaseTools.cpp b/src/Bpp/Seq/Io/MaseTools.cpp
deleted file mode 100644
index 5b4b060..0000000
--- a/src/Bpp/Seq/Io/MaseTools.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-//
-// File: MaseTools.cpp
-// Created by: Julien Dutheil
-// Created on: Tue Apr  1 09:16:59 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "MaseTools.h"
-#include "../Container/VectorSequenceContainer.h"
-#include "../Container/AlignedSequenceContainer.h"
-#include "../Container/SequenceContainerTools.h"
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Text/TextTools.h>
-
-#include <iostream>
-
-using namespace std;
-using namespace bpp;
-
-SiteSelection MaseTools::getSiteSet(const Comments& maseFileHeader, const string& setName) throw (IOException)
-{
-  SiteSelection selection;
-  for (size_t i = 0; i < maseFileHeader.size(); i++)
-  {
-    string current = maseFileHeader[i];
-    string::size_type index = current.find("# of");
-    if (index < current.npos)
-    {
-      StringTokenizer st(string(current.begin() + static_cast<ptrdiff_t>(index + 4), current.end()), " \t=;");
-      st.nextToken(); // skip next word: may be 'regions' or 'segments' or else ;-)
-      size_t numberOfSegments = TextTools::to<size_t>(st.nextToken());
-      string name = st.unparseRemainingTokens();
-      if (name == setName)
-      {
-        // cout << numberOfSegments << " segments found." << endl;
-        // Then look for the set definition:
-        i++; // next line.
-        size_t counter = 0;
-        while (i < maseFileHeader.size())
-        {
-          current = maseFileHeader[i++];
-          StringTokenizer st2(current);
-          // st.nextToken(); //Skip ';;'
-          while (st2.hasMoreToken())
-          {
-            StringTokenizer st3(st2.nextToken(), ",");
-            size_t begin = TextTools::to<size_t>(st3.nextToken());
-            size_t end   = TextTools::to<size_t>(st3.nextToken());
-            // WARNING!!! In the mase+ format, sites are numbered from 1 to nbSites,
-            // Whereas in SiteContainer the index begins at 0.
-            for (size_t j = begin; j <= end; j++)
-            {
-              selection.push_back(j - 1); // bounds included.
-            }
-            counter++;
-            if (counter == numberOfSegments)
-              return selection;
-          }
-        }
-      }
-    }
-  }
-  if (selection.size() == 0)
-  {
-    throw IOException("Site set " + setName + " has not been found in the sequence file.");
-  }
-  return selection;
-}
-
-/******************************************************************************/
-
-SequenceSelection MaseTools::getSequenceSet(const Comments& maseFileHeader, const string& setName) throw (IOException)
-{
-  SequenceSelection selection;
-  for (size_t i = 0; i < maseFileHeader.size(); i++)
-  {
-    string current = maseFileHeader[i];
-
-    string::size_type index = current.find("@ of");
-    if (index < current.npos)
-    {
-      StringTokenizer st(string(current.begin() + static_cast<ptrdiff_t>(index + 4), current.end()), " \t=;");
-      st.nextToken(); // skip next word: may be 'sequences' or else ;-)
-      size_t numberOfSequences = TextTools::to<size_t>(st.nextToken());
-      string name = st.unparseRemainingTokens();
-      size_t counter = 0;
-      if (name == setName)
-      {
-        // cout << numberOfSequences << " segments found." << endl;
-        // Then look for the set definition:
-        i++; // next line.
-        while (i < maseFileHeader.size())
-        {
-          current = maseFileHeader[i++];
-          StringTokenizer st2(current, ",");
-          while (st2.hasMoreToken())
-          {
-            int seqIndex = TextTools::toInt(st2.nextToken());
-            // WARNING!!! In the mase+ format, sequences are numbered from 1 to nbSequences,
-            // Whereas in SequenceContainer the index begins at 0.
-            selection.push_back(static_cast<size_t>(seqIndex - 1)); // bounds included.
-            counter++;
-            if (counter == numberOfSequences)
-              return selection;
-          }
-        }
-      }
-    }
-  }
-  if (selection.size() == 0)
-  {
-    throw IOException("Sequence set " + setName + " has not been found in the sequence file.");
-  }
-  return selection;
-}
-
-/******************************************************************************/
-
-SiteContainer* MaseTools::getSelectedSites(
-  const SiteContainer& sequences,
-  const string& setName) throw (IOException)
-{
-  SiteSelection ss = getSiteSet(sequences.getGeneralComments(), setName);
-  // We need to convert positions in case of word alphabet:
-  // size_t wsize = sequences.getAlphabet()->getStateCodingSize();
-  // if (wsize > 1)
-  // {
-  //   if (ss.size() % wsize != 0)
-  //     throw IOException("MaseTools::getSelectedSites: Site selection is not compatible with the alphabet in use in the container.");
-  //   SiteSelection ss2;
-  //   for (size_t i = 0; i < ss.size(); i += wsize)
-  //   {
-  //     if (ss[i] % wsize != 0)
-  //       throw IOException("MaseTools::getSelectedSites: Site selection is not compatible with the alphabet in use in the container.");
-  //     for (size_t j = 1; j < wsize; ++j)
-  //     {
-  //       if (ss[i + j] != (ss[i + j - 1] + 1))
-  //         throw IOException("MaseTools::getSelectedSites: Site selection is not compatible with the alphabet in use in the container.");
-  //     }
-  //     ss2.push_back(ss[i] / wsize);
-  //   }
-  return SiteContainerTools::getSelectedPositions(sequences, ss);
-  // }
-  // else
-  // {
-  //   return SiteContainerTools::getSelectedSites(sequences, ss);
-  // }
-}
-
-/******************************************************************************/
-
-SequenceContainer* MaseTools::getSelectedSequences(
-  const OrderedSequenceContainer& sequences,
-  const std::string& setName) throw (IOException)
-{
-  SequenceSelection ss = getSequenceSet(sequences.getGeneralComments(), setName);
-  VectorSequenceContainer* cont = new VectorSequenceContainer(sequences.getAlphabet());
-  SequenceContainerTools::getSelectedSequences(sequences, ss, *cont);
-  return cont;
-}
-
-/******************************************************************************/
-
-map<string, size_t> MaseTools::getAvailableSiteSelections(const Comments& maseHeader)
-{
-  map<string, size_t> selections;
-  for (size_t i = 0; i < maseHeader.size(); i++)
-  {
-    string current = maseHeader[i];
-
-    string::size_type index = current.find("# of");
-    if (index < current.npos)
-    {
-      StringTokenizer st(string(current.begin() + static_cast<ptrdiff_t>(index + 4), current.end()), " \t\n\f\r=;");
-      st.nextToken(); // skip next word: may be 'sequences' or else ;-)
-      size_t numberOfSegments = TextTools::to<size_t>(st.nextToken());
-      string name = st.nextToken();
-      while (st.hasMoreToken())
-      {
-        name += " " + st.nextToken();
-      }
-      size_t counter = 0;
-      size_t nbSites = 0;
-      while (i < maseHeader.size())
-      {
-        i++;
-        current = maseHeader[i];
-        StringTokenizer st2(current);
-        // st.nextToken(); //Skip ';;'
-        while (st2.hasMoreToken())
-        {
-          StringTokenizer st3(st2.nextToken(), ",");
-          size_t begin = TextTools::to<size_t>(st3.nextToken());
-          size_t end   = TextTools::to<size_t>(st3.nextToken());
-          counter++;
-          nbSites += end - begin + 1;
-        }
-        if (counter == numberOfSegments)
-        {
-          selections[name] = nbSites;
-          break;
-        }
-      }
-    }
-  }
-  return selections;
-}
-
-/******************************************************************************/
-
-map<string, size_t> MaseTools::getAvailableSequenceSelections(const Comments& maseHeader)
-{
-  map<string, size_t> selections;
-  for (size_t i = 0; i < maseHeader.size(); i++)
-  {
-    string current = maseHeader[i];
-
-    string::size_type index = current.find("@ of");
-    if (index < current.npos)
-    {
-      StringTokenizer st(string(current.begin() + static_cast<ptrdiff_t>(index + 4), current.end()), " \t\n\f\r=;");
-      st.nextToken(); // skip next word: may be 'sequences' or else ;-)
-      size_t numberOfSequences = TextTools::fromString<size_t>(st.nextToken());
-      string name = st.nextToken();
-      while (st.hasMoreToken())
-      {
-        name += st.nextToken();
-      }
-      selections[name] = numberOfSequences;
-    }
-  }
-  return selections;
-}
-
-/******************************************************************************/
-
-size_t MaseTools::getPhase(const Comments& maseFileHeader, const string& setName) throw (Exception)
-{
-  size_t phase = 0;
-  string::size_type index = 0;
-  for (size_t i = 0; i < maseFileHeader.size(); i++)
-  {
-    string current = maseFileHeader[i];
-
-    index = current.find("# of");
-    if (index < current.npos)
-    {
-      StringTokenizer st(string(current.begin() + static_cast<ptrdiff_t>(index + 12), current.end()), " \t\n\f\r=;");
-      // size_t numberOfSegments = TextTools::toInt(st.nextToken());
-      // cout << "Number of regions: " << st.nextToken() << endl;
-      string name;
-      while (st.hasMoreToken())
-      {
-        name = st.nextToken();
-        // cout << "Name of regions: " << name << endl;
-      }
-      if (name == setName)
-      {
-        return phase;
-      }
-    }
-
-    index = current.find("/codon_start");
-    if (index < current.npos)
-    {
-      StringTokenizer st(string(current.begin() + static_cast<ptrdiff_t>(index + 12), current.end()), " \t\n\f\r=;");
-      phase = TextTools::to<size_t>(st.nextToken());
-    }
-  }
-  throw Exception("PolymorphismSequenceContainer::getPhase: no /codon_start found, or site selection missing.");
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Io/MaseTools.h b/src/Bpp/Seq/Io/MaseTools.h
deleted file mode 100644
index 45c25b0..0000000
--- a/src/Bpp/Seq/Io/MaseTools.h
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// File: MaseTools.h
-// Created by: Julien Dutheil
-// Created on: Tue Apr  1 09:16:59 2003
-//
-
-/*
-  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-  This software is a computer program whose purpose is to provide classes
-  for sequences analysis.
-
-  This software is governed by the CeCILL  license under French law and
-  abiding by the rules of distribution of free software.  You can  use,
-  modify and/ or redistribute the software under the terms of the CeCILL
-  license as circulated by CEA, CNRS and INRIA at the following URL
-  "http://www.cecill.info".
-
-  As a counterpart to the access to the source code and  rights to copy,
-  modify and redistribute granted by the license, users are provided only
-  with a limited warranty  and the software's author,  the holder of the
-  economic rights,  and the successive licensors  have only  limited
-  liability.
-
-  In this respect, the user's attention is drawn to the risks associated
-  with loading,  using,  modifying and/or developing or reproducing the
-  software by the user in light of its specific status of free software,
-  that may mean  that it is complicated to manipulate,  and  that  also
-  therefore means  that it is reserved for developers  and  experienced
-  professionals having in-depth computer knowledge. Users are therefore
-  encouraged to load and test the software's suitability as regards their
-  requirements in conditions enabling the security of their systems and/or
-  data to be ensured and,  more generally, to use and operate it in the
-  same conditions as regards security.
-
-  The fact that you are presently reading this means that you have had
-  knowledge of the CeCILL license and that you accept its terms.
-*/
- 
-#ifndef _MASETOOLS_H_
-#define _MASETOOLS_H_
-
-#include "../Container/SequenceContainer.h"
-#include "../Container/OrderedSequenceContainer.h"
-#include "../Container/SequenceContainerTools.h"
-#include "../Container/SiteContainer.h"
-#include "../Container/SiteContainerTools.h"
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-/**
- * @brief Utilitary methods that deal with the Mase format.
- *
- * This class particularily covers the Mase+ format, which allows
- * site and sequence selection.
- * Mase+ tags are in the header of the mase file, which is stored
- * in the 'general comment' section of sequence containers.
- * Most of the methods here hence work on the general comments associated
- * to a container.
- */
-  class MaseTools
-  {
-  public:
-    
-    /**
-     * @brief Get a site selection from a Mase+ header file.
-     *
-     * @param maseFileHeader The header of the mase+ file as comments lines.
-     * @param setName        The name of the set to retrieve.
-     * @throw IOException If the specified set is not found.
-     */
-    static SiteSelection getSiteSet(const Comments& maseFileHeader, const std::string& setName) throw (IOException);
-
-    /**
-     * @brief Get a sequence selection from a Mase+ header file.
-     *
-     * @param maseFileHeader The header of the mase+ file as comments lines.
-     * @param setName        The name of the set to retrieve.
-     * @throw IOException If the specified set is not found.
-     */
-    static SequenceSelection getSequenceSet(const Comments& maseFileHeader, const std::string& setName) throw (IOException);
-
-    /**
-     * @brief Create a new container corresponding to a site set given in the mase+ format.
-     *
-     * A new VectorSiteContainer is created, whose destruction is up to the user.
-     * The container passed as argument must have 'general comments' in the mase+ format.
-     * This function calls the getSiteSet() function on the comments and then calls for
-     * SiteContainerTools::getSelectedSites() on the selection.
-     *
-     * @param sequences The container to get the sites from.
-     * @param setName   The name of the set to retrieve.
-     * @throw IOException If the specified set is not found.
-     */
-    static SiteContainer* getSelectedSites(const SiteContainer& sequences, const std::string& setName) throw (IOException);
-
-    /**
-     * @brief Create a new container corresponding to a site set given in the mase+ format.
-     *
-     * A new VectorSequenceContainer is created, whose destruction is up to the user.
-     * The container passed as argument must have 'general comments' in the mase+ format.
-     * This function calls the getSequenceSet() function on the comments and then calls for
-     * SiteContainerTools::getSelectedSequences() on the selection.
-     *
-     * @param sequences The container to get the sequence from.
-     * @param setName   The name of the set to retrieve.
-     * @throw IOException If the specified set is not found.
-     */
-    static SequenceContainer* getSelectedSequences(const OrderedSequenceContainer& sequences, const std::string & setName) throw (IOException);
-
-    /**
-     * @brief Get a list of all available site selections.
-     *
-     * @param maseHeader Comments as described in the Mase+ format specification.
-     * @return A vector of selection names.
-     */
-    static std::map<std::string, size_t> getAvailableSiteSelections(const Comments & maseHeader);
-
-    /**
-     * @brief Get a list of all available sequences selections.
-     *
-     * @param maseHeader Comments as described in the Mase+ format specification.
-     * @return A vector of selection names.
-     */
-    static std::map<std::string, size_t> getAvailableSequenceSelections(const Comments & maseHeader);
-
-    /**
-     * @brief Get the phase of a given coding region from a mase+ header.
-     *
-     * Look for a /codon_start tag with a phase indice and a site selection with name setName.
-     *
-     * @param maseFileHeader Comments in Mase+ format.
-     * @param setName a cds site selection name.
-     * @return 1,2 or 3.
-     * @throw Exception If no corresponding tag found in file.
-     */
-    static size_t getPhase(const Comments & maseFileHeader, const std::string &setName) throw (Exception);
-
-  };
-
-} //end of namespace bpp.
-
-#endif	//_MASETOOLS_H_
-
diff --git a/src/Bpp/Seq/Io/NexusIoSequence.cpp b/src/Bpp/Seq/Io/NexusIoSequence.cpp
deleted file mode 100644
index 1fce73a..0000000
--- a/src/Bpp/Seq/Io/NexusIoSequence.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-//
-// File: NexusIOSequence.cpp
-// Created by: Julien Dutheil
-// Created on: Wed May 27 16:15 2009
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "NexusIoSequence.h"
-#include "NexusTools.h"
-#include "../Container/SiteContainerTools.h"
-#include "../Alphabet/AlphabetTools.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/KeyvalTools.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <sstream>
-
-using namespace std;
-
-/******************************************************************************/
-
-const std::vector<std::string> NexusIOSequence::splitNameAndSequence_(const std::string& s) const throw (Exception)
-{
-  vector<string> v(2);
-  string::size_type index = s.find(" ");
-  if(index == string::npos) throw Exception("NexusIOSequence::splitNameAndSequence_(). No sequence name found.");
-  v[0] = TextTools::removeSurroundingWhiteSpaces(s.substr(0, index));
-  v[1] = TextTools::removeFirstWhiteSpaces(s.substr(index + 1));
-  return v;
-}  
-
-  
-/******************************************************************************/
-
-void NexusIOSequence::appendAlignmentFromStream(std::istream& input, SiteContainer& vsc) const throw (Exception)
-{
-  // Checking the existence of specified file
-  if (!input) { throw IOException ("NexusIOSequence::read(). Fail to open file"); }
-
-  //Look for the DATA block:
-  string line = "";
-  while (TextTools::toUpper(line) != "BEGIN DATA;")
-  {
-    if (input.eof())
-      throw Exception("NexusIOSequence::appendFromStream(). No data block was found.");
-    line = TextTools::removeSurroundingWhiteSpaces(FileTools::getNextLine(input));
-  }
-
-  //Look for the DIMENSIONS command:
-  string cmdName = "", cmdArgs = "";
-  while (cmdName != "DIMENSIONS")
-  {
-    if (input.eof())
-      throw Exception("NexusIOSequence::appendFromStream(). No DIMENSIONS command was found.");
-    NexusTools::getNextCommand(input, cmdName, cmdArgs);
-    cmdName = TextTools::toUpper(cmdName);
-  }
-  map<string, string> args;
-  KeyvalTools::multipleKeyvals(cmdArgs, args, " ");
-  map<string, string> argsUp;
-  for (map<string, string>::iterator it = args.begin(); it != args.end(); it++)
-    argsUp[TextTools::toUpper(it->first)] = it->second;
-  if (argsUp["NTAX"] == "")
-    throw Exception("NexusIOSequence::appendFromStream(). DIMENSIONS command does not have a NTAX argument.");
-  unsigned int ntax = TextTools::to<unsigned int>(argsUp["NTAX"]);
-
-  //Look for the FORMAT command:
-  while (cmdName != "FORMAT")
-  {
-    if (input.eof())
-      throw Exception("NexusIOSequence::appendFromStream(). No FORMAT command was found.");
-    NexusTools::getNextCommand(input, cmdName, cmdArgs);
-    cmdName = TextTools::toUpper(cmdName);
-  }
-  if (TextTools::hasSubstring(cmdArgs, "TRANSPOSE"))
-    throw Exception("NexusIOSequence::appendFromStream(). TRANSPOSE option is not supported.");
-
-  //Check if the alignment is dotted or not:
-  bool matchChar = TextTools::hasSubstring(TextTools::toUpper(cmdArgs), "MATCHCHAR");
-
-  SiteContainer* alignment = 0;
-  if (matchChar)
-    alignment = new AlignedSequenceContainer(&AlphabetTools::DEFAULT_ALPHABET);
-  else
-    alignment = &vsc;
-
-  //Look for the MATRIX command:
-  line = "";
-  while (!TextTools::startsWith(TextTools::toUpper(line), "MATRIX"))
-  {
-    if (input.eof())
-      throw Exception("NexusIOSequence::appendFromStream(). No MATRIX command was found.");
-    line = TextTools::removeSurroundingWhiteSpaces(FileTools::getNextLine(input));
-  }
-  line = FileTools::getNextLine(input);
-
-  vector<string> names, seqs;
-  // Read first block:
-  bool commandFinished = false;
-  for (unsigned int i = 0; i < ntax && !input.eof(); i++)
-  {
-    if (TextTools::endsWith(line, ";"))
-    {
-      if (i < ntax - 1)
-        throw IOException("NexusIOSequence::appendFromStream. Early end of MATRIX command, some sequences are missing.");
-      else 
-      {
-        commandFinished = true;
-        line = line.substr(0, line.size() - 1); //Remove trailing semi-colon.
-      }
-    }
-    vector<string> v = splitNameAndSequence_(line);
-    names.push_back(v[0]);
-    seqs.push_back(v[1]);
-    line = FileTools::getNextLine(input);
-  }
-  
-  //Then read all other blocks:
-  commandFinished = TextTools::removeSurroundingWhiteSpaces(line) == ";"; //In case the end of command is on a separate line.
-  while (!commandFinished)
-  {
-    for (unsigned int i = 0; i < ntax && !input.eof(); i++)
-    {
-      if (TextTools::endsWith(line, ";"))
-      {
-        if (i < ntax - 1)
-          throw IOException("NexusIOSequence::appendFromStream. Early end of MATRIX command, some sequences are missing.");
-        else 
-        {
-          commandFinished = true;
-          line = line.substr(0, line.size() - 1); //Remove trailing semi-colon.
-        }
-      }
-
-      vector<string> v = splitNameAndSequence_(line);
-      if (v[0] != names[i])
-        throw IOException("NexusIOSequence::appendFromStream. Bad file, the sequences are not in the same order in interleaved blocks, or one taxon is missing.");
-      seqs[i] += v[1];      
-      line = FileTools::getNextLine(input);
-      commandFinished = TextTools::removeSurroundingWhiteSpaces(line) == ";"; //In case the end of command is on a separate line.
-    }
-  }
-  for (unsigned int i = 0; i < names.size(); i++)
-  {
-    alignment->addSequence(BasicSequence(names[i], seqs[i], vsc.getAlphabet()), checkNames_);
-  }
-
-  if (matchChar)
-  {
-    //Now we resolve the alignment:
-    SiteContainer* resolvedAlignment =
-      SiteContainerTools::resolveDottedAlignment(*alignment, vsc.getAlphabet());
-    delete alignment;
-    for (unsigned int i = 0; i < resolvedAlignment->getNumberOfSequences(); i++)
-    {
-      vsc.addSequence(resolvedAlignment->getSequence(i), false);
-    }
-    delete resolvedAlignment;
-  }
-}
-
-/******************************************************************************/
-
-const std::string NexusIOSequence::getFormatName() const { return "Nexus"; }
-
-/******************************************************************************/
-
-const std::string NexusIOSequence::getFormatDescription() const
-{
-  return "Nexus file format.";
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Io/NexusIoSequence.h b/src/Bpp/Seq/Io/NexusIoSequence.h
deleted file mode 100644
index 0a32843..0000000
--- a/src/Bpp/Seq/Io/NexusIoSequence.h
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-// File: NexusIOSequence.h
-// Created by: Julien Dutheil
-// Created on: Wed May 27 16:15 2009
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _NEXUSIOSEQUENCE_H_
-#define _NEXUSIOSEQUENCE_H_
-
-#include "AbstractIAlignment.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
-#include "../Container/AlignedSequenceContainer.h"
-
-// From the STL:
-#include <iostream>
-
-namespace bpp
-{
-
-/**
- * @brief The Nexus format reader for sequences.
- *
- * An AlignedSequenceContainer is used instead of a VectorSequenceContainer.
- *
- * This reader is not supposed to be a full parser of the Nexus files,
- * but only extract the sequence data. Only a basic subset of the options
- * are and will be supported.
- *
- * This format is described in the following paper:
- * Maddison D, Swofford D, and Maddison W (1997), _Syst Biol_ 46(4):590-621
- *
- * @author Julien Dutheil
- */
-class NexusIOSequence:
-  public AbstractIAlignment,
-  public virtual ISequence
-{
-  protected:
-
-    /**
-     * @brief The maximum number of chars to be written on a line.
-     */
-    unsigned int charsByLine_;
-
-    bool checkNames_;
-
-  public:
-    /**
-     * @brief Build a new Phylip file reader.
-     *
-     * @param charsByLine The number of base to display in a row (ignored for now, no writing support).
-     * @param checkSequenceNames Tell if the names in the file should be checked for unicity (slower, in o(n*n) where n is the number of sequences).
-     */
-    NexusIOSequence(unsigned int charsByLine = 100, bool checkSequenceNames = true):
-      charsByLine_(charsByLine), checkNames_(checkSequenceNames) {}
-
-    virtual ~NexusIOSequence() {}
-
-  public:
-
-    /**
-     * @name The AbstractIAlignment interface.
-     *
-     * @{
-     */
-    void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception);
-    /** @} */
-
-    /**
-     * @name The ISequence interface.
-     *
-     * As a SiteContainer is a subclass of SequenceContainer, we hereby implement the ISequence
-     * interface by downcasting the interface.
-     *
-     * @{
-     */
-    virtual SequenceContainer* readSequences(std::istream& input, const Alphabet* alpha) const throw (Exception) {
-      return readAlignment(input, alpha);
-    }
-    virtual SequenceContainer* readSequences(const std::string& path, const Alphabet* alpha) const throw (Exception) {
-      return readAlignment(path, alpha);
-    }
-    /** @} */
-
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const;
-    const std::string getFormatDescription() const;
-    /** @} */
-
-    /**
-     * @return true if the names are to be checked when reading sequences from files.
-     */
-    bool checkNames() const { return checkNames_; }
-
-    /**
-     * @brief Tell whether the sequence names should be checked when reading from files.
-     *
-     * @param yn whether the sequence names should be checked when reading from files.
-     */
-    void checkNames(bool yn) { checkNames_ = yn; }
-
-    
-  private:
-    //Reading tools:
-    const std::vector<std::string> splitNameAndSequence_(const std::string & s) const throw (Exception); 
-};
-
-} //end of namespace bpp.
-
-#endif  //_NEXUSIOSEQUENCE_H_
-
diff --git a/src/Bpp/Seq/Io/NexusTools.cpp b/src/Bpp/Seq/Io/NexusTools.cpp
deleted file mode 100644
index 1914e2f..0000000
--- a/src/Bpp/Seq/Io/NexusTools.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// File: NexusTools.cpp
-// Created by: Julien Dutheil
-// Created on: Wed May 27 19:30 2009
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "NexusTools.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-using namespace std;
-
-std::string NexusTools::getNextNonCommentLine(std::istream& input)
-{
-  string line = TextTools::removeSurroundingWhiteSpaces(FileTools::getNextLine(input));
-  bool test = true;
-  unsigned int countOpen = 0;
-  unsigned int countClosed = 0;
-  while(test)
-  {
-    if (line[0] == '[')
-    {
-      countOpen++;
-    }
-    if (line[line.size() - 1] == ']')
-    {
-      countClosed++;
-    }
-    if(countOpen > 0)
-      line = TextTools::removeSurroundingWhiteSpaces(FileTools::getNextLine(input));
-    if(countOpen == countClosed)
-      test = false;
-  }
-  return line;
-}
-
-
-bool NexusTools::getNextCommand(std::istream& input, std::string& name, std::string& arguments, bool lineBrk)
-  throw (IOException)
-{
-	// Checking if the stream is readable
-	if (! input) { throw IOException ("NexusTools::getNextCommand(). Failed to read from stream"); }
-	
-  string line = TextTools::removeSurroundingWhiteSpaces(getNextNonCommentLine(input));
-  if (TextTools::startsWith(line, "BEGIN"))
-  {
-	  return false;
-  }
-
-  // Check if the command stands on one line:
-  bool commandComplete = TextTools::endsWith(line, ";");
-  if (commandComplete)
-    line = line.substr(0, line.size() - 1);
-  // Get the command name, as the first block:
-  string::size_type limit = line.find(" ");
-  if (limit == string::npos)
-  {
-    name = line;
-    arguments = "";
-    if (commandComplete)
-    {
-      //Command with no argument:
-      return true;
-    }
-  }
-  else
-  {
-    name = line.substr(0, limit);
-    arguments = line.substr(limit + 1);
-  }
-  //Then parse the next lines:
-  while(!commandComplete)
-  {
-	  if (input.eof()) { throw IOException ("NexusTools::getNextCommand(). Reached end of file before the end of the command could be found"); }
-    line = TextTools::removeSurroundingWhiteSpaces(getNextNonCommentLine(input));
-    commandComplete = TextTools::endsWith(line, ";");
-    if (commandComplete)
-      line = line.substr(0, line.size() - 1);
-    if(lineBrk)
-      arguments += "\n";
-    arguments += line;
-  }
-  return true;
-}
-
diff --git a/src/Bpp/Seq/Io/OSequence.h b/src/Bpp/Seq/Io/OSequence.h
deleted file mode 100644
index bc1a01e..0000000
--- a/src/Bpp/Seq/Io/OSequence.h
+++ /dev/null
@@ -1,128 +0,0 @@
-//
-// File: OSequence.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Tue Aug 21 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _OSEQUENCE_H_
-#define _OSEQUENCE_H_
-
-#include "../Container/SequenceContainer.h"
-#include "../Container/SiteContainer.h"
-#include "IoSequence.h"
-
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-  /**
-   * @brief The OSequence interface.
-   * 
-   * This interface defines the basic methods for writing sequences to a file.
-   */
-  class OSequence:
-    public virtual IOSequence
-  {
-    public:
-      OSequence() {}
-      virtual ~OSequence() {}
-
-    public:
-
-      /**
-       * @brief Write a container to a stream.
-       *
-       * @param output The output stream where to write.
-       * @param sc        The container to write.
-       * @throw Exception If the file is not in the specified format.
-       */
-      virtual void writeSequences(std::ostream& output, const SequenceContainer& sc) const throw (Exception) = 0;
-
-      /**
-       * @brief Write a container to a file.
-       *
-       * @param path      The path to the file to write.
-       * @param sc        The container to write.
-       * @param overwrite If true the sequences are written at the beginning of the file instead of being appended.
-       *                  Any previous content will be lost.
-       * @throw Exception If the file is not in the specified format.
-       */
-      virtual void writeSequences(const std::string& path, const SequenceContainer & sc, bool overwrite) const throw (Exception) = 0;
-
-  };
-
-
-  /**
-   * @brief The OAlignment interface.
-   * 
-   * This interface defines the basic methods for writing alignments to a file.
-   */
-  class OAlignment:
-    public virtual IOSequence
-  {
-    public:
-      OAlignment() {}
-      virtual ~OAlignment() {}
-
-    public:
-
-      /**
-       * @brief Write a container to a stream.
-       *
-       * @param output The output stream where to write.
-       * @param sc        The container to write.
-       * @throw Exception If the file is not in the specified format.
-       */
-      virtual void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception) = 0;
-
-      /**
-       * @brief Write a container to a file.
-       *
-       * @param path      The path to the file to write.
-       * @param sc        The container to write.
-       * @param overwrite If true the sequences are written at the beginning of the file instead of being appended.
-       *                  Any previous content will be lost.
-       * @throw Exception If the file is not in the specified format.
-       */
-      virtual void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite) const throw (Exception) = 0;
-
-  };
-} //end of namespace bpp.
-
-#endif	// _OSEQUENCE_H_
-
diff --git a/src/Bpp/Seq/Io/OSequenceStream.h b/src/Bpp/Seq/Io/OSequenceStream.h
deleted file mode 100644
index f862a7e..0000000
--- a/src/Bpp/Seq/Io/OSequenceStream.h
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// File OSequenceStream.h
-// Author: Sylvain Gaillard
-// Created: 19/08/2009
-//
-
-/*
-Copyright or © or Copr. CNRS, (August 19, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _OSEQUENCESTREAM_H_
-#define _OSEQUENCESTREAM_H_
-
-#include "IoSequenceStream.h"
-#include "../Sequence.h"
-#include "../Alphabet/Alphabet.h"
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-/**
- * @brief The OSequenceStream interface.
- *
- * Interface for streaming sequences output.
- *
- * @author Sylvain Gaillard
- */
-class OSequenceStream: public virtual IOSequenceStream
-{
-	public:
-		OSequenceStream() {}
-		virtual ~OSequenceStream() {}
-
-	public:
-    /**
-     * @brief Read sequence from stream.
-     *
-     * Read one sequence from a stream.
-     *
-     * @param output The stream where write.
-     * @param seq The sequence to write.
-     * @throw Exception IOExecption.
-     */
-    virtual void writeSequence(std::ostream& output, const Sequence& seq) const throw (Exception) = 0;
-
-};
-
-} //end of namespace bpp.
-
-#endif	// _ISEQUENCESTREAM_H_
-
diff --git a/src/Bpp/Seq/Io/PhredPhd.cpp b/src/Bpp/Seq/Io/PhredPhd.cpp
deleted file mode 100644
index 84c878c..0000000
--- a/src/Bpp/Seq/Io/PhredPhd.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-//
-// File: PhredPhd.cpp
-// Created by: Sylvain Gaillard
-// Created on: Wed Nov 5 2008
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 5, 2008)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "PhredPhd.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-
-using namespace bpp;
-
-/******************************************************************************/
-
-//PhredPhd::PhredPhd() {}
-
-/******************************************************************************/
-
-bool PhredPhd::nextSequence(std::istream& input, Sequence& seq) const throw (Exception) {
-  std::vector<int> pos;
-  return nextSequence(input, seq, pos);
-}
-
-/******************************************************************************/
-
-bool PhredPhd::nextSequence(std::istream& input, Sequence& seq, std::vector<int>& pos) const throw (Exception) {
-  if (!input) {
-    throw IOException ("PhredPhd::read: fail to open stream");
-  }
-
-  bool flag = false;
-  std::string name, sequence = "";  // Initialization
-  std::vector<int> q, p;
-
-  flag = parseFile_(input, name, sequence, q, p);
-  // Sequence creation
-  if(name == "")
-    throw Exception("PhredPhd::read: sequence without name!");
-  seq.setName(name);
-  seq.setContent(sequence);
-  try {
-    SequenceWithQuality& sq = dynamic_cast<SequenceWithQuality&>(seq);
-    sq.setQualities(q);
-  } catch (...) {
-  }
-  return flag;
-}
-
-/******************************************************************************/
-
-bool PhredPhd::parseFile_(std::istream& input, std::string& name, std::string& sequence, std::vector<int>& qual, std::vector<int>& pos) const {
-  bool readSeqFlag = false;
-  std::string temp;
-  // Read sequence info
-  // Main loop : for all lines
-  while (!input.eof()) {
-    std::getline(input, temp, '\n');  // Copy current line in temporary string
-    StringTokenizer st(temp, " ");
-    if (st.hasMoreToken()) {
-      if (st.getToken(0) == "BEGIN_SEQUENCE") {
-        name = st.getToken(1);
-      }
-      std::string flag = st.getToken(0);
-      while (flag != "END_SEQUENCE" && !input.eof()) {
-        getline(input, temp, '\n');
-        StringTokenizer st2(temp, " ");
-        if (st2.hasMoreToken()) {
-          flag = st2.getToken(0);
-        }
-        if (flag == "BEGIN_DNA") {
-          readSeqFlag = parseDNA_(input, sequence, qual, pos);
-          break; // End the whole loop after parsing DNA
-        }
-      }
-    }
-  }
-  return readSeqFlag;
-}
-
-/******************************************************************************/
-
-bool PhredPhd::parseDNA_(std::istream& input, std::string& sequence, std::vector<int>& qual, std::vector<int>& pos) const {
-  bool readSeqFlag = false;
-  std::string line_buffer;
-  std::string flag;
-  sequence.clear();
-  qual.clear();
-  pos.clear();
-  while (flag != "END_DNA" && !input.eof()) {
-    std::getline(input, line_buffer, '\n');
-    StringTokenizer st(line_buffer, " ");
-    if (st.hasMoreToken()) {
-      flag = TextTools::toUpper(st.getToken(0));
-      if (st.numberOfRemainingTokens() == 3) {
-        sequence += flag;
-        qual.push_back(TextTools::toInt(st.getToken(1)));
-        pos.push_back(TextTools::toInt(st.getToken(2)));
-        readSeqFlag = true;
-      }
-    }
-  }
-  return readSeqFlag;
-}
-
-/******************************************************************************/
diff --git a/src/Bpp/Seq/Io/PhredPhd.h b/src/Bpp/Seq/Io/PhredPhd.h
deleted file mode 100644
index 6ed2d16..0000000
--- a/src/Bpp/Seq/Io/PhredPhd.h
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-// File: PhredPhd.h
-// Created by: Sylvain Gaillard
-// Created on: Wed Nov 5 2008
-//
-
-/*
-Copyright or © or Copr. CNRS, (November 5, 2008)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _PHREDPHD_H_
-#define _PHREDPHD_H_
-
-#include "ISequenceStream.h"
-#include "../Sequence.h"
-#include "../SequenceWithQuality.h"
-
-namespace bpp {
-
-  /**
-   * @brief The phd sequence file format from phred software.
-   *
-   * This class read DNA SequenceWithQuality from phd files produced by the
-   * phred program from the University of Washington.
-   *
-   * @par Usage
-   *
-   * @code
-   * // Creating a SequenceWithQuality object
-   * DNA alpha;
-   * SequenceWithQuality seq(&alpha);
-   * std::vector<int> pos;
-   *
-   * // Create a PhredPhd parser
-   * PhredPhd pp;
-   *
-   * // Opening the file
-   * std::ifstream in("my_sequence.phd");
-   *
-   * // Read the sequence
-   * pp.nextSequence(in, seq, pos);
-   *
-   * // Close the file
-   * in.close();
-   * @endcode
-   *
-   * @author Sylvain Gaillard
-   */
-  class PhredPhd: public ISequenceStream {
-    public:
-
-      /**
-       * @brief Build a new PhredPhd object.
-       */
-      PhredPhd() {}
-
-      virtual ~PhredPhd() {}
-
-    public:
-      /**
-       * @name The ISequenceStream interface.
-       *
-       * @{
-       */
-      bool nextSequence(
-          std::istream& input,
-          Sequence& seq
-          ) const throw (Exception);
-      /** @} */
-
-      /**
-       * @brief Read a SequenceWithQuality from stream and store chromatographic positions
-       *
-       * A more complete parser that read a SequenceWithQuality and store
-       * the position of each base call on the chromatogram in a vector of
-       * int.
-       *
-       * @param input The stram to read.
-       * @param seq The sequence to fill.
-       * @param pos The vector of positions to fill.
-       * @throw Exception IOException and Sequence related exceptions.
-       */
-      bool nextSequence(
-          std::istream& input,
-          Sequence& seq,
-          std::vector<int>& pos
-          ) const throw (Exception);
-
-      /**
-       * @name The IOFormat interface.
-       *
-       * @{
-       */
-      const std::string getDataType() const { return "SequenceWithQuality"; };
-      const std::string getFormatName() const { return "phd file"; };
-      const std::string getFormatDescription() const {
-        return "Sequences following the phd format as describe in the phred documentation.";
-      }
-      /** @} */
-
-    private:
-      /**
-       * @brief Global file parser
-       *
-       * @param input The stream to read
-       * @param name The string to store the sequence name
-       * @param sequence The string to store the sequence
-       * @param qual The vector to store qualities
-       * @param pos The vector to store positions
-       */
-      bool parseFile_(std::istream& input, std::string& name, std::string& sequence, std::vector<int>& qual, std::vector<int>& pos) const;
-
-      /**
-       * @brief Parse the DNA part of the file
-       *
-       * Read the DNA part until `END_DNA' or EOF.
-       *
-       * @param input The stream to read
-       * @param sequence The string to store the sequence
-       * @param qual The vector to store qualities
-       * @param pos The vector to store positions
-       */
-      bool parseDNA_(std::istream& input, std::string& sequence, std::vector<int>& qual, std::vector<int>& pos) const;
-  };
-} //end of namespace bpp
-
-#endif // _PHREDPHD_H_
diff --git a/src/Bpp/Seq/Io/PhredPoly.cpp b/src/Bpp/Seq/Io/PhredPoly.cpp
deleted file mode 100644
index 967024b..0000000
--- a/src/Bpp/Seq/Io/PhredPoly.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// File: PhredPoly.cpp
-// Created by: Sylvain Gaillard
-// Created on: Fri Oct 31 2008
-//
-
-/*
-Copyright or © or Copr. CNRS, (October 31, 2008)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "PhredPoly.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Numeric/NumTools.h>
-
-using namespace bpp;
-using namespace std;
-
-/******************************************************************************/
-
-PhredPoly::PhredPoly(double ratio) : ratio_(ratio) {}
-
-/******************************************************************************/
-
-bool PhredPoly::nextSequence(istream& input, Sequence& seq) const throw (Exception) {
-  if (!input) { throw IOException ("PhredPoly::read: fail to open stream"); }
-
-  string temp, name, sequence = "";  // Initialization
-  bool flag = false;
-
-  // Read first line
-  if (!input.eof()) {
-    getline(input, temp, '\n');  // Copy current line in temporary string
-    StringTokenizer st(temp, " ");
-    name = st.getToken(0);
-  }
-
-  const Alphabet* alpha = seq.getAlphabet();
-
-  // Main loop : for all other lines
-  while (!input.eof()) {
-    getline(input, temp, '\n');  // Copy current line in temporary string
-    StringTokenizer st(temp, " ");
-    if (st.numberOfRemainingTokens() == 12) {
-      double a = TextTools::toDouble(st.getToken(3));
-      double b = TextTools::toDouble(st.getToken(7));
-      if (a < b) {
-        NumTools::swap(a, b);
-      }
-      vector<string> v;
-      v.push_back(st.getToken(0)); // Get the called base
-      if (b / a > this->ratio_) {
-        v.push_back(st.getToken(4)); // Get the uncalled base if relative picks areas are similar
-      }
-      sequence += alpha->getGeneric(v);
-    }
-  }
-  if(name == "") {
-    throw Exception("PhredPoly::read: sequence without name!");
-  } else {
-    seq.setName(name);
-    seq.setContent(sequence);
-    flag = true;
-  }
-  return flag;
-}
-
-/******************************************************************************/
diff --git a/src/Bpp/Seq/Io/PhredPoly.h b/src/Bpp/Seq/Io/PhredPoly.h
deleted file mode 100644
index 8aeb4ff..0000000
--- a/src/Bpp/Seq/Io/PhredPoly.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// File: PhredPoly.h
-// Created by: Sylvain Gaillard
-// Created on: Fri Oct 31 2008
-//
-
-/*
-Copyright or © or Copr. CNRS, (October 31, 2008)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _PHREDPOLY_H_
-#define _PHREDPOLY_H_
-
-#include "ISequenceStream.h"
-#include "../Sequence.h"
-
-namespace bpp {
-
-  /**
-   * @brief The poly sequence file format from phred software.
-   *
-   * This class read DNA sequence from poly files produced by the phred program
-   * from the University of Washington.
-   * For now, only read raw sequences and do a basic filter on heterozygous site.
-   */
-  class PhredPoly: public ISequenceStream {
-    protected:
-      double ratio_;
-
-    public:
-
-      /**
-       * @brief Build a new PhredPoly object.
-       */
-      PhredPoly(double ratio = 0.8);
-
-      virtual ~PhredPoly() {}
-
-    public:
-      /**
-       * @name The AbstractISequence interface.
-       *
-       * @{
-       */
-      bool nextSequence(std::istream& input, Sequence& seq) const throw (Exception);
-      /** @} */
-
-      /**
-       * @name The IOSequence interface.
-       *
-       * @{
-       */
-      const std::string getDataType() const { return "Sequence"; };
-      const std::string getFormatName() const { return "poly file"; };
-      const std::string getFormatDescription() const {
-        return "Sequences following the poly format as describe in the phred documentation.";
-      }
-      /** @} */
-  };
-} //end of namespace bpp
-
-#endif // _PHREDPOLY_H_
diff --git a/src/Bpp/Seq/Io/Phylip.cpp b/src/Bpp/Seq/Io/Phylip.cpp
deleted file mode 100644
index ff6f42d..0000000
--- a/src/Bpp/Seq/Io/Phylip.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-//
-// File: Phylip.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Oct 27 12:22:56 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Phylip.h"
-#include "../Container/SequenceContainerTools.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <sstream>
-
-using namespace std;
-
-/******************************************************************************/
-
-const std::vector<std::string> Phylip::splitNameAndSequence(const std::string& s) const throw (Exception)
-{
-  vector<string> v(2);
-  if (extended_)
-  {
-    string::size_type index = s.find(namesSplit_);
-    if(index == string::npos) throw Exception("No sequence name found.");
-    v[0] = TextTools::removeSurroundingWhiteSpaces(s.substr(0, index));
-    v[1] = TextTools::removeFirstWhiteSpaces      (s.substr(index + namesSplit_.size())); //There may be more than 2 white spaces.
-  }
-  else
-  {
-    v[0] = TextTools::removeSurroundingWhiteSpaces(s.substr(0, 10));
-    v[1] = s.substr(10);
-  }
-  return v;
-}  
-
-/******************************************************************************/
-
-void Phylip::readSequential(std::istream& in, SiteContainer& asc) const throw (Exception)
-{
-  string temp;
-  
-  //Ignore first line:
-  getline(in, temp, '\n');  // Copy current line in temporary string
-  temp = TextTools::removeSurroundingWhiteSpaces(FileTools::getNextLine(in));
-  string name = "";
-  string seq  = "";
-  
-  while (!in.eof())
-  {
-    // Read each sequence:
-    vector<string> v;
-    bool hasName = true;
-    try
-    { 
-      v = splitNameAndSequence(temp);
-    }
-    catch (Exception & e)
-    {
-      hasName = false;
-    }
-    if (hasName)
-    {
-      // a new sequence is found:
-      if (!TextTools::isEmpty(name)) //If this is not the first sequence!
-      {
-        // Add the previous sequence to the container:
-        asc.addSequence(BasicSequence(name, seq, asc.getAlphabet()), checkNames_);
-      }
-      name = v[0];
-      seq  = v[1];
-    }
-    else
-    {
-      //No sequence name found.
-      if (TextTools::isEmpty(name))
-        throw Exception("First sequence in file has no name!");
-      seq += TextTools::removeWhiteSpaces(temp);
-    }
-    //while(!TextTools::isEmpty(temp))
-    //{
-    //  //Sequences are separated by at least one blank line:
-    //  getline(in, temp, '\n');  // read next line in file.
-    //  seq += TextTools::removeWhiteSpaces(temp);      
-    //}
-    //end of this sequence:
-    temp = TextTools::removeSurroundingWhiteSpaces(FileTools::getNextLine(in));
-
-  }
-  // Add last sequence:
-  asc.addSequence(BasicSequence(name, seq, asc.getAlphabet()), checkNames_);
-}
-
-/******************************************************************************/
-
-void Phylip::readInterleaved(std::istream& in, SiteContainer& asc) const throw (Exception)
-{
-  string temp;
-  
-  //Read first line:
-  getline(in, temp, '\n'); // Copy current line in temporary string
-  StringTokenizer st(temp);
-  unsigned int nbSequences = TextTools::to<unsigned int>(st.nextToken());
-  //int nbSites     = TextTools::toInt(st.nextToken());
-  temp = FileTools::getNextLine(in);
-  
-  vector<string> names, seqs;
-  // Read first block:
-  for (unsigned int i = 0; i < nbSequences && !in.eof() && !TextTools::isEmpty(temp); i++)
-  {
-    vector<string> v = splitNameAndSequence(temp);
-    names.push_back(v[0]);
-    seqs.push_back(v[1]);
-    getline(in, temp, '\n');  // read next line in file.
-  }
-  
-  //Then read all other blocks:
-  temp = FileTools::getNextLine(in);
-  while (!in.eof())
-  {
-    for (unsigned int i = 0; i < names.size(); i++)
-    {
-      if (TextTools::isEmpty(temp))
-        throw IOException("Phylip::readInterleaved. Bad file,there are not the same number of sequence in each block.");
-      seqs[i] += TextTools::removeWhiteSpaces(temp);      
-      getline(in, temp, '\n');  // read next line in file.
-    }
-    temp = FileTools::getNextLine(in);
-  }
-  for (unsigned int i = 0; i < names.size(); i++)
-  {
-    asc.addSequence(BasicSequence(names[i], seqs[i], asc.getAlphabet()), checkNames_);
-  }
-}
-  
-/******************************************************************************/
-
-void Phylip::appendAlignmentFromStream(std::istream& input, SiteContainer& vsc) const throw (Exception)
-{
-  // Checking the existence of specified file
-  if (!input) { throw IOException ("Phylip::read: fail to open file"); }
-  
-  if(sequential_) readSequential (input, vsc);
-  else            readInterleaved(input, vsc);
-}
-
-/******************************************************************************/
-
-unsigned int Phylip::getNumberOfSequences(const std::string& path) const throw (IOException)
-{
-  // Checking the existence of specified file
-  ifstream file (path.c_str(), ios::in);
-  if (! file) { throw IOException ("Phylip::getNumberOfSequences: failed to open file"); }
-  string firstLine = FileTools::getNextLine(file);
-  StringTokenizer st(firstLine, " \t");
-  istringstream iss(st.nextToken());
-  unsigned int nb;
-  iss >> nb;
-  file.close();
-  return nb;
-}
- 
-/******************************************************************************/
-
-std::vector<std::string> Phylip::getSizedNames(const std::vector<std::string>& names) const
-{
-  vector<string> sizedNames(names.size());
-  if (extended_)
-  {
-    //Add 6 white spaces to the larger name and align other names.
-    //First, determine the size of the wider name:
-    size_t sizeMax = 0;
-    for (size_t i = 0; i < names.size(); i++)
-      if (names[i].size() > sizeMax) sizeMax = names[i].size();
-    //Quite easy ;-) Now update all lengths:
-    for (size_t i = 0; i < names.size(); i++)
-      sizedNames[i] = TextTools::resizeRight(names[i], sizeMax) + namesSplit_;  
-  }
-  else
-  {
-    //We trunc all names to ten characters:
-    for(unsigned int i = 0; i < names.size(); i++) sizedNames[i] = TextTools::resizeRight(names[i], 10);
-    cout << "Warning: names have been truncated to 10 characters. They may be ambiguous sequence names then." << endl;
-  }
-  return sizedNames;
-}
-
-/******************************************************************************/
-
-void Phylip::writeSequential(std::ostream& out, const SequenceContainer& sc) const
-{
-  //cout << "Write sequential" << endl;
-  size_t numberOfSites = sc.getSequence(sc.getSequencesNames()[0]).size() * sc.getAlphabet()->getStateCodingSize();
-  out << sc.getNumberOfSequences() << " " << numberOfSites << endl;
-  
-  vector<string> seqNames = sc.getSequencesNames();
-  vector<string> names = getSizedNames(seqNames);
-  for (size_t i = 0; i < seqNames.size(); ++i)
-  {
-    vector<string> seq = TextTools::split(sc.toString(seqNames[i]), charsByLine_);
-    out << names[i] << seq[0] << endl;
-    for (size_t j = 1; j < seq.size(); ++j)
-    {
-      out << string(names[i].size(), ' ') << seq[j] << endl;
-    }
-    out << endl;
-  }
-}
-
-void Phylip::writeInterleaved(std::ostream& out, const SequenceContainer& sc) const
-{
-  //cout << "Write interleaved;" << endl;
-  size_t numberOfSites = sc.getSequence(sc.getSequencesNames()[0]).size() * sc.getAlphabet()->getStateCodingSize();
-  out << sc.getNumberOfSequences() << " " << numberOfSites << endl;
-  
-  vector<string> seqNames = sc.getSequencesNames();
-  vector<string> names = getSizedNames(seqNames);
-  //Split sequences:
-  vector< vector<string> > seqs(sc.getNumberOfSequences());
-  for (size_t i = 0; i < seqNames.size(); ++i)
-  {
-    seqs[i] = TextTools::split(sc.toString(seqNames[i]), charsByLine_);
-  }
-  //Write first block:
-  for (size_t i = 0; i < names.size(); ++i)
-  {
-    out << names[i] << seqs[i][0] << endl;
-  }
-  out << endl;
-  //Write other blocks:
-  for (size_t j = 1; j < seqs[0].size(); ++j)
-  {
-    for (size_t i = 0; i < sc.getNumberOfSequences(); ++i)
-    {
-      out << seqs[i][j] << endl;
-    }
-    out << endl;
-  }
-}
-
-/******************************************************************************/
-
-void Phylip::writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception)
-{
-  //First must check if all sequences are aligned:
-  if (sc.getNumberOfSequences() == 0)
-    throw Exception("Phylip::write. SequenceContainer appear to contain no sequence.");
-  
-  // Checking the existence of specified file, and possibility to open it in write mode
-  if (!output) { throw IOException ("Phylip::write : failed to open file"); }
-
-  if (sequential_) writeSequential (output, sc);
-  else             writeInterleaved(output, sc);
-}
-
-/******************************************************************************/
-
-const std::string Phylip::getFormatName() const { return "Phylip file, " + string(extended_ ? "extended," : "") + string(sequential_ ? "sequential" : "interleaved"); }
-
-/******************************************************************************/
-
-const std::string Phylip::getFormatDescription() const
-{
-  return "Phylip file format, sequential and interleaved. PAML extension also supported.";
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Io/Phylip.h b/src/Bpp/Seq/Io/Phylip.h
deleted file mode 100644
index 5d8646c..0000000
--- a/src/Bpp/Seq/Io/Phylip.h
+++ /dev/null
@@ -1,196 +0,0 @@
-//
-// File: Phylip.h
-// Created by: Julien Dutheil
-// Created on: Mon Oct 27 12:22:56 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _PHYLIP_H_
-#define _PHYLIP_H_
-
-#include "AbstractIAlignment.h"
-#include "AbstractOAlignment.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/VectorSequenceContainer.h"
-#include "../Container/AlignedSequenceContainer.h"
-
-// From the STL:
-#include <iostream>
-
-namespace bpp
-{
-
-/**
- * @brief The Phylip & co format.
- *
- * An AlignedSequenceContainer is used instead of a VectorSequenceContainer.
- *
- * This format is described on the Phylip package documentation website:
- * http://evolution.genetics.washington.edu/phylip/doc/sequence.html
- */
-class Phylip :
-  public AbstractIAlignment,
-  public AbstractOAlignment,
-  public virtual ISequence
-{
-  private:
-
-    /* this class allows two kinds of Phylip format:
-     * traditional, with names limited to 10 chars,
-     * and 'extended', defined by PAML, with names separated from sequences by at least 6 white spaces.
-     */
-    bool extended_;
-    /* tells if sequences are in the seuqential or the interleave format/
-     */
-    bool sequential_;
-
-    /**
-     * @brief The maximum number of chars to be written on a line.
-     */
-    unsigned int charsByLine_;
-
-    bool checkNames_;
-
-    std::string namesSplit_;
-  
-  public:
-    /**
-     * @brief Build a new Phylip file reader.
-     *
-     * @param extended If true, sequences with names longer than 10 characters are allowed.
-     * @param sequential If false, sequences are supposed to be interlaved.
-     * @param charsByLine The number of base to display in a row.
-     * @param checkSequenceNames Tell if the names in the file should be checked for unicity (slower, in o(n*n) where n is the number of sequences).
-     * @param split The string to use to split sequence name from content (only for 'extended' format). This will typically be "  " (two spaces) or "\t" (a tabulation).
-     */
-    Phylip(bool extended = true, bool sequential = true, unsigned int charsByLine = 100, bool checkSequenceNames = true, const std::string& split = "  "):
-      extended_(extended), sequential_(sequential), charsByLine_(charsByLine), checkNames_(checkSequenceNames), namesSplit_(split) {}
-
-    virtual ~Phylip() {}
-
-  public:
-
-    /**
-     * @name The AbstractIAlignment interface.
-     *
-     * @{
-     */
-    void appendAlignmentFromStream(std::istream& input, SiteContainer& sc) const throw (Exception);
-    /** @} */
-
-    /**
-     * @name The ISequence interface.
-     *
-     * As a SiteContainer is a subclass of SequenceContainer, we hereby implement the ISequence
-     * interface by downcasting the interface.
-     *
-     * @{
-     */
-    virtual SequenceContainer* readSequences(std::istream& input, const Alphabet* alpha) const throw (Exception) {
-      return readAlignment(input, alpha);
-    }
-    virtual SequenceContainer* readSequences(const std::string& path, const Alphabet* alpha) const throw (Exception) {
-      return readAlignment(path, alpha);
-    }
-    /** @} */
-
-    /**
-     * @return The number of sequences contained in the specified file.
-     *
-     * This methods parses the firt line of the phylip file.
-     * @param path The path of the file to parse.
-     */
-    unsigned int getNumberOfSequences(const std::string& path) const throw (IOException);
-
-    /**
-     * @name The OSequence interface.
-     *
-     * @{
-     */
-    void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception);
-    void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite) const throw (Exception)
-    {
-      AbstractOAlignment::writeAlignment(path, sc, overwrite);
-    }
-    /** @} */
-
-
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const;
-    const std::string getFormatDescription() const;
-    /** @} */
-
-    /**
-     * @return true if the names are to be checked when reading sequences from files.
-     */
-    bool checkNames() const { return checkNames_; }
-
-    /**
-     * @brief Tell whether the sequence names should be checked when reading from files.
-     *
-     * @param yn whether the sequence names should be checked when reading from files.
-     */
-    void checkNames(bool yn) { checkNames_ = yn; }
-
-    /**
-     * @return The string used to split sequence name from content.
-     */
-    const std::string& getSplit() const { return namesSplit_; }
-
-    /**
-     * @param split The string to be used to split sequence name from content.
-     */
-    void setSplit(const std::string& split) { namesSplit_ = split; }
-     
-  protected:
-    //Reading tools:
-    const std::vector<std::string> splitNameAndSequence(const std::string& s) const throw (Exception); 
-    void readSequential (std::istream& in, SiteContainer& asc) const throw (Exception);
-    void readInterleaved(std::istream& in, SiteContainer& asc) const throw (Exception);
-    //Writing tools:
-    std::vector<std::string> getSizedNames(const std::vector<std::string>& names) const;
-    void writeSequential(std::ostream& out, const SequenceContainer& sc) const;
-    void writeInterleaved(std::ostream& out, const SequenceContainer& sc) const;
-};
-
-} //end of namespace bpp.
-
-#endif  //_PHYLIP_H_
-
diff --git a/src/Bpp/Seq/Io/SequenceFileIndex.h b/src/Bpp/Seq/Io/SequenceFileIndex.h
deleted file mode 100644
index 98e34d2..0000000
--- a/src/Bpp/Seq/Io/SequenceFileIndex.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// 
-// File:    SequenceFileIndex.h
-// Author:  Sylvain Gaillard
-// Created: 19/04/2010 10:16:13
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEFILEINDEX_H_
-#define _SEQUENCEFILEINDEX_H_
-
-#include <string>
-#include <Bpp/Exceptions.h>
-
-namespace bpp {
-  /**
-   * @brief Index to retrieve Sequence in a file
-   *
-   * This class is designed to build an in-memory index of a Sequence file in
-   * order to retrieve Sequence given its ID.
-   *
-   * @author Sylvain Gaillard
-   */
-  class SequenceFileIndex {
-    public:
-      virtual ~SequenceFileIndex() {}
-      /**
-       * @brief Build the index given a path to the file.
-       */
-      virtual void build(const std::string& path) throw (Exception) = 0;
-
-      /**
-       * @brief Get the position of a Sequence given its ID.
-       */
-      virtual std::streampos getSequencePosition(const std::string& id) const throw (Exception) = 0;
-
-      /**
-       * @brief Get the number of sequences
-       */
-      virtual size_t getNumberOfSequences() const throw (Exception) = 0;
-  };
-}
-
-#endif // _SEQUENCEFILEINDEX_H_
diff --git a/src/Bpp/Seq/Io/Stockholm.cpp b/src/Bpp/Seq/Io/Stockholm.cpp
deleted file mode 100644
index 485f332..0000000
--- a/src/Bpp/Seq/Io/Stockholm.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// File: Stockholm.cpp
-// Authors: Julien Dutheil
-// Created: Thu Apr 15 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team (2010)
-
-Julien.Dutheil at univ-montp2.fr
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Stockholm.h"
-
-#include "../StringSequenceTools.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Text/StringTokenizer.h>
-#include <Bpp/Io/FileTools.h>
-
-using namespace bpp;
-using namespace std;
-
-/******************************************************************************/
-
-void Stockholm::writeAlignment(ostream& output, const SiteContainer& sc) const throw (Exception)
-{
-	if (!output)
-    throw IOException("Stockholm::writeAlignment: can't write to ostream output");
-
-  output << "# STOCKHOLM 1.0" << endl; 
-  // Loop for all general comments
-  for (size_t i = 0; i < sc.getGeneralComments().size(); ++i)
-  {
-    output << "#=GF CC " << sc.getGeneralComments()[i] << endl;
-  }
-
-	// Main loop : for all sequences in vector container
-	vector<string> names = sc.getSequencesNames();
-  size_t maxSize = 0; 
-  for(unsigned int i = 0; i < names.size(); ++i)
-  {
-    names[i] = TextTools::removeWhiteSpaces(names[i]);
-    if (names[i].size() > maxSize) maxSize = names[i].size();
-  }
-  if (maxSize > 255) maxSize = 255;
-  for (size_t i = 0; i < sc.getNumberOfSequences(); ++i)
-  {
-    output << TextTools::resizeRight(names[i], maxSize) << " " << sc.getSequence(i).toString() << endl;
-	}
-  output << "//" << endl;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Io/Stockholm.h b/src/Bpp/Seq/Io/Stockholm.h
deleted file mode 100644
index ec9278d..0000000
--- a/src/Bpp/Seq/Io/Stockholm.h
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-// File: Stockholm.h
-// Authors: Julien Dutheil
-// Created: Thu Apr 15 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team (2010)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _STOCKHOLM_H_
-#define _STOCKHOLM_H_
-
-#include "AbstractOAlignment.h"
-#include "../Sequence.h"
-#include "../Container/SequenceContainer.h"
-#include "../Container/AlignedSequenceContainer.h"
-
-namespace bpp
-{
-
-/**
- * @brief The Stockholm alignment file format.
- *
- * Write to Stockholm files.
- * Only sequence data is read/written, annotation and secondary structures are ignored.
- */
-class Stockholm:
-  public AbstractOAlignment
-{
-  private:
-
-    bool checkNames_;
-
-  public:
-  
-    /**
-     * @brief Build a new Stockholm object.
-     *
-     * @param checkSequenceNames Tell if the names in the file should be checked for unicity (slower, in o(n*n) where n is the number of sequences).
-     */
-    Stockholm(bool checkSequenceNames = true) : checkNames_(checkSequenceNames) {}
-
-    // Class destructor
-    virtual ~Stockholm() {}
-
-  public:
-
-    /**
-     * @name The OAlignment interface.
-     *
-     * @{
-     */
-    void writeAlignment(std::ostream& output, const SiteContainer& sc) const throw (Exception);
-    void writeAlignment(const std::string& path, const SiteContainer& sc, bool overwrite = true) const throw (Exception)
-    {
-      AbstractOAlignment::writeAlignment(path, sc, overwrite);
-    }
-    /** @} */
-  
-    /**
-     * @name The IOSequence interface.
-     *
-     * @{
-     */
-    const std::string getFormatName() const { return "Stockholm file"; };
-    const std::string getFormatDescription() const
-    {
-      return "See http://en.wikipedia.org/wiki/Stockholm_format";
-    }
-    /** @} */
-
-    /**
-     * @warning This is not used for now, will be when reading is implemented.
-     * @return true if the names are to be checked when reading sequences from files.
-     */
-    bool checkNames() const { return checkNames_; }
-
-    /**
-     * @brief Tell whether the sequence names should be checked when reading from files.
-     *
-     * @warning This is not used for now, will be when reading is implemented.
-     * @param yn whether the sequence names should be checked when reading from files.
-     */
-    void checkNames(bool yn) { checkNames_ = yn; }
-};
-
-} //end of namespace bpp.
-
-#endif // _FASTA_H_
-
diff --git a/src/Bpp/Seq/Io/StreamSequenceIterator.cpp b/src/Bpp/Seq/Io/StreamSequenceIterator.cpp
deleted file mode 100644
index aecacee..0000000
--- a/src/Bpp/Seq/Io/StreamSequenceIterator.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// File: StreamSequenceIterator.cpp
-// Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:27 2013
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "StreamSequenceIterator.h"
-
-using namespace bpp;
-
-StreamSequenceIterator::StreamSequenceIterator(ISequenceStream& seqStream, std::istream& stream, const Alphabet* alphabet): 
-  alphabet_(alphabet),
-  seqStream_(&seqStream),
-  stream_(&stream),
-  nextSeq_(new BasicSequence(alphabet_))
-{
-  bool test = seqStream_->nextSequence(*stream_, *nextSeq_);
-  if (!test) {
-    delete nextSeq_;
-    nextSeq_ = 0; //No more sequence available
-  }
-}
-
-Sequence* StreamSequenceIterator::nextSequence()
-{
-  BasicSequence* seq = nextSeq_;
-  if (nextSeq_) {
-    nextSeq_ = new BasicSequence(alphabet_);
-    bool test = seqStream_->nextSequence(*stream_, *nextSeq_);
-    if (!test) {
-      delete nextSeq_;
-      nextSeq_ = 0; //No more sequence available
-    }
-  }
-  return seq;
-}
-
-StreamSequenceWithQualityIterator::StreamSequenceWithQualityIterator(ISequenceStream& seqStream, std::istream& stream, const Alphabet* alphabet): 
-  alphabet_(alphabet),
-  seqStream_(&seqStream),
-  stream_(&stream),
-  nextSeq_(new SequenceWithQuality(alphabet_))
-{
-  bool test = seqStream_->nextSequence(*stream_, *nextSeq_);
-  if (!test) {
-    delete nextSeq_;
-    nextSeq_ = 0; //No more sequence available
-  }
-}
-
-SequenceWithQuality* StreamSequenceWithQualityIterator::nextSequence()
-{
-  SequenceWithQuality* seq = nextSeq_;
-  if (nextSeq_) {
-    nextSeq_ = new SequenceWithQuality(alphabet_);
-    bool test = seqStream_->nextSequence(*stream_, *nextSeq_);
-    if (!test) {
-      delete nextSeq_;
-      nextSeq_ = 0; //No more sequence available
-    }
-  }
-  return seq;
-}
-
diff --git a/src/Bpp/Seq/Io/StreamSequenceIterator.h b/src/Bpp/Seq/Io/StreamSequenceIterator.h
deleted file mode 100644
index 67dc2bc..0000000
--- a/src/Bpp/Seq/Io/StreamSequenceIterator.h
+++ /dev/null
@@ -1,138 +0,0 @@
-//
-// File: StreamSequenceIterator.h
-// Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:27 2013
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _STREAMSEQUENCEITERATOR_H_
-#define _STREAMSEQUENCEITERATOR_H_
-
-#include "../SequenceIterator.h"
-#include "ISequenceStream.h"
-
-// From the STL:
-#include <istream>
-
-namespace bpp
-{
-
-/**
- * @brief A sequence iterator based on a sequence stream.
- *
- * This iterator uses a bpp::BasicSequence object for storing sequences.
- */
-class StreamSequenceIterator:
-  public virtual SequenceIterator
-{
-  private:
-    const Alphabet* alphabet_;
-    const ISequenceStream* seqStream_;
-    std::istream* stream_;
-    BasicSequence* nextSeq_;
-
-	public:
-		StreamSequenceIterator(ISequenceStream& seqStream, std::istream& stream, const Alphabet* alphabet);
-
-		virtual ~StreamSequenceIterator() {}
-
-  private: //Recopy is forbidden
-    StreamSequenceIterator(const StreamSequenceIterator& ssi):
-      alphabet_(ssi.alphabet_),
-      seqStream_(ssi.seqStream_),
-      stream_(ssi.stream_),
-      nextSeq_(0) {}
-
-    StreamSequenceIterator& operator=(const StreamSequenceIterator& ssi)
-    {
-      alphabet_  = ssi.alphabet_;
-      seqStream_ = ssi.seqStream_;
-      stream_    = ssi.stream_;
-      nextSeq_   = 0;
-      return *this;
-    }
-	
-	public:
-		virtual Sequence* nextSequence();
-    
-    virtual bool hasMoreSequences() const { return nextSeq_ != 0; }
-};
-
-/**
- * @brief A sequence iterator based on a sequence stream.
- *
- * This iterator uses a bpp::SequenceWithQuality object for storing sequences.
- */
-class StreamSequenceWithQualityIterator:
-  public virtual SequenceWithQualityIterator
-{
-  private:
-    const Alphabet* alphabet_;
-    const ISequenceStream* seqStream_;
-    std::istream* stream_;
-    SequenceWithQuality* nextSeq_;
-
-	public:
-		StreamSequenceWithQualityIterator(ISequenceStream& seqStream, std::istream& stream, const Alphabet* alphabet);
-
-		virtual ~StreamSequenceWithQualityIterator() {}
-
-  private: //Recopy is forbidden
-    StreamSequenceWithQualityIterator(const StreamSequenceWithQualityIterator& ssi):
-      alphabet_(ssi.alphabet_),
-      seqStream_(ssi.seqStream_),
-      stream_(ssi.stream_),
-      nextSeq_(0) {}
-
-    StreamSequenceWithQualityIterator& operator=(const StreamSequenceWithQualityIterator& ssi)
-    {
-      alphabet_  = ssi.alphabet_;
-      seqStream_ = ssi.seqStream_;
-      stream_    = ssi.stream_;
-      nextSeq_   = 0;
-      return *this;
-    }
-	
-	public:
-		virtual SequenceWithQuality* nextSequence();
-    
-    virtual bool hasMoreSequences() const { return nextSeq_ != 0; }
-};
-
-
-} //end of namespace bpp.
-
-#endif	//_SEQUENCEITERATOR_H_
-
diff --git a/src/Bpp/Seq/NucleicAcidsReplication.cpp b/src/Bpp/Seq/NucleicAcidsReplication.cpp
deleted file mode 100644
index 3c1f4f9..0000000
--- a/src/Bpp/Seq/NucleicAcidsReplication.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-// File: NucleicAcidsReplication.cpp
-// Created by: Julien Dutheil
-// Created on: Fri May 20 14:40 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "NucleicAcidsReplication.h"
-
-using namespace bpp;
-
-using namespace std;
-
-NucleicAcidsReplication::NucleicAcidsReplication(const NucleicAlphabet* nuc1, const NucleicAlphabet* nuc2) :
-  nuc1_(nuc1), nuc2_(nuc2), trans_()
-{
-  trans_[-1] = -1;
-  trans_[0] = 3;
-  trans_[1] = 2;
-  trans_[2] = 1;
-  trans_[3] = 0;
-
-  trans_[4] = 9;
-  trans_[5] = 8;
-  trans_[6] = 6;
-  trans_[7] = 7;
-  trans_[8] = 5;
-  trans_[9] = 4;
-
-  trans_[10] = 13;
-  trans_[11] = 12;
-  trans_[12] = 11;
-  trans_[13] = 10;
-
-  trans_[14] = 14;
-}
-
-int NucleicAcidsReplication::translate(int state) const throw (BadIntException)
-{
-  nuc1_->intToChar(state);
-  return trans_[state];
-}
-
-std::string NucleicAcidsReplication::translate(const std::string& state) const throw (BadCharException)
-{
-  int i = nuc1_->charToInt(state);
-  return nuc2_->intToChar(trans_[i]);
-}
-
-Sequence* NucleicAcidsReplication::translate(const Sequence& sequence) const throw (AlphabetMismatchException)
-{
-  if (sequence.getAlphabet()->getAlphabetType() != getSourceAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("NucleicAcidsReplication::translate", getSourceAlphabet(), getTargetAlphabet());
-  BasicSequence* tSeq = new BasicSequence(sequence.getName(), "", sequence.getComments(), getTargetAlphabet());
-  for (unsigned int i = 0; i < sequence.size(); i++)
-  {
-    tSeq->addElement(translate(sequence.getValue(i)));
-  }
-  //tSeq->setSense(!tSeq->getSense());
-  return tSeq;
-}
-
-
-int NucleicAcidsReplication::reverse(int state) const throw (BadIntException) 
-{
-  nuc2_->intToChar(state);
-  return trans_[state];
-}
-
-std::string NucleicAcidsReplication::reverse(const std::string& state) const throw (BadCharException)
-{
-  int i = nuc2_->charToInt(state);
-  return nuc1_->intToChar(trans_[i]);
-}
-
-Sequence* NucleicAcidsReplication::reverse(const Sequence& sequence) const throw (AlphabetMismatchException, Exception)
-{
-  if (sequence.getAlphabet()->getAlphabetType() != getTargetAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("NucleicAcidsReplication::reverse", getSourceAlphabet(), getTargetAlphabet());
-  BasicSequence* rSeq = new BasicSequence(sequence.getName(), "", sequence.getComments(), getSourceAlphabet());
-  for (unsigned int i = 0; i < sequence.size(); i++)
-  {
-    rSeq->addElement(reverse(sequence.getValue(i)));
-  }
-  //rSeq->setSense(! rSeq->getSense());
-  return rSeq;
-}
-
diff --git a/src/Bpp/Seq/NucleicAcidsReplication.h b/src/Bpp/Seq/NucleicAcidsReplication.h
deleted file mode 100644
index 7e42167..0000000
--- a/src/Bpp/Seq/NucleicAcidsReplication.h
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// File: NucleicAcidsReplication.h
-// Created by: Julien Dutheil
-// Created on: Fri May 20 14:20 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _NUCLEICACIDSREPLICATION_H_
-#define _NUCLEICACIDSREPLICATION_H_
-
-#include "Transliterator.h"
-#include "Alphabet/NucleicAlphabet.h"
-
-// From the STL:
-#include <map>
-
-namespace bpp
-{
-
-/**
- * @brief Replication between to nucleic acids.
- *
- * Example of use:
- * - DNA -> DNA: DNA Replication
- * - RNA -> RNA: RNA Replication
- * - DNA -> RNA: Transcription
- * - RNA -> DNA: Reverse transcription
- *
- * Since this is an instance of the ReverseIterator interface, transcription and
- * reverse transcription may be achieved from the same instance of the object by
- * using the translate and reverse methods.
- */
-class NucleicAcidsReplication :
-  public ReverseTransliterator
-{
-  private:
-    const NucleicAlphabet* nuc1_, * nuc2_;
-    mutable std::map<int, int> trans_;
-  
-  public:
-    NucleicAcidsReplication(const NucleicAlphabet* nuc1, const NucleicAlphabet* nuc2);
-    NucleicAcidsReplication(const NucleicAcidsReplication& nar):
-      ReverseTransliterator(nar),
-      nuc1_(nar.nuc1_), nuc2_(nar.nuc2_), trans_(nar.trans_)
-    {}
-    NucleicAcidsReplication& operator=(const NucleicAcidsReplication& nar)
-    {
-      ReverseTransliterator::operator=(nar);
-      nuc1_ = nar.nuc1_;
-      nuc2_ = nar.nuc2_;
-      trans_ = nar.trans_;
-      return *this;
-    }
-
-    virtual ~NucleicAcidsReplication() {}
-  
-  public:
-    const Alphabet* getSourceAlphabet() const { return nuc1_; }
-    const Alphabet* getTargetAlphabet() const { return nuc2_; }
-
-    int translate(int state) const throw (BadIntException);
-    std::string translate(const std::string& state) const throw (BadCharException);    
-      Sequence* translate(const Sequence& sequence) const throw (AlphabetMismatchException);
-            int reverse(int state) const throw (BadIntException);    
-    std::string reverse(const std::string& state) const throw (BadCharException);      
-      Sequence* reverse(const Sequence& sequence) const throw (AlphabetMismatchException, Exception);
-
-};
-
-} //end of namespace bpp.
-
-#endif  //_NUCLEICACIDSREPLICATION_H_
-
diff --git a/src/Bpp/Seq/Sequence.cpp b/src/Bpp/Seq/Sequence.cpp
deleted file mode 100644
index c0ff88b..0000000
--- a/src/Bpp/Seq/Sequence.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-//
-// File: Sequence.cpp
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Tue Aug 21 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use,
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info".
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability.
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or
-data to be ensured and,  more generally, to use and operate it in the
-same conditions as regards security.
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Sequence.h" // class's header file
-
-#include "Alphabet/AlphabetTools.h"
-#include "StringSequenceTools.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-/* Constructors: **************************************************************/
-
-BasicSequence::BasicSequence(const Alphabet* alpha):
-  BasicSymbolList(alpha),
-  name_(),
-  comments_()
-{}
-
-BasicSequence::BasicSequence(const std::string& name, const std::string& sequence, const Alphabet* alpha)
-throw (BadCharException) :
-	BasicSymbolList(alpha),
-	name_(name),
-  comments_()
-{
-  if (sequence!="")
-    setContent(sequence);
-}
-
-BasicSequence::BasicSequence(const std::string& name, const std::string& sequence, const Comments& comments, const Alphabet* alpha)
-  throw (BadCharException) :
-	BasicSymbolList(alpha),
-	name_(name),
-	comments_(comments)
-{
-  if (sequence!="")
-    setContent(sequence);
-}
-
-BasicSequence::BasicSequence(const std::string& name, const std::vector<std::string>& sequence, const Alphabet* alpha)
-throw (BadCharException) :
-	BasicSymbolList(sequence, alpha),
-	name_(name),
-  comments_()
-{}
-
-BasicSequence::BasicSequence(const std::string& name, const std::vector<std::string>& sequence, const Comments& comments, const Alphabet* alpha)
-  throw (BadCharException) :
-	BasicSymbolList(sequence, alpha),
-	name_(name),
-	comments_(comments)
-{}
-
-BasicSequence::BasicSequence(const std::string& name, const std::vector<int>& sequence, const Alphabet* alpha)
-  throw (BadIntException) :
-	BasicSymbolList(sequence, alpha),
-	name_(name),
-  comments_()
-{}
-
-BasicSequence::BasicSequence(const std::string& name, const std::vector<int>& sequence, const Comments& comments, const Alphabet* alpha)
-  throw (BadIntException) :
-	BasicSymbolList(sequence, alpha),
-	name_(name),
-	comments_(comments)
-{}
-
-/* Copy constructors: *********************************************************/
-
-BasicSequence::BasicSequence(const Sequence& s) :
-	BasicSymbolList(s),
-	name_(s.getName()),
-	comments_(s.getComments())
-{}
-
-BasicSequence::BasicSequence(const BasicSequence& s) :
-	BasicSymbolList(s),
-	name_(s.getName()),
-	comments_(s.getComments())
-{}
-
-/* Assignation operator: ******************************************************/
-
-BasicSequence& BasicSequence::operator=(const Sequence& s)
-{
-  BasicSymbolList::operator=(s);
-	name_     = s.getName();
-	comments_ = s.getComments();
-	return *this;
-}
-
-BasicSequence& BasicSequence::operator=(const BasicSequence& s)
-{
-  BasicSymbolList::operator=(s);
-	name_     = s.getName();
-	comments_ = s.getComments();
-	return *this;
-}
-
-/******************************************************************************/
-
-void BasicSequence::setContent(const std::string& sequence) throw (BadCharException)
-{
-	// Remove blanks in sequence
-	content_ = StringSequenceTools::codeSequence(TextTools::removeWhiteSpaces(sequence), getAlphabet());
-  //Warning, an exception may be thrown here!
-}
-
-/******************************************************************************/
-
-void BasicSequence::setToSizeR(size_t newSize)
-{
-	// Size verification
-	size_t seqSize = content_.size();
-	if (newSize == seqSize) return;
-
-	if (newSize < seqSize)
-  {
-		content_.resize(newSize);
-		return;
-	}
-
-	// Add gaps up to specified size
-  int gap = getAlphabet()->getGapCharacterCode();
-	while (content_.size() < newSize) content_.push_back(gap);
-}
-
-/******************************************************************************/
-
-void BasicSequence::setToSizeL(size_t newSize)
-{
-	// Size verification
-	size_t seqSize = content_.size();
-	if (newSize == seqSize) return;
-
-	if (newSize < seqSize)
-  {
-		//We must truncate sequence from the left.
-		//This is a very unefficient method!
-		content_.erase(content_.begin(), content_.begin() + static_cast<ptrdiff_t>(seqSize - newSize));
-		return;
-	}
-
-	// Add gaps up to specified size
-  int gap = getAlphabet()->getGapCharacterCode();
-	content_.insert(content_.begin(), newSize - seqSize, gap);
-}
-
-/******************************************************************************/
-
-void BasicSequence::append(const std::vector<int>& content) throw (BadIntException)
-{
-	// Check list for incorrect characters
-	for (size_t i = 0; i < content.size(); i++)
-		if(!getAlphabet()->isIntInAlphabet(content[i]))
-      throw BadIntException(content[i], "BasicSequence::append", getAlphabet());
-	//BasicSequence is valid:
-	for (size_t i = 0; i < content.size(); i++)
-		content_.push_back(content[i]);
-}
-
-void BasicSequence::append(const std::vector<std::string>& content) throw (BadCharException)
-{
-	// Check list for incorrect characters
-	for (size_t i = 0; i < content.size(); i++)
-		if(!getAlphabet()->isCharInAlphabet(content[i]))
-      throw BadCharException(content[i], "BasicSequence::append", getAlphabet());
-	
-	//BasicSequence is valid:
-	for (size_t i = 0; i < content.size(); i++)
-		content_.push_back(getAlphabet()->charToInt(content[i]));
-}
-
-void BasicSequence::append(const std::string& content) throw (BadCharException)
-{
-	append(StringSequenceTools::codeSequence(content, getAlphabet()));
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/Sequence.h b/src/Bpp/Seq/Sequence.h
deleted file mode 100644
index 3ea81a3..0000000
--- a/src/Bpp/Seq/Sequence.h
+++ /dev/null
@@ -1,465 +0,0 @@
-//
-// File: Sequence.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-// Created on: Tue Aug 21 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCE_H_
-#define _SEQUENCE_H_
-
-#include "SymbolList.h"
-#include "SequenceExceptions.h"
-
-// From the STL:
-#include <string>
-#include <vector>
-
-namespace bpp
-{
-
-/**
- * @brief Declaration of Comments type.
- *
- * Comments are defined as a std::vector of std::strings to allow the later creation of a
- * full Comments class.
- */
-typedef std::vector<std::string> Comments;
-
-/**
- * @brief The sequence interface. 
- *
- * This is a general purpose container, containing an ordered list of states.
- * The states that allowed to be present in the sequence are defined
- * by an alphabet object.
- *
- * Sequence objets also contain a name attribute and potentially several comment lines.
- * A sequence object is also event-driven, allowing easy extension.
- *
- * @see Alphabet
- */
-class Sequence:
-  public virtual SymbolList
-{
-  public:
-    virtual ~Sequence() {}
-
-  public:
-  
-#ifndef NO_VIRTUAL_COV
-    Sequence* clone() const = 0;
-#endif
-    
-    /**
-     * @name Setting/getting the name of the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Get the name of this sequence.
-     *
-     * @return This sequence name.
-     */
-    virtual const std::string& getName() const = 0;
-    
-    /**
-     * @brief Set the name of this sequence.
-     *
-     * @param name The new name of the sequence.
-     */
-    virtual void setName(const std::string& name) = 0;    
-    /** @} */
-    
-    /**
-     * @name Setting/getting the comments associated to the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Get the comments associated to this sequence.
-     *
-     * @return The comments of the sequence.
-     */
-    virtual const Comments& getComments() const = 0;
-    
-    /**
-     * @brief Set the comments associated to this sequence.
-     *
-     * @param comments The new comments of the sequence.
-     */
-    virtual void setComments(const Comments& comments) = 0;
-    
-    /** @} */
-    
-    /**
-     * @name Adjusting the size of the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Set the whole content of the sequence.
-     *
-     * @param sequence The new content of the sequence.
-     * @see The Sequence constructor for information about the way sequences are internaly stored.
-     */
-    virtual void setContent(const std::string& sequence) throw (BadCharException) = 0;
-    virtual void setContent(const std::vector<int>& list) throw (BadIntException) = 0;
-    virtual void setContent(const std::vector<std::string>& list) throw (BadCharException) = 0;
-
-    /**
-     * @brief Set up the size of a sequence from the right side.
-     *
-     * All new characters are filled with gaps.
-     * If the specified size is < to the sequence size, the sequence will be truncated.
-     *
-     * @param newSize The new size of the sequence.
-     */
-    virtual void setToSizeR(size_t newSize) = 0;
-    
-    /**
-     * @brief Set up the size of a sequence from the left side.
-     *
-     * All new characters are filled with gaps.
-     * If the specified size is < to the sequence size, the sequence will be truncated.
-     *
-     * @param newSize The new size of the sequence.
-     */
-    virtual void setToSizeL(size_t newSize) = 0;
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadIntException If the content does not match the current alphabet.
-     */
-    virtual void append(const std::vector<int>& content) throw (BadIntException) = 0;
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadCharException If the content does not match the current alphabet.
-     */
-    virtual void append(const std::vector<std::string>& content) throw (BadCharException) = 0;
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadCharException If the content does not match the current alphabet.
-     */
-    virtual void append(const std::string& content) throw (BadCharException) = 0;
-    /** @} */
-
-};
-
-
-/**
- * @brief A basic implementation of the Sequence interface. 
- *
- * This is a general purpose container, containing an ordered list of states.
- * The states that allowed to be present in the sequence are defined
- * by an alphabet object, which is passed to the sequence constructor by a pointer.
- *
- * For programming convenience, the states are stored as integers, but the translation toward
- * and from a char description is easily performed with the Alphabet classes.
- *
- * Sequence objets also contain a name attribute and potentially several comment lines.
- *
- * @see Alphabet
- */
-class BasicSequence :
-  public Sequence,
-  public BasicSymbolList
-{
-  private:
-
-    /**
-     * @brief The sequence name.
-     */
-    std::string name_;
-
-    /**
-     * @brief The sequence comments.
-     */
-    Comments comments_;
-
-  public:
-
-    /**
-     * @brief Empty constructor: build a void Sequence with just an Alphabet
-     *
-     * You can use it safely for all type of Alphabet in order to build an
-     * empty Sequence i.e. without name nor sequence data.
-     *
-     * @param alpha    A pointer toward the Alphabet to be used with this Sequence.
-     */
-    BasicSequence(const Alphabet* alpha);
-
-    /**
-     * @brief Direct constructor: build a Sequence object from a std::string
-     * You can use it safely for RNA, DNA and protein sequences.
-     *
-     * It can be used with codon sequences too, the std::string will be cut into
-     * parts of size 3. But for more complicated alphabets, you should use one
-     * complete constructors.
-     *
-     * @param name     The sequence name.
-     * @param sequence The whole sequence to be parsed as a std::string.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    BasicSequence(const std::string& name, const std::string& sequence, const Alphabet* alpha) throw (BadCharException);
-  
-    /**
-     * @brief Direct constructor: build a Sequence object from a std::string.
-     * 
-     * You can use it safely for RNA, DNA and protein sequences.
-     *
-     * It can be used with codon sequences too, the std::string will be cut into
-     * tokens of size 3. But for more complicated alphabets, you should use one
-     * complete constructors.
-     *
-     * @param name     The sequence name.
-     * @param sequence The whole sequence to be parsed as a std::string.
-     * @param comments Comments to add to the sequence.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    BasicSequence(const std::string& name, const std::string& sequence, const Comments& comments, const Alphabet* alpha) throw (BadCharException);
-  
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * You should note that the sequence is stored as a std::vector of int.
-     * Hence each std::string in the std::vector will be translated using the alphabet object.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    BasicSequence(const std::string& name, const std::vector<std::string>& sequence, const Alphabet* alpha) throw (BadCharException);
-    
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * You should note that the sequence is stored as a std::vector of int.
-     * Hence each std::string in the std::vector will be translated using the alphabet object.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param comments Comments to add to the sequence.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    BasicSequence(const std::string& name, const std::vector<std::string>& sequence, const Comments& comments, const Alphabet* alpha) throw (BadCharException);
-  
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    BasicSequence(const std::string& name, const std::vector<int>& sequence, const Alphabet* alpha) throw (BadIntException);
-    
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param comments Comments to add to the sequence.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    BasicSequence(const std::string& name, const std::vector<int>& sequence, const Comments& comments, const Alphabet* alpha) throw (BadIntException);
-
-    /**
-     * @brief The Sequence generic copy constructor. This does not perform a hard copy of the alphabet object.
-     */
-    BasicSequence(const Sequence& s);
-   
-    /**
-     * @brief The Sequence copy constructor. This does not perform a hard copy of the alphabet object.
-     */
-    BasicSequence(const BasicSequence& s);
- 
-    /**
-     * @brief The Sequence generic assignment operator. This does not perform a hard copy of the alphabet object.
-     *
-     * @return A ref toward the assigned Sequence.
-     */
-    BasicSequence& operator=(const Sequence& s);
-   
-    /**
-     * @brief The Sequence assignment operator. This does not perform a hard copy of the alphabet object.
-     *
-     * @return A ref toward the assigned Sequence.
-     */
-    BasicSequence& operator=(const BasicSequence& s);
-
-    virtual ~BasicSequence() {}
-
-  public:
-  
-    /**
-     * @name The Clonable interface
-     *
-     * @{
-     */
-    BasicSequence* clone() const { return new BasicSequence(*this); }
-    /** @} */
-        
-    
-    /**
-     * @name Setting/getting the name of the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Get the name of this sequence.
-     *
-     * @return This sequence name.
-     */
-    const std::string& getName() const { return name_; }
-    
-    /**
-     * @brief Set the name of this sequence.
-     *
-     * @param name The new name of the sequence.
-     */
-    void setName(const std::string& name) { name_ = name; }
-    
-    /** @} */
-    
-    /**
-     * @name Setting/getting the comments associated to the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Get the comments associated to this sequence.
-     *
-     * @return The comments of the sequence.
-     */
-    const Comments& getComments() const { return comments_; }
-    
-    /**
-     * @brief Set the comments associated to this sequence.
-     *
-     * @param comments The new comments of the sequence.
-     */
-    void setComments(const Comments& comments) { comments_ = comments; }
-    
-    /** @} */
-    
-    
-    /**
-     * @name Adjusting the size of the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Set the whole content of the sequence.
-     *
-     * @param sequence The new content of the sequence.
-     * @see The Sequence constructor for information about the way sequences are internaly stored.
-     */
-    virtual void setContent(const std::string& sequence) throw (BadCharException);
-    void setContent(const std::vector<int>& list) throw (BadIntException)
-    {
-      BasicSymbolList::setContent(list);
-    }
-    void setContent(const std::vector<std::string>& list) throw (BadCharException)
-    {
-      BasicSymbolList::setContent(list);
-    }
-
-
-    /**
-     * @brief Set up the size of a sequence from the right side.
-     *
-     * All new characters are filled with gaps.
-     * If the specified size is < to the sequence size, the sequence will be truncated.
-     *
-     * @param newSize The new size of the sequence.
-     */
-    virtual void setToSizeR(size_t newSize);
-    
-    /**
-     * @brief Set up the size of a sequence from the left side.
-     *
-     * All new characters are filled with gaps.
-     * If the specified size is < to the sequence size, the sequence will be truncated.
-     *
-     * @param newSize The new size of the sequence.
-     */
-    virtual void setToSizeL(size_t newSize);
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadIntException If the content does not match the current alphabet.
-     */
-    virtual void append(const std::vector<int>& content) throw (BadIntException);
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadCharException If the content does not match the current alphabet.
-     */
-    virtual void append(const std::vector<std::string>& content) throw (BadCharException);
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadCharException If the content does not match the current alphabet.
-     */
-    virtual void append(const std::string& content) throw (BadCharException);
-
-    /** @} */
-
-};
-
-} //end of namespace bpp.
-
-#endif // _SEQUENCE_H_
-
diff --git a/src/Bpp/Seq/SequenceExceptions.h b/src/Bpp/Seq/SequenceExceptions.h
deleted file mode 100644
index f1a4acf..0000000
--- a/src/Bpp/Seq/SequenceExceptions.h
+++ /dev/null
@@ -1,161 +0,0 @@
-//
-// File: SequenceExceptions.h
-// Created by: Julien Dutheil
-// Created on: Mon Nov  3 16:35:30 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEEXCEPTIONS_H_
-#define _SEQUENCEEXCEPTIONS_H_
-
-#include "Alphabet/Alphabet.h"
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-class Sequence;
-
-/**
- * @brief The sequence exception base class.
- *
- * @see Exception
- */
-class SequenceException :
-  public Exception
-{
-	private:
-
-		/**
-		 * @brief A pointer toward a sequence object.
-		 */
-		const Sequence* sequence_;
-	
-	public:
-        
-		/**
-		 * @brief Build a new SequenceException object.
-		 *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param seq A const pointer toward the sequence that threw the exception.
-		 */
-		SequenceException(const std::string& text, const Sequence * seq = 0);
-		
-    SequenceException(const SequenceException& se): Exception(se), sequence_(se.sequence_) {}
-    SequenceException& operator=(const SequenceException& se)
-    {
-      Exception::operator=(se);
-      sequence_ = se.sequence_;
-      return *this;
-    }
-	
-		virtual ~SequenceException() throw() {}
-	
-	public:
-    
-		/**
-		 * @brief Get the sequence that threw the exception.
-		 *
-		 * @return A const pointer toward the sequence.
-		 */
-		virtual const Sequence* getSequence() const { return sequence_; }
-};
-
-/**
- * @brief Exception thrown when a sequence is found to be empty and it should not.
- */
-class EmptySequenceException :
-  public SequenceException
-{
-
-	public:
-     
-		/**
-		 * @brief Build a new EmptySequenceException object.
-         *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param seq A const pointer toward the sequence that threw the exception.
-		 */
-		EmptySequenceException(const std::string& text, const Sequence* seq = 0);
-	
-		virtual ~EmptySequenceException() throw() {}
-};
-
-/**
- * @brief Exception thrown when a sequence is found to have gap and it should not.
- */
-class SequenceWithGapException :
-  public SequenceException
-{
-
-	public:
-    
-		/**
-		 * @brief Build a new SequenceWithGapException object.
-     *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param seq A const pointer toward the sequence that threw the exception.
-		 */
-		SequenceWithGapException(const std::string& text, const Sequence* seq = 0);
-	
-		virtual ~SequenceWithGapException() throw() {}
-};
-
-/**
- * @brief Exception thrown when a sequence is not align with others.
- *
- * Typically, this may occur when you try to add a bad sequence to a site container.
- */
-class SequenceNotAlignedException :
-  public SequenceException
-{
-
-	public:
-    
-		/**
-     * @brief Build a new SequenceNotAlignedException object.
-     *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param seq  A const pointer toward the sequence that threw the exception.
-     */
-    SequenceNotAlignedException(const std::string& text, const Sequence* seq);
-	
-		virtual ~SequenceNotAlignedException() throw() {}
-};
-
-} //end of namespace bpp.
-
-#endif	//_SEQUENCEEXCEPTIONS_H_
-
diff --git a/src/Bpp/Seq/SequencePositionIterators.cpp b/src/Bpp/Seq/SequencePositionIterators.cpp
deleted file mode 100644
index 221eb29..0000000
--- a/src/Bpp/Seq/SequencePositionIterators.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-// 
-// File:    SequencePositionIterators.cpp
-// Author:  Sylvain Gaillard
-// Created: 23/06/2009 11:38:27
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (June 23, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SequencePositionIterators.h"
-
-using namespace bpp;
-using namespace std; // for the STL
-
-/******************************************************************************/
-
-bool AbstractSequencePositionIterator::operator==(const SequencePositionIterator& it) const {
-  return this->getPosition() == it.getPosition();
-}
-
-/******************************************************************************/
-
-bool AbstractSequencePositionIterator::operator!=(const SequencePositionIterator& it) const {
-  return this->getPosition() != it.getPosition();
-}
-
-/******************************************************************************/
-
-void AbstractSequencePositionIterator::setPosition(unsigned int pos) {
-  this->currentPosition_ = pos;
-}
-
-/******************************************************************************/
-
-const Sequence & AbstractSequencePositionIterator::getSequence() const {
-  return * (this->sequence_);
-}
-
-/******************************************************************************/
-
-unsigned int AbstractSequencePositionIterator::getPosition() const {
-  return this->currentPosition_;
-}
-
-/******************************************************************************/
-
-int AbstractSequencePositionIterator::getValue() const {
-  return this->sequence_->getValue(this->currentPosition_);
-}
-
-/******************************************************************************/
-
-string AbstractSequencePositionIterator::getChar() const {
-  return this->sequence_->getChar(this->currentPosition_);
-}
-
-
-//===============================
-// SimpleSequencePositionIterator
-//===============================
-/******************************************************************************/
-
-SimpleSequencePositionIterator::SimpleSequencePositionIterator(const SequencePositionIterator& it):
-  AbstractSequencePositionIterator(it.getSequence(), it.getPosition()) {};
-
-/******************************************************************************/
-
-SimpleSequencePositionIterator& SimpleSequencePositionIterator::operator++() {
-  this->setPosition(this->getPosition() + 1);
-  return *this;
-}
-
-/******************************************************************************/
-
-SimpleSequencePositionIterator SimpleSequencePositionIterator::operator++(int i) {
-  SimpleSequencePositionIterator ans = *this;
-  ++(*this);
-  return ans;
-}
-
-/******************************************************************************/
-
-SimpleSequencePositionIterator& SimpleSequencePositionIterator::operator+=(int i) {
-  if (i > 0)
-    this->setPosition(this->getPosition() + static_cast<unsigned int>(i));
-  else if (i < 0) {
-    unsigned int d = static_cast<unsigned int>(-i);
-    if (d > this->getPosition())
-      throw Exception("SimpleSequencePositionIterator::operator+=. Negative increment too large.");
-    else
-      this->setPosition(this->getPosition() - d);
-  }
-  return *this;
-}
-
-/******************************************************************************/
-
-SimpleSequencePositionIterator& SimpleSequencePositionIterator::operator-=(int i) {
-  return (*this) += -i;
-}
-
-/******************************************************************************/
-
-SimpleSequencePositionIterator SimpleSequencePositionIterator::operator+(int i) const {
-  SimpleSequencePositionIterator res(*this);
-  res += i;
-  return res;
-}
-
-/******************************************************************************/
-
-SimpleSequencePositionIterator SimpleSequencePositionIterator::operator-(int i) const {
-  return (*this) + (- i);
-}
-
-/******************************************************************************/
-
-bool SimpleSequencePositionIterator::hasMorePositions() const {
-  return (this->getPosition() < this->getSequence().size());
-}
-/******************************************************************************/
diff --git a/src/Bpp/Seq/SequencePositionIterators.h b/src/Bpp/Seq/SequencePositionIterators.h
deleted file mode 100644
index 5dd2ed6..0000000
--- a/src/Bpp/Seq/SequencePositionIterators.h
+++ /dev/null
@@ -1,210 +0,0 @@
-// 
-// File:    SequencePositionIterators.h
-// Author:  Sylvain Gaillard
-// Created: 23/06/2009 10:35:28
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (June 23, 2009)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEPOSITIONITERATORS_H_
-#define _SEQUENCEPOSITIONITERATORS_H_
-
-// from STL
-#include <string>
-
-#include "Sequence.h"
-
-namespace bpp
-{
-
-  /**
-   * @brief Loop over a Sequence.
-   *
-   * This is the SequencePositionIterator interface.
-   *
-   * @author Sylvain Gaillard
-   */
-  class SequencePositionIterator
-  {
-    public:
-      SequencePositionIterator() {}
-      virtual ~SequencePositionIterator() {}
-
-    public: 
-      /**
-       * @brief Get the actual position of the iterator in the Sequence.
-       */
-      virtual unsigned int getPosition() const = 0;
-      /**
-       * @brief Set the position of the iterator.
-       * @param pos The position on the Sequence
-       */
-      virtual void setPosition(unsigned int pos) = 0;
-      /**
-       * @brief Get the numerical value of the Sequence at current position.
-       */
-      virtual int getValue() const = 0;
-      /**
-       * @brief Get the textual value of the Sequence at current position.
-       */
-      virtual std::string getChar() const = 0; 
-
-      virtual bool operator==(const SequencePositionIterator & it) const = 0;
-      virtual bool operator!=(const SequencePositionIterator & it) const = 0;
-      virtual SequencePositionIterator & operator+=(int i) = 0;
-      virtual SequencePositionIterator & operator-=(int i) = 0;
-      virtual SequencePositionIterator& operator++() = 0;
-
-      /**
-       * @brief Tells if there is more positions in the Sequence.
-       * @return true if there is more positions in the Sequence
-       */
-      virtual bool hasMorePositions() const = 0;
-      /**
-       * @brief Get the Sequence on which the iterator loops.
-       * @return A reference toward the Sequence object.
-       */
-      virtual const Sequence & getSequence() const = 0;
-  };
-
-  /**
-   * @brief Partial implementation of the SequencePositionIterator interface.
-   *
-   * @author Sylvain Gaillard
-   */
-  class AbstractSequencePositionIterator :
-    public virtual SequencePositionIterator
-  {
-    private:
-      const Sequence* sequence_;
-      unsigned int currentPosition_;
-
-
-    public:
-      AbstractSequencePositionIterator(const Sequence& seq, unsigned int pos = 0) :
-        sequence_(&seq), currentPosition_(pos) {}
-      
-      AbstractSequencePositionIterator(const AbstractSequencePositionIterator& aspi) :
-        sequence_(aspi.sequence_), currentPosition_(aspi.currentPosition_) {}
-      
-      AbstractSequencePositionIterator& operator=(const AbstractSequencePositionIterator& aspi)
-      {
-        sequence_ = aspi.sequence_;
-        currentPosition_ = aspi.currentPosition_;
-        return *this;
-      }
-      
-      virtual ~AbstractSequencePositionIterator() {}
-
-    public:
-      
-      /**
-       * @name Comparison operators
-       *
-       * @{
-       */
-      bool operator==(const SequencePositionIterator& it) const;
-      bool operator!=(const SequencePositionIterator& it) const;
-      /** @} */
-
-      unsigned int getPosition() const;
-      void setPosition(unsigned int pos);
-      int getValue() const;
-      std::string getChar() const;
-      const Sequence& getSequence() const;
-  };
-
-  /**
-   * @brief Loop over all positions in a Sequence
-   *
-   * This is the simplest implementation of SequencePositionIterator.
-   * It just loops over all positions of a Sequence.
-   *
-   * @code
-   * Sequence seq = Sequence("seq1", "ATTCGATCCG-G", &AlphabetTools::DNA_ALPHABET);
-   * for (SimpleSequencePositionIterator it(seq) ; it.hasMorePositions() ; ++it) {
-   *   cout << it.getPosition() << " : " << it.getValue() << " (" << it.getChar() << ")" << endl;
-   * }
-   * @endcode
-   *
-   * @author Sylvain Gaillard
-   */
-  class SimpleSequencePositionIterator:
-    public AbstractSequencePositionIterator
-  {
-    public:
-      /**
-       * @name Constructors and destructor
-       *
-       * @{
-       */
-
-      /**
-       * @brief General constructor
-       *
-       * @param seq A reference toward the Sequence object we want to loop over
-       * @param pos Optional integer where to start on the Sequence object
-       *
-       */
-      SimpleSequencePositionIterator(const Sequence& seq, unsigned int pos = 0):
-        AbstractSequencePositionIterator(seq, pos) {}
-      /**
-       * @brief Copie constructor.
-       *
-       * @param it A reference toward a SequencePositionIterator
-       */
-      SimpleSequencePositionIterator(const SequencePositionIterator& it);
-      virtual ~SimpleSequencePositionIterator() {}
-       /** @} */
-
-    public:
-      /**
-       * @name Operators
-       *
-       * @{
-       */
-      SimpleSequencePositionIterator & operator++();
-      virtual SimpleSequencePositionIterator operator++(int i);
-      SimpleSequencePositionIterator & operator+=(int i);
-      SimpleSequencePositionIterator & operator-=(int i);
-      virtual SimpleSequencePositionIterator operator+(int i) const;
-      virtual SimpleSequencePositionIterator operator-(int i) const;
-       /** @} */
-
-      bool hasMorePositions() const;
-  };
-
-}
-
-#endif //_SEQUENCEPOSITIONITERATORS_H_
diff --git a/src/Bpp/Seq/SequenceTools.cpp b/src/Bpp/Seq/SequenceTools.cpp
deleted file mode 100644
index 60b852c..0000000
--- a/src/Bpp/Seq/SequenceTools.cpp
+++ /dev/null
@@ -1,727 +0,0 @@
-//
-// File: SequenceTools.cpp
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Aug 21 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "SequenceTools.h"
-
-#include "Alphabet/AlphabetTools.h"
-#include "StringSequenceTools.h"
-#include <Bpp/Numeric/Matrix/Matrix.h>
-#include <Bpp/Numeric/VectorTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <ctype.h>
-#include <cmath>
-#include <list>
-#include <iostream>
-
-using namespace std;
-
-DNA SequenceTools::_DNA;
-RNA SequenceTools::_RNA;
-RNY SequenceTools::_RNY(_DNA);
-NucleicAcidsReplication SequenceTools::_DNARep(&_DNA, &_DNA);
-NucleicAcidsReplication SequenceTools::_RNARep(&_RNA, &_RNA);
-NucleicAcidsReplication SequenceTools::_transc(&_DNA, &_RNA);
-
-/******************************************************************************/
-
-Sequence* SequenceTools::subseq(const Sequence& sequence, size_t begin, size_t end) throw (IndexOutOfBoundsException, Exception)
-{
-  // Checking interval
-  if (end >= sequence.size())
-    throw IndexOutOfBoundsException ("SequenceTools::subseq : Invalid upper bound", end, 0, sequence.size());
-  if (end < begin)
-    throw Exception ("SequenceTools::subseq : Invalid interval");
-
-  // Copy sequence
-  vector<int> temp(sequence.getContent());
-
-  // Truncate sequence
-  temp.erase(temp.begin() + static_cast<ptrdiff_t>(end + 1), temp.end());
-  temp.erase(temp.begin(), temp.begin() + static_cast<ptrdiff_t>(begin));
-
-  // New sequence creation
-  return new BasicSequence(sequence.getName(), temp, sequence.getComments(), sequence.getAlphabet());
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::concatenate(const Sequence& seq1, const Sequence& seq2) throw (AlphabetMismatchException, Exception)
-{
-  // Sequence's alphabets matching verification
-  if ((seq1.getAlphabet()->getAlphabetType()) != (seq2.getAlphabet()->getAlphabetType()))
-    throw AlphabetMismatchException("SequenceTools::concatenate : Sequence's alphabets don't match ", seq1.getAlphabet(), seq2.getAlphabet());
-
-  // Sequence's names matching verification
-  if (seq1.getName() != seq2.getName())
-    throw Exception ("SequenceTools::concatenate : Sequence's names don't match");
-
-  // Concatenate sequences and send result
-  vector<int> sequence  = seq1.getContent();
-  vector<int> sequence2 = seq2.getContent();
-  sequence.insert(sequence.end(), sequence2.begin(), sequence2.end());
-  return new BasicSequence(seq1.getName(), sequence, seq1.getComments(), seq1.getAlphabet());
-}
-
-/******************************************************************************/
-
-Sequence& SequenceTools::complement(Sequence& seq) throw (AlphabetException)
-{
-  // Alphabet type checking
-  NucleicAcidsReplication* NAR;
-  if (seq.getAlphabet()->getAlphabetType() == "DNA alphabet")
-  {
-    NAR = &_DNARep;
-  }
-  else if (seq.getAlphabet()->getAlphabetType() == "RNA alphabet")
-  {
-    NAR = &_RNARep;
-  }
-  else
-  {
-    throw AlphabetException("SequenceTools::complement: Sequence must be nucleic.", seq.getAlphabet());
-  }
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    seq.setElement(i, NAR->translate(seq.getValue(i)));
-  }
-  return seq;
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::getComplement(const Sequence& sequence) throw (AlphabetException)
-{
-  // Alphabet type checking
-  NucleicAcidsReplication* NAR;
-  if (sequence.getAlphabet()->getAlphabetType() == "DNA alphabet")
-  {
-    NAR = &_DNARep;
-  }
-  else if (sequence.getAlphabet()->getAlphabetType() == "RNA alphabet")
-  {
-    NAR = &_RNARep;
-  }
-  else
-  {
-    throw AlphabetException ("SequenceTools::getComplement: Sequence must be nucleic.", sequence.getAlphabet());
-  }
-
-  return NAR->translate(sequence);
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::transcript(const Sequence& sequence) throw (AlphabetException)
-{
-  // Alphabet type checking
-  if (sequence.getAlphabet()->getAlphabetType() != "DNA alphabet")
-  {
-    throw AlphabetException ("SequenceTools::transcript : Sequence must be DNA", sequence.getAlphabet());
-  }
-
-  return _transc.translate(sequence);
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::reverseTranscript(const Sequence& sequence) throw (AlphabetException)
-{
-  // Alphabet type checking
-  if (sequence.getAlphabet()->getAlphabetType() != "RNA alphabet")
-  {
-    throw AlphabetException ("SequenceTools::reverseTranscript : Sequence must be RNA", sequence.getAlphabet());
-  }
-
-  return _transc.reverse(sequence);
-}
-
-/******************************************************************************/
-
-Sequence& SequenceTools::invert(Sequence& seq)
-{
-  size_t seq_size = seq.size(); // store seq size for efficiency
-  int tmp_state = 0; // to store one state when swapping positions
-  size_t j = seq_size; // symetric position iterator from sequence end
-  for (size_t i = 0; i < seq_size / 2; i++)
-  {
-    j = seq_size - 1 - i;
-    tmp_state = seq.getValue(i);
-    seq.setElement(i, seq.getValue(j));
-    seq.setElement(j, tmp_state);
-  }
-  return seq;
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::getInvert(const Sequence& sequence)
-{
-  Sequence* iSeq = sequence.clone();
-  invert(*iSeq);
-  return iSeq;
-}
-
-/******************************************************************************/
-
-Sequence& SequenceTools::invertComplement(Sequence& seq)
-{
-  // Alphabet type checking
-  NucleicAcidsReplication* NAR;
-  if (seq.getAlphabet()->getAlphabetType() == "DNA alphabet")
-  {
-    NAR = &_DNARep;
-  }
-  else if (seq.getAlphabet()->getAlphabetType() == "RNA alphabet")
-  {
-    NAR = &_RNARep;
-  }
-  else
-  {
-    throw AlphabetException("SequenceTools::complement: Sequence must be nucleic.", seq.getAlphabet());
-  }
-  // for (size_t i = 0 ; i < seq.size() ; i++) {
-  //  seq.setElement(i, NAR->translate(seq.getValue(i)));
-  // }
-  size_t seq_size = seq.size(); // store seq size for efficiency
-  int tmp_state = 0; // to store one state when swapping positions
-  size_t j = seq_size; // symetric position iterator from sequence end
-  for (size_t i = 0; i < seq_size / 2; i++)
-  {
-    j = seq_size - 1 - i;
-    tmp_state = seq.getValue(i);
-    seq.setElement(i, NAR->translate(seq.getValue(j)));
-    seq.setElement(j, NAR->translate(tmp_state));
-  }
-  if (seq_size % 2)   // treate the state in the middle of odd sequences
-  {
-    seq.setElement(seq_size / 2, NAR->translate(seq.getValue(seq_size / 2)));
-  }
-  return seq;
-}
-
-/******************************************************************************/
-
-double SequenceTools::getPercentIdentity(const Sequence& seq1, const Sequence& seq2, bool ignoreGaps) throw (AlphabetMismatchException, SequenceNotAlignedException)
-{
-  if (seq1.getAlphabet()->getAlphabetType() != seq2.getAlphabet()->getAlphabetType())
-    throw AlphabetMismatchException("SequenceTools::getPercentIdentity", seq1.getAlphabet(), seq2.getAlphabet());
-  if (seq1.size() != seq2.size())
-    throw SequenceNotAlignedException("SequenceTools::getPercentIdentity", &seq2);
-  int gap = seq1.getAlphabet()->getGapCharacterCode();
-  size_t id = 0;
-  size_t tot = 0;
-  for (size_t i = 0; i < seq1.size(); i++)
-  {
-    int x = seq1.getValue(i);
-    int y = seq2.getValue(i);
-    if (ignoreGaps)
-    {
-      if (x != gap && y != gap)
-      {
-        tot++;
-        if (x == y)
-          id++;
-      }
-    }
-    else
-    {
-      tot++;
-      if (x == y)
-        id++;
-    }
-  }
-  return static_cast<double>(id) / static_cast<double>(tot) * 100.;
-}
-
-/******************************************************************************/
-
-size_t SequenceTools::getNumberOfSites(const Sequence& seq)
-{
-  size_t count = 0;
-  const Alphabet* alpha = seq.getAlphabet();
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (!alpha->isGap(seq[i]))
-      count++;
-  }
-  return count;
-}
-
-/******************************************************************************/
-
-size_t SequenceTools::getNumberOfCompleteSites(const Sequence& seq)
-{
-  size_t count = 0;
-  const Alphabet* alpha = seq.getAlphabet();
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (!alpha->isGap(seq[i]) && !alpha->isUnresolved(seq[i]))
-      count++;
-  }
-  return count;
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::getSequenceWithCompleteSites(const Sequence& seq)
-{
-  const Alphabet* alpha = seq.getAlphabet();
-  vector<int> content;
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (!(alpha->isGap(seq[i]) || alpha->isUnresolved(seq[i])))
-      content.push_back(seq[i]);
-  }
-  Sequence* newSeq = dynamic_cast<Sequence*>(seq.clone());
-  newSeq->setContent(content);
-  return newSeq;
-}
-
-/******************************************************************************/
-
-size_t SequenceTools::getNumberOfUnresolvedSites(const Sequence& seq)
-{
-  size_t count = 0;
-  const Alphabet* alpha = seq.getAlphabet();
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (alpha->isUnresolved(seq[i]))
-      count++;
-  }
-  return count;
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::getSequenceWithoutGaps(const Sequence& seq)
-{
-  const Alphabet* alpha = seq.getAlphabet();
-  vector<int> content;
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (!alpha->isGap(seq[i]))
-      content.push_back(seq[i]);
-  }
-  Sequence* newSeq = dynamic_cast<Sequence*>(seq.clone());
-  newSeq->setContent(content);
-  return newSeq;
-}
-
-/******************************************************************************/
-
-void SequenceTools::removeGaps(Sequence& seq)
-{
-  const Alphabet* alpha = seq.getAlphabet();
-  for (size_t i = seq.size(); i > 0; --i)
-  {
-    if (alpha->isGap(seq[i - 1]))
-      seq.deleteElement(i - 1);
-  }
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::getSequenceWithoutStops(const Sequence& seq, const GeneticCode& gCode) throw (Exception)
-{
-  const CodonAlphabet* calpha = dynamic_cast<const CodonAlphabet*>(seq.getAlphabet());
-  if (!calpha)
-    throw Exception("SequenceTools::getSequenceWithoutStops. Input sequence should have a codon alphabet.");
-  vector<int> content;
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    if (!gCode.isStop(seq[i]))
-      content.push_back(seq[i]);
-  }
-  Sequence* newSeq = dynamic_cast<Sequence*>(seq.clone());
-  newSeq->setContent(content);
-  return newSeq;
-}
-
-/******************************************************************************/
-
-void SequenceTools::removeStops(Sequence& seq, const GeneticCode& gCode) throw (Exception)
-{
-  const CodonAlphabet* calpha = dynamic_cast<const CodonAlphabet*>(seq.getAlphabet());
-  if (!calpha)
-    throw Exception("SequenceTools::removeStops. Input sequence should have a codon alphabet.");
-  for (size_t i = seq.size(); i > 0; --i)
-  {
-    if (gCode.isStop(seq[i - 1]))
-      seq.deleteElement(i - 1);
-  }
-}
-
-/******************************************************************************/
-
-void SequenceTools::replaceStopsWithGaps(Sequence& seq, const GeneticCode& gCode) throw (Exception)
-{
-  const CodonAlphabet* calpha = dynamic_cast<const CodonAlphabet*>(seq.getAlphabet());
-  if (!calpha)
-    throw Exception("SequenceTools::replaceStopsWithGaps. Input sequence should have a codon alphabet.");
-  int gap = calpha->getGapCharacterCode();
-  for (size_t i = 0; i < seq.size(); ++i)
-  {
-    if (gCode.isStop(seq[i]))
-      seq.setElement(i, gap);
-  }
-}
-
-/******************************************************************************/
-
-BowkerTest* SequenceTools::bowkerTest(const Sequence& seq1, const Sequence& seq2)
-throw (SequenceNotAlignedException)
-{
-  if (seq1.size() != seq2.size())
-    throw SequenceNotAlignedException("SequenceTools::bowkerTest.", &seq2);
-  size_t n = seq1.size();
-  const Alphabet* alpha = seq1.getAlphabet();
-  unsigned int r = alpha->getSize();
-
-  // Compute contingency table:
-  RowMatrix<double> array(r, r);
-  int x, y;
-  for (size_t i = 0; i < n; i++)
-  {
-    x = seq1[i];
-    y = seq2[i];
-    if (!alpha->isGap(x) && !alpha->isUnresolved(x)
-        && !alpha->isGap(y) && !alpha->isUnresolved(y))
-    {
-      array(static_cast<size_t>(x), static_cast<size_t>(y))++;
-    }
-  }
-
-  // Compute Bowker's statistic:
-  double sb2 = 0, nij, nji;
-  for (unsigned int i = 1; i < r; ++i)
-  {
-    for (unsigned int j = 0; j < i; ++j)
-    {
-      nij = array(i, j);
-      nji = array(j, i);
-      if (nij != 0 || nji != 0)
-      {
-        sb2 += pow(nij - nji, 2) / (nij + nji);
-      }
-      // Else: we should display a warning there.
-    }
-  }
-
-  // Compute p-value:
-  double pvalue = 1. - RandomTools::pChisq(sb2, (r - 1) * r / 2);
-
-  // Return results:
-  BowkerTest* test = new BowkerTest();
-  test->setStatistic(sb2);
-  test->setPValue(pvalue);
-  return test;
-}
-
-/******************************************************************************/
-
-void SequenceTools::getPutativeHaplotypes(const Sequence& seq, std::vector<Sequence*>& hap, unsigned int level)
-{
-  vector< vector< int > > states(seq.size());
-  list<Sequence*> t_hap;
-  const Alphabet* alpha = seq.getAlphabet();
-  unsigned int hap_count = 1;
-  // Vector of available states at each position
-  for (size_t i = 0; i < seq.size(); i++)
-  {
-    vector<int> st = alpha->getAlias(seq[i]);
-    if (!st.size())
-    {
-      st.push_back(alpha->getGapCharacterCode());
-    }
-    if (st.size() <= level)
-    {
-      states[i] = st;
-    }
-    else
-    {
-      states[i] = vector<int>(1, seq[i]);
-    }
-  }
-  // Combinatorial haplotypes building (the use of tree may be more accurate)
-  t_hap.push_back(new BasicSequence(seq.getName() + "_hap" + TextTools::toString(hap_count++), "", alpha));
-  for (size_t i = 0; i < states.size(); i++)
-  {
-    for (list<Sequence*>::iterator it = t_hap.begin(); it != t_hap.end(); it++)
-    {
-      for (unsigned int j = 0; j < states[i].size(); j++)
-      {
-        Sequence* tmp_seq = new BasicSequence(seq.getName() + "_hap", (**it).getContent(), alpha);
-        if (j < states[i].size() - 1)
-        {
-          tmp_seq->setName(tmp_seq->getName() + TextTools::toString(hap_count++));
-          tmp_seq->addElement(states[i][j]);
-          t_hap.insert(it, tmp_seq);
-        }
-        else
-        {
-          (**it).addElement(states[i][j]);
-        }
-      }
-    }
-  }
-  for (list<Sequence*>::reverse_iterator it = t_hap.rbegin(); it != t_hap.rend(); it++)
-  {
-    hap.push_back(*it);
-  }
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::combineSequences(const Sequence& s1, const Sequence& s2) throw (AlphabetMismatchException)
-{
-  if (s1.getAlphabet()->getAlphabetType() != s2.getAlphabet()->getAlphabetType())
-  {
-    throw AlphabetMismatchException("SequenceTools::combineSequences(const Sequence& s1, const Sequence& s2): s1 and s2 don't have same Alphabet.", s1.getAlphabet(), s2.getAlphabet());
-  }
-  const Alphabet* alpha = s1.getAlphabet();
-  vector<int> st;
-  vector<int> seq;
-  size_t length = NumTools::max(s1.size(), s2.size());
-  for (size_t i = 0; i < length; i++)
-  {
-    if (i < s1.size())
-      st.push_back(s1.getValue(i));
-    if (i < s2.size())
-      st.push_back(s2.getValue(i));
-    seq.push_back(alpha->getGeneric(st));
-    st.clear();
-  }
-  Sequence* s = new BasicSequence(s1.getName() + "+" + s2.getName(), seq, alpha);
-  return s;
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::subtractHaplotype(const Sequence& s, const Sequence& h, string name, unsigned int level) throw (SequenceNotAlignedException)
-{
-  const Alphabet* alpha = s.getAlphabet();
-  if (name.size() == 0)
-    name = s.getName() + "_haplotype";
-  string seq;
-  if (s.size() != h.size())
-    throw SequenceNotAlignedException("SequenceTools::subtractHaplotype: haplotype must be aligned with the sequence.", &h);
-  for (unsigned int i = 0; i < s.size(); ++i)
-  {
-    string c;
-    vector<int> nucs = alpha->getAlias(s.getValue(i));
-    if (nucs.size() > 1)
-    {
-      remove(nucs.begin(), nucs.end(), h.getValue(i));
-      nucs = vector<int>(nucs.begin(), nucs.end() - 1);
-    }
-    else
-    {
-      nucs = vector<int>(nucs.begin(), nucs.end());
-    }
-    c = alpha->intToChar(alpha->getGeneric(nucs));
-    if (level <= nucs.size() && (alpha->isUnresolved(s.getValue(i)) || alpha->isUnresolved(h.getValue(i))))
-    {
-      c = alpha->intToChar(alpha->getUnknownCharacterCode());
-    }
-    seq += c;
-  }
-  Sequence* hap = new BasicSequence(name, seq, alpha);
-  return hap;
-}
-
-/******************************************************************************/
-
-Sequence* SequenceTools::RNYslice(const Sequence& seq, int ph) throw (AlphabetException)
-{
-  // Alphabet type checking
-  if (seq.getAlphabet()->getAlphabetType() != "DNA alphabet")
-  {
-    throw AlphabetException ("SequenceTools::transcript : Sequence must be DNA", seq.getAlphabet());
-  }
-
-  if ((ph < 1) || (ph > 3))
-    throw Exception("Bad phase for RNYSlice: " + TextTools::toString(ph) + ". Should be between 1 and 3.");
-
-  size_t s = seq.size();
-  size_t n = (s - static_cast<size_t>(ph) + 3) / 3;
-
-  vector<int> content(n);
-
-  int tir = seq.getAlphabet()->getGapCharacterCode();
-  size_t j;
-
-  for (size_t i = 0; i < n; i++)
-  {
-    j = i * 3 + static_cast<size_t>(ph) - 1;
-
-    if (j == 0)
-      content[i] = _RNY.getRNY(tir, seq[0], seq[1], *seq.getAlphabet());
-    else
-    {
-      if (j == s - 1)
-        content[i] = _RNY.getRNY(seq[j - 1], seq[j], tir, *seq.getAlphabet());
-      else
-        content[i] = _RNY.getRNY(seq[j - 1], seq[j], seq[j + 1], *seq.getAlphabet());
-    }
-  }
-
-  // New sequence creating, and sense reversing
-  Sequence* sq = new BasicSequence(seq.getName(), content,
-                                   seq.getComments(), &_RNY);
-
-  // Send result
-  return sq;
-}
-
-Sequence* SequenceTools::RNYslice(const Sequence& seq) throw (AlphabetException)
-{
-  // Alphabet type checking
-  if (seq.getAlphabet()->getAlphabetType() != "DNA alphabet")
-  {
-    throw AlphabetException ("SequenceTools::transcript : Sequence must be DNA", seq.getAlphabet());
-  }
-
-  size_t n = seq.size();
-
-  vector<int> content(n);
-
-  int tir = seq.getAlphabet()->getGapCharacterCode();
-
-  if (seq.size() >= 2)
-  {
-    content[0] = _RNY.getRNY(tir, seq[0], seq[1], *seq.getAlphabet());
-
-    for (unsigned int i = 1; i < n - 1; i++)
-    {
-      content[i] = _RNY.getRNY(seq[i - 1], seq[i], seq[i + 1],
-                               *seq.getAlphabet());
-    }
-
-    content[n - 1] = _RNY.getRNY(seq[n - 2], seq[n - 1], tir, *seq.getAlphabet());
-  }
-
-  // New sequence creating, and sense reversing
-  Sequence* s = new BasicSequence(seq.getName(), content,
-                                  seq.getComments(), &_RNY);
-
-  // Send result
-  return s;
-}
-
-/******************************************************************************/
-
-
-void SequenceTools::getCDS(Sequence& sequence, const GeneticCode& gCode, bool checkInit, bool checkStop, bool includeInit, bool includeStop)
-{
-  const CodonAlphabet* alphabet = dynamic_cast<const CodonAlphabet*>(sequence.getAlphabet());
-  if (!alphabet)
-    throw AlphabetException("SequenceTools::getCDS. Sequence is not a codon sequence.");
-  if (checkInit)
-  {
-    size_t i;
-    for (i = 0; i < sequence.size() && !gCode.isStart(sequence[i]); ++i)
-    {}
-    for (size_t j = 0; includeInit ? j < i : j <= i; ++j)
-    {
-      sequence.deleteElement(j);
-    }
-  }
-  if (checkStop)
-  {
-    size_t i;
-    for (i = 0; i < sequence.size() && !gCode.isStop(sequence[i]); ++i)
-    {}
-    for (size_t j = includeStop ? i + 1 : i; j < sequence.size(); ++j)
-    {
-      sequence.deleteElement(j);
-    }
-  }
-}
-
-/******************************************************************************/
-
-size_t SequenceTools::findFirstOf(const Sequence& seq, const Sequence& motif, bool strict)
-{
-  if (motif.size() > seq.size())
-    return seq.size();
-  for (size_t seqi = 0; seqi < seq.size() - motif.size() + 1; seqi++)
-  {
-    bool match = false;
-    for (size_t moti = 0; moti < motif.size(); moti++)
-    {
-      if (strict)
-      {
-        match = seq.getValue(seqi + moti) == motif.getValue(moti);
-      }
-      else
-      {
-        match = AlphabetTools::match(seq.getAlphabet(), seq.getValue(seqi + moti), motif.getValue(moti));
-      }
-      if (!match)
-      {
-        break;
-      }
-    }
-    if (match)
-    {
-      return seqi;
-    }
-  }
-  return seq.size();
-}
-
-/******************************************************************************/
-  
-Sequence* SequenceTools::getRandomSequence(const Alphabet* alphabet, size_t length)
-{
-  int s = static_cast<int>(alphabet->getSize());
-  vector<int> content(length);
-  for (size_t i = 0; i < length; ++i) {
-    content[i] = RandomTools::giveIntRandomNumberBetweenZeroAndEntry(s);
-  }
-  return new BasicSequence("random", content, alphabet);
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/SequenceTools.h b/src/Bpp/Seq/SequenceTools.h
deleted file mode 100644
index f1a646f..0000000
--- a/src/Bpp/Seq/SequenceTools.h
+++ /dev/null
@@ -1,435 +0,0 @@
-//
-// File: SequenceTools.h
-// Authors: Guillaume Deuchst
-//          Julien Dutheil
-//          Sylvain Gaillard
-// Created on: Tue Aug 21 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _SEQUENCETOOLS_H_
-#define _SEQUENCETOOLS_H_
-
-#include "Alphabet/Alphabet.h"
-#include "Alphabet/DNA.h"
-#include "Alphabet/RNA.h"
-#include "Alphabet/RNY.h"
-#include "GeneticCode/GeneticCode.h"
-#include "Sequence.h"
-#include "SymbolListTools.h"
-#include "NucleicAcidsReplication.h"
-#include <Bpp/Exceptions.h>
-#include <Bpp/Numeric/Random/RandomTools.h>
-#include <Bpp/Numeric/Stat/StatTest.h>
-
-// From the STL:
-#include <string>
-#include <map>
-#include <vector>
-#include <algorithm>
-
-namespace bpp
-{
-/**
- * @brief Bowker's homogeneity test results class.
- */
-class BowkerTest :
-  public StatTest
-{
-private:
-  double pvalue_;
-  double stat_;
-
-public:
-  BowkerTest() : pvalue_(1.),
-    stat_(0.) {}
-
-  virtual ~BowkerTest() {}
-
-  BowkerTest* clone() const { return new BowkerTest(*this); }
-
-public:
-  std::string getName() const { return "Bowker's test for homogeneity."; }
-  double getStatistic() const { return stat_; }
-  double getPValue() const { return pvalue_; }
-
-  void setStatistic(double stat) { stat_ = stat; }
-  void setPValue(double pvalue) { pvalue_ = pvalue; }
-};
-
-/**
- * @brief SequenceTools static class
- *
- * Implement methods to manipulate sequences
- */
-class SequenceTools :
-  public SymbolListTools
-{
-private:
-  static DNA _DNA;
-  static RNA _RNA;
-  static RNY _RNY;
-  static NucleicAcidsReplication _DNARep;
-  static NucleicAcidsReplication _RNARep;
-  static NucleicAcidsReplication _transc;
-
-public:
-  SequenceTools() {}
-  virtual ~SequenceTools() {}
-
-public:
-  /**
-   * @brief Get a sub-sequence.
-   *
-   * @param sequence The sequence to trunc.
-   * @param begin The first position of the subsequence.
-   * @param end   The last position of the subsequence.
-   * @return A new sequence object with the given subsequence.
-   * @throw IndexOutOfBoundsException, Exception In case of bad indices.
-   */
-  static Sequence* subseq(const Sequence& sequence, size_t begin, size_t end) throw (IndexOutOfBoundsException, Exception);
-
-  /**
-   * @brief Concatenate two sequences.
-   *
-   * Sequences must have the same name and alphabets.
-   * Only first sequence's commentaries are kept.
-   *
-   * @param seq1 The first sequence.
-   * @param seq2 The second sequence.
-   * @return A new sequence object with the concatenation of the two sequences.
-   * @throw AlphabetMismatchException If the two alphabets do not match.
-   * @throw Exception If the sequence names do not match.
-   */
-  static Sequence* concatenate(const Sequence& seq1, const Sequence& seq2)
-  throw (AlphabetMismatchException, Exception);
-
-  /**
-   * @brief Complement the nucleotide sequence itself
-   *
-   * @param seq The sequence to be complemented.
-   * @return A ref toward the complemented sequence.
-   * @throw AlphabetException if the sequence is not a nucleotide sequence.
-   * @author Sylvain Gaillard
-   */
-  static Sequence& complement(Sequence& seq) throw (AlphabetException);
-
-  /**
-   * @brief Get the complementary sequence of a nucleotide sequence.
-   *
-   * @see DNAReplication
-   * @return A new sequence object with the complementary sequence.
-   * @param sequence The sequence to complement.
-   * @throw AlphabetException If the sequence is not a nucleotide sequence.
-   */
-  static Sequence* getComplement(const Sequence& sequence) throw (AlphabetException);
-
-  /**
-   * @brief Get the transcription sequence of a DNA sequence.
-   *
-   * Translate DNA sequence into RNA sequence.
-   *
-   * @see DNAReplication
-   * @return sequence A new sequence object with the transcription sequence.
-   * @param sequence The sequence to transcript.
-   * @throw AlphabetException If the sequence is not a DNA sequence.
-   */
-  static Sequence* transcript(const Sequence& sequence) throw (AlphabetException);
-
-  /**
-   * @brief Get the reverse-transcription sequence of a RNA sequence.
-   *
-   * Translate RNA sequence into DNA sequence.
-   *
-   * @see DNAReplication
-   * @return sequence A new sequence object with the reverse-transcription sequence.
-   * @param sequence The sequence to reverse-transcript.
-   * @throw AlphabetException If the sequence is not a RNA sequence.
-   */
-  static Sequence* reverseTranscript(const Sequence& sequence) throw (AlphabetException);
-
-  /**
-   * @brief Inverse a sequence from 5'->3' to 3'->5' and vice-versa.
-   *
-   * ABCDEF becomes FEDCBA, and the sense attribute is changed (may be
-   * inhibited).
-   *
-   * @param seq The sequence to inverse.
-   * @return A ref toward the sequence.
-   * @author Sylvain Gaillard
-   */
-  static Sequence& invert(Sequence& seq);
-
-  /**
-   * @brief Inverse a sequence from 5'->3' to 3'->5' and vice-versa.
-   *
-   * ABCDEF becomes FEDCBA, and the sense attribute is changed (may be
-   * inhibited).
-   *
-   * @param sequence The sequence to inverse.
-   * @return A new sequence object containing the inverted sequence.
-   * @author Sylvain Gaillard
-   */
-  static Sequence* getInvert(const Sequence& sequence);
-
-  /**
-   * @brief Inverse and complement a sequence.
-   *
-   * This methode is more accurate than calling invert and complement
-   * separatly.
-   *
-   * @param seq The sequence to inverse and complement.
-   * @return A ref toward the sequence.
-   * @author Sylvain Gaillard
-   */
-  static Sequence& invertComplement(Sequence& seq);
-
-  /**
-   * @return The identity percent of 2 sequence.
-   * One match is counted if the two sequences have identical states.
-   * @param seq1 The first sequence.
-   * @param seq2 The second sequence.
-   * @param ignoreGaps If true, only positions without gaps will be used for the counting.
-   * @throw AlphabetMismatchException If the two sequences do not have the same alphabet.
-   * @throw SequenceNotAlignedException If the two sequences do not have the same length.
-   */
-  static double getPercentIdentity(const Sequence& seq1, const Sequence& seq2, bool ignoreGaps = false) throw (AlphabetMismatchException, SequenceNotAlignedException);
-
-  /**
-   * @return The number of sites in the sequences, <i>i.e.</i> all positions without gaps.
-   *
-   * @param seq The sequence to analyse.
-   */
-  static size_t getNumberOfSites(const Sequence& seq);
-
-  /**
-   * @return The number of complete sites in the sequences, <i>i.e.</i> all positions without gaps and unresolved states (generic characters).
-   *
-   * @param seq The sequence to analyse.
-   */
-  static size_t getNumberOfCompleteSites(const Sequence& seq);
-
-  /**
-   * @brief keep only complete sites in a sequence.
-   *
-   * The deleteElement method of the Sequence object will be used where appropriate.
-   * @param seq The sequence to analyse.
-   */
-  
-  static Sequence* getSequenceWithCompleteSites(const Sequence& seq);
-
-  /**
-   * @return The number of unresolved sites in the sequence.
-   *
-   * @param seq The sequence to analyse.
-   *
-   * @author Sylvain Gaillard
-   */
-  
-  static size_t getNumberOfUnresolvedSites(const Sequence& seq);
-
-
-  /**
-   * @brief Remove gaps from a sequence.
-   *
-   * The deleteElement method of the Sequence object will be used where appropriate.
-   * @param seq The sequence to analyse.
-   */
-  static void removeGaps(Sequence& seq);
-
-  /**
-   * @brief Get a copy of the sequence without gaps.
-   *
-   * A whole new sequence will be created by adding all non-gap positions.
-   * The original sequence will be cloned to serve as a template.
-   *
-   * @param seq The sequence to analyse.
-   * @return A new sequence object without gaps.
-   */
-  static Sequence* getSequenceWithoutGaps(const Sequence& seq);
-
-  /**
-   * @brief Remove stops from a codon sequence.
-   *
-   * The deleteElement method of the Sequence object will be used where appropriate.
-   * @param seq The sequence to analyse.
-   * @param gCode The genetic code according to which stop codons are specified.
-   * @throw Exception if the input sequence does not have a codon alphabet.
-   */
-  static void removeStops(Sequence& seq, const GeneticCode& gCode) throw (Exception);
-
-  /**
-   * @brief Get a copy of the codon sequence without stops.
-   *
-   * A whole new sequence will be created by adding all non-stop positions.
-   * The original sequence will be cloned to serve as a template.
-   *
-   * @param seq The sequence to analyse.
-   * @param gCode The genetic code according to which stop codons are specified.
-   * @return A new sequence object without stops.
-   * @throw Exception if the input sequence does not have a codon alphabet.
-   */
-  static Sequence* getSequenceWithoutStops(const Sequence& seq, const GeneticCode& gCode) throw (Exception);
-
-  /**
-   * @brief Replace stop codons by gaps.
-   *
-   * The setElement method of the Sequence object will be used where appropriate.
-   * @param seq The sequence to analyse.
-   * @param gCode The genetic code according to which stop codons are specified.
-   * @throw Exception if the input sequence does not have a codon alphabet.
-   */
-  static void replaceStopsWithGaps(Sequence& seq, const GeneticCode& gCode) throw (Exception);
-
-  /**
-   * @brief Bowker's test for homogeneity.
-   *
-   * Computes the contingency table of occurrence of all pairs of states and test its symmetry using Bowker's (1948) test.
-   *
-   * Reference:<br>
-   * @code
-   * Ababneh F. Bioinformatics 2006 22(10) 1225-1231
-   * @endcode
-   *
-   * @param seq1 The first sequence.
-   * @param seq2 The second sequence.
-   * @return A BowkerTest object with the computed statistic and p-value (computed from a chi square distribution).
-   * @throw SequenceNotAlignedException If the two sequences do not have the same length.
-   */
-  static BowkerTest* bowkerTest(const Sequence& seq1, const Sequence& seq2) throw (SequenceNotAlignedException);
-
-  /**
-   * @brief Get all putatives haplotypes from an heterozygous sequence.
-   *
-   * @param seq The sequence to resolve
-   * @param hap The vector to fill with the new sequences
-   * @param level The maximum number of states that a generic char must code
-   * (if this number is higher than level, the state will not be resolved).
-   * For instance if level = 3 and Alphabet is DNA, all generic char will be
-   * resolved but N.
-   *
-   * @author Sylvain Gaillard
-   */
-  static void getPutativeHaplotypes(const Sequence& seq, std::vector<Sequence*>& hap, unsigned int level = 2);
-
-  /**
-   * @brief Combine two sequences.
-   *
-   * @author Sylvain Gaillard
-   */
-
-  static Sequence* combineSequences(const Sequence& s1, const Sequence& s2) throw (AlphabetMismatchException);
-
-  /**
-   * @brief Subtract haplotype from an heterozygous sequence.
-   *
-   * Subtract an haplotype (i.e. a fully resolved sequence) from an heterozygous
-   * sequence to get the other haplotype. The new haplotype could be an unresolved
-   * sequence if unresolved characters in the sequence code for more than 2 states.
-   *
-   * For example:<br>
-   * @code
-   * >heterozygous sequence
-   * ATTCGGGKWTATRYRM
-   * >haplotype
-   * ATTCGGGTATATGCAA
-   * >subtracted haplotype
-   * ATTCGGGGTTATATGC
-   * @endcode
-   *
-   * @param s The heterozygous sequence.
-   * @param h The haplotype to subtract.
-   * @param name The name of the new computed haplotype.
-   * @param level The number of states from which the site is set to fully unresolved.
-   * @throw SequenceNotAlignedException if s and h don't have the same size.
-   *
-   * @author Sylvain Gaillard
-   */
-  static Sequence* subtractHaplotype(const Sequence& s, const Sequence& h, std::string name = "", unsigned int level = 1) throw (SequenceNotAlignedException);
-
-  /**
-   * @brief Get the RNY decomposition of a DNA sequence; with a given
-   * phase between 1 and 3, it gives the decomposition in this phase;
-   * in phase 1, the first triplet is centered on the first character.
-   * Without a phase the function gives the alternative succession in
-   * phases 1, 2 and 3.
-   *
-   * @return sequence A new sequence object with the transcription sequence.
-   * @param sequence The sequence to transcript.
-   * @param ph The phase to use (1,2 or 3).
-   * @throw AlphabetException If the sequence is not a DNA sequence.
-   *
-   * @author Laurent Guéguen
-   */
-  static Sequence* RNYslice(const Sequence& sequence, int ph) throw (AlphabetException);
-  static Sequence* RNYslice(const Sequence& sequence) throw (AlphabetException);
-
-  /**
-   * @brief Extract CDS part from a codon sequence. Optionally check for intiator and stop codons, or both.
-   *
-   * @param sequence The sequence to be reduced to CDS part.
-   * @param gCode The genetic code according to which start and stop codons are specified.
-   * @param checkInit If true, then everything before the initiator codon will be removed, together with the initiator codon if includeInit is false.
-   * @param checkStop If true, then everything after the first stop codon will be removed, together with the stop codon if includeStop is false.
-   * @param includeInit Tell if initiator codon should be kept or removed. No effect if checkInit is false.
-   * @param includeStop Tell if stop codon should be kept or removed. No effect if checkStop is false.
-   */
-  static void getCDS(Sequence& sequence, const GeneticCode& gCode, bool checkInit, bool checkStop, bool includeInit = true, bool includeStop = true);
-
-  /**
-   * @brief Find the position of a motif in a sequence
-   *
-   * @param seq The reference sequence
-   * @param motif The motif to find
-   * @param strict If true (default) find exactly the motif
-   *               If false find compatible match
-   * @return The position of the first occurence of the motif or the seq
-   * length.
-   */
-  static size_t findFirstOf(const Sequence& seq, const Sequence& motif, bool strict = true);
-
-  /**
-   * @brief Get a random sequence of given size and alphabet, with all state with equal probability.
-   *
-   * @param alphabet The alphabet to use.
-   * @param length The length of the sequence to generate.
-   * @return A pointer toward a new Sequence object.
-   */
-  static Sequence* getRandomSequence(const Alphabet* alphabet, size_t length);
-};
-} // end of namespace bpp.
-
-#endif // _SEQUENCETOOLS_H_
-
diff --git a/src/Bpp/Seq/SequenceWalker.cpp b/src/Bpp/Seq/SequenceWalker.cpp
deleted file mode 100644
index a74dbb9..0000000
--- a/src/Bpp/Seq/SequenceWalker.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// File: SequenceWalker.cpp
-// Created by: Julien Dutheil
-// Created on: Thu Nov 24 2011
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2011)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include <iostream>
-using namespace std;
-
-#include "SequenceWalker.h"
-
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-size_t SequenceWalker::getAlignmentPosition(size_t seqPos) throw (Exception)
-{
-  if (seqPos == seqPos_) return alnPos_;
-  if (seqPos > seqPos_) {
-    //Move forward
-    while (alnPos_ < seq_->size() && seqPos_ < seqPos) {
-      if (alnPos_ == seq_->size() - 1)
-        throw Exception("SequenceWalker::getAlignmentPosition(). Forward1. Position out of bound.");
-      ++alnPos_;
-
-      if ((*seq_)[alnPos_] != gap_) {
-        ++seqPos_;
-      }
-    }
-    if (seqPos_ != seqPos)
-      throw Exception("SequenceWalker::getAlignmentPosition(). Forward2. Position out of bound (" + TextTools::toString(alnPos_) + ")");
-  } else {
-    //Move backward
-    if (alnPos_ == 0)
-      throw Exception("SequenceWalker::getAlignmentPosition(). Backward. Position out of bound.");
-    while (alnPos_ > 0 && seqPos_ > seqPos) {
-      --alnPos_;
-      if ((*seq_)[alnPos_] != gap_) {
-        --seqPos_;
-      }
-    }
-    if (seqPos_ != seqPos)
-      throw Exception("SequenceWalker::getAlignmentPosition(). Position out of bound.");
-  }
-  return alnPos_;
-}
-
-size_t SequenceWalker::getSequencePosition(size_t alnPos) throw (Exception)
-{
-  if (alnPos == alnPos_) return seqPos_;
-  if (alnPos >= seq_->size())
-    throw Exception("SequenceWalker::getSequencePosition(). Position out of bound.");
-  if (alnPos > alnPos_) {
-    //Move forward
-    while (alnPos_ < alnPos) {
-      ++alnPos_;
-      if ((*seq_)[alnPos_] != gap_) {
-        ++seqPos_;
-      }
-    }
-  } else {
-    //Move backward
-    while (alnPos_ > alnPos) {
-      if (seqPos_ == 0)
-        return 0;
-      --alnPos_;
-      if ((*seq_)[alnPos_ + 1] != gap_) {
-        --seqPos_;
-      }
-    }
-  }
-  return seqPos_;
-}
-
diff --git a/src/Bpp/Seq/SequenceWithAnnotation.cpp b/src/Bpp/Seq/SequenceWithAnnotation.cpp
deleted file mode 100644
index 1f86f4f..0000000
--- a/src/Bpp/Seq/SequenceWithAnnotation.cpp
+++ /dev/null
@@ -1,303 +0,0 @@
-//
-// File: SequenceWithAnnotation.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Jul 19 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use,
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info".
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability.
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or
-data to be ensured and,  more generally, to use and operate it in the
-same conditions as regards security.
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SequenceWithAnnotation.h" // class's header file
-
-#include "Alphabet/AlphabetTools.h"
-#include "StringSequenceTools.h"
-#include <Bpp/Text/TextTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-/* Constructors: **************************************************************/
-
-SequenceWithAnnotation::SequenceWithAnnotation(const Alphabet* alpha):
-  EdSymbolList(alpha),
-  name_(),
-  comments_()
-{}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const std::string& name, const std::string& sequence, const Alphabet* alpha)
-throw (BadCharException) :
-	EdSymbolList(alpha),
-	name_(name),
-  comments_()
-{
-  if (sequence!="")
-    setContent(sequence);
-}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const std::string& name, const std::string& sequence, const Comments& comments, const Alphabet* alpha)
-  throw (BadCharException) :
-	EdSymbolList(alpha),
-	name_(name),
-	comments_(comments)
-{
-  if (sequence != "")
-    setContent(sequence);
-}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const std::string& name, const std::vector<std::string>& sequence, const Alphabet* alpha)
-throw (BadCharException) :
-	EdSymbolList(sequence, alpha),
-	name_(name),
-  comments_()
-{}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const std::string& name, const std::vector<std::string>& sequence, const Comments& comments, const Alphabet* alpha)
-  throw (BadCharException) :
-	EdSymbolList(sequence, alpha),
-	name_(name),
-	comments_(comments)
-{}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const std::string& name, const std::vector<int>& sequence, const Alphabet* alpha)
-  throw (BadIntException) :
-	EdSymbolList(sequence, alpha),
-	name_(name),
-  comments_()
-{}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const std::string& name, const std::vector<int>& sequence, const Comments& comments, const Alphabet* alpha)
-  throw (BadIntException) :
-	EdSymbolList(sequence, alpha),
-	name_(name),
-	comments_(comments)
-{}
-
-/* Copy constructors: *********************************************************/
-
-SequenceWithAnnotation::SequenceWithAnnotation(const Sequence& s) :
-	EdSymbolList(s),
-	name_(s.getName()),
-	comments_(s.getComments())
-{}
-
-SequenceWithAnnotation::SequenceWithAnnotation(const SequenceWithAnnotation& s) :
-	EdSymbolList(s),
-	name_(s.getName()),
-	comments_(s.getComments())
-{}
-
-/* Assignation operator: ******************************************************/
-
-SequenceWithAnnotation& SequenceWithAnnotation::operator=(const Sequence& s)
-{
-  EdSymbolList::operator=(s);
-	name_     = s.getName();
-	comments_ = s.getComments();
-  return *this;
-}
-
-SequenceWithAnnotation& SequenceWithAnnotation::operator=(const SequenceWithAnnotation& s)
-{
-  EdSymbolList::operator=(s);
-	name_     = s.getName();
-	comments_ = s.getComments();
-	return *this;
-}
-
-/******************************************************************************/
-
-void SequenceWithAnnotation::setContent(const std::string& sequence) throw (BadCharException)
-{
-  SymbolListEditionEvent event(this);
-  fireBeforeSequenceChanged(event);
-	// Remove blanks in sequence
-	content_ = StringSequenceTools::codeSequence(TextTools::removeWhiteSpaces(sequence), getAlphabet());
-  //Warning, an exception may be thrown here!
-  fireAfterSequenceChanged(event);
-}
-
-/******************************************************************************/
-
-void SequenceWithAnnotation::setToSizeR(size_t newSize)
-{
-	// Size verification
-	size_t seqSize = content_.size();
-	if (newSize == seqSize) return;
-
-	if (newSize < seqSize)
-  {
-    SymbolListDeletionEvent event(this, newSize, seqSize - newSize);
-    fireBeforeSequenceDeleted(event);
-		content_.resize(newSize);
-    fireAfterSequenceDeleted(event);
-		return;
-	}
-
-	// Add gaps up to specified size
-  SymbolListInsertionEvent event(this, seqSize, newSize - seqSize);
-  fireBeforeSequenceInserted(event);
-  int gap = getAlphabet()->getGapCharacterCode();
-	while (content_.size() < newSize) content_.push_back(gap);
-  fireAfterSequenceInserted(event);
-}
-
-/******************************************************************************/
-
-void SequenceWithAnnotation::setToSizeL(size_t newSize)
-{
-	// Size verification
-	size_t seqSize = content_.size();
-	if (newSize == seqSize) return;
-
-	if (newSize < seqSize)
-  {
-		//We must truncate sequence from the left.
-    SymbolListDeletionEvent event(this, 0, seqSize - newSize);
-    fireBeforeSequenceDeleted(event);
-		content_.erase(content_.begin(), content_.begin() + static_cast<ptrdiff_t>(seqSize - newSize));
-    fireAfterSequenceDeleted(event);
-		return;
-	}
-
-	// Add gaps up to specified size
-  SymbolListInsertionEvent event(this, 0, newSize - seqSize);
-  fireBeforeSequenceInserted(event);
-  int gap = getAlphabet()->getGapCharacterCode();
-	content_.insert(content_.begin(), newSize - seqSize, gap);
-  fireAfterSequenceInserted(event);
-}
-
-/******************************************************************************/
-
-void SequenceWithAnnotation::append(const std::vector<int>& content) throw (BadIntException)
-{
-  SymbolListInsertionEvent event(this, content_.size(), content.size());
-  fireBeforeSequenceInserted(event);
-	// Check list for incorrect characters
-	for (unsigned int i = 0; i < content.size(); i++)
-		if(!getAlphabet()->isIntInAlphabet(content[i]))
-      throw BadIntException(content[i], "SequenceWithAnnotation::append", getAlphabet());
-	//SequenceWithAnnotation is valid:
-	for (unsigned int i = 0; i < content.size(); i++)
-		content_.push_back(content[i]);
-  
-  fireAfterSequenceInserted(event);
-}
-
-void SequenceWithAnnotation::append(const std::vector<std::string>& content) throw (BadCharException)
-{
-  SymbolListInsertionEvent event(this, content_.size(), content.size());
-  fireBeforeSequenceInserted(event);
-	// Check list for incorrect characters
-	for (unsigned int i = 0; i < content.size(); i++)
-		if(!getAlphabet()->isCharInAlphabet(content[i]))
-      throw BadCharException(content[i], "SequenceWithAnnotation::append", getAlphabet());
-	
-	//SequenceWithAnnotation is valid:
-	for (unsigned int i = 0; i < content.size(); i++)
-		content_.push_back(getAlphabet()->charToInt(content[i]));
-  
-  fireAfterSequenceInserted(event);
-}
-
-void SequenceWithAnnotation::append(const std::string& content) throw (BadCharException)
-{
-	append(StringSequenceTools::codeSequence(content, getAlphabet()));
-}
-
-/******************************************************************************/
- 
-vector<string> SequenceWithAnnotation::getAnnotationTypes() const
-{
-  vector<string> types;
-  for (unsigned int i = 0; i < getNumberOfListeners(); ++i) {
-    const SequenceAnnotation* anno = dynamic_cast<const SequenceAnnotation*>(&getListener(i));
-    if (anno)
-      types.push_back(anno->getType());
-  }
-  return types;
-}
-
-/******************************************************************************/
-
-void SequenceWithAnnotation::merge(const SequenceWithAnnotation& swa)
-  throw (AlphabetMismatchException, Exception)
-{
-  // Sequence's alphabets matching verification
-	if ((swa.getAlphabet()->getAlphabetType()) != (getAlphabet()->getAlphabetType())) 
-		throw AlphabetMismatchException("SequenceWithAnnotation::merge: Sequence's alphabets don't match ", swa.getAlphabet(), getAlphabet());
-	
-	// Sequence's names matching verification
-	if (swa.getName() != getName())
-    throw Exception ("SequenceWithAnnotation::merge: Sequence's names don't match");
-
-	// Concatenate sequences and send result
-	propagateEvents(false);
-  append(swa.getContent());
-	propagateEvents(true);
-
-  // Try to merge annotations.
-  //First start with annotations in this sequence:
-  vector<string> types = getAnnotationTypes();
-  vector<string> newTypes = swa.getAnnotationTypes();
-  for (unsigned int i = 0; i < types.size(); ++i) {
-    vector<string>::iterator it = find(newTypes.begin(), newTypes.end(), types[i]);
-    if (it != newTypes.end()) {
-      //Merge annotations:
-      getAnnotation(types[i]).merge(swa.getAnnotation(types[i]));
-      //Remove annotation from the list:
-      newTypes.erase(it);
-    } else {
-      //Extend annotation to the right:
-      auto_ptr<SequenceAnnotation> anno(getAnnotation(types[i]).clone());
-      anno->init(swa);
-      getAnnotation(types[i]).merge(*anno);
-    }
-  }
-  //Now look for annotations in the input sequence:
-  for (unsigned int i = 0; i < newTypes.size(); ++i) {
-    //Extend annotation from the left:
-    SequenceAnnotation* anno = swa.getAnnotation(newTypes[i]).clone();
-    anno->init(*this);
-    anno->merge(swa.getAnnotation(newTypes[i]));
-    addAnnotation(anno);
-  }
-}
-
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/SequenceWithAnnotation.h b/src/Bpp/Seq/SequenceWithAnnotation.h
deleted file mode 100644
index 158f849..0000000
--- a/src/Bpp/Seq/SequenceWithAnnotation.h
+++ /dev/null
@@ -1,443 +0,0 @@
-//
-// File: SequenceWithAnnotation.h
-// Created by: Julien Dutheil
-// Created on: Mon Jul 19 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEWITHANNOTATION_H_
-#define _SEQUENCEWITHANNOTATION_H_
-
-#include "Sequence.h"
-
-// From the STL:
-#include <string>
-#include <vector>
-
-namespace bpp
-{
-
-class SequenceWithAnnotation;
-
-/**
- * @brief Interface for sequence annotations.
- */
-class SequenceAnnotation :
-  public virtual SymbolListListener
-{
-  public:
-    virtual SequenceAnnotation* clone() const = 0;
-
-    /**
-     * Creates a default annotation according to a given sequence.
-     *
-     * @param seq The template sequence (typically the one with which the annotation will be attached).
-     */
-    virtual void init(const Sequence& seq) = 0;
-
-    /**
-     * @return The type of the annotation. This is used for querying annotations.
-     */
-    virtual const std::string& getType() const = 0;
-
-    /**
-     * @brief Test is the annotation is valid for a given sequence.
-     *
-     * @param sequence The sequence to be validated against.
-     * @param throwException If set to yes, throw an exception if the sequence is not valid.
-     * @return true if this annotation is complient with the given sequence.
-     */
-    virtual bool isValidWith(const SequenceWithAnnotation& sequence, bool throwException = true) const = 0;
-
-    /**
-     * @brief Merge the input annotation with the current one.
-     * 
-     * @param anno The annotation to fuse.
-     * @return true if the fusion was possible and succesful.
-     */
-    virtual bool merge(const SequenceAnnotation& anno) = 0;
-
-    /**
-     * @return A new annotation corresponding to a part of the sequence.
-     * The implementation of this highly depends on the annotation type, and might not be supported.
-     * @param pos Starting point of the region.
-     * @param len The length of the region, in number of positions.
-     */
-    virtual SequenceAnnotation* getPartAnnotation(size_t pos, size_t len) const throw (Exception) = 0;
-};
-
-/**
- * @brief An implementation of the Sequence interface that supports annotation. 
- *
- * This is a general purpose container, containing an ordered list of states.
- * The states that allowed to be present in the sequence are defined
- * by an alphabet object, which is passed to the sequence constructor by a pointer.
- *
- * For programming convenience, the states are stored as integers, but the translation toward
- * and from a char description is easily performed with the Alphabet classes.
- *
- * Sequence objets also contain a name attribute and potentially several comment lines.
- *
- * The gestion of sequence content is identical to the BasicSequence object, but edition events are
- * properly fired. Listener are therefore properly handled.
- *
- * @see BasicSequence
- */
-class SequenceWithAnnotation :
-  public Sequence,
-  public EdSymbolList
-{
-  private:
-
-    /**
-     * @brief The sequence name.
-     */
-    std::string name_;
-
-    /**
-     * @brief The sequence comments.
-     */
-    Comments comments_;
-
-  public:
-
-    /**
-     * @brief Empty constructor: build a void Sequence with just an Alphabet
-     *
-     * You can use it safely for all type of Alphabet in order to build an
-     * empty Sequence i.e. without name nor sequence data.
-     *
-     * @param alpha    A pointer toward the Alphabet to be used with this Sequence.
-     */
-    SequenceWithAnnotation(const Alphabet* alpha);
-
-    /**
-     * @brief Direct constructor: build a Sequence object from a std::string
-     * You can use it safely for RNA, DNA and protein sequences.
-     *
-     * It can be used with codon sequences too, the std::string will be cut into
-     * parts of size 3. But for more complicated alphabets, you should use one
-     * complete constructors.
-     *
-     * @param name     The sequence name.
-     * @param sequence The whole sequence to be parsed as a std::string.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    SequenceWithAnnotation(const std::string& name, const std::string& sequence, const Alphabet* alpha) throw (BadCharException);
-  
-    /**
-     * @brief Direct constructor: build a Sequence object from a std::string.
-     * 
-     * You can use it safely for RNA, DNA and protein sequences.
-     *
-     * It can be used with codon sequences too, the std::string will be cut into
-     * tokens of size 3. But for more complicated alphabets, you should use one
-     * complete constructors.
-     *
-     * @param name     The sequence name.
-     * @param sequence The whole sequence to be parsed as a std::string.
-     * @param comments Comments to add to the sequence.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    SequenceWithAnnotation(const std::string& name, const std::string& sequence, const Comments& comments, const Alphabet* alpha) throw (BadCharException);
-  
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * You should note that the sequence is stored as a std::vector of int.
-     * Hence each std::string in the std::vector will be translated using the alphabet object.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    SequenceWithAnnotation(const std::string& name, const std::vector<std::string>& sequence, const Alphabet* alpha) throw (BadCharException);
-    
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * You should note that the sequence is stored as a std::vector of int.
-     * Hence each std::string in the std::vector will be translated using the alphabet object.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param comments Comments to add to the sequence.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    SequenceWithAnnotation(const std::string& name, const std::vector<std::string>& sequence, const Comments& comments, const Alphabet* alpha) throw (BadCharException);
-  
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    SequenceWithAnnotation(const std::string& name, const std::vector<int>& sequence, const Alphabet* alpha) throw (BadIntException);
-    
-    /**
-     * @brief General purpose constructor, can be used with any alphabet.
-     *
-     * @param name     The sequence name.
-     * @param sequence The sequence content.
-     * @param comments Comments to add to the sequence.
-     * @param alpha    A pointer toward the alphabet to be used with this sequence.
-     */
-    SequenceWithAnnotation(const std::string& name, const std::vector<int>& sequence, const Comments& comments, const Alphabet* alpha) throw (BadIntException);
-
-    /**
-     * @brief The Sequence generic copy constructor. This does not perform a hard copy of the alphabet object.
-     */
-    SequenceWithAnnotation(const Sequence& s);
-   
-    /**
-     * @brief The Sequence copy constructor. This does not perform a hard copy of the alphabet object.
-     */
-    SequenceWithAnnotation(const SequenceWithAnnotation& s);
- 
-    /**
-     * @brief The Sequence generic assignment operator. This does not perform a hard copy of the alphabet object.
-     *
-     * @return A ref toward the assigned Sequence.
-     */
-    SequenceWithAnnotation& operator=(const Sequence& s);
-   
-    /**
-     * @brief The Sequence assignment operator. This does not perform a hard copy of the alphabet object.
-     *
-     * @return A ref toward the assigned Sequence.
-     */
-    SequenceWithAnnotation& operator=(const SequenceWithAnnotation& s);
-
-    virtual ~SequenceWithAnnotation() {}
-
-  public:
-  
-    /**
-     * @name The Clonable interface
-     *
-     * @{
-     */
-    SequenceWithAnnotation* clone() const { return new SequenceWithAnnotation(*this); }
-    /** @} */
-        
-    
-    /**
-     * @name Setting/getting the name of the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Get the name of this sequence.
-     *
-     * @return This sequence name.
-     */
-    const std::string& getName() const { return name_; }
-    
-    /**
-     * @brief Set the name of this sequence.
-     *
-     * @param name The new name of the sequence.
-     */
-    void setName(const std::string& name) { name_ = name; }
-    
-    /** @} */
-    
-    /**
-     * @name Setting/getting the comments associated to the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Get the comments associated to this sequence.
-     *
-     * @return The comments of the sequence.
-     */
-    const Comments& getComments() const { return comments_; }
-    
-    /**
-     * @brief Set the comments associated to this sequence.
-     *
-     * @param comments The new comments of the sequence.
-     */
-    void setComments(const Comments& comments) { comments_ = comments; }
-    
-    /** @} */
-    
-    
-    /**
-     * @name Adjusting the size of the sequence.
-     *
-     * @{
-     */
-     
-    /**
-     * @brief Set the whole content of the sequence.
-     *
-     * @param sequence The new content of the sequence.
-     * @see The Sequence constructor for information about the way sequences are internaly stored.
-     */
-    virtual void setContent(const std::string& sequence) throw (BadCharException);
-    void setContent(const std::vector<int>& list) throw (BadIntException)
-    {
-      EdSymbolList::setContent(list);
-    }
-    void setContent(const std::vector<std::string>& list) throw (BadCharException)
-    {
-      EdSymbolList::setContent(list);
-    }
-
-
-    /**
-     * @brief Set up the size of a sequence from the right side.
-     *
-     * All new characters are filled with gaps.
-     * If the specified size is < to the sequence size, the sequence will be truncated.
-     *
-     * @param newSize The new size of the sequence.
-     */
-    virtual void setToSizeR(size_t newSize);
-    
-    /**
-     * @brief Set up the size of a sequence from the left side.
-     *
-     * All new characters are filled with gaps.
-     * If the specified size is < to the sequence size, the sequence will be truncated.
-     *
-     * @param newSize The new size of the sequence.
-     */
-    virtual void setToSizeL(size_t newSize);
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadIntException If the content does not match the current alphabet.
-     */
-    void append(const std::vector<int>& content) throw (BadIntException);
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadCharException If the content does not match the current alphabet.
-     */
-    void append(const std::vector<std::string>& content) throw (BadCharException);
-
-    /**
-     * @brief Append the specified content to the sequence.
-     *
-     * @param content The content to append to the sequence.
-     * @throw BadCharException If the content does not match the current alphabet.
-     */
-    void append(const std::string& content) throw (BadCharException);
-
-    /** @} */
-
-    /**
-     * @brief Add a new annotation to the sequence.
-     *
-     * @param anno The annotation object to be added. Unless the annotation is shared,
-     * the annotation object will be owned by the sequence object, and will be copied
-     * and deleted when needed.
-     * @throw Exception If the annotation is not valid for this sequence.
-     * @see SequenceWithAnnotation::isValidWith
-     */
-    virtual void addAnnotation(SequenceAnnotation* anno) throw (Exception)
-    {
-      anno->isValidWith(*this);
-      addSymbolListListener(anno);
-    }
- 
-    virtual bool hasAnnotation(const std::string& type) const
-    {
-      for (size_t i = 0; i < getNumberOfListeners(); ++i) {
-        const SymbolListListener* listener = &getListener(i);
-        const SequenceAnnotation* anno = dynamic_cast<const SequenceAnnotation*>(listener);
-        if (anno && anno->getType() == type) return true;
-      }
-      return false;
-    }
-
-   
-    virtual const SequenceAnnotation& getAnnotation(const std::string& type) const
-    {
-      for (size_t i = 0; i < getNumberOfListeners(); ++i) {
-        const SymbolListListener* listener = &getListener(i);
-        const SequenceAnnotation* anno = dynamic_cast<const SequenceAnnotation*>(listener);
-        if (anno && anno->getType() == type) return *anno;
-      }
-      throw Exception("SequenceWithAnnotation::getAnnotation. No annotation found with type '" + type + "'.");
-    }
-    
-    virtual SequenceAnnotation& getAnnotation(const std::string& type)
-    {
-      for (size_t i = 0; i < getNumberOfListeners(); ++i) {
-        SymbolListListener* listener = &getListener(i);
-        SequenceAnnotation* anno = dynamic_cast<SequenceAnnotation*>(listener);
-        if (anno && anno->getType() == type) return *anno;
-      }
-      throw Exception("SequenceWithAnnotation::getAnnotation. No annotation found with type '" + type + "'.");
-    }
-
-    /**
-     * @return The list of annotation types contained in this sequence.
-     */
-    virtual std::vector<std::string> getAnnotationTypes() const;
-
-    /**
-     * @brief Merge a sequence with the current one.
-     *
-     * Sequences must have the same name and alphabets.
-     * Only first sequence's commentaries are kept.
-     * Annotations that could not be merged will not be added in the concatenated sequence.
-     * See the documentation of each annotation class for more details.
-     *
-     * @param swa The sequence to merge with.
-     * @throw AlphabetMismatchException If the two alphabets do not match.
-     * @throw Exception If the sequence names do not match.
-     */
-    virtual void merge(const SequenceWithAnnotation& swa)
-        throw (AlphabetMismatchException, Exception);
-
-
-};
-
-} //end of namespace bpp.
-
-#endif // _SEQUENCEWITHANNOTATION_H_
-
diff --git a/src/Bpp/Seq/SequenceWithAnnotationTools.cpp b/src/Bpp/Seq/SequenceWithAnnotationTools.cpp
deleted file mode 100644
index 346afef..0000000
--- a/src/Bpp/Seq/SequenceWithAnnotationTools.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// File:       SequenceWithAnnotationTools.cpp
-// Authors:    Julien Dutheil
-// Created on: 06 Sep 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (Sep 06, 2010)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SequenceWithAnnotationTools.h"
-#include "Alphabet/CaseMaskedAlphabet.h"
-
-using namespace bpp;
-using namespace std;
-
-const string SequenceMask::MASK = "Boolean mask";
-
-/******************************************************************************/
-
-void SequenceMask::afterSequenceChanged(const SymbolListEditionEvent& event)
-{
-  mask_.clear();
-  mask_.insert(mask_.begin(), event.getSymbolList()->size(), false);
-}
-
-/******************************************************************************/
-
-void SequenceMask::afterSequenceInserted(const SymbolListInsertionEvent& event)
-{
-  mask_.insert(mask_.begin() + static_cast<ptrdiff_t>(event.getPosition()),
-      event.getLength(), false);
-}
-
-/******************************************************************************/
-
-void SequenceMask::afterSequenceDeleted(const SymbolListDeletionEvent& event)
-{
-  mask_.erase(mask_.begin() + static_cast<ptrdiff_t>(event.getPosition()),
-      mask_.begin() + static_cast<ptrdiff_t>(event.getPosition() + event.getLength()));
-}
-
-/******************************************************************************/
-
-SequenceWithAnnotation* SequenceWithAnnotationTools::createMaskAnnotation(const Sequence& seq) throw (AlphabetException)
-{
-  const CaseMaskedAlphabet* cma = dynamic_cast<const CaseMaskedAlphabet*>(seq.getAlphabet());
-  if (cma) {
-    SequenceWithAnnotation* seqa = new SequenceWithAnnotation(seq.getName(), seq.toString(), seq.getComments(), seq.getAlphabet());
-    vector<bool> mask(seq.size());
-    for (unsigned int i = 0; i < seq.size(); ++i) {
-      mask[i] = cma->isMasked(seq[i]);
-    }
-    seqa->addAnnotation(new SequenceMask(mask));
-    return seqa;
-  } else {
-    throw AlphabetException("SequenceWithAnnotationTools::createMaskAnnotation. Alphabet should be a CaseMaskedAlphabet.", seq.getAlphabet());
-  }
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/SequenceWithAnnotationTools.h b/src/Bpp/Seq/SequenceWithAnnotationTools.h
deleted file mode 100644
index 8b1e35d..0000000
--- a/src/Bpp/Seq/SequenceWithAnnotationTools.h
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-// File:       SequenceWithAnnotationTools.h
-// Authors:    Julien Dutheil
-// Created on: 06 Sep 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (Sep 06, 2010)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEWITHANNOTATIONTOOLS_H_
-#define _SEQUENCEWITHANNOTATIONTOOLS_H_
-
-#include "SequenceTools.h"
-#include "SequenceWithAnnotation.h"
-#include <Bpp/Numeric/VectorTools.h>
-
-#include <cstddef>
-
-namespace bpp {
-
-  class SequenceMask :
-    public virtual SequenceAnnotation
-  {
-    private:
-      bool removable_;
-      std::vector<bool> mask_;
-
-    public:
-      static const std::string MASK; 
-
-    public:
-
-      /**
-       * @name Constructors
-       * @{
-       */
-
-      /**
-       * @brief Build a new SequenceMask object
-       *
-       * Build a new SequenceMask object and set the mask to false.
-       *
-       * @param size The size of the sequence. 
-       * @param removable Tell if this listener can be removed by the user.
-       */
-      SequenceMask(size_t size = 0, bool removable = true) :
-        removable_(removable),
-        mask_(size, false)
-      {}
-
-
-      /**
-       * @brief Build a new SequenceMask object
-       *
-       * Build a new SequenceMask object and set the mask as a vector of bool.
-       *
-       * @param mask The boolean mask
-       * @param removable Tell if this listener can be removed by the user.
-       */
-      SequenceMask(const std::vector<bool>& mask, bool removable = true) :
-        removable_(removable),
-        mask_(mask)
-      {}
-
-      /** @} */
-
-      /**
-       * @name Destructor
-       * @{
-       */
-      virtual ~SequenceMask() {}
-      /** @} */
-
-      /**
-       * @name The Clonable interface
-       * @{
-       */
-#ifdef NO_VIRTUAL_COV
-      Clonable*
-#else
-      SequenceMask*
-#endif
-      clone() const { return new SequenceMask(*this); }
-      /** @} */
-
-    public:
-      void init(const Sequence& seq)
-      {
-        mask_.resize(seq.size());
-        std::fill(mask_.begin(), mask_.end(), false);
-      }
-
-      const std::string& getType() const { return MASK; }
-
-      bool isValidWith(const SequenceWithAnnotation& sequence, bool throwException = true) const
-      {
-        if (throwException && mask_.size() != sequence.size()) throw Exception("SequenceMask. The mask size must match the sequence size.");
-        return (mask_.size() == sequence.size());
-      }
-
-      bool isRemovable() const { return removable_; }
-      bool isShared() const { return false; }
-      void beforeSequenceChanged(const SymbolListEditionEvent& event) {}
-      void afterSequenceChanged(const SymbolListEditionEvent& event);
-      void beforeSequenceInserted(const SymbolListInsertionEvent& event) {}
-      void afterSequenceInserted(const SymbolListInsertionEvent& event);
-      void beforeSequenceDeleted(const SymbolListDeletionEvent& event) {}
-      void afterSequenceDeleted(const SymbolListDeletionEvent& event);
-      void beforeSequenceSubstituted(const SymbolListSubstitutionEvent& event) {}
-      void afterSequenceSubstituted(const SymbolListSubstitutionEvent& event) {}
-
-      size_t getSize() const { return mask_.size(); }
-
-      const bool operator[](size_t i) const { return mask_[i]; }
-
-      void setMask(const std::vector<bool>& mask) {
-        if (mask.size() != mask_.size())
-          throw DimensionException("SequenceMask::setMask. Trying to replace mask by a vector with different length.", mask.size(), mask_.size());
-        mask_ = mask;
-      }
-
-      /**
-       * @return The mask as a vector.
-       */
-      const std::vector<bool>& getMask() const { return mask_; }
-
-      void setMask(size_t pos, bool mask) {
-        if (pos >= mask_.size())
-          throw Exception("SequenceMask::setMask. Vector overflow. Scores number: " + TextTools::toString(mask_.size()) + ", but trying to insert mask at position " + TextTools::toString(pos) + ".");
-        mask_[pos] = mask;
-      }
-      
-      void setMask(size_t pos, const std::vector<bool>& mask) {
-        if (pos + mask.size() > mask_.size())
-          throw Exception("SequenceMask::setMask. Vector overflow. Scores number: " + TextTools::toString(mask_.size()) + ", but trying to insert " + TextTools::toString(mask.size()) + " scores at position " + TextTools::toString(pos) + ".");
-        std::copy(mask.begin(), mask.end(), mask_.begin() + static_cast<ptrdiff_t>(pos)); 
-      }
-
-      bool merge(const SequenceAnnotation& anno) {
-        try {
-          const SequenceMask* mask = & dynamic_cast<const SequenceMask&>(anno);
-          VectorTools::append(mask_, mask->getMask());
-          return true;
-        } catch (std::exception& e) {
-          return false;
-        }
-      }
- 
-      SequenceAnnotation* getPartAnnotation(size_t pos, size_t len) const throw (Exception) {
-        return new SequenceMask(std::vector<bool>(mask_.begin() + static_cast<ptrdiff_t>(pos), mask_.begin() + static_cast<ptrdiff_t>(pos + len)), removable_);
-      }
-  };
-  
-  /**
-   * @brief The SequenceWithAnnotationTools static class
-   *
-   * Implement methods to manipulate SequencesWithAnnotation
-   *
-   * @author Julien Dutheil
-   */
-
-  class SequenceWithAnnotationTools {
-
-    public:
-      /**
-       * @brief Parse a sequence with a CaseMaskedAlphabet and creates a new SequenceWithAnnotation object with original alphabet and a mask annotation.
-       *
-       * @param seq The sequence to parse.
-       * @return A new SequenceWithAnnotation object.
-       * @throw AlphabetException if the input sequence does not have a CaseMaskedAlphabet.
-       */
-      SequenceWithAnnotation* createMaskAnnotation(const Sequence& seq) throw (AlphabetException);
-
-  };
-}
-
-#endif // _SEQUENCEWITHANNOTATIONTOOLS_H_
diff --git a/src/Bpp/Seq/SequenceWithQuality.h b/src/Bpp/Seq/SequenceWithQuality.h
deleted file mode 100644
index 7b26aab..0000000
--- a/src/Bpp/Seq/SequenceWithQuality.h
+++ /dev/null
@@ -1,786 +0,0 @@
-// 
-// File:    SequenceWithQuality.h
-// Authors: Sylvain Gaillard
-//          Vincent Cahais
-//          Julien Dutheil
-// Created: 19/01/2010 16:01:20
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (January 19, 2010)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SEQUENCEQUALITY_H_
-#define _SEQUENCEQUALITY_H_
-
-#include "SequenceWithAnnotation.h"
-#include <Bpp/Numeric/VectorTools.h>
-#include <Bpp/Numeric/VectorExceptions.h>
-
-// From the STL
-
-#include <string>
-#include <vector>
-#include <cstddef>
-
-namespace bpp {
-  /**
-   * @brief The SequenceQuality class
-   *
-   * This is a sequence with quality score associated to each element.
-   * The score is a signed int value that can represent the phred or the
-   * Solexa quality score for nucleic sequence.
-   *
-   * @author Sylvain Gaillard, Vincent Cahais, Julien Dutheil
-   */
-  class SequenceQuality :
-    public virtual SequenceAnnotation
-  {
-    private:
-      bool removable_;
-      std::vector<int> qualScores_;
-
-    public:
-      static const std::string QUALITY_SCORE; 
-      static const int DEFAULT_QUALITY_VALUE;
-
-    public:
-
-      /**
-       * @name Constructors
-       * @{
-       */
-
-      /**
-       * @brief Build a new SequenceQuality object
-       *
-       * Build a new SequenceQuality object and set the quality scores to
-       * the default value DEFAULT_QUALITY_VALUE.
-       *
-       * @param size The size of the sequence. 
-       * @param removable Tell if this listener can be removed by the user.
-       */
-      SequenceQuality(size_t size = 0, bool removable = true) :
-        removable_(removable),
-        qualScores_(size, DEFAULT_QUALITY_VALUE) {}
-
-
-      /**
-       * @brief Build a new SequenceQuality object
-       *
-       * Build a new SequenceQuality and assign quality scores from
-       * a vector of int.
-       *
-       * @param quality The quality scores
-       * @param removable Tell if this listener can be removed by the user.
-       */
-      SequenceQuality(const std::vector<int>& quality, bool removable = true) :
-        removable_(removable),
-        qualScores_(quality)
-      {
-      //    if (size() != qualScores_.size())
-      //      throw DimensionException("SequenceWithQuality constructor: sequence and quality must have the same length", qualScores_.size(), size());
-      }
-
-      /** @} */
-
-      /**
-       * @name Destructor
-       * @{
-       */
-      virtual ~SequenceQuality() {}
-      /** @} */
-
-      /**
-       * @name The Clonable interface
-       * @{
-       */
-#ifdef NO_VIRTUAL_COV
-      Clonable*
-#else
-      SequenceQuality*
-#endif
-      clone() const { return new SequenceQuality(*this); }
-      /** @} */
-
-    public:
-      void init(const Sequence& seq)
-      {
-        qualScores_.resize(seq.size());
-        std::fill(qualScores_.begin(), qualScores_.end(), DEFAULT_QUALITY_VALUE);
-      }
-
-      const std::string& getType() const { return QUALITY_SCORE; }
-
-      bool isValidWith(const SequenceWithAnnotation& sequence, bool throwException = true) const
-      {
-        if (throwException && qualScores_.size() != sequence.size()) throw Exception("SequenceQuality. Quality scores must match the sequence size.");
-        return (qualScores_.size() == sequence.size());
-      }
-
-      bool isRemovable() const { return removable_; }
-      bool isShared() const { return false; }
-      void beforeSequenceChanged(const SymbolListEditionEvent& event) {}
-      void afterSequenceChanged(const SymbolListEditionEvent& event);
-      void beforeSequenceInserted(const SymbolListInsertionEvent& event) {}
-      void afterSequenceInserted(const SymbolListInsertionEvent& event);
-      void beforeSequenceDeleted(const SymbolListDeletionEvent& event) {}
-      void afterSequenceDeleted(const SymbolListDeletionEvent& event);
-      void beforeSequenceSubstituted(const SymbolListSubstitutionEvent& event) {}
-      void afterSequenceSubstituted(const SymbolListSubstitutionEvent& event) {}
-
-      size_t getSize() const { return qualScores_.size(); }
-
-      const int& operator[](size_t i) const { return qualScores_[i]; }
-      int& operator[](size_t i) { return qualScores_[i]; }
-
-      void setScores(const std::vector<int>& scores) {
-        if (scores.size() != qualScores_.size())
-          throw DimensionException("SequenceQuality::setScores. Trying to replace score by a vector with different length.", scores.size(), qualScores_.size());
-        qualScores_ = scores;
-      }
-
-      /**
-       * @return All scores as a vector.
-       */
-      const std::vector<int>& getScores() const { return qualScores_; }
-
-      void setScore(size_t pos, int score) {
-        if (pos >= qualScores_.size())
-          throw Exception("SequenceQuality::setScore. Vector overflow. Scores number: " + TextTools::toString(qualScores_.size()) + ", but trying to insert score at position " + TextTools::toString(pos) + ".");
-        qualScores_[pos] = score;
-      }
-      
-      void setScores(size_t pos, const std::vector<int>& scores) {
-        if (pos + scores.size() > qualScores_.size())
-          throw Exception("SequenceQuality::setScores. Vector overflow. Scores number: " + TextTools::toString(qualScores_.size()) + ", but trying to insert " + TextTools::toString(scores.size()) + " scores at position " + TextTools::toString(pos) + ".");
-        std::copy(scores.begin(), scores.end(), qualScores_.begin() + static_cast<ptrdiff_t>(pos)); 
-      }
-    
-      bool merge(const SequenceAnnotation& anno) {
-        try {
-          const SequenceQuality* qual = & dynamic_cast<const SequenceQuality&>(anno);
-          VectorTools::append(qualScores_, qual->getScores());
-          return true;
-        } catch (std::exception& e) {
-          return false;
-        }
-      }
-
-      SequenceQuality* getPartAnnotation(size_t pos, size_t len) const throw (Exception) {
-        return new SequenceQuality(
-            std::vector<int>(
-              qualScores_.begin() + static_cast<ptrdiff_t>(pos),
-              qualScores_.begin() + static_cast<ptrdiff_t>(pos + len)),
-            removable_);
-      }
-  };
-
-
-
-  /**
-   * @brief A SequenceWithAnnotation class with quality scores attached.
-   *
-   * This classes adds some usefull functions to handle quality scores.
-   *
-   * @see SequenceQuality
-   * @author Sylvain Gaillard, Vincent Cahais, Julien Dutheil
-   */
-  class SequenceWithQuality :
-    public SequenceWithAnnotation
-  {
-    private:
-      SequenceQuality* qualScores_;
-
-    public:
-
-      /**
-       * @name Constructors
-       * @{
-       */
-
-      /**
-       * @brief Build a new empty SequenceWithQuality
-       *
-       * @param alpha    A pointer to an Alphabet
-       *
-       * @throw BadCharException if a state is not alowed by the Alphabet
-       */
-      SequenceWithQuality(
-          const Alphabet* alpha
-          ):
-        SequenceWithAnnotation(alpha),
-        qualScores_(new SequenceQuality(0, false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::string
-       *
-       * Build a new SequenceWithQuality and set the quality scores to
-       * the default value DEFAULT_QUALITY_VALUE.
-       *
-       * @param name     The name of the sequence
-       * @param sequence The string representing the sequence
-       * @param alpha    A pointer to an Alphabet
-       *
-       * @throw BadCharException if a state is not alowed by the Alphabet
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::string& sequence,
-          const Alphabet* alpha
-          ) throw (BadCharException):
-        SequenceWithAnnotation(name, sequence, alpha),
-        qualScores_(new SequenceQuality(sequence.size(), false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::string
-       *
-       * Build a new SequenceWithQuality and set the quality scores to
-       * the default value DEFAULT_QUALITY_VALUE.
-       *
-       * @param name     The name of the sequence
-       * @param sequence The string representing the sequence
-       * @param comments Comments to add to the sequence
-       * @param alpha    A pointer to an Alphabet
-       *
-       * @throw BadCharException if a state is not alowed by the Alphabet
-       *
-       * @author Vincent Cahais
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::string& sequence,
-          const Comments& comments,
-          const Alphabet* alpha
-          ) throw (BadCharException):
-        SequenceWithAnnotation(name, sequence, comments, alpha),
-        qualScores_(new SequenceQuality(sequence.size(), false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::string
-       *
-       * Build a new SequenceWithQuality and assign quality scores from
-       * a vector of int.
-       *
-       * @param name The name of the sequence
-       * @param sequence The string representing the sequence
-       * @param quality The quality scores
-       * @param alpha A pointer to an alphabet
-       *
-       * @throw BadCharException if a state is not alowed by the Alphabet
-       * @throw DimensionException if the number of quality values is not equal
-       * to the number of sequence states
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::string& sequence,
-          const std::vector<int>& quality,
-          const Alphabet* alpha)
-        throw (BadCharException, DimensionException):
-        SequenceWithAnnotation(name, sequence, alpha),
-        qualScores_(new SequenceQuality(quality, false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::string
-       *
-       * Build a new SequenceWithQuality and assign quality scores from
-       * a vector of int.
-       *
-       * @param name The name of the sequence
-       * @param sequence The string representing the sequence
-       * @param quality The quality scores
-       * @param comments Comments to add to the sequence
-       * @param alpha A pointer to an alphabet
-       *
-       * @throw BadCharException if a state is not alowed by the Alphabet
-       * @throw DimensionException if the number of quality values is not equal
-       * to the number of sequence states
-       *
-       * @author Vincent Cahais
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::string& sequence,
-          const std::vector<int>& quality,
-          const Comments& comments,
-          const Alphabet* alpha)
-        throw (BadCharException, DimensionException):
-        SequenceWithAnnotation(name, sequence, comments, alpha),
-        qualScores_(new SequenceQuality(quality, false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::vector<int>
-       *
-       * Build a new SequenceWithQuality and set the quality scores to
-       * the default value DEFAULT_QUALITY_VALUE.
-       *
-       * @param name The name of the sequence
-       * @param sequence The sequence in int
-       * @param alpha A pointer to an Alphabet
-       *
-       * @throw BadIntException if a state is not alowed by the Alphabet
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::vector<int>& sequence,
-          const Alphabet* alpha)
-        throw (BadIntException):
-        SequenceWithAnnotation(name, sequence, alpha),
-        qualScores_(new SequenceQuality(sequence.size(), false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::vector<int>
-       *
-       * Build a new SequenceWithQuality and set the quality scores to
-       * the default value DEFAULT_QUALITY_VALUE.
-       *
-       * @param name The name of the sequence
-       * @param sequence The sequence in int
-       * @param comments Comments to add to the sequence
-       * @param alpha A pointer to an Alphabet
-       *
-       * @throw BadIntException if a state is not alowed by the Alphabet
-       *
-       * @author Vincent Cahais
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::vector<int>& sequence,
-          const Comments& comments,
-          const Alphabet* alpha)
-        throw (BadIntException):
-        SequenceWithAnnotation(name, sequence, comments, alpha),
-        qualScores_(new SequenceQuality(sequence.size(), false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::vector<int>
-       *
-       * Build a new SequenceWithQuality and assign quality scores from
-       * a vector of int.
-       *
-       * @param name The name of the sequence
-       * @param sequence The sequence in int
-       * @param quality The quality scores
-       * @param alpha A pointer to an Alphabet
-       *
-       * @throw BadIntException if a state is not alowed by the Alphabet
-       * @throw DimensionException if the number of quality values is not equal
-       * to the number of sequence states
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::vector<int>& sequence,
-          const std::vector<int>& quality,
-          const Alphabet* alpha)
-        throw (BadIntException, DimensionException):
-        SequenceWithAnnotation(name, sequence, alpha),
-        qualScores_(new SequenceQuality(quality, false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality from a std::vector<int>
-       *
-       * Build a new SequenceWithQuality and assign quality scores from
-       * a vector of int.
-       *
-       * @param name The name of the sequence
-       * @param sequence The sequence in int
-       * @param quality The quality scores
-       * @param comments Comments to add to the sequence
-       * @param alpha A pointer to an Alphabet
-       *
-       * @throw BadIntException if a state is not alowed by the Alphabet
-       * @throw DimensionException if the number of quality values is not equal
-       * to the number of sequence states
-       *
-       * @author Vincent Cahais
-       */
-      SequenceWithQuality(
-          const std::string& name,
-          const std::vector<int>& sequence,
-          const std::vector<int>& quality,
-          const Comments& comments,
-          const Alphabet* alpha)
-        throw (BadIntException, DimensionException):
-        SequenceWithAnnotation(name, sequence, comments, alpha),
-        qualScores_(new SequenceQuality(quality, false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality
-       *
-       * Build a new SequenceWithQuality from a Sequence object and set the
-       * quality scores to the default value DEFAULT_QUALITY_VALUE.
-       *
-       * @param s The Sequence object
-       */
-      SequenceWithQuality(const Sequence& s) :
-        SequenceWithAnnotation(s), qualScores_(new SequenceQuality(s.size(), false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /**
-       * @brief Build a new SequenceWithQuality
-       *
-       * Build a new SequenceWithQuality from a Sequence object and set the
-       * quality scores from a vector of int.
-       *
-       * @param s The Sequence object
-       * @param sc The quality scores
-       *
-       * @throw DimensionException if the number of quality values is not equal
-       * to the number of sequence states
-       */
-      SequenceWithQuality(
-          const Sequence& s,
-          const std::vector<int>& sc)
-        throw (DimensionException):
-        SequenceWithAnnotation(s),
-        qualScores_(new SequenceQuality(sc, false))
-      {
-        addAnnotation(qualScores_);
-      }
-
-      /** @} */
-
-      /**
-       * @name Destructor
-       * @{
-       */
-      virtual ~SequenceWithQuality() {}
-      /** @} */
-
-      SequenceWithQuality(const SequenceWithQuality& sequence) : 
-        SequenceWithAnnotation(sequence), qualScores_(0)
-      {
-        qualScores_ = dynamic_cast<SequenceQuality*>(&getAnnotation(SequenceQuality::QUALITY_SCORE));                  
-      }
-
-      SequenceWithQuality& operator=(const SequenceWithQuality& sequence)
-      { 
-        SequenceWithAnnotation::operator=(sequence);
-        qualScores_ = dynamic_cast<SequenceQuality*>(&getAnnotation(SequenceQuality::QUALITY_SCORE));
-        return *this;
-      }
-
-      /**
-       * @name The Clonable interface
-       * @{
-       */
-#ifdef NO_VIRTUAL_COV
-      Clonable*
-#else
-      SequenceWithQuality*
-#endif
-      clone() const { return new SequenceWithQuality(*this); }
-      /** @} */
-
-      /**
-       * @name Dealing with quality
-       * @{
-       */
-
-      /**
-       * @brief Set the quality score
-       *
-       * @param pos The position where the quality must be set
-       * @param quality The quality value
-       *
-       * @throw IndexOutOfBoundsException if pos is greater than the
-       * sequence size
-       */
-      void setQuality(size_t pos, int quality) throw (IndexOutOfBoundsException) {
-        //if (pos >= qualScores_->getSize())
-        //  throw IndexOutOfBoundsException("SequenceWithQuality::setQuality: pos out of bounds", pos, 0, qualScores_->getSize() - 1);
-        //qualScores_[pos] = quality;
-        qualScores_->setScore(pos, quality);
-      }
-      
-      /**
-       * @brief Get the quality score
-       *
-       * @param pos The position where the quality is read
-       *
-       * @return The quality score
-       *
-       * @throw IndexOutOfBoundsException if pos is greater than the
-       * sequence size
-       */
-      int getQuality(size_t pos) const throw (IndexOutOfBoundsException) {
-        if (pos >= qualScores_->getSize())
-          throw IndexOutOfBoundsException("SequenceWithQuality::getQuality: pos out of bounds", pos, 0, qualScores_->getSize() - 1);
-        return (*qualScores_)[pos];
-      }
-
-      /**
-       * @brief Set the whole quality scores
-       *
-       * @param quality The vector of quality scores
-       *
-       * @throw DimensionException if the quality vector does not feet the
-       * sequence size
-       */
-      void setQualities(const std::vector<int>& quality) throw (DimensionException) {
-        if (quality.size() != qualScores_->getSize())
-          throw DimensionException("SequenceWithQuality::setQualities: quality must fit sequence size", quality.size(), qualScores_->getSize());
-        qualScores_->setScores(quality);
-      }
-
-      /**
-       * @brief Get the whole quality scores
-       *
-       * @return A reference to the quality vector
-       */
-      const std::vector<int>& getQualities() const {
-        return qualScores_->getScores();
-      }
-
-      void append(const std::vector<int>& content)
-        throw (BadIntException)
-      {
-        SequenceWithAnnotation::append(content);
-      }
-
-      /**
-       * @brief Append content with quality
-       *
-       * @param content A vector of int to append to the sequence
-       * @param qualities A vector of int to append to the qualities
-       *
-       * @throw BadIntException if one of the content int is not in the
-       * Alphabet
-       * @throw DimensionException if qualities does not have the same size as
-       * content
-       */
-      void append(
-          const std::vector<int>& content,
-          const std::vector<int>& qualities)
-        throw (BadIntException, DimensionException)
-      {
-        if (content.size() != qualities.size())
-          throw DimensionException("SequenceWithQuality::append: qualities must fit content size", qualities.size(), content.size());
-        size_t pos = qualScores_->getSize();
-        append(content); //This automatically extend scores array with default values through the listener
-        //Update scores:
-        qualScores_->setScores(pos, qualities);
-      }
-
-      void append(const std::vector<std::string>& content)
-        throw (BadCharException)
-      {
-        SequenceWithAnnotation::append(content);
-      }
-
-      /**
-       * @brief Append content with quality
-       *
-       * @param content A vector of string to append to the sequence
-       * @param qualities A vector of int to append to the qualities
-       *
-       * @throw BadCharException if one of the content string is not in the
-       * Alphabet
-       * @throw DimensionException if qualities does not have the same size as
-       * content
-       */
-      void append(
-          const std::vector<std::string>& content,
-          const std::vector<int>& qualities)
-        throw (BadCharException, DimensionException)
-      {
-        if (content.size() != qualities.size())
-          throw DimensionException("SequenceWithQuality::append: qualities must fit content size", qualities.size(), content.size());
-        size_t pos = qualScores_->getSize();
-        SequenceWithAnnotation::append(content); //This automatically extend scores array with default values through the listener
-        //Update scores:
-        qualScores_->setScores(pos, qualities);
-      }
-
-      void append(const std::string& content)
-        throw (BadCharException)
-      {
-        SequenceWithAnnotation::append(content);
-      }
-
-      /**
-       * @brief Append content with quality
-       *
-       * @param content A string to append to the sequence
-       * @param qualities A vector of int to append to the qualities
-       *
-       * @throw BadCharException if one of the character of the string is not in
-       * the Alphabet
-       * @throw DimensionException if qualities does not have the same size as
-       * content
-       */
-      void append(
-          const std::string& content,
-          const std::vector<int>& qualities)
-        throw (BadCharException, DimensionException)
-      {
-        if (content.size() / this->getAlphabet()->getStateCodingSize()
-            != qualities.size())
-          throw DimensionException("SequenceWithQuality::append: qualities must fit content size", qualities.size(), content.size() / this->getAlphabet()->getStateCodingSize());
-        size_t pos = qualScores_->getSize();
-        SequenceWithAnnotation::append(content); //This automatically extend scores array with default values through the listener
-        //Update scores:
-        qualScores_->setScores(pos, qualities);
-      }
-
-      void addElement(
-          const std::string& c)
-        throw (BadCharException)
-      {
-        SequenceWithAnnotation::addElement(c);
-      }
-
-      /**
-       * @brief Add a character to the end of the list with quality
-       *
-       * @param c The element to add to the sequence
-       * @param q The quality of this element
-       *
-       * @throw BadCharException if one of the character of the string is not in
-       * the Alphabet
-       */
-      void addElement(
-          const std::string& c, int q)
-        throw (BadCharException)
-      {
-        SequenceWithAnnotation::addElement(c);
-        qualScores_->setScore(size() - 1, q);
-      }
-
-      void addElement(size_t pos, const std::string& c)
-        throw (BadCharException, IndexOutOfBoundsException)
-      {
-        SequenceWithAnnotation::addElement(pos, c);
-      }
-
-      /**
-       * @brief Add a character to a certain position in the list with quality
-       *
-       * @param pos The position where the element will be inserted
-       * @param c The element to add to the sequence
-       * @param q The quality of this element
-       *
-       * @throw BadCharException if one of the character of the string is not in
-       * the Alphabet
-       * @throw IndexOutOfBoundsException if pos is greater than the sequence
-       * size
-       */
-      void addElement(
-          size_t pos, const std::string& c, int q)
-        throw (BadCharException, IndexOutOfBoundsException)
-      {
-        SequenceWithAnnotation::addElement(pos, c);
-        qualScores_->setScore(pos, q);
-      }
-
-      void addElement(int v)
-        throw (BadIntException)
-      {
-        SequenceWithAnnotation::addElement(v);
-      }
-
-      /**
-       * @brief Add a character to the end of the list with quality
-       *
-       * @param v The element to add to the sequence
-       * @param q The quality of this element
-       *
-       * @throw BadIntException if the value does not match the current Alphabet
-       */
-      void addElement(int v, int q)
-        throw (BadIntException)
-      {
-        SequenceWithAnnotation::addElement(v);
-        qualScores_->setScore(size() - 1, q);
-      }
-
-      void addElement(size_t pos, int v)
-        throw (BadIntException, IndexOutOfBoundsException)
-      {
-        SequenceWithAnnotation::addElement(pos, v);
-      }
-
-      /**
-       * @brief Add a character to a certain position in the list with quality
-       *
-       * @param pos The position where the element will be inserted
-       * @param v The element to add to the sequence
-       * @param q The quality of this element
-       *
-       * @throw BadIntException if the value does not match the current Alphabet
-       * @throw IndexOutOfBoundsException if pos is greater than the sequence
-       * size
-       */
-      void addElement(size_t pos, int v, int q)
-        throw (BadCharException, IndexOutOfBoundsException)
-      {
-        SequenceWithAnnotation::addElement(pos, v);
-        qualScores_->setScore(pos, q);
-      }
-
-      /** @} */
-
-  };
-
-} // end of namespace bpp.
-
-#endif // _SEQUENCEWITHQUALITY_H_
-
diff --git a/src/Bpp/Seq/SequenceWithQualityTools.cpp b/src/Bpp/Seq/SequenceWithQualityTools.cpp
deleted file mode 100644
index 8a104d3..0000000
--- a/src/Bpp/Seq/SequenceWithQualityTools.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-//
-// File:       SequenceWithQualityTools.h
-// Authors:    Vincent Cahais
-//             Sylvain Gaillard
-// Created on: 16 Apr 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (Apr 16, 2010)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SequenceWithQualityTools.h"
-
-using namespace bpp;
-using namespace std;
-
-DNA SequenceWithQualityTools::_DNA;
-RNA SequenceWithQualityTools::_RNA;
-NucleicAcidsReplication SequenceWithQualityTools::_DNARep(& _DNA, & _DNA);
-NucleicAcidsReplication SequenceWithQualityTools::_RNARep(& _RNA, & _RNA);
-NucleicAcidsReplication SequenceWithQualityTools::_transc(& _DNA, & _RNA);
-
-/******************************************************************************/
-
-SequenceWithQuality * SequenceWithQualityTools::subseq(const SequenceWithQuality & sequence, unsigned int begin, unsigned int end) throw (IndexOutOfBoundsException, Exception)
-{
-	// Checking interval
-	if (end >= sequence.size()) throw IndexOutOfBoundsException ("SequenceTools::subseq : Invalid upper bound", end, 0, sequence.size());
-	if (end < begin) throw Exception ("SequenceTools::subseq : Invalid interval");
-
-	// Copy sequence
-	vector<int> temp(sequence.getContent());
-	vector<int> qualtemp(sequence.getQualities());
-
-	// Truncate sequence
-	temp.erase(temp.begin() + end + 1, temp.end());
-	temp.erase(temp.begin(), temp.begin() + begin);
-	qualtemp.erase(qualtemp.begin() + end + 1, qualtemp.end());
-	qualtemp.erase(qualtemp.begin(), qualtemp.begin() + begin);
-
-	// New sequence creation
-	return new SequenceWithQuality(sequence.getName(), temp, qualtemp, sequence.getComments(), sequence.getAlphabet());
-
-}
-
-/******************************************************************************/
-
-SequenceWithQuality* SequenceWithQualityTools::concatenate(const SequenceWithQuality& seqwq1, const SequenceWithQuality& seqwq2) throw (AlphabetMismatchException, Exception)
-{
-	// Sequence's alphabets matching verification
-	if ((seqwq1.getAlphabet()->getAlphabetType()) != (seqwq2.getAlphabet()->getAlphabetType()))
-		throw AlphabetMismatchException("SequenceTools::concatenate : Sequence's alphabets don't match ", seqwq1.getAlphabet(), seqwq2.getAlphabet());
-
-	// Sequence's names matching verification
-	if (seqwq1.getName() != seqwq2.getName())
-    throw Exception ("SequenceTools::concatenate : Sequence's names don't match");
-
-	// Concatenate sequences and send result
-	vector<int> sequence  = seqwq1.getContent();
-	vector<int> sequence2 = seqwq2.getContent();
-	vector<int> qualities = seqwq1.getQualities();
-	vector<int> qualities2 = seqwq2.getQualities();
-
-	sequence.insert(sequence.end(), sequence2.begin(), sequence2.end());
-	qualities.insert(qualities.end(), qualities2.begin(), qualities2.end());
-	return new SequenceWithQuality(seqwq1.getName(), sequence, qualities, seqwq1.getComments(), seqwq1.getAlphabet());
-}
-
-/******************************************************************************/
-
-SequenceWithQuality* SequenceWithQualityTools::complement(const SequenceWithQuality& sequence) throw (AlphabetException)
-{
-  // Alphabet type checking
-  NucleicAcidsReplication * NAR;
-  if (sequence.getAlphabet()->getAlphabetType() == "DNA alphabet")
-  {
-    NAR = &_DNARep;
-  }
-  else if(sequence.getAlphabet()->getAlphabetType() == "RNA alphabet")
-  {
-    NAR = &_RNARep;
-  }
-  else
-  {
-    throw AlphabetException ("SequenceTools::complement : Sequence must be nucleic.", sequence.getAlphabet());
-  }
-  Sequence * seq = NAR->translate(sequence);
-  SequenceWithQuality * seqwq = new SequenceWithQuality(sequence.getName(), seq->getContent(), sequence.getQualities(), sequence.getComments(), sequence.getAlphabet());
-  delete seq;
-  return seqwq;
-}
-
-/******************************************************************************/
-
-SequenceWithQuality* SequenceWithQualityTools::transcript(const SequenceWithQuality& sequence) throw (AlphabetException)
-{
-  // Alphabet type checking
-  if (sequence.getAlphabet()->getAlphabetType() != "DNA alphabet")
-  {
-    throw AlphabetException ("SequenceTools::transcript : Sequence must be DNA", sequence.getAlphabet());
-  }
-  Sequence * seq = _transc.translate(sequence);
-  SequenceWithQuality * seqwq = new SequenceWithQuality(sequence.getName(), seq->getContent(), sequence.getQualities(), sequence.getComments(), sequence.getAlphabet());
-  delete seq;
-  return seqwq;
-}
-
-/******************************************************************************/
-
-SequenceWithQuality* SequenceWithQualityTools::reverseTranscript(const SequenceWithQuality& sequence) throw (AlphabetException)
-{
-  // Alphabet type checking
-  if (sequence.getAlphabet()->getAlphabetType() != "RNA alphabet")
-  {
-    throw AlphabetException ("SequenceTools::reverseTranscript : Sequence must be RNA", sequence.getAlphabet());
-  }
-
-  Sequence * seq = _transc.reverse(sequence);
-  SequenceWithQuality * seqwq = new SequenceWithQuality(sequence.getName(), seq->getContent(), sequence.getQualities(), sequence.getComments(), sequence.getAlphabet());
-  delete seq;
-  return seqwq;
-}
-
-/******************************************************************************/
-
-SequenceWithQuality* SequenceWithQualityTools::invert(const SequenceWithQuality& sequence)
-{
-  vector<int> iContent(sequence.getContent().rbegin(),sequence.getContent().rend());
-  vector<int> iQualities(sequence.getQualities().rbegin(),sequence.getQualities().rend());
-  SequenceWithQuality* iSeq = sequence.clone();
-  iSeq->setContent(iContent);
-  iSeq->setQualities(iQualities);
-
-  return iSeq;
-}
-
-/******************************************************************************/
-
-SequenceWithQuality* SequenceWithQualityTools::removeGaps(const SequenceWithQuality& seq)
-{
-  vector<int> content;
-  vector<int> qualities;
-  const Alphabet * alpha = seq.getAlphabet();
-  for(unsigned int i = 0; i < seq.size(); i++)
-  {
-    if(! alpha->isGap(seq[i]))
-    {
-    	content.push_back(seq[i]);
-    	qualities.push_back(seq.getQualities()[i]);
-    }
-  }
-  SequenceWithQuality * newSeq = dynamic_cast<SequenceWithQuality *>(seq.clone());
-  newSeq->setContent(content);
-  newSeq->setQualities(qualities);
-  return newSeq;
-}
-
-/******************************************************************************/
-
-SequenceWithQuality& SequenceWithQualityTools::trimLeft(SequenceWithQuality& seq) {
-  bool badqual = false;
-  while (badqual) {
-  }
-  return seq;
-}
diff --git a/src/Bpp/Seq/SequenceWithQualityTools.h b/src/Bpp/Seq/SequenceWithQualityTools.h
deleted file mode 100644
index 41035d0..0000000
--- a/src/Bpp/Seq/SequenceWithQualityTools.h
+++ /dev/null
@@ -1,175 +0,0 @@
-//
-// File:       SequenceWithQualityTools.h
-// Authors:    Vincent Cahais
-//             Sylvain Gaillard
-// Created on: 16 Apr 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (Apr 16, 2010)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef SEQUENCEWITHQUALITYTOOLS_H_
-#define SEQUENCEWITHQUALITYTOOLS_H_
-
-#include "SequenceTools.h"
-#include "SequenceWithQuality.h"
-
-namespace bpp {
-  /**
-   * @brief The SequenceWithQualityTools static class
-   *
-   * Implement methods to manipulate SequencesWithQuality
-   *
-   * @todo
-   * - does complement, transcript and reverseTranscript have a meaning on
-   *   SequenceWithQuality as the quality is not transferable
-   *
-   * @author Cahais Vincent
-   */
-
-  class SequenceWithQualityTools {
-    private:
-      static DNA _DNA;
-      static RNA _RNA;
-      static NucleicAcidsReplication _DNARep;
-      static NucleicAcidsReplication _RNARep;
-      static NucleicAcidsReplication _transc;
-
-    public:
-
-      /**
-       * @brief Get a sub-sequence.
-       *
-       * @param sequence The sequence to trunc.
-       * @param begin The first position of the subsequence.
-       * @param end   The last position of the subsequence.
-       * @return A new SequenceWithQuality object with the given subsequence.
-       * @throw IndexOutOfBoundsException, Exception In case of bad indices.
-       */
-      static SequenceWithQuality* subseq(
-          const SequenceWithQuality& sequence,
-          unsigned int begin,
-          unsigned int end
-          ) throw (IndexOutOfBoundsException, Exception) ;
-
-      /**
-       * @brief Concatenate two sequences.
-       *
-       * Sequences must have the same name and alphabets.
-       * Only first sequence's commentaries are kept.
-       *
-       * @param seqwq1 The first SequenceWithQuality.
-       * @param seqwq2 The second SequenceWithQuality.
-       * @return A new SequenceWithQuality object with the concatenation of the
-       * two sequences.
-       * @throw AlphabetMismatchException If the two alphabets do not match.
-       * @throw Exception If the sequence names do not match.
-       */
-      static SequenceWithQuality* concatenate(
-          const SequenceWithQuality& seqwq1,
-          const SequenceWithQuality& seqwq2
-          ) throw (AlphabetMismatchException, Exception) ;
-
-      /**
-       * @brief Get the complementary sequence of a nucleotide sequence.
-       *
-       * @see DNAReplication
-       * @return sequence A new SequenceWithQuality object with the
-       * complementary sequence.
-       * @param sequence The sequence to complement.
-       * @throw AlphabetException If the sequence is not a nucleotide sequence.
-       */
-      static SequenceWithQuality* complement(
-          const SequenceWithQuality& sequence
-          ) throw (AlphabetException);
-
-      /**
-       * @brief Get the transcription sequence of a DNA sequence.
-       *
-       * @see DNAReplication
-       * @return sequence A new SequenceWithQuality object with the
-       * transcription sequence.
-       * @param sequence The sequence to transcript.
-       * @throw AlphabetException If the sequence is not a DNA sequence.
-       */
-      static SequenceWithQuality* transcript(
-          const SequenceWithQuality& sequence
-          ) throw (AlphabetException);
-
-      /**
-       * @brief Get the reverse-transcription sequence of a RNA sequence.
-       *
-       * @see DNAReplication
-       * @return sequence A new SequenceWithQuality object with the reverse-
-       * transcription sequence.
-       * @param sequence The SequenceWithQuality to reverse-transcript.
-       * @throw AlphabetException If the sequence is not a RNA sequence.
-       */
-
-      static SequenceWithQuality* reverseTranscript(
-          const SequenceWithQuality& sequence
-          ) throw (AlphabetException);
-      /**
-       * @brief Inverse a sequence from 5'->3' to 3'->5' and vice-versa.
-       *
-       * ABCDEF becomes FEDCBA, and the sense attribute is changed (may be
-       * inhibited).
-       *
-       * @return A new SequenceWithQuality object containing the inverted
-       * sequence.
-       * @param sequence The SequenceWithQuality to inverse.
-       */
-      static SequenceWithQuality* invert(
-          const SequenceWithQuality& sequence
-          );
-
-      /**
-       * @brief Remove gaps from a SequenceWithQuality.
-       *
-       * @param seq The sequence to analyse.
-       * @return A new SequenceWithQuality object without gaps.
-       */
-      static SequenceWithQuality* removeGaps(const SequenceWithQuality& seq);
-
-      /**
-       * @brief Trim the left part of the sequence according to quality
-       *
-       * @param seq The sequence to analyse.
-       * @return The modified sequence.
-       */
-      static SequenceWithQuality& trimLeft(SequenceWithQuality& seq);
-
-  };
-}
-
-#endif /* SEQUENCEWITHQUALITYTOOLS_H_ */
diff --git a/src/Bpp/Seq/Site.cpp b/src/Bpp/Seq/Site.cpp
deleted file mode 100644
index c1f8bf4..0000000
--- a/src/Bpp/Seq/Site.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// File Site.cpp
-// Author: Julien Dutheil
-//         Guillaume Deuchst
-// Created on: Tuesday August 7 2003
-//
- 
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Site.h"
-
-#include "StringSequenceTools.h"
-
-using namespace bpp;
-
-// From the STL:
-#include <iostream>
-
-using namespace std;
-
-/****************************************************************************************/
-
-Site::Site(const Alphabet* alpha) : BasicSymbolList(alpha), position_(0) {}
-
-Site::Site(const Alphabet* alpha, int position) : BasicSymbolList(alpha), position_(position) {}
-
-Site::Site(const vector<string>& site, const Alphabet* alpha) throw (BadCharException) : BasicSymbolList(site, alpha), position_(0) {}
-
-Site::Site(const vector<string>& site, const Alphabet* alpha, int position) throw (BadCharException) : BasicSymbolList(site, alpha), position_(position) {}
-
-Site::Site(const vector<int>& site, const Alphabet* alpha) throw (BadIntException) : BasicSymbolList(site, alpha), position_(0) {}
-
-Site::Site(const vector<int>& site, const Alphabet* alpha, int position) throw (BadIntException) : BasicSymbolList(site, alpha), position_(position) {}
-
-/****************************************************************************************/
-
-Site::Site(const Site& site): BasicSymbolList(site), position_(site.getPosition()) {}
-
-Site& Site::operator=(const Site& s)
-{
-  SymbolList::operator=(s);
-	content_  = s.getContent();
-	position_ = s.getPosition();
-	return *this;
-}
-
-/****************************************************************************************/
-
-bool operator==(const Site& site1, const Site& site2)
-{
-	// Verify that site's size, position and content are equals
-	if(site1.size() != site2.size()) return false;
-	if(site1.getPosition() != site2.getPosition()) return false;
-	else {
-		for(unsigned int i = 0; i < site1.size(); i++) {
-			if(site1[i] != site2[i]) return false;
-		}
-		return true;
-	}
-}
-
-/****************************************************************************************/
-
-bool operator<(const Site& site1, const Site& site2)
-{
-	return site1.getPosition() < site2.getPosition();
-}
-
-/****************************************************************************************/
-
diff --git a/src/Bpp/Seq/Site.h b/src/Bpp/Seq/Site.h
deleted file mode 100644
index 397c57f..0000000
--- a/src/Bpp/Seq/Site.h
+++ /dev/null
@@ -1,179 +0,0 @@
-//
-// File Site.h
-// Created by: Guillaume Deuchst
-//             Julien Dutheil
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SITE_H_
-#define _SITE_H_
-
-#include "SymbolList.h"
-#include "SiteExceptions.h"
-
-namespace bpp
-{
-
-/**
- * @brief The Site class.
- *
- * Define specific attributes and methods for sites manipulation.
- * It is very similar to the Sequence object (a site is a vertical sequence!),
- * and characters at each position are coded as integers.
- * Sites have a 'position' attribute.
- * This attribute stands for an indice in a an alignment, and may be used as a unique identifier,
- * in the same manner that names identify sequence objects.
- * But for now, we do not allow to construct a Site directly from a string.
- * This should not be a constraint, since you never read sites directly from a file.
- */
-class Site:
-  public BasicSymbolList 
-{  
-  private:
-    /**
-     * @brief The position associated to this site.
-     */
-    int position_;
-
-  public:
-    
-    /**
-     * @brief Build a new void Site object with the specified alphabet.
-     *
-     * @param alpha The alphabet to use.
-     */
-    Site(const Alphabet* alpha);
-
-    /**
-     * @brief Build a new void Site object with the specified alphabet and position.
-     *
-     * @param alpha    The alphabet to use.
-     * @param position The position attribute for this site.
-     */
-    Site(const Alphabet* alpha, int position);
-
-    /**
-     * @brief Build a new Site object with the specified alphabet.
-     * The content of the site is initialized from a vector of characters.
-     *
-     * @param site     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @throw BadCharException If the content does not match the specified alphabet.
-     */
-    Site(const std::vector<std::string>& site, const Alphabet* alpha) throw (BadCharException);
-
-    /**
-     * @brief Build a new Site object with the specified alphabet and position.
-     * The content of the site is initialized from a vector of characters.
-     *
-     * @param site     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @param position The position attribute for this site.
-     * @throw BadCharException If the content does not match the specified alphabet.
-     */
-    Site(const std::vector<std::string>& site, const Alphabet* alpha, int position) throw (BadCharException);
-
-    /**
-     * @brief Build a new Site object with the specified alphabet.
-     * The content of the site is initialized from a vector of integers.
-     *
-     * @param site     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @throw BadIntException If the content does not match the specified alphabet.
-     */
-    Site(const std::vector<int>& site, const Alphabet* alpha) throw (BadIntException);
-
-    /**
-     * @brief Build a new Site object with the specified alphabet and position.
-     * The content of the site is initialized from a vector of integers.
-     *
-     * @param site     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @param position The position attribute for this site.
-     * @throw BadIntException If the content does not match the specified alphabet.
-     */
-    Site(const std::vector<int>& site, const Alphabet* alpha, int position) throw (BadIntException);
-
-    /**
-     * @brief The copy constructor.
-     */
-    Site(const Site& site);
-
-    /**
-     * @brief The assignment operator.
-     */
-    Site& operator=(const Site& s);
-
-    virtual ~Site() {}
-  
-  public:
-
-    /**
-     * @name The Clonable interface
-     *
-     * @{
-     */
-    Site* clone() const { return new Site(*this); }
-    /** @} */
-
-    /**
-     * @name Setting/getting the position of the site.
-     *
-     * @{
-     */
-
-    /**
-     * @brief Get the position of this site.
-     *
-     * @return This site position.
-     */
-    virtual int getPosition() const { return position_; }
-
-    /**
-     * @brief Set the position of this site.
-     *
-     * @param position The new position of the site.
-     */
-    virtual void setPosition(int position) { position_ = position; }
-};
-
-// Sites comparison operators overload
-bool operator == (const Site& site1, const Site& site2);
-bool operator < (const Site& site1, const Site& site2);
-
-} //end of namespace bpp.
-
-#endif  //_SITE_H_
-
diff --git a/src/Bpp/Seq/SiteExceptions.h b/src/Bpp/Seq/SiteExceptions.h
deleted file mode 100644
index 8a35e22..0000000
--- a/src/Bpp/Seq/SiteExceptions.h
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// File: SiteExceptions.h
-// Author : Julien Dutheil
-// Created on: dim mar 7 2004
-// 
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SITEEXCEPTIONS_H_
-#define _SITEEXCEPTIONS_H_
-
-#include <Bpp/Exceptions.h>
-
-namespace bpp
-{
-
-class Site;
-
-/**
- * @brief The site exception base class.
- *
- * @see Exception
- */
-class SiteException:
-  public Exception
-{
-	private:
-
-		/**
-		 * @brief A pointer toward a site object.
-		 */
-		const Site* site_;
-
-	public:	// Class constructor
-
-		/**
-		 * @brief Build a new SiteException object.
-		 *
-		 * @param text A message to be passed to the exception hierarchy.
-		 * @param s    A const pointer toward the site that threw the exception.
-		 */
-		SiteException(const std::string& text, const Site* s = 0);
-
-    SiteException(const SiteException& se): Exception(se), site_(se.site_) {}
-    
-    SiteException& operator=(const SiteException& se)
-    {
-      Exception::operator=(se);
-      site_ = se.site_;
-      return *this;
-    }
-
-		// Class destructor
-		virtual ~SiteException() throw() {}
-
-	public:
-
-		/**
-		 * @brief Get the site that threw the exception.
-		 *
-		 * @return A const pointer toward the site.
-		 */
-		virtual const Site* getSite() const { return site_; };
-};
-
-/**
- * @brief Exception sent when a empty site is found.
- */
-class EmptySiteException:
-  public SiteException
-{
-	public:
-		EmptySiteException(const std::string& text, const Site* s = 0): SiteException(text, s) {}
-
-		virtual ~EmptySiteException() throw() {}
-};
-
-/**
- * @brief Exception sent when a site containing gap is found.
- */
-class SiteWithGapException:
-  public SiteException
-{
-	public:
-		SiteWithGapException(const std::string& text, const Site* s = 0): SiteException(text, s) {}
-
-		virtual ~SiteWithGapException() throw() {}
-};
-
-} //end of namespace bpp.
-
-#endif // _SITEEXCEPTIONS_H_
-
diff --git a/src/Bpp/Seq/SiteTools.cpp b/src/Bpp/Seq/SiteTools.cpp
deleted file mode 100644
index 1431648..0000000
--- a/src/Bpp/Seq/SiteTools.cpp
+++ /dev/null
@@ -1,410 +0,0 @@
-//
-// File SiteTools.cpp
-// Author : Julien Dutheil
-//          Guillaume Deuchst
-// Created on: Friday August 8 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "SiteTools.h"
-#include "Alphabet/CodonAlphabet.h"
-#include <Bpp/Utils/MapTools.h>
-#include <Bpp/Numeric/NumTools.h>
-#include <Bpp/Numeric/VectorTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <cmath>
-
-using namespace std;
-
-/******************************************************************************/
-
-bool SiteTools::hasGap(const Site& site)
-{
-  // Main loop : for all characters in site
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (site.getAlphabet()->isGap(site[i]))
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-bool SiteTools::isGapOnly(const Site& site)
-{
-  // Main loop : for all characters in site
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (!site.getAlphabet()->isGap(site[i]))
-      return false;
-  }
-  return true;
-}
-
-/******************************************************************************/
-
-bool SiteTools::isGapOrUnresolvedOnly(const Site& site)
-{
-  // Main loop : for all characters in site
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (!site.getAlphabet()->isGap(site[i]) && !site.getAlphabet()->isUnresolved(site[i]))
-      return false;
-  }
-  return true;
-}
-
-/******************************************************************************/
-
-bool SiteTools::hasUnknown(const Site& site)
-{
-  // Main loop : for all characters in site
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (site[i] == site.getAlphabet()->getUnknownCharacterCode())
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-bool SiteTools::isComplete(const Site& site)
-{
-  // Main loop : for all characters in site
-  for (size_t i = 0; i < site.size(); i++)
-  {
-    if (site.getAlphabet()->isGap(site[i]) || site.getAlphabet()->isUnresolved(site[i]))
-      return false;
-  }
-  return true;
-}
-
-/******************************************************************************/
-
-bool SiteTools::areSitesIdentical(const Site& site1, const Site& site2)
-{
-  // Site's size and content checking
-  if (site1.getAlphabet()->getAlphabetType() != site2.getAlphabet()->getAlphabetType())
-    return false;
-  if (site1.size() != site2.size())
-    return false;
-  else
-  {
-    for (size_t i = 0; i < site1.size(); i++)
-    {
-      if (site1[i] != site2[i])
-        return false;
-    }
-    return true;
-  }
-}
-
-/******************************************************************************/
-
-bool SiteTools::isConstant(const Site& site, bool ignoreUnknown, bool unresolvedRaisesException) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::isConstant: Incorrect specified site, size must be > 0", &site);
-
-  // For all site's characters
-  int gap = site.getAlphabet()->getGapCharacterCode();
-  if (ignoreUnknown)
-  {
-    int s = site[0];
-    int unknown = site.getAlphabet()->getUnknownCharacterCode();
-    size_t i = 0;
-    while (i < site.size() && (s == gap || s == unknown))
-    {
-      s = site[i];
-      i++;
-    }
-    if (s == unknown || s == gap)
-    {
-      if (unresolvedRaisesException)
-        throw EmptySiteException("SiteTools::isConstant: Site is only made of gaps or generic characters.");
-      else
-        return false;
-    }
-    while (i < site.size())
-    {
-      if (site[i] != s && site[i] != gap && site[i] != unknown)
-        return false;
-      i++;
-    }
-  }
-  else
-  {
-    int s = site[0];
-    size_t i = 0;
-    while  (i < site.size() && s == gap)
-    {
-      s = site[i];
-      i++;
-    }
-    if (s == gap)
-    {
-      if (unresolvedRaisesException)
-        throw EmptySiteException("SiteTools::isConstant: Site is only made of gaps.");
-      else
-        return false;
-    }
-    while (i < site.size())
-    {
-      if (site[i] != s && site[i] != gap)
-        return false;
-      i++;
-    }
-  }
-
-  return true;
-}
-
-/******************************************************************************/
-
-double SiteTools::variabilityShannon(const Site& site, bool resolveUnknown) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::variabilityShannon: Incorrect specified site, size must be > 0", &site);
-  map<int, double> p;
-  getFrequencies(site, p, resolveUnknown);
-  // We need to correct frequencies for gaps:
-  double s = 0.;
-  for (int i = 0; i < static_cast<int>(site.getAlphabet()->getSize()); i++)
-  {
-    double f = p[i];
-    if (f > 0)
-      s += f * log(f);
-  }
-  return -s;
-}
-
-/******************************************************************************/
-
-double SiteTools::mutualInformation(const Site& site1, const Site& site2, bool resolveUnknown) throw (DimensionException, EmptySiteException)
-{
-  // Empty site checking
-  if (site1.size() == 0)
-    throw EmptySiteException("SiteTools::mutualInformation: Incorrect specified site, size must be > 0", &site1);
-  if (site2.size() == 0)
-    throw EmptySiteException("SiteTools::mutualInformation: Incorrect specified site, size must be > 0", &site2);
-  if (site1.size() != site2.size())
-    throw DimensionException("SiteTools::mutualInformation: sites must have the same size!", site1.size(), site2.size());
-  vector<double> p1(site1.getAlphabet()->getSize());
-  vector<double> p2(site2.getAlphabet()->getSize());
-  map<int, map<int, double> > p12;
-  getCounts(site1, site2, p12, resolveUnknown);
-  double mi = 0, tot = 0, pxy;
-  // We need to correct frequencies for gaps:
-  for (size_t i = 0; i < site1.getAlphabet()->getSize(); i++)
-  {
-    for (size_t j = 0; j < site2.getAlphabet()->getSize(); j++)
-    {
-      pxy = p12[static_cast<int>(i)][static_cast<int>(j)];
-      tot += pxy;
-      p1[i] += pxy;
-      p2[j] += pxy;
-    }
-  }
-  for (size_t i = 0; i < site1.getAlphabet()->getSize(); i++)
-  {
-    p1[i] /= tot;
-  }
-  for (size_t j = 0; j < site2.getAlphabet()->getSize(); j++)
-  {
-    p2[j] /= tot;
-  }
-  for (size_t i = 0; i < site1.getAlphabet()->getSize(); i++)
-  {
-    for (size_t j = 0; j < site2.getAlphabet()->getSize(); j++)
-    {
-      pxy = p12[static_cast<int>(i)][static_cast<int>(j)] / tot;
-      if (pxy > 0)
-        mi += pxy * log(pxy / (p1[i] * p2[j]));
-    }
-  }
-  return mi;
-}
-
-/******************************************************************************/
-
-double SiteTools::jointEntropy(const Site& site1, const Site& site2, bool resolveUnknown) throw (DimensionException, EmptySiteException)
-{
-  // Empty site checking
-  if (site1.size() == 0)
-    throw EmptySiteException("SiteTools::jointEntropy: Incorrect specified site, size must be > 0", &site1);
-  if (site2.size() == 0)
-    throw EmptySiteException("SiteTools::jointEntropy: Incorrect specified site, size must be > 0", &site2);
-  if (site1.size() != site2.size())
-    throw DimensionException("SiteTools::jointEntropy: sites must have the same size!", site1.size(), site2.size());
-  map<int, map<int, double> > p12;
-  getCounts(site1, site2, p12, resolveUnknown);
-  double tot = 0, pxy, h = 0;
-  // We need to correct frequencies for gaps:
-  for (size_t i = 0; i < site1.getAlphabet()->getSize(); i++)
-  {
-    for (size_t j = 0; j < site2.getAlphabet()->getSize(); j++)
-    {
-      pxy = p12[static_cast<int>(i)][static_cast<int>(j)];
-      tot += pxy;
-    }
-  }
-  for (size_t i = 0; i < site1.getAlphabet()->getSize(); i++)
-  {
-    for (size_t j = 0; j < site2.getAlphabet()->getSize(); j++)
-    {
-      pxy = p12[static_cast<int>(i)][static_cast<int>(j)] / tot;
-      if (pxy > 0)
-        h += pxy * log(pxy);
-    }
-  }
-  return -h;
-}
-
-/******************************************************************************/
-
-double SiteTools::variabilityFactorial(const Site& site) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::variabilityFactorial: Incorrect specified site, size must be > 0", &site);
-  map<int, size_t> p;
-  getCounts(site, p);
-  vector<size_t> c = MapTools::getValues(p);
-  size_t s = VectorTools::sum(c);
-  long double l = static_cast<long double>(NumTools::fact(s)) / static_cast<long double>(VectorTools::sum(VectorTools::fact(c)));
-  return (static_cast<double>(std::log(l)));
-}
-
-/******************************************************************************/
-
-double SiteTools::heterozygosity(const Site& site) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::heterozygosity: Incorrect specified site, size must be > 0", &site);
-  map<int, double> p;
-  getFrequencies(site, p);
-  vector<double> c = MapTools::getValues(p);
-  double n = VectorTools::norm<double, double>(MapTools::getValues(p));
-  return 1. - n * n;
-}
-
-/******************************************************************************/
-
-size_t SiteTools::getNumberOfDistinctCharacters(const Site& site) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::getNumberOfDistinctCharacters(): Incorrect specified site, size must be > 0", &site);
-  // For all site's characters
-  if (SiteTools::isConstant(site))
-    return 1;
-  map<int, size_t> counts;
-  SymbolListTools::getCounts(site, counts);
-  size_t s = 0;
-  for (map<int, size_t>::iterator it = counts.begin(); it != counts.end(); it++)
-  {
-    if (it->second != 0)
-      s++;
-  }
-  return s;
-}
-
-/******************************************************************************/
-
-bool SiteTools::hasSingleton(const Site& site) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::hasSingleton: Incorrect specified site, size must be > 0", &site);
-  // For all site's characters
-  if (SiteTools::isConstant(site))
-    return false;
-  map<int, size_t> counts;
-  getCounts(site, counts);
-  for (map<int, size_t>::iterator it = counts.begin(); it != counts.end(); it++)
-  {
-    if (it->second == 1)
-      return true;
-  }
-  return false;
-}
-
-/******************************************************************************/
-
-bool SiteTools::isParsimonyInformativeSite(const Site& site) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::isParsimonyInformativeSite: Incorrect specified site, size must be > 0", &site);
-  // For all site's characters
-  if (SiteTools::isConstant(site, false, false))
-    return false;
-  map<int, size_t> counts;
-  SymbolListTools::getCounts(site, counts);
-  size_t npars = 0;
-  for (map<int, size_t>::iterator it = counts.begin(); it != counts.end(); it++)
-  {
-    if (it->second > 1)
-      npars++;
-  }
-  if (npars > 1)
-    return true;
-  return false;
-}
-
-/******************************************************************************/
-
-bool SiteTools::isTriplet(const Site& site) throw (EmptySiteException)
-{
-  // Empty site checking
-  if (site.size() == 0)
-    throw EmptySiteException("SiteTools::isTriplet: Incorrect specified site, size must be > 0", &site);
-  // For all site's characters
-  if (SiteTools::getNumberOfDistinctCharacters(site) >= 3)
-    return true;
-  else
-    return false;
-}
-
-/******************************************************************************/
-
diff --git a/src/Bpp/Seq/SiteTools.h b/src/Bpp/Seq/SiteTools.h
deleted file mode 100644
index f0f3ff1..0000000
--- a/src/Bpp/Seq/SiteTools.h
+++ /dev/null
@@ -1,254 +0,0 @@
-//
-// File SiteTools.h
-// Author: Julien Dutheil
-//         Guillaume Deuchst
-// Last modification : Friday August 8 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#ifndef _SITETOOLS_H_
-#define _SITETOOLS_H_
-
-#include "SymbolListTools.h"
-#include "Site.h"
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <map>
-
-namespace bpp
-{
-/**
- * @brief Utilitary methods dealing with sites.
- */
-
-class SiteTools :
-  public SymbolListTools
-{
-public:
-  SiteTools() {}
-  virtual ~SiteTools() {}
-
-public:
-  /**
-   * @param site A site.
-   * @return True if the site contains one or several gap(s).
-   */
-  static bool hasGap(const Site& site);
-
-  /**
-   * @param site A site.
-   * @return True if the site contains only gaps.
-   */
-  static bool isGapOnly(const Site& site);
-
-  /**
-   * @param site A site.
-   * @return True if the site contains only gaps.
-   */
-  static bool isGapOrUnresolvedOnly(const Site& site);
-
-  /**
-   * @param site A site.
-   * @return True if the site contains one or several unknwn characters.
-   */
-  static bool hasUnknown(const Site& site);
-
-  /**
-   * @param site A site.
-   * @return True if the site contains no gap and no unknown characters.
-   */
-  static bool isComplete(const Site& site);
-
-  /**
-   * @brief Tell if a site is constant, that is displaying the same state in all sequences that do not present a gap.
-   *
-   * @param site A site.
-   * @param ignoreUnknown If true, positions with unknown positions will be ignored.
-   * Otherwise, a site with one single state + any uncertain state will not be considered as constant.
-   * @param unresolvedRaisesException In case of ambiguous case (gap only site for instance), throw an exception. Otherwise returns false.
-   * @return True if the site is made of only one state.
-   * @throw EmptySiteException If the site has size 0 or if the site cannot be resolved (for instance is made of gaps only) and unresolvedRaisesException is set to true.
-   */
-  static bool isConstant(const Site& site, bool ignoreUnknown = false, bool unresolvedRaisesException = true) throw (EmptySiteException);
-
-  /**
-   * @param site1 The first site.
-   * @param site2 The second site.
-   * @return True if the two states have the same content (and, of course, alphabet).
-   */
-  static bool areSitesIdentical(const Site& site1, const Site& site2);
-
-  /**
-   * @brief Compute the Shannon entropy index of a site.
-   *
-   * \f[
-   * I = - \sum_x f_x\cdot \ln(f_x)
-   * \f]
-   * where \f$f_x\f$ is the frequency of state \f$x\f$.
-   *
-   * @author J. Dutheil
-   * @param site A site.
-   * @param resolveUnknowns Tell is unknown characters must be resolved.
-   * @return The Shannon entropy index of this site.
-   * @throw EmptySiteException If the site has size 0.
-   */
-  static double variabilityShannon(const Site& site, bool resolveUnknowns) throw (EmptySiteException);
-
-  /**
-   * @brief Compute the factorial diversity index of a site.
-   *
-   * \f[
-   * F = \frac{log\left(\left(\sum_x p_x\right)!\right)}{\sum_x \log(p_x)!}
-   * \f]
-   * where \f$p_x\f$ is the number of times state \f$x\f$ is observed in the site.
-   *
-   * @author J. Dutheil
-   * @param site A site.
-   * @return The factorial diversity index of this site.
-   * @throw EmptySiteException If the site has size 0.
-   */
-  static double variabilityFactorial(const Site& site) throw (EmptySiteException);
-
-  /**
-   * @brief Compute the mutual information between two sites.
-   *
-   * \f[
-   * MI = \sum_x \sum_y p_{x,y}\ln\left(\frac{p_{x,y}}{p_x \cdot p_y}\right)
-   * \f]
-   * where \f$p_x\f$ and \f$p_y\f$ are the frequencies of states \f$x\f$ and \f$y\f$, and
-   * \f$p_{x,y}\f$ is the frequency of the pair \f$(x,y)\f$.
-   *
-   * @author J. Dutheil
-   * @param site1 First site
-   * @param site2 Second site
-   * @param resolveUnknowns Tell is unknown characters must be resolved.
-   * @return The mutual information for the pair of sites.
-   * @throw DimensionException If the sites do not have the same length.
-   * @throw EmptySiteException If the sites have size 0.
-   */
-  static double mutualInformation(const Site& site1, const Site& site2, bool resolveUnknowns) throw (DimensionException,EmptySiteException);
-
-  /**
-   * @brief Compute the entropy of a site. This is an alias of method variabilityShannon.
-   *
-   * \f[
-   * I = - \sum_x f_x\cdot \ln(f_x)
-   * \f]
-   * where \f$f_x\f$ is the frequency of state \f$x\f$.
-   *
-   * @author J. Dutheil
-   * @param site A site.
-   * @param resolveUnknowns Tell is unknown characters must be resolved.
-   * @return The Shannon entropy index of this site.
-   * @throw EmptySiteException If the site has size 0.
-   */
-  static double entropy(const Site& site, bool resolveUnknowns) throw (EmptySiteException) {
-    return variabilityShannon(site, resolveUnknowns); 
-  }
-
-
-  /**
-   * @brief Compute the joint entropy between two sites.
-   *
-   * \f[
-   * H_{i,j} = - \sum_x \sum_y p_{x,y}\ln\left(p_{x,y}\right)
-   * \f]
-   * where \f$p_{x,y}\f$ is the frequency of the pair \f$(x,y)\f$.
-   *
-   * @author J. Dutheil
-   * @param site1 First site
-   * @param site2 Second site
-   * @param resolveUnknowns Tell is unknown characters must be resolved.
-   * @return The mutual information for the pair of sites.
-   * @throw DimensionException If the sites do not have the same length.
-   * @throw EmptySiteException If the sites have size 0.
-   */
-  static double jointEntropy(const Site& site1, const Site& site2, bool resolveUnknowns) throw (DimensionException,EmptySiteException);
-
-  /**
-   * @brief Compute the heterozygosity index of a site.
-   *
-   * \f[
-   * H = 1 - \sum_x f_x^2
-   * \f]
-   * where \f$f_x\f$ is the frequency of state \f$x\f$.
-   *
-   * @param site A site.
-   * @return The heterozygosity index of this site.
-   * @throw EmptySiteException If the site has size 0.
-   */
-  static double heterozygosity(const Site& site) throw (EmptySiteException);
-
-  /**
-   * @brief Give the number of distinct characters at a site.
-   *
-   * @param site a Site
-   * @return The number of distinct characters in the given site.
-   */
-  static size_t getNumberOfDistinctCharacters(const Site& site) throw (EmptySiteException);
-
-  /**
-   * @brief Tell if a site has singletons
-   *
-   *
-   * @param site a Site.
-   * @return True if the site has singletons.
-   */
-  static bool hasSingleton(const Site& site) throw (EmptySiteException);
-
-  /**
-   * @brief Tell if a site is a parsimony informative site.
-   *
-   * At least two distinct characters must be present.
-   *
-   * @param site a Site.
-   * @return True if the site is parsimony informative.
-   */
-  static bool isParsimonyInformativeSite(const Site& site) throw (EmptySiteException);
-
-
-  /**
-   * @brief Tell if a site has more than 2 distinct characters
-   *
-   * @param site a Site.
-   * @return True if the site has more than 2 distinct characters
-   */
-  static bool isTriplet(const Site& site) throw (EmptySiteException);
-};
-} // end of namespace bpp.
-
-#endif  // _SITETOOLS_H_
-
diff --git a/src/Bpp/Seq/StringSequenceTools.cpp b/src/Bpp/Seq/StringSequenceTools.cpp
deleted file mode 100644
index fb29e48..0000000
--- a/src/Bpp/Seq/StringSequenceTools.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-//
-// File: StringSequenceTools.cpp
-// Created by: Julien Dutheil
-// Created on: Sun Nov 30 11:29:07 2003
-//
-
-/*
-   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-   This software is a computer program whose purpose is to provide classes
-   for sequences analysis.
-
-   This software is governed by the CeCILL  license under French law and
-   abiding by the rules of distribution of free software.  You can  use,
-   modify and/ or redistribute the software under the terms of the CeCILL
-   license as circulated by CEA, CNRS and INRIA at the following URL
-   "http://www.cecill.info".
-
-   As a counterpart to the access to the source code and  rights to copy,
-   modify and redistribute granted by the license, users are provided only
-   with a limited warranty  and the software's author,  the holder of the
-   economic rights,  and the successive licensors  have only  limited
-   liability.
-
-   In this respect, the user's attention is drawn to the risks associated
-   with loading,  using,  modifying and/or developing or reproducing the
-   software by the user in light of its specific status of free software,
-   that may mean  that it is complicated to manipulate,  and  that  also
-   therefore means  that it is reserved for developers  and  experienced
-   professionals having in-depth computer knowledge. Users are therefore
-   encouraged to load and test the software's suitability as regards their
-   requirements in conditions enabling the security of their systems and/or
-   data to be ensured and,  more generally, to use and operate it in the
-   same conditions as regards security.
-
-   The fact that you are presently reading this means that you have had
-   knowledge of the CeCILL license and that you accept its terms.
- */
-
-#include "StringSequenceTools.h"
-
-#include "Alphabet/AlphabetTools.h"
-#include "Alphabet/DNA.h"
-#include "Alphabet/RNA.h"
-#include "Alphabet/ProteicAlphabet.h"
-#include <Bpp/Text/TextTools.h>
-#include <Bpp/Numeric/Random/RandomTools.h>
-
-using namespace bpp;
-
-// From the STL:
-#include <map>
-#include <ctype.h>
-#include <algorithm>
-#include <iostream>
-
-using namespace std;
-
-/****************************************************************************************/
-
-string StringSequenceTools::subseq(const string& sequence, size_t begin, size_t end) throw (Exception)
-{
-  // Checking interval
-  if (end < begin)
-    throw Exception ("StringSequenceTools::subseq: Invalid interval");
-
-  // Copy sequence
-  string temp(sequence);
-
-  // Truncate sequence
-  temp.erase(temp.begin() + static_cast<ptrdiff_t>(end + 1), temp.end());
-  temp.erase(temp.begin(), temp.begin() + static_cast<ptrdiff_t>(begin));
-
-  // Send result
-  return temp;
-}
-
-/****************************************************************************************/
-
-string StringSequenceTools::setToSizeR(const string& sequence, size_t size)
-{
-  return TextTools::resizeRight(sequence, size, '-');
-}
-
-string StringSequenceTools::setToSizeL(const string& sequence, size_t size)
-{
-  return TextTools::resizeLeft(sequence, size, '-');
-}
-
-/****************************************************************************************/
-
-string StringSequenceTools::deleteChar(const string& sequence, char chars)
-{
-  // Copy sequence
-  string result(sequence);
-
-  // Search and delete specified char
-  for (unsigned int i = 0; i < result.size(); i++)
-  {
-    if (result[i] == chars)
-      result.erase(result.begin() + i);
-  }
-
-  return result;
-}
-
-/****************************************************************************************/
-
-string StringSequenceTools::deleteChar(const string& sequence, string chars)
-{
-  // Copy sequence
-  string result(sequence);
-
-  // For all characters to delete
-  for (unsigned int i = 0; i < chars.size(); i++)
-  {
-    // Search and delete char
-    for (unsigned int j = 0; j < result.size(); j++)
-    {
-      if (result[j] == chars[i])
-        result.erase(result.begin() + j);
-    }
-  }
-
-  return result;
-}
-
-/****************************************************************************************/
-
-string* StringSequenceTools::reverse(const string& sequence)
-{
-  // Initializing
-  string* result = new string;
-
-  // Main loop : reverse all characters of sequence
-  size_t size = sequence.size();
-  for (size_t i = 0; i < size; i++)
-  {
-    *result += sequence[size - i - 1];
-  }
-
-  // Send result
-  return result;
-}
-
-/****************************************************************************************/
-
-string* StringSequenceTools::complement(const string& sequence)
-{
-  // Initializing
-  string* result = new string;
-
-  // Main loop : completement all characters
-  size_t size = sequence.size();
-  for (unsigned int i = 0; i < size; i++)
-  {
-    switch (sequence[i])
-    {
-    case 'A': *result += 'T';
-      break;
-    case 'C': *result += 'G';
-      break;
-    case 'G': *result += 'C';
-      break;
-    case 'T': *result += 'A';
-      break;
-    case 'M': *result += 'K';
-      break;
-    case 'R': *result += 'Y';
-      break;
-    case 'Y': *result += 'R';
-      break;
-    case 'K': *result += 'M';
-      break;
-    case 'V': *result += 'B';
-      break;
-    case 'H': *result += 'D';
-      break;
-    case 'D': *result += 'H';
-      break;
-    case 'B': *result += 'V';
-      break;
-    default: *result += sequence[i];
-      break;
-    }
-  }
-
-  // Send new sequence
-  return result;
-}
-
-/****************************************************************************************/
-
-double StringSequenceTools::getGCcontent(const string& sequence, size_t pos, size_t window) throw (BadIntegerException, Exception)
-{
-  // Frequency counts for nucleotids A, C, G, T
-  map<char, double> counts;
-
-  // Window size checking
-  if (window < sequence.size())
-    throw BadIntegerException("StringSequenceTools::getGCContent : specified window too high", static_cast<int>(window));
-
-  // For last nucleotides
-  if (pos + window > sequence.size())
-  {
-    pos = sequence.size() - window;
-  }
-
-  // Main loop
-  for (size_t i = pos; i < pos + window; i++)
-  {
-    switch (toupper(sequence[i]))
-    {
-    case 'A': counts['A'] += 1;
-      break;
-    case 'C': counts['C'] += 1;
-      break;
-    case 'G': counts['G'] += 1;
-      break;
-    case 'T': counts['T'] += 1;
-      break;
-    case 'M': counts['A'] += 0.5;
-      counts['C'] += 0.5;
-      break;
-    case 'R': counts['A'] += 0.5;
-      counts['G'] += 0.5;
-      break;
-    case 'W': counts['A'] += 0.5;
-      counts['T'] += 0.5;
-      break;
-    case 'S': counts['C'] += 0.5;
-      counts['G'] += 0.5;
-      break;
-    case 'Y': counts['C'] += 0.5;
-      counts['T'] += 0.5;
-      break;
-    case 'K': counts['G'] += 0.5;
-      counts['T'] += 0.5;
-      break;
-    case 'V': counts['A'] += 0.34;
-      counts['C'] += 0.34;
-      counts['G'] += 0.34;
-      break;
-    case 'H': counts['A'] += 0.34;
-      counts['C'] += 0.34;
-      counts['T'] += 0.34;
-      break;
-    case 'D': counts['A'] += 0.34;
-      counts['G'] += 0.34;
-      counts['T'] += 0.34;
-      break;
-    case 'B': counts['C'] += 0.34;
-      counts['G'] += 0.34;
-      counts['T'] += 0.34;
-      break;
-    case '-': throw Exception("StringSequenceTools::getGCContent : Gap found in sequence");
-      break;
-    // Unresolved bases
-    default: counts['A'] += 0.25;
-      counts['C'] += 0.25;
-      counts['G'] += 0.25;
-      counts['T'] += 0.25;
-    }
-  }
-
-  // Calculate and send GC rate
-  return (counts['G'] + counts['C']) / static_cast<double>(window);
-}
-
-/****************************************************************************************/
-
-vector<int> StringSequenceTools::codeSequence(const string& sequence, const Alphabet* alphabet)
-throw (BadCharException)
-{
-  unsigned int size = AlphabetTools::getAlphabetCodingSize(alphabet); // Warning, an exception may be casted here!
-  vector<int> code(static_cast<size_t>(floor(static_cast<double>(sequence.size()) / static_cast<double>(size))));
-  size_t pos = 0;
-  size_t count = 0;
-  while (pos + size <= sequence.size())
-  {
-    code[count] = alphabet->charToInt(sequence.substr(pos, size));
-    count++;
-    pos += size;
-  }
-  return code;
-}
-
-/****************************************************************************************/
-
-string StringSequenceTools::decodeSequence(const vector<int>& sequence, const Alphabet* alphabet) throw (BadIntException)
-{
-  string result = "";
-  for (unsigned int i = 0; i < sequence.size(); i++)
-  {
-    result += alphabet->intToChar(sequence[i]);
-  }
-  return result;
-}
-
-/****************************************************************************************/
-
-Alphabet* StringSequenceTools::getAlphabetFromSequence(const std::string& sequence)
-throw (EmptySequenceException, SequenceException, AlphabetException)
-{
-  // empty sequence test
-  if (sequence.size() == 0)
-  {
-    throw EmptySequenceException("Sequence::getAlphabetFromSequence : Empty sequence string");
-  }
-
-  // initialisation
-  bool p = false; // indicates that a protein specific character is found
-  bool r = false; // indicates that a RNA specific character is found
-  bool u = false; // indicates that an unknown character is found
-  bool pd = false; // Protein or DNA (T)
-
-  // Main loop : for all character in sequence
-  for (unsigned int i = 0; i < sequence.size(); i++)
-  {
-    // Character analyse
-    switch (AlphabetTools::getType(sequence[i]))
-    {
-    case 0: u = true; break;
-    case 3: p = true; break;
-    case 2: r = true; break;
-    case 5: pd = true; break;
-    }
-  }
-
-  if (u)
-    throw AlphabetException ("Sequence::getAlphabetFromSequence : Unknow character detected in specified sequence");
-  if (r && pd)
-    throw SequenceException ("Sequence::getAlphabetFromSequence : Both 'T' and 'U' in the same sequence!");
-  if (r && p)
-    throw SequenceException ("Sequence::getAlphabetFromSequence : Protein character and 'U' in the same sequence!");
-  if (p)
-    return new ProteicAlphabet();
-  if (r)
-    return new RNA();
-  return new DNA();
-}
-
-/****************************************************************************************/
-
diff --git a/src/Bpp/Seq/StringSequenceTools.h b/src/Bpp/Seq/StringSequenceTools.h
deleted file mode 100644
index 224a5fb..0000000
--- a/src/Bpp/Seq/StringSequenceTools.h
+++ /dev/null
@@ -1,204 +0,0 @@
-//
-// File: StringSequenceTools.h
-// Created by: Julien Dutheil
-// Created on: Sun Nov 30 11:29:07 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _STRINGSEQUENCETOOLS_H_
-#define _STRINGSEQUENCETOOLS_H_
-
-#include "Alphabet/Alphabet.h"
-#include "Alphabet/AlphabetExceptions.h"
-#include "SequenceExceptions.h"
-#include <Bpp/Exceptions.h>
-
-// From the STL:
-#include <string>
-#include <vector>
-
-namespace bpp
-{
-
-/**
- * @brief Utilitary methods working on raw string objects.
- *
- * Sequences may be stored as strings, but this approach is not as
- * powerful as using true sequence objects.
- * Consider using the Sequence and SequenceTools classes for more methods.
- *
- * Some of the methods implemented here are internally used by the Sequence object.
- *
- * @see Sequence, Site, SequenceTools, SiteTools
- */
-class StringSequenceTools
-{
-	public:
-    StringSequenceTools() {};
-    ~StringSequenceTools() {};
-	
-	public:
-    
-		/**
-     * @brief Get a subsequence.
-     *
-     * @param sequence The input sequence.
-     * @param begin    The begining position (included).
-     * @param end      The ending position (included).
-     * @return A string with the subsequence.
-     * @throw Exception If position does not not match the interval [0, length].
-     */
-		static std::string subseq(const std::string& sequence, size_t begin, size_t end) throw (Exception);
-
-		/**
-		 * @brief Set up the size of a sequence from the right side.
-		 *
-		 * All new characters are filled with gaps.
-		 * If the specified size is < to the sequence size, the sequence will be truncated.
-		 *
-     * @param sequence The input sequence.
-		 * @param size The new size of the sequence.
-		 */
-		static std::string setToSizeR(const std::string& sequence, size_t size);
-
-    /**
-		 * @brief Set up the size of a sequence from the left side.
-		 *
-		 * All new characters are filled with gaps.
-		 * If the specified size is < to the sequence size, the sequence will be truncated.
-		 *
-     * @param sequence The input sequence.
-		 * @param size The new size of the sequence.
-		 */
-		static std::string setToSizeL(const std::string& sequence, size_t size);
-
-		/**
-     * @brief Delete all occurence of a character in the sequence.
-     *
-     * @param sequence The sequence to parse.
-     * @param chars    The character to remove.
-     * @return         The sequence with all specified characters removed.
-     */
-		static std::string deleteChar(const std::string& sequence, char chars);
-
-    /**
-     * @brief Delete all occurence of several characters in the sequence.
-     *
-     * @param sequence The sequence to parse.
-     * @param chars    The characters to remove.
-     * @return         The sequence with all specified characters removed.
-     */
-		static std::string deleteChar(const std::string& sequence, std::string chars);
-
-    /**
-     * @brief Reverse the sequence.
-     *
-     * @param sequence The sequence to reverse.
-     * @return The reversed sequence.
-     */
-    static std::string* reverse(const std::string& sequence);
-
-    /**
-     * @brief Get the complement of a sequence.
-		 * @deprecated Consider working with sequence objects and translators.
-     *
-     * For this method, sequence is supposed to be of type DNA.
-     *
-     * @param sequence The sequence to complement.
-     * @return The complementary sequence.
-		 * @see Sequence
-		 * @see NucleicAcidsReplication
-     */
-		static std::string* complement(const std::string& sequence);
-
-    /**
-     * @brief Calculate the local GC content of a sequence.
-     *
-		 * GC contents are calculated using a window of specified size around the given position.
-     * Note : Calculus for last nucleotides (sequence's size - window size) will return
-		 * the last possible rate calculated.
-     *
-     * @param sequence The sequence to analyse.
-     * @param pos      The position where to compute the GC content.
-     * @param window   The size of the window to use.
-     * @return The GC content as a ratio (# of GC / window).
-     * @throw BadIntException If the sequence is not of type DNA or RNA.
-     * @throw Exception       Error in calculus (if the sequence contain gaps for instance).
-     */
-		static double getGCcontent(const std::string& sequence, size_t pos, size_t window) throw (BadIntegerException, Exception);
-
-    /**
-     * @brief Convert a string sequence to a vector of int.
-     *
-		 * This method is used in the sequence constructor.
-		 * This deals with the most simple cases: the sequence (string) contains
-		 * a succession of all characters. This is indeed the case for simple
-		 * alphabets, but may be more complicated if the alphabet is coded with
-		 * variable code length.
-     *
-     * @param sequence The sequence to parse.
-     * @param alphabet The alphabet to use to code the sequence.
-     * @return A vector of int codes.
-     * @throw BarCharException If some character does not match the specified alphabet.
-     */
-		static std::vector<int> codeSequence(const std::string& sequence, const Alphabet* alphabet) throw (BadCharException);
-
-    /**
-     * @brief Convert a sequence to its string representation.
-     *
-     * @param sequence The sequence object to convert.
-     * @param alphabet The alphabet to use to decode the sequence.
-     * @return A string representation of the sequence.
-     * @throw BarIntException If some value does not match the specified alphabet.
-     */
-    static std::string decodeSequence(const std::vector<int>& sequence, const Alphabet* alphabet) throw (BadIntException);
-
-		/**
-		 * @brief Parse a sequence and try to guess the correct alphabet to use.
-     *
-		 * @param sequence The sequence to parse.
-     * @return A pointer toward a new Alphabet object.
-     * @throw EmptySequenceException if the sequence is empty.
-     * @throw SequenceException if their is an ambiguity between several alphabet.
-     * @throw AlphabetException if the sequence does not match any alphabet.
-		 */
-		static Alphabet* getAlphabetFromSequence(const std::string& sequence) throw (EmptySequenceException, SequenceException, AlphabetException);
-
-};
-
-} //end of namespace bpp.
-
-#endif	//_STRINGSEQUENCETOOLS_H
-
diff --git a/src/Bpp/Seq/SymbolList.cpp b/src/Bpp/Seq/SymbolList.cpp
deleted file mode 100644
index b7673f2..0000000
--- a/src/Bpp/Seq/SymbolList.cpp
+++ /dev/null
@@ -1,442 +0,0 @@
-//
-// File: SymbolList.cpp
-// Created by: Julien Dutheil
-// Created on: Fri Apr 9 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SymbolList.h"
-#include "StringSequenceTools.h"
-
-using namespace bpp;
-
-using namespace std;
-
-/****************************************************************************************/
-
-BasicSymbolList::BasicSymbolList(const std::vector<string>& list, const Alphabet* alpha) throw (BadCharException) :
-	alphabet_(alpha), content_()
-{
-	setContent(list);
-}
-
-BasicSymbolList::BasicSymbolList(const std::vector<int>& list, const Alphabet* alpha) throw (BadIntException) :
-	alphabet_(alpha), content_()
-{
-	setContent(list);
-}
-
-/****************************************************************************************/
-
-BasicSymbolList::BasicSymbolList(const SymbolList& list):
-  alphabet_(list.getAlphabet()), content_(list.getContent()) {}
-
-BasicSymbolList::BasicSymbolList(const BasicSymbolList& list):
-  alphabet_(list.getAlphabet()), content_(list.getContent()) {}
-
-BasicSymbolList& BasicSymbolList::operator=(const SymbolList& list)
-{
-	content_  = list.getContent();
-	alphabet_ = list.getAlphabet();
-	return *this;
-}
-
-BasicSymbolList& BasicSymbolList::operator=(const BasicSymbolList& list)
-{
-	content_  = list.getContent();
-	alphabet_ = list.getAlphabet();
-	return *this;
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::setContent(const vector<string>& list) throw (BadCharException)
-{
-	// Check list for incorrect characters
-	vector<int> coded(list.size());
-	for (size_t i = 0; i < list.size(); i++)
-		if(!alphabet_->isCharInAlphabet(list[i])) throw BadCharException(list[i], "BasicSymbolList::setContent", alphabet_);
-
-  for (size_t i = 0; i < list.size(); i++) 
-		coded[i] = alphabet_->charToInt(list[i]);
-	
-  //BasicSymbolList is valid:
-	content_ = coded;
-};
-
-/****************************************************************************************/
-
-void BasicSymbolList::setContent(const vector<int>& list) throw (BadIntException)
-{
-	// Check list for incorrect characters
-	for (size_t i = 0; i < list.size(); i++)
-		if(!alphabet_->isIntInAlphabet(list[i]))
-      throw BadIntException(list[i], "BasicSymbolList::setContent", alphabet_);
-	
-  //Sequence is valid:
-	content_ = list;
-};
-
-/****************************************************************************************/
-
-string BasicSymbolList::toString() const
-{
-	return StringSequenceTools::decodeSequence(content_, alphabet_);
-};
-
-/****************************************************************************************/
-
-void BasicSymbolList::addElement(const string& c) throw (BadCharException)
-{
-	content_.push_back(alphabet_->charToInt(c));
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::addElement(size_t pos, const string& c) throw (BadCharException, IndexOutOfBoundsException)
-{
-  if(pos >= content_.size()) throw IndexOutOfBoundsException("BasicSymbolList::addElement. Invalid position.", pos, 0, size() - 1);
-	content_.insert(content_.begin() + static_cast<ptrdiff_t>(pos), alphabet_->charToInt(c));
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::setElement(size_t pos, const string& c) throw (BadCharException, IndexOutOfBoundsException)
-{
-	if(pos >= content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::setElement. Invalid position.", pos, 0, size() - 1);
-	content_[pos] = alphabet_->charToInt(c);
-}
-
-/****************************************************************************************/
-
-string BasicSymbolList::getChar(size_t pos) const throw (IndexOutOfBoundsException)
-{
-	if(pos >= content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::getChar. Invalid position.", pos, 0, size() - 1);
-	string c = "";
-	try
-  {
-		c = alphabet_->intToChar(content_[pos]);
-	}
-  catch(BadIntException bie)
-  {
-		//This should never happen!
-	}
-	return c;
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::deleteElement(size_t pos) throw (IndexOutOfBoundsException)
-{
-	if(pos >= content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::deleteElement. Invalid position.", pos, 0, size() - 1);
-	content_.erase(content_.begin() + static_cast<ptrdiff_t>(pos));
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::deleteElements(size_t pos, size_t len) throw (IndexOutOfBoundsException)
-{
-	if (pos + len > content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::deleteElements. Invalid position.", pos + len, 0, size() - 1);
-	 content_.erase(content_.begin() + static_cast<ptrdiff_t>(pos), content_.begin() + static_cast<ptrdiff_t>(pos + len));
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::addElement(int v) throw (BadIntException)
-{
-	//test:
-	alphabet_->intToChar(v);
-	content_.push_back(v);
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::addElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException)
-{
-	//test:
-	if(pos >= content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::addElement. Invalid position.", pos, 0, size() - 1);
-	alphabet_->intToChar(v);
-	content_.insert(content_.begin() + static_cast<ptrdiff_t>(pos), v);
-}
-
-/****************************************************************************************/
-
-void BasicSymbolList::setElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException)
-{
-	//test:
-  if(pos >= content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::setElement. Invalid position.", pos, 0, size() - 1);
-	alphabet_->intToChar(v);
-	content_[pos] = v;
-}
-
-/****************************************************************************************/
-
-int BasicSymbolList::getValue(size_t pos) const throw (IndexOutOfBoundsException)
-{
-  if(pos >= content_.size())
-    throw IndexOutOfBoundsException("BasicSymbolList::getValue. Invalid position.", pos, 0, size() - 1);
-	return content_[pos];
-}
-
-/****************************************************************************************/
-
-
-/****************************************************************************************/
-
-EdSymbolList::EdSymbolList(const std::vector<string>& list, const Alphabet* alpha) throw (BadCharException) :
-	alphabet_(alpha), propagateEvents_(true), content_(), listeners_()
-{
-	setContent(list);
-}
-
-EdSymbolList::EdSymbolList(const std::vector<int>& list, const Alphabet* alpha) throw (BadIntException) :
-	alphabet_(alpha), propagateEvents_(true), content_(), listeners_()
-{
-	setContent(list);
-}
-
-/****************************************************************************************/
-
-EdSymbolList::EdSymbolList(const SymbolList& list):
-  alphabet_(list.getAlphabet()), propagateEvents_(true), content_(list.getContent()), listeners_() {}
-
-EdSymbolList::EdSymbolList(const EdSymbolList& list):
-  alphabet_(list.getAlphabet()), propagateEvents_(list.propagateEvents_), content_(list.getContent()), listeners_(list.listeners_)
-{
-  for (size_t i = 0; i < listeners_.size(); ++i)
-    if (!list.listeners_[i]->isShared())
-      listeners_[i] = dynamic_cast<SymbolListListener*>(list.listeners_[i]->clone());
-}
-
-EdSymbolList& EdSymbolList::operator=(const SymbolList& list)
-{
-	content_         = list.getContent();
-	alphabet_        = list.getAlphabet();
-  propagateEvents_ = true;
-  for (size_t i = 0; i < listeners_.size(); ++i)
-    if (!listeners_[i]->isShared())
-     delete listeners_[i];
-  listeners_.clear();
-	return *this;
-}
-
-EdSymbolList& EdSymbolList::operator=(const EdSymbolList& list)
-{
-	content_         = list.getContent();
-	alphabet_        = list.getAlphabet();
-  propagateEvents_ = list.propagateEvents_;
-  for (size_t i = 0; i < listeners_.size(); ++i)
-    delete listeners_[i];
-  listeners_ = list.listeners_;
-  for (size_t i = 0; i < listeners_.size(); ++i)
-    if (!list.listeners_[i]->isShared())
-      listeners_[i] = dynamic_cast<SymbolListListener*>(list.listeners_[i]->clone());
-	return *this;
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::setContent(const vector<string>& list) throw (BadCharException)
-{
-  SymbolListEditionEvent event(this);
-  fireBeforeSequenceChanged(event);
-
-  // Check list for incorrect characters
-	vector<int> coded(list.size());
-	for (size_t i = 0; i < list.size(); i++)
-		if (!alphabet_->isCharInAlphabet(list[i])) throw BadCharException(list[i], "EdSymbolList::setContent", alphabet_);
-	
-  for (size_t i = 0; i < list.size(); i++) 
-		coded[i] = alphabet_->charToInt(list[i]);
-	
-  //SymbolList is valid:
-	content_ = coded;
-  fireAfterSequenceChanged(event);
-};
-
-/****************************************************************************************/
-
-void EdSymbolList::setContent(const vector<int>& list) throw (BadIntException)
-{
-  SymbolListEditionEvent event(this);
-  fireBeforeSequenceChanged(event);
-
-	// Check list for incorrect characters
-	for (size_t i = 0; i < list.size(); i++)
-		if(!alphabet_->isIntInAlphabet(list[i]))
-      throw BadIntException(list[i], "EdSymbolList::setContent", alphabet_);
-	
-  //Sequence is valid:
-	content_ = list;
-  fireAfterSequenceChanged(event);
-};
-
-/****************************************************************************************/
-
-string EdSymbolList::toString() const
-{
-	return StringSequenceTools::decodeSequence(content_, alphabet_);
-};
-
-/****************************************************************************************/
-
-void EdSymbolList::addElement(const string& c) throw (BadCharException)
-{
-  SymbolListInsertionEvent event(this, size(), 1);
-  fireBeforeSequenceInserted(event);
-	content_.push_back(alphabet_->charToInt(c));
-  fireAfterSequenceInserted(event);
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::addElement(size_t pos, const string& c) throw (BadCharException, IndexOutOfBoundsException)
-{
-  if (pos >= content_.size()) throw IndexOutOfBoundsException("EdSymbolList::addElement. Invalid position.", pos, 0, size() - 1);
-  SymbolListInsertionEvent event(this, pos, 1);
-  fireBeforeSequenceInserted(event);
-	content_.insert(content_.begin() + static_cast<ptrdiff_t>(pos), alphabet_->charToInt(c));
-  fireAfterSequenceInserted(event);
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::setElement(size_t pos, const string& c) throw (BadCharException, IndexOutOfBoundsException)
-{
-	if (pos >= content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::setElement. Invalid position.", pos, 0, size() - 1);
-  SymbolListSubstitutionEvent event(this, pos, pos);
-  fireBeforeSequenceSubstituted(event);
-	content_[pos] = alphabet_->charToInt(c);
-  fireAfterSequenceSubstituted(event);
-}
-
-/****************************************************************************************/
-
-string EdSymbolList::getChar(size_t pos) const throw (IndexOutOfBoundsException)
-{
-	if (pos >= content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::getChar. Invalid position.", pos, 0, size() - 1);
-	string c = "";
-	try {
-		c = alphabet_->intToChar(content_[pos]);
-	} catch(BadIntException bie) {
-		//This should never happen!
-	}
-	return c;
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::deleteElement(size_t pos) throw (IndexOutOfBoundsException)
-{
-	if (pos >= content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::deleteElement. Invalid position.", pos, 0, size() - 1);
-  SymbolListDeletionEvent event(this, pos, 1);
-  fireBeforeSequenceDeleted(event);
-	content_.erase(content_.begin() + static_cast<ptrdiff_t>(pos));
-  fireAfterSequenceDeleted(event);
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::deleteElements(size_t pos, size_t len) throw (IndexOutOfBoundsException)
-{
-	if(pos + len > content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::deleteElements. Invalid position.", pos + len, 0, size() - 1);
-  SymbolListDeletionEvent event(this, pos, len);
-  fireBeforeSequenceDeleted(event);
-	content_.erase(content_.begin() + static_cast<ptrdiff_t>(pos), content_.begin() + static_cast<ptrdiff_t>(pos + len));
-  fireAfterSequenceDeleted(event);
-}
-
-
-/****************************************************************************************/
-
-void EdSymbolList::addElement(int v) throw (BadIntException)
-{
-  SymbolListInsertionEvent event(this, size(), 1);
-  fireBeforeSequenceInserted(event);
-	//test:
-	alphabet_->intToChar(v);
-	content_.push_back(v);
-  fireAfterSequenceInserted(event);
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::addElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException)
-{
-	//test:
-	if (pos >= content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::addElement. Invalid position.", pos, 0, size() - 1);
-  SymbolListInsertionEvent event(this, pos, 1);
-  fireBeforeSequenceInserted(event);
-	alphabet_->intToChar(v);
-	content_.insert(content_.begin() + static_cast<ptrdiff_t>(pos), v);
-  fireAfterSequenceInserted(event);
-}
-
-/****************************************************************************************/
-
-void EdSymbolList::setElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException)
-{
-	//test:
-  if (pos >= content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::setElement. Invalid position.", pos, 0, size() - 1);
-  SymbolListSubstitutionEvent event(this, pos, pos);
-  fireBeforeSequenceSubstituted(event);
-	alphabet_->intToChar(v);
-	content_[pos] = v;
-  fireAfterSequenceSubstituted(event);
-}
-
-/****************************************************************************************/
-
-int EdSymbolList::getValue(size_t pos) const throw (IndexOutOfBoundsException)
-{
-  if (pos >= content_.size())
-    throw IndexOutOfBoundsException("EdSymbolList::getValue. Invalid position.", pos, 0, size() - 1);
-	return content_[pos];
-}
-
-/****************************************************************************************/
-
diff --git a/src/Bpp/Seq/SymbolList.h b/src/Bpp/Seq/SymbolList.h
deleted file mode 100644
index 6b18dad..0000000
--- a/src/Bpp/Seq/SymbolList.h
+++ /dev/null
@@ -1,745 +0,0 @@
-//
-// File: SymbolList.h
-// Created by: Julien Dutheil
-// Created on: Fri Apr 9 2005
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SYMBOLLIST_H_
-#define _SYMBOLLIST_H_
-
-#include "Alphabet/Alphabet.h"
-#include <Bpp/Clonable.h>
-
-// From the STL:
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <iostream>
-
-namespace bpp
-{
-
-  /**
-   * @brief The SymbolList interface.
-   *
-   * @see Alphabet
-   */
-  class SymbolList: 
-    public virtual Clonable
-  {
-
-  public: 
-    /**
-     * @name The Clonable interface
-     *
-     * @{
-     */
-#ifndef NO_VIRTUAL_COV
-    SymbolList* clone() const = 0;
-#endif
-    /** @} */
-
-    // Class destructor
-    virtual ~SymbolList() {}
-
-  public:
-
-    /**
-     * @brief Get the alphabet associated to the list.
-     *
-     * @return A const pointer to the alphabet.
-     * @see Alphabet class.
-     */
-    virtual const Alphabet* getAlphabet() const = 0;
-
-    /**
-     * @brief Get the number of elements in the list.
-     *
-     * @return The number of sites in the list.
-     */
-    virtual size_t size() const = 0;
-
-    /**
-     * @name Acting on the content of the list.
-     *
-     * @{
-     */
-
-    /**
-     * @brief Get the whole content of the list as a vector of int.
-     *
-     * @return A reference to the content of the list.
-     */
-    virtual const std::vector<int>& getContent() const = 0;
-
-    /**
-     * @brief Set the whole content of the list.
-     *
-     * @param list The new content of the list.
-     * @see The list constructor for information about the way lists are internaly stored.
-     */
-    virtual void setContent(const std::vector<int>& list) throw (BadIntException) = 0;
-
-    /**
-     * @brief Set the whole content of the list.
-     *
-     * @param list The new content of the list.
-     * @see The list constructor for information about the way lists are internaly stored.
-     */
-    virtual void setContent(const std::vector<std::string>& list) throw (BadCharException) = 0;
-
-    /** @} */
-
-    /**
-     * @brief Convert the list as a string.
-     *
-     * This method is useful for dumping a list to a file or to the screen for display.
-     *
-     * @return The whole list as a string.
-     */
-    virtual std::string toString() const = 0;
-
-    /**
-     * @name Edition methods.
-     *
-     * @{
-     */
-
-    /**
-     * @brief Add a character to the end of the list.
-     *
-     * @param c The character to add, given as a string.
-     */
-    virtual void addElement(const std::string& c) throw (BadCharException) = 0;
-
-    /**
-     * @brief Add a character at a certain position in the list.
-     *
-     * @param pos The postion where to insert the element.
-     * @param c   The character to add, given as a string.
-     */
-    virtual void addElement(size_t pos, const std::string& c) throw (BadCharException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Set the element at position 'pos' to character 'c'.
-     *
-     * @param pos The position of the character to set.
-     * @param c   The value of the element, given as a string.
-     */
-    virtual void setElement(size_t pos, const std::string& c) throw (BadCharException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Delete the element at position 'pos'.
-     *
-     * @param pos The position of the element to delete.
-     */
-    virtual void deleteElement(size_t pos) throw (IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Delete the elements at position 'pos'.
-     *
-     * @param pos The position of the first element to delete.
-     * @param len The length of the region to delete.
-     */
-    virtual void deleteElements(size_t pos, size_t len) throw (IndexOutOfBoundsException) = 0;
-
-
-    /**
-     * @brief Get the element at position 'pos' as a character.
-     *
-     * @param pos The position of the character to retrieve.
-     */
-    virtual std::string getChar(size_t pos) const throw (IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Add a character to the end of the list.
-     *
-     * @param v The character to add, given as an int.
-     */
-    virtual void addElement(int v) throw (BadIntException) = 0;
-
-    /**
-     * @brief Add a character at a certain position in the list.
-     *
-     * @param pos The postion where to insert the element.
-     * @param v   The character to add, given as an int.
-     */
-    virtual void addElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Set the element at position 'pos' to character 'v'.
-     *
-     * @param pos The position of the character to set.
-     * @param v   The value of the element, given as an int.
-     */
-    virtual void setElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException) = 0;
-
-    /**
-     * @brief Get the element at position 'pos' as an int.
-     *
-     * @param pos The position of the character to retrieve.
-     */
-    virtual int getValue(size_t pos) const throw (IndexOutOfBoundsException) = 0;
-
-    /** @} */
-
-    /**
-     * @name Provide direct access to the list content.
-     *
-     * @warning These operators allow you to modifiy the list content.
-     * No alphabet checking is performed for your modifications, so use with care, or
-     * consider using the setContent() method.
-     *
-     * @{
-     */
-
-    /**
-     * @brief Operator [] overloaded for quick access to a character in list.
-     *
-     * @param i The position to retrieve.
-     * @return The integer value of character at position i.
-     */
-    virtual const int& operator[](size_t i) const = 0;
-    /**
-     * @brief Operator [] overloaded for quick access to a character in list.
-     *
-     * @param i The position to retrieve.
-     * @return The integer value of character at position i.
-     */
-    virtual int& operator[](size_t i) = 0;
-
-    /**
-     * @brief Randomly shuffle the content of the list, with linear complexity.
-     */
-    virtual void shuffle() = 0;
-    /** @} */
-  };
-
-
-  /**
-   * @brief A basic SymbolList object.
-   *
-   * This is a general purpose container, containing an ordered list of states(= letters).
-   * The states that allowed to be present in the list are defined by an alphabet object,
-   * which is passed to the list constructor by a pointer.
-   *
-   * For programming convenience, the states are stored as integers, but the translation toward
-   * and from a char description is easily performed with the Alphabet classes.
-   *
-   * @see Alphabet
-   */
-  class BasicSymbolList: 
-    public virtual SymbolList
-  {
-
-  private:
-    /**
-     * @brief The Alphabet attribute must be initialized in constructor and then can never be changed.
-     * 
-     * To apply another alphabet to a list you'll have to create a new list.
-     */
-    const Alphabet* alphabet_;
-
-  protected:
-    /**
-     * @brief The list content.
-     */
-    std::vector<int> content_;
-
-  public: 
-    /**
-     * @brief Build a new void BasicSymbolList object with the specified alphabet.
-     *
-     * @param alpha The alphabet to use.
-     */
-    BasicSymbolList(const Alphabet* alpha) : alphabet_(alpha), content_() {}
-
-    /**
-     * @brief Build a new BasicSymbolList object with the specified alphabet.
-     * The content of the site is initialized from a vector of characters.
-     *
-     * @param list     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @throw BadCharException If the content does not match the specified alphabet.
-     */
-    BasicSymbolList(const std::vector<std::string>& list, const Alphabet* alpha) throw (BadCharException);
-
-    /**
-     * @brief Build a new BasicSymbolList object with the specified alphabet.
-     * The content of the site is initialized from a vector of integers.
-     *
-     * @param list     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @throw BadIntException If the content does not match the specified alphabet.
-     */
-    BasicSymbolList(const std::vector<int>& list, const Alphabet* alpha) throw (BadIntException);
-
-    /**
-     * @brief The generic copy constructor.
-     */
-    BasicSymbolList(const SymbolList& list);
-
-    /**
-     * @brief The copy constructor.
-     */
-    BasicSymbolList(const BasicSymbolList& list);
-
-    /**
-     * @brief The generic assignment operator.
-     */
-    BasicSymbolList& operator=(const SymbolList& list);
-
-    /**
-     * @brief The assignment operator.
-     */
-    BasicSymbolList& operator=(const BasicSymbolList& list);
-
-    /**
-     * @name The Clonable interface
-     *
-     * @{
-     */
-#ifdef NO_VIRTUAL_COV
-    Clonable*
-#else
-    BasicSymbolList*
-#endif
-    clone() const { return new BasicSymbolList(* this); }
-    /** @} */
-
-    // Class destructor
-    virtual ~BasicSymbolList() {}
-
-  public:
-
-    virtual const Alphabet* getAlphabet() const { return alphabet_; }
-
-    virtual size_t size() const { return static_cast<size_t>(content_.size()); }
-
-    virtual const std::vector<int>& getContent() const { return content_; }
-		
-    virtual void setContent(const std::vector<int>& list) throw (BadIntException);
-
-    virtual void setContent(const std::vector<std::string>& list) throw (BadCharException);
-
-    virtual std::string toString() const;
-
-    virtual void addElement(const std::string& c) throw (BadCharException);
-
-    virtual void addElement(size_t pos, const std::string& c) throw (BadCharException, IndexOutOfBoundsException);
-
-    virtual void setElement(size_t pos, const std::string& c) throw (BadCharException, IndexOutOfBoundsException);
-
-    virtual void deleteElement(size_t pos) throw (IndexOutOfBoundsException);
-		
-    virtual void deleteElements(size_t pos, size_t len) throw (IndexOutOfBoundsException);
-
-    virtual std::string getChar(size_t pos) const throw (IndexOutOfBoundsException);
-
-    virtual void addElement(int v) throw (BadIntException);
-
-    virtual void addElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException);
-
-    virtual void setElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException);
-
-    virtual int getValue(size_t pos) const throw (IndexOutOfBoundsException);
-
-    virtual const int& operator[](size_t i) const { return content_[i]; }
-		
-    virtual int& operator[](size_t i) { return content_[i]; }
-
-    virtual void shuffle()
-    {
-      random_shuffle(content_.begin(), content_.end());
-    }
-  };
-
-  class SymbolListEditionEvent
-  {
-  private:
-    SymbolList* list_;
-
-  public:
-    SymbolListEditionEvent(SymbolList* list):
-      list_(list) {}
-
-    SymbolListEditionEvent(const SymbolListEditionEvent& slee): list_(slee.list_) {}
-    
-    SymbolListEditionEvent& operator=(const SymbolListEditionEvent& slee) { 
-      list_ = slee.list_;
-      return *this;
-    }
-
-    virtual ~SymbolListEditionEvent() {}
-
-  public:
-    virtual SymbolList* getSymbolList() { return list_; }
-    virtual const SymbolList* getSymbolList() const { return list_; }
-  };
-
-
-  class SymbolListInsertionEvent:
-    public SymbolListEditionEvent
-  {
-  private:
-    size_t pos_;
-    size_t len_;
-
-  public:
-    SymbolListInsertionEvent(SymbolList* list, size_t pos, size_t len):
-      SymbolListEditionEvent(list), pos_(pos), len_(len) {}
-
-  public:
-    virtual size_t getPosition() const { return pos_; }
-    virtual size_t getLength() const { return len_; }
-  };
-
-
-  class SymbolListDeletionEvent:
-    public SymbolListEditionEvent
-  {
-  private:
-    size_t pos_;
-    size_t len_;
-
-  public:
-    SymbolListDeletionEvent(SymbolList* list, size_t pos, size_t len):
-      SymbolListEditionEvent(list), pos_(pos), len_(len) {}
-
-  public:
-    virtual size_t getPosition() const { return pos_; }
-    virtual size_t getLength() const { return len_; }
-  };
-
-
-  class SymbolListSubstitutionEvent:
-    public SymbolListEditionEvent
-  {
-  private:
-    size_t begin_;
-    size_t end_;
-
-  public:
-    SymbolListSubstitutionEvent(SymbolList* list, size_t begin, size_t end) :
-      SymbolListEditionEvent(list), begin_(begin), end_(end) {}
-
-  public:
-    virtual size_t getBegin() const { return begin_; }
-    virtual size_t getEnd() const { return end_; }
-  };
-
-  class SymbolListListener :
-    public virtual Clonable
-  {
-  public:
-    virtual ~SymbolListListener() {}
-
-#ifndef NO_VIRTUAL_COV
-    virtual SymbolListListener* clone() const = 0;
-#endif
-
-  public:
-    virtual bool isRemovable() const = 0;
-    virtual bool isShared() const = 0;
-    virtual void beforeSequenceChanged(const SymbolListEditionEvent& event) = 0;
-    virtual void afterSequenceChanged(const SymbolListEditionEvent& event) = 0;
-    virtual void beforeSequenceInserted(const SymbolListInsertionEvent& event) = 0;
-    virtual void afterSequenceInserted(const SymbolListInsertionEvent& event) = 0;
-    virtual void beforeSequenceDeleted(const SymbolListDeletionEvent& event) = 0;
-    virtual void afterSequenceDeleted(const SymbolListDeletionEvent& event) = 0;
-    virtual void beforeSequenceSubstituted(const SymbolListSubstitutionEvent& event) = 0;
-    virtual void afterSequenceSubstituted(const SymbolListSubstitutionEvent& event) = 0;
-  };
-
-
-  /**
-   * @brief A event-driven SymbolList object.
-   *
-   * This is a general purpose container, containing an ordered list of states(= letters).
-   * The states that allowed to be present in the list are defined by an alphabet object,
-   * which is passed to the list constructor by a pointer.
-   *
-   * For programming convenience, the states are stored as integers, but the translation toward
-   * and from a char description is easily performed with the Alphabet classes.
-   *
-   * @see Alphabet
-   */
-  class EdSymbolList: 
-    public virtual SymbolList
-  {
-
-  private:
-    /**
-     * @brief The Alphabet attribute must be initialized in constructor and then can never be changed.
-     * 
-     * To apply another alphabet to a list you'll have to create a new list.
-     */
-    const Alphabet* alphabet_;
-
-    bool propagateEvents_;
-
-  protected:
-    /**
-     * @brief The list content.
-     */
-    std::vector<int> content_;
-
-    /**
-     * @brief Contains the listeners.
-     */
-    std::vector<SymbolListListener*> listeners_;
-
-
-  public: 
-    /**
-     * @brief Build a new void BasicSymbolList object with the specified alphabet.
-     *
-     * @param alpha The alphabet to use.
-     */
-    EdSymbolList(const Alphabet* alpha) : alphabet_(alpha), propagateEvents_(true), content_(), listeners_() {}
-
-    /**
-     * @brief Build a new BasicSymbolList object with the specified alphabet.
-     * The content of the site is initialized from a vector of characters.
-     *
-     * @param list     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @throw BadCharException If the content does not match the specified alphabet.
-     */
-    EdSymbolList(const std::vector<std::string>& list, const Alphabet* alpha) throw (BadCharException);
-
-    /**
-     * @brief Build a new BasicSymbolList object with the specified alphabet.
-     * The content of the site is initialized from a vector of integers.
-     *
-     * @param list     The content of the site.
-     * @param alpha    The alphabet to use.
-     * @throw BadIntException If the content does not match the specified alphabet.
-     */
-    EdSymbolList(const std::vector<int>& list, const Alphabet* alpha) throw (BadIntException);
-
-    /**
-     * @brief The generic copy constructor.
-     */
-    EdSymbolList(const SymbolList& list);
-
-    /**
-     * @brief The copy constructor.
-     */
-    EdSymbolList(const EdSymbolList& list);
-
-    /**
-     * @brief The generic assignment operator.
-     */
-    EdSymbolList& operator=(const SymbolList& list);
-
-    /**
-     * @brief The assignment operator.
-     */
-    EdSymbolList& operator=(const EdSymbolList& list);
-
-    /**
-     * @name The Clonable interface
-     *
-     * @{
-     */
-#ifdef NO_VIRTUAL_COV
-    Clonable*
-#else
-    EdSymbolList*
-#endif
-    clone() const { return new EdSymbolList(* this); }
-    /** @} */
-
-    // Class destructor
-    virtual ~EdSymbolList()
-    {
-      for (size_t i = 0; i < listeners_.size(); ++i) {
-        if (listeners_[i] && !listeners_[i]->isShared()) {
-          delete listeners_[i];
-        }
-      }
-    }
-
-  public:
-
-    virtual const Alphabet* getAlphabet() const { return alphabet_; }
-
-    virtual size_t size() const { return static_cast<size_t>(content_.size()); }
-
-    virtual const std::vector<int>& getContent() const { return content_; }
-		
-    virtual void setContent(const std::vector<int>& list) throw (BadIntException);
-
-    virtual void setContent(const std::vector<std::string>& list) throw (BadCharException);
-
-    virtual std::string toString() const;
-
-    virtual void addElement(const std::string& c) throw (BadCharException);
-
-    virtual void addElement(size_t pos, const std::string& c) throw (BadCharException, IndexOutOfBoundsException);
-
-    virtual void setElement(size_t pos, const std::string& c) throw (BadCharException, IndexOutOfBoundsException);
-
-    virtual void deleteElement(size_t pos) throw (IndexOutOfBoundsException);
-		
-    virtual void deleteElements(size_t pos, size_t len) throw (IndexOutOfBoundsException);
-
-    virtual std::string getChar(size_t pos) const throw (IndexOutOfBoundsException);
-
-    virtual void addElement(int v) throw (BadIntException);
-
-    virtual void addElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException);
-
-    virtual void setElement(size_t pos, int v) throw (BadIntException, IndexOutOfBoundsException);
-
-    virtual int getValue(size_t pos) const throw (IndexOutOfBoundsException);
-
-    virtual const int& operator[](size_t i) const { return content_[i]; }
-		
-    virtual int& operator[](size_t i) { return content_[i]; }
-
-    virtual void shuffle()
-    {
-      random_shuffle(content_.begin(), content_.end());
-    }
-
-    /**
-     * @name Events handling
-     *
-     * @{
-     */
-    virtual size_t getNumberOfListeners() const { return listeners_.size(); }
-
-    virtual const SymbolListListener& getListener(size_t i) const {
-      if (listeners_[i] == 0) std::cout << "aie!!!" << std::endl;
-      return *listeners_[i];
-    }
-    
-    virtual SymbolListListener& getListener(size_t i) { 
-      if (listeners_[i] == 0) std::cout << "aie!!!" << std::endl;
-      return *listeners_[i];
-    }
-
-    virtual void addSymbolListListener(SymbolListListener* listener) { 
-      listeners_.push_back(listener);
-    }
-
-    virtual void removeSymbolListListener(SymbolListListener* listener) {
-      if (listener->isRemovable())
-        listeners_.erase(remove(listeners_.begin(), listeners_.end(), listener), listeners_.end());
-      else
-        throw Exception("EdSymbolList::removeSymbolListListener. Listener is not removable.");
-    } 
- 
-  protected:
-    virtual void beforeSequenceChanged(const SymbolListEditionEvent& event) {};
-    virtual void afterSequenceChanged(const SymbolListEditionEvent& event) {};
-    virtual void beforeSequenceInserted(const SymbolListInsertionEvent& event) {};
-    virtual void afterSequenceInserted(const SymbolListInsertionEvent& event) {};
-    virtual void beforeSequenceDeleted(const SymbolListDeletionEvent& event) {};
-    virtual void afterSequenceDeleted(const SymbolListDeletionEvent& event) {};
-    virtual void beforeSequenceSubstituted(const SymbolListSubstitutionEvent& event) {};
-    virtual void afterSequenceSubstituted(const SymbolListSubstitutionEvent& event) {};
-
-    void fireBeforeSequenceChanged(const SymbolListEditionEvent& event) {
-      beforeSequenceChanged(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->beforeSequenceChanged(event);
-    }
-
-    void fireAfterSequenceChanged(const SymbolListEditionEvent& event) {
-      afterSequenceChanged(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->afterSequenceChanged(event);
-    }
-   
-    void fireBeforeSequenceInserted(const SymbolListInsertionEvent& event) {
-      beforeSequenceInserted(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->beforeSequenceInserted(event);
-    }
-
-    void fireAfterSequenceInserted(const SymbolListInsertionEvent& event) {
-      afterSequenceInserted(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->afterSequenceInserted(event);
-    }
-
-    void fireBeforeSequenceDeleted(const SymbolListDeletionEvent& event) {
-      beforeSequenceDeleted(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->beforeSequenceDeleted(event);
-    }
-
-    void fireAfterSequenceDeleted(const SymbolListDeletionEvent& event) {
-      afterSequenceDeleted(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->afterSequenceDeleted(event);
-    }
-
-    void fireBeforeSequenceSubstituted(const SymbolListSubstitutionEvent& event) {
-      beforeSequenceSubstituted(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->beforeSequenceSubstituted(event);
-    }
-
-    void fireAfterSequenceSubstituted(const SymbolListSubstitutionEvent& event) {
-      afterSequenceSubstituted(event);
-      if (propagateEvents_)
-        for (size_t i = 0; i < listeners_.size(); ++i)
-          listeners_[i]->afterSequenceSubstituted(event);
-    }
-    /** @} */
-
-  protected:
-    void propagateEvents(bool yn) { propagateEvents_ = yn; }
-    bool propagateEvents() const { return propagateEvents_; }
-
-  };
-
-
-} //end of namespace bpp.
-
-#endif // _SYMBOLLIST_H_
-
diff --git a/src/Bpp/Seq/SymbolListTools.cpp b/src/Bpp/Seq/SymbolListTools.cpp
deleted file mode 100644
index e43bcbb..0000000
--- a/src/Bpp/Seq/SymbolListTools.cpp
+++ /dev/null
@@ -1,197 +0,0 @@
-//
-// File: SymbolListTools.cpp
-// Created by: Julien Dutheil
-// Created on: Wed Apr 9 2004
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "SymbolListTools.h"
-#include "Alphabet/AlphabetTools.h"
-#include <Bpp/Numeric/Random/RandomTools.h>
-
-//From the STL:
-#include <algorithm>
-
-using namespace std;
-
-using namespace bpp;
-
-void SymbolListTools::getCounts(const SymbolList& list, map<int, double>& counts, bool resolveUnknowns)
-{
-  if (!resolveUnknowns)
-  {
-    for (vector<int>::const_iterator seqit = list.getContent().begin();
-        seqit != list.getContent().end();
-        seqit++)
-      counts[*seqit]++;
-  }
-  else
-  {
-    for (vector<int>::const_iterator seqit = list.getContent().begin();
-        seqit != list.getContent().end();
-        seqit++)
-    {
-      vector<int> alias = list.getAlphabet()->getAlias(*seqit);
-      double n = (double)alias.size();
-      for (size_t j = 0; j < alias.size(); j++) counts[alias[j]] += 1./n ;
-    }
-  }
-}
-
-void SymbolListTools::getCounts(const SymbolList& list1, const SymbolList& list2,  map< int, map<int, double> >& counts, bool resolveUnknowns) throw (DimensionException)
-{
-  if (list1.size() != list2.size()) throw DimensionException("SymbolListTools::getCounts: the two sites must have the same size.", list1.size(), list2.size());
-  if (!resolveUnknowns)
-  {
-    for (size_t i = 0; i < list1.size(); i++)
-      counts[list1[i]][list2[i]]++;
-  }
-  else
-  {
-    for (size_t i = 0; i < list1.size(); i++)
-    {
-      vector<int> alias1 = list1.getAlphabet()->getAlias(list1[i]);
-      vector<int> alias2 = list2.getAlphabet()->getAlias(list2[i]);
-      double n1 = (double)alias1.size();
-      double n2 = (double)alias2.size();
-      for (size_t j = 0; j < alias1.size(); j++)
-        for (size_t k = 0; k < alias2.size(); k++)
-          counts[alias1[j]][alias2[k]] += 1./(n1*n2) ;
-    }
-  }
-}
-
-void SymbolListTools::getFrequencies(const SymbolList& list, map<int, double>& frequencies, bool resolveUnknowns)
-{
-	double n = (double)list.size();
-  map<int, double> counts;
-  getCounts(list, counts, resolveUnknowns);
-  for (map<int, double>::iterator i = counts.begin(); i != counts.end(); i++)
-  {
-    frequencies[i->first] = i->second / n;
-  }
-}
-
-void SymbolListTools::getFrequencies(const SymbolList& list1, const SymbolList& list2, map<int, map<int, double> >& frequencies, bool resolveUnknowns) throw (DimensionException)
-{
-	double n2 = (double)list1.size() * (double)list1.size();
-  map<int, map<int, double> > counts;
-  getCounts(list1, list2, counts, resolveUnknowns);
-  for (map<int, map<int, double> >::iterator i = counts.begin(); i != counts.end(); i++)
-    for (map<int, double>::iterator j = i->second.begin(); j != i->second.end(); j++)
-  {
-    frequencies[i->first][j->first] = j->second / n2;
-  }
-}
-
-double SymbolListTools::getGCContent(const SymbolList& list, bool ignoreUnresolved, bool ignoreGap) throw (AlphabetException)
-{
-  const Alphabet * alphabet = list.getAlphabet();
-  if (!AlphabetTools::isNucleicAlphabet(alphabet))
-    throw AlphabetException("SymbolListTools::getGCContent. Method only works on nucleotides.", alphabet);
-  double gc = 0;
-  double total = 0;
-  for (size_t i = 0; i < list.size(); i++) {
-    int state = list.getValue(i);
-    if (state > -1) { // not a gap
-      if (state == 1 || state == 2) { // G or C
-        gc++;
-        total++;
-      } else if (state == 0 || state == 3) { // A, T or U
-        total++;
-      } else { // Unresolved character
-        if (!ignoreUnresolved) {
-          total++;
-          switch(state) {
-            case(7): gc++; break;// G or C
-            case(4): gc+=0.5; break;// A or C
-            case(5): gc+=0.5; break;// A or G
-            case(6): gc+=0.5; break;// C or T
-            case(9): gc+=0.5; break;// G or T
-            case(10): gc+=2./3.; break;// A or C or G
-            case(11): gc+=1./3.; break;// A or C or T
-            case(12): gc+=1./3.; break;// A or G or T
-            case(13): gc+=2./3.; break;// C or G or T
-            case(14): gc+=0.5; break;// A or C or G or T
-          }
-        }
-      }
-    } else {
-      if (!ignoreGap) total++;
-    }
-  }
-  return total != 0 ? gc/total : 0;
-}
-
-size_t SymbolListTools::getNumberOfDistinctPositions(const SymbolList& l1, const SymbolList& l2) throw (AlphabetMismatchException)
-{
-	if (l1.getAlphabet()->getAlphabetType() != l2.getAlphabet()->getAlphabetType()) throw AlphabetMismatchException("SymbolListTools::getNumberOfDistinctPositions.", l1.getAlphabet(), l2.getAlphabet());
-	size_t n = min(l1.size(), l2.size());
-	size_t count = 0;
-	for (size_t i = 0; i < n; i++) {
-		if (l1[i] != l2[i]) count++;
-	}
-	return count;
-}
-
-size_t SymbolListTools::getNumberOfPositionsWithoutGap(const SymbolList& l1, const SymbolList& l2) throw (AlphabetMismatchException)
-{
-	if (l1.getAlphabet() -> getAlphabetType() != l2.getAlphabet() -> getAlphabetType()) throw AlphabetMismatchException("SymbolListTools::getNumberOfDistinctPositions.", l1.getAlphabet(), l2.getAlphabet());
-	size_t n = min(l1.size(), l2.size());
-	size_t count = 0;
-	for (size_t i = 0; i < n; i++) {
-		if (l1[i] != -1 && l2[i] != -1) count++;
-	}
-	return count;
-}
-
-void SymbolListTools::changeGapsToUnknownCharacters(SymbolList& l)
-{
-  int unknownCode = l.getAlphabet()->getUnknownCharacterCode();
-  for (size_t i = 0; i < l.size(); i++)
-  {
-    if (l.getAlphabet()->isGap(l[i])) l[i] = unknownCode;
-  }
-}
-
-void SymbolListTools::changeUnresolvedCharactersToGaps(SymbolList& l)
-{
-  int gapCode = l.getAlphabet()->getGapCharacterCode();
-  for (size_t i = 0; i < l.size(); i++)
-  {
-    if (l.getAlphabet()->isUnresolved(l[i])) l[i] = gapCode;
-  }
-}
-
diff --git a/src/Bpp/Seq/SymbolListTools.h b/src/Bpp/Seq/SymbolListTools.h
deleted file mode 100644
index 9e8ef9e..0000000
--- a/src/Bpp/Seq/SymbolListTools.h
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-// File: SymbolListTools.h
-// Created by: Julien Dutheil
-// Created on: Wed Apr 9 2004
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _SYMBOLLISTTOOLS_H_
-#define _SYMBOLLISTTOOLS_H_
-
-#include "SymbolList.h"
-#include "Alphabet/AlphabetExceptions.h"
-#include <Bpp/Numeric/VectorExceptions.h>
-
-// From the STL:
-#include <map>
-
-namespace bpp
-{
-
-/**
- * @brief Utilitary functions dealing with both sites and sequences.
- */
-class SymbolListTools
-{
-  public: 
-    SymbolListTools() {}
-    virtual ~SymbolListTools() {}
-
-  public:
-    /**
-     * @brief Count all states in the list.
-     *
-     * @author J. Dutheil
-     * @param list The list.
-     * @param counts The output map to store the counts (existing counts will be incremented).
-     */
-    static void getCounts(const SymbolList& list, std::map<int, size_t>& counts)
-    {
-      for(std::vector<int>::const_iterator seqit = list.getContent().begin();
-          seqit != list.getContent().end();
-          seqit++)
-        counts[*seqit]++;
-    }
-    
-    /**
-     * @brief Count all pair of states for two lists of the same size.
-     *
-     * NB: The two lists do node need to share the same alphabet!
-     * The states of the first list will be used as the first index in the output,
-     * and the ones from the second list as the second index.
-     *
-     * @author J. Dutheil
-     * @param list1 The first list.
-     * @param list2 The second list.
-     * @param counts The output map to store the counts (existing counts will be incremented).
-     */
-    static void getCounts(const SymbolList& list1, const SymbolList& list2, std::map<int, std::map<int, size_t> >& counts) throw (DimensionException)
-    {
-      if(list1.size() != list2.size()) throw DimensionException("SymbolListTools::getCounts: the two sites must have the same size.", list1.size(), list2.size());
-      for(size_t i = 0; i < list1.size(); i++)
-        counts[list1[i]][list2[i]]++;
-    }
-
-    /**
-     * @brief Count all states in the list, optionaly resolving unknown characters.
-     *
-     * For instance, in DNA, N will be counted as A=1/4,T=1/4,C=1/4,G=1/4.
-     *
-     * @author J. Dutheil
-     * @param list The list.
-     * @param counts The output map to store the counts (existing ocunts will be incremented).
-     * @param resolveUnknowns Tell is unknown characters must be resolved.
-     * For instance, in DNA, N will be counted as A=1/4,T=1/4,C=1/4,G=1/4.
-     * @return A map with all states and corresponding counts.
-     */
-    static void getCounts(const SymbolList& list, std::map<int, double>& counts, bool resolveUnknowns);
-    
-    /**
-     * @brief Count all pair of states for two lists of the same size, optionaly resolving unknown characters.
-     *
-     * For instance, in DNA, N will be counted as A=1/4,T=1/4,C=1/4,G=1/4.
-     *
-     * NB: The two lists do node need to share the same alphabet!
-     * The states of the first list will be used as the first index in the output,
-     * and the ones from the second list as the second index.
-     *
-     * @author J. Dutheil
-     * @param list1 The first list.
-     * @param list2 The second list.
-     * @param counts The output map to store the counts (existing ocunts will be incremented).
-     * @param resolveUnknowns Tell is unknown characters must be resolved.
-     * For instance, in DNA, N will be counted as A=1/4,T=1/4,C=1/4,G=1/4.
-     * @return A map with all states and corresponding counts.
-     */
-    static void getCounts(const SymbolList& list1, const SymbolList& list2,  std::map< int, std::map<int, double> >& counts, bool resolveUnknowns) throw (DimensionException);
-    
-    /**
-     * @brief Get all states frequencies in the list.
-     *
-     * @author J. Dutheil
-     * @param list The list.
-     * @param resolveUnknowns Tell is unknown characters must be resolved.
-     * For instance, in DNA, N will be counted as A=1/4,T=1/4,C=1/4,G=1/4.
-     * @param frequencies The output map with all states and corresponding frequencies. Existing frequencies will be erased if any.
-     */
-    static void getFrequencies(const SymbolList& list, std::map<int, double>& frequencies, bool resolveUnknowns = false);
-
-    /**
-     * @brief Get all state pairs frequencies for two lists of the same size..
-     *
-     * @author J. Dutheil
-     * @param list1 The first list.
-     * @param list2 The second list.
-     * @param resolveUnknowns Tell is unknown characters must be resolved.
-     * For instance, in DNA, N will be counted as A=1/4,T=1/4,C=1/4,G=1/4.
-     * @param frequencies The output map with all state pairs and corresponding frequencies. Existing frequencies will be erased if any.
-     */
-    static void getFrequencies(const SymbolList& list1, const SymbolList& list2, std::map<int, std::map<int, double> >& frequencies, bool resolveUnknowns = false) throw (DimensionException);
-
-    /**
-     * @brief Get the GC content of a symbol list.
-     *
-     * @param list The list.
-     * @return The proportion of G and C states in the list.
-     * @param ignoreUnresolved Do not count unresolved states. Otherwise, weight by each state probability in case of ambiguity (e.g. the R state counts for 0.5).
-     * @param ignoreGap Do not count gaps in total.
-     * @throw AlphabetException If the list is not made of nucleotide states.
-     */
-    static double getGCContent(const SymbolList& list, bool ignoreUnresolved = true, bool ignoreGap = true) throw (AlphabetException);
-    
-    /**
-      * @brief Get the number of distinct positions.
-     *
-     * The comparison in achieved from position 0 to the minimum size of the two vectors.
-     *
-     * @param l1 SymbolList 1.
-     * @param l2 SymbolList 2.
-     * @return The number of distinct positions.
-     * @throw AlphabetMismatchException if the two lists have not the same alphabet type.
-     */
-    static size_t getNumberOfDistinctPositions(const SymbolList& l1, const SymbolList& l2) throw (AlphabetMismatchException);
-    
-    /**
-      * @brief Get the number of positions without gap.
-     *
-     * The comparison in achieved from position 0 to the minimum size of the two vectors.
-     *
-     * @param l1 SymbolList 1.
-     * @param l2 SymbolList 2.
-     * @return The number of positions without gap.
-     * @throw AlphabetMismatchException if the two lists have not the same alphabet type.
-     */
-    static size_t getNumberOfPositionsWithoutGap(const SymbolList& l1, const SymbolList& l2) throw (AlphabetMismatchException);
-
-    /**
-     * @brief Change all gap elements to unknown characters.
-     *
-     * @param l The input list of characters.
-     */
-    static void changeGapsToUnknownCharacters(SymbolList& l);
-
-    /**
-     * @brief Change all unknown characters to gap elements.
-     *
-     * @param l The input list of characters.
-     */
-    static void changeUnresolvedCharactersToGaps(SymbolList& l);
-
-};
-
-} //end of namespace bpp.
-
-#endif // _SYMBOLLISTTOOLS_H_
-
diff --git a/src/Bpp/Seq/Transliterator.cpp b/src/Bpp/Seq/Transliterator.cpp
deleted file mode 100644
index 990632c..0000000
--- a/src/Bpp/Seq/Transliterator.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-// File: Transliterator.cpp
-// Created by: Julien Dutheil
-// Created on: Sun Oct 12 14:25:25 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include "Transliterator.h"
-
-using namespace bpp;
-
-Sequence* AbstractTransliterator::translate(const Sequence& sequence) const throw (AlphabetMismatchException, Exception)
-{
-	if (sequence.getAlphabet()->getAlphabetType() != getSourceAlphabet()->getAlphabetType())
-		throw AlphabetMismatchException("AbstractTransliterator::translate", getSourceAlphabet(), getTargetAlphabet());
-	Sequence* tSeq = new BasicSequence(sequence.getName(), "", sequence.getComments(), getTargetAlphabet());
-	int gap = sequence.getAlphabet()->getGapCharacterCode();
-  for (unsigned int i = 0; i < sequence.size(); ++i)
-  {
-    int state = sequence.getValue(i);
-    if (state == gap)
-      tSeq->addElement(gap);
-    else
-		  tSeq->addElement(translate(state));
-	}
-	return tSeq;
-}
-
-Sequence* AbstractReverseTransliterator::reverse(const Sequence& sequence) const throw (AlphabetMismatchException, Exception)
-{
-	if (sequence.getAlphabet()->getAlphabetType() != getTargetAlphabet()->getAlphabetType())
-		throw AlphabetMismatchException("AbstractReverseTransliterator::reverse", getSourceAlphabet(), getTargetAlphabet());
-	Sequence* rSeq = new BasicSequence(sequence.getName(), "", sequence.getComments(), getSourceAlphabet());
-	for (unsigned int i = 0; i < sequence.size(); ++i)
-  {
-		rSeq->addElement(reverse(sequence.getValue(i)));
-	}
-	return rSeq;
-}
-
diff --git a/src/Bpp/Seq/Transliterator.h b/src/Bpp/Seq/Transliterator.h
deleted file mode 100644
index b7e971f..0000000
--- a/src/Bpp/Seq/Transliterator.h
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-// File: Transliterator.h
-// Created by: Julien Dutheil
-// Created on: Sun Oct 12 14:25:25 2003
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#ifndef _TRANSLITERATOR_H_
-#define _TRANSLITERATOR_H_
-
-#include "Alphabet/Alphabet.h"
-#include "Sequence.h"
-
-namespace bpp
-{
-
-/**
- * @brief This interface is used when translating a sequence from an alphabet to another: it gives the translation rules, eg: RNA -> DNA.
- */
-class Transliterator
-{
-	public:
-		Transliterator() {}
-		virtual ~Transliterator() {}
-	
-	public:
-
-		/**
-		 * @brief Get the source alphabet.
-		 *
-		 * @return The source alphabet.
-		 */
-		virtual const Alphabet * getSourceAlphabet() const = 0;
-		
-		/**
-		 * @brief Get the target alphabet.
-		 *
-		 * @return The target alphabet.
-		 */
-		virtual const Alphabet * getTargetAlphabet() const = 0;
-		
-		/**
-		 * @brief Translate a given state coded as a int from source alphabet to target alphabet.
-		 *
-		 * @param state A state in source alphabet.
-		 * @return The corresponding state in target alphabet.
-		 * @throw BadIntException If the state is not a proper state for source alphabet.
-		 * @throw Exception       Other kind of error, depending on the implementation.
-		 */
-		virtual int translate(int state) const throw (BadIntException, Exception) = 0;		
-		
-		/**
-		 * @brief Translate a given state coded as a string from source alphabet to target alphabet.
-		 *
-		 * @param state A state in source alphabet.
-		 * @return The corresponding state in target alphabet.
-		 * @throw BadCharException If the state is not a proper state for source alphabet.
-		 * @throw Exception        Other kind of error, depending on the implementation.
-		 */
-		virtual std::string translate(const std::string & state) const throw (BadCharException, Exception) = 0;
-		
-		/**
-		 * @brief Translate a whole sequence from source alphabet to target alphabet.
-		 *
-		 * @param sequence A sequence in source alphabet.
-		 * @return The corresponding sequence in target alphabet.
-		 * @throw AlphabetMismatchException If the sequence alphabet do not match the source alphabet.
-		 * @throw Exception                 Other kind of error, depending on the implementation.
-		 */	
-		virtual Sequence * translate(const Sequence & sequence) const throw (AlphabetMismatchException, Exception) = 0; 
-};
-
-/**
- * @brief The same as previous, but can perform the reverse translation, eg: RNA -> DNA and DNA -> RNA;
- */
-class ReverseTransliterator:
-  public virtual Transliterator
-{
-	public:
-		ReverseTransliterator() {}
-		virtual ~ReverseTransliterator() {}
-	
-	public:
-		
-		/**
-		 * @brief Translate a given state coded as a int from target alphabet to source alphabet.
-		 *
-		 * @param state A state in target alphabet.
-		 * @return The corresponding state in source alphabet.
-		 * @throw BadIntException If the state is not a proper state for target alphabet.
-		 * @throw Exception       Other kind of error, depending on the implementation.
-		 */
-		virtual int reverse(int state) const throw (BadIntException, Exception) = 0;
-		
-		/**
-		 * @brief Translate a given state coded as a string from target alphabet to source alphabet.
-		 *
-		 * @param state A state in target alphabet.
-		 * @return The corresponding state in source alphabet.
-		 * @throw BadCharException If the state is not a proper state for target alphabet.
-		 * @throw Exception        Other kind of error, depending on the implementation.
-		 */
-		virtual std::string reverse(const std::string & state) const throw (BadCharException, Exception) = 0;			
-
-		/**
-		 * @brief Translate a whole sequence from target alphabet to source alphabet.
-		 *
-		 * @param sequence A sequence in target alphabet.
-		 * @return The corresponding sequence in source alphabet.
-		 * @throw AlphabetMismatchException If the sequence alphabet do not match the target alphabet.
-		 * @throw Exception                 Other kind of error, depending on the implementation.
-		 */	
-		virtual Sequence * reverse(const Sequence & sequence) const throw (AlphabetMismatchException, Exception) = 0; 
-};
-
-/**
- * @brief Partial implementation of the Transliterator interface.
- */
-class AbstractTransliterator:
-  public virtual Transliterator
-{
-	public:
-		AbstractTransliterator() {}
-		virtual ~AbstractTransliterator() {}
-	
-	public:
-		virtual int translate(int state) const throw (BadIntException, Exception) = 0;		
-		virtual std::string translate(const std::string & state) const throw (BadCharException, Exception) = 0;
-		virtual Sequence * translate(const Sequence & sequence) const throw (AlphabetMismatchException, Exception); 
-};
-
-/**
- * @brief Partial implementation of the ReverseTransliterator interface.
- */
-class AbstractReverseTransliterator:
-  public ReverseTransliterator,
-  public AbstractTransliterator
-{
-	public:
-		AbstractReverseTransliterator() {}
-		virtual ~AbstractReverseTransliterator() {}
-	
-	public:
-		//These two redeclarations must be here because of the multiple inheritance.
-		virtual const Alphabet * getSourceAlphabet() const = 0;
-		virtual const Alphabet * getTargetAlphabet() const = 0;
-		virtual int reverse(int state) const throw (BadIntException, Exception) = 0;
-		virtual std::string reverse(const std::string & state) const throw (BadCharException, Exception) = 0;			
-		virtual Sequence * reverse(const Sequence & sequence) const throw (AlphabetMismatchException, Exception);
-};
-
-} //end of namespace bpp.
-
-#endif	//_TRANSLITERATOR_H_
-
diff --git a/src/Bpp/Text/KeyvalTools.cpp b/src/Bpp/Text/KeyvalTools.cpp
new file mode 100644
index 0000000..d6fe39b
--- /dev/null
+++ b/src/Bpp/Text/KeyvalTools.cpp
@@ -0,0 +1,194 @@
+//
+// File: KeyvalTools.cpp
+// Created by: Julien Dutheil
+// Created on: Mon May 13:16 CET 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (2009)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "KeyvalTools.h"
+#include "NestedStringTokenizer.h"
+
+//From the STL:
+#include <memory>
+
+using namespace bpp;
+using namespace std;
+
+void KeyvalTools::singleKeyval(const std::string& desc, std::string& key, std::string& val, const std::string& split) throw (KeyvalException)
+{
+  string::size_type i = desc.find(split);
+  if (i == string::npos)
+    throw KeyvalException("Bad syntax! keyval should be of the form 'key" + split + "=value', found '" + desc + "'.");
+  key = desc.substr(0, i);
+  val = desc.substr(i+1);
+}
+
+void KeyvalTools::multipleKeyvals(const std::string& desc, std::map<std::string,std::string>& keyvals, const std::string& split, bool nested) throw (KeyvalException)
+{
+  unique_ptr<StringTokenizer> st;
+  if (nested)
+    st.reset(new NestedStringTokenizer(desc, "(", ")", split));
+  else
+    st.reset(new StringTokenizer(desc, split));
+  string key, val;
+  vector<string> tokens;
+  //Check tokens:
+  string token;
+  while (st->hasMoreToken())
+  {
+    token = st->nextToken();
+    if (token == "=")
+    {
+      //We need to merge the next token with the last one:
+      if (tokens.size() == 0)
+        throw KeyvalException("Invalid syntax, found '=' without argument name.");
+      if (!st->hasMoreToken())
+        throw KeyvalException("Invalid syntax, found '=' without argument value.");
+      string nextToken = st->nextToken();
+      if (nextToken == "=")
+        throw KeyvalException("Invalid syntax, found a double '='.");
+      tokens[tokens.size() - 1] += "=" + nextToken;
+    }
+    else
+    {
+      tokens.push_back(token);
+    }
+  }
+  for (vector<string>::iterator it = tokens.begin(); it != tokens.end(); it++)
+  {
+    singleKeyval(*it, key, val);
+    key=TextTools::removeSurroundingWhiteSpaces(key);
+    val=TextTools::removeSurroundingWhiteSpaces(val);
+    keyvals[key] = val;
+  }
+}
+
+std::string KeyvalTools::changeKeyvals(const std::string& desc, const std::map<std::string, std::string>& newkeyvals, const std::string& split, bool nested) throw (KeyvalException)
+{
+  string::size_type begin = desc.find_first_of("(");
+  string::size_type end = desc.find_last_of(")");
+
+  if (begin == string::npos && end == string::npos)
+  {
+    //Empty procedure:
+    return desc;
+  }
+  if (begin == string::npos && end != string::npos)
+    throw KeyvalException("Bad keyval procedure, missing opening parenthesis.");
+  if (begin == string::npos && end != string::npos)
+    throw KeyvalException("Bad keyval procedure, missing closing parenthesis.");
+  
+  if (!TextTools::isEmpty(desc.substr(end + 1)))
+    throw KeyvalException("Bad keyval procedure, extra characters after closing parenthesis: " + desc.substr(end + 1));
+  //Get the procedure name (without leading spaces):
+
+  string newDesc= TextTools::removeFirstWhiteSpaces(desc.substr(0, begin))+"(";
+
+  string desckv=desc.substr(begin + 1, end - begin - 1);
+
+  unique_ptr<StringTokenizer> st;
+  if (nested)
+    st.reset(new NestedStringTokenizer(desckv, "(", ")", split));
+  else
+    st.reset(new StringTokenizer(desckv, split));
+  string key, val;
+  vector<string> tokens;
+  //Check tokens:
+  string token;
+  
+  while (st->hasMoreToken())
+  {
+    token = st->nextToken();
+    if (token == "=")
+    {
+      //We need to merge the next token with the last one:
+      if (tokens.size() == 0)
+        throw KeyvalException("Invalid syntax, found '=' without argument name.");
+      if (!st->hasMoreToken())
+        throw KeyvalException("Invalid syntax, found '=' without argument value.");
+      string nextToken = st->nextToken();
+      if (nextToken == "=")
+        throw KeyvalException("Invalid syntax, found a double '='.");
+      tokens[tokens.size() - 1] += "=" + nextToken;
+    }
+    else
+    {
+      tokens.push_back(token);
+    }
+  }
+
+  for (vector<string>::iterator it = tokens.begin(); it != tokens.end(); it++)
+  {
+    singleKeyval(*it, key, val);
+    key=TextTools::removeSurroundingWhiteSpaces(key);
+    if (it!=tokens.begin())
+      newDesc+=split;
+
+    map<string, string>::const_iterator iter=newkeyvals.find(key);
+    
+    if (iter!=newkeyvals.end())
+      newDesc+=key+"="+iter->second;
+    else
+      newDesc+=*it;
+  }
+
+  newDesc+=")";
+  
+  return newDesc;
+}
+
+void KeyvalTools::parseProcedure(const std::string& desc, std::string& name, std::map<std::string, std::string>& args) throw (KeyvalException)
+{
+  string::size_type begin = desc.find_first_of("(");
+  string::size_type end = desc.find_last_of(")");
+  
+  if (begin == string::npos && end == string::npos)
+  {
+    //Empty procedure:
+    name = desc;
+    return;
+  }
+  if (begin == string::npos && end != string::npos)
+    throw KeyvalException("Bad keyval procedure, missing opening parenthesis.");
+  if (begin == string::npos && end != string::npos)
+    throw KeyvalException("Bad keyval procedure, missing closing parenthesis.");
+  
+  if (!TextTools::isEmpty(desc.substr(end + 1)))
+    throw KeyvalException("Bad keyval procedure, extra characters after closing parenthesis: " + desc.substr(end + 1));
+  //Get the procedure name (without leading spaces):
+  name = TextTools::removeFirstWhiteSpaces(desc.substr(0, begin));
+  multipleKeyvals(desc.substr(begin + 1, end - begin - 1), args);
+}
+
diff --git a/src/Bpp/Text/KeyvalTools.h b/src/Bpp/Text/KeyvalTools.h
new file mode 100644
index 0000000..e5100c2
--- /dev/null
+++ b/src/Bpp/Text/KeyvalTools.h
@@ -0,0 +1,138 @@
+//
+// File: KeyvalTools.h
+// Created by: Julien Dutheil
+// Created on: Mon May 13:16 CET 2009
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Tools, (2009)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _KEYVALTOOLS_H_
+#define _KEYVALTOOLS_H_
+
+#include "StringTokenizer.h"
+#include "TextTools.h"
+#include "../Exceptions.h"
+
+//From the STL:
+#include <map>
+
+namespace bpp
+{
+
+/**
+ * @brief Exception thrown by the Keyval parser.
+ */
+class KeyvalException :
+  public Exception
+{
+  public:
+    KeyvalException(const std::string& message) : Exception(message) {}
+};
+
+/**
+ * @brief Tools to deal with the keyval syntax.
+ *
+ * This class contains method to deal with parameter=value syntax procedure.
+ * A keyval procedure takes the form 
+ * @code
+ * proc(p1=v1,p2=v2,p3=v3,etc)
+ * @endcode
+ * where 'p' are parameter names, and 'v' are the corresponding values.
+ * These values can be nested keyval procedures.
+ */
+class KeyvalTools
+{
+  public:
+    KeyvalTools();
+    virtual ~KeyvalTools();
+
+  public:
+    /**
+     * @brief Split a string into a key and a value (General purpose function).
+     *
+     * @param desc  [in]  A string descibing the keyval, with format key=val (space are considered normal character, that's up to you to deal with that afterward!).
+     * @param key   [out] Will contain the text of the key.
+     * @param val   [out] Will contain the text of the value.
+     * @param split [in]  The delimiter. Default is '=' but ':' can be used.
+     * @throw KeyvalException If the syntax describing the keyval is not correct.
+     */
+
+  static void singleKeyval(const std::string& desc, std::string& key, std::string& val, const std::string& split = "=") throw (KeyvalException);
+    
+    /**
+     * @brief Split a string into several keys and corresponding values (General purpose function).
+     *
+     * @param desc [in]  A string descibing the keyval, with format key1=val1,key2=val2,etc (space are considered normal character, that's up to you to deal with that afterward!).
+     * @param keyvals [out] Will contain the text of the keys and their corresponding values.
+     * @param split [in] The keyval delimiter.the default is a coma, but a space character can be used for instance.
+     * @param nested [in] Tell if nested keyval procedures are expected.
+     * @throw KeyvalException If the syntax describing the keyval is not correct.
+     */
+  
+    static void multipleKeyvals(const std::string& desc, std::map<std::string, std::string>& keyvals, const std::string& split = ",", bool nested = true) throw (KeyvalException);
+
+  /**
+   * @brief Change several keys to new corresponding values (General
+   * purpose function).
+   *
+   * @param desc [in]  A string descibing the keyval, with format
+   * key1=val1,key2=val2,etc (space are considered normal character,
+   * that's up to you to deal with that afterwards!).
+   * @param newkeyvals [in] contains the text of the keys to be changed
+   * and their new corresponding values. If a key is not in desc, it
+   * is not added.
+   * @param split [in] The keyval delimiter. The default is a coma,
+   * but a space character can be used for instance.
+   * @param nested [in] Tell if nested keyval procedures are expected.
+   * @return the string with the changed values.
+   * @throw KeyvalException If the syntax describing the keyval is not correct.
+   */
+  
+  static std::string changeKeyvals(const std::string& desc, const std::map<std::string, std::string>& newkeyvals, const std::string& split = ",", bool nested = true) throw (KeyvalException);
+
+    /**
+     * @brief Parse (not recursively) a procedure string.
+     *
+     * @param desc [in]  A string descibing the keyval procedure.
+     * @param name [out] Outputs the name of the procedure.
+     * @param args [out] Fills a map with all keys and values for parameters.
+     * @throw KeyvalException If the description is invalid (one parenthesis is missing for instance).
+     */
+    static void parseProcedure(const std::string& desc, std::string& name, std::map<std::string, std::string>& args) throw (KeyvalException);
+};
+
+} //End of namespace bpp.
+
+#endif  //_KEYVALTOOLS_H_
+
diff --git a/src/Bpp/Text/NestedStringTokenizer.cpp b/src/Bpp/Text/NestedStringTokenizer.cpp
new file mode 100644
index 0000000..b51b7e5
--- /dev/null
+++ b/src/Bpp/Text/NestedStringTokenizer.cpp
@@ -0,0 +1,153 @@
+//
+// File: NestedStringTokenizer.cpp
+// Author : Julien Dutheil
+// Last modification : Monday May 22 10:57 2006
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to map data onto
+  a sequence or a phylogenetic tree.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "NestedStringTokenizer.h"
+#include "TextTools.h"
+
+using namespace bpp;
+
+//From the STL:
+#include <iostream>
+
+using namespace std;
+
+NestedStringTokenizer::NestedStringTokenizer(const std::string& s, const std::string& open, const std::string& end, const std::string& delimiters, bool solid)
+  throw (Exception):
+  StringTokenizer()
+{
+  int blocks = 0;
+  string cache = "";
+  if (!solid)
+  {
+    string::size_type index = s.find_first_not_of(delimiters, 0);
+    while (index != s.npos)
+    {
+      string::size_type newIndex = s.find_first_of(delimiters, index);
+      bool endBlockFound = false;
+      while (!endBlockFound)
+      {
+        if (newIndex != s.npos)
+        {
+          string token = s.substr(index, newIndex - index);
+          blocks += static_cast<int>(TextTools::count(token, open)) - static_cast<int>(TextTools::count(token, end));
+        
+          if (blocks == 0)
+          {
+            tokens_.push_back(cache + token);
+            cache = ""; //reset cache.
+            index = s.find_first_not_of(delimiters, newIndex);
+            endBlockFound = true;
+          }
+          else
+          {
+            // Ignore this token untill closing block is found
+            cache += s.substr(index, newIndex - index + 1);
+            index = newIndex + 1;
+            newIndex = s.find_first_of(delimiters, index);
+          }
+        }
+        else
+        {
+          string token = s.substr(index);
+          blocks += static_cast<int>(TextTools::count(token, open)) - static_cast<int>(TextTools::count(token, end));
+          if (blocks == 0)
+          {
+            tokens_.push_back(cache + token);
+            cache = ""; //reset cache.
+            index = newIndex;
+            endBlockFound = true;
+          }
+          else throw Exception("NestedStringTokenizer (constructor). Unclosed block.");
+        }
+      }
+    }
+  }
+  else
+  {
+    string::size_type index = 0;
+    while (index != s.npos)
+    {
+      string::size_type newIndex = s.find(delimiters, index);
+      bool endBlockFound = false;
+      while (!endBlockFound)
+      {
+        if (newIndex != s.npos)
+        {
+          string token = s.substr(index, newIndex - index);
+          blocks += static_cast<int>(TextTools::count(token, open)) - static_cast<int>(TextTools::count(token, end));
+				  
+          if (blocks == 0)
+          {
+            tokens_.push_back(cache + token);
+            cache = ""; //reset cache.
+            index = newIndex + delimiters.size();
+            endBlockFound = true;
+          }
+          else
+          {
+            // Ignore this token untill closing block is found
+            cache += s.substr(index, newIndex - index + 1);
+            index = newIndex + 1;
+            newIndex = s.find(delimiters, index);
+          }
+        }
+        else
+        {
+          string token = s.substr(index);
+          blocks += static_cast<int>(TextTools::count(token, open)) - static_cast<int>(TextTools::count(token, end));
+          if (blocks == 0)
+          {
+            tokens_.push_back(cache + token);
+            cache = ""; //reset cache.
+            index = newIndex;
+            endBlockFound = true;
+          }
+          else throw Exception("Unclosed block."); 
+        }
+      }
+    }
+  }
+}
+
+const std::string& NestedStringTokenizer::nextToken() throw (Exception)
+{
+  if (!hasMoreToken()) throw Exception("No more token in nested tokenizer.");
+  return tokens_[currentPosition_++];
+}
+
diff --git a/src/Bpp/Text/NestedStringTokenizer.h b/src/Bpp/Text/NestedStringTokenizer.h
new file mode 100644
index 0000000..9ba5f8b
--- /dev/null
+++ b/src/Bpp/Text/NestedStringTokenizer.h
@@ -0,0 +1,99 @@
+//
+// File: NestedStringTokenizer.h
+// Author : Julien Dutheil
+// Last modification : Monday May 22 10:57 2006
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to map data onto
+  a sequence or a phylogenetic tree.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _NESTEDSTRINGTOKENIZER_H_
+#define _NESTEDSTRINGTOKENIZER_H_
+
+//From the STL:
+#include <deque>
+#include <string>
+
+#include "StringTokenizer.h"
+#include "../Exceptions.h"
+
+namespace bpp
+{
+
+  /**
+   * @brief An improved tokenizer for strings.
+   *
+   * Splits a string according to a given (set of) delimiter(s).
+   * Delimiters in certains blocks ({}, [], etc) are ignored.
+   */
+  class NestedStringTokenizer:
+    public StringTokenizer
+  {
+  public:
+		
+    /**
+     * @brief Build a new StringTokenizer from a string.
+     *
+     * @param s          The string to parse.
+     * @param open       Opening block.
+     * @param end        Ending block.
+     * @param delimiters Chars that must be considered as delimiters.
+     * @param solid      If true, delimiters is considered as a single bloc delimiter.
+     */
+    NestedStringTokenizer(const std::string& s, const std::string& open, const std::string& end, const std::string& delimiters = " \t\n\f\r", bool solid = false) throw (Exception);
+		
+    virtual ~NestedStringTokenizer() {}
+	
+  public:
+		
+    /**
+     * @brief Get the next available token.
+     * If no token is availbale, throw an Exception.
+     *
+     * @return The next token if there is one.
+     */
+    const std::string& nextToken() throw (Exception);
+
+
+    /**
+     * @brief This function is not supported for nested tokenizers.
+     *
+     * @return An empty string.
+     */
+    std::string unparseRemainingTokens() const { return ""; }
+  };
+
+} //end of namespace bpp;
+
+#endif	//_NESTEDSTRINGTOKENIZER_H_
+
diff --git a/src/Bpp/Text/StringTokenizer.cpp b/src/Bpp/Text/StringTokenizer.cpp
new file mode 100644
index 0000000..5e06960
--- /dev/null
+++ b/src/Bpp/Text/StringTokenizer.cpp
@@ -0,0 +1,116 @@
+//
+// File: StringTokenizer.cpp
+// Author : Julien Dutheil
+//          Sylvain Gaillard
+// Last modification : Monday September 20 2004
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "StringTokenizer.h"
+
+using namespace bpp;
+using namespace std;
+
+StringTokenizer::StringTokenizer(const std::string& s, const std::string& delimiters, bool solid, bool allowEmptyTokens):
+  tokens_(),
+  splits_(),
+  currentPosition_(0)
+{
+	if (!solid)
+  {
+    string::size_type index = s.find_first_not_of(delimiters, 0);
+		while( index != s.npos)
+    {
+      string::size_type newIndex = s.find_first_of(delimiters, index);
+			if (newIndex != s.npos)
+      {
+				tokens_.push_back(s.substr(index, newIndex - index));
+				if (!allowEmptyTokens) index = s.find_first_not_of(delimiters, newIndex);
+        else                   index = newIndex + 1;
+        splits_.push_back(s.substr(newIndex, index - newIndex));
+			}
+      else
+      {
+				tokens_.push_back(s.substr(index));
+				index = newIndex;
+			}
+		}
+	}
+	else
+  {
+    string::size_type index = 0;
+		while (index != s.npos)
+    {
+      string::size_type newIndex = s.find(delimiters, index);
+			if (newIndex != s.npos)
+      {
+				tokens_.push_back(s.substr(index, newIndex - index));
+				if (!allowEmptyTokens)
+        {
+          index = newIndex + delimiters.size();
+          while (index != string::npos && s.substr(index, delimiters.size()) == delimiters)
+            index += delimiters.size();
+        }
+        else index = newIndex + delimiters.size();
+				splits_.push_back(s.substr(newIndex, index - newIndex));
+			}
+      else
+      {
+				tokens_.push_back(s.substr(index));
+				index = newIndex;
+			}
+		}
+	}
+}
+
+void StringTokenizer::removeEmptyTokens()
+{
+  for (size_t i = tokens_.size(); i > currentPosition_; i--)
+  {
+    if (tokens_[i - 1] == "") tokens_.erase(tokens_.begin() + static_cast<ptrdiff_t>(i - 1));
+  }
+}
+
+std::string StringTokenizer::unparseRemainingTokens() const
+{
+  string s;
+  for (size_t i = currentPosition_; i < tokens_.size() - 1; ++i) {
+    s += tokens_[i] + splits_[i];
+  }
+  if (numberOfRemainingTokens() > 0)
+    s += tokens_.back();
+  return s;
+}
+
diff --git a/src/Bpp/Text/StringTokenizer.h b/src/Bpp/Text/StringTokenizer.h
new file mode 100644
index 0000000..374a9a2
--- /dev/null
+++ b/src/Bpp/Text/StringTokenizer.h
@@ -0,0 +1,146 @@
+//
+// File: StringTokenizer.h
+// Author : Julien Dutheil
+//          Sylvain Gaillard
+// Last modification : Monday September 20 2004
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide utilitary
+  classes. This file belongs to the Bio++ Project.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _STRINGTOKENIZER_H_
+#define _STRINGTOKENIZER_H_
+
+#include <deque>
+#include <string>
+#include <iostream>
+
+#include "../Exceptions.h"
+
+namespace bpp
+{
+
+/**
+ * @brief A tokenizer for strings.
+ *
+ * Splits a string according to a given (set of) delimiter(s).
+ */
+  class StringTokenizer
+  {
+  protected:
+
+    /** @brief Where the tokens are stored. */
+    std::deque<std::string> tokens_;
+    std::deque<std::string> splits_;
+		
+    /** @brief the current position in the token list. */
+    size_t currentPosition_;
+
+  public:
+		
+    /**
+     * @brief Build a new StringTokenizer from a string.
+     *
+     * @param s                The string to parse.
+     * @param delimiters       Chars that must be considered as delimiters.
+     * @param solid            If true, delimiters is considered as a single bloc delimiter.
+     * @param allowEmptyTokens Tell if empty tokens are allowed or should be ignored.
+     */
+    StringTokenizer(const std::string& s, const std::string& delimiters = " \t\n\f\r", bool solid = false, bool allowEmptyTokens = false);
+	
+    virtual ~StringTokenizer() {}
+
+  public:
+    StringTokenizer(): tokens_(), splits_(), currentPosition_(0) {}
+	
+  public:
+		
+    /**
+     * @brief Get the next available token.
+     * If no token is availbale, throw an Exception.
+     *
+     * @return The next token if there is one.
+     */
+    const std::string& nextToken() throw (Exception)
+    {
+      if (!hasMoreToken()) throw Exception("No more token in tokenizer.");
+      return tokens_[currentPosition_++];
+    }
+	
+    /**
+     * @brief Tell if some tokens are still available.
+     * @return True if some tokens are still available.
+     */
+    bool hasMoreToken() const {
+      return currentPosition_ < tokens_.size();
+    }
+	
+    /**
+     * @brief Tell how many tokens are available.
+     *
+     * @return the number of tokens available.
+     */
+    size_t numberOfRemainingTokens() const { return tokens_.size() - currentPosition_; }
+
+    /**
+     * @brief Get a particular token.
+     *
+     * Do not move the iterator.
+     *
+     * @param pos The index of the token.
+     * @return the token at position 'pos'.
+     */
+    const std::string& getToken(size_t pos) const { return tokens_[pos]; }
+
+    /**
+     * @brief Retrieve all tokens.
+     *
+     * @return A reference toward the vector of tokens.
+     */
+    const std::deque<std::string>& getTokens() const { return tokens_; }
+
+    /**
+     * @brief remove all empty token from the current position.
+     */
+    void removeEmptyTokens();
+
+    /**
+     * @return The remaining tokens as if the original corresponding string was not parsed.
+     */
+    std::string unparseRemainingTokens() const;
+  };
+
+} //end of namespace bpp.
+
+#endif	//_STRINGTOKENIZER_H_
+
diff --git a/src/Bpp/Text/TextTools.cpp b/src/Bpp/Text/TextTools.cpp
new file mode 100644
index 0000000..1afb81b
--- /dev/null
+++ b/src/Bpp/Text/TextTools.cpp
@@ -0,0 +1,522 @@
+//
+// File: TextTools.cpp
+// Created by: Julien Dutheil
+// Created on: Fri Aug  8 12:57:50 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide utilitary
+   classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include "TextTools.h"
+#include "../Exceptions.h"
+
+using namespace bpp;
+
+#include <ctype.h>
+#include <sstream>
+#include <iomanip>
+
+using namespace std;
+
+/******************************************************************************/
+
+bool TextTools::isEmpty(const std::string& s)
+{
+  for (unsigned int i = 0; i < s.size(); i++)
+  {
+    char c = s[i];
+    if (c != ' ' && c != '\n' && c != '\t')
+      return false;
+  }
+  return true;
+}
+
+/******************************************************************************/
+
+std::string TextTools::toUpper(const std::string& s)
+{
+  string result = "";
+  for (size_t i = 0; i < s.size(); i++)
+  {
+    result += static_cast<char>(toupper(static_cast<int>(s[i])));
+  }
+  return result;
+}
+
+/******************************************************************************/
+
+std::string TextTools::toLower(const std::string& s)
+{
+  string result = "";
+  for (size_t i = 0; i < s.size(); i++)
+  {
+    result += static_cast<char>(tolower(static_cast<int>(s[i])));
+  }
+  return result;
+}
+
+/******************************************************************************/
+
+bool TextTools::isWhiteSpaceCharacter(char c)
+{
+  return (c == ' ')
+         || (c == '\t')
+         || (c == '\n')
+         || (c == '\r')
+         || (c == '\f');
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeWhiteSpaces(const std::string& s)
+{
+  // Copy sequence
+  string st (s);
+
+  // For all sequence's characters
+  for (unsigned int i = 0; i < st.size(); i++)
+  {
+    if (isWhiteSpaceCharacter(st[i]))
+    {
+      st.erase(st.begin() + i); // Remove character
+      i--;
+    }
+  }
+
+  // Send result
+  return st;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeFirstWhiteSpaces(const std::string& s)
+{
+  // Copy sequence
+  string st (s);
+
+  while (st.size() > 0 && isWhiteSpaceCharacter(st[0]))
+  {
+    st.erase(st.begin());
+  }
+
+  // Send result
+  return st;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeLastWhiteSpaces(const std::string& s)
+{
+  // Copy sequence
+  string st (s);
+
+  while (st.size() > 0 && isWhiteSpaceCharacter(st[st.size() - 1]))
+  {
+    st.erase(st.end() - 1);
+  }
+
+  // Send result
+  return st;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeSurroundingWhiteSpaces(const std::string& s)
+{
+  return removeFirstWhiteSpaces(removeLastWhiteSpaces(s));
+}
+
+/******************************************************************************/
+
+bool TextTools::isNewLineCharacter(char c)
+{
+  return (c == '\n')
+         || (c == '\r');
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeNewLines(const std::string& s)
+{
+  // Copy string
+  string st (s);
+
+  // For all string's characters
+  for (unsigned int i = 0; i < st.size(); i++)
+  {
+    if (isNewLineCharacter(st[i]))
+    {
+      st.erase(st.begin() + i); // Remove character
+      i--;
+    }
+  }
+
+  // Send result
+  return st;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeLastNewLines(const std::string& s)
+{
+  // Copy string
+  string st (s);
+
+  while (st.size() > 0 && isNewLineCharacter(st[st.size() - 1]))
+  {
+    st.erase(st.end() - 1);
+  }
+
+  // Send result
+  return st;
+}
+
+/******************************************************************************/
+
+bool TextTools::isDecimalNumber(char c)
+{
+  if (c == '0' || c == '1' || c == '2' || c == '3' || c == '4'
+      || c == '5' || c == '6' || c == '7' || c == '8' || c == '9')
+    return true;
+  else
+    return false;
+}
+
+/******************************************************************************/
+
+bool TextTools::isDecimalNumber(const std::string& s, char dec, char scientificNotation)
+{
+  if (isEmpty(s))
+    return false;
+              
+  size_t sepCount = 0;
+  size_t sciCount = 0;
+  size_t i = 0;
+  if (s[0] == '-') i = 1;
+  for (; i < s.size(); ++i)
+  {
+    char c = s[i];
+    if (c == dec)
+      sepCount++;
+    else if (c == scientificNotation) {
+      sciCount++;
+      if (i == s.size() - 1) return false; //Must be sthg after scientific notation.
+      c = s[i + 1];
+      if (c == '-' || c == '+') i++;
+      if (i == s.size() - 1) return false; //Must be sthg after scientific notation.
+      if (sepCount == 0) sepCount = 1; //We do not want any dec in the exponent.
+    } else if (!isDecimalNumber(c))
+      return false;
+    if (sepCount > 1 || sciCount > 1)
+      return false;
+  }
+  return true;
+}
+
+/******************************************************************************/
+
+bool TextTools::isDecimalInteger(const std::string& s, char scientificNotation)
+{
+  if (isEmpty(s))
+    return false;
+              
+  size_t sciCount = 0;
+  size_t i = 0;
+  if (s[0] == '-') i = 1;
+  for (; i < s.size(); ++i)
+  {
+    char c = s[i];
+    if (c == scientificNotation) {
+      sciCount++;
+      if (i == s.size() - 1) return false; //Must be sthg after scientific notation.
+      c = s[i + 1];
+      if (c == '-') return false; //Not an integer then!
+      if (c == '+') i++;
+      if (i == s.size() - 1) return false; //Must be sthg after scientific notation.
+    } else if (!isDecimalNumber(c))
+      return false;
+    if (sciCount > 1)
+      return false;
+  }
+  return true;
+}
+
+/******************************************************************************/
+
+std::string TextTools::toString(int i)
+{
+  ostringstream oss;
+  oss << i;
+  return oss.str();
+}
+
+/******************************************************************************/
+
+std::string TextTools::toString(char c)
+{
+  ostringstream oss;
+  oss << c;
+  return oss.str();
+}
+
+/******************************************************************************/
+
+std::string TextTools::toString(double d, int precision)
+{
+  ostringstream oss;
+  oss << setprecision(precision) << d;
+  return oss.str();
+}
+
+/******************************************************************************/
+
+int TextTools::toInt(const std::string& s, char scientificNotation)
+{
+  if (!isDecimalInteger(s, scientificNotation)) throw Exception("TextTools::toInt(). Invalid number specification: " + s);
+  istringstream iss(s);
+  int i;
+  iss >> i;
+  return i;
+}
+
+/******************************************************************************/
+
+double TextTools::toDouble(const std::string& s, char dec, char scientificNotation)
+{
+  if (!isDecimalNumber(s, dec, scientificNotation)) throw Exception("TextTools::toDouble(). Invalid number specification: " + s);
+  istringstream iss(s);
+  double d;
+  iss >> d;
+  return d;
+}
+
+/******************************************************************************/
+
+std::string TextTools::resizeRight(const std::string& s, size_t newSize, char fill)
+{
+  if (s.size() > newSize)
+    return s.substr(0, newSize);
+  else
+    return s + std::string(newSize - s.size(), fill);
+}
+
+/******************************************************************************/
+
+std::string TextTools::resizeLeft(const std::string& s, size_t newSize, char fill)
+{
+  if (s.size() > newSize)
+    return s.substr(s.size() - newSize);
+  else
+    return string(newSize - s.size(), fill) + s;
+}
+
+/******************************************************************************/
+
+std::vector<std::string> TextTools::split(const std::string& s, size_t n)
+{
+  vector<string> v;
+  string tmp = s;
+  while (tmp.size() > n)
+  {
+    v.push_back(tmp.substr(0, n));
+    tmp = tmp.substr(n);
+  }
+  v.push_back(tmp);
+  return v;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeSubstrings(const std::string& s, char blockBeginning, char blockEnding)
+{
+  string t = "";
+  int blockCount = 0;
+  size_t begPos = 0;
+  for (size_t i = 0; i < s.size(); i++)
+  {
+    char current = s[i];
+    if (current == blockBeginning)
+    {
+      blockCount++;
+      t += s.substr(begPos, i - begPos);
+    }
+    else if (current == blockEnding)
+    {
+      blockCount--;
+      if (blockCount == 0)
+      {
+        begPos = i + 1;
+      }
+      else if (blockCount < 0)
+        throw Exception("TextTools::removeSubstrings(). " +
+                        string("Ending block character without corresponding beginning one at position ") + toString((int)i) + ".");
+    }
+  }
+  t += s.substr(begPos);
+  return t;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeSubstrings(const std::string& s, char blockBeginning, char blockEnding, std::vector<string>& exceptionsBeginning, std::vector<string>& exceptionsEnding)
+{
+  string t = "";
+  int blockCount = 0;
+  size_t begPos = 0;
+  for (size_t i = 0; i < s.size(); i++)
+  {
+    char current = s[i];
+    if (current == blockBeginning)
+    {
+      bool except = false;
+      for (size_t j = 0; j < exceptionsBeginning.size(); j++)
+      {
+        size_t pos = exceptionsBeginning[j].find(blockBeginning);
+        if (pos != string::npos) {
+          size_t left = i - pos;
+          size_t right = i + exceptionsBeginning[j].length() - pos;
+          if ((right < s.length() - 1) && (hasSubstring (s.substr(left, right), exceptionsBeginning[j])))
+          {
+            except = true;
+            break;
+          }
+        }
+      }
+      if (!except)
+      {
+        blockCount++;
+        t += s.substr(begPos, i - begPos);
+      }
+    }
+    else if ( (current == blockEnding) && (blockCount > 0) )
+    {
+      for (size_t j = 0; j < exceptionsEnding.size(); j++)
+      {
+        size_t pos = exceptionsEnding[j].find(blockEnding);
+        if (pos != string::npos) {
+          size_t left = i - pos;
+          size_t right = i + exceptionsEnding[j].length() - pos;
+          if ((right < s.length() - 1 ) && (hasSubstring (s.substr(left, right), exceptionsEnding[j])))
+          {
+            break;
+          }
+        }
+      }
+      blockCount--;
+      if (blockCount == 0)
+      {
+        begPos = i + 1;
+      }
+      else if (blockCount < 0)
+        throw Exception("TextTools::removeSubstrings(). " +
+                        string("Ending block character without corresponding beginning one at position ") + toString((int)i) + ".");
+    }
+  }
+  t += s.substr(begPos);
+  return t;
+}
+
+/******************************************************************************/
+
+std::string TextTools::removeChar(const std::string& s, char c)
+{
+  // Copy sequence
+  string st(s);
+
+  // For all sequence's characters
+  for (unsigned int i = 0; i < st.size(); i++)
+  {
+    if (st[i] == c)
+    {
+      st.erase(st.begin() + i); // Remove character
+      i--;
+    }
+  }
+
+  // Send result
+  return st;
+}
+
+/******************************************************************************/
+
+unsigned int TextTools::count(const std::string& s, const std::string& pattern)
+{
+  unsigned int count = 0;
+  string::size_type index = s.find(pattern);
+  while (index != string::npos)
+  {
+    count++;
+    index = s.find(pattern, index + 1);
+  }
+  return count;
+}
+
+/******************************************************************************/
+
+bool TextTools::endsWith(const std::string& s, const std::string& pattern)
+{
+  if (s.size() < pattern.size())
+    return false;
+  return s.substr(s.size() - pattern.size()) == pattern;
+}
+
+/******************************************************************************/
+
+bool TextTools::hasSubstring(const std::string& s, const std::string& pattern)
+{
+  if (s.size() < pattern.size())
+    return false;
+  for (size_t i = 0; i < s.size() - pattern.size() + 1; ++i)
+  {
+    if (s.substr(i, pattern.size()) == pattern)
+      return true;
+  }
+  return false;
+}
+
+/******************************************************************************/
+
+void TextTools::replaceAll(std::string& target, const std::string& query, const std::string& replacement)
+{
+  if (query.empty())
+    return;
+  size_t pos = target.find(query);
+  while (pos != string::npos) {
+    target.replace(pos, query.length(), replacement);
+    pos += replacement.length(); //We prevent recursivity! 
+    pos = target.find(query, pos);
+  }
+}
+
+/******************************************************************************/
+
diff --git a/src/Bpp/Text/TextTools.h b/src/Bpp/Text/TextTools.h
new file mode 100644
index 0000000..ac4a295
--- /dev/null
+++ b/src/Bpp/Text/TextTools.h
@@ -0,0 +1,416 @@
+//
+// File: TextTools.h
+// Created by: Julien Dutheil
+// Created on: Fri Aug  8 12:57:50 2003
+//
+
+/*
+  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+  This software is a computer program whose purpose is to provide basal and
+  utilitary classes. This file belongs to the Bio++ Project.
+
+  This software is governed by the CeCILL  license under French law and
+  abiding by the rules of distribution of free software.  You can  use, 
+  modify and/ or redistribute the software under the terms of the CeCILL
+  license as circulated by CEA, CNRS and INRIA at the following URL
+  "http://www.cecill.info". 
+
+  As a counterpart to the access to the source code and  rights to copy,
+  modify and redistribute granted by the license, users are provided only
+  with a limited warranty  and the software's author,  the holder of the
+  economic rights,  and the successive licensors  have only  limited
+  liability. 
+
+  In this respect, the user's attention is drawn to the risks associated
+  with loading,  using,  modifying and/or developing or reproducing the
+  software by the user in light of its specific status of free software,
+  that may mean  that it is complicated to manipulate,  and  that  also
+  therefore means  that it is reserved for developers  and  experienced
+  professionals having in-depth computer knowledge. Users are therefore
+  encouraged to load and test the software's suitability as regards their
+  requirements in conditions enabling the security of their systems and/or 
+  data to be ensured and,  more generally, to use and operate it in the 
+  same conditions as regards security. 
+
+  The fact that you are presently reading this means that you have had
+  knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _TEXTTOOLS_H_
+#define _TEXTTOOLS_H_
+
+// From the STL:
+#include <string>
+#include <vector>
+#include <sstream>
+#include <iomanip>
+
+namespace bpp
+{
+
+  /**
+   * @brief Some utilitary functions that work on strings.
+   */
+  class TextTools
+  {
+  public:
+
+    /**
+     * @brief Tell if a string is empty.
+     *
+     * A string is considered to be 'empty' if it is only made of white
+     * spaces.
+     *
+     * @param s The string to check.
+     * @return True if the string has only white characters.
+     */
+    static bool isEmpty(const std::string& s);
+
+    /**
+     * @brief Make the string uppercase.
+     *
+     * @param s The string to analyse.
+     * @return A copy of the string with all chars uppercase.
+     */
+    static std::string toUpper(const std::string& s);
+
+    /**
+     * @brief Make the string lowercase.
+     *
+     * @param s The string to analyse.
+     * @return A copy of the string with all chars lowercase.
+     */
+    static std::string toLower(const std::string& s);
+
+    /**
+     * @brief Tell if a character is a white space or not.
+     *
+     * @param c The character to check.
+     * @return True if c is one of the following: ' ', '\\t', '\\n', '\\r' or '\\f'.
+     */
+    static bool isWhiteSpaceCharacter(char c);
+
+    /**
+     * @brief Remove all white spaces characters in a string.
+     *
+     * @param s The string to parse.
+     * @return A copy of 's' without white spaces characters.
+     */
+    static std::string removeWhiteSpaces (const std::string& s);
+
+    /**
+     * @brief Remove all white spaces characters at the beginning of a string.
+     *
+     * @param s The string to parse.
+     * @return A copy of 's' beginning with the first non-white character.
+     */
+    static std::string removeFirstWhiteSpaces (const std::string& s);
+
+    /**
+     * @brief Remove all white spaces characters at the end of a string.
+     *
+     * @param s The string to parse.
+     * @return A copy of 's' ending with the last non-white character.
+     */
+    static std::string removeLastWhiteSpaces (const std::string& s);
+
+    /**
+     * @brief Remove all white spaces characters at the beginning and the end of a string.
+     *
+     * @param s The string to parse.
+     * @return A copy of 's' beginning with the first non-white character
+     * and ending with the last one.
+     */
+    static std::string removeSurroundingWhiteSpaces(const std::string& s);
+
+    /**
+     * @brief Tell if a character is a new line character or not.
+     *
+     * @param c The character to check.
+     * @return True if c is one of the following: '\\n' or '\\r'.
+     */
+    static bool isNewLineCharacter(char c);
+
+    /**
+     * @brief Remove all new line characters in a string.
+     *
+     * @param s The string to parse.
+     * @return A copy of 's' without new line characters.
+     */
+    static std::string removeNewLines (const std::string& s);
+
+    /**
+     * @brief Remove all new line characters at the end of a string.
+     *
+     * @param s The string to parse.
+     * @return A copy of 's' ending with the last non-new line character.
+     */
+    static std::string removeLastNewLines(const std::string& s);
+
+    /**
+     * @brief Tell is a given character describes a decimal number.
+     *
+     * @param c The character to check.
+     * @return true if the given character is the reprensentation of a decimal number.
+     */
+    static bool isDecimalNumber(char c);
+
+    /**
+     * @brief Tell is a given character string describes a decimal number.
+     *
+     * NB: for now, this parser will not recognize thousands delimiters, and not the scientific notation neither.
+     * @param s The string to parse.
+     * @param dec The decimal separator.
+     * @param scientificNotation character to use for scientific notation (typically 'e' or 'E').
+     * @return true if the given string is the representation of a decimal number.
+     */
+    static bool isDecimalNumber(const std::string& s, char dec = '.', char scientificNotation = 'e');
+
+    /**
+     * @brief Tell is a given character string describes a decimal integer.
+     *
+     * NB: for now, this parser will not recognize thousands delimiters, and not the scientific notation neither.
+     * @param s The string to parse.
+     * @param scientificNotation character to use for scientific notation (typically 'e' or 'E').
+     * @return true if the given string is the representation of a decimal integer.
+     */
+    static bool isDecimalInteger(const std::string& s, char scientificNotation = 'e');
+
+    /**
+     * @brief General template method to convert to a string.
+     *
+     * @param t The object to convert.
+     * @return A string equal to t.
+     */
+    template<class T> static std::string toString(T t)
+    {
+      std::ostringstream oss;
+      oss << t;
+      return oss.str();
+    }
+
+    /**
+     * @brief Template string conversion.
+     * 
+     * @param t The object to convert.
+     * @param precision To use (for numbers).
+     * @return A string equal to t.
+     */
+    template<class T>
+    static std::string toString(T t, int precision)
+    {
+      std::ostringstream oss;
+      oss << std::setprecision(precision) << t;
+      return oss.str();
+    }
+
+    /**
+     * @brief General template method to convert from string.
+     *
+     * @param s The string to convert.
+     * @return An object from string t.
+     */
+    template<class T> static T fromString(const std::string& s)
+    {
+      std::istringstream iss(s);
+      T obj;
+      iss >> obj;
+      return obj;
+    }
+
+    /**
+     * @brief Convert from int to string.
+     *
+     * @param i The integer to convert.
+     * @return A string equal to i.
+     */
+    static std::string toString(int i);
+
+    /**
+     * @brief Convert from char to string.
+     *
+     * @param c The character to convert.
+     * @return A string equal to c.
+     */
+    static std::string toString(char c);
+
+    /**
+     * @brief Convert from double to string.
+     *
+     * @param d The double to convert.
+     * @param precision To use (for numbers).
+     * @return A string equal to d.
+     */
+    static std::string toString(double d, int precision = 6);
+
+    /**
+     * @brief Convert from string to int.
+     *
+     * @param s The string to parse.
+     * @param scientificNotation character to use for scientific notation (typically 'e' or 'E').
+     * @return The integer corresponding to s.
+     * @throw Exception if the string does not specify a valid number.
+     */
+    static int toInt(const std::string& s, char scientificNotation = 'e');
+
+    /**
+     * @brief Convert from string to double.
+     *
+     * @param s The string to parse.
+     * @param dec The decimal separator.
+     * @param scientificNotation character to use for scientific notation (typically 'e' or 'E').
+     * @return The double corresponding to s.
+     * @throw Exception if the string does not specify a valid number.
+     */
+    static double toDouble(const std::string& s, char dec = '.', char scientificNotation = 'e');
+
+    /**
+     * @brief Template to string conversion.
+     * 
+     * @param s The string to parse.
+     * @return An object of class R corresponding to s.
+     */
+    template<class T>
+    static T to(const std::string& s)
+    {
+      std::istringstream iss(s);
+      T t;
+      iss >> t;
+      return t;
+    }
+
+    /**
+     * @brief Send a string of size 'newSize', which is a copy of 's' truncated or
+     * filled with character 'fill' at the end.
+     *
+     * @param s       The string to parse.
+     * @param newSize The new string size.
+     * @param fill    The character to use to fill the string id length < newSize.
+     * @return A string of size newsize which is a copy from the left of s.
+     */
+
+    static std::string resizeRight(const std::string& s, size_t newSize, char fill = ' ');
+
+    /**
+     * @brief Send a string of size 'newSize', which is a copy of 's' truncated or
+     * filled with character 'fill' at the beginning.
+     *
+     * @param s       The string to parse.
+     * @param newSize The new string size.
+     * @param fill    The character to use to fill the string id length < newSize.
+     * @return A string of size newsize which is a copy from the right of s.
+     */
+    static std::string resizeLeft(const std::string& s, size_t newSize, char fill = ' ');
+
+    /**
+     * @brief Split a string into parts of size 'n'.
+     *
+     * The last part may contain < n chars.
+     *
+     * @param s The string to parse.
+     * @param n The number of tokens.
+     * @return A vector of strings with all tokens.
+     */
+    static std::vector<std::string> split(const std::string& s, size_t n);
+
+    /**
+     * @brief Remove substrings from a string.
+     *
+     * All substrings beginning with blockBeginning
+     * and ending with blockEnding will be removed.
+     * Nesting blocks are allowed, the most extern block will be removed.
+     *
+     * @param s The string to parse.
+     * @param blockBeginning The character specifying the beginning of each block.
+     * @param blockEnding    The character specifying the end of each block.
+     * @return The string with all blocks removed.
+     * @throw Exception If some blocks are not well formed.
+     */
+    static std::string removeSubstrings(const std::string& s, char blockBeginning, char blockEnding);
+  
+    /**
+     * @brief Remove substrings from a string, unless they match some specific substrings.
+     *
+     * All substrings beginning with blockBeginning
+     * and ending with blockEnding will be removed, except if they begin with 
+     * a string included in the vector exceptionsBeginning or end with a string
+     * included in the vector exceptionsEnding.
+     * Nesting blocks are allowed, the most extern block will be removed.
+     *
+     * @param s The string to parse.
+     * @param blockBeginning The character specifying the beginning of each block.
+     * @param blockEnding    The character specifying the end of each block.
+     * @param exceptionsBeginning A vector containing all strings specifying the beginning of blocks that should not be removed. 
+     * @param exceptionsEnding A vector containing all strings specifying the ending of blocks that should not be removed.
+     * @return The string with all blocks removed.
+     * @throw Exception If some blocks are not well formed.
+     */
+    static std::string removeSubstrings(const std::string& s, char blockBeginning, char blockEnding, std::vector<std::string>& exceptionsBeginning, std::vector<std::string>& exceptionsEnding);
+  
+    /**
+    * @brief Remove all occurences of a character in a string.
+    *
+    * @param s The string to parse.
+    * @param c The character to remove.
+    * @return The string with all specified chars removed.
+    */
+    static std::string removeChar(const std::string& s, char c);
+
+    /**
+     * @brief Count the occurences of a given pattern in a string.
+     *
+     * @param s The string to search.
+     * @param pattern The pattern to use (this is a mere string, not a regexp!).
+     * @return The number of occurences of 'pattern' in 's'.
+     */
+    static unsigned int count(const std::string& s, const std::string& pattern);
+
+    /**
+     * @brief Tell is a string begins with a certain motif.
+     *
+     * @param s The string to search.
+     * @param pattern The pattern to use (this is a mere string, not a regexp!).
+     * @return true/false
+     */
+
+    static bool startsWith(const std::string& s, const std::string& pattern)
+    {
+      if (s.size() < pattern.size())
+        return false;
+      return s.substr(0, pattern.size()) == pattern;
+    }
+
+    /**
+     * @brief Tell is a string ends with a certain motif.
+     *
+     * @param s The string to search.
+     * @param pattern The pattern to use (this is a mere string, not a regexp!).
+     * @return true/false
+     */
+    static bool endsWith(const std::string& s, const std::string& pattern);
+
+    /**
+     * @brief Tell is a string contains a certain motif.
+     *
+     * @param s The string to search.
+     * @param pattern The pattern to use (this is a mere string, not a regexp!).
+     * @return true/false
+     */
+    static bool hasSubstring(const std::string& s, const std::string& pattern);
+
+    /**
+     * @brief Replacement of all non-overlapping occurrences of a certain motif in a string.
+     *
+     * @param target String to be modified
+     * @param query The motif to look for
+     * @param replacement The replacement string
+     */
+    static void replaceAll(std::string& target, const std::string& query, const std::string& replacement);
+     
+  };
+
+} //end of namespace bpp.
+
+#endif	//_TEXTTOOLS_H_
+
diff --git a/src/Bpp/Utils/AttributesTools.cpp b/src/Bpp/Utils/AttributesTools.cpp
new file mode 100644
index 0000000..11e8915
--- /dev/null
+++ b/src/Bpp/Utils/AttributesTools.cpp
@@ -0,0 +1,317 @@
+//
+// File: AttributesTools.cpp
+// Created by: Julien Dutheil
+// Created on: 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide basal and
+   utilitary classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+// From the STL:
+#include <cstdlib>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+
+using namespace std;
+
+#include "AttributesTools.h"
+#include "../App/ApplicationTools.h"
+#include "../Text/TextTools.h"
+#include "../Io/FileTools.h"
+
+using namespace bpp;
+
+/******************************************************************************/
+
+std::vector<std::string> AttributesTools::getVector(int argc, char* argv[])
+{
+  size_t n = static_cast<size_t>(argc);
+  vector<string> result(n);
+  for (size_t i = 1; i < n; ++i)
+  {
+    result[i] = string(argv[i]);
+  }
+  // Ignore first argc which is the program name!
+  return result;
+}
+
+/******************************************************************************/
+
+std::map<std::string, std::string> AttributesTools::getAttributesMap(
+  const std::vector<std::string>& argv,
+  const std::string& delimiter)
+{
+  map<string, string> am;
+  getAttributesMap(argv, am, delimiter);
+  return am;
+}
+
+/******************************************************************************/
+
+void AttributesTools::getAttributesMap(
+  const std::vector<std::string>& argv,
+  std::map<std::string, std::string>& am,
+  const std::string& delimiter)
+{
+  vector<string> argv2(argv.size());
+  // First make a few cleaning:
+  for (size_t i = 0; i < argv.size(); i++)
+  {
+    // Make a few corrections first:
+    string arg = removeComments(argv[i], string("#"), string("\n")); // remove shell comments.
+    arg = removeComments(arg, string("//"), string("\n")); // remove C simple comments.
+    arg = removeComments(arg, string("/*"), string("*/")); // remove C multiple comments.
+    arg = TextTools::removeWhiteSpaces(arg);
+    argv2[i] = arg;
+  }
+  // Now parse arguments:
+  for (size_t i = 0; i < argv.size(); i++)
+  {
+    string arg = argv2[i];
+    if (arg == "")
+      continue;  // Skipping void line.
+    while (arg[arg.size() - 1] == '\\')
+    {
+      // Splitted line
+      i++;
+      arg = arg.substr(0, arg.length() - 1) + argv2[i];
+    }
+    // Parsing:
+    string::size_type limit = arg.find(delimiter, 0);
+    if (limit == string::npos)
+    {
+      // Invalid parameter
+      (*ApplicationTools::warning << "WARNING!!! Parameter '" << arg << "' has been ignored.").endLine();
+    }
+    else
+    {
+      string name  = string(arg.begin(), arg.begin() + static_cast<ptrdiff_t>(limit));
+      string value = string(arg.begin() + static_cast<ptrdiff_t>(limit + delimiter.size()), arg.end());
+      // if ((name == "param") || (name == "params"))
+      // {
+      //   //Recursive inclusion:
+      //   getAttributesMapFromFile(value, am, delimiter);
+      // }
+      // else
+      am[name] = value;
+    }
+  }
+}
+
+/******************************************************************************/
+
+void AttributesTools::getAttributesMapFromFile(
+  const std::string& file,
+  std::map<std::string, std::string>& params,
+  const std::string& delimiter)
+{
+  cout << "Parsing file " << file << " for options." << endl;
+  ifstream input(file.c_str(), ios::in);
+  vector<string> lines = FileTools::putStreamIntoVectorOfStrings(input);
+  getAttributesMap(lines, params, delimiter);
+}
+
+/******************************************************************************/
+
+std::map<std::string, std::string> AttributesTools::getAttributesMapFromFile(
+  const std::string& file,
+  const std::string& delimiter)
+{
+  map<string, string> params;
+  getAttributesMapFromFile(file, params, delimiter);
+  return params;
+}
+
+/******************************************************************************/
+
+void AttributesTools::actualizeAttributesMap(
+  std::map<std::string, std::string>& attMap,
+  const std::map<std::string, std::string>& atts)
+{
+  for (map<string, string>::const_iterator i = atts.begin(); i != atts.end(); i++)
+  {
+    if ((i->first != "param") && (i->first != "params"))
+      attMap[i->first] = i->second;
+  }
+}
+
+/******************************************************************************/
+
+void AttributesTools::resolveVariables(
+  std::map<std::string, std::string>& am,
+  char varCode,
+  char varBeg,
+  char varEnd)
+throw (Exception)
+{
+  // Now resolve any variable:
+  for (map<string, string>::iterator it = am.begin(); it != am.end(); it++)
+  {
+    string value = it->second;
+    string::size_type index1 = value.find(TextTools::toString(varCode) + TextTools::toString(varBeg));
+    while (index1 != string::npos)
+    {
+      string::size_type index2 = value.find(TextTools::toString(varEnd), index1);
+      if (index2 != string::npos)
+      {
+        string varName  = value.substr(index1 + 2, index2 - index1 - 2);
+        map<string, string>::iterator varIt = am.find(varName);
+        string varValue = "";
+        if (varIt == am.end())
+        {
+          if (ApplicationTools::error)
+            (*ApplicationTools::error << "Variable '" << varName << "' is undefined and was ignored.").endLine();
+        }
+        else
+        {
+          varValue = varIt->second;
+        }
+        // Modify original field:
+        string newValue = value.substr(0, index1) + varValue + value.substr(index2 + 1);
+        it->second = newValue;
+      }
+      else
+        throw Exception("Syntax error, variable name is not closed.");
+      value = it->second;
+      index1 = value.find(TextTools::toString(varCode) + TextTools::toString(varBeg));
+    }
+  }
+}
+
+/******************************************************************************/
+
+std::string AttributesTools::removeComments(
+  const std::string& s,
+  const std::string& begin,
+  const std::string& end)
+{
+  string r = s;
+  string::size_type last = 0;
+  do
+  {
+    string::size_type first = r.find(begin, last);
+    if (first == string::npos)
+      return r;  // No shell comment.
+    // else:
+    last = r.find(end, first);
+    if (last == string::npos)
+    {
+      r.erase(r.begin() + static_cast<ptrdiff_t>(first), r.end());
+    }
+    else
+    {
+      r.erase(r.begin() + static_cast<ptrdiff_t>(first), r.begin() + static_cast<ptrdiff_t>(last));
+    }
+  }
+  while (last != string::npos);
+  return r;
+}
+
+/******************************************************************************/
+
+std::map<std::string, std::string> AttributesTools::parseOptions(int args, char** argv) throw (Exception)
+{
+  // Get the parameters from command line:
+  map<string, string> cmdParams = AttributesTools::getAttributesMap(
+    AttributesTools::getVector(args, argv), "=");
+
+  // Look for a specified file with parameters:
+  map<string, string> params;
+  std::map<std::string, std::string>::iterator it;
+
+  if (cmdParams.find("param") != cmdParams.end())
+  {
+    string file = cmdParams["param"];
+    if (!FileTools::fileExists(file))
+    {
+      throw Exception("AttributesTools::parseOptions(). Parameter file not found.");
+    }
+    else
+    {
+      params = getAttributesMapFromFile(file, "=");
+      // Actualize attributes with ones passed to command line:
+      actualizeAttributesMap(params, cmdParams);
+    }
+  }
+  else
+  {
+    params = cmdParams;
+  }
+  // Resolve variables:
+  resolveVariables(params);
+
+  std::vector<string> mapfile;
+  std::vector<string>::iterator imapfile;
+  string file;
+
+  while (true)
+  {
+    it = params.find("param");
+    if (it != params.end())
+    {
+      file = it->second;
+      if (std::find(mapfile.begin(), mapfile.end(), file) == mapfile.end())
+      {
+        params.erase(it);
+        mapfile.push_back(file);
+        getAttributesMapFromFile(file, params, "=");
+        resolveVariables(params);
+        continue;
+      }
+      else
+        throw Exception("parsing error : Already used file " + file);
+    }
+    it = params.find("params");
+    if (it != params.end())
+    {
+      file = it->second;
+      if (find(mapfile.begin(), mapfile.end(), file) == mapfile.end())
+      {
+        params.erase(it);
+        mapfile.push_back(file);
+        getAttributesMapFromFile(file, params, "=");
+        resolveVariables(params);
+        continue;
+      }
+      else
+        throw Exception("parsing error : Already used file " + file);
+    }
+    break;
+  }
+
+  return params;
+}
+
+/******************************************************************************/
diff --git a/src/Bpp/Utils/AttributesTools.h b/src/Bpp/Utils/AttributesTools.h
new file mode 100644
index 0000000..a73c0b4
--- /dev/null
+++ b/src/Bpp/Utils/AttributesTools.h
@@ -0,0 +1,245 @@
+//
+// File: AttributesTools.h
+// Created by: Julien Dutheil
+// Created on: 2003
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Tools, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide basal and
+   utilitary classes. This file belongs to the Bio++ Project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#ifndef _ATTRIBUTES_TOOLS_H_
+#define _ATTRIBUTES_TOOLS_H_
+
+#include "../Exceptions.h"
+
+// From the STL:
+#include <cstdlib>
+#include <map>
+#include <string>
+#include <vector>
+
+namespace bpp
+{
+/**
+ * @brief Some functions to deal with attributes, i.e. parameters passed to a program/method.
+ *
+ * These methods allows you to retrieve attributes from command line arguments or
+ * from a file.
+ * The underlying syntax is <code> attributeName = argument </code>.
+ * Here the delimiter char is '=', but another character may be used.
+ *
+ * In files, shell comments: <code> # my comment line here </code>,
+ * C comments: <code> / * my comment block here * / </code> (but multiline not supported!)
+ * and C++ comments: <code> // my comment line here </code> are allowed, and ignored while parsing.
+ *
+ * Lines may be broken, using the bash character '\' at the end of the line:
+ * @code
+ * optionfile=/home/foo/\
+ *    bar.txt
+ * @endcode
+ * will be read as
+ * @code
+ * optionfile=/home/foo/bar.txt
+ * @endcode
+ *
+ * Attributes are stored as a map<string, string>, with attributes names as keys,
+ * and arguments as values.
+ *
+ * Here is an example of use.
+ * This piece of code typically is at the begining of the main function.
+ * It uses the FileTools and ApplicationTools classes, for checking file existence and displaying messages respectively.
+ * @code
+ * // Get the parameters from command line:
+ * map<string, string> cmdParams = AttributesTools::getAttributesMap(
+ *     AttributesTools::getVector(argc, argv), "=");
+ *
+ * // Look for a specified file with parameters:
+ * int main(int argc, char *argv[]) {
+ *   map<string, string> params;
+ *   if(cmdParams.find("param") != cmdParams.end()) {
+ *     string file = cmdParams["param"];
+ *     if(!FileTools::fileExists(file)) {
+ *       ApplicationTools::displayError("Parameter file not found.");
+ *       exit(-1);
+ *     } else {
+ *       params = AttributesTools::getAttributesMapFromFile(file, "=");
+ *       // Actualize attributes with the ones passed to command line:
+ *       AttributesTools::actualizeAttributesMap(params, cmdParams);
+ *     }
+ *   } else {
+ *     params = cmdParams;
+ *   }
+ * ...
+ * @endcode
+ * These pieces of code does the following:
+ * - get all parameters from the command line and store them in a map,
+ * - check if some parameter is called 'param' or 'params'. If so, look for the file
+ *   given as value and try to read some parameters from it.
+ * - If an parameter file was found, update the parameter in it with those from
+ *   the command line. This implies that when a parameter is found in both the
+ *   command line and the option file, the value from the command line will be
+ *   retained.
+ *
+ * Support for variable is also available.
+ * A variable character is specified (typically '$()') and may be used to de-reference any argument.
+ * For instance,
+ * @code
+ * data=LSU
+ * file=$(data).out
+ * @endcode
+ *
+ * will be equivalent to
+ * @code
+ * data=LSU
+ * file=LSU.out
+ * @endcode
+ */
+class AttributesTools
+{
+public:
+  AttributesTools() {}
+  virtual ~AttributesTools() {}
+
+  /**
+   * @brief Get attributes a vector of strings from command line arguments.
+   *
+   * @param argc The number of arguments.
+   * @param argv The array with all arguments.
+   * @return A vector with all arguments as strings.
+   */
+  static std::vector<std::string> getVector(int argc, char* argv[]);
+
+  /**
+   * @brief Get an attribute map from a vector of arguments.
+   *
+   * This method also resolve all variable calls.
+   *
+   * @param argv      The vector of arguments.
+   * @param delimiter The string that separates attribute names from arguments (for instance '=').
+   * @return          The attribute map.
+   */
+  static std::map<std::string, std::string> getAttributesMap(
+    const std::vector<std::string>& argv,
+    const std::string& delimiter = "=");
+
+  /**
+   * @brief Get an attribute map from a vector of arguments.
+   *
+   * This method also resolve all variable calls.
+   *
+   * @param argv      The vector of arguments.
+   * @param am        The attribute map to fill.
+   * @param delimiter The string that separates attribute names from arguments (for instance '=').
+   */
+  static void getAttributesMap(
+    const std::vector<std::string>& argv,
+    std::map<std::string, std::string>& am,
+    const std::string& delimiter = "=");
+
+  /**
+   * @brief Get an attribute map from a file.
+   *
+   * @param file      The file with all arguments.
+   * @param delimiter The string that separates attribute names from arguments (for instance '=').
+   * @return An attribute map.
+   */
+  static std::map<std::string, std::string> getAttributesMapFromFile(
+    const std::string& file,
+    const std::string& delimiter);
+
+  /**
+   * @brief Get an attribute map from a file.
+   *
+   * @param file      The file with all arguments.
+   * @param params    An attribute map to fill.
+   * @param delimiter The string that separates attribute names from arguments (for instance '=').
+   */
+  static void getAttributesMapFromFile(
+    const std::string& file,
+    std::map<std::string, std::string>& params,
+    const std::string& delimiter);
+
+  /**
+   * @brief Actualizes an attribute map with another.
+   *
+   * All fields in map 2 will be added to map 1.
+   * If two attributes have the same name, then map 1 value will be overwritten.
+   *
+   * @param attMap The attributes map.
+   * @param atts   The attributes to add to the map.
+   */
+  static void actualizeAttributesMap(
+    std::map<std::string, std::string>& attMap,
+    const std::map<std::string, std::string>& atts);
+
+  /**
+   * @brief Resolve the variables.
+   *
+   * If used prior to the actualizeAttributesMap, this function will make the
+   * variables 'local', whereas using them after will make them 'global'.
+   *
+   * @param am The attributes map.
+   * @param varCode   The code that defines variable recalls.
+   * @param varBeg    Variables begin name code.
+   * @param varEnd    Variables end name code.
+   * @throw Exception If there is a syntax error.
+   */
+  static void resolveVariables(std::map<std::string, std::string>& am,
+                               char varCode = '$',
+                               char varBeg = '(',
+                               char varEnd = ')') throw (Exception);
+
+  /**
+   * @brief Global function that reads all parameters from command line and files,
+   * and set the values in a map.
+   *
+   * @param args Number of arguments, as passed to the main function.
+   * @param argv Array of values, as passed to the main function.
+   * @return An attributes map.
+   * @throw Exception in case an option file is not found.
+   */
+  static std::map<std::string, std::string> parseOptions(int args, char** argv) throw (Exception);
+
+private:
+  /**
+   * @brief Remove comments from a string.
+   *
+   * @param s     The string to parse.
+   * @param begin Comments front delimiter.
+   * @param end   Comments end delimiter.
+   */
+  static std::string removeComments(const std::string& s, const std::string& begin, const std::string& end);
+};
+} // end of namespace bpp.
+
+#endif // _ATTRIBUTES_TOOLS_H_
diff --git a/src/Bpp/Utils/MapTools.h b/src/Bpp/Utils/MapTools.h
new file mode 100644
index 0000000..8bc0049
--- /dev/null
+++ b/src/Bpp/Utils/MapTools.h
@@ -0,0 +1,129 @@
+//
+// File: MapTools.h
+// Created by: Julien Dutheil
+// Created on: Tue May 13 18:16:10 2003
+//
+
+/*
+Copyright or © or Copr. CNRS, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#ifndef _MAPTOOLS_H_
+#define _MAPTOOLS_H_
+
+#include <map>
+#include <vector>
+
+namespace bpp
+{
+
+/**
+ * @brief A fiew tools working on map objects.
+ */
+class MapTools
+{
+	public:
+	
+		/**
+		 * @brief Get a vector of all keys in a map.
+		 *
+		 * @param myMap the map to check.
+		 * @return a vector of all keys.
+		 */
+		template <class Key, class T, class Cmp >
+		static std::vector<Key> getKeys(const std::map<Key, T, Cmp> & myMap)
+		{
+			std::vector<Key> keys;
+			for(typename std::map<Key, T>::const_iterator i = myMap.begin(); i != myMap.end(); i++)
+      {
+				keys.push_back(i->first);
+			}
+			return keys;
+		}
+		
+		/**
+		 * @brief Get a vector of all keys in a map.
+		 *
+		 * @param myMap the map to check.
+		 * @return a vector of all keys.
+		 */
+		template <class Key, class T >
+		static std::vector<Key> getKeys(const std::map<Key, T> & myMap)
+		{
+			std::vector<Key> keys;
+			for(typename std::map<Key, T>::const_iterator i = myMap.begin(); i != myMap.end(); i++)
+      {
+				keys.push_back(i->first);
+			}
+			return keys;
+		}
+		
+		/**
+		 * @brief Get a vector of all values in a map.
+		 *
+		 * @param myMap the map to check.
+		 * @return a vector of all values.
+		 */
+		template <class Key, class T, class Cmp >
+		static std::vector<T> getValues(const std::map<Key, T, Cmp> & myMap)
+		{
+			std::vector<T> values;
+			for(typename std::map<Key, T>::const_iterator i = myMap.begin(); i != myMap.end(); i++)
+      {
+				values.push_back(i->second);
+			}
+			return values;
+		}
+
+		/**
+		 * @brief Get a vector of all values in a map.
+		 *
+		 * @param myMap the map to check.
+		 * @return a vector of all values.
+		 */
+		template <class Key, class T >
+		static std::vector<T> getValues(const std::map<Key, T> & myMap)
+		{
+			std::vector<T> values;
+			for(typename std::map<Key, T>::const_iterator i = myMap.begin(); i != myMap.end(); i++)
+      {
+				values.push_back(i->second);
+			}
+			return values;
+		}
+
+};
+
+} //end of namespace bpp.
+
+#endif	//_MAPTOOLS_H_
+
diff --git a/src/Bpp/Seq/Alphabet/LetterAlphabet.cpp b/src/Bpp/Version.h
similarity index 83%
rename from src/Bpp/Seq/Alphabet/LetterAlphabet.cpp
rename to src/Bpp/Version.h
index 9fd385f..a1f5415 100644
--- a/src/Bpp/Seq/Alphabet/LetterAlphabet.cpp
+++ b/src/Bpp/Version.h
@@ -1,14 +1,14 @@
-// 
-// File:    LetterAlphabet.cpp
-// Author:  Sylvain Gaillard
-// Created: 11/09/2009 14:31:05
-// 
+//
+// File: Version.h
+// Created by: Julien Dutheil
+// Created on: Sun Apr 2 20:00 2017
+//
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (September 11, 2009)
+Copyright or © or Copr. Bio++ Development Team, (April 2, 2017)
 
-This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+This software is a computer program whose purpose is to provide utilitary
+classes. This file belongs to the Bio++ Project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,9 +37,10 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "LetterAlphabet.h"
+#ifndef _VERSION_H_
+#define _VERSION_H_
 
-using namespace bpp;
+#define BPP_VERSION 2.3.0
 
-const int LetterAlphabet::LETTER_UNDEF_VALUE = -99;
+#endif //_VERSION_H_
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index be64828..33aa38c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,245 +1,135 @@
-# CMake script for Bio++ Sequence Library
-# Author: Sylvain Gaillard and Julien Dutheil
-# Created: 20/08/2009
+# CMake script for Bio++ Core
+# Authors:
+#   Sylvain Gaillard
+#   Julien Dutheil
+#   Francois Gindraud (2017)
+# Created: 17/08/2009
 
 # File list
-SET(CPP_FILES
-  Bpp/Seq/DNAToRNA.cpp
-  Bpp/Seq/NucleicAcidsReplication.cpp
-  Bpp/Seq/Sequence.cpp
-  Bpp/Seq/SequenceWithAnnotation.cpp
-  Bpp/Seq/SequenceWithAnnotationTools.cpp
-  Bpp/Seq/SequenceWithQuality.cpp
-  Bpp/Seq/SequenceExceptions.cpp
-  Bpp/Seq/SequencePositionIterators.cpp
-  Bpp/Seq/SequenceTools.cpp
-  Bpp/Seq/SequenceWithQualityTools.cpp
-  Bpp/Seq/SequenceWalker.cpp
-  Bpp/Seq/Site.cpp
-  Bpp/Seq/SiteExceptions.cpp
-  Bpp/Seq/SiteTools.cpp
-  Bpp/Seq/StringSequenceTools.cpp
-  Bpp/Seq/SymbolList.cpp
-  Bpp/Seq/SymbolListTools.cpp
-  Bpp/Seq/Transliterator.cpp
-  Bpp/Seq/DistanceMatrix.cpp
-  Bpp/Seq/CodonSiteTools.cpp
-  Bpp/Seq/Alphabet/AbstractAlphabet.cpp
-  Bpp/Seq/Alphabet/LetterAlphabet.cpp
-  Bpp/Seq/Alphabet/AlphabetExceptions.cpp
-  Bpp/Seq/Alphabet/AlphabetTools.cpp
-  Bpp/Seq/Alphabet/CodonAlphabet.cpp
-  Bpp/Seq/Alphabet/DefaultAlphabet.cpp
-  Bpp/Seq/Alphabet/CaseMaskedAlphabet.cpp
-  Bpp/Seq/Alphabet/DNA.cpp
-  Bpp/Seq/Alphabet/ProteicAlphabet.cpp
-  Bpp/Seq/Alphabet/RNA.cpp
-  Bpp/Seq/Alphabet/WordAlphabet.cpp
-  Bpp/Seq/Alphabet/RNY.cpp
-  Bpp/Seq/Alphabet/BinaryAlphabet.cpp
-  Bpp/Seq/Alphabet/IntegerAlphabet.cpp
-  Bpp/Seq/Alphabet/NumericAlphabet.cpp
-  Bpp/Seq/GeneticCode/GeneticCode.cpp
-  Bpp/Seq/GeneticCode/StandardGeneticCode.cpp
-  Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.cpp
-  Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.cpp
-  Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.cpp
-  Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.cpp
-  Bpp/Seq/GeneticCode/AscidianMitochondrialGeneticCode.cpp
-  Bpp/Seq/GeneticCode/MoldMitochondrialGeneticCode.cpp
-  Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.cpp
-  Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.cpp
-  Bpp/Seq/AlphabetIndex/BLOSUM50.cpp
-  Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.cpp
-  Bpp/Seq/AlphabetIndex/AAIndex1Entry.cpp
-  Bpp/Seq/AlphabetIndex/AAIndex2Entry.cpp
-  Bpp/Seq/AlphabetIndex/SimpleScore.cpp
-  Bpp/Seq/AlphabetIndex/__GranthamMatrixCode
-  Bpp/Seq/AlphabetIndex/__MiyataMatrixCode
-  Bpp/Seq/AlphabetIndex/__BLOSUM50MatrixCode
-  Bpp/Seq/Container/AbstractSequenceContainer.cpp
-  Bpp/Seq/Container/AlignedSequenceContainer.cpp
-  Bpp/Seq/Container/MapSequenceContainer.cpp
-  Bpp/Seq/Container/SequenceContainerTools.cpp
-  Bpp/Seq/Container/SiteContainerExceptions.cpp
-  Bpp/Seq/Container/SiteContainerTools.cpp
-  Bpp/Seq/Container/VectorSequenceContainer.cpp
-  Bpp/Seq/Container/VectorSiteContainer.cpp
-  Bpp/Seq/Container/CompressedVectorSiteContainer.cpp
-  Bpp/Seq/Container/SiteContainerIterator.cpp
-  Bpp/Seq/Container/SequenceContainerIterator.cpp
-  Bpp/Seq/Io/Clustal.cpp
-  Bpp/Seq/Io/Dcse.cpp
-  Bpp/Seq/Io/Fasta.cpp
-  Bpp/Seq/Io/Mase.cpp
-  Bpp/Seq/Io/MaseTools.cpp
-  Bpp/Seq/Io/Phylip.cpp
-  Bpp/Seq/Io/IoSequenceFactory.cpp
-  Bpp/Seq/Io/GenBank.cpp
-  Bpp/Seq/Io/PhredPhd.cpp
-  Bpp/Seq/Io/PhredPoly.cpp
-  Bpp/Seq/Io/NexusIoSequence.cpp
-  Bpp/Seq/Io/NexusTools.cpp
-  Bpp/Seq/Io/Stockholm.cpp
-  Bpp/Seq/Io/StreamSequenceIterator.cpp
-  Bpp/Seq/Io/BppOSequenceReaderFormat.cpp
-  Bpp/Seq/Io/BppOSequenceWriterFormat.cpp
-  Bpp/Seq/Io/BppOAlignmentReaderFormat.cpp
-  Bpp/Seq/Io/BppOAlignmentWriterFormat.cpp
-  Bpp/Seq/Io/BppOSequenceStreamReaderFormat.cpp
-  Bpp/Seq/Io/BppOAlphabetIndex1Format.cpp
-  Bpp/Seq/Io/BppOAlphabetIndex2Format.cpp
-  Bpp/Seq/App/SequenceApplicationTools.cpp
-  )
-
-SET(H_FILES
-  Bpp/Seq/CodonSiteTools.h
-  Bpp/Seq/DNAToRNA.h
-  Bpp/Seq/NucleicAcidsReplication.h
-  Bpp/Seq/SequenceExceptions.h
-  Bpp/Seq/SequencePositionIterators.h
-  Bpp/Seq/Sequence.h
-  Bpp/Seq/SequenceIterator.h
-  Bpp/Seq/SequenceWithAnnotation.h
-  Bpp/Seq/SequenceWithAnnotationTools.h
-  Bpp/Seq/SequenceWithQuality.h
-  Bpp/Seq/SequenceTools.h
-  Bpp/Seq/SequenceWithQualityTools.h
-  Bpp/Seq/SequenceWalker.h
-  Bpp/Seq/SiteExceptions.h
-  Bpp/Seq/Site.h
-  Bpp/Seq/SiteIterator.h
-  Bpp/Seq/SiteTools.h
-  Bpp/Seq/StringSequenceTools.h
-  Bpp/Seq/SymbolList.h
-  Bpp/Seq/SymbolListTools.h
-  Bpp/Seq/Transliterator.h
-  Bpp/Seq/DistanceMatrix.h
-  Bpp/Seq/Alphabet/AbstractAlphabet.h
-  Bpp/Seq/Alphabet/AlphabetExceptions.h
-  Bpp/Seq/Alphabet/Alphabet.h
-  Bpp/Seq/Alphabet/AlphabetState.h
-  Bpp/Seq/Alphabet/AlphabetTools.h
-  Bpp/Seq/Alphabet/CodonAlphabet.h
-  Bpp/Seq/Alphabet/CaseMaskedAlphabet.h
-  Bpp/Seq/Alphabet/DefaultAlphabet.h
-  Bpp/Seq/Alphabet/DNA.h
-  Bpp/Seq/Alphabet/LetterAlphabet.h
-  Bpp/Seq/Alphabet/NucleicAlphabet.h
-  Bpp/Seq/Alphabet/NucleicAlphabetState.h
-  Bpp/Seq/Alphabet/ProteicAlphabet.h
-  Bpp/Seq/Alphabet/ProteicAlphabetState.h
-  Bpp/Seq/Alphabet/RNA.h
-  Bpp/Seq/Alphabet/WordAlphabet.h
-  Bpp/Seq/Alphabet/RNY.h
-  Bpp/Seq/Alphabet/BinaryAlphabet.h
-  Bpp/Seq/Alphabet/IntegerAlphabet.h
-  Bpp/Seq/Alphabet/AlphabetNumericState.h
-  Bpp/Seq/Alphabet/NumericAlphabet.h
-  Bpp/Seq/GeneticCode/GeneticCode.h
-  Bpp/Seq/GeneticCode/StandardGeneticCode.h
-  Bpp/Seq/GeneticCode/VertebrateMitochondrialGeneticCode.h
-  Bpp/Seq/GeneticCode/InvertebrateMitochondrialGeneticCode.h
-  Bpp/Seq/GeneticCode/EchinodermMitochondrialGeneticCode.h
-  Bpp/Seq/GeneticCode/YeastMitochondrialGeneticCode.h
-  Bpp/Seq/Io/AbstractISequence.h
-  Bpp/Seq/Io/AbstractIAlignment.h
-  Bpp/Seq/Io/AbstractOSequence.h
-  Bpp/Seq/Io/AbstractOAlignment.h
-  Bpp/Seq/Io/Clustal.h
-  Bpp/Seq/Io/Dcse.h
-  Bpp/Seq/Io/Fasta.h
-  Bpp/Seq/Io/IOSequence.h
-  Bpp/Seq/Io/ISequence.h
-  Bpp/Seq/Io/ISequenceStream.h
-  Bpp/Seq/Io/IoSequenceStream.h
-  Bpp/Seq/Io/Mase.h
-  Bpp/Seq/Io/MaseTools.h
-  Bpp/Seq/Io/OSequence.h
-  Bpp/Seq/Io/OSequenceStream.h
-  Bpp/Seq/Io/Phylip.h
-  Bpp/Seq/Io/GenBank.h
-  Bpp/Seq/Io/PhredPhd.h
-  Bpp/Seq/Io/PhredPoly.h
-  Bpp/Seq/Io/NexusIOSequence.h
-  Bpp/Seq/Io/NexusTools.h
-  Bpp/Seq/Io/Stockholm.h
-  Bpp/Seq/Io/IoSequenceFactory.h
-  Bpp/Seq/Io/SequenceFileIndex.h
-  Bpp/Seq/Io/StreamSequenceIterator.h
-  Bpp/Seq/Io/BppOSequenceReaderFormat.h
-  Bpp/Seq/Io/BppOSequenceWriterFormat.h
-  Bpp/Seq/Io/BppOAlignmentReaderFormat.h
-  Bpp/Seq/Io/BppOAlignmentWriterFormat.h
-  Bpp/Seq/Io/BppOSequenceStreamReaderFormat.h
-  Bpp/Seq/Io/BppOAlphabetIndex1Format.h
-  Bpp/Seq/Io/BppOAlphabetIndex2Format.h
-  Bpp/Seq/Container/VectorSequenceContainer.h
-  Bpp/Seq/Container/VectorSiteContainer.h
-  Bpp/Seq/Container/CompressedVectorSiteContainer.h
-  Bpp/Seq/Container/MapSequenceContainer.h
-  Bpp/Seq/Container/OrderedSequenceContainer.h
-  Bpp/Seq/Container/AbstractSequenceContainer.h
-  Bpp/Seq/Container/AlignedSequenceContainer.h 
-  Bpp/Seq/Container/SequenceContainerExceptions.h
-  Bpp/Seq/Container/SequenceContainer.h
-  Bpp/Seq/Container/SequenceContainerTools.h
-  Bpp/Seq/Container/SiteContainerExceptions.h
-  Bpp/Seq/Container/SiteContainer.h
-  Bpp/Seq/Container/SiteContainerTools.h
-  Bpp/Seq/Container/SiteContainerIterator.h
-  Bpp/Seq/AlphabetIndex/AlphabetIndex1.h
-  Bpp/Seq/AlphabetIndex/AlphabetIndex2.h
-  Bpp/Seq/AlphabetIndex/UserAlphabetIndex1.h
-  Bpp/Seq/AlphabetIndex/GranthamAAChemicalDistance.h
-  Bpp/Seq/AlphabetIndex/GranthamAAPolarityIndex.h
-  Bpp/Seq/AlphabetIndex/GranthamAAVolumeIndex.h
-  Bpp/Seq/AlphabetIndex/MiyataAAChemicalDistance.h
-  Bpp/Seq/AlphabetIndex/BLOSUM50.h
-  Bpp/Seq/AlphabetIndex/SimpleIndexDistance.h
-  Bpp/Seq/AlphabetIndex/DefaultNucleotideScore.h
-  Bpp/Seq/AlphabetIndex/AAIndex1Entry.h
-  Bpp/Seq/AlphabetIndex/AAIndex2Entry.h
-  Bpp/Seq/AlphabetIndex/KleinAANetChargeIndex.h
-  Bpp/Seq/AlphabetIndex/AAChargeIndex.h
-  Bpp/Seq/AlphabetIndex/SimpleScore.h
-  Bpp/Seq/AlphabetIndex/AAChouFasmanAHelixIndex.h
-  Bpp/Seq/AlphabetIndex/AAChouFasmanBSheetIndex.h
-  Bpp/Seq/AlphabetIndex/AAChouFasmanTurnIndex.h
-  Bpp/Seq/AlphabetIndex/AAVolumeIndex.h
-  Bpp/Seq/AlphabetIndex/AASurfaceIndex.h
-  Bpp/Seq/AlphabetIndex/AAMassIndex.h
-  Bpp/Seq/AlphabetIndex/AAChenGuHuangHydrophobicityIndex.h
-  Bpp/Seq/AlphabetIndex/AASEASup30Index.h
-  Bpp/Seq/AlphabetIndex/AASEAInf10Index.h
-  Bpp/Seq/AlphabetIndex/AASEA1030Index.h
-  Bpp/Seq/App/SequenceApplicationTools.h
+set (CPP_FILES
+  Bpp/App/ApplicationTools.cpp
+  Bpp/App/BppApplication.cpp
+  Bpp/App/NumCalcApplicationTools.cpp
+  Bpp/BppString.cpp
+  Bpp/Exceptions.cpp
+  Bpp/Graph/GlobalGraph.cpp
+  Bpp/Graphics/ColorTools.cpp
+  Bpp/Graphics/Fig/XFigGraphicDevice.cpp
+  Bpp/Graphics/Fig/XFigLaTeXFontManager.cpp
+  Bpp/Graphics/Fig/XFigPostscriptFontManager.cpp
+  Bpp/Graphics/Font/Font.cpp
+  Bpp/Graphics/GraphicDevice.cpp
+  Bpp/Graphics/Latex/DvipsColorSet.cpp
+  Bpp/Graphics/Latex/PgfGraphicDevice.cpp
+  Bpp/Graphics/Molscript/MolscriptColorSet.cpp
+  Bpp/Graphics/R/RColorSet.cpp
+  Bpp/Graphics/Svg/SvgGraphicDevice.cpp
+  Bpp/Io/BppODiscreteDistributionFormat.cpp
+  Bpp/Io/BppOParametrizableFormat.cpp
+  Bpp/Io/FileTools.cpp
+  Bpp/Io/IoDiscreteDistributionFactory.cpp
+  Bpp/Numeric/AbstractParameterAliasable.cpp
+  Bpp/Numeric/AbstractParametrizable.cpp
+  Bpp/Numeric/AdaptiveKernelDensityEstimation.cpp
+  Bpp/Numeric/AutoParameter.cpp
+  Bpp/Numeric/DataTable.cpp
+  Bpp/Numeric/Function/AbstractOptimizer.cpp
+  Bpp/Numeric/Function/BfgsMultiDimensions.cpp
+  Bpp/Numeric/Function/BrentOneDimension.cpp
+  Bpp/Numeric/Function/ConjugateGradientMultiDimensions.cpp
+  Bpp/Numeric/Function/DirectionFunction.cpp
+  Bpp/Numeric/Function/DownhillSimplexMethod.cpp
+  Bpp/Numeric/Function/FivePointsNumericalDerivative.cpp
+  Bpp/Numeric/Function/FunctionTools.cpp
+  Bpp/Numeric/Function/GoldenSectionSearch.cpp
+  Bpp/Numeric/Function/MetaOptimizer.cpp
+  Bpp/Numeric/Function/NewtonBacktrackOneDimension.cpp
+  Bpp/Numeric/Function/NewtonOneDimension.cpp
+  Bpp/Numeric/Function/OneDimensionOptimizationTools.cpp
+  Bpp/Numeric/Function/Operators/ComputationTree.cpp
+  Bpp/Numeric/Function/OptimizationStopCondition.cpp
+  Bpp/Numeric/Function/PowellMultiDimensions.cpp
+  Bpp/Numeric/Function/ReparametrizationFunctionWrapper.cpp
+  Bpp/Numeric/Function/SimpleMultiDimensions.cpp
+  Bpp/Numeric/Function/SimpleNewtonMultiDimensions.cpp
+  Bpp/Numeric/Function/ThreePointsNumericalDerivative.cpp
+  Bpp/Numeric/Function/TwoPointsNumericalDerivative.cpp
+  Bpp/Numeric/Hmm/AbstractHmmTransitionMatrix.cpp
+  Bpp/Numeric/Hmm/AutoCorrelationTransitionMatrix.cpp
+  Bpp/Numeric/Hmm/FullHmmTransitionMatrix.cpp
+  Bpp/Numeric/Hmm/HmmLikelihood.cpp
+  Bpp/Numeric/Hmm/LogsumHmmLikelihood.cpp
+  Bpp/Numeric/Hmm/LowMemoryRescaledHmmLikelihood.cpp
+  Bpp/Numeric/Hmm/RescaledHmmLikelihood.cpp
+  Bpp/Numeric/NumTools.cpp
+  Bpp/Numeric/Parameter.cpp
+  Bpp/Numeric/ParameterExceptions.cpp
+  Bpp/Numeric/ParameterList.cpp
+  Bpp/Numeric/Prob/AbstractDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/BetaDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/ConstantDistribution.cpp
+  Bpp/Numeric/Prob/DirichletDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/ExponentialDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/GammaDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/GaussianDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/InvariantMixedDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/MixtureOfDiscreteDistributions.cpp
+  Bpp/Numeric/Prob/SimpleDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/Simplex.cpp
+  Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.cpp
+  Bpp/Numeric/Prob/UniformDiscreteDistribution.cpp
+  Bpp/Numeric/Random/ContingencyTableGenerator.cpp
+  Bpp/Numeric/Random/RandomTools.cpp
+  Bpp/Numeric/Random/Uniform01K.cpp
+  Bpp/Numeric/Random/Uniform01QD.cpp
+  Bpp/Numeric/Random/Uniform01WH.cpp
+  Bpp/Numeric/Stat/ContingencyTableTest.cpp
+  Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.cpp 
+  Bpp/Numeric/Stat/Mva/DualityDiagram.cpp 
+  Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.cpp 
+  Bpp/Numeric/Stat/StatTools.cpp
+  Bpp/Numeric/VectorTools.cpp
+  Bpp/Text/KeyvalTools.cpp
+  Bpp/Text/NestedStringTokenizer.cpp
+  Bpp/Text/StringTokenizer.cpp
+  Bpp/Text/TextTools.cpp
+  Bpp/Utils/AttributesTools.cpp
   )
 
 # Build the static lib
-ADD_LIBRARY(bppseq-static STATIC ${CPP_FILES})
-SET_TARGET_PROPERTIES(bppseq-static
-  PROPERTIES OUTPUT_NAME bpp-seq
-  CLEAN_DIRECT_OUTPUT 1
+add_library (${PROJECT_NAME}-static STATIC ${CPP_FILES})
+target_include_directories (${PROJECT_NAME}-static PUBLIC
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>
   )
-TARGET_LINK_LIBRARIES(bppseq-static ${LIBS})
+set_target_properties (${PROJECT_NAME}-static PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
+target_link_libraries (${PROJECT_NAME}-static ${BPP_LIBS_STATIC})
 
 # Build the shared lib
-ADD_LIBRARY(bppseq-shared SHARED ${CPP_FILES})
-SET_TARGET_PROPERTIES(bppseq-shared
-  PROPERTIES OUTPUT_NAME bpp-seq
-  CLEAN_DIRECT_OUTPUT 1
-  VERSION ${BPPSEQ_VERSION}
-  SOVERSION ${BPPSEQ_VERSION_MAJOR}
+add_library (${PROJECT_NAME}-shared SHARED ${CPP_FILES})
+target_include_directories (${PROJECT_NAME}-shared PUBLIC
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>
   )
-TARGET_LINK_LIBRARIES(bppseq-shared ${LIBS})
-
-# Install libs
-INSTALL(TARGETS bppseq-static bppseq-shared DESTINATION lib${LIB_SUFFIX})
-
-# Install headers
-INSTALL(DIRECTORY Bpp/ DESTINATION include/Bpp FILES_MATCHING PATTERN "*.h")
-
-# Generate generic include files (.all)
-INSTALL(CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_SOURCE_DIR}/genIncludes.sh ${CMAKE_PREFIX_PATH}/include/Bpp)")
+set_target_properties (${PROJECT_NAME}-shared
+  PROPERTIES OUTPUT_NAME ${PROJECT_NAME}
+  MACOSX_RPATH 1
+  VERSION ${${PROJECT_NAME}_VERSION}
+  SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}
+  )
+target_link_libraries (${PROJECT_NAME}-shared ${BPP_LIBS_SHARED})
 
+# Install libs and headers
+install (
+  TARGETS ${PROJECT_NAME}-static ${PROJECT_NAME}-shared
+  EXPORT ${PROJECT_NAME}-targets
+  LIBRARY DESTINATION lib${LIB_SUFFIX}
+  ARCHIVE DESTINATION lib${LIB_SUFFIX}
+  )
+install (
+  DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bpp
+  DESTINATION include
+  FILES_MATCHING PATTERN "*.h"
+  )
+# Install cmake file representing targets
+install (EXPORT ${PROJECT_NAME}-targets DESTINATION ${cmake-package-location})
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 57a9c55..7086962 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,66 +1,24 @@
-# CMake script for bpp-seq unit tests
-# Author: Julien Dutheil
-# Created: 30/10/2010
-
-MACRO(TEST_FIND_LIBRARY OUTPUT_LIBS lib_name include_to_find)
-  #start:
-  FIND_PATH(${lib_name}_INCLUDE_DIR ${include_to_find})
-
-  SET(${lib_name}_NAMES ${lib_name} ${lib_name}.lib ${lib_name}.dll)
-  FIND_LIBRARY(${lib_name}_LIBRARY NAMES ${${lib_name}_NAMES})
-  IF(${lib_name}_LIBRARY)
-    MESSAGE("-- Library ${lib_name} found here:")
-    MESSAGE("   includes: ${${lib_name}_INCLUDE_DIR}")
-    MESSAGE("   dynamic libraries: ${${lib_name}_LIBRARY}")
-    MESSAGE(WARNING "Library ${lib_name} is already installed in the system tree. Test will be built against it. This may lead to unexpected results. You may want to do 'make install' before 'make test', or remove the installed version.")
-  ELSE()
-    SET(${lib_name}_LIBRARY "-L../src -lbpp-seq")
-    SET(${lib_name}_INCLUDE_DIR "../src/")
-  ENDIF()
-  INCLUDE_DIRECTORIES(${${lib_name}_INCLUDE_DIR})
-  SET(${OUTPUT_LIBS} ${${OUTPUT_LIBS}} ${${lib_name}_LIBRARY})
-ENDMACRO(TEST_FIND_LIBRARY)
-
-#Find the bpp-seq library library:
-TEST_FIND_LIBRARY(LIBS bpp-seq Bpp/Seq/Alphabet/Alphabet.h)
-
-ADD_EXECUTABLE(test_alphabets test_alphabets.cpp)
-TARGET_LINK_LIBRARIES(test_alphabets ${LIBS})
-ADD_TEST(test_alphabets "test_alphabets")
-
-ADD_EXECUTABLE(test_sequences test_sequences.cpp)
-TARGET_LINK_LIBRARIES(test_sequences ${LIBS})
-ADD_TEST(test_sequences "test_sequences")
-
-ADD_EXECUTABLE(test_io test_io.cpp)
-TARGET_LINK_LIBRARIES(test_io ${LIBS})
-ADD_TEST(test_io "test_io")
-
-ADD_EXECUTABLE(test_containers test_containers.cpp)
-TARGET_LINK_LIBRARIES(test_containers ${LIBS})
-ADD_TEST(test_containers "test_containers")
-
-ADD_EXECUTABLE(test_alignment_scores test_alignment_scores.cpp)
-TARGET_LINK_LIBRARIES(test_alignment_scores ${LIBS})
-ADD_TEST(test_alignment_scores "test_alignment_scores")
-
-ADD_EXECUTABLE(test_walker test_walker.cpp)
-TARGET_LINK_LIBRARIES(test_walker ${LIBS})
-ADD_TEST(test_walker "test_walker")
-
-ADD_EXECUTABLE(test_bowker test_bowker.cpp)
-TARGET_LINK_LIBRARIES(test_bowker ${LIBS})
-ADD_TEST(test_bowker "test_bowker")
-
-IF(UNIX)
-  SET_PROPERTY(TEST test_alphabets test_sequences test_io test_containers test_alignment_scores test_walker test_bowker PROPERTY ENVIRONMENT "LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:../src")
-ENDIF()
-
-IF(APPLE)
-  SET_PROPERTY(TEST test_alphabets test_sequences test_io test_containers test_alignment_scores test_walker test_bowker PROPERTY ENVIRONMENT "DYLD_LIBRARY_PATH=$ENV{DYLD_LIBRARY_PATH}:../src")
-ENDIF()
-
-IF(WIN32)
-  SET(ENV{PATH} "$ENV{PATH};..\\src")
-ENDIF()
-
+# CMake script for bpp-core unit tests
+# Authors:
+#   Julien Dutheil
+#   Francois Gindraud (2017)
+# Created: 27/10/2010
+
+# Add all tests.
+# Any .cpp file in test/ is considered to be a test.
+# It will be compiled as a standalone program (must contain a main()).
+# A test is considered to succeed if it returns EXIT_SUCCESS (usually 0).
+# Tests are linked to the the shared library target.
+
+file (GLOB test_cpp_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
+foreach (test_cpp_file ${test_cpp_files})
+  # Add each test (named as the filename without extension)
+  get_filename_component (test_name ${test_cpp_file} NAME_WE)
+  add_executable (${test_name} ${test_cpp_file})
+  target_link_libraries (${test_name} ${PROJECT_NAME}-shared)
+  add_test (
+    NAME ${test_name}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    COMMAND ${test_name}
+    )
+endforeach (test_cpp_file)
diff --git a/test/PolynomialFunction.h b/test/PolynomialFunction.h
new file mode 100644
index 0000000..7030015
--- /dev/null
+++ b/test/PolynomialFunction.h
@@ -0,0 +1,127 @@
+//
+// File: PolynomialFunction.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Oct 27 18:46 2010
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Numeric/Function/Functions.h>
+#include <Bpp/Numeric/AbstractParametrizable.h>
+
+#include <map>
+#include <string>
+
+using namespace bpp;
+using namespace std;
+
+class PolynomialFunction1:
+  public virtual Function,
+  public AbstractParametrizable
+{
+  private:
+    double fval_;
+ 
+  public:
+    PolynomialFunction1() : AbstractParametrizable(""), fval_(0) {
+      //We declare parameters here:
+      addParameter_(new Parameter("x", 0));
+      addParameter_(new Parameter("y", 0));
+      addParameter_(new Parameter("z", 0));
+      fireParameterChanged(getParameters());
+    }
+ 
+    PolynomialFunction1* clone() const { return new PolynomialFunction1(*this); }
+ 
+  public:
+    void setParameters(const ParameterList& pl) 
+        throw (ParameterNotFoundException, ConstraintException, Exception)
+    {
+      matchParametersValues(pl);
+    }
+    double getValue() const throw (Exception) { return fval_; }
+ 
+    void fireParameterChanged(const ParameterList& pl) {
+      double x = getParameterValue("x");
+      double y = getParameterValue("y");
+      double z = getParameterValue("z");
+      fval_ = (x-5)*(x-5) + (y+2)*(y+2) + (z-3)*(z-3);
+    }
+};
+
+class PolynomialFunction1Der1:
+  public PolynomialFunction1,
+  public virtual DerivableFirstOrder
+{
+  protected:
+    bool compFirstDer_;
+    mutable map<string, double> firstDer_;
+
+  public:
+    PolynomialFunction1Der1(): compFirstDer_(true), firstDer_() {
+      //Need to compute derivatives:
+      fireParameterChanged(getParameters());
+    }
+ 
+    PolynomialFunction1Der1* clone() const { return new PolynomialFunction1Der1(*this); }
+ 
+  public:
+    void setParameters(const ParameterList& pl) 
+        throw (ParameterNotFoundException, ConstraintException, Exception)
+    {
+      matchParametersValues(pl);
+    }
+ 
+    void fireParameterChanged(const ParameterList& pl) {
+      PolynomialFunction1::fireParameterChanged(pl);
+      if (compFirstDer_) {
+        double x = getParameterValue("x");
+        double y = getParameterValue("y");
+        double z = getParameterValue("z");
+        firstDer_["x"] = 2 * (x - 5);
+        firstDer_["y"] = 2 * (y + 2);
+        firstDer_["z"] = 2 * (z - 3);
+      }
+    }
+
+    void enableFirstOrderDerivatives(bool yn) { compFirstDer_ = yn; }
+    bool enableFirstOrderDerivatives() const { return compFirstDer_; }
+
+    double getFirstOrderDerivative(const std::string& variable) const throw (Exception) {
+      if (!compFirstDer_)
+        throw Exception("PolynomialFunction1Der1::getFirstOrderDerivative. First order derivatives are not computed.");
+      return firstDer_[variable];
+    }
+};
+
diff --git a/test/example.aln b/test/example.aln
deleted file mode 100644
index 577476e..0000000
--- a/test/example.aln
+++ /dev/null
@@ -1,2143 +0,0 @@
-CLUSTAL W (1.8) multiple sequence alignment
-
-
-t73             LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPYSGNGTQVRNDVEDA
-t66             LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPCSGNGTQVRNDVEDA
-t32             LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPYSGNGTQVRNDVEDA
-t75             LIVSEIRVMVRDE--VHKAMDEE-C------------LIARRVKPYSGNGNQIRNDIEDA
-t79             LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQNQVRNAVEDA
-t27             LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTMSGSQNQVRNAVEDA
-t93             LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTMSGSQNQVRNAVEDA
-t59             LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQNQVRNAVEDA
-t7              LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKKFSGSQGQVRNAIEDA
-t78             LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQGQVRNAIEDA
-t12             LIVSEVRVMVRDG--INIAIDEL-C------------LIANRVKAFSGHQNQVRNAMEDA
-t81             LIVSEVRHMVRDG--ANVAIDEL-C------------LIACRVKAFSGHGHQVRNAVEDA
-t21             LIVSEVRHMVRDG--ANIAIDEL-C------------LIACRVKAFSGHGNQVRNAVEDA
-t80             LIVSEVRHMVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMA
-t14             LIVSEVRHMVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMA
-t85             LIVSEVRHVVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMA
-t62             LIVSEVRVMVRDG--IHIAVDEI-C------------LIANRVKCMSGQGNQARNAMEMA
-t19             LIVSEVRHMVRDG--INIAVDEI-C------------LIANRVKCVSGQGNQARNAMEMA
-t77             LIVSEVRHMVRDG--INIAVDEI-C------------LIANRVKSMSGQGNQARNAMEMA
-t88             LIVSECRLIIRDG--NHDAIDEM-CCVANDLNNEIERLVASMVKSFRGHDSQARNNSECM
-t37             LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t35             LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t48             LIVSDMRLIIREG--SDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t55             LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t46             LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t67             LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t57             LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECI
-t56             LIVSEWRLFIRDG--HDDAIDEM-CCEANELNNDIEKLVASMVKGFRGHDSQARNNAECI
-t13             GIVSECRMIIRDE--HDDAIDEM-C------------LVASMVKKLSGCENQARNNHECA
-t5              GIVSECRMIIRDE--HDDAIDEM-C------------LVASMVKKLSGCENQARNNHECA
-t38             GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECA
-t33             GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECA
-t100            GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECA
-t34             GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECA
-t84             GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCDDQARNNHECA
-t92             GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECA
-t3              GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEQQARNNRECA
-t22             GIVSECRVIIRDQ--SDDAIDER-Y------------LVASVVKRLSGCENQARNNRECA
-t64             GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECA
-t18             GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECA
-t68             GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECA
-t28             GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECA
-t82             GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECA
-t41             GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECA
-t71             GIVSECRMIIRDQ--SDDAIDEMVV------------LVASMVKEMSGCENQARNNSECA
-t94             GIVSECRMIIRDQ--SDDAIDEMVC------------LVASMVKELSGCENQARNNRECA
-t99             GIVSEVRMIIRDE--SDDAIDEM-C------------LVASMVKALSGCENQARNNRECA
-t40             GIVSECRMIIRDE--SDDAIDEV-C------------LVASMVKALSGCENQARNNRECA
-t90             GIVSECRMIIRDE--SDDAIDEV-C------------LVASMVKALSGCENQARNNRECA
-t4              GIVSECRMIIRDE--PDDAIDEV-C------------LVASMVKELSGCENQARNNRECA
-t36             MIWSEVRKMVRER--REQAIDNK-C------------LIAARVKMMSGYVLQVRNALEDA
-t87             MIWSEVRKMVRER--REQAIDNK-C------------LIAARVKMMSGYMLQVRNALEDA
-t89             MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDA
-t39             MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDA
-t8              MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDA
-t6              MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDA
-t58             MIWSEYRHMVREG--RDQAIDNK-C------------LIAARVKVMSGYVLQVRNAPEDA
-t54             MIWSEYRHMVREG--RDQAIDNK-C------------LIAARVKVMSGYVLQVRNAPEDA
-t65             MIWSEYRQMVREG--NDQSIDNK-C------------LIADRVKMMSGVVRQVRNAPEDA
-t29             MIWSEYRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t98             MIWSEHRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t83             MIWSEYRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t95             MIWSEYRQMVREG--TDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t20             MIWSEYRQMVREG--TDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t69             MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t2              MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t10             MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t31             MIWSEYRSMVREG--ADQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t15             MIWSEYRSMVREG--SDQSIDNH-C------------LIAARVKMMSGVVRQVRNAPEDA
-t63             MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKLMSGVVRQVRNAPEDA
-t50             MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKLMSGVVRQVRNAPEDA
-t25             MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKMMSGVVRQVRNAPEDA
-t51             MIWSEYRSMVREG--SDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDA
-t9              MIWSECRQMVREK--TDNAIDNQ-C------------LIAARVKENSGHVKQVRNDSEDI
-t47             MIWSECRQMVREK--SDNAIDNQ-C------------QIAARVKRNSGHVKQVRNDSEDI
-t60             MIWSECRQMVREK--TDNAIDNQ-C------------QIAARVKENSGHVKQVRNDSEDI
-t30             MIWSECRQMVREK--TDNAIDNQ-C------------QIAARVKENSGHVKQVRNDSEDI
-t70             MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKEDSGHVKQVRNASEDI
-t91             MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKEDSGHVKQVRNASEDI
-t49             MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKENSGHVKQVRNASEDI
-t52             MIWSEERQMVREK--VDNAVDNQ-C------------LIAARVKENCGHVKQVRNASEDI
-t43             MIWSEVRQMVREG--SDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDA
-t1              MIWSEVRQMMREG--TDNAIDNQ-C------------LIAARVKHMQGHVKQVRNANEDA
-t86             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKPVQGHVKQVRNANEDA
-t72             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDA
-t96             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDA
-t44             MIWSEVRQMVREG--TDNAIDTR-C------------LIAARVKHMQGHVKQVRNANEDA
-t45             MIWSEVRQMVREG--TDNAIDNC-C------------LIAARVKHMQGHVKQVRNANEDA
-t74             MIWSEVRQMVREG--TDNAIDNC-C------------LIAARVKHMQGHVKQVRNANEDA
-t26             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHVKQVRNANEDA
-t61             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHVKQVRNANEDA
-t97             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHMKQVRNANEDA
-t17             MIWSEVRQMVREG--ADNAIDNR-C------------LIAARVKHFSGHTKQVRNANEDA
-t11             MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHFSGHTKQVRNANEDA
-t23             MIWSECQRMLREH--EDQAIANE-C------------LIAFKVKLVNGHVKQVRNASEDA
-t76             LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGG
-t53             LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGG
-t16             LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGG
-t42             LSSSHEMRVVHHKSKPDEEIADQ-D------------LCAEEMCKGSGHTGRIHSAVEGG
-t24             QSSSHEMRVVHHKSKPDEEITDQ-D------------LCAEEMCKGSGHTGRIHSAVEGG
-                
-
-t73             N--CQEFVGI---RELGKH-YK-CMDGFHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR
-t66             N--CQEFVGI---RELGKH-YK-CMDGFHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR
-t32             N--CQEFVGI---RELGKH-YK-CMDGFHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR
-t75             N--GQEFVGI---RELGKH-YD-CMDGYHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR
-t79             A--RPDFVGT---RELGKQ-YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW
-t27             A--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW
-t93             A--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW
-t59             A--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-SESAVVIFDVWMCQLPHGMQW
-t7              A--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW
-t78             A--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW
-t12             Q--RPDFVGI---RELGKQ-YQ-CMDGHGAVDTGAGRN-SESAVWIFDIWMCKLAHGMQW
-t81             A--RPDFIGI---RELGKP-Y--CMDGHGAVNTGAGHN-SESAVWIFDIWMYKLSHGMQW
-t21             P--RPDFIGV---RELGKP-Y--CMDGHGAVNTGAGVN-SESAVWIFDIWMYKLSHGMQW
-t80             A--RQNFVGM---RELEKV-YE-CMDGQGAVNTEAGNN-SESAVWIFDIWMCKLTHGMQD
-t14             A--RQNFVGM---RELEKV-YQ-CMDGQGAVNTEAGNN-SESAVWIFDIWMCKLTHGMQD
-t85             A--RQNFVGM---RELDKA-YQ-CMDGQKAVNTEAGNN-SESAVWIFDICMCKLTHGMQD
-t62             A--RQNFVGM---RELGKQ-YQ-CMDGQGAVNTEAGNN-SESAVWIFDIWMCRLTHGMQD
-t19             A--RQNFVGM---RELGKQ-YQ-CMDGQGAVNTEAGNN-SESAVWIFDIWMCRLTHGMQD
-t77             A--RQNFVGM---RELGKQ-YH-CMDGQGTVNTEAGNN-SESAVWIFDIWLCRLTHGMQD
-t88             R--SAPFIGV---RELFKR-YHKCVEGAGCVHTVAGTP-SDSPVWMFDQFMCQLTHSMVD
-t37             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t35             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t48             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t55             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t46             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t67             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t57             T--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN
-t56             I--AAPFIGV---RELFKR-YIKCVEGAGCVYTVA-AP-SESPVWMFDKFMCHLTHSMVV
-t13             I--PPPFHGV---REMFKRVYE-CMEGIGCVNTVAGNP-SESSAWMFDKVMYQLTHSMVW
-t5              I--PPPFHGV---REMFKRVYE-CMEGIGCVNTVAGNP-SESSAWMFDKVMYQLTHSMVW
-t38             I--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW
-t33             I--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW
-t100            I--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW
-t34             I--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW
-t84             I--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW
-t92             I--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW
-t3              T--SIPFLGV---RELWKR-YE-CMEGIGCVNTVAGKP-SQSSVWMFDRFMYKLTHSMVW
-t22             I--SIPFLGV---RELWKR-YE-CMEGIGCVNTVAGTP-SESSVWMFDRFMYKLTHSMVW
-t64             IT-SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW
-t18             IT-SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW
-t68             I--SPPFIGV---RELFKR-YG-CVEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW
-t28             I--SPPFIGV---RELFKR-YH-CMEGIGCVNTVAGMP-SESSVWMFDQFMYKLTHSMIW
-t82             I--SPPFIGL---RELFKR-YV-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW
-t41             I--SPPFIGL---RELFKR-YV-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW
-t71             I--SPQFIGV---RELFKR-YR-CMEGIGCVNTVAGAP-SESSVWMFDRFMYKLTHSMVW
-t94             I--SPPFTGV---RELFKR-YR-CMEGIGCVNTVAGIP-SESSVWMFDRFMYRLTHSMVW
-t99             I--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGIP-SESSIWMFDRFMYKLTHSMVW
-t40             I--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGIP-SESSVWMFDRFMYKLTHSMVW
-t90             I--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGIP-SESSVWMFDRFMYKLTHSMVW
-t4              I--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW
-t36             L--YVFFTGTKGTRELVKY-YM-CMEGHGCVNTMAKKS-SQSGIWKFNAFMC-LMHLMEG
-t87             L--YVFFTGNKGTRELVKY-YM-CMEGHGCVNTMAKKS-SQSGIWKFNAFMC-LMHLMEG
-t89             L--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG
-t39             L--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG
-t8              L--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG
-t6              L--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG
-t58             L--YNFFTGHKGTRELVKY-YM-CMEGEGCVNTMAKKS-SQSGIWKFNAFMC-LMHLMQG
-t54             L--YNFFTGHKGTRELVKY-YM-CMEGEGCVHTMAKKS-SQSGIWKFNAFMC-LMHLMQG
-t65             L--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQS
-t29             L--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQS
-t98             L--YNFFTGQKGTKELVKF-YF-CMEGCGCVNTMAKKS-SQSAPWKFNRFMC-LMHLMQS
-t83             L--YNFFTGQKGTKELIKF-YF-CMEGCGTVNTMAKDS-SQSAPWKFNRFMC-LMHLMQS
-t95             L--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQL
-t20             L--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQL
-t69             L--YNFFTGHKGTRELVKY-YH-CMEGCGCVNTMAKSS-SQSAPWKFNRFMC-LMHLMQE
-t2              L--YNFFTGQKGTRELVKY-YH-CMEGCGCVNTMAKSS-SQSAPWKFNRFMC-LMYLMQD
-t10             L--YNFFTGQKGTRELVKY-YH-CMEGCGCVNTMAKSS-SQSAPWKFNRFMC-LMYLMQD
-t31             L--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKQS-SQSAPWKFNRFMC-LMHLMQN
-t15             L--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQN
-t63             L--YTFFTGQKGKRELIKY-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQD
-t50             L--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-SQSAPWKFNHFMC-LMHLMQN
-t25             L--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQN
-t51             L--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQN
-t9              L--YNHFTGKKGARELIKR-YV-CMEGHDCVNTVANVS-SQSAIWKFDRFMCDLMHLMQN
-t47             L-CYHHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-SQSAVWNFDRFMCDLMHLMQN
-t60             L-CYHHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-SQSAVWNFDRFMCDLMHLMQN
-t30             L-CYHHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-SQSAVWNFDRFMCDLMHLMQN
-t70             M--YNHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-SQSAVWKFDRFMCDLMHLMQD
-t91             M--YNHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-SQSAVWKFDRFMCDLMHLMQD
-t49             M--YNHFTGNKGACELIKG-YV-CMEGHDCVNTMANIS-SQSAVWKFDRFMCDLMHLMQD
-t52             L--YNHFTGKKGARELIKR-YI-CMEGHDCVNTMAHDS-SQSATWKFDRFMCDLMHLMQG
-t43             L--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCALMHLMQK
-t1              L--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCCLMHLMQN
-t86             L--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCALMHLMQN
-t72             L--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKVS-SQSAVWKFDRFMCALMHLMQN
-t96             L--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCALMHLMQV
-t44             L--YQNFSGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCDLMHLMQN
-t45             L--YQNFTGQKGAREKIKR-YK-CMEGHDCVNTMAKSS-SQSAVWKFDRFMCDLMHLMQN
-t74             L--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCDLMHLMQN
-t26             L--YQNFTGKKGAREKIKR-YL-CMEGHECVVTMAKNS-SISAMWKFDRFMCDLMHLMQN
-t61             L--YQNFTGQKGAREKIKR-YL-CMEGHECVNTMAKNS-SVSAVWKFDQFMCDLMHLMQN
-t97             L--YQNFTGQKGAREKIKR-YL-CMEGHECVNTMAKNS-SVSAVWKFDRFMCDLMHLMQN
-t17             L--YQNFTGQKGAREKIKR-YL-CMEGQDCVNTMAKSS-SQSAVWKFDRFMCDLVHLMQN
-t11             L--YQNFTGQKGAREKIKR-YL-CMEGQDCVNTMAKSS-SQSAVWKFDRFMCDLVHLMQN
-t23             H--YTFFAGEKGARELIKR-YS-CMEGDGCVNTMAEGR-SESAVWKFDPFMCQLTHSMQS
-t76             I--VTNFHGF---AEMPKN-HD-VMEEQGGPGTCLAPQQSADTSWPFVMFTVDLAHRCRG
-t53             I--VTNFHGF---AEMPKN-YD-VMEEQGGPGTCLAPQQSADTSWPFVMFTVDLAHRCRG
-t16             I--VTNFHGF---AEMPKN-YD-VMEEQGGPGTCLAPQQSADTSWPFVMFTVDLAHRCRG
-t42             I--WTNFHGF---AEMPKN-YD-VMEEQGGPGTCIAPRQSADTSWPFMVFTVDLAHRCRG
-t24             I--WTNFHGF---AEMPKN-YD-VMEEQGGPGTCVAPRQSADTNWPFMVFPVELAHRCRG
-                
-
-t73             --------GDIGRVKRDVQKFPKLKEGAPNCSSFVKPYFMGCDMFHKQVEYRGTHGLVLD
-t66             --------GDIGRVKRDVQKFPKLKEGAPNCSSFVKPYFMGCDMFHKQVEYRGTHGLVLD
-t32             --------GDIGRVKQDVQKFPKLKEGAPNCSSFVKPYFMGCDMFHKQVEYRGTHGLVLD
-t75             --------GDIGRVQQDVHKFPKLKEGAPNCSSFVKPVFMGCDMFHRQVQNRGNHGLVLD
-t79             --------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGVDMFHREVILKGAKGLVLP
-t27             --------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLP
-t93             --------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLP
-t59             --------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLP
-t7              --------GDIGRVVVDHPKFLKLEEGAPNCSSMPMPYFLGCDMFHREVILKGAKGLVLP
-t78             --------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLP
-t12             --------GDIGRVSVDHPKFLKLEEGAPRCSSCPMPYFLGCEMFHRQVILKGAKGLVLP
-t81             --------GDIGRVGVDHPKFLKLEEGAPNCSSLPMPYFLGVDMFHRQVTIKGAKGLVLP
-t21             --------GDIGRVDVDHPKFLKLEEGAPNCSSLPMPYFLGVDMFHKQVTLKGAKGLVLP
-t80             FGD-----GDIGRVVVDHPKFEKLEEGAPNCSSHPVPYFLGIDMFHKQVMAKGSKGLILP
-t14             FGD-----GDIGRVVCDHPKFEKLEEGAPNCSSHPMPYFLGVDMFHEQVMAKGSKGLILP
-t85             --------GDIGRVVCDHPKFEKLEEGAPNCSSIPMPYFLGIDMFHKQVMAKGSKGLILP
-t62             --------GDIGRVECDHPKFAKLEEGAPNCSSLPMPYFLGIDMFHNQVMAKGSKGLILP
-t19             --------GDIGRVECDHPKFAKLEEGAPNCSSLPMPYFLGIDMFHKQVMGKGSKGLILP
-t77             --------GDIGRVECDHPKFAKLEEGAPNCSSLPMPYFLGIDMFHRQVMAKGSKGLILP
-t88             --------GDLGRVVQDNVIFAKLKEGAPHCISL--PHFLGIDMFHTQVFVGGH--LILP
-t37             --------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILP
-t35             --------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILP
-t48             --------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILP
-t55             --------GDLGRVVHDNWTFTKLKEGAPHCIAI--PYFMGIDMFHIQVFVGGN--LILP
-t46             --------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILP
-t67             --------GDLGRVVMDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFLGGD--LILP
-t57             --------GDLGRVVMDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFIGGD--LILP
-t56             --------GDLGRVLRDNTTFAKLKEGAPVCISL--PYFLGMDMFHQQVFMGGN--LILP
-t13             --------GDLRRVVHDNVTFSKLKEGAPHCISH--PYFLGIDMFHIQVYSKGF--LTLP
-t5              --------GDLRRVVHDNVTFSKLKEGAPHCISH--PYFLGIDMFHIQVYSKGF--LTLP
-t38             --------GDLGRVYYDNITFSKLKEGAPHCISQ--PFFLGIDMFHIQVYFKGS--LTLP
-t33             --------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLP
-t100            --------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLP
-t34             --------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLP
-t84             --------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLP
-t92             --------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLP
-t3              --------GDLGRVYWDNLTFQKLKEGAPHCIAV--PNYLNIDMFHIQVFYKGP--LTLP
-t22             --------GDLGRVYVDNQTFSKLKEGAPHCISA--PYYLNIDMFHIQVFYKGS--LTLP
-t64             --------GDLRRVFPDNATFSKLKEGAPHVISH--PYFLGIDMFHDQVVYRGP--LTLP
-t18             --------GDLRRVFPDNATFSKLKEGAPHVISH--PYFLGIDMFHEQVVYRGP--LTLP
-t68             --------GDLRRVFPDNAHFSKLKEGAPHVISH--PYFLGIDMFHDQVVYRGP--LTLP
-t28             --------GDLGRVFPDNATFSKLKEGAPHVISH--PYFLGIDMFHAQVFYRGS--LTLP
-t82             --------GDLGRVFPDNCTFSKLKEGAPHVISH--PYFLGIDMFHGQVVYRGS--LTLP
-t41             --------GDLGRVFPDNCTFSKLKEGAPHVISH--PYFLGIDMFHGQVVYRGS--LTLP
-t71             --------GDLARVFHDNGTFAKLKEGAPHVISV--PYFLGIDMFHGQVFLRGS--LTLP
-t94             --------GDLGRVFQDNATFSKLKEGAPHVISH--PYFLGIDMFHGQVFYRGS--LTLP
-t99             --------GDLGQVFPDVSTFSKLKEGAPHVISQ--PYFLGIDMFHDQVFYRGS--LTLP
-t40             --------GDLGRVYPDNPTFSKLKEGAPHVISH--PYFLGIDMFHDQVFYRGS--LTLP
-t90             --------GDLGRVYPDNPTFSKLKEGAPHVISH--PYFLGIDMFHDQVFYRGS--LTLP
-t4              --------GDLGRVFPDNATFSKLKEGAPHVISV--PYFLGIDMFHDQVFYRGS--LTLP
-t36             --------GDL--------------------CSY--PSFLGMCMFHAMVQSKGD--LVLP
-t87             --------GDL--------------------CSY--PSFLGMCMFHAMVQSKGD--LVLP
-t89             --------GDL--------------------CSY--PSFLGMCMFYAMVQSKGD--LVLP
-t39             --------GDL--------------------CSY--PSFLGMCMFYAMVQSKGD--LVLP
-t8              --------GDL--------------------CSY--PSFLGMCMFYAMVQSKGD--LVLP
-t6              --------GDL--------------------CSH--PSFLGMCMFYAMVQSKGD--LVLP
-t58             --------GDL--------------------CSH--PSFLGMCMFHAMVKSKGN--LVLP
-t54             --------GDL--------------------CSH--PSFLGMCMFHAMVQSKGN--LVLP
-t65             --------GDL--------------------CNS--PSFLGMCMFHPQVQAKGE--LVLP
-t29             --------GDL--------------------CNC--PSFLGMCMFHPQVQAKGE--LVLP
-t98             --------GDL--------------------CNS--PPFLGMCMFHPQVQMKGE--LVLP
-t83             --------GDL--------------------CNS--PSFLGMCMFHPQVQAKGE--LVLP
-t95             --------GDL--------------------CNP--PSFLGMCMFHPQVRSKGE--LVLP
-t20             --------GDL--------------------CNP--PSFLGMCMFHPQVRSKGE--LVLP
-t69             --------GDL--------------------CNS--PGFLGMCMFHPQVQRKGE--LVLP
-t2              --------GDL--------------------CNS--PGFLGMCMFHPQVQAKGE--LVLP
-t10             --------GDL--------------------CNS--PGFLGMCMFHPQVQAKGE--LVLP
-t31             --------GDL--------------------CNL--PSFLGMCMFHNQVQCKGE--LVLP
-t15             --------GDL--------------------CNS--PSFLGMCMFHNQVPNKGA--LVLP
-t63             --------GDL--------------------CNS--PSFLGMCMFHNQVSFKGE--LVLP
-t50             --------GDL--------------------CNS--PSFLGMCMFHNQVSVKGE--LVLP
-t25             --------GDL--------------------CNS--PSFLGMCMFVNQVSFKGE--LVLP
-t51             --------GDL--------------------CNS--PSFLGMCMFHVQVQFKGE--LVLP
-t9              --------GDL--------------------CSY--PSFLPMCMFVPQVLSKGE--LVLP
-t47             --------GDL--------------------CSY--PSFLPMCMFVSQVLSKGE--LVLP
-t60             --------GDL--------------------CSV--PSFLPMCMFVSQVLHKGE--LVLP
-t30             --------GDL--------------------CSV--PSFLPMCMFVSQVLHKGE--LVLP
-t70             --------GDL--------------------CSY--PSFLPMCMFVAQVIAKGE--LVLP
-t91             --------GDL--------------------CSY--PSFLPMCMFVAQVIAKGE--LVLP
-t49             --------GDL--------------------CSY--PSFLPMCMFVAQVIAKGE--LVLP
-t52             --------GDL--------------------CSY--PSFLPVCMFVAQVINKGE--LVLP
-t43             --------GDL--------------------CSH--PSFLGMCMFHEQVRCKGE--LVLP
-t1              --------GDL--------------------CSH--PSFLGMCMFVEQVRCKGE--LVLP
-t86             --------GDL--------------------CSH--PSFLGMCMFHEQVRRKGE--LVLP
-t72             --------GDL--------------------CSH--PSFLGMCMFHEQVRRKGE--LVLP
-t96             --------GDL--------------------CSH--PSFLGMCMFHEQVRRKGE--LVLP
-t44             --------GDL--------------------CSH--PSFLGMCMFHEQVRCKGE--LVLP
-t45             --------GDL--------------------CSV--PSFLGMCMFHEQVRCKGE--LVLP
-t74             --------GDL--------------------CSV--PSFLGMCMFHEQVRCKGE--LVLP
-t26             --------GDL--------------------CSF--PSFLGMCMFHDQVRCKGE--LVLP
-t61             --------GDL--------------------CSF--PSFLGMCMFHEQVRCKGE--LVLS
-t97             --------GDL--------------------CSF--PSFLGMCMFHQQVRCKGE--LVLP
-t17             ---GARGSGDL--------------------CSF--PSFLGMCMFHEQVRCKGE--LVLP
-t11             ---GARGSGDL--------------------CSF--PSFLGMCMFHEQVRCKGE--LVLP
-t23             --------GDL--------------------CSV--PSFLGVCMFQRQVVMKGE--LVLP
-t76             --------GDMPQNTGDSMTCPHLAEGLAAVNS---RAFIGVSIYDLKVSHKMI--QACN
-t53             --------GDIPQNTGDSMTCPHLAEGLAAVNS---RAFIGVSTYDLKVSHKMI--QACN
-t16             --------GDIPQNTGDSMTCPHLAEGLAAVNS---RAFIGVSTYDLKVSHKMI--QACN
-t42             --------GDTPTQAGDSMTFPHLAEGLPAVNS---RAFVGVSSYDLRVSHKMI--QACT
-t24             --------GDTP--------FPHLAEGLPAVNS---RAFIGVSSYDLKVSHKMI--QACN
-                
-
-t73             DTWNEESATFPYPQVHSRSDKRCLNGLHQGDHEESVH---HAPRI----MR---LIGH-H
-t66             DTWNEESATFPYPQVHSRSDKRCLNGLHQGDHEESVH---HAPRI----MR---LIGH-H
-t32             DTWNEESATFPYPQVHSRSDKRCLNGLHQGDHEESVH---HAPRI----MR---LIGH-H
-t75             DTWNEESGTFPYPQVHSRNEKRCINKLHQGDHNESCH---HNPRI----VR---RIGH-H
-t79             D--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIGL-N
-t27             D--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIGM-N
-t93             D--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIGM-N
-t59             D--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIGM-N
-t7              D--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIGM-N
-t78             D--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIGM-N
-t12             D--NEDSMAFPYVQVHSRSVKRCLNVLVQGDHDESRH---HNARI----VA---RIGM-N
-t81             DIWNESPMAFPYAQVHSKSHKRCLNVLVQGDHEESEH---HNARI----MS---KIGT-H
-t21             DIWNESPMAFPYAQVHSKSHKRCLNVLVQGDHEESEH---HNARI----MS---RIGT-H
-t80             DTWNEASMAFPYPQVHSKSHRRVLNVLHQGDVEES-H---HSARC----VR---RIGF-H
-t14             DTWNEASMAFPYPQVHSKSHRRVLNVLHQGDVEES-H---HSARC----VR---RIGF-H
-t85             DTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---VSARC----MR---RIGF-H
-t62             DTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---HSARC----MR---RIGY-H
-t19             DTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---HSARC----MR---RIGYGH
-t77             DTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---HSARC----MR---RIGY-V
-t88             DPCYELSISVMYAGHASYNQKRCINNLDQGDQEDSNHRKEHKIRASVLLYR---QIGI-L
-t37             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L
-t35             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L
-t48             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L
-t55             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L
-t46             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L
-t67             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L
-t57             DPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPQKEHKIRNSVLLYR---QIGL-L
-t56             DPCYELSISVMYAGHASYNQKRCLNNLDQGDREDSSHRKEHKIRRSVLLYQ---QIGC-L
-t13             DPRYEISMSVMYSQHHSFSMKRCLNGLDHGDREESPHQIEHKMRKSVLIYN---PIGY-L
-t5              DPRYEISMSVMYSQHHSFSMKRCLNGLDHGDREESPHQIEHKMRKSVLIYS---PIGY-L
-t38             DPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHHIDHKMRKSVLIYN---PIGY-L
-t33             DPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L
-t100            DPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L
-t34             DPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L
-t84             DPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L
-t92             DPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L
-t3              DPHYELSMSVMYAQHHSFSQKRCLNALDHGDREESPHQIEHKMRKSVLLYN---PIGY-L
-t22             DPRYELSMSVMYAQHHSFSQKRCLNALDYGDREESPHQIEHKMRKSVLLYY---TIGW-L
-t64             DPRYELSMSVMYAQHHSFSQKRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIGF-L
-t18             DPRYELSMSVMYAQHHSFSQKRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIGF-L
-t68             DPRYELSMSVMYAQHHSFSQKRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIGF-L
-t28             DPRYELSMSVMYSQHHSFSQKRCLNPLDHGDRQESSHGIEHNMRSSVLLYN---PIGF-L
-t82             DPRYELSMSVMYSQHHSFSQKRCLNPLDHGDRQESPHGIEHNMRSSVLLYN---PIGF-L
-t41             DPRYELSMSVMYSQHHSFSQKRCLNPLDHGDRQESPHGIEHNMRSSVLLYN---PIGF-L
-t71             DPRYELSMSVMYAQHHSFSQKRCLNHLDHGDRQESPHGIEHNMRKSVLLYN---PQGY-L
-t94             DPRYELSMSVMYAQHHSMSQKRCLNTLDHGDRQESPHGIEHNMRKSVLLYD---PIGY-L
-t99             DPRYELSMSVMYAQHHSFSQKRCLNALDHGDRQESPHGIEHNMRKSVLLDS---PIGY-L
-t40             DPRYELSMSVMYAQHHSFSQKRCLNALDHGDRQESPHGIEHNMRKSVLLDS---SIGY-I
-t90             DPRYELSMSVMYAQHHSFSQKRCLNALDHGDRQESPHGIEHNMRKSVLLDS---PIGY-I
-t4              DPRYEMSMSVMYAQHHSFSQKRCLNALDYGDRQESPHGIEHNMRKNVLLDN---PIGH-L
-t36             DSPNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSEHIKEKHMRI----YA---NIGG-H
-t87             DSPNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHVKEKHMRI----YA---NIGG-H
-t89             DSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H
-t39             DSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H
-t8              DSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H
-t6              DSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H
-t58             DSCNEDSVSFMYIQHHSFHEKRCLNHLNVGDREDSEHIKEKHMRV----YA---SIGG-H
-t54             DSCNEDSVSFMYIQHHSFHEKRCLNHLNVGDREDSEHIKEKHMRI----YA---SIGG-H
-t65             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGK-V
-t29             DNPNENSVEFMYRRHHSLSDKRCLNLLFVGDSQDSQHQREKQLRI----YG---RIGK-V
-t98             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGK-V
-t83             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGK-V
-t95             DNPNENSVEFMYRRHHSLSDKRCLNLLYTGDSQDSQHLREKQLRI----YG---RIGR-V
-t20             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGR-V
-t69             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRM----YG---EIGK-V
-t2              DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRM----YG---EIGK-V
-t10             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRM----YG---EIGK-V
-t31             DNVNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRI----YQ---NIGK-V
-t15             DNVNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRI----YP---SIGK-V
-t63             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDEQDSSHLREKQLRL----YA---RIGK-V
-t50             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSSHLREKQLRL----YA---RIGK-V
-t25             DNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSSHLREKQLRL----YA---RIGK-V
-t51             DHPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRI----YA---RIGK-V
-t9              DSSNEESISFVYLQHHSFSVKRCLNYLNVGDSADSKHLKEKHLRA----EGMPGNIGK-H
-t47             DSSNEESISFVYLQHHSFSDKRCLNYLNVGDNSDSKHLKEKHLRA----QGMPGNIGK-H
-t60             DSSNEESISFVYLQHHSFSDKRCLNYLNVGDNADSKHLKEKHLRA----QGMPGNIGK-H
-t30             DSSNEESISFVYLQHHSFSEKRCLNYLNVGDNADSRHLKEKHLRA----QGMPGNIGK-H
-t70             DSSTEESISFMYLQHHSFSDKRCLNYLNVGDNEDSKHAKEKFLRG----DG---GIGQ-H
-t91             DSSTEESISFMYLQHHSFSDKRCLNYLNVGDNEDSKHAKEKFLRG----DG---GIGQ-H
-t49             DSSNEESISFMYLQHHSFSDKRCLNCLNVGDNEDSKHLKEKFLRA----DG---GIGQ-H
-t52             DSSNEESISFMYLQHHSFSEKRCLNYLNVGDNEDSKHLKEKFLRA----DG---NIGQ-H
-t43             DSPNEESVSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIGH-H
-t1              DSPNEESLSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIGR-H
-t86             DSPNEESVSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIGR-H
-t72             DSPNEESVSFVYIQHHSFSDKRCLNCLNAGDNDDSEHLKEKHLRT----YG---QIGR-H
-t96             DSPNEESVSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRV----YG---QIGR-H
-t44             DSPNEESVSFVYIQHHSFSDKRCLNYLNVGDNDDSEHLKEKHLRI----YG---VIGK-H
-t45             DSPNEESVSFVYIQHHSFSDKRCLNYLNVGDNDDSEHLKEKHLRI----YG---EIGK-H
-t74             DSPNEESVSFVYIQHHSFSDKRCLNYLNVGDNDDSEHIKEKHLRI----YG---EIGK-H
-t26             DSKNEESVSFVYIQHHSFSDKRCLNYLNVGDNEDSEHLKEKHLRV----YG---NIGK-H
-t61             DSKNEESVSFVYIQHPSFSDKRCLNYLNVGDNEDSEHLKEKVLRV----YG---DIGK-H
-t97             DSKNEESVSFVYIQHHSFNDKRCLNYLNVGDNEDSEHLEEKHLRV----YG---NIGK-H
-t17             DSKNEESVSFVYIQHHSFSDKRCLNELNVGDNEDSIHLKEKHLRI----YG---NIGK-V
-t11             DSKNEESVSFVYIQHHSFSDKRCLNSLNVGDNEDSIHLKEKHLRI----YG---DIGK-H
-t23             DSADEGSVSFMYIQHHSFAAKRCLNVLNVGDNEDSVHLRHKQLRV----YG---KIGK-H
-t76             PIQN---------DNHAFSDQRCLNDLSQGVVGASFPKMQHGVRH----YK---K-----
-t53             PIQN---------DNHAFSDQRCLNDLAQGVVGASHPKMQHGVRH----YK---K-----
-t16             PIQN---------DNHAFSDQRCLNDLAQGVVGASHPKMQHGVRH----YK---K-----
-t42             LIQN---------DNVAFSDQRPLNDLNQGCVGTSHPKMPHGVRH----YK---K-----
-t24             PIQN---------DNVAFSDQRVLNDLSQGCVGTSHPKMPHGVRH----YK---K-----
-                
-
-t73             LVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDG
-t66             LVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDG
-t32             LVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDG
-t75             LVIIVLVNRDMGRLNYIEPDALVPSPLRFGGDEWVPKPI------------------EDG
-t79             LVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------GDG
-t27             LVIISYANVDMGRLNHCEDQAIVYSPLRYGGAGFVSKPI------------------ADG
-t93             LVIISYANVDMGRLNHCEDQAIVYSPLRYGGAGFVSKPI------------------ADG
-t59             LVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADG
-t7              LVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADG
-t78             LVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADG
-t12             MVIIRYLNVEMGRLNHCEDDAMVYSPLRIGGAGTHSKPI------------------ADG
-t81             LVIINIINVEMQRLNHCEDKAIVYSPDRIGGAGFHSKPI------------------ADG
-t21             LVIVNVINVEMQRLNHCEDKAIVYSPDRIGGAGFHSKPI------------------ADG
-t80             LVIIVFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPV------------------DDG
-t14             LVIIVYWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPV------------------DDG
-t85             LVIINFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------NDG
-t62             RVIINYWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------ADG
-t19             LVIINFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------ADG
-t77             LVIINFWNVEMGRLIHCEDEAIIYSPLRIGGAGFHSKPI------------------ADG
-t88             -VIIKEANELMNRLNHKEPENGIIFPLR---DAQDPKQI------------------LNG
-t37             -VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-t35             -VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-t48             -VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-t55             -VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-t46             -VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-t67             -VIIKEANELMGRLNHKERKNGVIFPLR---GAQGPKQI------------------SNG
-t57             -VIIKEANEIMGRLNHKERKNGVIFPLR---GAQGPKQI------------------SNG
-t56             -VITRERNELMGRLNHKEPRDGVIFPHR---GAQGPKQL------------------ANG
-t13             -VIIKDANSMMGRLNHHESRAVVAFPLR---GAEGPKQV------------------MEG
-t5              -VIIKDANSMMGRLNHHESRAIVAFPLR---GAEGPKQV------------------MEG
-t38             -VIIKNANSLMGRLNHHESRLIVTFPLR---GAEGPKQV------------------MEG
-t33             -VIIKNANSLMGRLNHYESRAIVTFPLR---GAEGPKQV------------------MEG
-t100            -VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-t34             -VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-t84             -VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-t92             -VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-t3              -VIIKNANSMMGRLNHHESCAIVMFPLR---GAEGPKQI------------------IEG
-t22             -VIIKNADSMMGRLNHHESCAMVMFPLR---GAEGPKQI------------------MEG
-t64             -VIIKNINSMMGRLNHHESRAVVGFPLR---GAENPKQI------------------MEG
-t18             -VIIKNINSMMGRLNHHESRAVVGFPLR---GAENPKQI------------------MEG
-t68             -VIIKNINSMMGRLNHYESRAVVGFPLR---GAENPKQI------------------MEG
-t28             -VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------VEG
-t82             -VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------MEG
-t41             -VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------MEG
-t71             -VIIKNVNSMMGRLNHHESRAVVTFPLR---GADNPRQI------------------MEG
-t94             -VIIKNVNSMMGRLNHHESRAKVTFPLR---GADNPRQI------------------MEG
-t99             -VIIKNINSMMGRLNHHESRAVFAFPLR---GAENPKQI------------------MEG
-t40             -VIIKNLNSMMGRLNHHESRAVVTFPLR---GAEDPKQI------------------MEG
-t90             -VIIKNVNSMMGRLNHHESRAVVTFPLR---GAEDPKQI------------------MEG
-t4              -VIIKNENSMMGRLNHHESRAVVTFPLR---GAEDPKQK------------------MEG
-t36             -IIIREWNDVMGRLNHIEPGAEVIFPLRK--RGQHSKPV------------------IDG
-t87             -IIIREWNDVMGRLNHIEPGAEVIFPLRK--RGQHSKPV------------------IDG
-t89             -IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-t39             -IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-t8              -IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-t6              -IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-t58             -IIIREWNDVMGRLNHIEPGAEVTFPLRR--RGQASKPV------------------IDG
-t54             -IIIREWNEVMGRLNHIEVGAEVTFPLRR--RGQASKPV------------------IDG
-t65             -VIIKVWNAVMGRLNHHEPPAEVMFPLRK--GGQDSKPF------------------IDG
-t29             -VIIKVWNAAMGRLNHVEPPAEVMFPLRR--GGSDSKPF------------------LDG
-t98             -VIIKVWNAVMGRLNHHEPPAEVMFPLRR--GGSDSKPF------------------IDG
-t83             -VIIKVWNAVMGRLNHHEPPAEVMFPLRR--GGSCSKPF------------------VDG
-t95             -VILQVWNAVMGRLNHHEPPAEVMFPLRK--GGSNSKPV------------------YDG
-t20             -VILQVWNAVMGRLNHHEPPAEVMFPLRK--GGSNSKAV------------------YDG
-t69             -VIIKVVNAVMGRLNHVEPSAEVMFPLRK--GGSDSKPF------------------IDG
-t2              -VIIKVVNAVMGRLNHHEPSAEVMFPLRK--GGSDSKPF------------------IDG
-t10             -VIIKVVNAVMGRLNHHEPSAEVMFPLRK--GGSDSKPF------------------IDG
-t31             -VIIKVWNANMGRLNHHEPPAEVMFPLRK--GGSDSKPF------------------IDG
-t15             -VIIKVWNAAMGRLNHHEPPAEVMFPLRK--GGSDSKPF------------------IDG
-t63             -VIIKVWNAVMGRLNHHEPPAAVMFPLRK--GGSDSKPF------------------IDG
-t50             -VIIKVWNAVMGRLNHHEPPAEVMFPLRK--CGSDSKPF------------------IDG
-t25             -VIIKVWNAVMGRLNHHEPPAEVVFPLRK--GGSDSKPF------------------IDG
-t51             -VIIKVWNAVMGRLNHHEPPAEVVFPLRK--GGSDSKPF------------------IDG
-t9              -VIINVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------IDG
-t47             -VIINVWNAVMGRLNHHESPAEVVFPLRQ--GGPDSKPM------------------IDG
-t60             -VIINVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------IDG
-t30             -VIISVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------MDG
-t70             -VIINVWNAVMGRLNHHEPPPEVVFPLRQ--GGPDSKPM------------------VDG
-t91             -VIINVWNAVMGRLNHHEPPPEVVFPLRQ--GGPDSKPM------------------VDG
-t49             -VIINMWNAVMGRLNHHEPPPEVVYPLRQ--GGPNSKPM------------------VDG
-t52             -VIINMWNAVMGRLNHHEPPAEVNFPLRQ--GGPDSKPM------------------VDG
-t43             -VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSK-M------------------VDG
-t1              -VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKPV------------------VDG
-t86             -VIINVWNAFMGRLNHHEPPAEAVYPLRK--GGPDSKPM------------------VDG
-t72             -VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKPM------------------VDG
-t96             -VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKLM------------------VDG
-t44             -VIINVWNAFMGRLNHHEPPADVEYPLRK--GGPDSKPM------------------VDG
-t45             -VIINVWNAFMGRLNHHEPPAEVMYPLRK--GGPESKPM------------------VDG
-t74             -VIINVWNAFMGRLNHHEPPAEVMYPLRK--GGPESKPM------------------VDG
-t26             -VIINSWNAMMGRLNHHEPAAEVVYPLRK--GGPESKPM------------------VDG
-t61             -VIINVWNAMMGRLNHHEPAAEVVCPLRK--GGPDSKPM------------------VDG
-t97             -VIINVWNAMMGRLNHHEPAAEVVCPLRK--GGPDSKPM------------------VDG
-t17             -VIINVWNAMMGRLNHHEPAAEVVYPLRK--GGPDSKPM------------------VDG
-t11             -VIINVWNAMMGRLNHHEPAAEVVYPLRK--GGPDSKPM------------------VDG
-t23             -VIISVPNAIMGRLNHHEPSAIVVFPLRQ--RGADSKSV------------------GDG
-t76             ---RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPAR
-t53             ---RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPAR
-t16             ---RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPAR
-t42             ---KVYENEVGDRLDDAEGIDDVGVWMRW--NGVKHAWCHIIGSCPDHLVCSLLVLQPGR
-t24             ---RVYENEVGDRLDDAEAVDDVGVWMRW--AGVKVAVCHVIGSCPDHLVVSLLVLQPAR
-                
-
-t73             FFDK-D-Q------SRPDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NI
-t66             FFDK-D-Q------SRPDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NI
-t32             FFDK-D-Q------ARPDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NI
-t75             FFDK-D-Q------ARPDVANA-IVPDR----DQWVGAHKEWGSSLCKVGLAVHDLR-NV
-t79             FFDK-D-Q------ARPLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NI
-t27             FFDK-D-Q------ARPLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NI
-t93             FFDK-D-Q------ARPLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NI
-t59             FFDK-D-Q------ARPLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NI
-t7              FFDK-D-Q------ARPLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NI
-t78             FFDK-D-Q------ARPLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NI
-t12             FFDK-D-Q------ARPLIANAHIVPEN----DQWTGAVAQWCSSVIKCGLANHDLE-NI
-t81             FFDK-D-Q------ARPIIANAHIVPVN----DQWTGPMAQWCSSVIKCGLANHELE-DV
-t21             FFDK-D-Q------ARPIIANAHIVPIY----DQWTGPMAQWCSSVIKCGLANHELK-VV
-t80             FFDK-D-Q------ARPVIASAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NV
-t14             FFDK-D-Q------ARPVIASAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NV
-t85             FFDK-D-Q------ARPVIANAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NV
-t62             FFDK-D-Q------ARPVIANAHIVPEY----DQWSGAMAQWCSSVIKCGLANHDLE-NV
-t19             FFDK-D-Q------ARPVIANAHIVPEY----DQWSGAMAQWCSSVIKCGLANHDLE-NV
-t77             FFDK-D-Q------ARPVIANAHIVPEY----DQWSGAMPQWVSSVIKCGLANHDLE-NV
-t88             LFDK-E-E------NRPMVQDADSVVGS----AQWAGQHRSWCSSDDKA-----------
-t37             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t35             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t48             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t55             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t46             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t67             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t57             LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------
-t56             LFEK-E-E------NRPMVQDAGSVPER----AQWPGQQRAWCSSDDKA-----------
-t13             LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t5              LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t38             LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t33             LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t100            LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t34             LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t84             LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t92             LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t3              LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t22             LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------
-t64             HFDK-E-E------ARPIVQDAASVPGK----AQWVGRVRAWCSSDVKA-----------
-t18             HFDK-E-E------ARPIVQDAASVPGK----AQWVGRVRAWCSSDVKA-----------
-t68             HFDK-E-E------ARPIVQDAASVPEK----AQWVGRVRAWCSSDVKA-----------
-t28             HFDK-E-E------ARPIVKDAASVPGK----AQWVGRIRAWCSSDVKA-----------
-t82             HFDK-E-E------ARPIVQDAASVPGE----AQWVGHIRAWCSSDIKA-----------
-t41             HFDK-E-E------ARPIVQDAASVPGE----AQWVGHIRAWCSSDIKA-----------
-t71             HFDK-E-E------ARPVVQDAPGVPGK----AQWVGKVRAWCSSDVKA-----------
-t94             HFDK-E-E------ARPVVQDAPGVPEQ----AQWVGKMRAWCSSDVKA-----------
-t99             HFDK-EKE------ARPVVQDAPGVPGK----AQWVGRIRAWCSSDVKA-----------
-t40             HFDK-E-E------ARPVVQDAPGVPGK----AQWVGRVRAWCSSEIKT-----------
-t90             HFDK-E-E------ARPVVQDAPGVPGK----AQWVGRVRAWCSSEIKT-----------
-t4              SFDK-E-E------ARPVVQDAPGVPGR----AQWVGRVRPWCSSDVKA-----------
-t36             FFAK-D-E------DRPGIQNAVSVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEP
-t87             FFAK-D-E------DRPGIQNAMSVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEP
-t89             FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEP
-t39             FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEP
-t8              FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEP
-t6              FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEP
-t58             FFAK-D-E------DRPGIQNAMSVPCG----DQWVGSVRGWCSSQHRYGLAIHILVHQQ
-t54             FFAK-D-E------DRPGIQNAMSVPCG----EQWVGSVRGWCSSQHRYGLAIHILVHQQ
-t65             FF------------DRPGIANAMSVKCG----DQWVGSIRGWCSSQHQYGLANHILVHGP
-t29             FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILIHGP
-t98             FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHNP
-t83             FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILIHNP
-t95             FF------------DRPAIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGP
-t20             FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGP
-t69             FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGP
-t2              FF------------DRPGIANAMSVPCG----DQWMGSIKGWCSSQHQYGLANHILVHGP
-t10             FF------------DRPGIANAMSVPCG----DQWMGSIKGWCSSQHQYGLANHILVHGP
-t31             FF------------DRPGIANAMNVPCG----DQWVGCIRGWCSSQHQYGLANHILVHGP
-t15             FF------------DRPGIANAMSVPCG----DQWVGCIRGWCSSQHQYGLANHILVHGP
-t63             FF------------DRPGIANAMSVPCG----DQWMGIIRGWCSSQHQYGLANHILVHGP
-t50             FF------------DRPGIANAMSVPCG----DQWMGVIRGWCSSQHQYGLANHVLVHGP
-t25             FF------------DRPGIANAMSVPCG----DQWMGVIRGWCSSQHQYGLANHILVHGP
-t51             FF------------DRPGIANAMSVPCG----DQWVGVIRGWCSSQHQYGLANHILVHGP
-t9              FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHDP
-t47             FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHDP
-t60             FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHNP
-t30             FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHTP
-t70             FFDK-D-D------DRPGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLAFHTLSHDP
-t91             FFDK-D-D------DRPGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLAFHTLSHDP
-t49             FFDK-D-D------DRPGIANAMNVPCG----DQWGGPIRGWCSSQHRFGLAFHTLKHDP
-t52             FFDK-D-D------DSPGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLASHTLSHDP
-t43             FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVNFGLANHTLVQ-P
-t1              FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-P
-t86             FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-P
-t72             FFDK-E-D------HRPGIANAVSVPCA----DQVGGPLRGWCSSQVKFGLANHTLVQ-P
-t96             FFDK-E-D------ERPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-P
-t44             FFDK-E-D------DRPGIANAVSVPCG----DQVGGPIRGWCSSQVKFGLANHTLAQNP
-t45             FFDK-E-D------DRPGIANAVSVPCT----DQVGGPIRGWCSSQVKFGLANHTLVHNP
-t74             FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVHNP
-t26             FFDK-E-D------DRPGIANAVSVPCD----DQWGGPVRGWCSSQHKFGLADHTLIHIP
-t61             FFDK-E-D------DRPGVANAVSVPCD----DQWGGPVRGWCSSQHKFGLADHTLVHIP
-t97             FFDK-E-D------DRPGVANAMSVPCD----DQWGGPVRGWCSSQHKFGLADHTLVHVP
-t17             FFDK-E-D------DRPGIANAVAVPCS----DQWGGPVRGWCSSQHKFGLADHTLVHVP
-t11             FFDK-E-D------DRPGIANAVAVPCS----DQWGGPVRGWCSSQHKFGLADHTLVHVP
-t23             FYDK-D-E------DRPGIANAVSVPVA----EQWVGSVRGWYSSEHKYGLANHILI-GP
-t76             NFIQLS-MVRDTPHRLPKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQ
-t53             NFIQLS-MVRDTPHGLPKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQ
-t16             NFIQLS-MVRDTPHGLPKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQ
-t42             NFIQLS-VVHDTPHRLPKMASAAAVFKQTCHLEQVPGTARMWGKSGPRVRLNGHVLK-NQ
-t24             NFIQLS-VVHDTPHRLPKMASAAAVFKQTCHLEQVAGTARVWGKSGPRVKLNGHVLK-NQ
-                
-
-t73             SDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMTEYANGL----WHPFYKASDHKNEAQ
-t66             SDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMTEYANGL----WHPFYKASDHKNEAQ
-t32             SDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMTEYANGL----WHPFYKASDHKNEAQ
-t75             SDLYRCVWMECVLGANHYQQVSRMKMVTPAYTHMTEYANGL----WHPFYKNPDHKNEAQ
-t79             SRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHGL----WKPFYQASDHKNEAQ
-t27             SRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHGL----WKPFYQASDHKNEAQ
-t93             SRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHGL----WKPFYQASDHKNEAQ
-t59             SRLLRCVVMECILGANVYHQISRMKMHGPTYSHVMEYAHGM----WKPFYQASDHKNEAQ
-t7              SRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHGM----WKPFYQASDHKNEAQ
-t78             SRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHGM----WKPFYQASDHKNEAQ
-t12             SRLLRCVVMECVLGANVYHQASRMKMHGPYYAHVTEYAHGL----WKPFYQTSDHKNEAQ
-t81             SRLLRCVGMECNLGANHYHQVSRMKMHGPIYSHMTEYAVGL----WKPFYQASEHKNEAQ
-t21             SRLLRCVGMECNLGANHYHQVSRMKMHGPIYSHMTEYAHGL----WKPFYQASEHKNEAQ
-t80             SRLLRCVMIDCNQGANHYIQISRMKVHGPTYSHMTEYAHGL----WKPFYQASDHKNDAQ
-t14             SRLLRCVMIDCNQGANHYIQISRMKVHGPTYSHMTEYAHGL----WKPFYQASDHKSDAQ
-t85             SRLLRCVEIDCNQGANHYVQISRMKMYGPTYSHMTEYAHGL----WKPFYQASDHKNDAQ
-t62             SRLLRCVVIDCNHGANHYVQISRMKMHGPTYSHMTEYAHGL----WKPFYQASDHKNDAQ
-t19             SRLLRCVVIDCNHGANHYVQISRMKMHGPTYSHMTEYAHGL----WKPFYQASDHKNDAQ
-t77             SRLLRCVVIDVNQGANHYVQISRMKMHGPTYSHMTEYAHGL----WKPFYQASDHKNDAQ
-t88             SQLPRNTHIVVEIGANVYEQFSRMKTNIPIYAHVTEYAVGV----ERPFYE-SEFKNEAQ
-t37             SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVGV----ARPFYD-AEFKNEAQ
-t35             SQLPRNTRIVAEIGANVYEQYSRMKTVIPIYARVTEYAVGV----PRPFYD-AEFKNEAQ
-t48             SQLPRNTRIVAEVGANVYEQYSRMKTVIPIYARVTEYAVGV----PRPFYD-AEFKNEAQ
-t55             SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVGV----ARPFYD-AEFKNEAQ
-t46             SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVGV----ARPFYD-AEFKNEAQ
-t67             SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVGV----ARPFYD-AEFKNEAQ
-t57             SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVGV----ARPFYD-AEFKNEAQ
-t56             SKLPRNTKMVAEIGANVYEQASRMKTNIPIYAHVTEYALGV----DRPFYD-SEFKNEAQ
-t13             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-NEWKQEAQ
-t5              SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-NEWKQEAQ
-t38             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-SEWKQEAQ
-t33             SHLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-SEWKQEAQ
-t100            SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-SEWKQEAQ
-t34             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-SEWKQEAQ
-t84             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-SEWKQEAQ
-t92             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVGI----VKPFYD-SEWKQEAQ
-t3              SRLPRNDPVVHEVGANVYQQISRMKTSIPIYAHVTEYAVGI----IKPFYD-NEWKQEAQ
-t22             SQLPTNDPIVPEVGANVYQQVSRMKTSIPIYAHVTEYAVGI----VKPFYD-NEWKQEAQ
-t64             SKLPRNDPIVPEVGANVYQQLSRMKTNIPIYAHVTEYAVGI----VKPFYD-NEWKQEAQ
-t18             SKLPRNDPIVPEVGANVYQQLSRMKTNIPIYAHVTEYAVGI----VKPFYD-NEWKQEAQ
-t68             SKLPRNDPIVPEVGANVYQQISRMKTNIPIYAHVTEYAVGI----VKPFYD-NEWKQEAQ
-t28             SQLPRNDPIVPEVGANVYQQDSRMKTNIPIYAHVTEYACGI----VKPFYE-NEWKQEAQ
-t82             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIYAHTTEYACGI----VKPFYE-NEWKQEAQ
-t41             SQLPRNDPIVPEVGANVYQQVSRMKTNIPIYAHTTEYACGI----VKPFYE-NEWKQEAQ
-t71             SQLPRNDTIVPEVGANVYQQVSRVKTHIPIYAHVTEYAVGI----VKPFYN-NEWKQEAQ
-t94             SQLPRNDTIVPEVGANVYQQVSRVKTNIPIYAHVTEYAVGI----VKPFYN-NEWKQEAQ
-t99             SELPRNDAIVPEVGANVYQQVSRMKTNIPIYAHATEYAVGI----VKPFYD-NEWKQEAQ
-t40             SELPRNDAIVVEVGANVYQQISRMKTDIPIYAHATEYAVGI----VKPVYD-NEWKQEAQ
-t90             SELPRNDAIVPEVGANVYQQISRMKTDIPIYAHATEYAVGI----VKPVYD-NEWKQEAQ
-t4              SELPRNDAIWPEVGANVYQQISRMKTNIPIYPHVTEYAVGI----VKPFYL-NEWKQEAQ
-t36             SKLHKTYRINRKVGANAYDQDSRMKAAAPVYPHIMEYAHGM----FNPFYGLSEPKNNAQ
-t87             SKLHKTYRINRKVGANAYDQDSRMKAAAPVYPHIMEYAHGM----FNPFYGLSEPKNNAQ
-t89             SKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIMEYAHGM----FNPFYGLSEPKNNAQ
-t39             SKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIMEYAHGM----FNPFYGLSEPKNNAQ
-t8              SKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIMEYAHGM----FNPFYGLSEPKNNAQ
-t6              SKLHKTYKVVRKVGANAYDQVSRMKAAAPVYPHIMEYAHGM----FNPFYGLSEPKNNAQ
-t58             SRLHKTYNIDRKNGANAYEQDSRMKAGAPVYPHIMEYAHGM----FNPFYGMSEPKNNAQ
-t54             SRLHKTYNIDRKNGANAYDQDSRMKAGAPVYPHIMEYAHGM----FVPFYGMSEPKNNAQ
-t65             SKLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t29             SKLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIMEYAHGM----VKPFYGQSEPKNEAQ
-t98             SRLHRTYAINKKMGANVYQQSSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t83             SRLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t95             SKLHRTYAINRKVGANVYQQTSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t20             SKLHRTYAINRKVGANVYQQMSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t69             SKLHRTYAINKKMGANVYQQISRMKALAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t2              SKLHRTYAINKKMGANVYQQISRMKALAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t10             SKLHRTYAINKKMGANVYQQISRMKALAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t31             SKLHRTYAINKKMGANVYQQTSRMKAAAPIYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t15             SKLHRTYAINRKMGANVYQQTSRMKAAAPLYPHIMEYAHGM----VEPFYGISEPKNEAQ
-t63             SKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t50             SKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t25             SKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t51             SKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHGM----VKPFYGISEPKNEAQ
-t9              SSLHRTFAINRKMGANVYQQTSRMKASAPFYPHCMEYAHGV----CKPFYEHSEPKNEAQ
-t47             SNLHRTFAINRKMGANVYQQASRMKASAPFYHHCMEYAHGV----CKPFYEHSEPKNEAQ
-t60             SNLHRTFAINRKMGANVYQQTSRMKASAPFYHHCMEYAHGV----CKPFYEHSEPKNEAQ
-t30             SNLHRTFAINRKMGANVYQQTSRMKASAPFYHHCMEYAHGV----CKPFYEHSEPKNEAQ
-t70             SKLHRTFAINQKMGANVYQQMSRMKTPAPFYPHVMEYAHGV----CKPFYEHSEPKNEAQ
-t91             SKLHRTFAINQKMGANVYQQMSRMKTPAPFYPHVMEYAHGV----CKPFYEHSEPKNEAQ
-t49             SKLHRTFAINEKMGANVYQQNSRMKASAPFYPHVMEYAHGV----CKPFYEHSEPKNDAQ
-t52             SKLHRTFGINKNMGANVYQQTSRMKANAPFYPHVMEYAHGV----CKPFYEHSEPKNEAQ
-t43             SKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIMEYAHGV----CKPFYERSEPKNEAQ
-t1              SKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIMEYAHGV----CKPFYERSEPKNEAQ
-t86             SKLHRTFKINKKMGANVYHQTSRMKAEAPVYPHIMEYAHGV----CKPFYERSEPKNEAQ
-t72             SKLHRTFKINKKIGANVYQQTSRMKADAPVYPHIMEYAHGV----YKPFYERSEPKNEAQ
-t96             SKLHRTFKINKKIGANVYQQTSRMKAEAPVYPHIMEYAHGV----CKPFYERSEPKNEAQ
-t44             SKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIMEYAHGV----CKPFYDRSEPKNEAQ
-t45             SKLHRTFAINKKMGANVYQQTSRMKAEAPVYPHIMEYAHGV----CKPFYERSEPKNEAQ
-t74             SKLHRTFAINKKMGANVYQQTSRMKAEAPVYPHIMEYAHGV----CKPFYERSEPKNEAQ
-t26             SKLHRTFAINKKMGANVYQQTSRMKAAAPVYSHVMEYAHKV----VKPFYARSEPKNEAQ
-t61             SKLHRTFAITKKMGANVYQQTSRMKATAPVYPHVMEYAHGV----VKPFYDRSEPKNEAQ
-t97             SKLHRTFPINKKMGANVYQQTSRMKATAPVYPHVMEYAHGV----IKPFYDRSEPKNEAQ
-t17             SLLHRTFAINRKMGANVYQQTSRMKAAAPVYPHMMEYAHGV----VKPFYERSEPKNEAQ
-t11             SLLHRTFAINKKMGANVYQQTSRMKAAAPVYPHMMEYAHGV----VKPFYERSEPKNEAQ
-t23             SKLHRTYQTTAKMGANVVKATNRMKRPQPVYPHVMEYANGV----VKPFYEVAESKNEAQ
-t76             NTLHRQYLVDVELQATMVFVAARMKTDSSMYMSVREILHG------------CGIKDEAQ
-t53             NTLHRQYLVDVELGATMVFVAARMKTDLSMYMSVREILHG------------CGIKDEAQ
-t16             NTLHRQYLVDVELGATMVFVAARMKTDLSMYMSVREILHG------------CGIKDEAQ
-t42             NILHRQYLVDVNLGATMVFVLARMKTDASMYMSHREILHGGTFDAAKPFRQICGTKDEAQ
-t24             NVLHRQYLVDVDLGATMVFVAARMKTDASMYMSHREILHGGTFDAAKPFRQICGVKDEAQ
-                
-
-t73             GVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEGCKCRS-
-t66             GVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEGCKCRS-
-t32             GVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEGCKCRS-
-t75             GVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVAKPVLGDWEGCKCRSD
-t79             GVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSD
-t27             GVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGIHTVMKPHLGNVDGCRCRSD
-t93             GVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGIHTVMKPHLGNVDGCRCRSD
-t59             GVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSD
-t7              GVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSD
-t78             GVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSD
-t12             GVGES-THQLPCVESQTCQYEVKHAKVCKLVHH-ALYLLALHTMMKPRLGDIDGCRCRSE
-t81             GLGER-PHQLPCVESQTCQYEIKVAKVCKLVHV-ALYLVGLKTVVKPKLGDWDGIRCRSE
-t21             GVGER-PHQLPCVESQKCQYEVKVAKVCKLVHV-ALYLVGLKTVVKPKLGDWDGVRCRSD
-t80             GVGER-PHQLPCVESQTCQYEMKHAKVCKLVHG-ALYLIALKTVVKPKLGVWQGCRCRSQ
-t14             GVGER-PHQLPCVESQTCQYEMKHAKVCKLVHG-ALYLIALKTVVKPKLGVWQGCRCRSQ
-t85             GVGER-PHQLPCVESQTCQYEVKHANVCKLVHA-ALYLIGLKTVVKPELGVWEGCRCRSQ
-t62             GVGER-PHQLPCVEPQTCQYEVKHAKVCKLVHG-ALYLIGLQTVVKPKLGVWEGVQCRSQ
-t19             GVGER-THQLPCVEPQTCQYEVKHAKVCKLVHG-ALYLIGLQNVVKPKLGVWEGVQCRSQ
-t77             GVGER-VHQLPCVEPQTCQYEVKHAKVCKHVHG-ALYLIGLQTVVKPKLGVWEGCQCRSQ
-t88             GWGES-GTSIPCVDSPDVQYEMKVAWVDKLMHT-ALYLMPLATVHKPEMGTVRGERCRAI
-t37             GQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTI
-t35             GQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPQMGTVKGERCRTI
-t48             GQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTI
-t55             GQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLSTVHKPEMGTVKGERCRTI
-t46             GQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTI
-t67             RQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTI
-t57             GQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTI
-t56             GQGES-GTSIPCVDSPDVQYELKHAWVDKLMHT-ALYLMPLPTVHKPKMGTVKGERCRAM
-t13             GQGEA-GACIPCVDSKDVQYELKHAYVKKLMHT-SLYLMHIETCHKPVMGTVKGNRCRAI
-t5              GQGEA-GACIPCVDSKDVQYELKHAYVKKLMHT-SLYLMHIETCHKPVMGTVKGNRCRAI
-t38             GQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTIKGNRCRAI
-t33             GQGEA-GACIPCVDSPDVQYELKHAYVKKLVHN-SLYLMHIDTCHKPAMGTVKGNRCRAI
-t100            GQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAI
-t34             GQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAI
-t84             GQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAI
-t92             GQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAI
-t3              GQGEA-GASIPCVNSPDVQYELKHAHIKKLMHT-SLYLMHLGTCHKPVMGTVKGDRCRAI
-t22             GQGEA-GASIPCVNSPDVQYELKHAHIKKLMHT-SLYLMHLKTCHKPVMGTVKGDRCRAI
-t64             GVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAI
-t18             GVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAI
-t68             GVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAI
-t28             GQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAI
-t82             GQGEA-GASIPCVDSPDVQYELKHANVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAI
-t41             GQGEA-GASIPCVDSPDVQYELKHANVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAI
-t71             GQGEA-GASIPCVDSPDDQYELKHAEVKKLMHD-SLYLPHLETCHKPIMGTVKGGRCRAS
-t94             GQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLPHLETCHKPIMGTVKGGRCRAS
-t99             GQGET-GASIPCVDSPDVQYEMKHAEVKKLMHD-SLYLMHIETCHKPIMGTVKGDRCRAT
-t40             GQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAT
-t90             GQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAT
-t4              GQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLWHLETCVKPIMGTVKGDRCRAT
-t36             GNGEN-PMNKPCVESEDCQYEKKHASMDKLMHQ-SLYLMHINIMSKPAMGEWVGNRCRNE
-t87             GNGEN-PMNKPCVESEDCQYEKKHASMDKLMHQ-SLYLMHINVMSKPAMGEWVGNRCRND
-t89             GNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVGVRCRNE
-t39             GNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVGVRCRNE
-t8              GNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHVNIMSKPAMGEWVGVRCRNE
-t6              GNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVGVRCRNE
-t58             GNGEN-PMNVPCVESDDCQYEKKHASMDKQMHQ-SLYLMHMNIMSKPAMGEWVGNRCRNE
-t54             GNGEN-PMNVPCVESDDCQYEKKHASMDKQMHQ-SLYLMHMNIMSKPAMGEWVGNRCRNE
-t65             GNGEN-PMNVPSVESGECQYEHKHAAMEKLMHH-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t29             GNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMPKPVMGDWDGNRCRAE
-t98             GNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t83             GNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t95             GNGEN-PMNVPSVESGECVYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGHRCRAE
-t20             GNGEN-PMNVPSVESGECVYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGHRCRAE
-t69             GNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t2              GNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t10             GNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t31             KNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAE
-t15             KNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVLGDWVGNRCRAE
-t63             KNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVGSRCRAE
-t50             KNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVGSRCRAE
-t25             KNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVGSRCRAE
-t51             KNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPIMGDWVGNRCRAD
-t9              GNGEK-PMNVPCVESIDCQYENKHATMTKLMHH-SLYLMRMHTMSKPIMGDVNGNRCRAD
-t47             GNGEK-PMNVPCVESRDCQYENKHATMTKLMHQ-SLYLMRMHTMSKPIMGHVNGNRCRAD
-t60             GNGEK-PMNVPCVESIDCQYESKHAAMTKLMHQ-SLYLMRIHTMSKPIMGDVNGNRCRAD
-t30             GNGEK-PMNVPCVESIDCQYENKHATMTKLMHQ-SLYLMRMHTMSKPIMGDVNGNRCRAD
-t70             GNGEKVPMNVPCVESMDCQYENKHAPMAKLMHQDSLYLMRMHTMSKPLMGDVNGNRCRAD
-t91             GNGEKVPMNVPCVESMDCQYENKHAPMAKLMHQ-SLYLMRMHTMSKPLMGDVNGNRCRAD
-t49             GNGDKVPMNVPCVESMDCQYENKHAPMAKLMHQ-SLYLMRMYTMSKPIMGDVNGNRCRAE
-t52             GNGEK-PMNVPCVESIECQYENKHATMAKLMHD-SLYLMRMHTMSKPVMGDVNGHRCRAD
-t43             GNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAG
-t1              GNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAK
-t86             GNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAG
-t72             GNGEK-QGNVPCVESVECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAG
-t96             GNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAG
-t44             GNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGYVDGHRCRAG
-t45             GNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAG
-t74             GNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAG
-t26             GNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLMRMQTMAKPPMGDVDGHRCRAG
-t61             GNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLVKMQTMSKPPMGDVDGHRCRAG
-t97             GNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLVKMQTMSKPPMGDVDGHRCRAG
-t17             GNGEK-QWNVPCVQSVDCQYENKHATMAKLMHP-PLYLMRMETMSKPPMGDVDGVRCRAG
-t11             GNGEK-QWNVPCVQSVDCQYENKHATMAKLMHP-PLYLMRMETMSKPPMGDVDGVRCRAG
-t23             GNGEK-PVNVPCVESPDCQYESKHARVNKLMHP-SLYLMCMEAMNKPIMGDWDGNRCRSP
-t76             ADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRCLRYKND
-t53             ADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRCLRYKND
-t16             ADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRCLRYKND
-t42             PDGRR-PATLLVVLSKDNQGITEHGAVLKHVHP----------LCKKDCNNNRCLRCKNV
-t24             PDGQR-PATLLVVLSKDNVGITEHGAVLKHVHP----------LCKKDCNNNRCLRCKNV
-                
-
-t73             --KLYVSQLDH----KTLSK-NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKN
-t66             --KLYVSQLDH----KTLSK-NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKN
-t32             --KLYVSQLDH----KTLSK-NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKN
-t75             LIKLYVSQLDH----KTLSK-NMGLY--MRNRTWLATSPLQ------IGCIFMLVGRKKN
-t79             LNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQ
-t27             LNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQ
-t93             LNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQ
-t59             LNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQ
-t7              LNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQ
-t78             LNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQ
-t12             LNKLALSQLDD----KTLSK-NCFQY--LGNMTWLATSPLH------VGCMIIF------
-t81             LNKLYLSQLDD----KTLSK-NCFIY--LGNMTWLATSPLQ------IGWLVLFDGRKRQ
-t21             LNKLYLSQLDD----KTLSK-NCFRY--LGNMTWLATSPLQ------NGCVVIFAGRKRQ
-t80             LSKLVLSQLDE----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCVILFGGRKRQ
-t14             LSKLVLSQLDE----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCVILFGGRKRQ
-t85             LSKLALSQLDE----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCIILFGGRKRQ
-t62             LSKLILSQLDD----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCIIMFDGRKRQ
-t19             LSKLILSQLDD----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCIILFDGRKRQ
-t77             LSKLILSQLDD----KTLSK-NCNIY--LGNMTWLATFPLQ------IGCIILFDGRKRQ
-t88             L-KLLMMQLD------TLSR-NQLPK--LCQGTWLDASPLQ------IGVQVMLVGKKGG
-t37             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRG
-t35             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRG
-t48             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRG
-t55             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRG
-t46             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVKVVLVGKKRG
-t67             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRG
-t57             L-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRG
-t56             L-KLNMMQLDE----KTLSQ-NQIIK--LCQRTWLDASPLQ------IGVNCVLPGKKGG
-t13             L-KLSMIQLDQ----KTLSQ-NQRAK--LCQRTWLDTSPLQ------MGMTLVLVGKKVG
-t5              L-KLSMIQLDQ----KTLSQ-NQRAK--LCQRTWLDTSPLQ------MGMTLVLVGKKVG
-t38             L-KLTMIQLDQ----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVG
-t33             L-KLTMIQLDQ----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVG
-t100            L-KLTMIQLDQ----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVG
-t34             L-KLTMIQLDV----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVG
-t84             L-KLTMIQLDV----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVG
-t92             L-KLTMIQLDV----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVG
-t3              L-KLSMIQLDQ----KTLSQ-NVRAR--LCQRTWLDTSPLQ------MGMVAVLLGKKLG
-t22             L-KLKMIQLDQ----KTLSQ-NQAAR--LCKRTWLDTSPLQ------MGMNVVLIGQKLG
-t64             L-KLPMIQLDQ----KTLSH-NQPRR--LCQRTWLDASPLQ------VGMNIMLMGKKAP
-t18             L-KLPMIQLDQ----KTLSH-NQPRR--LCQRTWLDASPLQ------VGMNIMLKGKKAP
-t68             L-KLPMIQLDQ----KTLSH-NQPRR--LCQRTWLDASPLQ------VGMNIMLMGKKAP
-t28             L-KLSMIQLDE----KTLSQ-NQRPG--LCQRTWLDANPLQ------MGMNTMLVGKKTP
-t82             L-KLNMIQLDQ----KTLSQ-NQRPG--LCQRTWLDASPLQ------MGMHIMLVGKKTP
-t41             L-KLNMIQLDQ----KTLSQ-NQRPG--LCQRTWLDASPLQ------MGMHIMLVGKKTP
-t71             L-KLKMIQLDQ----KTLSQ-NQQRR--LCQRTWLDSSPLQ------MGMKIMLQGKKTP
-t94             L-KLNMIQLDQ----KTLSQ-NQQRR--LCQRTWLDASPLQ------MGMKIMLQGKKIP
-t99             L-KLKMIQLDQ----KTLSQ-NQKRR--LCQRTWLDASPLQ------MGMKMMLQGKKTP
-t40             L-KLKMIQLDQ----KTLSQ-NQKKR--LCQCTWLDACPLQ------MGMKIMLQGKKTP
-t90             L-KLKMIQLDQ----KTLSQ-NQKKR--LCQCTWLDACPLQ------LGMKIMLQGKKTP
-t4              L-KLKMIVLDP----KTLSQ-NQKRR--LCQRTWLDASPLQ------VGMKIMLQGKKTP
-t36             LTALRIIQLDVGVSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVMSVEKKEA
-t87             LTALRIIQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCLVMSVEKKEA
-t89             LTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEA
-t39             LTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEA
-t8              LTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEA
-t6              LTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEA
-t58             LTALHVVQLDVGFSGKTLGQ-NIGISELLNDRTWLATSPLE------IGCGVMAVEKKEA
-t54             LTALHIVQLDVGFSGKTLGQ-NIGISELLNDRTWLATSPLE------IGCGVMAVEKKEA
-t65             LTALQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIA
-t29             LTALQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIA
-t98             LTALQTVQLDVGSSEKTLGQ-NIVTSKRLGDRTWLAASPLQ------IGCGVMVQEKKIA
-t83             LTALQTVQLDLGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGIMVQEKKIA
-t95             LTELQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIA
-t20             LTELQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAAPPLQ------IGCDVMVQEKKIA
-t69             LTALKTGQLDVGSSGKTLGQ-NIMTSKKLGDRTWLAANPLQ------IGRGVMVWEKKVA
-t2              LTALKTGQLDVGSSGKTLGQ-NIMVSKKLGDRTWLAASPLQ------IGCGVMVWEKKVP
-t10             LTALKTGQLDVGSSGKTLGQ-NIMVSKKLGDRTWLAASPLQ------IGCGVMVWEKKVP
-t31             LTALKTVQLDVGSNGKTLGK-NIMTPKKLGDRTWLAASPLQ------IGCGVMVQEKKVA
-t15             LTALKTVQLDIGNSGKTLGQ-NIMTPKRLGERTWLAASPLQ------IGCGVVVQEKKVA
-t63             LTALKTVQLDVGSSGKTLGQ-NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVA
-t50             LTALKTVQLDVGSSGKTLGQ-NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVA
-t25             LTALKIVQLDVGSSGKTLGQ-NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVA
-t51             LTALKTVQLDVGSSGKTLGQ-NIMTPKNLGDKTWLAASPLQ------IGCGIMVQEKKVA
-t9              LTALKMLQLDIGFSAKTLGQ-NVVVPHLLGHRTWLATSPLQ------IGCGVMIFGNKIG
-t47             LTALKMLQLDIGFSAKTLCQ-NIVVAHLLGHRTWLATSPLQ------IGCMVMIFGNKIG
-t60             LTALKMLQLDIGFSAKTLGQ-NIVVPHCLGHRTWLATSPLQ------IGCMVMIFGNKIG
-t30             LTALKMLQLDIGFSAKTLGQ-NIIVPHCLGHRTWLATSPLQ------IGCMVMIVGNKIG
-t70             LTSLKMLQLDIGFCAKTLGQ-NIVVPKLLGHRTWLATAPLQ------IGCGMMIFGNKIG
-t91             LTSLKMLQLDIGFCAKTLGQ-NIVVPKLLGHRTWLATAPLQ------IGCGMMIFGNKIG
-t49             LTSLKMLQLDIGFSAKTLGQ-NIVPPKLLGHRTWLATSPLQ------IGCGVMIFGNKIG
-t52             LTALKMLQLDIGFSAKTLGQ-NIVAPKLLGVRTWLATSPLQ------IGCGVMIFGNKIG
-t43             LTALKVVQLDIGFSSKTLGQLNIIDCKLLGHRTWLATSPLQ------IGVDVMVMGNKIG
-t1              LTALKIVQLDIGFSAKTLGQLNIIDCKLLGRHTWLATSPLQ------IGCDMMVMGNKIG
-t86             LTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIG
-t72             LTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIG
-t96             LTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVIGNKIG
-t44             LTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDIMVMGNKIG
-t45             LTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIG
-t74             LTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVVGNKIG
-t26             LTALKIVQLDIGFSQKTLGQ-NIIDSKHLGHRTWLATSPLQ------IGCSAMVMGNKIG
-t61             LTALKIVQLDIGFSSKTLGQ-NIIHSKLLGHRTWLATSPLQ------IGCDVMVMGNKIG
-t97             LTALQIVQLDIGFSAKTLGQ-NIIHSKLLGHRTWLATSPLQ------IGCDVVVMGNKIG
-t17             LTALKIVQLDIGFSAKTLGQ-NIIDSKLLGHRTWLATSPLQ------IGCDVMVVGNKIG
-t11             LTALKIVQLDIGFSAKTLGQ-NIIDSKLLGHRTWLATSPLQ------IGCDVMVVGNKIG
-t23             LCLLKVIQLDMGVSGKTLGQ-NIVMAKLLGERTWLATSPLQ------IGCDVVAVGKKPE
-t76             LTGDQLVQLAD----NTCAW-NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------
-t53             LAGDQLVQLAD----NTCAW-NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------
-t16             LAGDQLVQLAD----NTCLW-NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------
-t42             LAGNQLIQLSD----VTCAW-NLFEC--LGDSESLFGSPLAIKVDEDRGFTAP-------
-t24             LAGNQLVQLAD----ITCAW-NLFEC--LGDSESLFGSPLAIKVDEDRGFTAP-------
-                
-
-t73             SEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKGKNPQEMRG------NNVMSESLGDD
-t66             SEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKRKNPQEMRG------NNVMSESLGDD
-t32             SEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKGKNPQEMRG------NNVMSESLGDD
-t75             SEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKGKNPQEMRK------NNVISESLGDD
-t79             SAN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-t27             SAN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-t93             SAN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-t59             SGN-NYNQAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-t7              SGN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-t78             SGN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-t12             ------------------------------------------V------NNVLSQSLGDD
-t81             SAE-DYNRAADPTTISFCRKPIVQH-ADVFGCDRDKDPQEMRT------NNVISESLGDD
-t21             SAE-DYNRAADPTTIAFCRKPIVQH-ADVFGCDKDKDPQEMRM------NNVISESLGDD
-t80             SHGLNYNRAADPTTICFYKKPIVVQGADVFGCARGKDPQEMKA------NNVISGSLGDD
-t14             SHGLNYNRAADPTTICFYKKPIVVQGADVFGCARGKDPQEMKA------NNVISGSLGDD
-t85             SHGLNYNRAADPTMICFYKKPIVVQGADIFGCARGKDPQEMKS------NNVISGSLGDD
-t62             SHGLQYNRAADPTTICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDD
-t19             SHGLQYNRAADPTTICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDD
-t77             SYGLQYNRAADPTTICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDD
-t88             SKK-EYELAADQVIIYFYQAPIIYVKADVFSGTVAKKAQAMR-------KSTGSQSIGDD
-t37             SKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-t35             SKK-DYELAADPVIIYFYQAPIIYHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-t48             SKK-DYELAADPVIIYFYQAPIIYHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-t55             SKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-t46             SKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-t67             SKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKAQAMRS------RSIGSPSVGDD
-t57             SKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKAQAMRS------RSIGSPSVGDD
-t56             SNK-DYELAADPVIIYFYQAPIIHHKADVFSGTVAKKAQAMRQ------QSTGSQSVGDD
-t13             SKK-DYEVAADPVIMYFYDAPMIMRPTDVFEGTNNKKAQAMRS------RSTASQSIGDD
-t5              SKK-DYEVAADPVIMYFYDAPMIMRPTDVFEGTNNKKAQAMRS------RSTASQSIGDD
-t38             SKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-t33             SKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-t100            SKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-t34             SKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-t84             SKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-t92             SKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-t3              SKK-DYEIAADPVIKYFYQAPIIMRRTDVFEGTDDQKAQAMRV------RSTASQSIGDD
-t22             SKH-DYEIAADPVIMYFYQAPIIMRRTDVFEGTDDQKAQAMRL------RSTASRSIGDD
-t64             SKK-DYEIAADPVIMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDD
-t18             SKK-DYEIAADPVIMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDD
-t68             SKK-NYEIAADPVIMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDD
-t28             SKK-DYEIAADPVIMYFYQAPIIMRRTDVFEGTNNKKSQAMRV------QSTSSQSIGDD
-t82             SKK-DYEIAADPVIMYFYQAPIIMQRTDVFEGTNNKKSQAMRV------HSTSSQSIGDD
-t41             SKK-DYEIAADPVIMYFYQAPIIMQRTDVFEGTNNKKSQAMRV------HSTSSQSIGDD
-t71             SKK-DYEIAADPAIMHFYRAPIIMRRTDVFEGTNNKKAQAMRI------RSTASQSIGDD
-t94             SKK-DYEIAADPAIMYFYQATIIMRRTDVFEGTNNKKAQAMRM------RSTASQSIGDD
-t99             SKK-DYEIAADPVIMYFYQSPIIMRRTDVFEGTNNKKAQAMRV------RSTASQSIGDD
-t40             SKK-DYEIAADPVIMYFYQSPIIMRRTDVFEGTNNKKAQAMRI------RSTASQSIGDD
-t90             SKK-DYEIAADPVIMYFYQSPIIMRRTDVFEGTNNKKAQAMRV------RSTASQSIGDD
-t4              SKK-DYEIAADPVIMYFYQSPIIMRHTDVFEGTNNKKAQAMRL------RSTASQSIGDD
-t36             SPK-EFEVAADPTVIYFYRNLIIQKITDVLSAVRMESPQEMRT------QDVNSSSLGDN
-t87             SGK-EFEVAADPTVIYFYRNLIIAKITDVLSAVRMESPQEMRE------QDVNSSSLGDN
-t89             SPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-t39             SPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-t8              SPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-t6              SPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-t58             SPK-EFEVAADPTVIYFYRNLIIQHITDVLSAVRMDSPQEMRV------QDVNSPSLGDN
-t54             SPK-EFEVAADPTVIYFYRNLIIQHITDVLSAVRMDSPQEMRV------QDVNSPSLGDN
-t65             SPQ-EVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPVLVCIQKVDSVSLGDD
-t29             SPQ-EVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPVLVCIQKVDSVSLGDD
-t98             SPQ-EVEVAAD---IYFYRNMVVQRHTDVVAAVRMQSPQEMRNPVLVCIQKVDSASLGDD
-t83             SPQ-EVEVAAD---IYFYRNMVVQRHTDVVAAVRMQSPQEMRNPVLVCIQKVDSISLGDD
-t95             SPQ-QVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRCRKLVCIQKVDSPSLGDD
-t20             SPQ-QVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPKLVCIQKVDSPSLGDD
-t69             SPQ-EVEVAAD---IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDD
-t2              SPQ-EVEVAAD---IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDD
-t10             SPQ-EVEVAAD---IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDD
-t31             SPQ-EVE-AAD---IFFYRNMVIQRLTDVVAAVRMQSPQEMRPPVLVCIQYVDSPSLGDD
-t15             SPQ-EVEVAAD---IYFYRNMVIQTLTDVVAAVRMQSPQEMRPPVLVCIQDVDSVSLGDD
-t63             SPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDD
-t50             SPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDD
-t25             SPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDD
-t51             SPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRPPVLVCIQDVDSPSLGDD
-t9              SAN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDD
-t47             SAN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRE------QDVDSHSLGDD
-t60             SEN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDD
-t30             SEN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDD
-t70             STQ-EFEAAADPTVIYFYRNRIVRRMADVISTVRMKSPQEMRG------QDVDSHSLGDD
-t91             STQ-EFEAAADPTVIYFYRNRIVRRMADVISTVRMKSPQEMRG------QDVDSHSLGDD
-t49             STQ-EFESAADPTVIYFYRNRIVKRMADVISTVRMKSPQEMRG------QDVDSHSLGDD
-t52             STQ-EFEAAADPTVIYFYRNRIIRRVADVISTVRMKSPQEMRE------QDVDSHSLGDD
-t43             SPS-EFEVAADPTIIWFYRNCIVHKLADTVSTAKMKSPQEMRH------QDVDSPSLGDD
-t1              SPS-EFEVAADPTIIWFYRDCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDD
-t86             SPS-EFEVAADPTIIWFYRNCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDD
-t72             SPS-EFEVAADPTIIWFYRNCIVHKLADTVSTAKMKAPQEMRH------QDVDSPSLGDD
-t96             SPS-EFEIAADPTIIWFYRNCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDD
-t44             SPS-EFEVAADPTIIWFYRNCIVHKLADVVSTAKMKSPQEMRV------QDVDSPSLGDD
-t45             SPA-EFEVAADPTIIWFYRNCIVHKLADLVSTAKMKSPQEMRV------QDVDSPSLGDD
-t74             SPA-GFEVAADPTIIWFYRNCIVHKLADLVSTAKMKSPQEMRV------QDVDSPSLGDD
-t26             SPQ-EVELAADPTVIYFYRNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDD
-t61             SPQ-EVELAADPSVIYFYQNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDD
-t97             SPQ-EVELAADPSVIYFYQNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDD
-t17             SPQ-EFELAADPTVIYFYRNCIVQKLADVVSTVKMKSPQEMRV------QDVDSPSLGDD
-t11             SPQ-EFELAADPTVIYFYRNCIVQKLADVVSTVKMKSPQEMRV------QDVDSPSLGDD
-t23             SPQ-EFECAADPTVIYFYKNLIIQQAADYVSAVQVKSPQEMRY------QDVNSPSDGDE
-t76             SK-------VEPKCAQFYSKSCTHC----------------TM------CSVGSHASEED
-t53             SK-------VEPKCAQFYSKSCTHC----------------TM------CSVGSHASEED
-t16             SK-------VEPKCAQFYSKSCTHC----------------TM------CSVGSHASEED
-t42             SK-------VEPKCAQFYSKSCTHH----------------MM------CSVGSNASEED
-t24             SK-------VEPKCQQFYSKSCTHC----------------VM------CSVGSNASEED
-                
-
-t73             NLQD--MSGVPVTVCTSSVMVRKDMQD-SVDKRGCTWNAKE-DHLCPSSFCKGER---ED
-t66             NLQD--MSGVPVTVCTSSVMVRKDMQD-SVDKRGCTWNAKE-DHLCPSSFCKGER---ED
-t32             NLQD--MSGVPVTVCTSSVMVRKDMQD-SVDKRGCTWNAKE-DHLCPSSFCKGER---ED
-t75             NLQD--MPGMPVTVCTSSVMVRKDMHQ-SVDKRGYTWHAKE-DHLCPDSFCKGEK---EE
-t79             SLQQ--MPAVPVDVCVMSVMVNKSMPQ-SHDKRGYTWQAKQ-DHLFPVNVVKGEQ---EE
-t27             SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNCVKGEQ---EE
-t93             SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNCVKGEQ---EE
-t59             SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNFVKGEQ---EE
-t7              SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNFVKGEQ---EE
-t78             SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNFVKGEQ---EE
-t12             SLQQ--MHAMPVTVVVVSHMVKKSMPQ-SHDKRGYTWQAKDFDQLIPVSFVKGEQ---EE
-t81             FLQQ--MPAVPVSVCVYSHMVKKFVPQ-SHEKRGYTWKAKE-DHLVPISYCKGEH---EE
-t21             FLQQ--MPAVPVSVCVHSHMVKKFVPQ-SHEKRGVTWKAKE-DHLVPISLCKGEH---EE
-t80             RLQQ--MPAMPVTICVSSYMVKKSVIQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---DE
-t14             RLQQ--MPAMPVTICVSSYMVKKSVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---DE
-t85             RLQH--MPAMPVTICVFSYMVKKAVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---DE
-t62             RLQQ--MPAMPVTICVFSYMVKKSVPQ-SHVKRGYTWRAKE-DHLIPVSFCKGEL---EE
-t19             RLQQ--MPAMPVTICVFSYMVKKLVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---EE
-t77             RLQQ--MPAMPVTICVFSYMVKKSVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---EE
-t88             GMQS--MPLMQNAVCVWSKMVRKVQPD-GQDKREQTWMAKD-DTLCPPSMKRGEK---TA
-t37             GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AA
-t35             GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AA
-t48             GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AA
-t55             GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AA
-t46             GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DALCPPCKEQGEK---AA
-t67             GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWVAKD-DTLCPPCKEQGEK---AA
-t57             GMQK--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWVAKD-DTLCPPCKDQGEK---AA
-t56             GTQV--MPLMQNLVCVWSKMVRKCMID-GQEKREQTWMAKD-DKLCPPSQEQGEK---AA
-t13             DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKD-DTLCPQSRDQGEK---HH
-t5              DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKD-DTLCPQSRDQGEK---HH
-t38             DMLN--MPLTQNAMCVESEMVRKSQPD-GQDKRGYTWVAKE-DDLCPQSGDQGEK---YA
-t33             DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YA
-t100            DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSEDQGEK---YA
-t34             DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YA
-t84             DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YA
-t92             DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YA
-t3              DMLI--MPLVQNAMCVKSEMVRKCQPD-GPDKRGYTWMAKD-DTLCPVSAGQGEK---YA
-t22             DMLI--MPLVQNAMCVNPEMVRKCQPD-GQDKRGYTWMAKN-DTLCPVSAGQGEC---YA
-t64             DMLK--MPLVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YA
-t18             DMLK--MPLVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YA
-t68             DMLK--MPLRQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YA
-t28             DMLN--MPLVQNAMCVSSEMVRKCQPD-GQNKRGCTWMAKN-DTLCPQSGNQGEK---FA
-t82             DMLN--MPLVQNAMCVSSEMVRKCQPD-GQNKRGYTWMAKH-DTLCPQSGNQGEK---YA
-t41             DMLN--MPLVQNAMCVSSEMVRKCQPD-GQNKRGYTWMAKH-DTLCPQSGNQGEK---YA
-t71             DMLN--MPLHQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSPNQGEK---YA
-t94             DMLN--MPLHQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLYPQSANQGEK---YA
-t99             EMLN--MPLVQNAMCVPSEMVRKCQPD-GQDKRGYTWMAKD-DPLCPQSANVGEK---YA
-t40             EMLN--MPQVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANVGEK---YA
-t90             EMLN--MPLVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YA
-t4              EMLN--MPLIQNAMCVQSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQLHNQAEK---YA
-t36             NGQA--MNIVPYWVCVASGVVRKTHKD-SVDKRGQTWTAKS-DFLCPLAVDQGEP---GA
-t87             NGQA--MNIVPYWVCVGSGVVRKTHKD-SVDKRGQTWTAKS-DFLCPLAMDQGEI---GA
-t89             NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AA
-t39             NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AA
-t8              NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AA
-t6              NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AA
-t58             NGQA--MNIVPYWVCVVSGVVRKTHKD-SVEKRGQTWTAKS-DFLCPIAVNQGEP---GA
-t54             NGQA--MNIVPYWVCVVSGVVRKTHKD-SVEKRGQTWTAKS-DFLCPIAVNQGEP---GA
-t65             DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPAAVNEGEH---GA
-t29             DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GA
-t98             DPQM--MKIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GA
-t83             DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GA
-t95             DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GA
-t20             DPQC--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GA
-t69             VPQM--MNIVPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAMNEGEH---GA
-t2              VPQM--MNIVPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAMNEGEH---GA
-t10             VPQM--MNIVPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAMNEGEH---GA
-t31             TPQM--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKA-DFLCPPAVSEGEH---GA
-t15             TPQM--MNIAPYWVCVCSGVVKKTQPD-SVDKRGKTWVAKS-DFLCPPAVSEGEH---GA
-t63             TPQK--MNIAPYWVCVCSGVVKKAQLD-SVEKRGKTWVAKS-DFLCPPAVSEGEH---GP
-t50             TPQK--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAVSEGEH---GP
-t25             TPQK--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAVSEGEH---GP
-t51             TPQM--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAISEGEH---GA
-t9              DNQA--MVILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKV-DFLCPPAFNQGEH---RA
-t47             DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKM-DFLCPPAFNQGEH---RA
-t60             DNQA--MNILPYVVCVCSGVVRKDHPDTSIHKRGRTWLAKV-DFLCPPAFNQGEH---RA
-t30             DNQA--MNILPYVVCVCSGVVRKEHPDTSISKRGRTWLAKI-DFLCPPAFNQGEH---RA
-t70             DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKI-DFLFPPAFNQGEH---HA
-t91             DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKI-DFLFPPAFNQGEH---HA
-t49             DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKI-DFLFPPAFNQGEH---HA
-t52             DNQA--MTILPHWVCVVSGVVRKEHPDTSINKRGSTWLAKV-DFLCPPAFNQGEH---HA
-t43             DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---ER
-t1              DQQE--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---EA
-t86             DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---GA
-t72             DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFKQGEH---EA
-t96             DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---EA
-t44             DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFEQGEH---EA
-t45             DQEA--MDILPYWVCVMSGVVRKEQPD-SVNKRGRTWLAKK-DFLVPPAFNQGEH---EA
-t74             DQEA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKK-DFLVPPAFNQGEH---EA
-t26             DQQP--MNIIPYWVCVTSGVVHKEQPD-SVNKRGRTWTAKN-DFLCPDAFNQGEH---GA
-t61             DQQP--MNIIPYWVCVTSGVVRKEQPD-SVNKRGHTWTAKN-DFLCPPAYNQGEH---GA
-t97             DQQP--MNIIPYWVCVTSGVVRKEQPD-SVNKRGRTWSAKN-DFLCPPAFNQGEH---GA
-t17             NQQS--MNIIPYWVCVHSGVVQKEQPD-SVHKRGRTWTAKN-DFLCPPAFDQGEH---GA
-t11             NQQS--MNIIPYWVCVHSGVVQKEQPD-SVHKRGRTWTAKN-DFLCPPAFDQGEH---GA
-t23             NGQS--MHIGPYWVCVSSEVVKKSQPD-SVDKRGRTWVAKN-EFLCPPDHMQGEHSIEGA
-t76             ALDLYTHKPVPDAQCFVSRVARNIPEH-SPCK----------------------------
-t53             ALDLYTHRPVPDAQCFVSRVARNIPEH-SPCK----------------------------
-t16             ALDLYTHKPVPDAQCFVSRVARNIPEH-SPCK----------------------------
-t42             ALELYTHKPVPDPQCFVSIVVRNIPEH-SPCK----------------------------
-t24             ALELYTHKPVPDPQCFVSIVVRNIPEH-SPCK----------------------------
-                
-
-t73             EPGGVTQ-----------------RCIENIAKLLYIKDV-LCNEVLNGLQWQLCWSV-GD
-t66             EPGGVTQ-----------------RCIENIAKLLYIKDV-LCNEVLNGLQWQLCWSV-GD
-t32             EPGGVTQ-----------------RCIENIAKLLYIKDV-LCNDVLNLLVWQLCWSV-GD
-t75             EPGGVRR-----------------RIVENIVKLLYIKDV-LCNQVLNLLQWQLCWSV-GD
-t79             EPEGADQ-----------------RTVHDMVRLLYSKDV-DCNMVLSLLVWQLC--H-GD
-t27             EPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVWQLC--H-GD
-t93             EPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVWQLC--H-GD
-t59             EPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIDLSLLVWQLC--H-GD
-t7              EPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVWQLC--H-GD
-t78             EPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVWQLC--H-GD
-t12             EPEGPNN-----------------RVVHNIVKLLYTKDV-DCNTVLSLLIWQLC--H-GD
-t81             EPEGAQY-----------------RVVQNIVKLLYTKDV-DCNVVLSLLVWQLC--H-GD
-t21             EPEGAQY-----------------RCVQNIVKLLYTKDV-DCNVVLSLLVWQLC--H-GD
-t80             EPDAAQQ-----------------RIVQNIVKLLYTKDV-SCNVVLSMLIWQIC--H-GD
-t14             EPDAAQQ-----------------RIVQNIVKLLYTKDV-SCNVVLSMLIWQIC--H-GD
-t85             EPDGAQQ-----------------RVVQNIVKLLYTKDV-SCNKVLSMLIWQIC--H-GD
-t62             EPEGAQH-----------------RMVQNIVKLLYTKDV-SCNVVLSMLIWQIC--H-GD
-t19             EPEGAKQ-----------------RMVQNIVKLLYTKDV-SCNVVLSMLIWQIC--H-GD
-t77             EPEGAQQ-----------------RIVQNIVKLLYTKDI-SCNVVLSMLIWQIC--H-GD
-t88             EPTQWMG-----------------TVTVNKIKLLYCKDC-SCNEVMKILSWWLCNSV-GD
-t37             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t35             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t48             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t55             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t46             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t67             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t57             EPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAWWLCDSV-GD
-t56             EPTQWED-----------------ICTANVIKLLYCKDC-SCNEVLRVLSWWLCDSV-GD
-t13             EPHHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t5              EPHHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t38             EPQHIRN-----------------QFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t33             EPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t100            EPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t34             EPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t84             EPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t92             EPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t3              EPHQIKN-----------------KFSVNVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t22             EPHQTCN-----------------KFRVNVIKLLYCKDC-SCNKVLKILKWQLCESV-DD
-t64             EPHVIGD-----------------KVSVNVIKLLYCKDC-SCNQVLKILVWQLCESV-DD
-t18             EPHVIGD-----------------KVSVNVIKLLYCKDC-SCNQVLKILIWQLCESV-DD
-t68             EPVVIGD-----------------KVSVNVIKLLYCKDC-SCNQVLKILVWQLCESV-DD
-t28             EPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKMLKILVWQLCESV-DD
-t82             EPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t41             EPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t71             EPHQIRN-----------------KISVNVIKLLYCKDC-SCNQVLKILVWQLCESV-DD
-t94             EPHQIRN-----------------KISVNVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t99             EPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVWQLCDSVQDD
-t40             EPHQIRN-----------------KVSTNVIKLLYCKDC-SCNKVLKILVWQLCDSV-DD
-t90             EPHQIRN-----------------KVSTNVIKLLYCKDC-SCNKVLKILVWQLCDSV-DD
-t4              EPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVWQLCESV-DD
-t36             EQKPAVGEENPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t87             EQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t89             EQRPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t39             EQRPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t8              EQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t6              EQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t58             EQKPAVGA-NPIVKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t54             EQKPAVGA-DPIVKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKWQLCDSH-GD
-t65             EQRP-FGTQNPVCKPWRFVIMNTQTFAKNIIRLLYIKDI-SCNQVLQLLDWQLCDSH-GD
-t29             EQRPVFGTHNPVCKPWRFVIMHTQTFSKNIIRLLYIKDI-SCNQVLQLLDWQLCDSH-GD
-t98             EQRPVFGTQNPVCKPWRFVIMNTQTFSKNIIRLLYIKDI-SCNQVLQLLDWQLCDSH-GD
-t83             EQRPVFGTQNPVCRPWRFVIMNMQTFSKNIIRLLYIKDI-SCNQVLQLLDWQLCDSH-GD
-t95             EQRPVFGGQNPACKPWHFVIMNRQTFAKNMIRLLYIKDI-SCNEVLQLLDWQLCDSH-GD
-t20             EQRPVFGGQNPACQPWHFVIMNTQTFAKNMIRLLYIKDI-SCNQVLQLLDWQLCDSH-GD
-t69             EQRPVFGTQNPVCKPWRFVIMNTETFAKNIIRLLYVKDV-SCNQVLQLLDWQLCDSH-GD
-t2              EQRPVFGTQNPVCKPWRFVIMNVETFAKNIIRLLYVKDV-SCNQVLQLLDWQLCDSH-GD
-t10             EQRPVFGTQNPVCKPWRFVIMNVETFAKNIIRLLYVKDV-SCNQVLQLLDWQLCDSH-GD
-t31             EQRPVFGMQNPACKPWRFVIMNTQTFAKNIIRLLYIKDV-SCNAVLQLLDWQLCYSH-GD
-t15             EQRPVFGMRNPICKPWRFVIMNTQTFAKNIIRLLYVKDV-SCNAVLQLLDWQLCYSH-GD
-t63             EQRPVFGVQNPVCKPWRFVIMNTQTFAANIIRLLYVKDV-SCNAVLQLLDWQLCYSH-ED
-t50             EQRPVFGVQNPVCKPWRFVIMNTQT-AKNIIRLLYVKDV-SCNAVLQLLDWQLCYSH-GD
-t25             EQRPVFGMQNPVCKPWRFVIMNTQTFAKNIIRLLYVKDV-SCNAVLQLLDWQLCYSH-GD
-t51             EQRPVFGMQNPVCRPWRFVIMNTQTFAKNVIRLLYVKDV-SCNKVLQLLDWQLCYSH-GD
-t9              EQKPASKFEHPVCGPWEFVIVNYQTSAKDIILLLYIKDV-GCNCVLELLNWQLCTSH-GD
-t47             EQKPALKFKHPVCGPWEFVIVNYQTSAKDIILLLYIKDV-GCNCVLELLKWQLCTSH-GD
-t60             EQKPAFKFKHPVCGPWEFVIVNYQTEAKDIILLLYIKDV-GCNCVLELLEWQLCTSH-GD
-t30             EQKPAFKFKHPCCGPWEFVIVNYQTSAKDIILLLYIKDV-GCNCVLELLKWQLCTSH-GD
-t70             EQKPVFGFKHPHCGPWEFVICNYQTVAKDIILLLYIKDV-GCNCVLELLAWQLCTSH-GD
-t91             EQKPVFGFKHPHCGPWEFVICNYQTVAKDIILLLYIKDV-GCNCVLELLAWQLCTSH-GD
-t49             EQKPVFGFKHPHCGPWEFVICNYQTMAKDIILLLYIKDV-GCNCVLELLAWQLCTSH-GD
-t52             EQKPVFGFKHPHVGPWEFVICNYQTSAHDIILLLYIKDV-GCNCVLELLVWQLCTSH-GD
-t43             EQRPVYGFKHPGCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNWHLCDSH-GD
-t1              EQRPVYGFVHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t86             EQRPVYGFQHPRCRPWQFVIANYQTFAKNIIMLLYVKDV-SCNRVLQLLNWQLCDSH-GD
-t72             EQRPVYGFQHPRCRPWQFVIANYQSSAKNIIMLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t96             EQRPVYGFQHPRCRPWQFVIGNYQTSAKNIIMLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t44             EQCPVHGFKHPRCRPWQFVIADYQTSAKNIIMLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t45             EQKPVYGFDHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t74             EQKPVYGFDHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t26             EQKPTHGFEHPRCRPWQFVIPVYQTGAKNIILLLYIKDV-SVNGVLQLLIWQLCDSH-GD
-t61             EQKPVHGFEHPRCRPWQFVISVYRTGAKNINLLLYIKDV-SCNGVLQLLNWQLCDSH-GD
-t97             EQKPVHEFQHPRCRPWQFVISVYRTGAKNINLLLYIKDV-SCNGVLQLLNWQLCDSH-GD
-t17             EQKPVHGFEHPRCRPWQFVIANYQTGAKNIILLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t11             EQKPVHGFEHPRCRPWQFVIANYQTGAKNIILLLYVKDV-SCNGVLQLLNWQLCDSH-GD
-t23             EQKPFFGFAGPFPQPWQFVIVNPQTWAHNIIRLLYCKDV-SCNCVLTCLNWVLCDSH-GD
-t76             -P---CS-----------------VEEVCYCKVCDSKDVRAVKNAYQDLQVPLSKLK-AP
-t53             -P---CS-----------------VEEVCYCKVCDSKDVRAVKNAYQDLQVPLSKLK-AP
-t16             -P---CS-----------------VEEVCYCKVCDSKDVRAVKNAYQDLQVPLSKLK-AP
-t42             -P---CS-----------------VEEVAYCKNCDSKDVRAVQNAYQDLAVPLSKLK-AP
-t24             -P---CS-----------------VEEVCYCKNCDSKDVRATQNAYQELAIPLSKLK-AP
-                
-
-t73             WESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEG
-t66             WESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEG
-t32             WESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEG
-t75             WESLVPQACWGAKKDLAVCAWKMELVPGL---NRNNENLAKIIYFGPDGH-------DEG
-t79             WEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEG
-t27             WEPLLPQACEGARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEG
-t93             WEPLLPQACEGARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEG
-t59             WEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEG
-t7              WEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEG
-t78             WEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEG
-t12             WEQLVPQACAGARSDLAVCAWKRELVPGL---NHNNENLAKVIYFGPDGH-------DEG
-t81             WEPLIPQACQTAKKDLAVCAWKRELVPGL---NCNNEYLAKIIYFGPDGH-------DEG
-t21             WEPLVPQACQTAKKDLAVCAWKRELVPGL---NCNNEYLAKIIYFGPDGH-------DEG
-t80             WEPQIPKACSNARKDLAVCAWKRELVPGL---NHNNENLAKIMYFGHDGH-------DEG
-t14             WEPQIPKACSNARKDLAVCAWKRELVPGL---NHNNENLAKIMYFGHDGH-------DEG
-t85             WEPQIPKACNAARKDLAVCAWKRELVPGL---NHNNEDLAKIMYFGPDGH-------DEG
-t62             WEPQIPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEG
-t19             WEPQIPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEG
-t77             WEPQLPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEG
-t88             WQTLMSQACITADPNPPVCVWKRELVPGL---NRSVENLAKIIYFCPDEH-------DER
-t37             WQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t35             WQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t48             WQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t55             WQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t46             WQSLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t67             WQTLMNDACSSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t57             WQTLMNDACSSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t56             WRTLMSDACALANPNPPVCVWKRELVPGL---NRNVENLAKIIYFCPDEH-------DER
-t13             WQTLSSDACMHAEQNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEG
-t5              WQTLSSDACMHAEQNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEG
-t38             WQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEG
-t33             WQTLASDACVSAEPNTPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEG
-t100            WQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEG
-t34             WQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEG
-t84             WQTLASDACVSAEHNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEG
-t92             WQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEG
-t3              WVTLASDACLSAEPQPPVCVWQRELVPQL---NRNVEDLARVIYFGPDEH-------DEG
-t22             WQTLASDACILAKPQPPVCVWQRELVPQL---NRNVEDLARVIYFGPDEH-------DEG
-t64             WQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t18             WQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t68             WQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t28             WQTLASDPCVSAEPNSPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t82             WQTLASDPCMSAEPNPPVCVWQRELVPQL---NRNVEDLARTIYFGPDEH-------DEG
-t41             WQTLASDPCMSAEPNPPVCVWQRELVPQL---NRNVEDLARTIYFGPDEH-------DEG
-t71             WQTLTSDPCVPAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t94             WQTLTSDPCVPAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t99             WQPLTSDPCVNAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t40             WQTLTSDPCVSAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t90             WQTLTSDPCVSAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEG
-t4              WQTLTSDPCISAEPNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEG
-t36             WQSLYADSCPIA-VNAAVCGWKRELVPGL---NHSCEHLAKSVYFEPDGE-------GEG
-t87             WQSLYADSCPIA-INAAVCGWKRELVPGL---NHSCEHLAKSVYFEPDGE-------GEG
-t89             WQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEG
-t39             WQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEG
-t8              WQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEG
-t6              WQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEG
-t58             WQSLFADSCPTA-VNAAVCAWKRELVPGL---NHSCEHLAKSVYFEPDGE-------DEG
-t54             WQSLFADSCPIA-VNAAVCAWKRELVPGL---NHSCEHLAKSVYFEPDGE-------DEG
-t65             WQSLMADSCPNA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEG
-t29             WQSLMADSCPNA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEG
-t98             WQSLMADSCPPA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEG
-t83             WQSLMADSCPPA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEG
-t95             WQSLIADSCPNA-SNIAVCCWKRELMPGL---NFSCEHLAKTVYFKPDGE-------DEG
-t20             WQSLIADSCPNA-VNIAVCCWKRELMPGL---NFSCEHLAKTVYFKPDGE-------DEG
-t69             WQSLVADSCPNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEG
-t2              WQSMVADSCHNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEG
-t10             WQSMVADSCHNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEG
-t31             WQSLIADSCPTA-ANIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEG
-t15             WQSLIADSCSTA-ANIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEG
-t63             WQSLIADACPTA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEG
-t50             WQSLIADACSTA-VNIAVCCWKRELMPGL---NHSVEHLAKSVYFKPDGE-------DEG
-t25             WQSLIADACPTA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEG
-t51             WQSLIADACPAA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEG
-t9              WQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEG
-t47             WQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCDRLAKHIYFQPDGE-------DEG
-t60             WQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEG
-t30             WQSLVADSCVWA-HNVAVCEWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEG
-t70             WQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEG
-t91             WQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEG
-t49             WQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEG
-t52             WQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEG
-t43             WQSLVADSCCWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t1              WQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t86             WQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t72             WQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t96             WQSLVADSCMWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t44             WQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t45             WQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t74             WQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEG
-t26             WQSLVADSCAWA-VNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEG
-t61             WQSLVADSCAWA-VNVAVCGWKRELVPGL---NHACEMLAKSVYFEPDGE-------DEG
-t97             WQSLVADSCAWA-VNLAVCGWKRELVPGL---NHACEMLAKSVYFEPDGE-------DEG
-t17             WQSLSADSCAWA-HNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEG
-t11             WQSLSADSCAWA-HNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEG
-t23             WHSLIADACPCA-HNVAVCGWKRELVPGL---NHSNEHMAKTIYFEPDGH-------DEG
-t76             WLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEEN
-t53             WLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEEN
-t16             WLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEEN
-t42             WLSMGHCECWEEDINNILSMVKHELVVDQDMVNRSPEVAAKMAYFGPDGFHWDVELCEES
-t24             WLSMGHCECWEEGINNILSMVKHELVVDQDMVNRSPEVAAKMAYFGPDGFHWDIELCEEN
-                
-
-t73             PMQAKIVTLHW-EMDVSHRG-SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLAR
-t66             PMQAKIVTLHW-EMDVSHRG-SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLAR
-t32             PMQAKIVTLHW-EMDVSHRG-SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLAR
-t75             NMQAKIVTLHW-EMDVSHRG-SSVDDNVV-VVMLAFQASFCDPWGHYIQGLGD-QYKLAR
-t79             PMGQKIVDLHW-EMEASHRE-SSVRDNMI-VIMLPFNINSIDPWRHYILGLND-QIQLTR
-t27             PMGQKIVDLHW-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTR
-t93             PMGQKIVDLHW-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTR
-t59             PMGQKIVDLHW-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTR
-t7              PMGQKIVDLHW-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTR
-t78             PMGQKIVDLHW-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTR
-t12             PMGRKIVDLHW-EMEASHRD-SSVRDNML-VIMLPFLVNNLDPWRHYILGLND-QIQLTR
-t81             PMGRKIVDLHW-EMEASHRD-SSVRDNYI-VIMLPFKINSRDPWRHYILGIND-QVCLNR
-t21             PMGRKIIQLHW-EMEASHRD-SSVRDNII-VIMLPFKINSRDPWRHYILGLND-QVCLTR
-t80             PMGRKIVTLHV-EMEVSHRE-SSVKDNMIRVIMLPFSNSSVDPWRHVILGLND-QIKLTR
-t14             PMGRKIVTLHV-EMEVSHRE-SSVKDNMIRVIMLPFPSSSVDPWRHVILGLND-QIKLTR
-t85             PMGRKIVNLHV-EMEVSHRE-SSVKDNMIRVVMLPFDNNSWDPWRHVILGLND-QIKLTR
-t62             PMGEKIVNLHV-EMEASHRE-SSVKDNMIRVIMLPFSNNSWDPWRHVILGLND-KIKLTR
-t19             PMGEKIVNLHV-EMEASHRE-SSVKDNMIRVIMLPFSNNSWDPWRHVILGLND-QIKLTR
-t77             PMGEKIVNLHV-EMEASHRE-SSVKDNMIRVIMLPFGENSWDPWRHVILGLND-QIKLTR
-t88             KMWGKIFALEW-EMDISHRH-SSVDDNHC-VEMLPFMCQRVDPWGHYVQILAD-RQDLAR
-t37             RMWGKIFALEW-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTR
-t35             RMWGKIFALEW-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTR
-t48             RMWGKIFALEW-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTR
-t55             RMWGKIFALEW-EMDISHRH-SSVDDNQC-VELLPYNCQRMDPWGHYVQILAD-RLDLTR
-t46             RMWGKIFALEW-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQVLAD-RLDLTR
-t67             RMWGKIFALEW-EMDISHRM-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLVLTR
-t57             RMWGKIFALEW-EMDISHRV-SSVDDNQC-VELLPYLCQRMDPWGHYVQILAD-RLNLTR
-t56             KMWGKIFCLEW-EMDISHRH-SSVDDNVC-VEMLPFVCQKMDPWGHYVQILAD-RLDLTR
-t13             KMMNKIFALEW-EMDMSHRV-SSVDDNYI-IEMLPFVCDRVGPWGHYAQVLAD-QLHLTR
-t5              KMMNKIFALEW-EMDMSHRV-SSVDDNYI-IEMLPFVCDRVGPWGHYAQVLAD-QLHLTR
-t38             KMMCKIFALEW-EMDMSHRM-SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTR
-t33             KMMCKIFALEW-EMDMSHRM-SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTR
-t100            KMMCKIFALEW-EMDMSHRM-SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTR
-t34             KMMCKIFALEW-EMDMSHRM-SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTR
-t84             KMMCKIFALEW-EMDMSHRM-SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTR
-t92             KMMCKIFALEW-EMDMSHRM-SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTR
-t3              KMMPKIFKLAW-EMDMSHRA-SSVDDNYV-IEMLPFVCHRVGPWGHYAQVQAD-QQNLTR
-t22             KMMSKIFNLEW-EMDMSHRT-SSVDDNYV-IDMLPFICHRVGPWGHYAQVLAD-QINLTR
-t64             KMMSKIFALEW-EMDMSHRV-SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTR
-t18             KMMFKIFALEW-EMDMSHRV-SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTR
-t68             KMMSKIFALEW-EMDMSHRV-SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTR
-t28             KMMSKIFALEW-EMDMSHRI-SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLSD-QIVLTR
-t82             KMMSKIYALEW-EMDMSHRV-SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLAD-QIVLTR
-t41             KMMSKIYALEW-EMDMSHRV-SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLAD-QIVLTR
-t71             KMMRKIFALEW-EMDMSHRD-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTR
-t94             KMMRKIFALEW-EMDMSHRD-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-KLVLTR
-t99             KMMNKIFALEW-EMDMSHRDSSSVDDNYI-IEMLPFVCHRVGPWGHYAQQLAD-RLVLTR
-t40             KMMRKIFALEW-EMDMSHRN-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTR
-t90             KMMRKIFALEW-EMDMSHRN-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTR
-t4              KMMGKIFALEW-EHDMSHRD-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTR
-t36             KVMLKIFGLDWCEVERSHEH-SSVDDNYN-VNMLPFQNSRKDPVGHYVQDLED-ARRLIR
-t87             KVMLKIFGLDWCEVERSHEH-SSVDDNYN-VNMLPFQNSRKDPVGHYVQDLED-ARRLIR
-t89             KMMLKIFGLEWCEVERSHEH-SSIDDNYT-VNMLEFPNSRKDPVGHYVQNLED-AIRLIR
-t39             KMMLKIFGLEWCEVERSHEH-SSIDDNYT-VNMLEFPNSRKDPVGHYVQNLED-AIRLIR
-t8              KMMLKIFGLEWCEVERSHEH-SSIDDNYT-VNMLPFPNSRKDPVGHYVQDLED-AIRLIR
-t6              KMMLKIFGLEWCEVERSHER-SSIDDNYT-VNMLPFPNSRKDPVGHYVQDLED-AIRLIR
-t58             KMMLKIFGLDWCEVERSHEH-SSVDDNYN-VNMLPFPNSRQDPVGHYVQDLED-LLRLIR
-t54             KMMLKIFGLDWCEVERSHEH-SSVDDNYN-VNMLPFPNSRKDPVGHYVQDLED-LLRLIR
-t65             QMTMKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIR
-t29             QMSQKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELEDSALRLIR
-t98             QMTMKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIR
-t83             QMTMKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIR
-t95             QMIMKIFNLDWCEVEKSHEK-SSVDDNYD-VNMLPFMQSHGDPVGHYVQGLED-ALRLIR
-t20             QMIMKIFNLDWCEVEKSHEK-SSVDDNYD-VNMLPFMQSHGDPVGHYVQGLED-ALRLIR
-t69             QMIVKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIR
-t2              QMMVKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIR
-t10             QMMVKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIR
-t31             QMIMKIFNLDWCEVEKSHEK-SSVDDNYH-VNMLPFAQSNRDPVGHYVQGLED-ALRLIR
-t15             QMIVKIFHLDWCEVEKSHEK-SSVDDNYH-VNMLPFAQSNGDPVGHYVQGLED-ALRLIR
-t63             QMFMKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFVQSNGDPVGHYVQGLED-ALLLIR
-t50             QMIMKIFNLDWCEVEKSHEK-SSVDDNYN-VNMLPFVQSNGDPVGHYVQGLED-ALLLIR
-t25             QMIMKIFNLDWCEVEKSHEK-SSVDDNYD-VNMLPFVQSNGDPVGHYVQGLED-ALLLIR
-t51             QMIMKIFGLDWCEVEKSHEE-SSVDDNYN-VNMLPFVSSNGDPVGHYVQGLED-ALRLIR
-t9              KMVLKIFGLDWCEMEKSHQR-SGVDDNYQ-VNMLPFNHSKNNPVGHYVQGLED-ALNLIR
-t47             KMILKIFGLDWCEMEKSHQR-SGVDDNVQ-VNMLPFNHSKHNPVGHYVQGLED-ELNLIR
-t60             KMILKIFGLDWCEMEKSHQR-SGVDDNYQ-VNMLPFNHSKHNPVGHYVQGLED-ALNLIR
-t30             KMILKIFGLDWCEMEKSHQR-SGVDDNYQ-VNMLPFKHSKHNPVGHYVQGLED-ALNLIR
-t70             KMILKIFGLDWCEVERSHQR-SGVDDNYK-VNMLPFSHSKHNPVGHYVQGLGD-ALRLIR
-t91             KMILKIFGLDWCEVERSHQR-SGVDDNYK-VNMLPFSHSKHNPVGHYVQGLGD-ALRLIR
-t49             KMIIKIFGLDWCEVEKSHQR-SGVDDNYK-VNMLPFSHSNHNPVGHYVQGLGD-ALRLIR
-t52             KMILKIFELNWCEVEKSHQH-SGVDDNYQ-VNMLPFDHCKHNPVGHYVQGLED-ALGLIR
-t43             KMVLKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFLHSRQNPVGHYVQGLED-PMHLIR
-t1              KMVLKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFMQSRENPVGHYVQGLED-PMHLIR
-t86             KMVLKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFIHSRDNPVGHYVQGLED-PMHLIR
-t72             QMVLKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFIHSRENPVGHYVQGLED-PMHLIR
-t96             KMVLKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFIRSRENPVGHYVQGLED-PMHLIR
-t44             KMVLKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFMHSRENPVGHYVQGLED-PMHLIR
-t45             KMVHKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFFHSRENPVGHYVQGLED-PMHLIR
-t74             KMVHKIFELDWVEMEKSHQQ-SSVDDNYL-VNMLPFFHSRENPVGHYVQGLED-PMHLIR
-t26             KMVIKIFGLDWCEIEKSHQQ-SSVDDNYL-VNMLPFTHSRETPVGHYVQGLED-PMHLMR
-t61             KMVLKIFGLDWCEIEKSHQQ-SSVDDNYL-VNMLPFAHSRQTPVGHYVQGLED-PMHLMR
-t97             KMNLKIFGLDWCEIEKSHQQ-SSVDDNYL-VNMLPFTHSRETPVGHYVQDLED-PMHLMR
-t17             KMVIKIFGLDWCEMEKAHQQ-SSVDDNYL-VNMLPFTHSRENPVGHYVQGLED-PMHLIR
-t11             KMVIKIFGLDWCEMEKAHQQ-SSVDDNYL-VNMLPFTHSRENPVGHYVQGLED-PMHLIR
-t23             KMILNIFGLDWCEVETSHQE-SSSDDNHL-VNMLPFGVSRDDPVGHYMLGLED-AIRLYR
-t76             DLNCDDFELGW-NLKH-------EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQ
-t53             DLNCDDFELGW-NLKP-------EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQ
-t16             DLNCDDFELGW-NLKP-------EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQ
-t42             DLTVDDFELGW-VLKP-------EDDHPL-ICIGSFSVHKQFSVMVYPLPMND-AIRMSQ
-t24             DLTCDDFELGW-VLKP-------EDDHPL-ICIGSFSVHKQFSVMVYPLPMND-AIRMSQ
-                
-
-t73             PNT---AQKLSILT---VFHFSGGFRDKPM-ERSQLHS-TYSED----KKDQKVLIHAMK
-t66             PNT---AQKLSILT---VFHFSGGFRDKPM-ERSQLHS-TYSED----KKDQKVLIHAMK
-t32             PNT---AQKLSILT---VFHFSGGFRDKPM-ERSQLHS-TYSED----KKDQKVLIHAMK
-t75             PNT---ARQLSILV---VMHFSGGFRDKPI-ERSQLHC-TYSEN----KKDQKVVIRAMK
-t79             PNT---ARRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
-t27             PNT---ARRLSILH---VMHYSGAFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
-t93             PNT---ARRLSILH---VMHYSGAFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
-t59             PNT---ACRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
-t7              PNT---ACRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
-t78             PNT---ACRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
-t12             PNT---ARRLSILM---VMHYSGEFHDKSP-ERSQLHFDSYSEH----KNDHKCVILASK
-t81             PET---ARRLSILA---VMHYSGEFHDKSP-ERSHLHF-RYSEM----KNDVKCVI---K
-t21             PET---ARRLSILV---VMHYSGEFHDKSP-ERSHLHY-RYSEV----KNDVKCVILASK
-t80             PNT---AHRLSILV---VTHYSGGFHDKSA-ERSQHHF-IYNEV----KDDHKCVILASK
-t14             PNT---AHRLSILV---VTHYSGGFHDKSA-ERSQHHF-IYNEV----KDDHKCVILASK
-t85             PNT---AHRLSILV---VMHYSGGFHDKSS-ERSQHHF-IYNEV----KNDHKCVILASK
-t62             PNT---AHRLSILV---VMHYSGGFHDKSA-ERSQHHF-IYNEI----KNDHKCVILASK
-t19             PNT---AHRLSILV---VMHYSGGFHDKSA-ERSQHHF-IYNEI----KNDHKCVILASK
-t77             PNT---AHRLSILV---VMHYSGGFHDNSA-ERSQHHF-IYNEV----KNDHKCVILASK
-t88             PVT---LQALSILP---CPHASGKEQDGAV-ERSQHYV-VYAEL----QVDHKCTIAAHK
-t37             PVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-t35             PVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-t48             PVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-t55             PVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-t46             PVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-t67             PVT---LHGLSILP---CPHASGKEQDGAE-ERSQHYG-VYQEL----QNDAKSTIDANK
-t57             PVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDAKSTIDANK
-t56             PVT---LQGLGILV---CPHASGKEQDGAM-ERSQHYV-VYAEL----QNDHKNTINANK
-t13             PHT---LRDLYILAC--CPVASGKEQDGNK-ERSQHYT-IYAEI----QNDHKNPISANN
-t5              PHT---LRDLYILAC--CPVASGKEQDGNK-ERSQHYT-IYAEI----QNDHKNPISANN
-t38             PHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-t33             PHT---LRELYILA---CPVASGKEQDGAK-ERSQCYT-IYAEL----QNDHKSLISANH
-t100            PHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-t34             PHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-t84             PHT---LRELYILA---CPVASGKEQDGAK-ERSQCYT-IYAEL----QNDHKSLIAANH
-t92             PHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-t3              PHT---LADLFILS---CPVASGKEQDGAT-ERSQYYV-VYAEL----QNDHKSPISANK
-t22             PHT---LRDLFILA---CPVASGKEQDGAT-ERSQHYV-VYAEL----QNDHKSPISANK
-t64             PHT---LRDLFILS---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-t18             PHT---LRDLFILS---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-t68             PHT---LRDLFILS---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-t28             PHT---LRDLFILA---CRVASGGEVDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-t82             PHT---LRDLFILA---CPVASGGEQDGNA-ERSQHYI-VYAEL----VNDHKSPISANK
-t41             PHT---LRDLFILA---CPVASGGEQDGNA-ERSQHYI-VYAEL----VNDHKSPISANK
-t71             PHT---LRDLFILA---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-t94             PHT---LRDLFILA---CYVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPILANK
-t99             PHT---LRDIFILA---CPVASGGEQDGNT-ERSQHYI-VYAEL----QDDHKSPISANK
-t40             PHT---LRNIFILA---CPVASGGEQDENT-ERSQHYI-VYAEL----QNDHKSPIHANK
-t90             PHT---LRNIFILA---CPVASGGEQDENT-ERSQHYI-VYAEL----QNDHKSPINANK
-t4              PHT---LRDIFILA---CPVASGGEQDAVT-ERSQHYI-VYAEL----QNDHKSPISASK
-t36             PGT---ARSLTILF-YGCQYYSGEFQDCEI-ERSQLYN-VYCEH----KQDHKSAIIANK
-t87             PGT---ARSLTILF-YGCQYYSGEFQDCEI-ERSQLYN-VYCEH----KQDHKSAIIANK
-t89             PGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-VYCEL----KQDHKSAIIANK
-t39             PGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-VYCEL----KQDHKSAIIANK
-t8              PGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-VYCEL----KQDHKSAIIANK
-t6              PGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-IYCEL----KQDHKSAIIANK
-t58             PGT---ARSLTVLF-YGCQYYSGQFQDCEI-ERSQLYN-VYCEL----KQDHKSAIMANK
-t54             PGT---ARSLTVLF-YGCQYYSGEFQDCEI-ERSQLYN-VYCEL----KQDHKSAIMANK
-t65             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDYKSAIIANQ
-t29             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDYKSAIIANQ
-t98             PGT---ARALVILF-YGCQYYSGKFQDSEMFERSQLYR-VYCEI----KKDYKSAIIANQ
-t83             PGT---ARALVILF-YGCQYYSGKFQDSDMFERSQLYR-VYCEI----KKDYKSAIIANQ
-t95             PGT---ARALIILF-YGCQYYSGKFQDSELFERSQLYR-MYCEI----KKDHKSAIIANQ
-t20             PGT---ARALIILF-YGCQYYSGKFQDSELFERSQLYR-MYCEI----KKDHKSAIIANQ
-t69             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHNSAIIANQ
-t2              PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHNSAIIANQ
-t10             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHNSAIIANQ
-t31             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIIANQ
-t15             PGT---ARALVILS-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIVANQ
-t63             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIIANQ
-t50             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIMANQ
-t25             PGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSTIIANQ
-t51             PGT---ARALVILF-YGCQFYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIIANQ
-t9              PGT---ARALNILF-YGCEVYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIIAHK
-t47             PGT---ARALNILF-YGCEYYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIMACK
-t60             PGT---ARALNILF-YGCEYYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIMAYK
-t30             PGT---ARALNILF-YGCEYYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIMAYK
-t70             PGT---ARALNILF-YGCQYCSGEFQDSEE-ERSWIYN-VYCEI----KKDHKSAILAHK
-t91             PGT---ARALNILF-YGCQYCSGEFQDSEE-ERSWIYN-VYCEI----KKDHKSAILAHK
-t49             PGT---ARALNILF-YGCEYYSGEFQDSEE-ERSWIYN-VYCEI----KKDHKSAIMAHK
-t52             PGT---ARALNILF-YGCQYYSGEFQDSEA-ERSWIYN-VYCEI----KKDHKSGIMAHK
-t43             PGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVIAHK
-t1              PGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-t86             PGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYP-VYCEM----KKDHKSAVVAHK
-t72             PGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-t96             PGT---ARKLNILF-YGCEYYSGQFPDAEA-ERSWIYD-VYCEM----KKDHKSAVYAHK
-t44             PGT---ARKLNILF-YGCEYYSGQFPDCEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-t45             PGT---ARKLNILF-YGCQYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-t74             PGT---ARKLNILF-YGCQYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-t26             PGT---ARALNILF-YGCEYYSGQFPDGEP-ERSWIYD-VYCEL----KKDHKNAIVAVK
-t61             PGT---ARALNILF-YGCEYYSGHFPDGEA-ERSWIYD-MYCEL----KKDHKSAIVAVK
-t97             PGT---ARALNILF-YGCEYYSGHFPDGEP-ERSWIYD-MYCEL----KKDHKSAIVAVK
-t17             PGT---ARALNILF-YGCEYYSGQFPDGEP-ERSWIYD-VYCEL----KKDHKSAIVAVK
-t11             PGT---ARALNILF-YGCEYYSGQFPDGEP-ERSWIYD-VYCEL----KKDHKSAIVAVK
-t23             PGT---ARALNILF---VNYYSGDFQDPEL-ERSQLYN-VYCEQ----KQDHRNAIRASK
-t76             PCHAAHAQDIPTEQ---TRYQIHTFLDDSI-RRDLCNQ-GCHEENMVWRDDLKDPISTEV
-t53             PCHAAHAQDIPTEQ---TRYQIHTFLDDSI-RRDLCNQ-GCHEENMVWRDDLKDPISTEV
-t16             PCHAAHAQDIPTEQ---TRYQIHTFLDDSI-RRDLCNQ-GCHEENMVWRDDLKDPISTEV
-t42             PCHAAHAQDIHTDQ---DRYDVRTFLGHSI-KCHMCNQ-ACHEENIVWRDDLKDPITTEV
-t24             PCYAAHAQDIHTDQ---DRYDIRTFLEHSI-RCHLCNQ-ACHEENIVWRDDLKDPITTEV
-                
-
-t73             -RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAHFVVFL-ISDATR
-t66             -RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAHFVVFL-ISDATR
-t32             -RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAHFVVFL-LSDATR
-t75             -RNKGCDWHAGKD-MAGGPK-IIYVGMLFY-------AESNWAKQKAHFVVFL-ISDATR
-t79             -HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVR
-t27             -VNKDHDWITGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVR
-t93             -VNKDHDWITGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVR
-t59             -HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVR
-t7              -HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVR
-t78             -HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVR
-t12             -HNKGLDWATGKDDMKGGAK-IMMSGALFY-------AEQNWIRARNHFVIFL-ICDAVR
-t81             -SNKGLDWTAGKDGMKGEAK-AMMNGALFY-------AEQNWFRKKNHFVIFV-FCDAVR
-t21             -SNKGLDWTAGKDGMKGENK-AMMNGTLFY-------AEQNWFRQKNHFVIFV-ICDAVR
-t80             -CNKGLDWAAGKD-MKGGAK-VMMNGALFY-------AERNWIRQKHHFVIFV-VCDAVR
-t14             -CNKGLDWAAGKD-MKGGAK-IMMNGALFY-------AERNWIRQKHHFVIFV-VCDAVR
-t85             -SNKGLDWAAGKD-MKGGAK-MMANGALFY-------EERNWIRQKNHFVIFV-VCDAVR
-t62             -ANKPLDWAAGKD-MKGGAK-MMANGALFY-------AERNWIRQKNHFVIFI-ICDAVR
-t19             -ANKGLDWAAGKD-MKGGAK-MMVNGALFY-------AERNWIRQKNHFVIFV-ICDAVR
-t77             -ANKGLDWAAGKD-MKGGAK-MMVNGALFY-------AERNWIRQKNHFVIFV-ICDAVR
-t88             YQDKMKDWDTGKN-MDEGAK-MYVEIHLFY-------AENNIRRQNDHSVIFW-ISDAKK
-t37             NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEHSVTFV-ISDAQK
-t35             NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEHSVTFV-ISDAQK
-t48             NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLIKQNEHSVTFV-ISDAQK
-t55             NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEHSVTFV-ISDAQK
-t46             NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKQNEHSVTFV-ISDAQK
-t67             NPNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKLNEHSVTFV-ISDAQK
-t57             NPNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKQNEHSVTFV-ISDAQK
-t56             VPRKMLDWDTGKN-MDKGAKGMYHEIVLFF-------AENNVKKQVEHSVIFI-IADAQK
-t13             QPNKMLDWDTGKT-MDRGAA-MCGEIKLFY-------AEPNVWNQNDHSVMFI-ISDAQN
-t5              QPNKMLDWDTGKT-MDRGAA-MCGEIKLFY-------AEPNVWNQNDHSVMFI-ISDAQN
-t38             VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQN
-t33             VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQN
-t100            VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQN
-t34             VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQN
-t84             VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQN
-t92             VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQN
-t3              HPDKMLDWDTGKS-MDRGAA-MCREIKLFY-------AEPNVWKQNDHSVVFI-ISDAVN
-t22             HPNKLLDWDTGKT-MDRGAA-MCHEIKLFH-------AEPNVWRQNDHSVMFI-ISDASN
-t64             HLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDHSVMFI-ISDAQN
-t18             HLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDHSVMFI-ISDAQN
-t68             HLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDHSVMFI-ISDAQN
-t28             VLNKMLDWDTGKT-MDREAA-MCREIKLFY-------AETNVWKQNDHSVMFI-ISDAQN
-t82             VLNKMLDWDTGKT-MDREAA-MCRDIKLFY-------AETNVWKQNDHSVMFI-ISDAQN
-t41             VLNKMLDWDTGKT-MDREAA-MCRDIKLFY-------AETNVWKQNDHSVMFI-ISDAQN
-t71             HMNKMLDWDTGKT-MDFEAA-MCREIKLFY-------AETNVWKINDHSVMFI-VSDAQN
-t94             VVNKMLDWDMGKT-MDFEAA-MCREIKLFY-------AETNVWKQNNHSVMFI-VSDAHN
-t99             HMRKMLDWDTGKT-MDREAA-VCREIKLFY-------AETNCWKQNDHSVMFI-VSDAQN
-t40             VMNKMLDWDTGKT-MDREAA-MCREIKLFV-------AETNVWKQNDHSVMFIVISDAQN
-t90             VMNKMLDWDTGKT-MDREAA-MCREIKLFV-------AETNVWKQNDHSVMFIVISDAQN
-t4              HMNKMLDWDTGKT-MDREAA-MCREIKLFY-------AETNVWKQNDHSVMFI-ISDAQN
-t36             QEQKGMDWNTGKE-MEQGPK-IILHGSLFF-------AEPNIVRQPGVSHIFI-GNDARR
-t87             QEQKGMDWNTGKE-MEQGPK-VILHGTLFF-------AESNIVRQPGVSHIFI-GNDARR
-t89             QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFT-ENDARR
-t39             QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFT-ENDARR
-t8              QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFT-ENDARR
-t6              QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFI-ENDARR
-t58             QEQKGMDWNTGKE-MEQGPK-IILHGVLFF-------AEPNVVRQPGVSHIFV-GNDARR
-t54             QEQKGMDWNTGKE-MEQGPK-IILHGVLFF-------AEPNVVRQPGVSHIFV-GNDARR
-t65             QEHKGMEWDTGKE-MQQGPK-VVVHLALFYAPSNVLAAEPNIIGQPQVSHVFV-GNDARR
-t29             QDHKGMEWDTGKE-MQQGPK-VVVHLALFYMPSNVLAAEPNIIGQPQVSHWFV-GNDARR
-t98             QEHKGMEWDTGKE-MQQGPK-IVVHLGLFYMPSNVLAAEPNIIGQPQVSHVFV-ANDARR
-t83             QEHKGMEWDTGKE-MQQGPQ-IEVHLALFYMPSNVLPAEPNIIGQPQVSHVFV-GNDARR
-t95             QEHKGMEWDTGKE-MQQGPK-VVLHHALFYAPSNVLAAEPNIIGQPQVSHVFV-GNDARR
-t20             QEHKGMEWDTGKE-MQQGPK-VVLHHALFYAPSNVLAAEPNIIGQPQVSHVFV-GDDARR
-t69             QEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQVSVVFV-GNDGRR
-t2              QEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQVSVVFV-GNDARR
-t10             QEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQVSVVFV-GNDARR
-t31             HEVKGMDWNTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIVGQPQVSHVFV-GNDARR
-t15             QEVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIVGQPQVSHVFV-GNDARR
-t63             QGVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIIGQPQVSHVFV-DNDARR
-t50             QGVKGMDWDTGKE-MQQGPK-IVMHLALFYAPSNVLAAEPNIIGQPQVSHVFV-DNDARR
-t25             QGVKGMDWDTGKE-MQQGPK-IVVHLTLFYAPSNVLAAEPNIFGQPQVSHVFV-DNDARR
-t51             QGVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIIGQPQVSHVFV-DNDIRR
-t9              YEHKGMDWDTGKE-AQQGPE-VVHHNLLFF-------AEPNIHGQPGVGHIFV-GNDARR
-t47             YRHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIQGQPGVGHIFV-GNDARR
-t60             FEHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIQGQPGVGHIFV-GNDARR
-t30             YEHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIHGQPGVGHIFV-GNDARR
-t70             YKHKGMDWDTGKE-MEQGPK-VVNYNLLFY-------AEPNIHGQPRVGHIFV-GNDAHR
-t91             YKHKGMDWDTGKE-MEQGPK-VVNYNLLFY-------AEPNIHGQPRVGHIFV-GNDAHR
-t49             YEHKGMDWDTGKE-MEQGPK-VVHHNILFY-------AEPNIHGQPRVGHIFV-GNDAVR
-t52             YDHKGVDWDTGKE-MEQGPK-VLHHNLLFY-------AEPNIHGQPTVGHIFV-GNDARR
-t43             HEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t1              VEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t86             AEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t72             VEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t96             VEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t44             HEHKGMDWDTGKE-MNQGPK-VVMHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t45             HQHKGMDWDTGKE-MNQGPK-VVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t74             HQHKGMDWDTGKE-MNQGPK-VVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATR
-t26             HEHKGMDWDTGKE-MNHGPK-VIVHGVLFH-------AEPNIGGQPGVSHVFV-GNDATR
-t61             HCHKGMDWDTGKE-MNHGPK-VIIHGLLFH-------AEPNIGGQPGVSHVFV-GNDATR
-t97             HCHKGMDWDTGKE-MNHGPK-VIIHGVLFH-------AEPNIGGQPGVSHVFV-GNDATR
-t17             HEHKGMDWDTGKE-MNQGPK-VIIHGVLFH-------AEVNIHGQPGVSHVFV-GNDATR
-t11             HEHKGMDWDTGKE-MNQGPK-VIIHGILFH-------AEVNIHGQPGVSHVFV-GNDATR
-t23             NDHKGMAWDTAKD-MEQGPK-MVEHQVLFY-------AEPNMHGQPEVIHIFI-GNDAMC
-t76             IADKLHEWPTNVN-KENSAD----HRQLFH-------ANSSALDKHQHNVVMN-GSPCIR
-t53             IADKLHEWPTNQN-KENSAD----HRQLFH-------ANSSALDKHQHNVVMN-GSPCIR
-t16             IADKLHEWPTNQN-KENSAD----HRQLFH-------ANSSALDKHQHNVVMN-GSPCIR
-t42             IAEKLQEWPTNQN-KENVAD----HRQLFH-------ANSSALDKHRHNVMMN-GSACIR
-t24             IADKLQEWPTNQN-AENVAD----HRQLFH-------ANSSCLDRHRHNVMMN-GSSCIR
-                
-
-t73             LLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSNVDIKIFDTCFRSAVYAVDNS
-t66             LLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSNVDIKIFDTCFRSAVYAVDNS
-t32             LLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSNVDIKIFDTCFRSAVYAVDNS
-t75             LLIHHVGCMIEYTFMEFACHPFFAELFMEHMVIRYQYYNNVDIKIFDTCFRGAVYAEDNS
-t79             ILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYINNHDIKIKDTVFRLAVYAWDNF
-t27             ILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENF
-t93             ILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENF
-t59             ILILHHGCMTDHTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENF
-t7              ILILHHGCMTDRTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENF
-t78             ILILHHGCMTDRTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENF
-t12             ILIVLHGCMTAWTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTEFRLAVYAWENS
-t81             ILIMHSGVMIGYTFMEFACNPFFAELFMEHVMVRYQYESNHDIKIKDTCFRLAVYAWENS
-t21             ILIVHSGVMTGFTFMEFACNPFFAELFMEHVYIRYQYQANHDIKIKDTCFRLAVYAWENS
-t80             ILIVHYGCMIGYTFMDFACNPFFAELFMDHVFIRYVYMNNHDIKIMDTCFRVAVYTWENS
-t14             ILIVHYRCMIGYTFMDFACNPFFAELFMDHVFIRYQYMNNHDIKIMDTCFRVAVYTWENS
-t85             ILIVHYGCMVPYTFMAFACNPFFAELFMEHVFIRYQYVNNHDIKIMDTCFRVAVYTWENS
-t62             ILIVHYGCMVGDTFMDFACNPFFAELFMEHVFIRYQYIPNHDIKIMDTCFRVAVYTWENS
-t19             ILIVHYGCMVGDTFMDFACNPFFAELFMEHVFIRYQYIPNHDIKIMDTCFRVAVYTWENS
-t77             ILIVHYGCMVGDTFMDFACNPFFAELFMEHVVIRYQYIPNHDIKIMDTCFRVAVYTWENS
-t88             RLICGMSSMCLVTFMTLACNPLFAKLFMEVVPMRYDYLTNHDIKI------MEVYAPENS
-t37             RLICGVSSMVMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENS
-t35             RLICGVSSMAMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENS
-t48             RLICGVSSMVMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENS
-t55             RLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENS
-t46             RLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPDNS
-t67             RLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENS
-t57             RLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENS
-t56             RLICGVSSMCLQTFMNLACNPFFAKLFMEVIPMRYDYQTNHDIKI------KEVYAPENS
-t13             RLIVANSIMVGQTFMAMACNPHFSKLFMEVVCMRYNYTSNHSIKI------FEVYADENS
-t5              RLIVANSIMVGQTFMAMACNPHFSKLFMEVVCMRYNYTSNHSIKI------FEVYADENS
-t38             KLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------FEVYADENS
-t33             RLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------FEVYADENS
-t100            RLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------FEVYADENS
-t34             RLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------LEVYADENS
-t84             RLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------LEVYADENS
-t92             RLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------LEVYADENS
-t3              RLICANSIMCGLTFMAMACNPHFAKLFMEVVCMRYDYFSNHSIKI------FEVYAEDDS
-t22             RLICANSIMCGLTFMAMACNPHFAKLFMEVVCMRYEYFSNHSIKI------FEVYAEENS
-t64             RLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGANHDIKI------FEVYAAENS
-t18             RLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGANHDIKI------FEVYAAENS
-t68             RLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGANHDIKI------FEVYAVENS
-t28             RLICGNSIMCGITFMAMACNPHFAKLFMEVACMRYDYFANPDIKI------FEVYAAENS
-t82             RLICGNSIMCGLTFMAMACNPHFAKLFMEVACMRYDYFANPDIKI------FEVYADENS
-t41             RLICGNSIMCGLTFMAMACNPHFAKLFMEVACMRYDYFANPDIKI------FEVYADENS
-t71             RLICGNSIMCGLTFMAMACNPHFAKLFMEGVCMRYDYSANHDIKI------FEVYADENS
-t94             RLICGNSIMCALTFMAMACNPHFAKLFMEAVCMRYDYSANHDIKI------VEVYADENS
-t99             RLICGSSIMCRLTFMAMAVNPHFAKLFMEDVCMRYDYSPNHDIKI------FEVYADENS
-t40             RLICGSSIMCRLTFMAMAVNPHFAKLFMEESCVRYDYSANHDIKI------FEVYANENS
-t90             RLICGSSIMCGLTFMAMAVNPHFAKLFMEESCVRYDYSRNHDIKI------FEVYANENS
-t4              RLICGSSIMCGLTFMATACNPHFAKLFMEEVCMRYDYAANHDIKI------SEVYAEENS
-t36             VLICGKSMMPGHRFMREACVPFFHKLFMAVNQMRYDYMMNYDIKIYETHWRMGVYALDNS
-t87             VLICGLSMMPGHRFMREACVPFFHKLFMAVNQMRYDYMVNYDIKIYETHWRMGVYALDNS
-t89             MLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYVTNYDIKIYETHWRVGVYAIDNS
-t39             MLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYVTNYDIKIYETHWRVGVYAIDNS
-t8              MLICGNSMMPRHRFMREACVPFFHKLFMAANQMRYDYVTNYDIKIYETHWRVGVYAIDNS
-t6              MLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYMTNYDIKIYETHWRVGVYAIDNS
-t58             MLICGLSMMPGHRFMKEACVPFFHKLFMAVRRMRYDYMSNYDIKIYETHWRPGVYALDNS
-t54             MLICGLSMMPGHRFMKEACVPFFHKLFMAVRRMRYDYMTNYDIKIYETHWRPGVYALDNS
-t65             MLIVGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYMWNYDIKIYETHFRMGVYAVDNS
-t29             MLIVGVSMMPAYKFMREACVPFFRKLFMADNQVRYDYMWNYDIKIYETHFRMGVYAVDNS
-t98             MLIVGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWNYDIKIYETHFRMGVYAVDNS
-t83             MLIVGVSLMPAYKFMREACVPFFRKLFMAENQVRYDYMWNYDIKIYETHFRMGVYAVDNS
-t95             MLITGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWNYDIKIYETHYRMGVYAVDNS
-t20             MLITGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWNYDIKIYETHYRMGVYAVDNS
-t69             MLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYAWNYNIKIYETHFRDGVYAVDNS
-t2              MLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYNWNYNIKIYETHFRVGVYAVDNS
-t10             MLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYNWNYNIKIYETHFRVGVYAVDNS
-t31             MLIVGVSVMPSYKFMREACVPFFHKLFMADNQVRHEYMWNYDIKIYETHFRMGVYAVDNS
-t15             MLIVGVSVMPAYKFMREACVPFFHKLFMAENQVRHDYMWNYDIKIYETHFRMGVYAVDNS
-t63             MLIVGQSVMPPYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAIDNS
-t50             MLIVGQSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAVDNS
-t25             MLIVGQSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAVDNS
-t51             MLIVGVSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAVDNS
-t9              KLIAGVSFMSMVKFMCEACVPFFRKLFMAVGQMRYDYVNNYDIKIWETVFRGGVYAIENS
-t47             KLIAGLSFMAMMKFMCEACVPFFRKLFMAVGHMRYDYVSNYDIKIWETVFRGGVYAIENS
-t60             KLIAGVSFMAVMKFMCEACVPFFRKLFMAVGQMRYDYMNNYDIKIWETFFRGGVYAIENS
-t30             HLIAGVSFMAVVKFMCEACVPFFRKLFMAVGQMRYDYVNNYDIKIWETVFRGGVYAIENS
-t70             KLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNNYDIKIWETAFRGGVYAIENS
-t91             KLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNNYDIKIWETAFRGGVYAIENS
-t49             NLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNNYDIKIWETAFRGGVYAMENS
-t52             KLIAGVSFMSVVKFMCEACVPFFRKLFMAFRQMRYDYVNNYDIKIWETVFRGGVYAIENS
-t43             KLITGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYNVNYDIKIWETHIRHGVYAVENS
-t1              KLITGVSVMPTYKFMCGACVQFFHKLFMAVRNMRYDYTVNYDIKIWETHIRQGVYAVENS
-t86             KLITGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHIRHGVYAVENS
-t72             KLITGFSIMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHIRHGVYAVENS
-t96             KLISGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDVKIWETHIRHGVYAVENS
-t44             KLITGVSVMPTYKFMCNACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHMRHGVYAVENS
-t45             KLIPGVSVMHDYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHLRHGVYAVENS
-t74             KLIPGVSVMHDYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHLRHGVYAVENS
-t26             KLIAGVSVMPIVKFMCGACVPFFRKLFMALRNMRYDYASNYDIKIVETHLREGVYAVENS
-t61             KLIAGASVMFIVKFMCGACVPFFRKLFMALRNMRYDYSQNYDIKIVETHLREGVYAIENS
-t97             KLIAGVSVMPIVKFMCGACVPFFRKLFMALRNMRYDYSQNYDIKIVETHLREGVYAVENS
-t17             KLIAGVSVMPFVKFMCGACVPFFRKLFMALRNMRYDYTSNYDIKIIETHLRNGVYAVENS
-t11             KLIAGVSVMPFVKFMCGACVPFFRKLFMALRNMRYDYTSNYDIKIMETHLRNGVYAVENS
-t23             MLIPGMSVMVHHKFMRAACMPFFNKLFMAVRYMRYDYVDNYDIKIDETRYRDGVYARRNS
-t76             ALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCAMNITIQCLHTGEGVMCNVKC
-t53             ALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCAMNITIQCLHTGEGVVCNVKC
-t16             ALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCAMNITIQCLHTGEGVVCNVKC
-t42             TLIIGGSIVGVNVFMMEPCQEFFTDLFMVYEGLQYAVVCAVNIIIQCLHTNEGVVCNVKC
-t24             TLIIGGSIVGVNVFMMGPCQEFFTDLFMVYEGLQYAVVCAINIIIQVLHTNEGVVCNVKC
-                
-
-t73             WETLCDY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMR
-t66             WETLCDY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMR
-t32             WETLCDY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMR
-t75             WETLCGY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMR
-t79             WETLCKC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPL
-t27             WETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPL
-t93             WETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPL
-t59             WETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPL
-t7              WETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPL
-t78             WETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPL
-t12             WETLCNC-EMLSGHIGAKINHNPRLFEQVC-PPCELTVSGLKGKH-VGWPYLTDITRTPL
-t81             WETLCNV-EMLSGHFGAKINHVPRLPEQVC-PPCDLTVSGLKGKQ-NGLPYLTDITRTPL
-t21             WETLCNV-EMLSGHFGAKINHVPRLPEQVC-PPCDLTVSGLKGKQ-NGWPYLTDITRTPL
-t80             WETCFNR-EMLSGTFGAKISHNPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPL
-t14             WETCCNR-EMLSGTFGAKISHNPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTEITRTPL
-t85             WETCCNR-EMLSGTFGAKISHNPRLPEQVI-PPCDLTVSGLKGKH-NGWPYLTDITRTPL
-t62             WETCCNR-EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPL
-t19             WETCCNR-EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPL
-t77             WETCCNR-EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPL
-t88             WETIKNV-EMVSGKEGAEINHTPQLPEQVI-PPCNLTVSNLKGMI-PPCPALTEITRTV-
-t37             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP-
-t35             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP-
-t48             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP-
-t55             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP-
-t46             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP-
-t67             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP-
-t57             WETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP-
-t56             WETIKNV-EMVSGKAGKQINHEPQLPEQVI-PPCSLTVSNLKGMM-PPCPAMTEITRTV-
-t13             WENVRNF-EMVSGRAGAHINHIPQLPEQAY-PPCKLTVSNLKGVA-ASCPAITEITRTA-
-t5              WENVRNF-EMVSGRAGAHINHIPQLPEQAY-PPCVLTVSNLKGVA-ASCPAITEITRTA-
-t38             WENIRNF-EMVSGRAGAYINHIPQLPEQAV-PPCHLTVSNLKGVA-ASCPAITEITRTA-
-t33             WENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAITEITRTA-
-t100            WENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAITEITRTA-
-t34             WENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA-
-t84             WENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA-
-t92             WENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA-
-t3              WENICNF-EMMSGRTGAQINHIPQLPEQVC-PPCHLTVSNLKGCC-ASVPAITEITRTV-
-t22             WENVCNF-EMMSGRAGAQINHIPQLPEQVC-PPCVLTVSNLKGCC-ASCPANTEITRTV-
-t64             WENARNF-EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV-
-t18             WENARNF-EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV-
-t68             WENARNF-EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV-
-t28             WENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV-
-t82             WENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV-
-t41             WENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV-
-t71             WENVRNF-EMMSGRAGAQINH-PQLPEQVCNPPCHLTVSNLKGVC-ASCPAITEITRTV-
-t94             WENVRNF-EMMSGRAGAQINH-PQLPEQVCNPPCHLTVSNLKGVC-ASCPAITEITRTV-
-t99             WENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV-
-t40             WENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASVPAITEITRTV-
-t90             WENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASVPAITEITRTV-
-t4              WENVRNF-EMMSGRAGAQINH-PQLPEQVV-PPCHLTVSNLKGVC-ASCPAITEITRTV-
-t36             WETLNVS-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPD
-t87             WETLNVS-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPD
-t89             WETLNVS-EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPD
-t39             WETLNVS-EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPD
-t8              WETLNVS-EMTSGRMGAKINHLPRLPEHVI-PPCMLTVSGLKDTM-AGMKQETEITKTPD
-t6              WETLNVS-EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPD
-t58             WETLNVS-EMTSGRIGAKINHLPRLPETVI-PPCVLTVSGLKDTM-AGMKHGTEITKTPD
-t54             WETLNVS-EMTSGRIGAKINHLPRLPETVI-PPCVLTVSGLKDTM-AGMKHGTEITKTPD
-t65             WETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTV-AGAPDETEITKSPV
-t29             WETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTV-AGAPDETEITKSPV
-t98             WETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCDLTVSGLKRTV-AGPPDETEITKSPV
-t83             WETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTI-AGAPDETEITKSPV
-t95             WETLVYC-EMTSGRIGAKVNHLPRLPEQVT-PPWVLTVSGLKRTV-AGAPDETEITKSPI
-t20             WETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPWVLTVSGLKRTV-AGAPDETEITKSPI
-t69             WETLVYV-EMASGRIGAKINHQPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPI
-t2              WETLVYV-EMASGRIGAKINHMPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPI
-t10             WETLVYV-EMASGRIGAKINHMPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPI
-t31             WETLVYC-EMTSGRIGANINHLPRLPEQVV-PPCILTVSGLKRTI-AGSPDETEITKTLI
-t15             WETLVYC-EMTSGRIGAKINHLPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLI
-t63             WETLVYC-EMTSGRIGAKINHQPRLPEQVV-PPCVLTVSGLKRTI-AGAPDETEITKTLI
-t50             WETLVYC-EMTSGRIGAKINHQPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLI
-t25             WEALVYC-EMTSGRTGAKINHQPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLI
-t51             WETLVYC-EMTSGRIGAKINHLPRLPEQVF-PPCILTVSGLKRTI-AGAPDETEITKTLI
-t9              WETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETK-AGLIDGTEITKTPD
-t47             WETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETK-AGIIDGTEITKTPE
-t60             WETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETR-AGIIEGTEITKTPD
-t30             WETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETR-AGIIDGTEITKTPD
-t70             WETLVLC-EMTSGRSGAKMNHLPRLFEQVC-PPCLLTVSGLKETV-AGIIDGTEITKTPE
-t91             WETLVLC-EMTSGRSGAKMNHLPRLFEQVC-PPCLLTVSGLKETV-AGIIDGTEITKTPE
-t49             WETLVLC-EMTSGRVGARMNHLPRLFEQVC-PPCILTVSGLKETV-AGVIDGTEITKTPE
-t52             WETLILC-EMTSGRCGAKMNHMPRLFEQVC-PPCILTVSGLKETM-AGVIDGTEITKTPD
-t43             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCVLTVSGLKQPM-AGYNDQTEITKTPD
-t1              WETLITC-EMTSGRIGAKINHLPRLPEQVV-PPCILTVSGLKQPM-AGYNDETQITKTPD
-t86             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNDETQITKTPD
-t72             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPV-AGYNDETQITKTPD
-t96             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNMETQITKTPD
-t44             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNDETEITKTPD
-t45             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGFVDETEITKTPD
-t74             WETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGFVDETEITKTPD
-t26             WETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQSV-SGYNDETEITKTPD
-t61             WETLVVC-EMTSGRMGAKINHLPRLPEQVI-PPCILTVSGLKRAV-NGYNDETEITKTPD
-t97             WETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQAV-NDCNDETEITKTPD
-t17             WETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKQAM-AGVNDETEITKTPD
-t11             WETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKQAM-AGVNDETEITKTPD
-t23             WETANVC-EMSSGRSGAKINHNPRLPEQVT-PPRSLTVSGLKDTM-PGHPDVTEITKTPV
-t76             KEFLQREDEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPL
-t53             KEFLQREDEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPL
-t16             KEFLQREDEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPL
-t42             KEFLQREEDMKSGLIGIICNHISRMCMHIL-VVCLLTHCGLKAME-IPFDI-TGVVRGPL
-t24             KEFLQREDDMKSGLIGIICNHISRMCMHIL-VHCLLTHCGLKAME-IPFDR-TGVVRGPL
-                
-
-t73             IQIAIRVSGSE-SENVVLQYCLYYEENKSIR-----------QNNTGSADLPK-------
-t66             IQIAIRVSGSE-SENVVLQYCLYYEENKSIR-----------QNNTGSADLPK-------
-t32             IQIAIRVSGSE-SENVVLQYCLYYEENKSIR-----------QNNTGSADLPK-------
-t75             IQIPIRISGSE-SENVVLQYCLYYEENKSIR-----------QNNTGSAVLPK-------
-t79             IRIKIREPGSE-SENTVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t27             IRIKIREPGSE-SENTVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t93             IRIKIREPGSE-SENTVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t59             IGIKIREPGSQ-SENTVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t7              IGIKIREPGSQ-SENTVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t78             IGIKIREPGSQ-SENTVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t12             IRIQIREPGSE-CENSVVMYVIYYKERKSIR-----------QNNTGCAKLPQ-------
-t81             IRIQIRVPGSE-SENVVVMYMVYYKERKSIR-----------QNNTGCANLPQ-------
-t21             IRIQIRVPGSE-SENITVMYMVYYKERKSIR-----------QNNTGCANLPQ-------
-t80             IKIHIRVPGSQ-SENHVVMYCVYYKEHKSIR-----------QNNTGCANLPQ-------
-t14             IKIHIRVPGSQ-SENHVVMYCVYYKEHKSIR-----------QNNTGCANLPQ-------
-t85             IKIHIRIPGSQ-SENHVVMYCVYYKEHKSIR-----------QNNTGCANLPQ-------
-t62             IRIHIRVPGSE-SENHVVMYCVYYKEHKSIR-----------QNNTGCANLPQ-------
-t19             IRIHIRVPGSE-SENHVVMYCVYYKEHKSIR-----------QNNTGCANLPQ-------
-t77             IRIHIRVPGSE-SENHVVMYCVYYKEHKSIR-----------QNNTGCANLPQ-------
-t88             -FIV--MYYAI-LRNKIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t37             -FIV--MYVAI-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t35             -FIV--MYVAI-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t48             -FIV--MYVAI-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t55             -FIV--MYVAI-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t46             -FIM--MYVAM-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t67             -FIV--MYVAI-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t57             -FIV--MYVAI-LRNDIMQYCFYYKENRSVR-----------LNNTGRAELPK-------
-t56             -III--MYYAI-LRNEIMQYCFYYKENRSVR-----------INNTGQAELPK-------
-t13             -VIV--MYGSI-LRNDVMQYVFYYRENRSVR-----------QNNTGNAELPK-------
-t5              -VIV--MYGSI-LRNDVMQYVFYYRENRSVR-----------QNNTGNAELPK-------
-t38             -VIV--MYVSI-LRNDVMQYVFYYRENRIVR-----------QNNTGVAELPK-------
-t33             -VIV--MYVSI-LRNDVMQYVFYYRENRIVR-----------QNNTGVAELPK-------
-t100            -VIV--MYVSI-LRNDVMQYVFYYRENRIVR-----------QNNTGVAELPK-------
-t34             -VIV--MYVSI-LRNDVMRYVFYYRENRIAR-----------QNNTGVAELPK-------
-t84             -VIV--MYVSI-LRNDVMRYVFYYRENRIAR-----------QNNTGVAELPK-------
-t92             -VIV--MYVSI-LRNDVMRYVFYYRENRIAR-----------QNNTGVAELPK-------
-t3              -VIC--MYVSI-LCNVVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t22             -VIC--MYVSI-LRNVVMQYVFYYKENRSVR-----------QNNTGAAELPK-------
-t64             -VIC--MYVSI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t18             -VIC--MYVSI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t68             -VIC--MYVSI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t28             -VIC--MYVSI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t82             -VIC--MYISI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t41             -VIC--MYISI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t71             -VIV--MWISI-LRNDVMQYVVYYKENRSVR-----------QNNTGKAELPR-------
-t94             -VIV--MWISI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPR-------
-t99             -VIC--MYVSI-LRNDVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t40             -VIC--MYISI-LRNNVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t90             -VIC--MYISI-LRNNVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t4              -VIC--MYVSI-LRNVVMQYVFYYKENRSVR-----------QNNTGKAELPK-------
-t36             IKIY--MWGTINFKNRVMQYCNYYKENRSVR-----------INNTGLAELPK-------
-t87             IKIY--MWGTICFKNRVMQYCNYYKENRSVR-----------INNTGLAELPK-------
-t89             IEIY--MWGTINFKNQVMQYCNYYKENRSVR-----------INNTGGAELPK-------
-t39             IEIY--MWGTINFKNQVMQYCNYYKENRSVR-----------INNTGGAELPK-------
-t8              IEIY--MWGTINFKNQVMQYCNYYKENRSVR-----------INNTGGAELPK-------
-t6              IEIY--MWGTINFKNQVMQYCNYYKENRSVR-----------INNTGGAELPK-------
-t58             IKIH--MWGTINFKNKVMQYCTYYKENRSVR-----------INNTGGAELPK-------
-t54             IKIH--MWGTINFKNKVMQYCTYYKENRSVR-----------INNTGGAELPK-------
-t65             IHIV--MWADIMFKNCVMQYCTYYKENRSVR-----------ANNTGGAELPK-------
-t29             IHIV--MWADIMFKNCVMQYCTYYKENRSVR-----------ANNTGGAELPK-------
-t98             IHIV--MWADIVFKNCVMQYCTYYKENRSVR-----------ANNTGGAELPK-------
-t83             IHIV--MWADIMFKNCVMQYCTYYKENRSVR-----------ANNTGGAELPK-------
-t95             IHII--MWEEIMFKNCVMQYCTYYKENRSVR-----------ANNTGGAELPK-------
-t20             IHII--MWEDIMFKNCVMQYCTYYKENRSVR-----------ANNTGGAELPK-------
-t69             IHIV--MWADIMFKNCVMQYCNYYKENRSVR-----------VNNTGGAELPK-------
-t2              IHIV--MWADIMFKNCVMQYCNYYKENRSVR-----------VNNTGGAELPK-------
-t10             IHIV--MWADIMFKNCVMQYCNYYKENRSVR-----------VNNTGGAELPK-------
-t31             YHIV--MWADIMFKNCVMQYSTYYKENRSVR-----------ANNTGGAELPK-------
-t15             YHIV--MWADIMFKNCVMQYSTYYKENRSVR-----------GNNTGGAELPK-------
-t63             YHIV--MWADIMFKNCVMQYSTYYKENRSVR-----------VNNTGGAELPK-------
-t50             YHIV--MWADIMFKNCVMQYSTYYKENRSVR-----------VNNTGGAELPK-------
-t25             YHIV--MWADIMFKNCVMQYSTYYKENRSVR-----------VNNTGGAELPK-------
-t51             YHIV--MWADIMFKNCVMQYATYYKENRSVR-----------VNNTGGAELPK-------
-t9              IGIC--MWETIHFKNPVMQYCCYYKENRSVR-----------VNNTGGAALPK-------
-t47             IGIC--MWDTIEFKNPVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t60             IGIC--MWDTIHFKNPVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t30             IGIC--MWDTIHFKNPVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t70             IGIC--MWDTIHFKNPVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t91             IGIC--MWDTIHFKNPVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t49             IGIC--MWDTIHFKNPVMQYCCYYKEPRSVR-----------VNNTGGAELPK-------
-t52             IGIG--MWDSIHFKNPVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t43             ICIC--TWGTIHFKNFVMQYCVYYKENRSVR-----------VNNTGGAELPQ-------
-t1              ICIC--TWGTIHFKNSVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t86             ICIC--GVGTIHFKNLVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t72             ICIC--TWGTIHFKNSVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t96             ICIC--TWGTIHFKNSVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t44             ICIC--TWGTIHFKNSVMQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t45             ICIC--TWGTIHFKNSVVQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t74             ICIC--TWGTIHFKNSVVQYCCYYKENRSVR-----------VNNTGGAELPK-------
-t26             IKIC--TWGTIHFKNSVMQYCCYYKENRSVR-----------LNNTGGAELPK-------
-t61             IKIC--TWGTIHFKNSVMQYCCYYKENRSVR-----------FNNTGGAELPK-------
-t97             IKIC--TWPTIHFKNGMMQYCCYYKENRSVR-----------FNNTGGAELPK-------
-t17             IKIC--TWGTIHFKNFVMQYCVYYKENRSVR-----------FNNTGGAELPK-------
-t11             IKIC--TWGTIHFKNFVMQYCVYYKENRSVR-----------FNNTGGAELPK-------
-t23             IAIV--MWGTINLKNHVMQYCCYYKETRSVR-----------VNNTGGAELPK-------
-t76             IAEP--LYLVI-YVNAVEPYTDAYKKPKSMHQFQFDDCQIRYRTNTGFEETPVGATHLTH
-t53             IAEP--LYLVI-YVNAVEPYTDAYKKPKSMHQFQFDDCQIRYRTNTGFEETPMGATHLTH
-t16             IAEP--LYLVI-YVNAVEPYTDAYKKPKSMHQFQFDDCQIRYRTNTGFEETPMGATHLTH
-t42             ITEP--LYLII-YVNAVEPYTDAYKKPKSMHQFQFDDVQIRYRTNTGFEENPKLATHLVH
-t24             IAEP--LYLII-YVNAVEPYTDAYKKPKSMHQFQFDDVQIRYRTNTGFEENPKLATHLVH
-                
-
-t73             --------------DRLVNSFVD-ELYNSI---YTAAPKKK--RHL-GIGDNGGMELVRE
-t66             --------------DRLVNSFVD-ELYNSI---YTAAPKKK--RHL-GIGDNGGMELVRE
-t32             --------------DRLVNSFVD-ELYNSI---YTAAPKKK--RHL-GIGDNGGMELVRE
-t75             --------------DRLVNNFVD-ELYNSV---YTAAPKKK--RHL-GIGDNGGMELVRE
-t79             --------------ARLVNKVVD-ELYNNV---YHAIPKKE--MNQ-GVGDSGGVEMVQE
-t27             --------------ARLVNKVVD-ELYNNV---YHAIPKKD--MNQ-GVGDSGGVEMVQE
-t93             --------------ARLVNKVVD-ELYNNV---YHAIPKKD--MNQ-GVGDSGGVEMVQE
-t59             --------------HRLVNKVVD-ELYNNV---YHAIPKKD--MNQ-GVGDSGGVEMVQE
-t7              --------------HRLVNKVVD-ELYNNP---YHAIPKKD--MNQ-GVGDSGGIEMVQE
-t78             --------------HRLVNKVVD-ELYNNP---YHAIPKKD--MNQ-GVGDSGGIEMVQE
-t12             --------------HRLVNKVVD-ELYNNV---YHAIPKKD--INV-GVGDSGGMEVVQE
-t81             --------------HRLVVKVAD-ELYNNI---YHAIPKKD--GVLLGIGDSGGMEMVQE
-t21             --------------HRLVVKVAD-ELYNNI---YHAIPKKD--GVLLGIGDSGGMEMAQE
-t80             --------------HRLVDQVVD-ELYSKF---YHAIPKKP--GNM-GVGDSGGMEMVQE
-t14             --------------HRLVDQVVD-ELYSKF---YHAIPKKP--GNM-GVGDSGGMEMVQE
-t85             --------------HRLVDKVVD-ELYSKF---YHAIPKKP--GNM-GIGDSGGMEMVQE
-t62             --------------HRLVDRVVD-ELYSKF---YHAIPKKP--GNM-DVGDSGGMEMVME
-t19             --------------HRLVDKVVD-ELYSKF---YHAIPKKP--GNM-DVGDSGGMEMVME
-t77             --------------HRLVDKVVD-ELYSKF---YHAIPKKP--GNM-DVGDSGGMEMVME
-t88             --------------HHMQNIFID-ELYPGG---YHAAPKKE--EMV-GPGDNGGVEDIKE
-t37             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-t35             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-t48             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-t55             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-t46             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-APGDNGGVEAIRE
-t67             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-APGDNGGVEAIRE
-t57             --------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-APGDNGGVEAIRE
-t56             --------------HHVQNVFID-ELYPGH---YHAAPKKN--ENV-GPGDNGGVEGIKE
-t13             --------------HHMQDVFID-ELYLGP---YHASPKKD--RFC-NPGDNGGMETYQE
-t5              --------------HHMQDVFID-ELYLGP---YHASPKKD--RFC-NPGDNGGMDTYQE
-t38             --------------HHMQDVFID-ELYLGP---YHASPKKE--RFC-NVGDNGGMETIQE
-t33             --------------HHMQDVFID-ELYLGP---YHASPKKE--RFC-NPGDNGGMETIQE
-t100            --------------HHMQDVFID-ELYLGP---YHASPKKE--RFC-NPGDNGGMETIQE
-t34             --------------HHMQDIFID-ELYLGP---YHASPKKQ--RFC-NPGENGGMETIRE
-t84             --------------HHMQDIFID-ELYLGP---YHASPKKE--RFC-NPGENGGMETIRE
-t92             --------------HHMQDIFID-ELYLGP---YHASPKKE--RFC-NPGENGGMETIRE
-t3              --------------HHMQDIFID-ELYPGQ---YHASPKKK--KIC-GPGDNGGMETIEE
-t22             --------------HHMQDIFID-ELYPGL---YHASPKKK--KVC-GPGDNGGMETIQE
-t64             --------------HHMQDIVID-ELYPGP---YHATPKKH--RFC-GTGDNGGMQAIQE
-t18             --------------HHMQDIFID-ELYPGP---YHATPKKH--RFC-GTGDNGGMQAIQE
-t68             --------------HHMQDIFID-ELYPGP---DHATPKKH--RFC-GTGDNGGMQTIQE
-t28             --------------HHMQDIFID-ELYPGH---YHATPKKN--RYC-GPGDNGGMQVIEE
-t82             --------------HHMQDIFID-ELYPGH---YHATPKKN--RFC-GPGDNGGMQVIEE
-t41             --------------HHMQDIFID-ELYPGH---YHATPKKN--RFC-GPGDNGGMQVIEE
-t71             --------------HPMQEIFID-ELYPGH---YHATPKKN--RFC-GPGDNGGMQSMQE
-t94             --------------HPVQDIFID-ELYPGH---YHATPKKV--RFC-GPGDNGGMQAIQE
-t99             --------------HHMQDIFID-ELYPGR---YHATPKKN--RYC-GPGDNGGMQPIQE
-t40             --------------HHMQDIFID-ELYPGH---YQATPKKD--KFC-GPGDNGGMQTIQE
-t90             --------------HHMQDIFID-ELYPGH---YHATPKKD--KFC-GPGDNGGMQTIQE
-t4              --------------HHMQDIFID-ELYPGH---YHATPKKN--RCC-GPGDNGGMQTVQE
-t36             --------------YHHQNILID-ELYSNV---YPAAPKKH--QYM-GVGDVGGYEVICE
-t87             --------------YHHQNILID-ELYSNV---YPAAPKKH--QYM-GVGDVGGYEMICE
-t89             --------------YHHQNILID-ELYNNI---YPAAPKKH--KFL-GVGDVGGYEIICE
-t39             --------------YHHQNILID-ELYNNI---YPAAPKKH--KFL-GVGDVGGYEIICE
-t8              --------------YHHQNILID-ELYNDI---YPAAPKKH--KFL-GVGDVGGYEIICE
-t6              --------------YHHQNILID-ELYNNI---YPAAPKKH--KFL-GVGDVGGYEIICE
-t58             --------------YHHQNILID-ELYSNI---YPATPKKH--QYM-GVGDVGGYEVICE
-t54             --------------YHHQNILID-ELYSNI---YPATPKKH--QYM-GVGDVGGYEVICE
-t65             --------------YHQQNILTD-ELYSDV---YPAAQKKY--QVM-GVGDIGGYELICE
-t29             --------------YHQQNILTD-ELYSDL---YPAAPKKY--QEM-GVGDIGGYELIVE
-t98             --------------YHQQNLLTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELIVE
-t83             --------------YHQQNLLTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELIVE
-t95             --------------YHQQNILTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELICE
-t20             --------------YHQQNILTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELICE
-t69             --------------YHQQNILTD-ELYSDI---YPAAPKKY--QIM-GVGDIGGYELICE
-t2              --------------YHQQNILTD-ELYSDI---YPAAPKKY--QIM-GVGDIGGYELICE
-t10             --------------YHQQNILTD-ELYSDI---YPAAPKKY--QIM-GVGDIGGYELICE
-t31             --------------YHQQNILTD-ELYSDM---YPAAPKKYVIRVM-GVGDIGGYEMICE
-t15             --------------YHQQNILTD-ELYSDV---YPTAPKKYVIRVM-GVGDIGGYELICE
-t63             --------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQM-GMGDIGGYELICE
-t50             --------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQM-GMGDIGGYELICE
-t25             --------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQM-GMGDIGGYELICE
-t51             --------------YHQQNILTD-ELYSDM---YPAAPKKYVIREM-GVGDIGGYELICE
-t9              --------------YHHQNTLVD-ELYSDV---YPAAPKKK--VCM-GVGDVGGYEVMGE
-t47             --------------YHHQNTLVD-ELYSDI---YPAAPKKK--VCM-GVGDVGGYEVMGE
-t60             --------------YHHQNTLVD-ELYSDI---YPAAPKKK--VCM-GVGEVGGYEVMGE
-t30             --------------YHDQNTLVD-ELYSDV---YPAAPKKK--VCM-GVGDVGGYEVMGE
-t70             --------------YHNQNTLVD-ELYSDV---YPAAPKKQ--HYM-GVGDVGGYEVMGE
-t91             --------------YHNQNTLVD-ELYSDV---YPAAPKKQ--HYM-GVGDVGGYEVMGE
-t49             --------------YHNFNALVD-ELYSDV---YPAAPKKK--HYM-GVGDVGGYEVMGE
-t52             --------------YHHQNSLVD-ELYSDV---YPAAPKKK--HYM-GVGDVGGYEVMGE
-t43             --------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t1              --------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t86             --------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t72             --------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t96             --------------YHHQNILVD-ELYSDV---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t44             --------------YHHQNMLVD-ELYSDM---YPAAPKKK--VYV-GAGDVGGYEVMSE
-t45             --------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t74             --------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-t26             --------------YHHQNVLVD-ELYGEA---YPAAPKKK--HYM-GAGDVGGYEVMSE
-t61             --------------YHHQNVLVD-ELYSEL---YPAAPKKA--HYM-GAGDIGGYEVMSE
-t97             --------------YHHQNVLVD-ELYSEV---YPAAPKKA--FYM-GAGDIGGYEVMSE
-t17             --------------YHHQNALVD-ELYSDV---YPAAPKKK--HYM-GEGDVGGYEVMSE
-t11             --------------YHHQNVLVD-ELYSDG---YPAAPKKK--HYM-GEGDVGGYEVMSE
-t23             --------------YHYQNILVD-ELYSND---YPAAPKKA--QFM-GVGDVGGYEIVCE
-t76             VCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDHNASEQKE--AHV-PMGDEGRISRAKD
-t53             VCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDHNASEQKE--AHV-PMGDQGRISRAKD
-t16             VCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDYNASEQKE--AHV-PMGDQGRISRAKD
-t42             VCVVVPHPWTKGKSEILQNMESA-HLYNAVIRDNNASEQKE--AHV-PVGDEGRISRAKN
-t24             VCVVVPHPWTKGKSEILQNMESARHLYNAVIRDNNASHQKE--AHV-PAGDQGRISRAKN
-                
-
-t73             DIFQILVCV
-t66             DIFQILVCV
-t32             DIFQILVCV
-t75             DIFQILVCV
-t79             DVFQILVCI
-t27             DVFQILVCI
-t93             DVFQILVCI
-t59             DVFQILVCI
-t7              DVFQILVCI
-t78             DVFQILVCI
-t12             DVFQILVCI
-t81             DLFQILVCA
-t21             DLFQILVCV
-t80             DVFQILVCL
-t14             DVFQILVCL
-t85             DLFQILVCI
-t62             DVFQILVCV
-t19             DVFQILVCV
-t77             DVFQILVCA
-t88             DMFQVLVCR
-t37             DMFQVLVCK
-t35             DMFQVLVCK
-t48             DMFQVLVCK
-t55             DMFQVLVCK
-t46             DMFQVLVCK
-t67             DMFQVLVCK
-t57             DMFQVLVCK
-t56             DMFQVLVCQ
-t13             DMFQVLVCV
-t5              DMFQVLVCV
-t38             DMFQVLVCI
-t33             DMFQVLVCV
-t100            DMFQVLVCV
-t34             DMFQVLVCV
-t84             DMFQVLVCV
-t92             DMFQVLVCV
-t3              DMFQVLVCV
-t22             DMFQVLVCV
-t64             DMFQVLVCV
-t18             DMFQVLVCV
-t68             DMFQVLVCV
-t28             DMFQVLVYV
-t82             DMFQVLVYV
-t41             DMFQVLVYV
-t71             DVFQVLVCV
-t94             DVFQVLVCV
-t99             DMFQVLVCV
-t40             DMFQVLVCV
-t90             DMFQVLVCV
-t4              DMFQVLVCV
-t36             NLFQILVVE
-t87             NLFQILVVE
-t89             NLFQILVVE
-t39             NLFQILVVE
-t8              NLFQILVVE
-t6              NLFQILVVE
-t58             NLFQILVVE
-t54             NLFQILVVE
-t65             DLFQILVCQ
-t29             DLFQILVCE
-t98             DLFQILVCE
-t83             DLFQILVCE
-t95             DLFQILVCE
-t20             DLFQILVCE
-t69             DLFQILVCE
-t2              DLFQILVCE
-t10             DLFQILVCE
-t31             DLFQILVCE
-t15             DLFQILVCQ
-t63             DLFQILVCE
-t50             DLFQILVCE
-t25             DLFQILVCE
-t51             DLFQILVCE
-t9              DLFQILVCE
-t47             DLFQILVCE
-t60             DLFQILVCE
-t30             DLFQILVCE
-t70             DLFQILVCE
-t91             DLFQILVCE
-t49             DLFQILVCE
-t52             DLFQILVCE
-t43             DLFQILVHE
-t1              DLFQILVHE
-t86             DLFQILVHE
-t72             DLFQILVHE
-t96             DLFQILVHG
-t44             DLFQILVHA
-t45             DLFQILVHE
-t74             DLFQILVHE
-t26             DLFQILVHE
-t61             DLFQILVHE
-t97             DLFQILVHK
-t17             DLFQILVHA
-t11             DLFQILVHA
-t23             DIFQILVCD
-t76             EIMYIRDLE
-t53             EIMYIRDLE
-t16             EIMYIRDLE
-t42             EILYIRDLE
-t24             EILYIRDLE
diff --git a/test/example.fasta b/test/example.fasta
deleted file mode 100644
index 68bb46e..0000000
--- a/test/example.fasta
+++ /dev/null
@@ -1,1702 +0,0 @@
->t73                 
-LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPYSGNGTQVRNDVEDAN--CQEFVGI---RELGKH
--YK-CMDGFHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR--------GDIGRVKRDVQKFPKLKEGAPNCSSFVKPY
-FMGCDMFHKQVEYRGTHGLVLDDTWNEESATFPYPQVHSRSDKRCLNGLHQGDHEESVH---HAPRI----MR---LIG
-H-HLVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDGFFDK-D-Q------SR
-PDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NISDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMT
-EYANGL----WHPFYKASDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEG
-CKCRS---KLYVSQLDH----KTLSK-NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKNSEE-NYNKAADPT
-VIWFYTQPIVYV-ADVFGCTKGKNPQEMRG------NNVMSESLGDDNLQD--MSGVPVTVCTSSVMVRKDMQD-SVDK
-RGCTWNAKE-DHLCPSSFCKGER---EDEPGGVTQ-----------------RCIENIAKLLYIKDV-LCNEVLNGLQW
-QLCWSV-GDWESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEGPMQAKIVTLH
-W-EMDVSHRG-SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLARPNT---AQKLSILT---VFHFSGGFRDKP
-M-ERSQLHS-TYSED----KKDQKVLIHAMK-RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAH
-FVVFL-ISDATRLLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSNVDIKIFDTCFRSAVYAVDNSWETLCDY
--EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIAIRVSGSE-SENVVLQYCLYYEE
-NKSIR-----------QNNTGSADLPK---------------------DRLVNSFVD-ELYNSI---YTAAPKKK--RH
-L-GIGDNGGMELVREDIFQILVCV
->t66                 
-LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPCSGNGTQVRNDVEDAN--CQEFVGI---RELGKH
--YK-CMDGFHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR--------GDIGRVKRDVQKFPKLKEGAPNCSSFVKPY
-FMGCDMFHKQVEYRGTHGLVLDDTWNEESATFPYPQVHSRSDKRCLNGLHQGDHEESVH---HAPRI----MR---LIG
-H-HLVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDGFFDK-D-Q------SR
-PDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NISDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMT
-EYANGL----WHPFYKASDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEG
-CKCRS---KLYVSQLDH----KTLSK-NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKNSEE-NYNKAADPT
-VIWFYTQPIVYV-ADVFGCTKRKNPQEMRG------NNVMSESLGDDNLQD--MSGVPVTVCTSSVMVRKDMQD-SVDK
-RGCTWNAKE-DHLCPSSFCKGER---EDEPGGVTQ-----------------RCIENIAKLLYIKDV-LCNEVLNGLQW
-QLCWSV-GDWESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEGPMQAKIVTLH
-W-EMDVSHRG-SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLARPNT---AQKLSILT---VFHFSGGFRDKP
-M-ERSQLHS-TYSED----KKDQKVLIHAMK-RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAH
-FVVFL-ISDATRLLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSNVDIKIFDTCFRSAVYAVDNSWETLCDY
--EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIAIRVSGSE-SENVVLQYCLYYEE
-NKSIR-----------QNNTGSADLPK---------------------DRLVNSFVD-ELYNSI---YTAAPKKK--RH
-L-GIGDNGGMELVREDIFQILVCV
->t32                 
-LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPYSGNGTQVRNDVEDAN--CQEFVGI---RELGKH
--YK-CMDGFHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR--------GDIGRVKQDVQKFPKLKEGAPNCSSFVKPY
-FMGCDMFHKQVEYRGTHGLVLDDTWNEESATFPYPQVHSRSDKRCLNGLHQGDHEESVH---HAPRI----MR---LIG
-H-HLVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDGFFDK-D-Q------AR
-PDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NISDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMT
-EYANGL----WHPFYKASDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEG
-CKCRS---KLYVSQLDH----KTLSK-NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKNSEE-NYNKAADPT
-VIWFYTQPIVYV-ADVFGCTKGKNPQEMRG------NNVMSESLGDDNLQD--MSGVPVTVCTSSVMVRKDMQD-SVDK
-RGCTWNAKE-DHLCPSSFCKGER---EDEPGGVTQ-----------------RCIENIAKLLYIKDV-LCNDVLNLLVW
-QLCWSV-GDWESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEGPMQAKIVTLH
-W-EMDVSHRG-SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLARPNT---AQKLSILT---VFHFSGGFRDKP
-M-ERSQLHS-TYSED----KKDQKVLIHAMK-RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAH
-FVVFL-LSDATRLLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSNVDIKIFDTCFRSAVYAVDNSWETLCDY
--EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIAIRVSGSE-SENVVLQYCLYYEE
-NKSIR-----------QNNTGSADLPK---------------------DRLVNSFVD-ELYNSI---YTAAPKKK--RH
-L-GIGDNGGMELVREDIFQILVCV
->t75                 
-LIVSEIRVMVRDE--VHKAMDEE-C------------LIARRVKPYSGNGNQIRNDIEDAN--GQEFVGI---RELGKH
--YD-CMDGYHTVNNGAGEN-SESAMWIFDLWMCKLNHGMQR--------GDIGRVQQDVHKFPKLKEGAPNCSSFVKPV
-FMGCDMFHRQVQNRGNHGLVLDDTWNEESGTFPYPQVHSRNEKRCINKLHQGDHNESCH---HNPRI----VR---RIG
-H-HLVIIVLVNRDMGRLNYIEPDALVPSPLRFGGDEWVPKPI------------------EDGFFDK-D-Q------AR
-PDVANA-IVPDR----DQWVGAHKEWGSSLCKVGLAVHDLR-NVSDLYRCVWMECVLGANHYQQVSRMKMVTPAYTHMT
-EYANGL----WHPFYKNPDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVAKPVLGDWEG
-CKCRSDLIKLYVSQLDH----KTLSK-NMGLY--MRNRTWLATSPLQ------IGCIFMLVGRKKNSEE-NYNKAADPT
-VIWFYTQPIVYV-ADVFGCTKGKNPQEMRK------NNVISESLGDDNLQD--MPGMPVTVCTSSVMVRKDMHQ-SVDK
-RGYTWHAKE-DHLCPDSFCKGEK---EEEPGGVRR-----------------RIVENIVKLLYIKDV-LCNQVLNLLQW
-QLCWSV-GDWESLVPQACWGAKKDLAVCAWKMELVPGL---NRNNENLAKIIYFGPDGH-------DEGNMQAKIVTLH
-W-EMDVSHRG-SSVDDNVV-VVMLAFQASFCDPWGHYIQGLGD-QYKLARPNT---ARQLSILV---VMHFSGGFRDKP
-I-ERSQLHC-TYSEN----KKDQKVVIRAMK-RNKGCDWHAGKD-MAGGPK-IIYVGMLFY-------AESNWAKQKAH
-FVVFL-ISDATRLLIHHVGCMIEYTFMEFACHPFFAELFMEHMVIRYQYYNNVDIKIFDTCFRGAVYAEDNSWETLCGY
--EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIPIRISGSE-SENVVLQYCLYYEE
-NKSIR-----------QNNTGSAVLPK---------------------DRLVNNFVD-ELYNSV---YTAAPKKK--RH
-L-GIGDNGGMELVREDIFQILVCV
->t79                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQNQVRNAVEDAA--RPDFVGT---RELGKQ
--YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPY
-FLGVDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIG
-L-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------GDGFFDK-D-Q------AR
-PLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVM
-EYAHGL----WKPFYQASDHKNEAQGVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGLRTVMKPHLGDVDG
-CRCRSDLNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSAN-NYNRAGDPT
-TICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDDSLQQ--MPAVPVDVCVMSVMVNKSMPQ-SHDK
-RGYTWQAKQ-DHLFPVNVVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-DCNMVLSLLVW
-QLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLH
-W-EMEASHRE-SSVRDNMI-VIMLPFNINSIDPWRHYILGLND-QIQLTRPNT---ARRLSILH---VMHYSGEFHDKS
-A-ERSQLHS-RYSEH----KNDHKCVILASK-HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNH
-FVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYINNHDIKIKDTVFRLAVYAWDNFWETLCKC
--EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIRIKIREPGSE-SENTVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------ARLVNKVVD-ELYNNV---YHAIPKKE--MN
-Q-GVGDSGGVEMVQEDVFQILVCI
->t27                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTMSGSQNQVRNAVEDAA--RPDFVGI---RELGKQ
--YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPY
-FLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIG
-M-NLVIISYANVDMGRLNHCEDQAIVYSPLRYGGAGFVSKPI------------------ADGFFDK-D-Q------AR
-PLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVM
-EYAHGL----WKPFYQASDHKNEAQGVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGIHTVMKPHLGNVDG
-CRCRSDLNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSAN-NYNRAGDPT
-TICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDDSLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDK
-RGYTWQAKQ-DHLFPVNCVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVW
-QLC--H-GDWEPLLPQACEGARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLH
-W-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ARRLSILH---VMHYSGAFHDKS
-A-ERSQLHS-RYSEH----KNDHKCVILASK-VNKDHDWITGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNH
-FVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENFWETLCNC
--EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIRIKIREPGSE-SENTVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------ARLVNKVVD-ELYNNV---YHAIPKKD--MN
-Q-GVGDSGGVEMVQEDVFQILVCI
->t93                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTMSGSQNQVRNAVEDAA--RPDFVGI---RELGKQ
--YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPY
-FLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIG
-M-NLVIISYANVDMGRLNHCEDQAIVYSPLRYGGAGFVSKPI------------------ADGFFDK-D-Q------AR
-PLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVM
-EYAHGL----WKPFYQASDHKNEAQGVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGIHTVMKPHLGNVDG
-CRCRSDLNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSAN-NYNRAGDPT
-TICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDDSLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDK
-RGYTWQAKQ-DHLFPVNCVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVW
-QLC--H-GDWEPLLPQACEGARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLH
-W-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ARRLSILH---VMHYSGAFHDKS
-A-ERSQLHS-RYSEH----KNDHKCVILASK-VNKDHDWITGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNH
-FVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENFWETLCNC
--EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIRIKIREPGSE-SENTVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------ARLVNKVVD-ELYNNV---YHAIPKKD--MN
-Q-GVGDSGGVEMVQEDVFQILVCI
->t59                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQNQVRNAVEDAA--RPDFVGI---RELGKQ
--YE-CMDGVGAVDTGAGDN-SESAVVIFDVWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPY
-FLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIG
-M-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADGFFDK-D-Q------AR
-PLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECILGANVYHQISRMKMHGPTYSHVM
-EYAHGM----WKPFYQASDHKNEAQGVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDG
-CRCRSDLNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSGN-NYNQAGDPT
-TICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDDSLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDK
-RGYTWQAKQ-DHLFPVNFVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIDLSLLVW
-QLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLH
-W-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ACRLSILH---VMHYSGEFHDKS
-A-ERSQLHS-RYSEH----KNDHKCVILASK-HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNH
-FVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENFWETLCNC
--EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIGIKIREPGSQ-SENTVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNV---YHAIPKKD--MN
-Q-GVGDSGGVEMVQEDVFQILVCI
->t7                  
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKKFSGSQGQVRNAIEDAA--RPDFVGI---RELGKQ
--YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSMPMPY
-FLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIG
-M-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADGFFDK-D-Q------AR
-PLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVM
-EYAHGM----WKPFYQASDHKNEAQGVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDG
-CRCRSDLNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSGN-NYNRAGDPT
-TICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDDSLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDK
-RGYTWQAKQ-DHLFPVNFVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVW
-QLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLH
-W-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ACRLSILH---VMHYSGEFHDKS
-A-ERSQLHS-RYSEH----KNDHKCVILASK-HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNH
-FVIFL-ICDAVRILILHHGCMTDRTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENFWETLCNC
--EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIGIKIREPGSQ-SENTVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNP---YHAIPKKD--MN
-Q-GVGDSGGIEMVQEDVFQILVCI
->t78                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQGQVRNAIEDAA--RPDFVGI---RELGKQ
--YE-CMDGVGAVDTGAGDN-SESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPY
-FLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLHQGDHEESRH---HNARI----VR---RIG
-M-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADGFFDK-D-Q------AR
-PLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVM
-EYAHGM----WKPFYQASDHKNEAQGVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDG
-CRCRSDLNNLILSQLDD----KTLSK-NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSGN-NYNRAGDPT
-TICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDDSLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDK
-RGYTWQAKQ-DHLFPVNFVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-DCNIVLSLLVW
-QLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLH
-W-EMEASHRE-SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ACRLSILH---VMHYSGEFHDKS
-A-ERSQLHS-RYSEH----KNDHKCVILASK-HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNH
-FVIFL-ICDAVRILILHHGCMTDRTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTVFRLAVYAWENFWETLCNC
--EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIGIKIREPGSQ-SENTVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNP---YHAIPKKD--MN
-Q-GVGDSGGIEMVQEDVFQILVCI
->t12                 
-LIVSEVRVMVRDG--INIAIDEL-C------------LIANRVKAFSGHQNQVRNAMEDAQ--RPDFVGI---RELGKQ
--YQ-CMDGHGAVDTGAGRN-SESAVWIFDIWMCKLAHGMQW--------GDIGRVSVDHPKFLKLEEGAPRCSSCPMPY
-FLGCEMFHRQVILKGAKGLVLPD--NEDSMAFPYVQVHSRSVKRCLNVLVQGDHDESRH---HNARI----VA---RIG
-M-NMVIIRYLNVEMGRLNHCEDDAMVYSPLRIGGAGTHSKPI------------------ADGFFDK-D-Q------AR
-PLIANAHIVPEN----DQWTGAVAQWCSSVIKCGLANHDLE-NISRLLRCVVMECVLGANVYHQASRMKMHGPYYAHVT
-EYAHGL----WKPFYQTSDHKNEAQGVGES-THQLPCVESQTCQYEVKHAKVCKLVHH-ALYLLALHTMMKPRLGDIDG
-CRCRSELNKLALSQLDD----KTLSK-NCFQY--LGNMTWLATSPLH------VGCMIIF-------------------
------------------------------V------NNVLSQSLGDDSLQQ--MHAMPVTVVVVSHMVKKSMPQ-SHDK
-RGYTWQAKDFDQLIPVSFVKGEQ---EEEPEGPNN-----------------RVVHNIVKLLYTKDV-DCNTVLSLLIW
-QLC--H-GDWEQLVPQACAGARSDLAVCAWKRELVPGL---NHNNENLAKVIYFGPDGH-------DEGPMGRKIVDLH
-W-EMEASHRD-SSVRDNML-VIMLPFLVNNLDPWRHYILGLND-QIQLTRPNT---ARRLSILM---VMHYSGEFHDKS
-P-ERSQLHFDSYSEH----KNDHKCVILASK-HNKGLDWATGKDDMKGGAK-IMMSGALFY-------AEQNWIRARNH
-FVIFL-ICDAVRILIVLHGCMTAWTFMEFACNPFFAELFMEHVYIRYQYVNNHDIKIKDTEFRLAVYAWENSWETLCNC
--EMLSGHIGAKINHNPRLFEQVC-PPCELTVSGLKGKH-VGWPYLTDITRTPLIRIQIREPGSE-CENSVVMYVIYYKE
-RKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNV---YHAIPKKD--IN
-V-GVGDSGGMEVVQEDVFQILVCI
->t81                 
-LIVSEVRHMVRDG--ANVAIDEL-C------------LIACRVKAFSGHGHQVRNAVEDAA--RPDFIGI---RELGKP
--Y--CMDGHGAVNTGAGHN-SESAVWIFDIWMYKLSHGMQW--------GDIGRVGVDHPKFLKLEEGAPNCSSLPMPY
-FLGVDMFHRQVTIKGAKGLVLPDIWNESPMAFPYAQVHSKSHKRCLNVLVQGDHEESEH---HNARI----MS---KIG
-T-HLVIINIINVEMQRLNHCEDKAIVYSPDRIGGAGFHSKPI------------------ADGFFDK-D-Q------AR
-PIIANAHIVPVN----DQWTGPMAQWCSSVIKCGLANHELE-DVSRLLRCVGMECNLGANHYHQVSRMKMHGPIYSHMT
-EYAVGL----WKPFYQASEHKNEAQGLGER-PHQLPCVESQTCQYEIKVAKVCKLVHV-ALYLVGLKTVVKPKLGDWDG
-IRCRSELNKLYLSQLDD----KTLSK-NCFIY--LGNMTWLATSPLQ------IGWLVLFDGRKRQSAE-DYNRAADPT
-TISFCRKPIVQH-ADVFGCDRDKDPQEMRT------NNVISESLGDDFLQQ--MPAVPVSVCVYSHMVKKFVPQ-SHEK
-RGYTWKAKE-DHLVPISYCKGEH---EEEPEGAQY-----------------RVVQNIVKLLYTKDV-DCNVVLSLLVW
-QLC--H-GDWEPLIPQACQTAKKDLAVCAWKRELVPGL---NCNNEYLAKIIYFGPDGH-------DEGPMGRKIVDLH
-W-EMEASHRD-SSVRDNYI-VIMLPFKINSRDPWRHYILGIND-QVCLNRPET---ARRLSILA---VMHYSGEFHDKS
-P-ERSHLHF-RYSEM----KNDVKCVI---K-SNKGLDWTAGKDGMKGEAK-AMMNGALFY-------AEQNWFRKKNH
-FVIFV-FCDAVRILIMHSGVMIGYTFMEFACNPFFAELFMEHVMVRYQYESNHDIKIKDTCFRLAVYAWENSWETLCNV
--EMLSGHFGAKINHVPRLPEQVC-PPCDLTVSGLKGKQ-NGLPYLTDITRTPLIRIQIRVPGSE-SENVVVMYMVYYKE
-RKSIR-----------QNNTGCANLPQ---------------------HRLVVKVAD-ELYNNI---YHAIPKKD--GV
-LLGIGDSGGMEMVQEDLFQILVCA
->t21                 
-LIVSEVRHMVRDG--ANIAIDEL-C------------LIACRVKAFSGHGNQVRNAVEDAP--RPDFIGV---RELGKP
--Y--CMDGHGAVNTGAGVN-SESAVWIFDIWMYKLSHGMQW--------GDIGRVDVDHPKFLKLEEGAPNCSSLPMPY
-FLGVDMFHKQVTLKGAKGLVLPDIWNESPMAFPYAQVHSKSHKRCLNVLVQGDHEESEH---HNARI----MS---RIG
-T-HLVIVNVINVEMQRLNHCEDKAIVYSPDRIGGAGFHSKPI------------------ADGFFDK-D-Q------AR
-PIIANAHIVPIY----DQWTGPMAQWCSSVIKCGLANHELK-VVSRLLRCVGMECNLGANHYHQVSRMKMHGPIYSHMT
-EYAHGL----WKPFYQASEHKNEAQGVGER-PHQLPCVESQKCQYEVKVAKVCKLVHV-ALYLVGLKTVVKPKLGDWDG
-VRCRSDLNKLYLSQLDD----KTLSK-NCFRY--LGNMTWLATSPLQ------NGCVVIFAGRKRQSAE-DYNRAADPT
-TIAFCRKPIVQH-ADVFGCDKDKDPQEMRM------NNVISESLGDDFLQQ--MPAVPVSVCVHSHMVKKFVPQ-SHEK
-RGVTWKAKE-DHLVPISLCKGEH---EEEPEGAQY-----------------RCVQNIVKLLYTKDV-DCNVVLSLLVW
-QLC--H-GDWEPLVPQACQTAKKDLAVCAWKRELVPGL---NCNNEYLAKIIYFGPDGH-------DEGPMGRKIIQLH
-W-EMEASHRD-SSVRDNII-VIMLPFKINSRDPWRHYILGLND-QVCLTRPET---ARRLSILV---VMHYSGEFHDKS
-P-ERSHLHY-RYSEV----KNDVKCVILASK-SNKGLDWTAGKDGMKGENK-AMMNGTLFY-------AEQNWFRQKNH
-FVIFV-ICDAVRILIVHSGVMTGFTFMEFACNPFFAELFMEHVYIRYQYQANHDIKIKDTCFRLAVYAWENSWETLCNV
--EMLSGHFGAKINHVPRLPEQVC-PPCDLTVSGLKGKQ-NGWPYLTDITRTPLIRIQIRVPGSE-SENITVMYMVYYKE
-RKSIR-----------QNNTGCANLPQ---------------------HRLVVKVAD-ELYNNI---YHAIPKKD--GV
-LLGIGDSGGMEMAQEDLFQILVCV
->t80                 
-LIVSEVRHMVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMAA--RQNFVGM---RELEKV
--YE-CMDGQGAVNTEAGNN-SESAVWIFDIWMCKLTHGMQDFGD-----GDIGRVVVDHPKFEKLEEGAPNCSSHPVPY
-FLGIDMFHKQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSHRRVLNVLHQGDVEES-H---HSARC----VR---RIG
-F-HLVIIVFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPV------------------DDGFFDK-D-Q------AR
-PVIASAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVMIDCNQGANHYIQISRMKVHGPTYSHMT
-EYAHGL----WKPFYQASDHKNDAQGVGER-PHQLPCVESQTCQYEMKHAKVCKLVHG-ALYLIALKTVVKPKLGVWQG
-CRCRSQLSKLVLSQLDE----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCVILFGGRKRQSHGLNYNRAADPT
-TICFYKKPIVVQGADVFGCARGKDPQEMKA------NNVISGSLGDDRLQQ--MPAMPVTICVSSYMVKKSVIQ-SHQK
-RGYTWRAKE-DHLIPVSFCKGEL---DEEPDAAQQ-----------------RIVQNIVKLLYTKDV-SCNVVLSMLIW
-QIC--H-GDWEPQIPKACSNARKDLAVCAWKRELVPGL---NHNNENLAKIMYFGHDGH-------DEGPMGRKIVTLH
-V-EMEVSHRE-SSVKDNMIRVIMLPFSNSSVDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VTHYSGGFHDKS
-A-ERSQHHF-IYNEV----KDDHKCVILASK-CNKGLDWAAGKD-MKGGAK-VMMNGALFY-------AERNWIRQKHH
-FVIFV-VCDAVRILIVHYGCMIGYTFMDFACNPFFAELFMDHVFIRYVYMNNHDIKIMDTCFRVAVYTWENSWETCFNR
--EMLSGTFGAKISHNPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIKIHIRVPGSQ-SENHVVMYCVYYKE
-HKSIR-----------QNNTGCANLPQ---------------------HRLVDQVVD-ELYSKF---YHAIPKKP--GN
-M-GVGDSGGMEMVQEDVFQILVCL
->t14                 
-LIVSEVRHMVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMAA--RQNFVGM---RELEKV
--YQ-CMDGQGAVNTEAGNN-SESAVWIFDIWMCKLTHGMQDFGD-----GDIGRVVCDHPKFEKLEEGAPNCSSHPMPY
-FLGVDMFHEQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSHRRVLNVLHQGDVEES-H---HSARC----VR---RIG
-F-HLVIIVYWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPV------------------DDGFFDK-D-Q------AR
-PVIASAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVMIDCNQGANHYIQISRMKVHGPTYSHMT
-EYAHGL----WKPFYQASDHKSDAQGVGER-PHQLPCVESQTCQYEMKHAKVCKLVHG-ALYLIALKTVVKPKLGVWQG
-CRCRSQLSKLVLSQLDE----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCVILFGGRKRQSHGLNYNRAADPT
-TICFYKKPIVVQGADVFGCARGKDPQEMKA------NNVISGSLGDDRLQQ--MPAMPVTICVSSYMVKKSVPQ-SHQK
-RGYTWRAKE-DHLIPVSFCKGEL---DEEPDAAQQ-----------------RIVQNIVKLLYTKDV-SCNVVLSMLIW
-QIC--H-GDWEPQIPKACSNARKDLAVCAWKRELVPGL---NHNNENLAKIMYFGHDGH-------DEGPMGRKIVTLH
-V-EMEVSHRE-SSVKDNMIRVIMLPFPSSSVDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VTHYSGGFHDKS
-A-ERSQHHF-IYNEV----KDDHKCVILASK-CNKGLDWAAGKD-MKGGAK-IMMNGALFY-------AERNWIRQKHH
-FVIFV-VCDAVRILIVHYRCMIGYTFMDFACNPFFAELFMDHVFIRYQYMNNHDIKIMDTCFRVAVYTWENSWETCCNR
--EMLSGTFGAKISHNPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTEITRTPLIKIHIRVPGSQ-SENHVVMYCVYYKE
-HKSIR-----------QNNTGCANLPQ---------------------HRLVDQVVD-ELYSKF---YHAIPKKP--GN
-M-GVGDSGGMEMVQEDVFQILVCL
->t85                 
-LIVSEVRHVVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMAA--RQNFVGM---RELDKA
--YQ-CMDGQKAVNTEAGNN-SESAVWIFDICMCKLTHGMQD--------GDIGRVVCDHPKFEKLEEGAPNCSSIPMPY
-FLGIDMFHKQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---VSARC----MR---RIG
-F-HLVIINFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------NDGFFDK-D-Q------AR
-PVIANAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVEIDCNQGANHYVQISRMKMYGPTYSHMT
-EYAHGL----WKPFYQASDHKNDAQGVGER-PHQLPCVESQTCQYEVKHANVCKLVHA-ALYLIGLKTVVKPELGVWEG
-CRCRSQLSKLALSQLDE----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCIILFGGRKRQSHGLNYNRAADPT
-MICFYKKPIVVQGADIFGCARGKDPQEMKS------NNVISGSLGDDRLQH--MPAMPVTICVFSYMVKKAVPQ-SHQK
-RGYTWRAKE-DHLIPVSFCKGEL---DEEPDGAQQ-----------------RVVQNIVKLLYTKDV-SCNKVLSMLIW
-QIC--H-GDWEPQIPKACNAARKDLAVCAWKRELVPGL---NHNNEDLAKIMYFGPDGH-------DEGPMGRKIVNLH
-V-EMEVSHRE-SSVKDNMIRVVMLPFDNNSWDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VMHYSGGFHDKS
-S-ERSQHHF-IYNEV----KNDHKCVILASK-SNKGLDWAAGKD-MKGGAK-MMANGALFY-------EERNWIRQKNH
-FVIFV-VCDAVRILIVHYGCMVPYTFMAFACNPFFAELFMEHVFIRYQYVNNHDIKIMDTCFRVAVYTWENSWETCCNR
--EMLSGTFGAKISHNPRLPEQVI-PPCDLTVSGLKGKH-NGWPYLTDITRTPLIKIHIRIPGSQ-SENHVVMYCVYYKE
-HKSIR-----------QNNTGCANLPQ---------------------HRLVDKVVD-ELYSKF---YHAIPKKP--GN
-M-GIGDSGGMEMVQEDLFQILVCI
->t62                 
-LIVSEVRVMVRDG--IHIAVDEI-C------------LIANRVKCMSGQGNQARNAMEMAA--RQNFVGM---RELGKQ
--YQ-CMDGQGAVNTEAGNN-SESAVWIFDIWMCRLTHGMQD--------GDIGRVECDHPKFAKLEEGAPNCSSLPMPY
-FLGIDMFHNQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---HSARC----MR---RIG
-Y-HRVIINYWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------ADGFFDK-D-Q------AR
-PVIANAHIVPEY----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVVIDCNHGANHYVQISRMKMHGPTYSHMT
-EYAHGL----WKPFYQASDHKNDAQGVGER-PHQLPCVEPQTCQYEVKHAKVCKLVHG-ALYLIGLQTVVKPKLGVWEG
-VQCRSQLSKLILSQLDD----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCIIMFDGRKRQSHGLQYNRAADPT
-TICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDDRLQQ--MPAMPVTICVFSYMVKKSVPQ-SHVK
-RGYTWRAKE-DHLIPVSFCKGEL---EEEPEGAQH-----------------RMVQNIVKLLYTKDV-SCNVVLSMLIW
-QIC--H-GDWEPQIPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEGPMGEKIVNLH
-V-EMEASHRE-SSVKDNMIRVIMLPFSNNSWDPWRHVILGLND-KIKLTRPNT---AHRLSILV---VMHYSGGFHDKS
-A-ERSQHHF-IYNEI----KNDHKCVILASK-ANKPLDWAAGKD-MKGGAK-MMANGALFY-------AERNWIRQKNH
-FVIFI-ICDAVRILIVHYGCMVGDTFMDFACNPFFAELFMEHVFIRYQYIPNHDIKIMDTCFRVAVYTWENSWETCCNR
--EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIRIHIRVPGSE-SENHVVMYCVYYKE
-HKSIR-----------QNNTGCANLPQ---------------------HRLVDRVVD-ELYSKF---YHAIPKKP--GN
-M-DVGDSGGMEMVMEDVFQILVCV
->t19                 
-LIVSEVRHMVRDG--INIAVDEI-C------------LIANRVKCVSGQGNQARNAMEMAA--RQNFVGM---RELGKQ
--YQ-CMDGQGAVNTEAGNN-SESAVWIFDIWMCRLTHGMQD--------GDIGRVECDHPKFAKLEEGAPNCSSLPMPY
-FLGIDMFHKQVMGKGSKGLILPDTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---HSARC----MR---RIG
-YGHLVIINFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------ADGFFDK-D-Q------AR
-PVIANAHIVPEY----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVVIDCNHGANHYVQISRMKMHGPTYSHMT
-EYAHGL----WKPFYQASDHKNDAQGVGER-THQLPCVEPQTCQYEVKHAKVCKLVHG-ALYLIGLQNVVKPKLGVWEG
-VQCRSQLSKLILSQLDD----KTLSK-NCSIY--LGNMTWLATSPLQ------IGCIILFDGRKRQSHGLQYNRAADPT
-TICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDDRLQQ--MPAMPVTICVFSYMVKKLVPQ-SHQK
-RGYTWRAKE-DHLIPVSFCKGEL---EEEPEGAKQ-----------------RMVQNIVKLLYTKDV-SCNVVLSMLIW
-QIC--H-GDWEPQIPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEGPMGEKIVNLH
-V-EMEASHRE-SSVKDNMIRVIMLPFSNNSWDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VMHYSGGFHDKS
-A-ERSQHHF-IYNEI----KNDHKCVILASK-ANKGLDWAAGKD-MKGGAK-MMVNGALFY-------AERNWIRQKNH
-FVIFV-ICDAVRILIVHYGCMVGDTFMDFACNPFFAELFMEHVFIRYQYIPNHDIKIMDTCFRVAVYTWENSWETCCNR
--EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIRIHIRVPGSE-SENHVVMYCVYYKE
-HKSIR-----------QNNTGCANLPQ---------------------HRLVDKVVD-ELYSKF---YHAIPKKP--GN
-M-DVGDSGGMEMVMEDVFQILVCV
->t77                 
-LIVSEVRHMVRDG--INIAVDEI-C------------LIANRVKSMSGQGNQARNAMEMAA--RQNFVGM---RELGKQ
--YH-CMDGQGTVNTEAGNN-SESAVWIFDIWLCRLTHGMQD--------GDIGRVECDHPKFAKLEEGAPNCSSLPMPY
-FLGIDMFHRQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSHRRVLNVLHQGDHEES-H---HSARC----MR---RIG
-Y-VLVIINFWNVEMGRLIHCEDEAIIYSPLRIGGAGFHSKPI------------------ADGFFDK-D-Q------AR
-PVIANAHIVPEY----DQWSGAMPQWVSSVIKCGLANHDLE-NVSRLLRCVVIDVNQGANHYVQISRMKMHGPTYSHMT
-EYAHGL----WKPFYQASDHKNDAQGVGER-VHQLPCVEPQTCQYEVKHAKVCKHVHG-ALYLIGLQTVVKPKLGVWEG
-CQCRSQLSKLILSQLDD----KTLSK-NCNIY--LGNMTWLATFPLQ------IGCIILFDGRKRQSYGLQYNRAADPT
-TICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDDRLQQ--MPAMPVTICVFSYMVKKSVPQ-SHQK
-RGYTWRAKE-DHLIPVSFCKGEL---EEEPEGAQQ-----------------RIVQNIVKLLYTKDI-SCNVVLSMLIW
-QIC--H-GDWEPQLPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEGPMGEKIVNLH
-V-EMEASHRE-SSVKDNMIRVIMLPFGENSWDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VMHYSGGFHDNS
-A-ERSQHHF-IYNEV----KNDHKCVILASK-ANKGLDWAAGKD-MKGGAK-MMVNGALFY-------AERNWIRQKNH
-FVIFV-ICDAVRILIVHYGCMVGDTFMDFACNPFFAELFMEHVVIRYQYIPNHDIKIMDTCFRVAVYTWENSWETCCNR
--EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIRIHIRVPGSE-SENHVVMYCVYYKE
-HKSIR-----------QNNTGCANLPQ---------------------HRLVDKVVD-ELYSKF---YHAIPKKP--GN
-M-DVGDSGGMEMVMEDVFQILVCA
->t88                 
-LIVSECRLIIRDG--NHDAIDEM-CCVANDLNNEIERLVASMVKSFRGHDSQARNNSECMR--SAPFIGV---RELFKR
--YHKCVEGAGCVHTVAGTP-SDSPVWMFDQFMCQLTHSMVD--------GDLGRVVQDNVIFAKLKEGAPHCISL--PH
-FLGIDMFHTQVFVGGH--LILPDPCYELSISVMYAGHASYNQKRCINNLDQGDQEDSNHRKEHKIRASVLLYR---QIG
-I-L-VIIKEANELMNRLNHKEPENGIIFPLR---DAQDPKQI------------------LNGLFDK-E-E------NR
-PMVQDADSVVGS----AQWAGQHRSWCSSDDKA-----------SQLPRNTHIVVEIGANVYEQFSRMKTNIPIYAHVT
-EYAVGV----ERPFYE-SEFKNEAQGWGES-GTSIPCVDSPDVQYEMKVAWVDKLMHT-ALYLMPLATVHKPEMGTVRG
-ERCRAIL-KLLMMQLD------TLSR-NQLPK--LCQGTWLDASPLQ------IGVQVMLVGKKGGSKK-EYELAADQV
-IIYFYQAPIIYVKADVFSGTVAKKAQAMR-------KSTGSQSIGDDGMQS--MPLMQNAVCVWSKMVRKVQPD-GQDK
-REQTWMAKD-DTLCPPSMKRGEK---TAEPTQWMG-----------------TVTVNKIKLLYCKDC-SCNEVMKILSW
-WLCNSV-GDWQTLMSQACITADPNPPVCVWKRELVPGL---NRSVENLAKIIYFCPDEH-------DERKMWGKIFALE
-W-EMDISHRH-SSVDDNHC-VEMLPFMCQRVDPWGHYVQILAD-RQDLARPVT---LQALSILP---CPHASGKEQDGA
-V-ERSQHYV-VYAEL----QVDHKCTIAAHKYQDKMKDWDTGKN-MDEGAK-MYVEIHLFY-------AENNIRRQNDH
-SVIFW-ISDAKKRLICGMSSMCLVTFMTLACNPLFAKLFMEVVPMRYDYLTNHDIKI------MEVYAPENSWETIKNV
--EMVSGKEGAEINHTPQLPEQVI-PPCNLTVSNLKGMI-PPCPALTEITRTV--FIV--MYYAI-LRNKIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGG---YHAAPKKE--EM
-V-GPGDNGGVEDIKEDMFQVLVCR
->t37                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PY
-FMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIG
-L-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVT
-EYAVGV----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDDGMQN--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGA
-V-ERSQHYG-VYQEL----QNDHKSTIDANKNDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEH
-SVTFV-ISDAQKRLICGVSSMVMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP--FIV--MYVAI-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-SPGDNGGVEAIREDMFQVLVCK
->t35                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PY
-FMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIG
-L-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTVIPIYARVT
-EYAVGV----PRPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPQMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIYHKADVFAGTVAKKSQAMRS------RSIGSQSVGDDGMQN--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGA
-V-ERSQHYG-VYQEL----QNDHKSTIDANKNDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEH
-SVTFV-ISDAQKRLICGVSSMAMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIV--MYVAI-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-SPGDNGGVEAIREDMFQVLVCK
->t48                 
-LIVSDMRLIIREG--SDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PY
-FMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIG
-L-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEVGANVYEQYSRMKTVIPIYARVT
-EYAVGV----PRPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIYHKADVFAGTVAKKSQAMRS------RSIGSQSVGDDGMQN--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGA
-V-ERSQHYG-VYQEL----QNDHKSTIDANKNDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLIKQNEH
-SVTFV-ISDAQKRLICGVSSMVMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIV--MYVAI-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-SPGDNGGVEAIREDMFQVLVCK
->t55                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAI--PY
-FMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIG
-L-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVT
-EYAVGV----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLSTVHKPEMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDDGMQN--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRH-SSVDDNQC-VELLPYNCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGA
-V-ERSQHYG-VYQEL----QNDHKSTIDANKNDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEH
-SVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIV--MYVAI-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-SPGDNGGVEAIREDMFQVLVCK
->t46                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PY
-FMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIG
-L-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVT
-EYAVGV----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVKVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDDGMQN--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWMAKD-DALCPPCKEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQSLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRH-SSVDDNQC-VELLPYVCQRMDPWGHYVQVLAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGA
-V-ERSQHYG-VYQEL----QNDHKSTIDANKNDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKQNEH
-SVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPDNSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIM--MYVAM-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-APGDNGGVEAIREDMFQVLVCK
->t67                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVMDNWTFTKLKEGAPHCIAL--PY
-FMGIDMFHIQVFLGGD--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIG
-L-L-VIIKEANELMGRLNHKERKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVT
-EYAVGV----ARPFYD-AEFKNEAQRQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIHHKADVFAGTVAKKAQAMRS------RSIGSPSVGDDGMQN--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWVAKD-DTLCPPCKEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQTLMNDACSSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRM-SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLVLTRPVT---LHGLSILP---CPHASGKEQDGA
-E-ERSQHYG-VYQEL----QNDAKSTIDANKNPNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKLNEH
-SVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP--FIV--MYVAI-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-APGDNGGVEAIREDMFQVLVCK
->t57                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR
--YPKCMEGARCVHTVAGPP-SESPVWMFDKFMCQLTHSMVN--------GDLGRVVMDNWTFTKLKEGAPHCIAL--PY
-FMGIDMFHIQVFIGGD--LILPDPCYELSISVMYAGHASYNQKRCINGLDNGDRQDSDPQKEHKIRNSVLLYR---QIG
-L-L-VIIKEANEIMGRLNHKERKNGVIFPLR---GAQGPKQI------------------SNGLFEK-E-E------NR
-PMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVT
-EYAVGV----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKG
-ERCRTIL-KLLMVQLDE----KTLSQ-NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPV
-IIYFYQAPIIHHKADVFAGTVAKKAQAMRS------RSIGSPSVGDDGMQK--MPLMQNAVCVWSQMVRKVQPD-GQDK
-REQTWVAKD-DTLCPPCKDQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-SCNEVLKILAW
-WLCDSV-GDWQTLMNDACSSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALE
-W-EMDISHRV-SSVDDNQC-VELLPYLCQRMDPWGHYVQILAD-RLNLTRPVT---LQGLSILP---CPHASGKEQDGA
-V-ERSQHYG-VYQEL----QNDAKSTIDANKNPNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKQNEH
-SVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPNHDIKI------IEVYAPENSWETTKVV
--EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP--FIV--MYVAI-LRNDIMQYCFYYKE
-NRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--EL
-M-APGDNGGVEAIREDMFQVLVCK
->t56                 
-LIVSEWRLFIRDG--HDDAIDEM-CCEANELNNDIEKLVASMVKGFRGHDSQARNNAECII--AAPFIGV---RELFKR
--YIKCVEGAGCVYTVA-AP-SESPVWMFDKFMCHLTHSMVV--------GDLGRVLRDNTTFAKLKEGAPVCISL--PY
-FLGMDMFHQQVFMGGN--LILPDPCYELSISVMYAGHASYNQKRCLNNLDQGDREDSSHRKEHKIRRSVLLYQ---QIG
-C-L-VITRERNELMGRLNHKEPRDGVIFPHR---GAQGPKQL------------------ANGLFEK-E-E------NR
-PMVQDAGSVPER----AQWPGQQRAWCSSDDKA-----------SKLPRNTKMVAEIGANVYEQASRMKTNIPIYAHVT
-EYALGV----DRPFYD-SEFKNEAQGQGES-GTSIPCVDSPDVQYELKHAWVDKLMHT-ALYLMPLPTVHKPKMGTVKG
-ERCRAML-KLNMMQLDE----KTLSQ-NQIIK--LCQRTWLDASPLQ------IGVNCVLPGKKGGSNK-DYELAADPV
-IIYFYQAPIIHHKADVFSGTVAKKAQAMRQ------QSTGSQSVGDDGTQV--MPLMQNLVCVWSKMVRKCMID-GQEK
-REQTWMAKD-DKLCPPSQEQGEK---AAEPTQWED-----------------ICTANVIKLLYCKDC-SCNEVLRVLSW
-WLCDSV-GDWRTLMSDACALANPNPPVCVWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERKMWGKIFCLE
-W-EMDISHRH-SSVDDNVC-VEMLPFVCQKMDPWGHYVQILAD-RLDLTRPVT---LQGLGILV---CPHASGKEQDGA
-M-ERSQHYV-VYAEL----QNDHKNTINANKVPRKMLDWDTGKN-MDKGAKGMYHEIVLFF-------AENNVKKQVEH
-SVIFI-IADAQKRLICGVSSMCLQTFMNLACNPFFAKLFMEVIPMRYDYQTNHDIKI------KEVYAPENSWETIKNV
--EMVSGKAGKQINHEPQLPEQVI-PPCSLTVSNLKGMM-PPCPAMTEITRTV--III--MYYAI-LRNEIMQYCFYYKE
-NRSVR-----------INNTGQAELPK---------------------HHVQNVFID-ELYPGH---YHAAPKKN--EN
-V-GPGDNGGVEGIKEDMFQVLVCQ
->t13                 
-GIVSECRMIIRDE--HDDAIDEM-C------------LVASMVKKLSGCENQARNNHECAI--PPPFHGV---REMFKR
-VYE-CMEGIGCVNTVAGNP-SESSAWMFDKVMYQLTHSMVW--------GDLRRVVHDNVTFSKLKEGAPHCISH--PY
-FLGIDMFHIQVYSKGF--LTLPDPRYEISMSVMYSQHHSFSMKRCLNGLDHGDREESPHQIEHKMRKSVLIYN---PIG
-Y-L-VIIKDANSMMGRLNHHESRAVVAFPLR---GAEGPKQV------------------MEGLFDK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-NEWKQEAQGQGEA-GACIPCVDSKDVQYELKHAYVKKLMHT-SLYLMHIETCHKPVMGTVKG
-NRCRAIL-KLSMIQLDQ----KTLSQ-NQRAK--LCQRTWLDTSPLQ------MGMTLVLVGKKVGSKK-DYEVAADPV
-IMYFYDAPMIMRPTDVFEGTNNKKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKD-DTLCPQSRDQGEK---HHEPHHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLSSDACMHAEQNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEGKMMNKIFALE
-W-EMDMSHRV-SSVDDNYI-IEMLPFVCDRVGPWGHYAQVLAD-QLHLTRPHT---LRDLYILAC--CPVASGKEQDGN
-K-ERSQHYT-IYAEI----QNDHKNPISANNQPNKMLDWDTGKT-MDRGAA-MCGEIKLFY-------AEPNVWNQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFSKLFMEVVCMRYNYTSNHSIKI------FEVYADENSWENVRNF
--EMVSGRAGAHINHIPQLPEQAY-PPCKLTVSNLKGVA-ASCPAITEITRTA--VIV--MYGSI-LRNDVMQYVFYYRE
-NRSVR-----------QNNTGNAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKD--RF
-C-NPGDNGGMETYQEDMFQVLVCV
->t5                  
-GIVSECRMIIRDE--HDDAIDEM-C------------LVASMVKKLSGCENQARNNHECAI--PPPFHGV---REMFKR
-VYE-CMEGIGCVNTVAGNP-SESSAWMFDKVMYQLTHSMVW--------GDLRRVVHDNVTFSKLKEGAPHCISH--PY
-FLGIDMFHIQVYSKGF--LTLPDPRYEISMSVMYSQHHSFSMKRCLNGLDHGDREESPHQIEHKMRKSVLIYS---PIG
-Y-L-VIIKDANSMMGRLNHHESRAIVAFPLR---GAEGPKQV------------------MEGLFDK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-NEWKQEAQGQGEA-GACIPCVDSKDVQYELKHAYVKKLMHT-SLYLMHIETCHKPVMGTVKG
-NRCRAIL-KLSMIQLDQ----KTLSQ-NQRAK--LCQRTWLDTSPLQ------MGMTLVLVGKKVGSKK-DYEVAADPV
-IMYFYDAPMIMRPTDVFEGTNNKKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKD-DTLCPQSRDQGEK---HHEPHHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLSSDACMHAEQNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEGKMMNKIFALE
-W-EMDMSHRV-SSVDDNYI-IEMLPFVCDRVGPWGHYAQVLAD-QLHLTRPHT---LRDLYILAC--CPVASGKEQDGN
-K-ERSQHYT-IYAEI----QNDHKNPISANNQPNKMLDWDTGKT-MDRGAA-MCGEIKLFY-------AEPNVWNQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFSKLFMEVVCMRYNYTSNHSIKI------FEVYADENSWENVRNF
--EMVSGRAGAHINHIPQLPEQAY-PPCVLTVSNLKGVA-ASCPAITEITRTA--VIV--MYGSI-LRNDVMQYVFYYRE
-NRSVR-----------QNNTGNAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKD--RF
-C-NPGDNGGMDTYQEDMFQVLVCV
->t38                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR
--YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISQ--PF
-FLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHHIDHKMRKSVLIYN---PIG
-Y-L-VIIKNANSLMGRLNHHESRLIVTFPLR---GAEGPKQV------------------MEGLFLK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTIKG
-NRCRAIL-KLTMIQLDQ----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVGSKK-DYEIAADPV
-IMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKSQPD-GQDK
-RGYTWVAKE-DDLCPQSGDQGEK---YAEPQHIRN-----------------QFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALE
-W-EMDMSHRM-SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGA
-Q-ERSQCYT-IYAEL----QNDHKSLISANHVPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDH
-SVMFI-ISDAQNKLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------FEVYADENSWENIRNF
--EMVSGRAGAYINHIPQLPEQAV-PPCHLTVSNLKGVA-ASCPAITEITRTA--VIV--MYVSI-LRNDVMQYVFYYRE
-NRIVR-----------QNNTGVAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKE--RF
-C-NVGDNGGMETIQEDMFQVLVCI
->t33                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR
--YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PF
-FLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIG
-Y-L-VIIKNANSLMGRLNHYESRAIVTFPLR---GAEGPKQV------------------MEGLFLK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SHLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHN-SLYLMHIDTCHKPAMGTVKG
-NRCRAIL-KLTMIQLDQ----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVGSKK-DYEIAADPV
-IMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDACVSAEPNTPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALE
-W-EMDMSHRM-SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGA
-K-ERSQCYT-IYAEL----QNDHKSLISANHVPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------FEVYADENSWENIRNF
--EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAITEITRTA--VIV--MYVSI-LRNDVMQYVFYYRE
-NRIVR-----------QNNTGVAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKE--RF
-C-NPGDNGGMETIQEDMFQVLVCV
->t100                
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR
--YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PF
-FLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIG
-Y-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEGLFLK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKG
-NRCRAIL-KLTMIQLDQ----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVGSKK-DYEIAADPV
-IMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKE-DTLCPQSEDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALE
-W-EMDMSHRM-SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGA
-Q-ERSQCYT-IYAEL----QNDHKSLISANHVPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------FEVYADENSWENIRNF
--EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAITEITRTA--VIV--MYVSI-LRNDVMQYVFYYRE
-NRIVR-----------QNNTGVAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKE--RF
-C-NPGDNGGMETIQEDMFQVLVCV
->t34                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR
--YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PF
-FLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIG
-Y-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEGLFLK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKG
-NRCRAIL-KLTMIQLDV----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVGSKK-DYEIAADPV
-IMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALE
-W-EMDMSHRM-SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGA
-Q-ERSQCYT-IYAEL----QNDHKSLISANHVPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------LEVYADENSWENIRNF
--EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA--VIV--MYVSI-LRNDVMRYVFYYRE
-NRIAR-----------QNNTGVAELPK---------------------HHMQDIFID-ELYLGP---YHASPKKQ--RF
-C-NPGENGGMETIREDMFQVLVCV
->t84                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCDDQARNNHECAI--SHPFHGV---REMFKR
--YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PF
-FLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIG
-Y-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEGLFLK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKG
-NRCRAIL-KLTMIQLDV----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVGSKK-DYEIAADPV
-IMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDACVSAEHNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALE
-W-EMDMSHRM-SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGA
-K-ERSQCYT-IYAEL----QNDHKSLIAANHVPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------LEVYADENSWENIRNF
--EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA--VIV--MYVSI-LRNDVMRYVFYYRE
-NRIAR-----------QNNTGVAELPK---------------------HHMQDIFID-ELYLGP---YHASPKKE--RF
-C-NPGENGGMETIREDMFQVLVCV
->t92                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR
--YE-CMEGIGCVNTVAGNP-SESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PF
-FLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIG
-Y-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEGLFLK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVT
-EYAVGI----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKG
-NRCRAIL-KLTMIQLDV----KTLSQ-NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVGSKK-DYEIAADPV
-IMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDDDMLN--MPLTQNAMCVESEMVRKCQPD-GQDK
-RGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALE
-W-EMDMSHRM-SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGA
-Q-ERSQCYT-IYAEL----QNDHKSLISANHVPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDH
-SVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSNHSIKI------LEVYADENSWENIRNF
--EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA--VIV--MYVSI-LRNDVMRYVFYYRE
-NRIAR-----------QNNTGVAELPK---------------------HHMQDIFID-ELYLGP---YHASPKKE--RF
-C-NPGENGGMETIREDMFQVLVCV
->t3                  
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEQQARNNRECAT--SIPFLGV---RELWKR
--YE-CMEGIGCVNTVAGKP-SQSSVWMFDRFMYKLTHSMVW--------GDLGRVYWDNLTFQKLKEGAPHCIAV--PN
-YLNIDMFHIQVFYKGP--LTLPDPHYELSMSVMYAQHHSFSQKRCLNALDHGDREESPHQIEHKMRKSVLLYN---PIG
-Y-L-VIIKNANSMMGRLNHHESCAIVMFPLR---GAEGPKQI------------------IEGLFDK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SRLPRNDPVVHEVGANVYQQISRMKTSIPIYAHVT
-EYAVGI----IKPFYD-NEWKQEAQGQGEA-GASIPCVNSPDVQYELKHAHIKKLMHT-SLYLMHLGTCHKPVMGTVKG
-DRCRAIL-KLSMIQLDQ----KTLSQ-NVRAR--LCQRTWLDTSPLQ------MGMVAVLLGKKLGSKK-DYEIAADPV
-IKYFYQAPIIMRRTDVFEGTDDQKAQAMRV------RSTASQSIGDDDMLI--MPLVQNAMCVKSEMVRKCQPD-GPDK
-RGYTWMAKD-DTLCPVSAGQGEK---YAEPHQIKN-----------------KFSVNVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWVTLASDACLSAEPQPPVCVWQRELVPQL---NRNVEDLARVIYFGPDEH-------DEGKMMPKIFKLA
-W-EMDMSHRA-SSVDDNYV-IEMLPFVCHRVGPWGHYAQVQAD-QQNLTRPHT---LADLFILS---CPVASGKEQDGA
-T-ERSQYYV-VYAEL----QNDHKSPISANKHPDKMLDWDTGKS-MDRGAA-MCREIKLFY-------AEPNVWKQNDH
-SVVFI-ISDAVNRLICANSIMCGLTFMAMACNPHFAKLFMEVVCMRYDYFSNHSIKI------FEVYAEDDSWENICNF
--EMMSGRTGAQINHIPQLPEQVC-PPCHLTVSNLKGCC-ASVPAITEITRTV--VIC--MYVSI-LCNVVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGQ---YHASPKKK--KI
-C-GPGDNGGMETIEEDMFQVLVCV
->t22                 
-GIVSECRVIIRDQ--SDDAIDER-Y------------LVASVVKRLSGCENQARNNRECAI--SIPFLGV---RELWKR
--YE-CMEGIGCVNTVAGTP-SESSVWMFDRFMYKLTHSMVW--------GDLGRVYVDNQTFSKLKEGAPHCISA--PY
-YLNIDMFHIQVFYKGS--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDYGDREESPHQIEHKMRKSVLLYY---TIG
-W-L-VIIKNADSMMGRLNHHESCAMVMFPLR---GAEGPKQI------------------MEGLFDK-E-E------AR
-PMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPTNDPIVPEVGANVYQQVSRMKTSIPIYAHVT
-EYAVGI----VKPFYD-NEWKQEAQGQGEA-GASIPCVNSPDVQYELKHAHIKKLMHT-SLYLMHLKTCHKPVMGTVKG
-DRCRAIL-KLKMIQLDQ----KTLSQ-NQAAR--LCKRTWLDTSPLQ------MGMNVVLIGQKLGSKH-DYEIAADPV
-IMYFYQAPIIMRRTDVFEGTDDQKAQAMRL------RSTASRSIGDDDMLI--MPLVQNAMCVNPEMVRKCQPD-GQDK
-RGYTWMAKN-DTLCPVSAGQGEC---YAEPHQTCN-----------------KFRVNVIKLLYCKDC-SCNKVLKILKW
-QLCESV-DDWQTLASDACILAKPQPPVCVWQRELVPQL---NRNVEDLARVIYFGPDEH-------DEGKMMSKIFNLE
-W-EMDMSHRT-SSVDDNYV-IDMLPFICHRVGPWGHYAQVLAD-QINLTRPHT---LRDLFILA---CPVASGKEQDGA
-T-ERSQHYV-VYAEL----QNDHKSPISANKHPNKLLDWDTGKT-MDRGAA-MCHEIKLFH-------AEPNVWRQNDH
-SVMFI-ISDASNRLICANSIMCGLTFMAMACNPHFAKLFMEVVCMRYEYFSNHSIKI------FEVYAEENSWENVCNF
--EMMSGRAGAQINHIPQLPEQVC-PPCVLTVSNLKGCC-ASCPANTEITRTV--VIC--MYVSI-LRNVVMQYVFYYKE
-NRSVR-----------QNNTGAAELPK---------------------HHMQDIFID-ELYPGL---YHASPKKK--KV
-C-GPGDNGGMETIQEDMFQVLVCV
->t64                 
-GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECAIT-SPPFIGV---RELFKR
--YG-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW--------GDLRRVFPDNATFSKLKEGAPHVISH--PY
-FLGIDMFHDQVVYRGP--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIG
-F-L-VIIKNINSMMGRLNHHESRAVVGFPLR---GAENPKQI------------------MEGHFDK-E-E------AR
-PIVQDAASVPGK----AQWVGRVRAWCSSDVKA-----------SKLPRNDPIVPEVGANVYQQLSRMKTNIPIYAHVT
-EYAVGI----VKPFYD-NEWKQEAQGVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRAIL-KLPMIQLDQ----KTLSH-NQPRR--LCQRTWLDASPLQ------VGMNIMLMGKKAPSKK-DYEIAADPV
-IMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDDDMLK--MPLVQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQSANQGEK---YAEPHVIGD-----------------KVSVNVIKLLYCKDC-SCNQVLKILVW
-QLCESV-DDWQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMSKIFALE
-W-EMDMSHRV-SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTRPHT---LRDLFILS---CPVASGGEQDGN
-T-ERSQHYI-VYAEL----QNDHKSPISANKHLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDH
-SVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGANHDIKI------FEVYAAENSWENARNF
--EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIVID-ELYPGP---YHATPKKH--RF
-C-GTGDNGGMQAIQEDMFQVLVCV
->t18                 
-GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECAIT-SPPFIGV---RELFKR
--YG-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW--------GDLRRVFPDNATFSKLKEGAPHVISH--PY
-FLGIDMFHEQVVYRGP--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIG
-F-L-VIIKNINSMMGRLNHHESRAVVGFPLR---GAENPKQI------------------MEGHFDK-E-E------AR
-PIVQDAASVPGK----AQWVGRVRAWCSSDVKA-----------SKLPRNDPIVPEVGANVYQQLSRMKTNIPIYAHVT
-EYAVGI----VKPFYD-NEWKQEAQGVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRAIL-KLPMIQLDQ----KTLSH-NQPRR--LCQRTWLDASPLQ------VGMNIMLKGKKAPSKK-DYEIAADPV
-IMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDDDMLK--MPLVQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQSANQGEK---YAEPHVIGD-----------------KVSVNVIKLLYCKDC-SCNQVLKILIW
-QLCESV-DDWQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMFKIFALE
-W-EMDMSHRV-SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTRPHT---LRDLFILS---CPVASGGEQDGN
-T-ERSQHYI-VYAEL----QNDHKSPISANKHLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDH
-SVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGANHDIKI------FEVYAAENSWENARNF
--EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGP---YHATPKKH--RF
-C-GTGDNGGMQAIQEDMFQVLVCV
->t68                 
-GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECAI--SPPFIGV---RELFKR
--YG-CVEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW--------GDLRRVFPDNAHFSKLKEGAPHVISH--PY
-FLGIDMFHDQVVYRGP--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIG
-F-L-VIIKNINSMMGRLNHYESRAVVGFPLR---GAENPKQI------------------MEGHFDK-E-E------AR
-PIVQDAASVPEK----AQWVGRVRAWCSSDVKA-----------SKLPRNDPIVPEVGANVYQQISRMKTNIPIYAHVT
-EYAVGI----VKPFYD-NEWKQEAQGVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRAIL-KLPMIQLDQ----KTLSH-NQPRR--LCQRTWLDASPLQ------VGMNIMLMGKKAPSKK-NYEIAADPV
-IMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDDDMLK--MPLRQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQSANQGEK---YAEPVVIGD-----------------KVSVNVIKLLYCKDC-SCNQVLKILVW
-QLCESV-DDWQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMSKIFALE
-W-EMDMSHRV-SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTRPHT---LRDLFILS---CPVASGGEQDGN
-T-ERSQHYI-VYAEL----QNDHKSPISANKHLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDH
-SVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGANHDIKI------FEVYAVENSWENARNF
--EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGP---DHATPKKH--RF
-C-GTGDNGGMQTIQEDMFQVLVCV
->t28                 
-GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECAI--SPPFIGV---RELFKR
--YH-CMEGIGCVNTVAGMP-SESSVWMFDQFMYKLTHSMIW--------GDLGRVFPDNATFSKLKEGAPHVISH--PY
-FLGIDMFHAQVFYRGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNPLDHGDRQESSHGIEHNMRSSVLLYN---PIG
-F-L-VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------VEGHFDK-E-E------AR
-PIVKDAASVPGK----AQWVGRIRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQDSRMKTNIPIYAHVT
-EYACGI----VKPFYE-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRAIL-KLSMIQLDE----KTLSQ-NQRPG--LCQRTWLDANPLQ------MGMNTMLVGKKTPSKK-DYEIAADPV
-IMYFYQAPIIMRRTDVFEGTNNKKSQAMRV------QSTSSQSIGDDDMLN--MPLVQNAMCVSSEMVRKCQPD-GQNK
-RGCTWMAKN-DTLCPQSGNQGEK---FAEPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKMLKILVW
-QLCESV-DDWQTLASDPCVSAEPNSPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMSKIFALE
-W-EMDMSHRI-SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLSD-QIVLTRPHT---LRDLFILA---CRVASGGEVDGN
-T-ERSQHYI-VYAEL----QNDHKSPISANKVLNKMLDWDTGKT-MDREAA-MCREIKLFY-------AETNVWKQNDH
-SVMFI-ISDAQNRLICGNSIMCGITFMAMACNPHFAKLFMEVACMRYDYFANPDIKI------FEVYAAENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV--VIC--MYVSI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RY
-C-GPGDNGGMQVIEEDMFQVLVYV
->t82                 
-GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECAI--SPPFIGL---RELFKR
--YV-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW--------GDLGRVFPDNCTFSKLKEGAPHVISH--PY
-FLGIDMFHGQVVYRGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNPLDHGDRQESPHGIEHNMRSSVLLYN---PIG
-F-L-VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------MEGHFDK-E-E------AR
-PIVQDAASVPGE----AQWVGHIRAWCSSDIKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIYAHTT
-EYACGI----VKPFYE-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHANVKKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRAIL-KLNMIQLDQ----KTLSQ-NQRPG--LCQRTWLDASPLQ------MGMHIMLVGKKTPSKK-DYEIAADPV
-IMYFYQAPIIMQRTDVFEGTNNKKSQAMRV------HSTSSQSIGDDDMLN--MPLVQNAMCVSSEMVRKCQPD-GQNK
-RGYTWMAKH-DTLCPQSGNQGEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDPCMSAEPNPPVCVWQRELVPQL---NRNVEDLARTIYFGPDEH-------DEGKMMSKIYALE
-W-EMDMSHRV-SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLAD-QIVLTRPHT---LRDLFILA---CPVASGGEQDGN
-A-ERSQHYI-VYAEL----VNDHKSPISANKVLNKMLDWDTGKT-MDREAA-MCRDIKLFY-------AETNVWKQNDH
-SVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVACMRYDYFANPDIKI------FEVYADENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV--VIC--MYISI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RF
-C-GPGDNGGMQVIEEDMFQVLVYV
->t41                 
-GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECAI--SPPFIGL---RELFKR
--YV-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW--------GDLGRVFPDNCTFSKLKEGAPHVISH--PY
-FLGIDMFHGQVVYRGS--LTLPDPRYELSMSVMYSQHHSFSQKRCLNPLDHGDRQESPHGIEHNMRSSVLLYN---PIG
-F-L-VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------MEGHFDK-E-E------AR
-PIVQDAASVPGE----AQWVGHIRAWCSSDIKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIYAHTT
-EYACGI----VKPFYE-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHANVKKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRAIL-KLNMIQLDQ----KTLSQ-NQRPG--LCQRTWLDASPLQ------MGMHIMLVGKKTPSKK-DYEIAADPV
-IMYFYQAPIIMQRTDVFEGTNNKKSQAMRV------HSTSSQSIGDDDMLN--MPLVQNAMCVSSEMVRKCQPD-GQNK
-RGYTWMAKH-DTLCPQSGNQGEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLASDPCMSAEPNPPVCVWQRELVPQL---NRNVEDLARTIYFGPDEH-------DEGKMMSKIYALE
-W-EMDMSHRV-SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLAD-QIVLTRPHT---LRDLFILA---CPVASGGEQDGN
-A-ERSQHYI-VYAEL----VNDHKSPISANKVLNKMLDWDTGKT-MDREAA-MCRDIKLFY-------AETNVWKQNDH
-SVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVACMRYDYFANPDIKI------FEVYADENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV--VIC--MYISI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RF
-C-GPGDNGGMQVIEEDMFQVLVYV
->t71                 
-GIVSECRMIIRDQ--SDDAIDEMVV------------LVASMVKEMSGCENQARNNSECAI--SPQFIGV---RELFKR
--YR-CMEGIGCVNTVAGAP-SESSVWMFDRFMYKLTHSMVW--------GDLARVFHDNGTFAKLKEGAPHVISV--PY
-FLGIDMFHGQVFLRGS--LTLPDPRYELSMSVMYAQHHSFSQKRCLNHLDHGDRQESPHGIEHNMRKSVLLYN---PQG
-Y-L-VIIKNVNSMMGRLNHHESRAVVTFPLR---GADNPRQI------------------MEGHFDK-E-E------AR
-PVVQDAPGVPGK----AQWVGKVRAWCSSDVKA-----------SQLPRNDTIVPEVGANVYQQVSRVKTHIPIYAHVT
-EYAVGI----VKPFYN-NEWKQEAQGQGEA-GASIPCVDSPDDQYELKHAEVKKLMHD-SLYLPHLETCHKPIMGTVKG
-GRCRASL-KLKMIQLDQ----KTLSQ-NQQRR--LCQRTWLDSSPLQ------MGMKIMLQGKKTPSKK-DYEIAADPA
-IMHFYRAPIIMRRTDVFEGTNNKKAQAMRI------RSTASQSIGDDDMLN--MPLHQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQSPNQGEK---YAEPHQIRN-----------------KISVNVIKLLYCKDC-SCNQVLKILVW
-QLCESV-DDWQTLTSDPCVPAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALE
-W-EMDMSHRD-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRDLFILA---CPVASGGEQDGN
-T-ERSQHYI-VYAEL----QNDHKSPISANKHMNKMLDWDTGKT-MDFEAA-MCREIKLFY-------AETNVWKINDH
-SVMFI-VSDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEGVCMRYDYSANHDIKI------FEVYADENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVCNPPCHLTVSNLKGVC-ASCPAITEITRTV--VIV--MWISI-LRNDVMQYVVYYKE
-NRSVR-----------QNNTGKAELPR---------------------HPMQEIFID-ELYPGH---YHATPKKN--RF
-C-GPGDNGGMQSMQEDVFQVLVCV
->t94                 
-GIVSECRMIIRDQ--SDDAIDEMVC------------LVASMVKELSGCENQARNNRECAI--SPPFTGV---RELFKR
--YR-CMEGIGCVNTVAGIP-SESSVWMFDRFMYRLTHSMVW--------GDLGRVFQDNATFSKLKEGAPHVISH--PY
-FLGIDMFHGQVFYRGS--LTLPDPRYELSMSVMYAQHHSMSQKRCLNTLDHGDRQESPHGIEHNMRKSVLLYD---PIG
-Y-L-VIIKNVNSMMGRLNHHESRAKVTFPLR---GADNPRQI------------------MEGHFDK-E-E------AR
-PVVQDAPGVPEQ----AQWVGKMRAWCSSDVKA-----------SQLPRNDTIVPEVGANVYQQVSRVKTNIPIYAHVT
-EYAVGI----VKPFYN-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLPHLETCHKPIMGTVKG
-GRCRASL-KLNMIQLDQ----KTLSQ-NQQRR--LCQRTWLDASPLQ------MGMKIMLQGKKIPSKK-DYEIAADPA
-IMYFYQATIIMRRTDVFEGTNNKKAQAMRM------RSTASQSIGDDDMLN--MPLHQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLYPQSANQGEK---YAEPHQIRN-----------------KISVNVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLTSDPCVPAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALE
-W-EMDMSHRD-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-KLVLTRPHT---LRDLFILA---CYVASGGEQDGN
-T-ERSQHYI-VYAEL----QNDHKSPILANKVVNKMLDWDMGKT-MDFEAA-MCREIKLFY-------AETNVWKQNNH
-SVMFI-VSDAHNRLICGNSIMCALTFMAMACNPHFAKLFMEAVCMRYDYSANHDIKI------VEVYADENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVCNPPCHLTVSNLKGVC-ASCPAITEITRTV--VIV--MWISI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPR---------------------HPVQDIFID-ELYPGH---YHATPKKV--RF
-C-GPGDNGGMQAIQEDVFQVLVCV
->t99                 
-GIVSEVRMIIRDE--SDDAIDEM-C------------LVASMVKALSGCENQARNNRECAI--SPPFIGV---RELFKR
--YG-CMEGIGCVNTVAGIP-SESSIWMFDRFMYKLTHSMVW--------GDLGQVFPDVSTFSKLKEGAPHVISQ--PY
-FLGIDMFHDQVFYRGS--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDHGDRQESPHGIEHNMRKSVLLDS---PIG
-Y-L-VIIKNINSMMGRLNHHESRAVFAFPLR---GAENPKQI------------------MEGHFDK-EKE------AR
-PVVQDAPGVPGK----AQWVGRIRAWCSSDVKA-----------SELPRNDAIVPEVGANVYQQVSRMKTNIPIYAHAT
-EYAVGI----VKPFYD-NEWKQEAQGQGET-GASIPCVDSPDVQYEMKHAEVKKLMHD-SLYLMHIETCHKPIMGTVKG
-DRCRATL-KLKMIQLDQ----KTLSQ-NQKRR--LCQRTWLDASPLQ------MGMKMMLQGKKTPSKK-DYEIAADPV
-IMYFYQSPIIMRRTDVFEGTNNKKAQAMRV------RSTASQSIGDDEMLN--MPLVQNAMCVPSEMVRKCQPD-GQDK
-RGYTWMAKD-DPLCPQSANVGEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVW
-QLCDSVQDDWQPLTSDPCVNAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMNKIFALE
-W-EMDMSHRDSSSVDDNYI-IEMLPFVCHRVGPWGHYAQQLAD-RLVLTRPHT---LRDIFILA---CPVASGGEQDGN
-T-ERSQHYI-VYAEL----QDDHKSPISANKHMRKMLDWDTGKT-MDREAA-VCREIKLFY-------AETNCWKQNDH
-SVMFI-VSDAQNRLICGSSIMCRLTFMAMAVNPHFAKLFMEDVCMRYDYSPNHDIKI------FEVYADENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGR---YHATPKKN--RY
-C-GPGDNGGMQPIQEDMFQVLVCV
->t40                 
-GIVSECRMIIRDE--SDDAIDEV-C------------LVASMVKALSGCENQARNNRECAI--SPPFIGV---RELFKR
--YG-CMEGIGCVNTVAGIP-SESSVWMFDRFMYKLTHSMVW--------GDLGRVYPDNPTFSKLKEGAPHVISH--PY
-FLGIDMFHDQVFYRGS--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDHGDRQESPHGIEHNMRKSVLLDS---SIG
-Y-I-VIIKNLNSMMGRLNHHESRAVVTFPLR---GAEDPKQI------------------MEGHFDK-E-E------AR
-PVVQDAPGVPGK----AQWVGRVRAWCSSEIKT-----------SELPRNDAIVVEVGANVYQQISRMKTDIPIYAHAT
-EYAVGI----VKPVYD-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRATL-KLKMIQLDQ----KTLSQ-NQKKR--LCQCTWLDACPLQ------MGMKIMLQGKKTPSKK-DYEIAADPV
-IMYFYQSPIIMRRTDVFEGTNNKKAQAMRI------RSTASQSIGDDEMLN--MPQVQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQSANVGEK---YAEPHQIRN-----------------KVSTNVIKLLYCKDC-SCNKVLKILVW
-QLCDSV-DDWQTLTSDPCVSAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALE
-W-EMDMSHRN-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRNIFILA---CPVASGGEQDEN
-T-ERSQHYI-VYAEL----QNDHKSPIHANKVMNKMLDWDTGKT-MDREAA-MCREIKLFV-------AETNVWKQNDH
-SVMFIVISDAQNRLICGSSIMCRLTFMAMAVNPHFAKLFMEESCVRYDYSANHDIKI------FEVYANENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASVPAITEITRTV--VIC--MYISI-LRNNVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YQATPKKD--KF
-C-GPGDNGGMQTIQEDMFQVLVCV
->t90                 
-GIVSECRMIIRDE--SDDAIDEV-C------------LVASMVKALSGCENQARNNRECAI--SPPFIGV---RELFKR
--YG-CMEGIGCVNTVAGIP-SESSVWMFDRFMYKLTHSMVW--------GDLGRVYPDNPTFSKLKEGAPHVISH--PY
-FLGIDMFHDQVFYRGS--LTLPDPRYELSMSVMYAQHHSFSQKRCLNALDHGDRQESPHGIEHNMRKSVLLDS---PIG
-Y-I-VIIKNVNSMMGRLNHHESRAVVTFPLR---GAEDPKQI------------------MEGHFDK-E-E------AR
-PVVQDAPGVPGK----AQWVGRVRAWCSSEIKT-----------SELPRNDAIVPEVGANVYQQISRMKTDIPIYAHAT
-EYAVGI----VKPVYD-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKG
-DRCRATL-KLKMIQLDQ----KTLSQ-NQKKR--LCQCTWLDACPLQ------LGMKIMLQGKKTPSKK-DYEIAADPV
-IMYFYQSPIIMRRTDVFEGTNNKKAQAMRV------RSTASQSIGDDEMLN--MPLVQNAMCVSSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQSANQGEK---YAEPHQIRN-----------------KVSTNVIKLLYCKDC-SCNKVLKILVW
-QLCDSV-DDWQTLTSDPCVSAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALE
-W-EMDMSHRN-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRNIFILA---CPVASGGEQDEN
-T-ERSQHYI-VYAEL----QNDHKSPINANKVMNKMLDWDTGKT-MDREAA-MCREIKLFV-------AETNVWKQNDH
-SVMFIVISDAQNRLICGSSIMCGLTFMAMAVNPHFAKLFMEESCVRYDYSRNHDIKI------FEVYANENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASVPAITEITRTV--VIC--MYISI-LRNNVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKD--KF
-C-GPGDNGGMQTIQEDMFQVLVCV
->t4                  
-GIVSECRMIIRDE--PDDAIDEV-C------------LVASMVKELSGCENQARNNRECAI--SPPFIGV---RELFKR
--YG-CMEGIGCVNTVAGMP-SESSVWMFDRFMYKLTHSMVW--------GDLGRVFPDNATFSKLKEGAPHVISV--PY
-FLGIDMFHDQVFYRGS--LTLPDPRYEMSMSVMYAQHHSFSQKRCLNALDYGDRQESPHGIEHNMRKNVLLDN---PIG
-H-L-VIIKNENSMMGRLNHHESRAVVTFPLR---GAEDPKQK------------------MEGSFDK-E-E------AR
-PVVQDAPGVPGR----AQWVGRVRPWCSSDVKA-----------SELPRNDAIWPEVGANVYQQISRMKTNIPIYPHVT
-EYAVGI----VKPFYL-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLWHLETCVKPIMGTVKG
-DRCRATL-KLKMIVLDP----KTLSQ-NQKRR--LCQRTWLDASPLQ------VGMKIMLQGKKTPSKK-DYEIAADPV
-IMYFYQSPIIMRHTDVFEGTNNKKAQAMRL------RSTASQSIGDDEMLN--MPLIQNAMCVQSEMVRKCQPD-GQDK
-RGYTWMAKD-DTLCPQLHNQAEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-SCNKVLKILVW
-QLCESV-DDWQTLTSDPCISAEPNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEGKMMGKIFALE
-W-EHDMSHRD-SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRDIFILA---CPVASGGEQDAV
-T-ERSQHYI-VYAEL----QNDHKSPISASKHMNKMLDWDTGKT-MDREAA-MCREIKLFY-------AETNVWKQNDH
-SVMFI-ISDAQNRLICGSSIMCGLTFMATACNPHFAKLFMEEVCMRYDYAANHDIKI------SEVYAEENSWENVRNF
--EMMSGRAGAQINH-PQLPEQVV-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNVVMQYVFYYKE
-NRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RC
-C-GPGDNGGMQTVQEDMFQVLVCV
->t36                 
-MIWSEVRKMVRER--REQAIDNK-C------------LIAARVKMMSGYVLQVRNALEDAL--YVFFTGTKGTRELVKY
--YM-CMEGHGCVNTMAKKS-SQSGIWKFNAFMC-LMHLMEG--------GDL--------------------CSY--PS
-FLGMCMFHAMVQSKGD--LVLPDSPNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSEHIKEKHMRI----YA---NIG
-G-H-IIIREWNDVMGRLNHIEPGAEVIFPLRK--RGQHSKPV------------------IDGFFAK-D-E------DR
-PGIQNAVSVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYRINRKVGANAYDQDSRMKAAAPVYPHIM
-EYAHGM----FNPFYGLSEPKNNAQGNGEN-PMNKPCVESEDCQYEKKHASMDKLMHQ-SLYLMHINIMSKPAMGEWVG
-NRCRNELTALRIIQLDVGVSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVMSVEKKEASPK-EFEVAADPT
-VIYFYRNLIIQKITDVLSAVRMESPQEMRT------QDVNSSSLGDNNGQA--MNIVPYWVCVASGVVRKTHKD-SVDK
-RGQTWTAKS-DFLCPLAVDQGEP---GAEQKPAVGEENPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLYADSCPIA-VNAAVCGWKRELVPGL---NHSCEHLAKSVYFEPDGE-------GEGKVMLKIFGLD
-WCEVERSHEH-SSVDDNYN-VNMLPFQNSRKDPVGHYVQDLED-ARRLIRPGT---ARSLTILF-YGCQYYSGEFQDCE
-I-ERSQLYN-VYCEH----KQDHKSAIIANKQEQKGMDWNTGKE-MEQGPK-IILHGSLFF-------AEPNIVRQPGV
-SHIFI-GNDARRVLICGKSMMPGHRFMREACVPFFHKLFMAVNQMRYDYMMNYDIKIYETHWRMGVYALDNSWETLNVS
--EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIKIY--MWGTINFKNRVMQYCNYYKE
-NRSVR-----------INNTGLAELPK---------------------YHHQNILID-ELYSNV---YPAAPKKH--QY
-M-GVGDVGGYEVICENLFQILVVE
->t87                 
-MIWSEVRKMVRER--REQAIDNK-C------------LIAARVKMMSGYMLQVRNALEDAL--YVFFTGNKGTRELVKY
--YM-CMEGHGCVNTMAKKS-SQSGIWKFNAFMC-LMHLMEG--------GDL--------------------CSY--PS
-FLGMCMFHAMVQSKGD--LVLPDSPNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHVKEKHMRI----YA---NIG
-G-H-IIIREWNDVMGRLNHIEPGAEVIFPLRK--RGQHSKPV------------------IDGFFAK-D-E------DR
-PGIQNAMSVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYRINRKVGANAYDQDSRMKAAAPVYPHIM
-EYAHGM----FNPFYGLSEPKNNAQGNGEN-PMNKPCVESEDCQYEKKHASMDKLMHQ-SLYLMHINVMSKPAMGEWVG
-NRCRNDLTALRIIQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCLVMSVEKKEASGK-EFEVAADPT
-VIYFYRNLIIAKITDVLSAVRMESPQEMRE------QDVNSSSLGDNNGQA--MNIVPYWVCVGSGVVRKTHKD-SVDK
-RGQTWTAKS-DFLCPLAMDQGEI---GAEQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLYADSCPIA-INAAVCGWKRELVPGL---NHSCEHLAKSVYFEPDGE-------GEGKVMLKIFGLD
-WCEVERSHEH-SSVDDNYN-VNMLPFQNSRKDPVGHYVQDLED-ARRLIRPGT---ARSLTILF-YGCQYYSGEFQDCE
-I-ERSQLYN-VYCEH----KQDHKSAIIANKQEQKGMDWNTGKE-MEQGPK-VILHGTLFF-------AESNIVRQPGV
-SHIFI-GNDARRVLICGLSMMPGHRFMREACVPFFHKLFMAVNQMRYDYMVNYDIKIYETHWRMGVYALDNSWETLNVS
--EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIKIY--MWGTICFKNRVMQYCNYYKE
-NRSVR-----------INNTGLAELPK---------------------YHHQNILID-ELYSNV---YPAAPKKH--QY
-M-GVGDVGGYEMICENLFQILVVE
->t89                 
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY
--YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSY--PS
-FLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIG
-G-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDGFFAK-D-E------ER
-PGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIM
-EYAHGM----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVG
-VRCRNELTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPT
-VIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDNNGQA--MNIVPYWVCVASGVVRKMHKD-SVEK
-RGQTWEAKS-DFLCPLAVDQGEP---AAEQRPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLE
-WCEVERSHEH-SSIDDNYT-VNMLEFPNSRKDPVGHYVQNLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCE
-V-ERSQCYN-VYCEL----KQDHKSAIIANKQEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGV
-SHIFT-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYVTNYDIKIYETHWRVGVYAIDNSWETLNVS
--EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQYCNYYKE
-NRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNNI---YPAAPKKH--KF
-L-GVGDVGGYEIICENLFQILVVE
->t39                 
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY
--YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSY--PS
-FLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIG
-G-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDGFFAK-D-E------ER
-PGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIM
-EYAHGM----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVG
-VRCRNELTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPT
-VIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDNNGQA--MNIVPYWVCVASGVVRKMHKD-SVEK
-RGQTWEAKS-DFLCPLAVDQGEP---AAEQRPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLE
-WCEVERSHEH-SSIDDNYT-VNMLEFPNSRKDPVGHYVQNLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCE
-V-ERSQCYN-VYCEL----KQDHKSAIIANKQEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGV
-SHIFT-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYVTNYDIKIYETHWRVGVYAIDNSWETLNVS
--EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQYCNYYKE
-NRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNNI---YPAAPKKH--KF
-L-GVGDVGGYEIICENLFQILVVE
->t8                  
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY
--YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSY--PS
-FLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIG
-G-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDGFFAK-D-E------ER
-PGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIM
-EYAHGM----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHVNIMSKPAMGEWVG
-VRCRNELTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPT
-VIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDNNGQA--MNIVPYWVCVASGVVRKMHKD-SVEK
-RGQTWEAKS-DFLCPLAVDQGEP---AAEQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLE
-WCEVERSHEH-SSIDDNYT-VNMLPFPNSRKDPVGHYVQDLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCE
-V-ERSQCYN-VYCEL----KQDHKSAIIANKQEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGV
-SHIFT-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAANQMRYDYVTNYDIKIYETHWRVGVYAIDNSWETLNVS
--EMTSGRMGAKINHLPRLPEHVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQYCNYYKE
-NRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNDI---YPAAPKKH--KF
-L-GVGDVGGYEIICENLFQILVVE
->t6                  
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY
--YM-CMEGEGVVNTMAKKS-SQSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSH--PS
-FLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHEKRCLNPLNVGDREDSDHTKEKHMRI----YA---NIG
-G-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDGFFAK-D-E------ER
-PGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKVVRKVGANAYDQVSRMKAAAPVYPHIM
-EYAHGM----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVG
-VRCRNELTALRIVQLDVGHSGKTLGQ-NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPT
-VIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDNNGQA--MNIVPYWVCVASGVVRKMHKD-SVEK
-RGQTWEAKS-DFLCPLAVDQGEP---AAEQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLE
-WCEVERSHER-SSIDDNYT-VNMLPFPNSRKDPVGHYVQDLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCE
-V-ERSQCYN-IYCEL----KQDHKSAIIANKQEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGV
-SHIFI-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYMTNYDIKIYETHWRVGVYAIDNSWETLNVS
--EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQYCNYYKE
-NRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNNI---YPAAPKKH--KF
-L-GVGDVGGYEIICENLFQILVVE
->t58                 
-MIWSEYRHMVREG--RDQAIDNK-C------------LIAARVKVMSGYVLQVRNAPEDAL--YNFFTGHKGTRELVKY
--YM-CMEGEGCVNTMAKKS-SQSGIWKFNAFMC-LMHLMQG--------GDL--------------------CSH--PS
-FLGMCMFHAMVKSKGN--LVLPDSCNEDSVSFMYIQHHSFHEKRCLNHLNVGDREDSEHIKEKHMRV----YA---SIG
-G-H-IIIREWNDVMGRLNHIEPGAEVTFPLRR--RGQASKPV------------------IDGFFAK-D-E------DR
-PGIQNAMSVPCG----DQWVGSVRGWCSSQHRYGLAIHILVHQQSRLHKTYNIDRKNGANAYEQDSRMKAGAPVYPHIM
-EYAHGM----FNPFYGMSEPKNNAQGNGEN-PMNVPCVESDDCQYEKKHASMDKQMHQ-SLYLMHMNIMSKPAMGEWVG
-NRCRNELTALHVVQLDVGFSGKTLGQ-NIGISELLNDRTWLATSPLE------IGCGVMAVEKKEASPK-EFEVAADPT
-VIYFYRNLIIQHITDVLSAVRMDSPQEMRV------QDVNSPSLGDNNGQA--MNIVPYWVCVVSGVVRKTHKD-SVEK
-RGQTWTAKS-DFLCPIAVNQGEP---GAEQKPAVGA-NPIVKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLFADSCPTA-VNAAVCAWKRELVPGL---NHSCEHLAKSVYFEPDGE-------DEGKMMLKIFGLD
-WCEVERSHEH-SSVDDNYN-VNMLPFPNSRQDPVGHYVQDLED-LLRLIRPGT---ARSLTVLF-YGCQYYSGQFQDCE
-I-ERSQLYN-VYCEL----KQDHKSAIMANKQEQKGMDWNTGKE-MEQGPK-IILHGVLFF-------AEPNVVRQPGV
-SHIFV-GNDARRMLICGLSMMPGHRFMKEACVPFFHKLFMAVRRMRYDYMSNYDIKIYETHWRPGVYALDNSWETLNVS
--EMTSGRIGAKINHLPRLPETVI-PPCVLTVSGLKDTM-AGMKHGTEITKTPDIKIH--MWGTINFKNKVMQYCTYYKE
-NRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYSNI---YPATPKKH--QY
-M-GVGDVGGYEVICENLFQILVVE
->t54                 
-MIWSEYRHMVREG--RDQAIDNK-C------------LIAARVKVMSGYVLQVRNAPEDAL--YNFFTGHKGTRELVKY
--YM-CMEGEGCVHTMAKKS-SQSGIWKFNAFMC-LMHLMQG--------GDL--------------------CSH--PS
-FLGMCMFHAMVQSKGN--LVLPDSCNEDSVSFMYIQHHSFHEKRCLNHLNVGDREDSEHIKEKHMRI----YA---SIG
-G-H-IIIREWNEVMGRLNHIEVGAEVTFPLRR--RGQASKPV------------------IDGFFAK-D-E------DR
-PGIQNAMSVPCG----EQWVGSVRGWCSSQHRYGLAIHILVHQQSRLHKTYNIDRKNGANAYDQDSRMKAGAPVYPHIM
-EYAHGM----FVPFYGMSEPKNNAQGNGEN-PMNVPCVESDDCQYEKKHASMDKQMHQ-SLYLMHMNIMSKPAMGEWVG
-NRCRNELTALHIVQLDVGFSGKTLGQ-NIGISELLNDRTWLATSPLE------IGCGVMAVEKKEASPK-EFEVAADPT
-VIYFYRNLIIQHITDVLSAVRMDSPQEMRV------QDVNSPSLGDNNGQA--MNIVPYWVCVVSGVVRKTHKD-SVEK
-RGQTWTAKS-DFLCPIAVNQGEP---GAEQKPAVGA-DPIVKPWQFVIMNTTTFAKNIFRLLYVKDV-SCNGVLPLLKW
-QLCDSH-GDWQSLFADSCPIA-VNAAVCAWKRELVPGL---NHSCEHLAKSVYFEPDGE-------DEGKMMLKIFGLD
-WCEVERSHEH-SSVDDNYN-VNMLPFPNSRKDPVGHYVQDLED-LLRLIRPGT---ARSLTVLF-YGCQYYSGEFQDCE
-I-ERSQLYN-VYCEL----KQDHKSAIMANKQEQKGMDWNTGKE-MEQGPK-IILHGVLFF-------AEPNVVRQPGV
-SHIFV-GNDARRMLICGLSMMPGHRFMKEACVPFFHKLFMAVRRMRYDYMTNYDIKIYETHWRPGVYALDNSWETLNVS
--EMTSGRIGAKINHLPRLPETVI-PPCVLTVSGLKDTM-AGMKHGTEITKTPDIKIH--MWGTINFKNKVMQYCTYYKE
-NRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYSNI---YPATPKKH--QY
-M-GVGDVGGYEVICENLFQILVVE
->t65                 
-MIWSEYRQMVREG--NDQSIDNK-C------------LIADRVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNS--PS
-FLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRK--GGQDSKPF------------------IDGFF------------DR
-PGIANAMSVKCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECQYEHKHAAMEKLMHH-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-EVEVAAD--
--IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPVLVCIQKVDSVSLGDDDPQM--MNIVPYWVCVCSGVVKKAEPD-SVDK
-RGKTWVAKS-DFLCPAAVNEGEH---GAEQRP-FGTQNPVCKPWRFVIMNTQTFAKNIIRLLYIKDI-SCNQVLQLLDW
-QLCDSH-GDWQSLMADSCPNA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEGQMTMKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDYKSAIIANQQEHKGMEWDTGKE-MQQGPK-VVVHLALFYAPSNVLAAEPNIIGQPQV
-SHVFV-GNDARRMLIVGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYMWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTV-AGAPDETEITKSPVIHIV--MWADIMFKNCVMQYCTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDV---YPAAQKKY--QV
-M-GVGDIGGYELICEDLFQILVCQ
->t29                 
-MIWSEYRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNC--PS
-FLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLFVGDSQDSQHQREKQLRI----YG---RIG
-K-V-VIIKVWNAAMGRLNHVEPPAEVMFPLRR--GGSDSKPF------------------LDGFF------------DR
-PGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILIHGPSKLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIM
-EYAHGM----VKPFYGQSEPKNEAQGNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMPKPVMGDWDG
-NRCRAELTALQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-EVEVAAD--
--IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPVLVCIQKVDSVSLGDDDPQM--MNIVPYWVCVCSGVVKKAEPD-SVDK
-RGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGTHNPVCKPWRFVIMHTQTFSKNIIRLLYIKDI-SCNQVLQLLDW
-QLCDSH-GDWQSLMADSCPNA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMSQKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELEDSALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDYKSAIIANQQDHKGMEWDTGKE-MQQGPK-VVVHLALFYMPSNVLAAEPNIIGQPQV
-SHWFV-GNDARRMLIVGVSMMPAYKFMREACVPFFRKLFMADNQVRYDYMWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTV-AGAPDETEITKSPVIHIV--MWADIMFKNCVMQYCTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDL---YPAAPKKY--QE
-M-GVGDIGGYELIVEDLFQILVCE
->t98                 
-MIWSEHRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTKELVKF
--YF-CMEGCGCVNTMAKKS-SQSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNS--PP
-FLGMCMFHPQVQMKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRR--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHNPSRLHRTYAINKKMGANVYQQSSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALQTVQLDVGSSEKTLGQ-NIVTSKRLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-EVEVAAD--
--IYFYRNMVVQRHTDVVAAVRMQSPQEMRNPVLVCIQKVDSASLGDDDPQM--MKIVPYWVCVCSGVVKKAEPD-SVDK
-RGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNTQTFSKNIIRLLYIKDI-SCNQVLQLLDW
-QLCDSH-GDWQSLMADSCPPA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMTMKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-MFERSQLYR-VYCEI----KKDYKSAIIANQQEHKGMEWDTGKE-MQQGPK-IVVHLGLFYMPSNVLAAEPNIIGQPQV
-SHVFV-ANDARRMLIVGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVT-PPCDLTVSGLKRTV-AGPPDETEITKSPVIHIV--MWADIVFKNCVMQYCTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNLLTD-ELYSDI---YPAAPKKY--QV
-M-GVGDIGGYELIVEDLFQILVCE
->t83                 
-MIWSEYRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTKELIKF
--YF-CMEGCGTVNTMAKDS-SQSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNS--PS
-FLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRR--GGSCSKPF------------------VDGFF------------DR
-PGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILIHNPSRLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALQTVQLDLGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGIMVQEKKIASPQ-EVEVAAD--
--IYFYRNMVVQRHTDVVAAVRMQSPQEMRNPVLVCIQKVDSISLGDDDPQM--MNIVPYWVCVCSGVVKKAEPD-SVDK
-RGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGTQNPVCRPWRFVIMNMQTFSKNIIRLLYIKDI-SCNQVLQLLDW
-QLCDSH-GDWQSLMADSCPPA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMTMKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSD
-MFERSQLYR-VYCEI----KKDYKSAIIANQQEHKGMEWDTGKE-MQQGPQ-IEVHLALFYMPSNVLPAEPNIIGQPQV
-SHVFV-GNDARRMLIVGVSLMPAYKFMREACVPFFRKLFMAENQVRYDYMWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTI-AGAPDETEITKSPVIHIV--MWADIMFKNCVMQYCTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNLLTD-ELYSDI---YPAAPKKY--QV
-M-GVGDIGGYELIVEDLFQILVCE
->t95                 
-MIWSEYRQMVREG--TDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQL--------GDL--------------------CNP--PS
-FLGMCMFHPQVRSKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYTGDSQDSQHLREKQLRI----YG---RIG
-R-V-VILQVWNAVMGRLNHHEPPAEVMFPLRK--GGSNSKPV------------------YDGFF------------DR
-PAIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINRKVGANVYQQTSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECVYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-HRCRAELTELQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-QVEVAAD--
--IYFYRNMVVQRLTDVVAAVRMQSPQEMRCRKLVCIQKVDSPSLGDDDPQM--MNIVPYWVCVCSGVVKKAEPD-SVDK
-RGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGGQNPACKPWHFVIMNRQTFAKNMIRLLYIKDI-SCNEVLQLLDW
-QLCDSH-GDWQSLIADSCPNA-SNIAVCCWKRELMPGL---NFSCEHLAKTVYFKPDGE-------DEGQMIMKIFNLD
-WCEVEKSHEK-SSVDDNYD-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALIILF-YGCQYYSGKFQDSE
-LFERSQLYR-MYCEI----KKDHKSAIIANQQEHKGMEWDTGKE-MQQGPK-VVLHHALFYAPSNVLAAEPNIIGQPQV
-SHVFV-GNDARRMLITGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWNYDIKIYETHYRMGVYAVDNSWETLVYC
--EMTSGRIGAKVNHLPRLPEQVT-PPWVLTVSGLKRTV-AGAPDETEITKSPIIHII--MWEEIMFKNCVMQYCTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QV
-M-GVGDIGGYELICEDLFQILVCE
->t20                 
-MIWSEYRQMVREG--TDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQL--------GDL--------------------CNP--PS
-FLGMCMFHPQVRSKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDSQDSQHLREKQLRI----YG---RIG
-R-V-VILQVWNAVMGRLNHHEPPAEVMFPLRK--GGSNSKAV------------------YDGFF------------DR
-PGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINRKVGANVYQQMSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECVYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-HRCRAELTELQTVQLDVGSSGKTLGQ-NIVTSKKLGDRTWLAAPPLQ------IGCDVMVQEKKIASPQ-QVEVAAD--
--IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPKLVCIQKVDSPSLGDDDPQC--MNIVPYWVCVCSGVVKKAEPD-SVDK
-RGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGGQNPACQPWHFVIMNTQTFAKNMIRLLYIKDI-SCNQVLQLLDW
-QLCDSH-GDWQSLIADSCPNA-VNIAVCCWKRELMPGL---NFSCEHLAKTVYFKPDGE-------DEGQMIMKIFNLD
-WCEVEKSHEK-SSVDDNYD-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALIILF-YGCQYYSGKFQDSE
-LFERSQLYR-MYCEI----KKDHKSAIIANQQEHKGMEWDTGKE-MQQGPK-VVLHHALFYAPSNVLAAEPNIIGQPQV
-SHVFV-GDDARRMLITGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWNYDIKIYETHYRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVT-PPWVLTVSGLKRTV-AGAPDETEITKSPIIHII--MWEDIMFKNCVMQYCTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QV
-M-GVGDIGGYELICEDLFQILVCE
->t69                 
-MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGHKGTRELVKY
--YH-CMEGCGCVNTMAKSS-SQSAPWKFNRFMC-LMHLMQE--------GDL--------------------CNS--PG
-FLGMCMFHPQVQRKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRM----YG---EIG
-K-V-VIIKVVNAVMGRLNHVEPSAEVMFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQISRMKALAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALKTGQLDVGSSGKTLGQ-NIMTSKKLGDRTWLAANPLQ------IGRGVMVWEKKVASPQ-EVEVAAD--
--IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDDVPQM--MNIVPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKS-DFLCPPAMNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNTETFAKNIIRLLYVKDV-SCNQVLQLLDW
-QLCDSH-GDWQSLVADSCPNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEGQMIVKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHNSAIIANQQEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQV
-SVVFV-GNDGRRMLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYAWNYNIKIYETHFRDGVYAVDNSWETLVYV
--EMASGRIGAKINHQPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPIIHIV--MWADIMFKNCVMQYCNYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QI
-M-GVGDIGGYELICEDLFQILVCE
->t2                  
-MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELVKY
--YH-CMEGCGCVNTMAKSS-SQSAPWKFNRFMC-LMYLMQD--------GDL--------------------CNS--PG
-FLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRM----YG---EIG
-K-V-VIIKVVNAVMGRLNHHEPSAEVMFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWMGSIKGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQISRMKALAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALKTGQLDVGSSGKTLGQ-NIMVSKKLGDRTWLAASPLQ------IGCGVMVWEKKVPSPQ-EVEVAAD--
--IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDDVPQM--MNIVPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKS-DFLCPPAMNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNVETFAKNIIRLLYVKDV-SCNQVLQLLDW
-QLCDSH-GDWQSMVADSCHNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEGQMMVKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHNSAIIANQQEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQV
-SVVFV-GNDARRMLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYNWNYNIKIYETHFRVGVYAVDNSWETLVYV
--EMASGRIGAKINHMPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPIIHIV--MWADIMFKNCVMQYCNYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QI
-M-GVGDIGGYELICEDLFQILVCE
->t10                 
-MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELVKY
--YH-CMEGCGCVNTMAKSS-SQSAPWKFNRFMC-LMYLMQD--------GDL--------------------CNS--PG
-FLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRM----YG---EIG
-K-V-VIIKVVNAVMGRLNHHEPSAEVMFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWMGSIKGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQISRMKALAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQGNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALKTGQLDVGSSGKTLGQ-NIMVSKKLGDRTWLAASPLQ------IGCGVMVWEKKVPSPQ-EVEVAAD--
--IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDDVPQM--MNIVPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKS-DFLCPPAMNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNVETFAKNIIRLLYVKDV-SCNQVLQLLDW
-QLCDSH-GDWQSMVADSCHNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEGQMMVKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHNSAIIANQQEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQV
-SVVFV-GNDARRMLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYNWNYNIKIYETHFRVGVYAVDNSWETLVYV
--EMASGRIGAKINHMPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPIIHIV--MWADIMFKNCVMQYCNYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QI
-M-GVGDIGGYELICEDLFQILVCE
->t31                 
-MIWSEYRSMVREG--ADQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY
--YF-CMEGCGCVNTMAKQS-SQSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNL--PS
-FLGMCMFHNQVQCKGE--LVLPDNVNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRI----YQ---NIG
-K-V-VIIKVWNANMGRLNHHEPPAEVMFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMNVPCG----DQWVGCIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQTSRMKAAAPIYPHIM
-EYAHGM----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVG
-NRCRAELTALKTVQLDVGSNGKTLGK-NIMTPKKLGDRTWLAASPLQ------IGCGVMVQEKKVASPQ-EVE-AAD--
--IFFYRNMVIQRLTDVVAAVRMQSPQEMRPPVLVCIQYVDSPSLGDDTPQM--MNIAPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKA-DFLCPPAVSEGEH---GAEQRPVFGMQNPACKPWRFVIMNTQTFAKNIIRLLYIKDV-SCNAVLQLLDW
-QLCYSH-GDWQSLIADSCPTA-ANIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMIMKIFNLD
-WCEVEKSHEK-SSVDDNYH-VNMLPFAQSNRDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHKSAIIANQHEVKGMDWNTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIVGQPQV
-SHVFV-GNDARRMLIVGVSVMPSYKFMREACVPFFHKLFMADNQVRHEYMWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGANINHLPRLPEQVV-PPCILTVSGLKRTI-AGSPDETEITKTLIYHIV--MWADIMFKNCVMQYSTYYKE
-NRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRV
-M-GVGDIGGYEMICEDLFQILVCE
->t15                 
-MIWSEYRSMVREG--SDQSIDNH-C------------LIAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNS--PS
-FLGMCMFHNQVPNKGA--LVLPDNVNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRI----YP---SIG
-K-V-VIIKVWNAAMGRLNHHEPPAEVMFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWVGCIRGWCSSQHQYGLANHILVHGPSKLHRTYAINRKMGANVYQQTSRMKAAAPLYPHIM
-EYAHGM----VEPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVLGDWVG
-NRCRAELTALKTVQLDIGNSGKTLGQ-NIMTPKRLGERTWLAASPLQ------IGCGVVVQEKKVASPQ-EVEVAAD--
--IYFYRNMVIQTLTDVVAAVRMQSPQEMRPPVLVCIQDVDSVSLGDDTPQM--MNIAPYWVCVCSGVVKKTQPD-SVDK
-RGKTWVAKS-DFLCPPAVSEGEH---GAEQRPVFGMRNPICKPWRFVIMNTQTFAKNIIRLLYVKDV-SCNAVLQLLDW
-QLCYSH-GDWQSLIADSCSTA-ANIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMIVKIFHLD
-WCEVEKSHEK-SSVDDNYH-VNMLPFAQSNGDPVGHYVQGLED-ALRLIRPGT---ARALVILS-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHKSAIVANQQEVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIVGQPQV
-SHVFV-GNDARRMLIVGVSVMPAYKFMREACVPFFHKLFMAENQVRHDYMWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQYSTYYKE
-NRSVR-----------GNNTGGAELPK---------------------YHQQNILTD-ELYSDV---YPTAPKKYVIRV
-M-GVGDIGGYELICEDLFQILVCQ
->t63                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKLMSGVVRQVRNAPEDAL--YTFFTGQKGKRELIKY
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQD--------GDL--------------------CNS--PS
-FLGMCMFHNQVSFKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDEQDSSHLREKQLRL----YA---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAAVMFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWMGIIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVG
-SRCRAELTALKTVQLDVGSSGKTLGQ-NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVASPQ-EVEVAAD--
--IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDDTPQK--MNIAPYWVCVCSGVVKKAQLD-SVEK
-RGKTWVAKS-DFLCPPAVSEGEH---GPEQRPVFGVQNPVCKPWRFVIMNTQTFAANIIRLLYVKDV-SCNAVLQLLDW
-QLCYSH-EDWQSLIADACPTA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEGQMFMKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFVQSNGDPVGHYVQGLED-ALLLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHKSAIIANQQGVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIIGQPQV
-SHVFV-DNDARRMLIVGQSVMPPYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAIDNSWETLVYC
--EMTSGRIGAKINHQPRLPEQVV-PPCVLTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQYSTYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQ
-M-GMGDIGGYELICEDLFQILVCE
->t50                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKLMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNHFMC-LMHLMQN--------GDL--------------------CNS--PS
-FLGMCMFHNQVSVKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSSHLREKQLRL----YA---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRK--CGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWMGVIRGWCSSQHQYGLANHVLVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVG
-SRCRAELTALKTVQLDVGSSGKTLGQ-NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVASPQ-EVEVAAD--
--IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDDTPQK--MNIAPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKS-DFLCPPAVSEGEH---GPEQRPVFGVQNPVCKPWRFVIMNTQT-AKNIIRLLYVKDV-SCNAVLQLLDW
-QLCYSH-GDWQSLIADACSTA-VNIAVCCWKRELMPGL---NHSVEHLAKSVYFKPDGE-------DEGQMIMKIFNLD
-WCEVEKSHEK-SSVDDNYN-VNMLPFVQSNGDPVGHYVQGLED-ALLLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHKSAIMANQQGVKGMDWDTGKE-MQQGPK-IVMHLALFYAPSNVLAAEPNIIGQPQV
-SHVFV-DNDARRMLIVGQSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHQPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQYSTYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQ
-M-GMGDIGGYELICEDLFQILVCE
->t25                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNS--PS
-FLGMCMFVNQVSFKGE--LVLPDNPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSSHLREKQLRL----YA---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAEVVFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWMGVIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVG
-SRCRAELTALKIVQLDVGSSGKTLGQ-NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVASPQ-EVEVAAD--
--IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDDTPQK--MNIAPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKS-DFLCPPAVSEGEH---GPEQRPVFGMQNPVCKPWRFVIMNTQTFAKNIIRLLYVKDV-SCNAVLQLLDW
-QLCYSH-GDWQSLIADACPTA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEGQMIMKIFNLD
-WCEVEKSHEK-SSVDDNYD-VNMLPFVQSNGDPVGHYVQGLED-ALLLIRPGT---ARALVILF-YGCQYYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHKSTIIANQQGVKGMDWDTGKE-MQQGPK-IVVHLTLFYAPSNVLAAEPNIFGQPQV
-SHVFV-DNDARRMLIVGQSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAVDNSWEALVYC
--EMTSGRTGAKINHQPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQYSTYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQ
-M-GMGDIGGYELICEDLFQILVCE
->t51                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY
--YF-CMEGCGCVNTMAKNS-SQSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNS--PS
-FLGMCMFHVQVQFKGE--LVLPDHPNENSVEFMYRRHHSLSDKRCLNLLYVGDNQDSQHLREKQLRI----YA---RIG
-K-V-VIIKVWNAVMGRLNHHEPPAEVVFPLRK--GGSDSKPF------------------IDGFF------------DR
-PGIANAMSVPCG----DQWVGVIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIM
-EYAHGM----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPIMGDWVG
-NRCRADLTALKTVQLDVGSSGKTLGQ-NIMTPKNLGDKTWLAASPLQ------IGCGIMVQEKKVASPQ-EVEVAAD--
--IYFYRNMVIQRLTDVVAAVRMQSPQEMRPPVLVCIQDVDSPSLGDDTPQM--MNIAPYWVCVCSGVVKKAQPD-SVDK
-RGKTWVAKS-DFLCPPAISEGEH---GAEQRPVFGMQNPVCRPWRFVIMNTQTFAKNVIRLLYVKDV-SCNKVLQLLDW
-QLCYSH-GDWQSLIADACPAA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMIMKIFGLD
-WCEVEKSHEE-SSVDDNYN-VNMLPFVSSNGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQFYSGKFQDSE
-LFERSQLYR-VYCEI----KKDHKSAIIANQQGVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIIGQPQV
-SHVFV-DNDIRRMLIVGVSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWNYDIKIYETHFRMGVYAVDNSWETLVYC
--EMTSGRIGAKINHLPRLPEQVF-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQYATYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRE
-M-GVGDIGGYELICEDLFQILVCE
->t9                  
-MIWSECRQMVREK--TDNAIDNQ-C------------LIAARVKENSGHVKQVRNDSEDIL--YNHFTGKKGARELIKR
--YV-CMEGHDCVNTVANVS-SQSAIWKFDRFMCDLMHLMQN--------GDL--------------------CSY--PS
-FLPMCMFVPQVLSKGE--LVLPDSSNEESISFVYLQHHSFSVKRCLNYLNVGDSADSKHLKEKHLRA----EGMPGNIG
-K-H-VIINVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------IDGFFDK-D-D------DR
-PGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHDPSSLHRTFAINRKMGANVYQQTSRMKASAPFYPHCM
-EYAHGV----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIDCQYENKHATMTKLMHH-SLYLMRMHTMSKPIMGDVNG
-NRCRADLTALKMLQLDIGFSAKTLGQ-NVVVPHLLGHRTWLATSPLQ------IGCGVMIFGNKIGSAN-EFEAAADPT
-VIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDDDNQA--MVILPYWVCVCSGVVRKEHPDTSINK
-RGRTWLAKV-DFLCPPAFNQGEH---RAEQKPASKFEHPVCGPWEFVIVNYQTSAKDIILLLYIKDV-GCNCVLELLNW
-QLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMVLKIFGLD
-WCEMEKSHQR-SGVDDNYQ-VNMLPFNHSKNNPVGHYVQGLED-ALNLIRPGT---ARALNILF-YGCEVYSGEFQDSE
-S-ERSWIYN-VYCEI----KKDHKSAIIAHKYEHKGMDWDTGKE-AQQGPE-VVHHNLLFF-------AEPNIHGQPGV
-GHIFV-GNDARRKLIAGVSFMSMVKFMCEACVPFFRKLFMAVGQMRYDYVNNYDIKIWETVFRGGVYAIENSWETLVLC
--EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETK-AGLIDGTEITKTPDIGIC--MWETIHFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAALPK---------------------YHHQNTLVD-ELYSDV---YPAAPKKK--VC
-M-GVGDVGGYEVMGEDLFQILVCE
->t47                 
-MIWSECRQMVREK--SDNAIDNQ-C------------QIAARVKRNSGHVKQVRNDSEDIL-CYHHFTGKKGARELIKR
--YI-CMEGHDCVNTMANVS-SQSAVWNFDRFMCDLMHLMQN--------GDL--------------------CSY--PS
-FLPMCMFVSQVLSKGE--LVLPDSSNEESISFVYLQHHSFSDKRCLNYLNVGDNSDSKHLKEKHLRA----QGMPGNIG
-K-H-VIINVWNAVMGRLNHHESPAEVVFPLRQ--GGPDSKPM------------------IDGFFDK-D-D------DR
-PGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHDPSNLHRTFAINRKMGANVYQQASRMKASAPFYHHCM
-EYAHGV----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESRDCQYENKHATMTKLMHQ-SLYLMRMHTMSKPIMGHVNG
-NRCRADLTALKMLQLDIGFSAKTLCQ-NIVVAHLLGHRTWLATSPLQ------IGCMVMIFGNKIGSAN-EFEAAADPT
-VIYFYRNRIVRRLADVISTVRMNSPQEMRE------QDVDSHSLGDDDNQA--MNILPYWVCVCSGVVRKEHPDTSINK
-RGRTWLAKM-DFLCPPAFNQGEH---RAEQKPALKFKHPVCGPWEFVIVNYQTSAKDIILLLYIKDV-GCNCVLELLKW
-QLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCDRLAKHIYFQPDGE-------DEGKMILKIFGLD
-WCEMEKSHQR-SGVDDNVQ-VNMLPFNHSKHNPVGHYVQGLED-ELNLIRPGT---ARALNILF-YGCEYYSGEFQDSE
-S-ERSWIYN-VYCEI----KKDHKSAIMACKYRHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIQGQPGV
-GHIFV-GNDARRKLIAGLSFMAMMKFMCEACVPFFRKLFMAVGHMRYDYVSNYDIKIWETVFRGGVYAIENSWETLVLC
--EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETK-AGIIDGTEITKTPEIGIC--MWDTIEFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNTLVD-ELYSDI---YPAAPKKK--VC
-M-GVGDVGGYEVMGEDLFQILVCE
->t60                 
-MIWSECRQMVREK--TDNAIDNQ-C------------QIAARVKENSGHVKQVRNDSEDIL-CYHHFTGKKGARELIKR
--YI-CMEGHDCVNTMANVS-SQSAVWNFDRFMCDLMHLMQN--------GDL--------------------CSV--PS
-FLPMCMFVSQVLHKGE--LVLPDSSNEESISFVYLQHHSFSDKRCLNYLNVGDNADSKHLKEKHLRA----QGMPGNIG
-K-H-VIINVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------IDGFFDK-D-D------DR
-PGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHNPSNLHRTFAINRKMGANVYQQTSRMKASAPFYHHCM
-EYAHGV----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIDCQYESKHAAMTKLMHQ-SLYLMRIHTMSKPIMGDVNG
-NRCRADLTALKMLQLDIGFSAKTLGQ-NIVVPHCLGHRTWLATSPLQ------IGCMVMIFGNKIGSEN-EFEAAADPT
-VIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDDDNQA--MNILPYVVCVCSGVVRKDHPDTSIHK
-RGRTWLAKV-DFLCPPAFNQGEH---RAEQKPAFKFKHPVCGPWEFVIVNYQTEAKDIILLLYIKDV-GCNCVLELLEW
-QLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMILKIFGLD
-WCEMEKSHQR-SGVDDNYQ-VNMLPFNHSKHNPVGHYVQGLED-ALNLIRPGT---ARALNILF-YGCEYYSGEFQDSE
-S-ERSWIYN-VYCEI----KKDHKSAIMAYKFEHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIQGQPGV
-GHIFV-GNDARRKLIAGVSFMAVMKFMCEACVPFFRKLFMAVGQMRYDYMNNYDIKIWETFFRGGVYAIENSWETLVLC
--EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETR-AGIIEGTEITKTPDIGIC--MWDTIHFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNTLVD-ELYSDI---YPAAPKKK--VC
-M-GVGEVGGYEVMGEDLFQILVCE
->t30                 
-MIWSECRQMVREK--TDNAIDNQ-C------------QIAARVKENSGHVKQVRNDSEDIL-CYHHFTGKKGARELIKR
--YI-CMEGHDCVNTMANVS-SQSAVWNFDRFMCDLMHLMQN--------GDL--------------------CSV--PS
-FLPMCMFVSQVLHKGE--LVLPDSSNEESISFVYLQHHSFSEKRCLNYLNVGDNADSRHLKEKHLRA----QGMPGNIG
-K-H-VIISVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------MDGFFDK-D-D------DR
-PGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHTPSNLHRTFAINRKMGANVYQQTSRMKASAPFYHHCM
-EYAHGV----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIDCQYENKHATMTKLMHQ-SLYLMRMHTMSKPIMGDVNG
-NRCRADLTALKMLQLDIGFSAKTLGQ-NIIVPHCLGHRTWLATSPLQ------IGCMVMIVGNKIGSEN-EFEAAADPT
-VIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDDDNQA--MNILPYVVCVCSGVVRKEHPDTSISK
-RGRTWLAKI-DFLCPPAFNQGEH---RAEQKPAFKFKHPCCGPWEFVIVNYQTSAKDIILLLYIKDV-GCNCVLELLKW
-QLCTSH-GDWQSLVADSCVWA-HNVAVCEWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMILKIFGLD
-WCEMEKSHQR-SGVDDNYQ-VNMLPFKHSKHNPVGHYVQGLED-ALNLIRPGT---ARALNILF-YGCEYYSGEFQDSE
-S-ERSWIYN-VYCEI----KKDHKSAIMAYKYEHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIHGQPGV
-GHIFV-GNDARRHLIAGVSFMAVVKFMCEACVPFFRKLFMAVGQMRYDYVNNYDIKIWETVFRGGVYAIENSWETLVLC
--EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETR-AGIIDGTEITKTPDIGIC--MWDTIHFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHDQNTLVD-ELYSDV---YPAAPKKK--VC
-M-GVGDVGGYEVMGEDLFQILVCE
->t70                 
-MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKEDSGHVKQVRNASEDIM--YNHFTGKKGARELIKR
--YI-CMEGHDCVNTMANVS-SQSAVWKFDRFMCDLMHLMQD--------GDL--------------------CSY--PS
-FLPMCMFVAQVIAKGE--LVLPDSSTEESISFMYLQHHSFSDKRCLNYLNVGDNEDSKHAKEKFLRG----DG---GIG
-Q-H-VIINVWNAVMGRLNHHEPPPEVVFPLRQ--GGPDSKPM------------------VDGFFDK-D-D------DR
-PGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLAFHTLSHDPSKLHRTFAINQKMGANVYQQMSRMKTPAPFYPHVM
-EYAHGV----CKPFYEHSEPKNEAQGNGEKVPMNVPCVESMDCQYENKHAPMAKLMHQDSLYLMRMHTMSKPLMGDVNG
-NRCRADLTSLKMLQLDIGFCAKTLGQ-NIVVPKLLGHRTWLATAPLQ------IGCGMMIFGNKIGSTQ-EFEAAADPT
-VIYFYRNRIVRRMADVISTVRMKSPQEMRG------QDVDSHSLGDDDNQA--MNILPYWVCVCSGVVRKEHPDTSINK
-RGRTWLAKI-DFLFPPAFNQGEH---HAEQKPVFGFKHPHCGPWEFVICNYQTVAKDIILLLYIKDV-GCNCVLELLAW
-QLCTSH-GDWQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEGKMILKIFGLD
-WCEVERSHQR-SGVDDNYK-VNMLPFSHSKHNPVGHYVQGLGD-ALRLIRPGT---ARALNILF-YGCQYCSGEFQDSE
-E-ERSWIYN-VYCEI----KKDHKSAILAHKYKHKGMDWDTGKE-MEQGPK-VVNYNLLFY-------AEPNIHGQPRV
-GHIFV-GNDAHRKLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNNYDIKIWETAFRGGVYAIENSWETLVLC
--EMTSGRSGAKMNHLPRLFEQVC-PPCLLTVSGLKETV-AGIIDGTEITKTPEIGIC--MWDTIHFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHNQNTLVD-ELYSDV---YPAAPKKQ--HY
-M-GVGDVGGYEVMGEDLFQILVCE
->t91                 
-MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKEDSGHVKQVRNASEDIM--YNHFTGKKGARELIKR
--YI-CMEGHDCVNTMANVS-SQSAVWKFDRFMCDLMHLMQD--------GDL--------------------CSY--PS
-FLPMCMFVAQVIAKGE--LVLPDSSTEESISFMYLQHHSFSDKRCLNYLNVGDNEDSKHAKEKFLRG----DG---GIG
-Q-H-VIINVWNAVMGRLNHHEPPPEVVFPLRQ--GGPDSKPM------------------VDGFFDK-D-D------DR
-PGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLAFHTLSHDPSKLHRTFAINQKMGANVYQQMSRMKTPAPFYPHVM
-EYAHGV----CKPFYEHSEPKNEAQGNGEKVPMNVPCVESMDCQYENKHAPMAKLMHQ-SLYLMRMHTMSKPLMGDVNG
-NRCRADLTSLKMLQLDIGFCAKTLGQ-NIVVPKLLGHRTWLATAPLQ------IGCGMMIFGNKIGSTQ-EFEAAADPT
-VIYFYRNRIVRRMADVISTVRMKSPQEMRG------QDVDSHSLGDDDNQA--MNILPYWVCVCSGVVRKEHPDTSINK
-RGRTWLAKI-DFLFPPAFNQGEH---HAEQKPVFGFKHPHCGPWEFVICNYQTVAKDIILLLYIKDV-GCNCVLELLAW
-QLCTSH-GDWQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEGKMILKIFGLD
-WCEVERSHQR-SGVDDNYK-VNMLPFSHSKHNPVGHYVQGLGD-ALRLIRPGT---ARALNILF-YGCQYCSGEFQDSE
-E-ERSWIYN-VYCEI----KKDHKSAILAHKYKHKGMDWDTGKE-MEQGPK-VVNYNLLFY-------AEPNIHGQPRV
-GHIFV-GNDAHRKLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNNYDIKIWETAFRGGVYAIENSWETLVLC
--EMTSGRSGAKMNHLPRLFEQVC-PPCLLTVSGLKETV-AGIIDGTEITKTPEIGIC--MWDTIHFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHNQNTLVD-ELYSDV---YPAAPKKQ--HY
-M-GVGDVGGYEVMGEDLFQILVCE
->t49                 
-MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKENSGHVKQVRNASEDIM--YNHFTGNKGACELIKG
--YV-CMEGHDCVNTMANIS-SQSAVWKFDRFMCDLMHLMQD--------GDL--------------------CSY--PS
-FLPMCMFVAQVIAKGE--LVLPDSSNEESISFMYLQHHSFSDKRCLNCLNVGDNEDSKHLKEKFLRA----DG---GIG
-Q-H-VIINMWNAVMGRLNHHEPPPEVVYPLRQ--GGPNSKPM------------------VDGFFDK-D-D------DR
-PGIANAMNVPCG----DQWGGPIRGWCSSQHRFGLAFHTLKHDPSKLHRTFAINEKMGANVYQQNSRMKASAPFYPHVM
-EYAHGV----CKPFYEHSEPKNDAQGNGDKVPMNVPCVESMDCQYENKHAPMAKLMHQ-SLYLMRMYTMSKPIMGDVNG
-NRCRAELTSLKMLQLDIGFSAKTLGQ-NIVPPKLLGHRTWLATSPLQ------IGCGVMIFGNKIGSTQ-EFESAADPT
-VIYFYRNRIVKRMADVISTVRMKSPQEMRG------QDVDSHSLGDDDNQA--MNILPYWVCVCSGVVRKEHPDTSINK
-RGRTWLAKI-DFLFPPAFNQGEH---HAEQKPVFGFKHPHCGPWEFVICNYQTMAKDIILLLYIKDV-GCNCVLELLAW
-QLCTSH-GDWQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEGKMIIKIFGLD
-WCEVEKSHQR-SGVDDNYK-VNMLPFSHSNHNPVGHYVQGLGD-ALRLIRPGT---ARALNILF-YGCEYYSGEFQDSE
-E-ERSWIYN-VYCEI----KKDHKSAIMAHKYEHKGMDWDTGKE-MEQGPK-VVHHNILFY-------AEPNIHGQPRV
-GHIFV-GNDAVRNLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNNYDIKIWETAFRGGVYAMENSWETLVLC
--EMTSGRVGARMNHLPRLFEQVC-PPCILTVSGLKETV-AGVIDGTEITKTPEIGIC--MWDTIHFKNPVMQYCCYYKE
-PRSVR-----------VNNTGGAELPK---------------------YHNFNALVD-ELYSDV---YPAAPKKK--HY
-M-GVGDVGGYEVMGEDLFQILVCE
->t52                 
-MIWSEERQMVREK--VDNAVDNQ-C------------LIAARVKENCGHVKQVRNASEDIL--YNHFTGKKGARELIKR
--YI-CMEGHDCVNTMAHDS-SQSATWKFDRFMCDLMHLMQG--------GDL--------------------CSY--PS
-FLPVCMFVAQVINKGE--LVLPDSSNEESISFMYLQHHSFSEKRCLNYLNVGDNEDSKHLKEKFLRA----DG---NIG
-Q-H-VIINMWNAVMGRLNHHEPPAEVNFPLRQ--GGPDSKPM------------------VDGFFDK-D-D------DS
-PGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLASHTLSHDPSKLHRTFGINKNMGANVYQQTSRMKANAPFYPHVM
-EYAHGV----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIECQYENKHATMAKLMHD-SLYLMRMHTMSKPVMGDVNG
-HRCRADLTALKMLQLDIGFSAKTLGQ-NIVAPKLLGVRTWLATSPLQ------IGCGVMIFGNKIGSTQ-EFEAAADPT
-VIYFYRNRIIRRVADVISTVRMKSPQEMRE------QDVDSHSLGDDDNQA--MTILPHWVCVVSGVVRKEHPDTSINK
-RGSTWLAKV-DFLCPPAFNQGEH---HAEQKPVFGFKHPHVGPWEFVICNYQTSAHDIILLLYIKDV-GCNCVLELLVW
-QLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMILKIFELN
-WCEVEKSHQH-SGVDDNYQ-VNMLPFDHCKHNPVGHYVQGLED-ALGLIRPGT---ARALNILF-YGCQYYSGEFQDSE
-A-ERSWIYN-VYCEI----KKDHKSGIMAHKYDHKGVDWDTGKE-MEQGPK-VLHHNLLFY-------AEPNIHGQPTV
-GHIFV-GNDARRKLIAGVSFMSVVKFMCEACVPFFRKLFMAFRQMRYDYVNNYDIKIWETVFRGGVYAIENSWETLILC
--EMTSGRCGAKMNHMPRLFEQVC-PPCILTVSGLKETM-AGVIDGTEITKTPDIGIG--MWDSIHFKNPVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNSLVD-ELYSDV---YPAAPKKK--HY
-M-GVGDVGGYEVMGEDLFQILVCE
->t43                 
-MIWSEVRQMVREG--SDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCALMHLMQK--------GDL--------------------CSH--PS
-FLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIG
-H-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSK-M------------------VDGFFDK-E-D------DR
-PGIANAVSVPCA----DQVGGPIRGWCSSQVNFGLANHTLVQ-PSKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAGLTALKVVQLDIGFSSKTLGQLNIIDCKLLGHRTWLATSPLQ------IGVDVMVMGNKIGSPS-EFEVAADPT
-IIWFYRNCIVHKLADTVSTAKMKSPQEMRH------QDVDSPSLGDDDQQA--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKN-DFLCPPAFNQGEH---EREQRPVYGFKHPGCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNW
-HLCDSH-GDWQSLVADSCCWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFLHSRQNPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGE
-A-ERSWIYD-VYCEM----KKDHKSAVIAHKHEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLITGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYNVNYDIKIWETHIRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCVLTVSGLKQPM-AGYNDQTEITKTPDICIC--TWGTIHFKNFVMQYCVYYKE
-NRSVR-----------VNNTGGAELPQ---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHE
->t1                  
-MIWSEVRQMMREG--TDNAIDNQ-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCCLMHLMQN--------GDL--------------------CSH--PS
-FLGMCMFVEQVRCKGE--LVLPDSPNEESLSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIG
-R-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKPV------------------VDGFFDK-E-D------DR
-PGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAKLTALKIVQLDIGFSAKTLGQLNIIDCKLLGRHTWLATSPLQ------IGCDMMVMGNKIGSPS-EFEVAADPT
-IIWFYRDCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDDDQQE--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKN-DFLCPPAFNQGEH---EAEQRPVYGFVHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFMQSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGE
-A-ERSWIYD-VYCEM----KKDHKSAVVAHKVEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLITGVSVMPTYKFMCGACVQFFHKLFMAVRNMRYDYTVNYDIKIWETHIRQGVYAVENSWETLITC
--EMTSGRIGAKINHLPRLPEQVV-PPCILTVSGLKQPM-AGYNDETQITKTPDICIC--TWGTIHFKNSVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHE
->t86                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKPVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCALMHLMQN--------GDL--------------------CSH--PS
-FLGMCMFHEQVRRKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIG
-R-H-VIINVWNAFMGRLNHHEPPAEAVYPLRK--GGPDSKPM------------------VDGFFDK-E-D------DR
-PGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKMGANVYHQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPS-EFEVAADPT
-IIWFYRNCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDDDQQA--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKN-DFLCPPAFNQGEH---GAEQRPVYGFQHPRCRPWQFVIANYQTFAKNIIMLLYVKDV-SCNRVLQLLNW
-QLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFIHSRDNPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGE
-A-ERSWIYP-VYCEM----KKDHKSAVVAHKAEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLITGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHIRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNDETQITKTPDICIC--GVGTIHFKNLVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHE
->t72                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHDCVNTMAKVS-SQSAVWKFDRFMCALMHLMQN--------GDL--------------------CSH--PS
-FLGMCMFHEQVRRKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNCLNAGDNDDSEHLKEKHLRT----YG---QIG
-R-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKPM------------------VDGFFDK-E-D------HR
-PGIANAVSVPCA----DQVGGPLRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKIGANVYQQTSRMKADAPVYPHIM
-EYAHGV----YKPFYERSEPKNEAQGNGEK-QGNVPCVESVECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPS-EFEVAADPT
-IIWFYRNCIVHKLADTVSTAKMKAPQEMRH------QDVDSPSLGDDDQQA--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKN-DFLCPPAFKQGEH---EAEQRPVYGFQHPRCRPWQFVIANYQSSAKNIIMLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGQMVLKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFIHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGE
-A-ERSWIYD-VYCEM----KKDHKSAVVAHKVEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLITGFSIMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHIRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPV-AGYNDETQITKTPDICIC--TWGTIHFKNSVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHE
->t96                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCALMHLMQV--------GDL--------------------CSH--PS
-FLGMCMFHEQVRRKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNCLNVGDNDDSEHLKEKHLRV----YG---QIG
-R-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKLM------------------VDGFFDK-E-D------ER
-PGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKIGANVYQQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVIGNKIGSPS-EFEIAADPT
-IIWFYRNCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDDDQQA--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKN-DFLCPPAFNQGEH---EAEQRPVYGFQHPRCRPWQFVIGNYQTSAKNIIMLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCMWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFIRSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDAE
-A-ERSWIYD-VYCEM----KKDHKSAVYAHKVEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLISGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDVKIWETHIRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNMETQITKTPDICIC--TWGTIHFKNSVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDV---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHG
->t44                 
-MIWSEVRQMVREG--TDNAIDTR-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFSGQKGAREKIKR
--YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSH--PS
-FLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNYLNVGDNDDSEHLKEKHLRI----YG---VIG
-K-H-VIINVWNAFMGRLNHHEPPADVEYPLRK--GGPDSKPM------------------VDGFFDK-E-D------DR
-PGIANAVSVPCG----DQVGGPIRGWCSSQVKFGLANHTLAQNPSKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYDRSEPKNEAQGNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGYVDG
-HRCRAGLTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDIMVMGNKIGSPS-EFEVAADPT
-IIWFYRNCIVHKLADVVSTAKMKSPQEMRV------QDVDSPSLGDDDQQA--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKN-DFLCPPAFEQGEH---EAEQCPVHGFKHPRCRPWQFVIADYQTSAKNIIMLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFMHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDCE
-A-ERSWIYD-VYCEM----KKDHKSAVVAHKHEHKGMDWDTGKE-MNQGPK-VVMHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLITGVSVMPTYKFMCNACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHMRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNDETEITKTPDICIC--TWGTIHFKNSVMQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNMLVD-ELYSDM---YPAAPKKK--VY
-V-GAGDVGGYEVMSEDLFQILVHA
->t45                 
-MIWSEVRQMVREG--TDNAIDNC-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YK-CMEGHDCVNTMAKSS-SQSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSV--PS
-FLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNYLNVGDNDDSEHLKEKHLRI----YG---EIG
-K-H-VIINVWNAFMGRLNHHEPPAEVMYPLRK--GGPESKPM------------------VDGFFDK-E-D------DR
-PGIANAVSVPCT----DQVGGPIRGWCSSQVKFGLANHTLVHNPSKLHRTFAINKKMGANVYQQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPA-EFEVAADPT
-IIWFYRNCIVHKLADLVSTAKMKSPQEMRV------QDVDSPSLGDDDQEA--MDILPYWVCVMSGVVRKEQPD-SVNK
-RGRTWLAKK-DFLVPPAFNQGEH---EAEQKPVYGFDHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVHKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFFHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCQYYSGQFPDGE
-A-ERSWIYD-VYCEM----KKDHKSAVVAHKHQHKGMDWDTGKE-MNQGPK-VVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLIPGVSVMHDYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHLRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGFVDETEITKTPDICIC--TWGTIHFKNSVVQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHE
->t74                 
-MIWSEVRQMVREG--TDNAIDNC-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHDCVNTMAKPS-SQSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSV--PS
-FLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSDKRCLNYLNVGDNDDSEHIKEKHLRI----YG---EIG
-K-H-VIINVWNAFMGRLNHHEPPAEVMYPLRK--GGPESKPM------------------VDGFFDK-E-D------DR
-PGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVHNPSKLHRTFAINKKMGANVYQQTSRMKAEAPVYPHIM
-EYAHGV----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSAKTLGQLNIIDCKLLGHRTWLATSPLQ------IGCDVMVVGNKIGSPA-GFEVAADPT
-IIWFYRNCIVHKLADLVSTAKMKSPQEMRV------QDVDSPSLGDDDQEA--MDILPYWVCVTSGVVRKEQPD-SVNK
-RGRTWLAKK-DFLVPPAFNQGEH---EAEQKPVYGFDHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVHKIFELD
-WVEMEKSHQQ-SSVDDNYL-VNMLPFFHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCQYYSGQFPDGE
-A-ERSWIYD-VYCEM----KKDHKSAVVAHKHQHKGMDWDTGKE-MNQGPK-VVLHGVLFN-------AEPNIHGQPGV
-SHVFM-GNDATRKLIPGVSVMHDYKFMCGACVPFFHKLFMAVRNMRYDYTVNYDIKIWETHLRHGVYAVENSWETLVTC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGFVDETEITKTPDICIC--TWGTIHFKNSVVQYCCYYKE
-NRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HY
-V-GAGDVGGYEVMSEDLFQILVHE
->t26                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHVKQVRNANEDAL--YQNFTGKKGAREKIKR
--YL-CMEGHECVVTMAKNS-SISAMWKFDRFMCDLMHLMQN--------GDL--------------------CSF--PS
-FLGMCMFHDQVRCKGE--LVLPDSKNEESVSFVYIQHHSFSDKRCLNYLNVGDNEDSEHLKEKHLRV----YG---NIG
-K-H-VIINSWNAMMGRLNHHEPAAEVVYPLRK--GGPESKPM------------------VDGFFDK-E-D------DR
-PGIANAVSVPCD----DQWGGPVRGWCSSQHKFGLADHTLIHIPSKLHRTFAINKKMGANVYQQTSRMKAAAPVYSHVM
-EYAHKV----VKPFYARSEPKNEAQGNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLMRMQTMAKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSQKTLGQ-NIIDSKHLGHRTWLATSPLQ------IGCSAMVMGNKIGSPQ-EVELAADPT
-VIYFYRNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDDDQQP--MNIIPYWVCVTSGVVHKEQPD-SVNK
-RGRTWTAKN-DFLCPDAFNQGEH---GAEQKPTHGFEHPRCRPWQFVIPVYQTGAKNIILLLYIKDV-SVNGVLQLLIW
-QLCDSH-GDWQSLVADSCAWA-VNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEGKMVIKIFGLD
-WCEIEKSHQQ-SSVDDNYL-VNMLPFTHSRETPVGHYVQGLED-PMHLMRPGT---ARALNILF-YGCEYYSGQFPDGE
-P-ERSWIYD-VYCEL----KKDHKNAIVAVKHEHKGMDWDTGKE-MNHGPK-VIVHGVLFH-------AEPNIGGQPGV
-SHVFV-GNDATRKLIAGVSVMPIVKFMCGACVPFFRKLFMALRNMRYDYASNYDIKIVETHLREGVYAVENSWETLVVC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQSV-SGYNDETEITKTPDIKIC--TWGTIHFKNSVMQYCCYYKE
-NRSVR-----------LNNTGGAELPK---------------------YHHQNVLVD-ELYGEA---YPAAPKKK--HY
-M-GAGDVGGYEVMSEDLFQILVHE
->t61                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHVKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHECVNTMAKNS-SVSAVWKFDQFMCDLMHLMQN--------GDL--------------------CSF--PS
-FLGMCMFHEQVRCKGE--LVLSDSKNEESVSFVYIQHPSFSDKRCLNYLNVGDNEDSEHLKEKVLRV----YG---DIG
-K-H-VIINVWNAMMGRLNHHEPAAEVVCPLRK--GGPDSKPM------------------VDGFFDK-E-D------DR
-PGVANAVSVPCD----DQWGGPVRGWCSSQHKFGLADHTLVHIPSKLHRTFAITKKMGANVYQQTSRMKATAPVYPHVM
-EYAHGV----VKPFYDRSEPKNEAQGNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLVKMQTMSKPPMGDVDG
-HRCRAGLTALKIVQLDIGFSSKTLGQ-NIIHSKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPQ-EVELAADPS
-VIYFYQNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDDDQQP--MNIIPYWVCVTSGVVRKEQPD-SVNK
-RGHTWTAKN-DFLCPPAYNQGEH---GAEQKPVHGFEHPRCRPWQFVISVYRTGAKNINLLLYIKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCAWA-VNVAVCGWKRELVPGL---NHACEMLAKSVYFEPDGE-------DEGKMVLKIFGLD
-WCEIEKSHQQ-SSVDDNYL-VNMLPFAHSRQTPVGHYVQGLED-PMHLMRPGT---ARALNILF-YGCEYYSGHFPDGE
-A-ERSWIYD-MYCEL----KKDHKSAIVAVKHCHKGMDWDTGKE-MNHGPK-VIIHGLLFH-------AEPNIGGQPGV
-SHVFV-GNDATRKLIAGASVMFIVKFMCGACVPFFRKLFMALRNMRYDYSQNYDIKIVETHLREGVYAIENSWETLVVC
--EMTSGRMGAKINHLPRLPEQVI-PPCILTVSGLKRAV-NGYNDETEITKTPDIKIC--TWGTIHFKNSVMQYCCYYKE
-NRSVR-----------FNNTGGAELPK---------------------YHHQNVLVD-ELYSEL---YPAAPKKA--HY
-M-GAGDIGGYEVMSEDLFQILVHE
->t97                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHMKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGHECVNTMAKNS-SVSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSF--PS
-FLGMCMFHQQVRCKGE--LVLPDSKNEESVSFVYIQHHSFNDKRCLNYLNVGDNEDSEHLEEKHLRV----YG---NIG
-K-H-VIINVWNAMMGRLNHHEPAAEVVCPLRK--GGPDSKPM------------------VDGFFDK-E-D------DR
-PGVANAMSVPCD----DQWGGPVRGWCSSQHKFGLADHTLVHVPSKLHRTFPINKKMGANVYQQTSRMKATAPVYPHVM
-EYAHGV----IKPFYDRSEPKNEAQGNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLVKMQTMSKPPMGDVDG
-HRCRAGLTALQIVQLDIGFSAKTLGQ-NIIHSKLLGHRTWLATSPLQ------IGCDVVVMGNKIGSPQ-EVELAADPS
-VIYFYQNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDDDQQP--MNIIPYWVCVTSGVVRKEQPD-SVNK
-RGRTWSAKN-DFLCPPAFNQGEH---GAEQKPVHEFQHPRCRPWQFVISVYRTGAKNINLLLYIKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLVADSCAWA-VNLAVCGWKRELVPGL---NHACEMLAKSVYFEPDGE-------DEGKMNLKIFGLD
-WCEIEKSHQQ-SSVDDNYL-VNMLPFTHSRETPVGHYVQDLED-PMHLMRPGT---ARALNILF-YGCEYYSGHFPDGE
-P-ERSWIYD-MYCEL----KKDHKSAIVAVKHCHKGMDWDTGKE-MNHGPK-VIIHGVLFH-------AEPNIGGQPGV
-SHVFV-GNDATRKLIAGVSVMPIVKFMCGACVPFFRKLFMALRNMRYDYSQNYDIKIVETHLREGVYAVENSWETLVVC
--EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQAV-NDCNDETEITKTPDIKIC--TWPTIHFKNGMMQYCCYYKE
-NRSVR-----------FNNTGGAELPK---------------------YHHQNVLVD-ELYSEV---YPAAPKKA--FY
-M-GAGDIGGYEVMSEDLFQILVHK
->t17                 
-MIWSEVRQMVREG--ADNAIDNR-C------------LIAARVKHFSGHTKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGQDCVNTMAKSS-SQSAVWKFDRFMCDLVHLMQN---GARGSGDL--------------------CSF--PS
-FLGMCMFHEQVRCKGE--LVLPDSKNEESVSFVYIQHHSFSDKRCLNELNVGDNEDSIHLKEKHLRI----YG---NIG
-K-V-VIINVWNAMMGRLNHHEPAAEVVYPLRK--GGPDSKPM------------------VDGFFDK-E-D------DR
-PGIANAVAVPCS----DQWGGPVRGWCSSQHKFGLADHTLVHVPSLLHRTFAINRKMGANVYQQTSRMKAAAPVYPHMM
-EYAHGV----VKPFYERSEPKNEAQGNGEK-QWNVPCVQSVDCQYENKHATMAKLMHP-PLYLMRMETMSKPPMGDVDG
-VRCRAGLTALKIVQLDIGFSAKTLGQ-NIIDSKLLGHRTWLATSPLQ------IGCDVMVVGNKIGSPQ-EFELAADPT
-VIYFYRNCIVQKLADVVSTVKMKSPQEMRV------QDVDSPSLGDDNQQS--MNIIPYWVCVHSGVVQKEQPD-SVHK
-RGRTWTAKN-DFLCPPAFDQGEH---GAEQKPVHGFEHPRCRPWQFVIANYQTGAKNIILLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLSADSCAWA-HNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEGKMVIKIFGLD
-WCEMEKAHQQ-SSVDDNYL-VNMLPFTHSRENPVGHYVQGLED-PMHLIRPGT---ARALNILF-YGCEYYSGQFPDGE
-P-ERSWIYD-VYCEL----KKDHKSAIVAVKHEHKGMDWDTGKE-MNQGPK-VIIHGVLFH-------AEVNIHGQPGV
-SHVFV-GNDATRKLIAGVSVMPFVKFMCGACVPFFRKLFMALRNMRYDYTSNYDIKIIETHLRNGVYAVENSWETLVVC
--EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKQAM-AGVNDETEITKTPDIKIC--TWGTIHFKNFVMQYCVYYKE
-NRSVR-----------FNNTGGAELPK---------------------YHHQNALVD-ELYSDV---YPAAPKKK--HY
-M-GEGDVGGYEVMSEDLFQILVHA
->t11                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHFSGHTKQVRNANEDAL--YQNFTGQKGAREKIKR
--YL-CMEGQDCVNTMAKSS-SQSAVWKFDRFMCDLVHLMQN---GARGSGDL--------------------CSF--PS
-FLGMCMFHEQVRCKGE--LVLPDSKNEESVSFVYIQHHSFSDKRCLNSLNVGDNEDSIHLKEKHLRI----YG---DIG
-K-H-VIINVWNAMMGRLNHHEPAAEVVYPLRK--GGPDSKPM------------------VDGFFDK-E-D------DR
-PGIANAVAVPCS----DQWGGPVRGWCSSQHKFGLADHTLVHVPSLLHRTFAINKKMGANVYQQTSRMKAAAPVYPHMM
-EYAHGV----VKPFYERSEPKNEAQGNGEK-QWNVPCVQSVDCQYENKHATMAKLMHP-PLYLMRMETMSKPPMGDVDG
-VRCRAGLTALKIVQLDIGFSAKTLGQ-NIIDSKLLGHRTWLATSPLQ------IGCDVMVVGNKIGSPQ-EFELAADPT
-VIYFYRNCIVQKLADVVSTVKMKSPQEMRV------QDVDSPSLGDDNQQS--MNIIPYWVCVHSGVVQKEQPD-SVHK
-RGRTWTAKN-DFLCPPAFDQGEH---GAEQKPVHGFEHPRCRPWQFVIANYQTGAKNIILLLYVKDV-SCNGVLQLLNW
-QLCDSH-GDWQSLSADSCAWA-HNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEGKMVIKIFGLD
-WCEMEKAHQQ-SSVDDNYL-VNMLPFTHSRENPVGHYVQGLED-PMHLIRPGT---ARALNILF-YGCEYYSGQFPDGE
-P-ERSWIYD-VYCEL----KKDHKSAIVAVKHEHKGMDWDTGKE-MNQGPK-VIIHGILFH-------AEVNIHGQPGV
-SHVFV-GNDATRKLIAGVSVMPFVKFMCGACVPFFRKLFMALRNMRYDYTSNYDIKIMETHLRNGVYAVENSWETLVVC
--EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKQAM-AGVNDETEITKTPDIKIC--TWGTIHFKNFVMQYCVYYKE
-NRSVR-----------FNNTGGAELPK---------------------YHHQNVLVD-ELYSDG---YPAAPKKK--HY
-M-GEGDVGGYEVMSEDLFQILVHA
->t23                 
-MIWSECQRMLREH--EDQAIANE-C------------LIAFKVKLVNGHVKQVRNASEDAH--YTFFAGEKGARELIKR
--YS-CMEGDGCVNTMAEGR-SESAVWKFDPFMCQLTHSMQS--------GDL--------------------CSV--PS
-FLGVCMFQRQVVMKGE--LVLPDSADEGSVSFMYIQHHSFAAKRCLNVLNVGDNEDSVHLRHKQLRV----YG---KIG
-K-H-VIISVPNAIMGRLNHHEPSAIVVFPLRQ--RGADSKSV------------------GDGFYDK-D-E------DR
-PGIANAVSVPVA----EQWVGSVRGWYSSEHKYGLANHILI-GPSKLHRTYQTTAKMGANVVKATNRMKRPQPVYPHVM
-EYANGV----VKPFYEVAESKNEAQGNGEK-PVNVPCVESPDCQYESKHARVNKLMHP-SLYLMCMEAMNKPIMGDWDG
-NRCRSPLCLLKVIQLDMGVSGKTLGQ-NIVMAKLLGERTWLATSPLQ------IGCDVVAVGKKPESPQ-EFECAADPT
-VIYFYKNLIIQQAADYVSAVQVKSPQEMRY------QDVNSPSDGDENGQS--MHIGPYWVCVSSEVVKKSQPD-SVDK
-RGRTWVAKN-EFLCPPDHMQGEHSIEGAEQKPFFGFAGPFPQPWQFVIVNPQTWAHNIIRLLYCKDV-SCNCVLTCLNW
-VLCDSH-GDWHSLIADACPCA-HNVAVCGWKRELVPGL---NHSNEHMAKTIYFEPDGH-------DEGKMILNIFGLD
-WCEVETSHQE-SSSDDNHL-VNMLPFGVSRDDPVGHYMLGLED-AIRLYRPGT---ARALNILF---VNYYSGDFQDPE
-L-ERSQLYN-VYCEQ----KQDHRNAIRASKNDHKGMAWDTAKD-MEQGPK-MVEHQVLFY-------AEPNMHGQPEV
-IHIFI-GNDAMCMLIPGMSVMVHHKFMRAACMPFFNKLFMAVRYMRYDYVDNYDIKIDETRYRDGVYARRNSWETANVC
--EMSSGRSGAKINHNPRLPEQVT-PPRSLTVSGLKDTM-PGHPDVTEITKTPVIAIV--MWGTINLKNHVMQYCCYYKE
-TRSVR-----------VNNTGGAELPK---------------------YHYQNILVD-ELYSND---YPAAPKKA--QF
-M-GVGDVGGYEIVCEDIFQILVCD
->t76                 
-LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGGI--VTNFHGF---AEMPKN
--HD-VMEEQGGPGTCLAPQQSADTSWPFVMFTVDLAHRCRG--------GDMPQNTGDSMTCPHLAEGLAAVNS---RA
-FIGVSIYDLKVSHKMI--QACNPIQN---------DNHAFSDQRCLNDLSQGVVGASFPKMQHGVRH----YK---K--
-------RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPARNFIQLS-MVRDTPHRL
-PKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQNTLHRQYLVDVELQATMVFVAARMKTDSSMYMSVR
-EILHG------------CGIKDEAQADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRC
-LRYKNDLTGDQLVQLAD----NTCAW-NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------SK-------VEPK
-CAQFYSKSCTHC----------------TM------CSVGSHASEEDALDLYTHKPVPDAQCFVSRVARNIPEH-SPCK
------------------------------P---CS-----------------VEEVCYCKVCDSKDVRAVKNAYQDLQV
-PLSKLK-APWLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEENDLNCDDFELG
-W-NLKH-------EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQPCHAAHAQDIPTEQ---TRYQIHTFLDDS
-I-RRDLCNQ-GCHEENMVWRDDLKDPISTEVIADKLHEWPTNVN-KENSAD----HRQLFH-------ANSSALDKHQH
-NVVMN-GSPCIRALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCAMNITIQCLHTGEGVMCNVKCKEFLQRE
-DEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPLIAEP--LYLVI-YVNAVEPYTDAYKK
-PKSMHQFQFDDCQIRYRTNTGFEETPVGATHLTHVCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDHNASEQKE--AH
-V-PMGDEGRISRAKDEIMYIRDLE
->t53                 
-LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGGI--VTNFHGF---AEMPKN
--YD-VMEEQGGPGTCLAPQQSADTSWPFVMFTVDLAHRCRG--------GDIPQNTGDSMTCPHLAEGLAAVNS---RA
-FIGVSTYDLKVSHKMI--QACNPIQN---------DNHAFSDQRCLNDLAQGVVGASHPKMQHGVRH----YK---K--
-------RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPARNFIQLS-MVRDTPHGL
-PKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQNTLHRQYLVDVELGATMVFVAARMKTDLSMYMSVR
-EILHG------------CGIKDEAQADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRC
-LRYKNDLAGDQLVQLAD----NTCAW-NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------SK-------VEPK
-CAQFYSKSCTHC----------------TM------CSVGSHASEEDALDLYTHRPVPDAQCFVSRVARNIPEH-SPCK
------------------------------P---CS-----------------VEEVCYCKVCDSKDVRAVKNAYQDLQV
-PLSKLK-APWLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEENDLNCDDFELG
-W-NLKP-------EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQPCHAAHAQDIPTEQ---TRYQIHTFLDDS
-I-RRDLCNQ-GCHEENMVWRDDLKDPISTEVIADKLHEWPTNQN-KENSAD----HRQLFH-------ANSSALDKHQH
-NVVMN-GSPCIRALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCAMNITIQCLHTGEGVVCNVKCKEFLQRE
-DEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPLIAEP--LYLVI-YVNAVEPYTDAYKK
-PKSMHQFQFDDCQIRYRTNTGFEETPMGATHLTHVCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDHNASEQKE--AH
-V-PMGDQGRISRAKDEIMYIRDLE
->t16                 
-LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGGI--VTNFHGF---AEMPKN
--YD-VMEEQGGPGTCLAPQQSADTSWPFVMFTVDLAHRCRG--------GDIPQNTGDSMTCPHLAEGLAAVNS---RA
-FIGVSTYDLKVSHKMI--QACNPIQN---------DNHAFSDQRCLNDLAQGVVGASHPKMQHGVRH----YK---K--
-------RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPARNFIQLS-MVRDTPHGL
-PKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQNTLHRQYLVDVELGATMVFVAARMKTDLSMYMSVR
-EILHG------------CGIKDEAQADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRC
-LRYKNDLAGDQLVQLAD----NTCLW-NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------SK-------VEPK
-CAQFYSKSCTHC----------------TM------CSVGSHASEEDALDLYTHKPVPDAQCFVSRVARNIPEH-SPCK
------------------------------P---CS-----------------VEEVCYCKVCDSKDVRAVKNAYQDLQV
-PLSKLK-APWLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEENDLNCDDFELG
-W-NLKP-------EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQPCHAAHAQDIPTEQ---TRYQIHTFLDDS
-I-RRDLCNQ-GCHEENMVWRDDLKDPISTEVIADKLHEWPTNQN-KENSAD----HRQLFH-------ANSSALDKHQH
-NVVMN-GSPCIRALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCAMNITIQCLHTGEGVVCNVKCKEFLQRE
-DEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPLIAEP--LYLVI-YVNAVEPYTDAYKK
-PKSMHQFQFDDCQIRYRTNTGFEETPMGATHLTHVCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDYNASEQKE--AH
-V-PMGDQGRISRAKDEIMYIRDLE
->t42                 
-LSSSHEMRVVHHKSKPDEEIADQ-D------------LCAEEMCKGSGHTGRIHSAVEGGI--WTNFHGF---AEMPKN
--YD-VMEEQGGPGTCIAPRQSADTSWPFMVFTVDLAHRCRG--------GDTPTQAGDSMTFPHLAEGLPAVNS---RA
-FVGVSSYDLRVSHKMI--QACTLIQN---------DNVAFSDQRPLNDLNQGCVGTSHPKMPHGVRH----YK---K--
-------KVYENEVGDRLDDAEGIDDVGVWMRW--NGVKHAWCHIIGSCPDHLVCSLLVLQPGRNFIQLS-VVHDTPHRL
-PKMASAAAVFKQTCHLEQVPGTARMWGKSGPRVRLNGHVLK-NQNILHRQYLVDVNLGATMVFVLARMKTDASMYMSHR
-EILHGGTFDAAKPFRQICGTKDEAQPDGRR-PATLLVVLSKDNQGITEHGAVLKHVHP----------LCKKDCNNNRC
-LRCKNVLAGNQLIQLSD----VTCAW-NLFEC--LGDSESLFGSPLAIKVDEDRGFTAP-------SK-------VEPK
-CAQFYSKSCTHH----------------MM------CSVGSNASEEDALELYTHKPVPDPQCFVSIVVRNIPEH-SPCK
------------------------------P---CS-----------------VEEVAYCKNCDSKDVRAVQNAYQDLAV
-PLSKLK-APWLSMGHCECWEEDINNILSMVKHELVVDQDMVNRSPEVAAKMAYFGPDGFHWDVELCEESDLTVDDFELG
-W-VLKP-------EDDHPL-ICIGSFSVHKQFSVMVYPLPMND-AIRMSQPCHAAHAQDIHTDQ---DRYDVRTFLGHS
-I-KCHMCNQ-ACHEENIVWRDDLKDPITTEVIAEKLQEWPTNQN-KENVAD----HRQLFH-------ANSSALDKHRH
-NVMMN-GSACIRTLIIGGSIVGVNVFMMEPCQEFFTDLFMVYEGLQYAVVCAVNIIIQCLHTNEGVVCNVKCKEFLQRE
-EDMKSGLIGIICNHISRMCMHIL-VVCLLTHCGLKAME-IPFDI-TGVVRGPLITEP--LYLII-YVNAVEPYTDAYKK
-PKSMHQFQFDDVQIRYRTNTGFEENPKLATHLVHVCVVVPHPWTKGKSEILQNMESA-HLYNAVIRDNNASEQKE--AH
-V-PVGDEGRISRAKNEILYIRDLE
->t24                 
-QSSSHEMRVVHHKSKPDEEITDQ-D------------LCAEEMCKGSGHTGRIHSAVEGGI--WTNFHGF---AEMPKN
--YD-VMEEQGGPGTCVAPRQSADTNWPFMVFPVELAHRCRG--------GDTP--------FPHLAEGLPAVNS---RA
-FIGVSSYDLKVSHKMI--QACNPIQN---------DNVAFSDQRVLNDLSQGCVGTSHPKMPHGVRH----YK---K--
-------RVYENEVGDRLDDAEAVDDVGVWMRW--AGVKVAVCHVIGSCPDHLVVSLLVLQPARNFIQLS-VVHDTPHRL
-PKMASAAAVFKQTCHLEQVAGTARVWGKSGPRVKLNGHVLK-NQNVLHRQYLVDVDLGATMVFVAARMKTDASMYMSHR
-EILHGGTFDAAKPFRQICGVKDEAQPDGQR-PATLLVVLSKDNVGITEHGAVLKHVHP----------LCKKDCNNNRC
-LRCKNVLAGNQLVQLAD----ITCAW-NLFEC--LGDSESLFGSPLAIKVDEDRGFTAP-------SK-------VEPK
-CQQFYSKSCTHC----------------VM------CSVGSNASEEDALELYTHKPVPDPQCFVSIVVRNIPEH-SPCK
------------------------------P---CS-----------------VEEVCYCKNCDSKDVRATQNAYQELAI
-PLSKLK-APWLSMGHCECWEEGINNILSMVKHELVVDQDMVNRSPEVAAKMAYFGPDGFHWDIELCEENDLTCDDFELG
-W-VLKP-------EDDHPL-ICIGSFSVHKQFSVMVYPLPMND-AIRMSQPCYAAHAQDIHTDQ---DRYDIRTFLEHS
-I-RCHLCNQ-ACHEENIVWRDDLKDPITTEVIADKLQEWPTNQN-AENVAD----HRQLFH-------ANSSCLDRHRH
-NVMMN-GSSCIRTLIIGGSIVGVNVFMMGPCQEFFTDLFMVYEGLQYAVVCAINIIIQVLHTNEGVVCNVKCKEFLQRE
-DDMKSGLIGIICNHISRMCMHIL-VHCLLTHCGLKAME-IPFDR-TGVVRGPLIAEP--LYLII-YVNAVEPYTDAYKK
-PKSMHQFQFDDVQIRYRTNTGFEENPKLATHLVHVCVVVPHPWTKGKSEILQNMESARHLYNAVIRDNNASHQKE--AH
-V-PAGDQGRISRAKNEILYIRDLE
-
-
diff --git a/test/example.fastq b/test/example.fastq
deleted file mode 100644
index 0f67574..0000000
--- a/test/example.fastq
+++ /dev/null
@@ -1,12 +0,0 @@
- at EAS54_6_R1_2_1_413_324
-CCCTTCTTGTCTTCAGCGTTTCTCC
-+
-;;3;;;;;;;;;;;;7;;;;;;;88
- at EAS54_6_R1_2_1_540_792
-TTGGCAGGCCAAGGCCGATGGATCA
-+
-;;;;;;;;;;;7;;;;;-;;;3;83
- at EAS54_6_R1_2_1_443_348
-GTTGCTTCTGGCGTGGGTGGGGGGG
-+EAS54_6_R1_2_1_443_348
-;;;;;;;;;;;9;7;;.7;393333
diff --git a/test/example.gff b/test/example.gff
deleted file mode 100644
index 0f129a4..0000000
--- a/test/example.gff
+++ /dev/null
@@ -1,25 +0,0 @@
-##gff-version	3
-##sequence-region	ctg123	1	1497228	
-ctg123	.	gene	1000	9000	.	+	.	ID=gene00001;Name=EDEN
-ctg123	.	TF_binding_site	1000	1012	.	+	.	ID=tfbs00001;Parent=gene00001
-ctg123	.	mRNA	1050	9000	.	+	.	ID=mRNA00001;Parent=gene00001;Name=EDEN.1
-ctg123	.	mRNA	1050	9000	.	+	.	ID=mRNA00002;Parent=gene00001;Name=EDEN.2
-ctg123	.	mRNA	1300	9000	.	+	.	ID=mRNA00003;Parent=gene00001;Name=EDEN.3
-ctg123	.	exon	1300	1500	.	+	.	ID=exon00001;Parent=mRNA00003
-ctg123	.	exon	1050	1500	.	+	.	ID=exon00002;Parent=mRNA00001,mRNA00002
-ctg123	.	exon	3000	3902	.	+	.	ID=exon00003;Parent=mRNA00001,mRNA00003
-ctg123	.	exon	5000	5500	.	+	.	ID=exon00004;Parent=mRNA00001,mRNA00002,mRNA00003
-ctg123	.	exon	7000	9000	.	+	.	ID=exon00005;Parent=mRNA00001,mRNA00002,mRNA00003
-ctg123	.	CDS	1201	1500	.	+	0	ID=cds00001;Parent=mRNA00001;Name=edenprotein.1
-ctg123	.	CDS	3000	3902	.	+	0	ID=cds00001;Parent=mRNA00001;Name=edenprotein.1
-ctg123	.	CDS	5000	5500	.	+	0	ID=cds00001;Parent=mRNA00001;Name=edenprotein.1
-ctg123	.	CDS	7000	7600	.	+	0	ID=cds00001;Parent=mRNA00001;Name=edenprotein.1
-ctg123	.	CDS	1201	1500	.	+	0	ID=cds00002;Parent=mRNA00002;Name=edenprotein.2
-ctg123	.	CDS	5000	5500	.	+	0	ID=cds00002;Parent=mRNA00002;Name=edenprotein.2
-ctg123	.	CDS	7000	7600	.	+	0	ID=cds00002;Parent=mRNA00002;Name=edenprotein.2
-ctg123	.	CDS	3301	3902	.	+	0	ID=cds00003;Parent=mRNA00003;Name=edenprotein.3
-ctg123	.	CDS	5000	5500	.	+	1	ID=cds00003;Parent=mRNA00003;Name=edenprotein.3
-ctg123	.	CDS	7000	7600	.	+	1	ID=cds00003;Parent=mRNA00003;Name=edenprotein.3
-ctg123	.	CDS	3391	3902	.	+	0	ID=cds00004;Parent=mRNA00003;Name=edenprotein.4
-ctg123	.	CDS	5000	5500	.	+	1	ID=cds00004;Parent=mRNA00003;Name=edenprotein.4
-ctg123	.	CDS	7000	7600	.	+	1	ID=cds00004;Parent=mRNA00003;Name=edenprotein.4
diff --git a/test/example.mase b/test/example.mase
deleted file mode 100644
index 7e5891d..0000000
--- a/test/example.mase
+++ /dev/null
@@ -1,1500 +0,0 @@
-;
-t73                 
-LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPYSGNGTQVRNDVEDAN--CQEFVGI---RELGKH-YK-CMDGFHTVNNGAGEN-S
-ESAMWIFDLWMCKLNHGMQR--------GDIGRVKRDVQKFPKLKEGAPNCSSFVKPYFMGCDMFHKQVEYRGTHGLVLDDTWNEESATFPYPQVHSRSD
-KRCLNGLHQGDHEESVH---HAPRI----MR---LIGH-HLVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDG
-FFDK-D-Q------SRPDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NISDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMTEYANG
-L----WHPFYKASDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEGCKCRS---KLYVSQLDH----KTLSK
--NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKNSEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKGKNPQEMRG------NNVMSESLGDD
-NLQD--MSGVPVTVCTSSVMVRKDMQD-SVDKRGCTWNAKE-DHLCPSSFCKGER---EDEPGGVTQ-----------------RCIENIAKLLYIKDV-
-LCNEVLNGLQWQLCWSV-GDWESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEGPMQAKIVTLHW-EMDVSHRG
--SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLARPNT---AQKLSILT---VFHFSGGFRDKPM-ERSQLHS-TYSED----KKDQKVLIHAMK
--RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAHFVVFL-ISDATRLLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSN
-VDIKIFDTCFRSAVYAVDNSWETLCDY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIAIRVSGSE-SENVVLQY
-CLYYEENKSIR-----------QNNTGSADLPK---------------------DRLVNSFVD-ELYNSI---YTAAPKKK--RHL-GIGDNGGMELVRE
-DIFQILVCV
-;
-t66                 
-LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPCSGNGTQVRNDVEDAN--CQEFVGI---RELGKH-YK-CMDGFHTVNNGAGEN-S
-ESAMWIFDLWMCKLNHGMQR--------GDIGRVKRDVQKFPKLKEGAPNCSSFVKPYFMGCDMFHKQVEYRGTHGLVLDDTWNEESATFPYPQVHSRSD
-KRCLNGLHQGDHEESVH---HAPRI----MR---LIGH-HLVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDG
-FFDK-D-Q------SRPDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NISDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMTEYANG
-L----WHPFYKASDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEGCKCRS---KLYVSQLDH----KTLSK
--NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKNSEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKRKNPQEMRG------NNVMSESLGDD
-NLQD--MSGVPVTVCTSSVMVRKDMQD-SVDKRGCTWNAKE-DHLCPSSFCKGER---EDEPGGVTQ-----------------RCIENIAKLLYIKDV-
-LCNEVLNGLQWQLCWSV-GDWESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEGPMQAKIVTLHW-EMDVSHRG
--SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLARPNT---AQKLSILT---VFHFSGGFRDKPM-ERSQLHS-TYSED----KKDQKVLIHAMK
--RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAHFVVFL-ISDATRLLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSN
-VDIKIFDTCFRSAVYAVDNSWETLCDY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIAIRVSGSE-SENVVLQY
-CLYYEENKSIR-----------QNNTGSADLPK---------------------DRLVNSFVD-ELYNSI---YTAAPKKK--RHL-GIGDNGGMELVRE
-DIFQILVCV
-;
-t32                 
-LIVSQIRVMVRDG--IHKAMDEE-V------------LIARRVKPYSGNGTQVRNDVEDAN--CQEFVGI---RELGKH-YK-CMDGFHTVNNGAGEN-S
-ESAMWIFDLWMCKLNHGMQR--------GDIGRVKQDVQKFPKLKEGAPNCSSFVKPYFMGCDMFHKQVEYRGTHGLVLDDTWNEESATFPYPQVHSRSD
-KRCLNGLHQGDHEESVH---HAPRI----MR---LIGH-HLVIIVLMNHDMGRLNHLEPDAVIPSPLRIGGDGWVPKPI------------------EDG
-FFDK-D-Q------ARPDVANASIVPDK----DQWVGAHNQWGSSLRKVGLAVHDLR-NISDLYRCVWMDCHLGANHYRQISRMKMITPTYTHMTEYANG
-L----WHPFYKASDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVVKPLLGDWEGCKCRS---KLYVSQLDH----KTLSK
--NLGLY--MQKRTWLATAPLQ------IGCMFMLVGRKKNSEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKGKNPQEMRG------NNVMSESLGDD
-NLQD--MSGVPVTVCTSSVMVRKDMQD-SVDKRGCTWNAKE-DHLCPSSFCKGER---EDEPGGVTQ-----------------RCIENIAKLLYIKDV-
-LCNDVLNLLVWQLCWSV-GDWESLIPQACWDAKKDLAVCAWKMELVPGL---NRNNENLAKVIYFGPDGH-------DEGPMQAKIVTLHW-EMDVSHRG
--SSVDDNVV-VVMLAFAVSFCHPWGHYIQGLGD-QHKLARPNT---AQKLSILT---VFHFSGGFRDKPM-ERSQLHS-TYSED----KKDQKVLIHAMK
--RNKGLDWHAGND-MKGGPK-IIYLGMLFY-------AENNVAKQKAHFVVFL-LSDATRLLIVHEGCMIDYTFMEFACHPFFAELFMEHMVARYQYYSN
-VDIKIFDTCFRSAVYAVDNSWETLCDY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIAIRVSGSE-SENVVLQY
-CLYYEENKSIR-----------QNNTGSADLPK---------------------DRLVNSFVD-ELYNSI---YTAAPKKK--RHL-GIGDNGGMELVRE
-DIFQILVCV
-;
-t75                 
-LIVSEIRVMVRDE--VHKAMDEE-C------------LIARRVKPYSGNGNQIRNDIEDAN--GQEFVGI---RELGKH-YD-CMDGYHTVNNGAGEN-S
-ESAMWIFDLWMCKLNHGMQR--------GDIGRVQQDVHKFPKLKEGAPNCSSFVKPVFMGCDMFHRQVQNRGNHGLVLDDTWNEESGTFPYPQVHSRNE
-KRCINKLHQGDHNESCH---HNPRI----VR---RIGH-HLVIIVLVNRDMGRLNYIEPDALVPSPLRFGGDEWVPKPI------------------EDG
-FFDK-D-Q------ARPDVANA-IVPDR----DQWVGAHKEWGSSLCKVGLAVHDLR-NVSDLYRCVWMECVLGANHYQQVSRMKMVTPAYTHMTEYANG
-L----WHPFYKNPDHKNEAQGVGEK-PHQLPCVESETCQYETKHAKVCKQVHG-ALYLIGMKTVAKPVLGDWEGCKCRSDLIKLYVSQLDH----KTLSK
--NMGLY--MRNRTWLATSPLQ------IGCIFMLVGRKKNSEE-NYNKAADPTVIWFYTQPIVYV-ADVFGCTKGKNPQEMRK------NNVISESLGDD
-NLQD--MPGMPVTVCTSSVMVRKDMHQ-SVDKRGYTWHAKE-DHLCPDSFCKGEK---EEEPGGVRR-----------------RIVENIVKLLYIKDV-
-LCNQVLNLLQWQLCWSV-GDWESLVPQACWGAKKDLAVCAWKMELVPGL---NRNNENLAKIIYFGPDGH-------DEGNMQAKIVTLHW-EMDVSHRG
--SSVDDNVV-VVMLAFQASFCDPWGHYIQGLGD-QYKLARPNT---ARQLSILV---VMHFSGGFRDKPI-ERSQLHC-TYSEN----KKDQKVVIRAMK
--RNKGCDWHAGKD-MAGGPK-IIYVGMLFY-------AESNWAKQKAHFVVFL-ISDATRLLIHHVGCMIEYTFMEFACHPFFAELFMEHMVIRYQYYNN
-VDIKIFDTCFRGAVYAEDNSWETLCGY-EMLSGYFGAEINHNPRLPEQVC-PPCTITVSGLKGKLHNRWPVLTQITRTMRIQIPIRISGSE-SENVVLQY
-CLYYEENKSIR-----------QNNTGSAVLPK---------------------DRLVNNFVD-ELYNSV---YTAAPKKK--RHL-GIGDNGGMELVRE
-DIFQILVCV
-;
-t79                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQNQVRNAVEDAA--RPDFVGT---RELGKQ-YE-CMDGVGAVDTGAGDN-S
-ESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGVDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLHQGDHEESRH---HNARI----VR---RIGL-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------GDG
-FFDK-D-Q------ARPLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHG
-L----WKPFYQASDHKNEAQGVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSDLNNLILSQLDD----KTLSK
--NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSAN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-SLQQ--MPAVPVDVCVMSVMVNKSMPQ-SHDKRGYTWQAKQ-DHLFPVNVVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-
-DCNMVLSLLVWQLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLHW-EMEASHRE
--SSVRDNMI-VIMLPFNINSIDPWRHYILGLND-QIQLTRPNT---ARRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
--HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYINN
-HDIKIKDTVFRLAVYAWDNFWETLCKC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIRIKIREPGSE-SENTVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------ARLVNKVVD-ELYNNV---YHAIPKKE--MNQ-GVGDSGGVEMVQE
-DVFQILVCI
-;
-t27                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTMSGSQNQVRNAVEDAA--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-S
-ESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLHQGDHEESRH---HNARI----VR---RIGM-NLVIISYANVDMGRLNHCEDQAIVYSPLRYGGAGFVSKPI------------------ADG
-FFDK-D-Q------ARPLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHG
-L----WKPFYQASDHKNEAQGVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGIHTVMKPHLGNVDGCRCRSDLNNLILSQLDD----KTLSK
--NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSAN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNCVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-
-DCNIVLSLLVWQLC--H-GDWEPLLPQACEGARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLHW-EMEASHRE
--SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ARRLSILH---VMHYSGAFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
--VNKDHDWITGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYVNN
-HDIKIKDTVFRLAVYAWENFWETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIRIKIREPGSE-SENTVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------ARLVNKVVD-ELYNNV---YHAIPKKD--MNQ-GVGDSGGVEMVQE
-DVFQILVCI
-;
-t93                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTMSGSQNQVRNAVEDAA--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-S
-ESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLHQGDHEESRH---HNARI----VR---RIGM-NLVIISYANVDMGRLNHCEDQAIVYSPLRYGGAGFVSKPI------------------ADG
-FFDK-D-Q------ARPLMANAVCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHG
-L----WKPFYQASDHKNEAQGVGER-THQLPCVESHTCQYEVKHAKVCKLVHH-ALYLLGIHTVMKPHLGNVDGCRCRSDLNNLILSQLDD----KTLSK
--NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSAN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNCVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-
-DCNIVLSLLVWQLC--H-GDWEPLLPQACEGARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLHW-EMEASHRE
--SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ARRLSILH---VMHYSGAFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
--VNKDHDWITGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFSELFMEHVYIRYQYVNN
-HDIKIKDTVFRLAVYAWENFWETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIRIKIREPGSE-SENTVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------ARLVNKVVD-ELYNNV---YHAIPKKD--MNQ-GVGDSGGVEMVQE
-DVFQILVCI
-;
-t59                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQNQVRNAVEDAA--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-S
-ESAVVIFDVWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLHQGDHEESRH---HNARI----VR---RIGM-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADG
-FFDK-D-Q------ARPLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECILGANVYHQISRMKMHGPTYSHVMEYAHG
-M----WKPFYQASDHKNEAQGVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSDLNNLILSQLDD----KTLSK
--NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSGN-NYNQAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNFVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-
-DCNIDLSLLVWQLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLHW-EMEASHRE
--SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ACRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
--HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVRILILHHGCMTDHTFMEFACNPFFAELFMEHVYIRYQYVNN
-HDIKIKDTVFRLAVYAWENFWETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIGIKIREPGSQ-SENTVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNV---YHAIPKKD--MNQ-GVGDSGGVEMVQE
-DVFQILVCI
-;
-t7                  
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKKFSGSQGQVRNAIEDAA--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-S
-ESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSMPMPYFLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLHQGDHEESRH---HNARI----VR---RIGM-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADG
-FFDK-D-Q------ARPLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHG
-M----WKPFYQASDHKNEAQGVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSDLNNLILSQLDD----KTLSK
--NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSGN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNFVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-
-DCNIVLSLLVWQLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLHW-EMEASHRE
--SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ACRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
--HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVRILILHHGCMTDRTFMEFACNPFFAELFMEHVYIRYQYVNN
-HDIKIKDTVFRLAVYAWENFWETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIGIKIREPGSQ-SENTVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNP---YHAIPKKD--MNQ-GVGDSGGIEMVQE
-DVFQILVCI
-;
-t78                 
-LIVSEVRVMVRDG--LNIAIDEL-C------------LIANRVKTFSGSQGQVRNAIEDAA--RPDFVGI---RELGKQ-YE-CMDGVGAVDTGAGDN-S
-ESAVVIFDIWMCQLPHGMQW--------GDIGRVVVDHPKFLKLEEGAPNCSSIPMPYFLGCDMFHREVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLHQGDHEESRH---HNARI----VR---RIGM-NLVIISYANVDMGRLNHCEDEAIVFSPLRYGGAGFVSKPI------------------ADG
-FFDK-D-Q------ARPLMANAHCVPEN----DQWTGAVGQWCSSVVKCGLADHPLE-NISRLLRCVVMECVLGANVYHQISRMKMHGPTYSHVMEYAHG
-M----WKPFYQASDHKNEAQGVGER-THQLPCVDSHTCQYEVKHAQVCKLVHH-ALYLLGLRTVMKPHLGDVDGCRCRSDLNNLILSQLDD----KTLSK
--NCFTY--LGNMTWLATSPLH------IGCMIIFVGRKQQSGN-NYNRAGDPTTICFCRKPIVMH-ADVFGCARAKDPQEMRM------NNVISESLGDD
-SLQQ--MPAVPVTVCVMSHMVKKSMPQ-SHDKRGYTWQAKQ-DHLFPVNFVKGEQ---EEEPEGADQ-----------------RTVHDMVRLLYSKDV-
-DCNIVLSLLVWQLC--H-GDWEPLLPQACESARRDLAVCAWKRELVPGL---NHNNEFLAKIIYFGPDGH-------DEGPMGQKIVDLHW-EMEASHRE
--SSVRDNMI-VIMLPFSINSIDPWRHYILGLND-QIQLTRPNT---ACRLSILH---VMHYSGEFHDKSA-ERSQLHS-RYSEH----KNDHKCVILASK
--HNKDHDWATGKDEMKGGAK-IMNPGALFY-------AEQNWVRPKNHFVIFL-ICDAVRILILHHGCMTDRTFMEFACNPFFAELFMEHVYIRYQYVNN
-HDIKIKDTVFRLAVYAWENFWETLCNC-EMLSGHVGAKINHNPRLFEQVC-PPVELTVSGLKGKV-NGWPYLTDITRTPLIGIKIREPGSQ-SENTVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNP---YHAIPKKD--MNQ-GVGDSGGIEMVQE
-DVFQILVCI
-;
-t12                 
-LIVSEVRVMVRDG--INIAIDEL-C------------LIANRVKAFSGHQNQVRNAMEDAQ--RPDFVGI---RELGKQ-YQ-CMDGHGAVDTGAGRN-S
-ESAVWIFDIWMCKLAHGMQW--------GDIGRVSVDHPKFLKLEEGAPRCSSCPMPYFLGCEMFHRQVILKGAKGLVLPD--NEDSMAFPYVQVHSRSV
-KRCLNVLVQGDHDESRH---HNARI----VA---RIGM-NMVIIRYLNVEMGRLNHCEDDAMVYSPLRIGGAGTHSKPI------------------ADG
-FFDK-D-Q------ARPLIANAHIVPEN----DQWTGAVAQWCSSVIKCGLANHDLE-NISRLLRCVVMECVLGANVYHQASRMKMHGPYYAHVTEYAHG
-L----WKPFYQTSDHKNEAQGVGES-THQLPCVESQTCQYEVKHAKVCKLVHH-ALYLLALHTMMKPRLGDIDGCRCRSELNKLALSQLDD----KTLSK
--NCFQY--LGNMTWLATSPLH------VGCMIIF------------------------------------------------V------NNVLSQSLGDD
-SLQQ--MHAMPVTVVVVSHMVKKSMPQ-SHDKRGYTWQAKDFDQLIPVSFVKGEQ---EEEPEGPNN-----------------RVVHNIVKLLYTKDV-
-DCNTVLSLLIWQLC--H-GDWEQLVPQACAGARSDLAVCAWKRELVPGL---NHNNENLAKVIYFGPDGH-------DEGPMGRKIVDLHW-EMEASHRD
--SSVRDNML-VIMLPFLVNNLDPWRHYILGLND-QIQLTRPNT---ARRLSILM---VMHYSGEFHDKSP-ERSQLHFDSYSEH----KNDHKCVILASK
--HNKGLDWATGKDDMKGGAK-IMMSGALFY-------AEQNWIRARNHFVIFL-ICDAVRILIVLHGCMTAWTFMEFACNPFFAELFMEHVYIRYQYVNN
-HDIKIKDTEFRLAVYAWENSWETLCNC-EMLSGHIGAKINHNPRLFEQVC-PPCELTVSGLKGKH-VGWPYLTDITRTPLIRIQIREPGSE-CENSVVMY
-VIYYKERKSIR-----------QNNTGCAKLPQ---------------------HRLVNKVVD-ELYNNV---YHAIPKKD--INV-GVGDSGGMEVVQE
-DVFQILVCI
-;
-t81                 
-LIVSEVRHMVRDG--ANVAIDEL-C------------LIACRVKAFSGHGHQVRNAVEDAA--RPDFIGI---RELGKP-Y--CMDGHGAVNTGAGHN-S
-ESAVWIFDIWMYKLSHGMQW--------GDIGRVGVDHPKFLKLEEGAPNCSSLPMPYFLGVDMFHRQVTIKGAKGLVLPDIWNESPMAFPYAQVHSKSH
-KRCLNVLVQGDHEESEH---HNARI----MS---KIGT-HLVIINIINVEMQRLNHCEDKAIVYSPDRIGGAGFHSKPI------------------ADG
-FFDK-D-Q------ARPIIANAHIVPVN----DQWTGPMAQWCSSVIKCGLANHELE-DVSRLLRCVGMECNLGANHYHQVSRMKMHGPIYSHMTEYAVG
-L----WKPFYQASEHKNEAQGLGER-PHQLPCVESQTCQYEIKVAKVCKLVHV-ALYLVGLKTVVKPKLGDWDGIRCRSELNKLYLSQLDD----KTLSK
--NCFIY--LGNMTWLATSPLQ------IGWLVLFDGRKRQSAE-DYNRAADPTTISFCRKPIVQH-ADVFGCDRDKDPQEMRT------NNVISESLGDD
-FLQQ--MPAVPVSVCVYSHMVKKFVPQ-SHEKRGYTWKAKE-DHLVPISYCKGEH---EEEPEGAQY-----------------RVVQNIVKLLYTKDV-
-DCNVVLSLLVWQLC--H-GDWEPLIPQACQTAKKDLAVCAWKRELVPGL---NCNNEYLAKIIYFGPDGH-------DEGPMGRKIVDLHW-EMEASHRD
--SSVRDNYI-VIMLPFKINSRDPWRHYILGIND-QVCLNRPET---ARRLSILA---VMHYSGEFHDKSP-ERSHLHF-RYSEM----KNDVKCVI---K
--SNKGLDWTAGKDGMKGEAK-AMMNGALFY-------AEQNWFRKKNHFVIFV-FCDAVRILIMHSGVMIGYTFMEFACNPFFAELFMEHVMVRYQYESN
-HDIKIKDTCFRLAVYAWENSWETLCNV-EMLSGHFGAKINHVPRLPEQVC-PPCDLTVSGLKGKQ-NGLPYLTDITRTPLIRIQIRVPGSE-SENVVVMY
-MVYYKERKSIR-----------QNNTGCANLPQ---------------------HRLVVKVAD-ELYNNI---YHAIPKKD--GVLLGIGDSGGMEMVQE
-DLFQILVCA
-;
-t21                 
-LIVSEVRHMVRDG--ANIAIDEL-C------------LIACRVKAFSGHGNQVRNAVEDAP--RPDFIGV---RELGKP-Y--CMDGHGAVNTGAGVN-S
-ESAVWIFDIWMYKLSHGMQW--------GDIGRVDVDHPKFLKLEEGAPNCSSLPMPYFLGVDMFHKQVTLKGAKGLVLPDIWNESPMAFPYAQVHSKSH
-KRCLNVLVQGDHEESEH---HNARI----MS---RIGT-HLVIVNVINVEMQRLNHCEDKAIVYSPDRIGGAGFHSKPI------------------ADG
-FFDK-D-Q------ARPIIANAHIVPIY----DQWTGPMAQWCSSVIKCGLANHELK-VVSRLLRCVGMECNLGANHYHQVSRMKMHGPIYSHMTEYAHG
-L----WKPFYQASEHKNEAQGVGER-PHQLPCVESQKCQYEVKVAKVCKLVHV-ALYLVGLKTVVKPKLGDWDGVRCRSDLNKLYLSQLDD----KTLSK
--NCFRY--LGNMTWLATSPLQ------NGCVVIFAGRKRQSAE-DYNRAADPTTIAFCRKPIVQH-ADVFGCDKDKDPQEMRM------NNVISESLGDD
-FLQQ--MPAVPVSVCVHSHMVKKFVPQ-SHEKRGVTWKAKE-DHLVPISLCKGEH---EEEPEGAQY-----------------RCVQNIVKLLYTKDV-
-DCNVVLSLLVWQLC--H-GDWEPLVPQACQTAKKDLAVCAWKRELVPGL---NCNNEYLAKIIYFGPDGH-------DEGPMGRKIIQLHW-EMEASHRD
--SSVRDNII-VIMLPFKINSRDPWRHYILGLND-QVCLTRPET---ARRLSILV---VMHYSGEFHDKSP-ERSHLHY-RYSEV----KNDVKCVILASK
--SNKGLDWTAGKDGMKGENK-AMMNGTLFY-------AEQNWFRQKNHFVIFV-ICDAVRILIVHSGVMTGFTFMEFACNPFFAELFMEHVYIRYQYQAN
-HDIKIKDTCFRLAVYAWENSWETLCNV-EMLSGHFGAKINHVPRLPEQVC-PPCDLTVSGLKGKQ-NGWPYLTDITRTPLIRIQIRVPGSE-SENITVMY
-MVYYKERKSIR-----------QNNTGCANLPQ---------------------HRLVVKVAD-ELYNNI---YHAIPKKD--GVLLGIGDSGGMEMAQE
-DLFQILVCV
-;
-t80                 
-LIVSEVRHMVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMAA--RQNFVGM---RELEKV-YE-CMDGQGAVNTEAGNN-S
-ESAVWIFDIWMCKLTHGMQDFGD-----GDIGRVVVDHPKFEKLEEGAPNCSSHPVPYFLGIDMFHKQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSH
-RRVLNVLHQGDVEES-H---HSARC----VR---RIGF-HLVIIVFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPV------------------DDG
-FFDK-D-Q------ARPVIASAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVMIDCNQGANHYIQISRMKVHGPTYSHMTEYAHG
-L----WKPFYQASDHKNDAQGVGER-PHQLPCVESQTCQYEMKHAKVCKLVHG-ALYLIALKTVVKPKLGVWQGCRCRSQLSKLVLSQLDE----KTLSK
--NCSIY--LGNMTWLATSPLQ------IGCVILFGGRKRQSHGLNYNRAADPTTICFYKKPIVVQGADVFGCARGKDPQEMKA------NNVISGSLGDD
-RLQQ--MPAMPVTICVSSYMVKKSVIQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---DEEPDAAQQ-----------------RIVQNIVKLLYTKDV-
-SCNVVLSMLIWQIC--H-GDWEPQIPKACSNARKDLAVCAWKRELVPGL---NHNNENLAKIMYFGHDGH-------DEGPMGRKIVTLHV-EMEVSHRE
--SSVKDNMIRVIMLPFSNSSVDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VTHYSGGFHDKSA-ERSQHHF-IYNEV----KDDHKCVILASK
--CNKGLDWAAGKD-MKGGAK-VMMNGALFY-------AERNWIRQKHHFVIFV-VCDAVRILIVHYGCMIGYTFMDFACNPFFAELFMDHVFIRYVYMNN
-HDIKIMDTCFRVAVYTWENSWETCFNR-EMLSGTFGAKISHNPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIKIHIRVPGSQ-SENHVVMY
-CVYYKEHKSIR-----------QNNTGCANLPQ---------------------HRLVDQVVD-ELYSKF---YHAIPKKP--GNM-GVGDSGGMEMVQE
-DVFQILVCL
-;
-t14                 
-LIVSEVRHMVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMAA--RQNFVGM---RELEKV-YQ-CMDGQGAVNTEAGNN-S
-ESAVWIFDIWMCKLTHGMQDFGD-----GDIGRVVCDHPKFEKLEEGAPNCSSHPMPYFLGVDMFHEQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSH
-RRVLNVLHQGDVEES-H---HSARC----VR---RIGF-HLVIIVYWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPV------------------DDG
-FFDK-D-Q------ARPVIASAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVMIDCNQGANHYIQISRMKVHGPTYSHMTEYAHG
-L----WKPFYQASDHKSDAQGVGER-PHQLPCVESQTCQYEMKHAKVCKLVHG-ALYLIALKTVVKPKLGVWQGCRCRSQLSKLVLSQLDE----KTLSK
--NCSIY--LGNMTWLATSPLQ------IGCVILFGGRKRQSHGLNYNRAADPTTICFYKKPIVVQGADVFGCARGKDPQEMKA------NNVISGSLGDD
-RLQQ--MPAMPVTICVSSYMVKKSVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---DEEPDAAQQ-----------------RIVQNIVKLLYTKDV-
-SCNVVLSMLIWQIC--H-GDWEPQIPKACSNARKDLAVCAWKRELVPGL---NHNNENLAKIMYFGHDGH-------DEGPMGRKIVTLHV-EMEVSHRE
--SSVKDNMIRVIMLPFPSSSVDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VTHYSGGFHDKSA-ERSQHHF-IYNEV----KDDHKCVILASK
--CNKGLDWAAGKD-MKGGAK-IMMNGALFY-------AERNWIRQKHHFVIFV-VCDAVRILIVHYRCMIGYTFMDFACNPFFAELFMDHVFIRYQYMNN
-HDIKIMDTCFRVAVYTWENSWETCCNR-EMLSGTFGAKISHNPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTEITRTPLIKIHIRVPGSQ-SENHVVMY
-CVYYKEHKSIR-----------QNNTGCANLPQ---------------------HRLVDQVVD-ELYSKF---YHAIPKKP--GNM-GVGDSGGMEMVQE
-DVFQILVCL
-;
-t85                 
-LIVSEVRHVVRDG--VNIAVDEI-C------------LIANRVKSMSGQGNQVRNAMEMAA--RQNFVGM---RELDKA-YQ-CMDGQKAVNTEAGNN-S
-ESAVWIFDICMCKLTHGMQD--------GDIGRVVCDHPKFEKLEEGAPNCSSIPMPYFLGIDMFHKQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSH
-RRVLNVLHQGDHEES-H---VSARC----MR---RIGF-HLVIINFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------NDG
-FFDK-D-Q------ARPVIANAHIVPEH----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVEIDCNQGANHYVQISRMKMYGPTYSHMTEYAHG
-L----WKPFYQASDHKNDAQGVGER-PHQLPCVESQTCQYEVKHANVCKLVHA-ALYLIGLKTVVKPELGVWEGCRCRSQLSKLALSQLDE----KTLSK
--NCSIY--LGNMTWLATSPLQ------IGCIILFGGRKRQSHGLNYNRAADPTMICFYKKPIVVQGADIFGCARGKDPQEMKS------NNVISGSLGDD
-RLQH--MPAMPVTICVFSYMVKKAVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---DEEPDGAQQ-----------------RVVQNIVKLLYTKDV-
-SCNKVLSMLIWQIC--H-GDWEPQIPKACNAARKDLAVCAWKRELVPGL---NHNNEDLAKIMYFGPDGH-------DEGPMGRKIVNLHV-EMEVSHRE
--SSVKDNMIRVVMLPFDNNSWDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VMHYSGGFHDKSS-ERSQHHF-IYNEV----KNDHKCVILASK
--SNKGLDWAAGKD-MKGGAK-MMANGALFY-------EERNWIRQKNHFVIFV-VCDAVRILIVHYGCMVPYTFMAFACNPFFAELFMEHVFIRYQYVNN
-HDIKIMDTCFRVAVYTWENSWETCCNR-EMLSGTFGAKISHNPRLPEQVI-PPCDLTVSGLKGKH-NGWPYLTDITRTPLIKIHIRIPGSQ-SENHVVMY
-CVYYKEHKSIR-----------QNNTGCANLPQ---------------------HRLVDKVVD-ELYSKF---YHAIPKKP--GNM-GIGDSGGMEMVQE
-DLFQILVCI
-;
-t62                 
-LIVSEVRVMVRDG--IHIAVDEI-C------------LIANRVKCMSGQGNQARNAMEMAA--RQNFVGM---RELGKQ-YQ-CMDGQGAVNTEAGNN-S
-ESAVWIFDIWMCRLTHGMQD--------GDIGRVECDHPKFAKLEEGAPNCSSLPMPYFLGIDMFHNQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSH
-RRVLNVLHQGDHEES-H---HSARC----MR---RIGY-HRVIINYWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------ADG
-FFDK-D-Q------ARPVIANAHIVPEY----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVVIDCNHGANHYVQISRMKMHGPTYSHMTEYAHG
-L----WKPFYQASDHKNDAQGVGER-PHQLPCVEPQTCQYEVKHAKVCKLVHG-ALYLIGLQTVVKPKLGVWEGVQCRSQLSKLILSQLDD----KTLSK
--NCSIY--LGNMTWLATSPLQ------IGCIIMFDGRKRQSHGLQYNRAADPTTICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDD
-RLQQ--MPAMPVTICVFSYMVKKSVPQ-SHVKRGYTWRAKE-DHLIPVSFCKGEL---EEEPEGAQH-----------------RMVQNIVKLLYTKDV-
-SCNVVLSMLIWQIC--H-GDWEPQIPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEGPMGEKIVNLHV-EMEASHRE
--SSVKDNMIRVIMLPFSNNSWDPWRHVILGLND-KIKLTRPNT---AHRLSILV---VMHYSGGFHDKSA-ERSQHHF-IYNEI----KNDHKCVILASK
--ANKPLDWAAGKD-MKGGAK-MMANGALFY-------AERNWIRQKNHFVIFI-ICDAVRILIVHYGCMVGDTFMDFACNPFFAELFMEHVFIRYQYIPN
-HDIKIMDTCFRVAVYTWENSWETCCNR-EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIRIHIRVPGSE-SENHVVMY
-CVYYKEHKSIR-----------QNNTGCANLPQ---------------------HRLVDRVVD-ELYSKF---YHAIPKKP--GNM-DVGDSGGMEMVME
-DVFQILVCV
-;
-t19                 
-LIVSEVRHMVRDG--INIAVDEI-C------------LIANRVKCVSGQGNQARNAMEMAA--RQNFVGM---RELGKQ-YQ-CMDGQGAVNTEAGNN-S
-ESAVWIFDIWMCRLTHGMQD--------GDIGRVECDHPKFAKLEEGAPNCSSLPMPYFLGIDMFHKQVMGKGSKGLILPDTWNEASMAFPYPQVHSKSH
-RRVLNVLHQGDHEES-H---HSARC----MR---RIGYGHLVIINFWNVEMGRLNHCEDEAIIYSPLRIGGAGFHSKPI------------------ADG
-FFDK-D-Q------ARPVIANAHIVPEY----DQWSGAMAQWCSSVIKCGLANHDLE-NVSRLLRCVVIDCNHGANHYVQISRMKMHGPTYSHMTEYAHG
-L----WKPFYQASDHKNDAQGVGER-THQLPCVEPQTCQYEVKHAKVCKLVHG-ALYLIGLQNVVKPKLGVWEGVQCRSQLSKLILSQLDD----KTLSK
--NCSIY--LGNMTWLATSPLQ------IGCIILFDGRKRQSHGLQYNRAADPTTICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDD
-RLQQ--MPAMPVTICVFSYMVKKLVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---EEEPEGAKQ-----------------RMVQNIVKLLYTKDV-
-SCNVVLSMLIWQIC--H-GDWEPQIPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEGPMGEKIVNLHV-EMEASHRE
--SSVKDNMIRVIMLPFSNNSWDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VMHYSGGFHDKSA-ERSQHHF-IYNEI----KNDHKCVILASK
--ANKGLDWAAGKD-MKGGAK-MMVNGALFY-------AERNWIRQKNHFVIFV-ICDAVRILIVHYGCMVGDTFMDFACNPFFAELFMEHVFIRYQYIPN
-HDIKIMDTCFRVAVYTWENSWETCCNR-EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIRIHIRVPGSE-SENHVVMY
-CVYYKEHKSIR-----------QNNTGCANLPQ---------------------HRLVDKVVD-ELYSKF---YHAIPKKP--GNM-DVGDSGGMEMVME
-DVFQILVCV
-;
-t77                 
-LIVSEVRHMVRDG--INIAVDEI-C------------LIANRVKSMSGQGNQARNAMEMAA--RQNFVGM---RELGKQ-YH-CMDGQGTVNTEAGNN-S
-ESAVWIFDIWLCRLTHGMQD--------GDIGRVECDHPKFAKLEEGAPNCSSLPMPYFLGIDMFHRQVMAKGSKGLILPDTWNEASMAFPYPQVHSKSH
-RRVLNVLHQGDHEES-H---HSARC----MR---RIGY-VLVIINFWNVEMGRLIHCEDEAIIYSPLRIGGAGFHSKPI------------------ADG
-FFDK-D-Q------ARPVIANAHIVPEY----DQWSGAMPQWVSSVIKCGLANHDLE-NVSRLLRCVVIDVNQGANHYVQISRMKMHGPTYSHMTEYAHG
-L----WKPFYQASDHKNDAQGVGER-VHQLPCVEPQTCQYEVKHAKVCKHVHG-ALYLIGLQTVVKPKLGVWEGCQCRSQLSKLILSQLDD----KTLSK
--NCNIY--LGNMTWLATFPLQ------IGCIILFDGRKRQSYGLQYNRAADPTTICFYKKPIVVQGADIFGCARGKDPQEMKA------NNVTSGSLGDD
-RLQQ--MPAMPVTICVFSYMVKKSVPQ-SHQKRGYTWRAKE-DHLIPVSFCKGEL---EEEPEGAQQ-----------------RIVQNIVKLLYTKDI-
-SCNVVLSMLIWQIC--H-GDWEPQLPKACDAARKDLAVCAWKRELVPGL---NHNDENLAKIMYFGPDGH-------DEGPMGEKIVNLHV-EMEASHRE
--SSVKDNMIRVIMLPFGENSWDPWRHVILGLND-QIKLTRPNT---AHRLSILV---VMHYSGGFHDNSA-ERSQHHF-IYNEV----KNDHKCVILASK
--ANKGLDWAAGKD-MKGGAK-MMVNGALFY-------AERNWIRQKNHFVIFV-ICDAVRILIVHYGCMVGDTFMDFACNPFFAELFMEHVVIRYQYIPN
-HDIKIMDTCFRVAVYTWENSWETCCNR-EMLSGTFGARISHVPRLPEQVI-PPCELTVSGLKGKH-NGWPYLTDITRTPLIRIHIRVPGSE-SENHVVMY
-CVYYKEHKSIR-----------QNNTGCANLPQ---------------------HRLVDKVVD-ELYSKF---YHAIPKKP--GNM-DVGDSGGMEMVME
-DVFQILVCA
-;
-t88                 
-LIVSECRLIIRDG--NHDAIDEM-CCVANDLNNEIERLVASMVKSFRGHDSQARNNSECMR--SAPFIGV---RELFKR-YHKCVEGAGCVHTVAGTP-S
-DSPVWMFDQFMCQLTHSMVD--------GDLGRVVQDNVIFAKLKEGAPHCISL--PHFLGIDMFHTQVFVGGH--LILPDPCYELSISVMYAGHASYNQ
-KRCINNLDQGDQEDSNHRKEHKIRASVLLYR---QIGI-L-VIIKEANELMNRLNHKEPENGIIFPLR---DAQDPKQI------------------LNG
-LFDK-E-E------NRPMVQDADSVVGS----AQWAGQHRSWCSSDDKA-----------SQLPRNTHIVVEIGANVYEQFSRMKTNIPIYAHVTEYAVG
-V----ERPFYE-SEFKNEAQGWGES-GTSIPCVDSPDVQYEMKVAWVDKLMHT-ALYLMPLATVHKPEMGTVRGERCRAIL-KLLMMQLD------TLSR
--NQLPK--LCQGTWLDASPLQ------IGVQVMLVGKKGGSKK-EYELAADQVIIYFYQAPIIYVKADVFSGTVAKKAQAMR-------KSTGSQSIGDD
-GMQS--MPLMQNAVCVWSKMVRKVQPD-GQDKREQTWMAKD-DTLCPPSMKRGEK---TAEPTQWMG-----------------TVTVNKIKLLYCKDC-
-SCNEVMKILSWWLCNSV-GDWQTLMSQACITADPNPPVCVWKRELVPGL---NRSVENLAKIIYFCPDEH-------DERKMWGKIFALEW-EMDISHRH
--SSVDDNHC-VEMLPFMCQRVDPWGHYVQILAD-RQDLARPVT---LQALSILP---CPHASGKEQDGAV-ERSQHYV-VYAEL----QVDHKCTIAAHK
-YQDKMKDWDTGKN-MDEGAK-MYVEIHLFY-------AENNIRRQNDHSVIFW-ISDAKKRLICGMSSMCLVTFMTLACNPLFAKLFMEVVPMRYDYLTN
-HDIKI------MEVYAPENSWETIKNV-EMVSGKEGAEINHTPQLPEQVI-PPCNLTVSNLKGMI-PPCPALTEITRTV--FIV--MYYAI-LRNKIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGG---YHAAPKKE--EMV-GPGDNGGVEDIKE
-DMFQVLVCR
-;
-t37                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVG
-V----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRH
--SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEHSVTFV-ISDAQKRLICGVSSMVMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPENSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP--FIV--MYVAI-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-DMFQVLVCK
-;
-t35                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTVIPIYARVTEYAVG
-V----PRPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPQMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIYHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRH
--SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEHSVTFV-ISDAQKRLICGVSSMAMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPENSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIV--MYVAI-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-DMFQVLVCK
-;
-t48                 
-LIVSDMRLIIREG--SDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEVGANVYEQYSRMKTVIPIYARVTEYAVG
-V----PRPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIYHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRH
--SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLIKQNEHSVTFV-ISDAQKRLICGVSSMVMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPENSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIV--MYVAI-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-DMFQVLVCK
-;
-t55                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAI--PYFMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVG
-V----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLSTVHKPEMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DTLCPPCEEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQTLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRH
--SSVDDNQC-VELLPYNCQRMDPWGHYVQILAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNLRKQNEHSVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPENSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIV--MYVAI-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-SPGDNGGVEAIRE
-DMFQVLVCK
-;
-t46                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVHDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFVGGN--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L-VIIKEANELMGRLNHKEPKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVG
-V----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVKVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKSQAMRS------RSIGSQSVGDD
-GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWMAKD-DALCPPCKEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQSLMNDACRSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRH
--SSVDDNQC-VELLPYVCQRMDPWGHYVQVLAD-RLDLTRPVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDHKSTIDANK
-NDNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKQNEHSVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPDNSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPCPALTEITRTP--FIM--MYVAM-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-APGDNGGVEAIRE
-DMFQVLVCK
-;
-t67                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVMDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFLGGD--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPRKEHKIRNSVLLYR---QIGL-L-VIIKEANELMGRLNHKERKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVG
-V----ARPFYD-AEFKNEAQRQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKAQAMRS------RSIGSPSVGDD
-GMQN--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWVAKD-DTLCPPCKEQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQTLMNDACSSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRM
--SSVDDNQC-VELLPYVCQRMDPWGHYVQILAD-RLVLTRPVT---LHGLSILP---CPHASGKEQDGAE-ERSQHYG-VYQEL----QNDAKSTIDANK
-NPNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKLNEHSVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPENSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP--FIV--MYVAI-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-APGDNGGVEAIRE
-DMFQVLVCK
-;
-t57                 
-LIVSDMRLIIREG--NDDAIDEM-CCVANELNNVIERLVASMVKEFRGHDCQARNNSECIT--AAAFIGT---RELFKR-YPKCMEGARCVHTVAGPP-S
-ESPVWMFDKFMCQLTHSMVN--------GDLGRVVMDNWTFTKLKEGAPHCIAL--PYFMGIDMFHIQVFIGGD--LILPDPCYELSISVMYAGHASYNQ
-KRCINGLDNGDRQDSDPQKEHKIRNSVLLYR---QIGL-L-VIIKEANEIMGRLNHKERKNGVIFPLR---GAQGPKQI------------------SNG
-LFEK-E-E------NRPMVQDAGSVPGR----KQWAGQHRAWCSSDDKA-----------SQLPRNTRIVAEIGANVYEQYSRMKTNIPIYARVTEYAVG
-V----ARPFYD-AEFKNEAQGQGES-GTSIPCVDSPDIQYEMKHAWVEKLMHS-ALYLMPLATVHKPEMGTVKGERCRTIL-KLLMVQLDE----KTLSQ
--NQIPD--LCQRTWLDASPLQ------IGVQVVLVGKKRGSKK-DYELAADPVIIYFYQAPIIHHKADVFAGTVAKKAQAMRS------RSIGSPSVGDD
-GMQK--MPLMQNAVCVWSQMVRKVQPD-GQDKREQTWVAKD-DTLCPPCKDQGEK---AAEPTQWVG-----------------TCTSNVIKLLYCKDC-
-SCNEVLKILAWWLCDSV-GDWQTLMNDACSSANPNYPVCIWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERRMWGKIFALEW-EMDISHRV
--SSVDDNQC-VELLPYLCQRMDPWGHYVQILAD-RLNLTRPVT---LQGLSILP---CPHASGKEQDGAV-ERSQHYG-VYQEL----QNDAKSTIDANK
-NPNKMLDWDTGKN-MDKGAK-MFYKIVLFY-------AENNIRKQNEHSVTFV-ISDAQKRLICGVSSMCMRTFMTLACNPFFAKLFMEVVPMSYDYVPN
-HDIKI------IEVYAPENSWETTKVV-EMVSGKSGAQINHTPQLPEQVI-PPCCLTVSNLKGMI-PPVPALTEITRTP--FIV--MYVAI-LRNDIMQY
-CFYYKENRSVR-----------LNNTGRAELPK---------------------HHMQNIFID-ELYPGP---YHAAPKKE--ELM-APGDNGGVEAIRE
-DMFQVLVCK
-;
-t56                 
-LIVSEWRLFIRDG--HDDAIDEM-CCEANELNNDIEKLVASMVKGFRGHDSQARNNAECII--AAPFIGV---RELFKR-YIKCVEGAGCVYTVA-AP-S
-ESPVWMFDKFMCHLTHSMVV--------GDLGRVLRDNTTFAKLKEGAPVCISL--PYFLGMDMFHQQVFMGGN--LILPDPCYELSISVMYAGHASYNQ
-KRCLNNLDQGDREDSSHRKEHKIRRSVLLYQ---QIGC-L-VITRERNELMGRLNHKEPRDGVIFPHR---GAQGPKQL------------------ANG
-LFEK-E-E------NRPMVQDAGSVPER----AQWPGQQRAWCSSDDKA-----------SKLPRNTKMVAEIGANVYEQASRMKTNIPIYAHVTEYALG
-V----DRPFYD-SEFKNEAQGQGES-GTSIPCVDSPDVQYELKHAWVDKLMHT-ALYLMPLPTVHKPKMGTVKGERCRAML-KLNMMQLDE----KTLSQ
--NQIIK--LCQRTWLDASPLQ------IGVNCVLPGKKGGSNK-DYELAADPVIIYFYQAPIIHHKADVFSGTVAKKAQAMRQ------QSTGSQSVGDD
-GTQV--MPLMQNLVCVWSKMVRKCMID-GQEKREQTWMAKD-DKLCPPSQEQGEK---AAEPTQWED-----------------ICTANVIKLLYCKDC-
-SCNEVLRVLSWWLCDSV-GDWRTLMSDACALANPNPPVCVWKRELVPGL---NRNVENLAKIIYFCPDEH-------DERKMWGKIFCLEW-EMDISHRH
--SSVDDNVC-VEMLPFVCQKMDPWGHYVQILAD-RLDLTRPVT---LQGLGILV---CPHASGKEQDGAM-ERSQHYV-VYAEL----QNDHKNTINANK
-VPRKMLDWDTGKN-MDKGAKGMYHEIVLFF-------AENNVKKQVEHSVIFI-IADAQKRLICGVSSMCLQTFMNLACNPFFAKLFMEVIPMRYDYQTN
-HDIKI------KEVYAPENSWETIKNV-EMVSGKAGKQINHEPQLPEQVI-PPCSLTVSNLKGMM-PPCPAMTEITRTV--III--MYYAI-LRNEIMQY
-CFYYKENRSVR-----------INNTGQAELPK---------------------HHVQNVFID-ELYPGH---YHAAPKKN--ENV-GPGDNGGVEGIKE
-DMFQVLVCQ
-;
-t13                 
-GIVSECRMIIRDE--HDDAIDEM-C------------LVASMVKKLSGCENQARNNHECAI--PPPFHGV---REMFKRVYE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKVMYQLTHSMVW--------GDLRRVVHDNVTFSKLKEGAPHCISH--PYFLGIDMFHIQVYSKGF--LTLPDPRYEISMSVMYSQHHSFSM
-KRCLNGLDHGDREESPHQIEHKMRKSVLIYN---PIGY-L-VIIKDANSMMGRLNHHESRAVVAFPLR---GAEGPKQV------------------MEG
-LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-NEWKQEAQGQGEA-GACIPCVDSKDVQYELKHAYVKKLMHT-SLYLMHIETCHKPVMGTVKGNRCRAIL-KLSMIQLDQ----KTLSQ
--NQRAK--LCQRTWLDTSPLQ------MGMTLVLVGKKVGSKK-DYEVAADPVIMYFYDAPMIMRPTDVFEGTNNKKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKD-DTLCPQSRDQGEK---HHEPHHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLSSDACMHAEQNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEGKMMNKIFALEW-EMDMSHRV
--SSVDDNYI-IEMLPFVCDRVGPWGHYAQVLAD-QLHLTRPHT---LRDLYILAC--CPVASGKEQDGNK-ERSQHYT-IYAEI----QNDHKNPISANN
-QPNKMLDWDTGKT-MDRGAA-MCGEIKLFY-------AEPNVWNQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFSKLFMEVVCMRYNYTSN
-HSIKI------FEVYADENSWENVRNF-EMVSGRAGAHINHIPQLPEQAY-PPCKLTVSNLKGVA-ASCPAITEITRTA--VIV--MYGSI-LRNDVMQY
-VFYYRENRSVR-----------QNNTGNAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKD--RFC-NPGDNGGMETYQE
-DMFQVLVCV
-;
-t5                  
-GIVSECRMIIRDE--HDDAIDEM-C------------LVASMVKKLSGCENQARNNHECAI--PPPFHGV---REMFKRVYE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKVMYQLTHSMVW--------GDLRRVVHDNVTFSKLKEGAPHCISH--PYFLGIDMFHIQVYSKGF--LTLPDPRYEISMSVMYSQHHSFSM
-KRCLNGLDHGDREESPHQIEHKMRKSVLIYS---PIGY-L-VIIKDANSMMGRLNHHESRAIVAFPLR---GAEGPKQV------------------MEG
-LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-NEWKQEAQGQGEA-GACIPCVDSKDVQYELKHAYVKKLMHT-SLYLMHIETCHKPVMGTVKGNRCRAIL-KLSMIQLDQ----KTLSQ
--NQRAK--LCQRTWLDTSPLQ------MGMTLVLVGKKVGSKK-DYEVAADPVIMYFYDAPMIMRPTDVFEGTNNKKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKD-DTLCPQSRDQGEK---HHEPHHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLSSDACMHAEQNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEGKMMNKIFALEW-EMDMSHRV
--SSVDDNYI-IEMLPFVCDRVGPWGHYAQVLAD-QLHLTRPHT---LRDLYILAC--CPVASGKEQDGNK-ERSQHYT-IYAEI----QNDHKNPISANN
-QPNKMLDWDTGKT-MDRGAA-MCGEIKLFY-------AEPNVWNQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFSKLFMEVVCMRYNYTSN
-HSIKI------FEVYADENSWENVRNF-EMVSGRAGAHINHIPQLPEQAY-PPCVLTVSNLKGVA-ASCPAITEITRTA--VIV--MYGSI-LRNDVMQY
-VFYYRENRSVR-----------QNNTGNAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKD--RFC-NPGDNGGMDTYQE
-DMFQVLVCV
-;
-t38                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISQ--PFFLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNGLDVGDREESPHHIDHKMRKSVLIYN---PIGY-L-VIIKNANSLMGRLNHHESRLIVTFPLR---GAEGPKQV------------------MEG
-LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTIKGNRCRAIL-KLTMIQLDQ----KTLSQ
--NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVGSKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKSQPD-GQDKRGYTWVAKE-DDLCPQSGDQGEK---YAEPQHIRN-----------------QFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALEW-EMDMSHRM
--SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQNKLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSN
-HSIKI------FEVYADENSWENIRNF-EMVSGRAGAYINHIPQLPEQAV-PPCHLTVSNLKGVA-ASCPAITEITRTA--VIV--MYVSI-LRNDVMQY
-VFYYRENRIVR-----------QNNTGVAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKE--RFC-NVGDNGGMETIQE
-DMFQVLVCI
-;
-t33                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L-VIIKNANSLMGRLNHYESRAIVTFPLR---GAEGPKQV------------------MEG
-LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SHLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHN-SLYLMHIDTCHKPAMGTVKGNRCRAIL-KLTMIQLDQ----KTLSQ
--NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVGSKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDACVSAEPNTPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALEW-EMDMSHRM
--SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGAK-ERSQCYT-IYAEL----QNDHKSLISANH
-VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSN
-HSIKI------FEVYADENSWENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAITEITRTA--VIV--MYVSI-LRNDVMQY
-VFYYRENRIVR-----------QNNTGVAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKE--RFC-NPGDNGGMETIQE
-DMFQVLVCV
-;
-t100                
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAIL-KLTMIQLDQ----KTLSQ
--NQRAR--LCQRTWLDTSPLQ------MGMTIVLVGKKVGSKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSEDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALEW-EMDMSHRM
--SSVDDNYI-IEMLPFVCDRVGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSN
-HSIKI------FEVYADENSWENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAITEITRTA--VIV--MYVSI-LRNDVMQY
-VFYYRENRIVR-----------QNNTGVAELPK---------------------HHMQDVFID-ELYLGP---YHASPKKE--RFC-NPGDNGGMETIQE
-DMFQVLVCV
-;
-t34                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAIL-KLTMIQLDV----KTLSQ
--NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVGSKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALEW-EMDMSHRM
--SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSN
-HSIKI------LEVYADENSWENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA--VIV--MYVSI-LRNDVMRY
-VFYYRENRIAR-----------QNNTGVAELPK---------------------HHMQDIFID-ELYLGP---YHASPKKQ--RFC-NPGENGGMETIRE
-DMFQVLVCV
-;
-t84                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCDDQARNNHECAI--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAIL-KLTMIQLDV----KTLSQ
--NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVGSKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDACVSAEHNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALEW-EMDMSHRM
--SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGAK-ERSQCYT-IYAEL----QNDHKSLIAANH
-VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSN
-HSIKI------LEVYADENSWENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA--VIV--MYVSI-LRNDVMRY
-VFYYRENRIAR-----------QNNTGVAELPK---------------------HHMQDIFID-ELYLGP---YHASPKKE--RFC-NPGENGGMETIRE
-DMFQVLVCV
-;
-t92                 
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEDQARNNHECAI--SHPFHGV---REMFKR-YE-CMEGIGCVNTVAGNP-S
-ESSAWMFDKFMYQLTHSMVW--------GDLGRVYYDNITFSKLKEGAPHCISH--PFFLGIDMFHIQVYFKGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNGLDVGDREESPHQIEHKMRKSVLIYN---PIGY-L-VIIKNANSLMGRLNHHESRAIVTFPLR---GAEGPKQV------------------MEG
-LFLK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIFAHVTEYAVG
-I----VKPFYD-SEWKQEAQGQGEA-GACIPCVDSPDVQYELKHAYVKKLVHT-SLYLMHIDTCHKPVMGTVKGNRCRAIL-KLTMIQLDV----KTLSQ
--NQRAR--LCQRTWLDTSPLQ------MGMTIVLMGKKVGSKK-DYEIAADPVIMYFYQAPMIMRPTDVFEGTNNRKAQAMRS------RSTASQSIGDD
-DMLN--MPLTQNAMCVESEMVRKCQPD-GQDKRGYTWVAKE-DTLCPQSGDQGEK---YAEPQHIRN-----------------KFSENVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDACVSAEPNPPVCVWQRELVPQL---NRNAEDLARIIYFGPDEH-------DEGKMMCKIFALEW-EMDMSHRM
--SSVDDNYI-IEMLPFVCDRIGPWGHYAQILAD-QLNLTRPHT---LRELYILA---CPVASGKEQDGAQ-ERSQCYT-IYAEL----QNDHKSLISANH
-VPNKMLDWDTGKT-MDRGAA-MCAEIKLFY-------AEPNVWKQNDHSVMFI-ISDAQNRLIVANSIMVGQTFMAMACNPHFAKLFMEVVVMRYDYCSN
-HSIKI------LEVYADENSWENIRNF-EMVSGRAGAHINHIPQLPEQAC-PPCVLTVSNLKGVA-ASCPAMTEITRTA--VIV--MYVSI-LRNDVMRY
-VFYYRENRIAR-----------QNNTGVAELPK---------------------HHMQDIFID-ELYLGP---YHASPKKE--RFC-NPGENGGMETIRE
-DMFQVLVCV
-;
-t3                  
-GIVSECRMIIRDE--SDDAIDEM-C------------LVASMVKKLSGCEQQARNNRECAT--SIPFLGV---RELWKR-YE-CMEGIGCVNTVAGKP-S
-QSSVWMFDRFMYKLTHSMVW--------GDLGRVYWDNLTFQKLKEGAPHCIAV--PNYLNIDMFHIQVFYKGP--LTLPDPHYELSMSVMYAQHHSFSQ
-KRCLNALDHGDREESPHQIEHKMRKSVLLYN---PIGY-L-VIIKNANSMMGRLNHHESCAIVMFPLR---GAEGPKQI------------------IEG
-LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SRLPRNDPVVHEVGANVYQQISRMKTSIPIYAHVTEYAVG
-I----IKPFYD-NEWKQEAQGQGEA-GASIPCVNSPDVQYELKHAHIKKLMHT-SLYLMHLGTCHKPVMGTVKGDRCRAIL-KLSMIQLDQ----KTLSQ
--NVRAR--LCQRTWLDTSPLQ------MGMVAVLLGKKLGSKK-DYEIAADPVIKYFYQAPIIMRRTDVFEGTDDQKAQAMRV------RSTASQSIGDD
-DMLI--MPLVQNAMCVKSEMVRKCQPD-GPDKRGYTWMAKD-DTLCPVSAGQGEK---YAEPHQIKN-----------------KFSVNVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWVTLASDACLSAEPQPPVCVWQRELVPQL---NRNVEDLARVIYFGPDEH-------DEGKMMPKIFKLAW-EMDMSHRA
--SSVDDNYV-IEMLPFVCHRVGPWGHYAQVQAD-QQNLTRPHT---LADLFILS---CPVASGKEQDGAT-ERSQYYV-VYAEL----QNDHKSPISANK
-HPDKMLDWDTGKS-MDRGAA-MCREIKLFY-------AEPNVWKQNDHSVVFI-ISDAVNRLICANSIMCGLTFMAMACNPHFAKLFMEVVCMRYDYFSN
-HSIKI------FEVYAEDDSWENICNF-EMMSGRTGAQINHIPQLPEQVC-PPCHLTVSNLKGCC-ASVPAITEITRTV--VIC--MYVSI-LCNVVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGQ---YHASPKKK--KIC-GPGDNGGMETIEE
-DMFQVLVCV
-;
-t22                 
-GIVSECRVIIRDQ--SDDAIDER-Y------------LVASVVKRLSGCENQARNNRECAI--SIPFLGV---RELWKR-YE-CMEGIGCVNTVAGTP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLGRVYVDNQTFSKLKEGAPHCISA--PYYLNIDMFHIQVFYKGS--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDYGDREESPHQIEHKMRKSVLLYY---TIGW-L-VIIKNADSMMGRLNHHESCAMVMFPLR---GAEGPKQI------------------MEG
-LFDK-E-E------ARPMVQDAASVPGR----AQWVGRVRAWCSSDVKA-----------SQLPTNDPIVPEVGANVYQQVSRMKTSIPIYAHVTEYAVG
-I----VKPFYD-NEWKQEAQGQGEA-GASIPCVNSPDVQYELKHAHIKKLMHT-SLYLMHLKTCHKPVMGTVKGDRCRAIL-KLKMIQLDQ----KTLSQ
--NQAAR--LCKRTWLDTSPLQ------MGMNVVLIGQKLGSKH-DYEIAADPVIMYFYQAPIIMRRTDVFEGTDDQKAQAMRL------RSTASRSIGDD
-DMLI--MPLVQNAMCVNPEMVRKCQPD-GQDKRGYTWMAKN-DTLCPVSAGQGEC---YAEPHQTCN-----------------KFRVNVIKLLYCKDC-
-SCNKVLKILKWQLCESV-DDWQTLASDACILAKPQPPVCVWQRELVPQL---NRNVEDLARVIYFGPDEH-------DEGKMMSKIFNLEW-EMDMSHRT
--SSVDDNYV-IDMLPFICHRVGPWGHYAQVLAD-QINLTRPHT---LRDLFILA---CPVASGKEQDGAT-ERSQHYV-VYAEL----QNDHKSPISANK
-HPNKLLDWDTGKT-MDRGAA-MCHEIKLFH-------AEPNVWRQNDHSVMFI-ISDASNRLICANSIMCGLTFMAMACNPHFAKLFMEVVCMRYEYFSN
-HSIKI------FEVYAEENSWENVCNF-EMMSGRAGAQINHIPQLPEQVC-PPCVLTVSNLKGCC-ASCPANTEITRTV--VIC--MYVSI-LRNVVMQY
-VFYYKENRSVR-----------QNNTGAAELPK---------------------HHMQDIFID-ELYPGL---YHASPKKK--KVC-GPGDNGGMETIQE
-DMFQVLVCV
-;
-t64                 
-GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECAIT-SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGMP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLRRVFPDNATFSKLKEGAPHVISH--PYFLGIDMFHDQVVYRGP--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIGF-L-VIIKNINSMMGRLNHHESRAVVGFPLR---GAENPKQI------------------MEG
-HFDK-E-E------ARPIVQDAASVPGK----AQWVGRVRAWCSSDVKA-----------SKLPRNDPIVPEVGANVYQQLSRMKTNIPIYAHVTEYAVG
-I----VKPFYD-NEWKQEAQGVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAIL-KLPMIQLDQ----KTLSH
--NQPRR--LCQRTWLDASPLQ------VGMNIMLMGKKAPSKK-DYEIAADPVIMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDD
-DMLK--MPLVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YAEPHVIGD-----------------KVSVNVIKLLYCKDC-
-SCNQVLKILVWQLCESV-DDWQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMSKIFALEW-EMDMSHRV
--SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTRPHT---LRDLFILS---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-HLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDHSVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGAN
-HDIKI------FEVYAAENSWENARNF-EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIVID-ELYPGP---YHATPKKH--RFC-GTGDNGGMQAIQE
-DMFQVLVCV
-;
-t18                 
-GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECAIT-SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGMP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLRRVFPDNATFSKLKEGAPHVISH--PYFLGIDMFHEQVVYRGP--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIGF-L-VIIKNINSMMGRLNHHESRAVVGFPLR---GAENPKQI------------------MEG
-HFDK-E-E------ARPIVQDAASVPGK----AQWVGRVRAWCSSDVKA-----------SKLPRNDPIVPEVGANVYQQLSRMKTNIPIYAHVTEYAVG
-I----VKPFYD-NEWKQEAQGVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAIL-KLPMIQLDQ----KTLSH
--NQPRR--LCQRTWLDASPLQ------VGMNIMLKGKKAPSKK-DYEIAADPVIMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDD
-DMLK--MPLVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YAEPHVIGD-----------------KVSVNVIKLLYCKDC-
-SCNQVLKILIWQLCESV-DDWQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMFKIFALEW-EMDMSHRV
--SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTRPHT---LRDLFILS---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-HLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDHSVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGAN
-HDIKI------FEVYAAENSWENARNF-EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGP---YHATPKKH--RFC-GTGDNGGMQAIQE
-DMFQVLVCV
-;
-t68                 
-GIVSECRMIIRDE--TDDAIDEV-C------------LVASMVKKLSGCENQTRNNRECAI--SPPFIGV---RELFKR-YG-CVEGIGCVNTVAGMP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLRRVFPDNAHFSKLKEGAPHVISH--PYFLGIDMFHDQVVYRGP--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDHGDTQESPHGIEHNMRNSVLLYN---PIGF-L-VIIKNINSMMGRLNHYESRAVVGFPLR---GAENPKQI------------------MEG
-HFDK-E-E------ARPIVQDAASVPEK----AQWVGRVRAWCSSDVKA-----------SKLPRNDPIVPEVGANVYQQISRMKTNIPIYAHVTEYAVG
-I----VKPFYD-NEWKQEAQGVGEA-GASIPCVDSPDVQYELKHAEVRKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAIL-KLPMIQLDQ----KTLSH
--NQPRR--LCQRTWLDASPLQ------VGMNIMLMGKKAPSKK-NYEIAADPVIMYFYQAPIIMRRTDVFEGTHNKKAQAMRV------RSTASQSIGDD
-DMLK--MPLRQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YAEPVVIGD-----------------KVSVNVIKLLYCKDC-
-SCNQVLKILVWQLCESV-DDWQTLTSDPCMSAQVNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMSKIFALEW-EMDMSHRV
--SSVDDNFV-IEMLPFVCHRIGPWGHYAQMLAD-QIVLTRPHT---LRDLFILS---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-HLNKMLDWDTGKT-MDREAT-MCREMKLFY-------AETNLWKQNDHSVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVVCVHYDYGAN
-HDIKI------FEVYAVENSWENARNF-EMMSGRAGAEINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGP---DHATPKKH--RFC-GTGDNGGMQTIQE
-DMFQVLVCV
-;
-t28                 
-GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECAI--SPPFIGV---RELFKR-YH-CMEGIGCVNTVAGMP-S
-ESSVWMFDQFMYKLTHSMIW--------GDLGRVFPDNATFSKLKEGAPHVISH--PYFLGIDMFHAQVFYRGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNPLDHGDRQESSHGIEHNMRSSVLLYN---PIGF-L-VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------VEG
-HFDK-E-E------ARPIVKDAASVPGK----AQWVGRIRAWCSSDVKA-----------SQLPRNDPIVPEVGANVYQQDSRMKTNIPIYAHVTEYACG
-I----VKPFYE-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAIL-KLSMIQLDE----KTLSQ
--NQRPG--LCQRTWLDANPLQ------MGMNTMLVGKKTPSKK-DYEIAADPVIMYFYQAPIIMRRTDVFEGTNNKKSQAMRV------QSTSSQSIGDD
-DMLN--MPLVQNAMCVSSEMVRKCQPD-GQNKRGCTWMAKN-DTLCPQSGNQGEK---FAEPHQIRN-----------------KVSVNVIKLLYCKDC-
-SCNKMLKILVWQLCESV-DDWQTLASDPCVSAEPNSPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMSKIFALEW-EMDMSHRI
--SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLSD-QIVLTRPHT---LRDLFILA---CRVASGGEVDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-VLNKMLDWDTGKT-MDREAA-MCREIKLFY-------AETNVWKQNDHSVMFI-ISDAQNRLICGNSIMCGITFMAMACNPHFAKLFMEVACMRYDYFAN
-PDIKI------FEVYAAENSWENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV--VIC--MYVSI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RYC-GPGDNGGMQVIEE
-DMFQVLVYV
-;
-t82                 
-GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECAI--SPPFIGL---RELFKR-YV-CMEGIGCVNTVAGMP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLGRVFPDNCTFSKLKEGAPHVISH--PYFLGIDMFHGQVVYRGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNPLDHGDRQESPHGIEHNMRSSVLLYN---PIGF-L-VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------MEG
-HFDK-E-E------ARPIVQDAASVPGE----AQWVGHIRAWCSSDIKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIYAHTTEYACG
-I----VKPFYE-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHANVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAIL-KLNMIQLDQ----KTLSQ
--NQRPG--LCQRTWLDASPLQ------MGMHIMLVGKKTPSKK-DYEIAADPVIMYFYQAPIIMQRTDVFEGTNNKKSQAMRV------HSTSSQSIGDD
-DMLN--MPLVQNAMCVSSEMVRKCQPD-GQNKRGYTWMAKH-DTLCPQSGNQGEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDPCMSAEPNPPVCVWQRELVPQL---NRNVEDLARTIYFGPDEH-------DEGKMMSKIYALEW-EMDMSHRV
--SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLAD-QIVLTRPHT---LRDLFILA---CPVASGGEQDGNA-ERSQHYI-VYAEL----VNDHKSPISANK
-VLNKMLDWDTGKT-MDREAA-MCRDIKLFY-------AETNVWKQNDHSVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVACMRYDYFAN
-PDIKI------FEVYADENSWENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV--VIC--MYISI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RFC-GPGDNGGMQVIEE
-DMFQVLVYV
-;
-t41                 
-GIVSECRMIIRDE--ADDAIDEM-C------------LVASMVKKLSGCENQARNNRECAI--SPPFIGL---RELFKR-YV-CMEGIGCVNTVAGMP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLGRVFPDNCTFSKLKEGAPHVISH--PYFLGIDMFHGQVVYRGS--LTLPDPRYELSMSVMYSQHHSFSQ
-KRCLNPLDHGDRQESPHGIEHNMRSSVLLYN---PIGF-L-VIIDNINPMMGRLNHHESRAIVTFPLR---GAEHPKQI------------------MEG
-HFDK-E-E------ARPIVQDAASVPGE----AQWVGHIRAWCSSDIKA-----------SQLPRNDPIVPEVGANVYQQVSRMKTNIPIYAHTTEYACG
-I----VKPFYE-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHANVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRAIL-KLNMIQLDQ----KTLSQ
--NQRPG--LCQRTWLDASPLQ------MGMHIMLVGKKTPSKK-DYEIAADPVIMYFYQAPIIMQRTDVFEGTNNKKSQAMRV------HSTSSQSIGDD
-DMLN--MPLVQNAMCVSSEMVRKCQPD-GQNKRGYTWMAKH-DTLCPQSGNQGEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLASDPCMSAEPNPPVCVWQRELVPQL---NRNVEDLARTIYFGPDEH-------DEGKMMSKIYALEW-EMDMSHRV
--SSVDYNYV-IEMLPFVYHRVGPWGHYAQMLAD-QIVLTRPHT---LRDLFILA---CPVASGGEQDGNA-ERSQHYI-VYAEL----VNDHKSPISANK
-VLNKMLDWDTGKT-MDREAA-MCRDIKLFY-------AETNVWKQNDHSVMFI-ISDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEVACMRYDYFAN
-PDIKI------FEVYADENSWENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPDITEITRTV--VIC--MYISI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RFC-GPGDNGGMQVIEE
-DMFQVLVYV
-;
-t71                 
-GIVSECRMIIRDQ--SDDAIDEMVV------------LVASMVKEMSGCENQARNNSECAI--SPQFIGV---RELFKR-YR-CMEGIGCVNTVAGAP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLARVFHDNGTFAKLKEGAPHVISV--PYFLGIDMFHGQVFLRGS--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNHLDHGDRQESPHGIEHNMRKSVLLYN---PQGY-L-VIIKNVNSMMGRLNHHESRAVVTFPLR---GADNPRQI------------------MEG
-HFDK-E-E------ARPVVQDAPGVPGK----AQWVGKVRAWCSSDVKA-----------SQLPRNDTIVPEVGANVYQQVSRVKTHIPIYAHVTEYAVG
-I----VKPFYN-NEWKQEAQGQGEA-GASIPCVDSPDDQYELKHAEVKKLMHD-SLYLPHLETCHKPIMGTVKGGRCRASL-KLKMIQLDQ----KTLSQ
--NQQRR--LCQRTWLDSSPLQ------MGMKIMLQGKKTPSKK-DYEIAADPAIMHFYRAPIIMRRTDVFEGTNNKKAQAMRI------RSTASQSIGDD
-DMLN--MPLHQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSPNQGEK---YAEPHQIRN-----------------KISVNVIKLLYCKDC-
-SCNQVLKILVWQLCESV-DDWQTLTSDPCVPAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALEW-EMDMSHRD
--SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRDLFILA---CPVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPISANK
-HMNKMLDWDTGKT-MDFEAA-MCREIKLFY-------AETNVWKINDHSVMFI-VSDAQNRLICGNSIMCGLTFMAMACNPHFAKLFMEGVCMRYDYSAN
-HDIKI------FEVYADENSWENVRNF-EMMSGRAGAQINH-PQLPEQVCNPPCHLTVSNLKGVC-ASCPAITEITRTV--VIV--MWISI-LRNDVMQY
-VVYYKENRSVR-----------QNNTGKAELPR---------------------HPMQEIFID-ELYPGH---YHATPKKN--RFC-GPGDNGGMQSMQE
-DVFQVLVCV
-;
-t94                 
-GIVSECRMIIRDQ--SDDAIDEMVC------------LVASMVKELSGCENQARNNRECAI--SPPFTGV---RELFKR-YR-CMEGIGCVNTVAGIP-S
-ESSVWMFDRFMYRLTHSMVW--------GDLGRVFQDNATFSKLKEGAPHVISH--PYFLGIDMFHGQVFYRGS--LTLPDPRYELSMSVMYAQHHSMSQ
-KRCLNTLDHGDRQESPHGIEHNMRKSVLLYD---PIGY-L-VIIKNVNSMMGRLNHHESRAKVTFPLR---GADNPRQI------------------MEG
-HFDK-E-E------ARPVVQDAPGVPEQ----AQWVGKMRAWCSSDVKA-----------SQLPRNDTIVPEVGANVYQQVSRVKTNIPIYAHVTEYAVG
-I----VKPFYN-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLPHLETCHKPIMGTVKGGRCRASL-KLNMIQLDQ----KTLSQ
--NQQRR--LCQRTWLDASPLQ------MGMKIMLQGKKIPSKK-DYEIAADPAIMYFYQATIIMRRTDVFEGTNNKKAQAMRM------RSTASQSIGDD
-DMLN--MPLHQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLYPQSANQGEK---YAEPHQIRN-----------------KISVNVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLTSDPCVPAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALEW-EMDMSHRD
--SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-KLVLTRPHT---LRDLFILA---CYVASGGEQDGNT-ERSQHYI-VYAEL----QNDHKSPILANK
-VVNKMLDWDMGKT-MDFEAA-MCREIKLFY-------AETNVWKQNNHSVMFI-VSDAHNRLICGNSIMCALTFMAMACNPHFAKLFMEAVCMRYDYSAN
-HDIKI------VEVYADENSWENVRNF-EMMSGRAGAQINH-PQLPEQVCNPPCHLTVSNLKGVC-ASCPAITEITRTV--VIV--MWISI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPR---------------------HPVQDIFID-ELYPGH---YHATPKKV--RFC-GPGDNGGMQAIQE
-DVFQVLVCV
-;
-t99                 
-GIVSEVRMIIRDE--SDDAIDEM-C------------LVASMVKALSGCENQARNNRECAI--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGIP-S
-ESSIWMFDRFMYKLTHSMVW--------GDLGQVFPDVSTFSKLKEGAPHVISQ--PYFLGIDMFHDQVFYRGS--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDHGDRQESPHGIEHNMRKSVLLDS---PIGY-L-VIIKNINSMMGRLNHHESRAVFAFPLR---GAENPKQI------------------MEG
-HFDK-EKE------ARPVVQDAPGVPGK----AQWVGRIRAWCSSDVKA-----------SELPRNDAIVPEVGANVYQQVSRMKTNIPIYAHATEYAVG
-I----VKPFYD-NEWKQEAQGQGET-GASIPCVDSPDVQYEMKHAEVKKLMHD-SLYLMHIETCHKPIMGTVKGDRCRATL-KLKMIQLDQ----KTLSQ
--NQKRR--LCQRTWLDASPLQ------MGMKMMLQGKKTPSKK-DYEIAADPVIMYFYQSPIIMRRTDVFEGTNNKKAQAMRV------RSTASQSIGDD
-EMLN--MPLVQNAMCVPSEMVRKCQPD-GQDKRGYTWMAKD-DPLCPQSANVGEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-
-SCNKVLKILVWQLCDSVQDDWQPLTSDPCVNAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMNKIFALEW-EMDMSHRD
-SSSVDDNYI-IEMLPFVCHRVGPWGHYAQQLAD-RLVLTRPHT---LRDIFILA---CPVASGGEQDGNT-ERSQHYI-VYAEL----QDDHKSPISANK
-HMRKMLDWDTGKT-MDREAA-VCREIKLFY-------AETNCWKQNDHSVMFI-VSDAQNRLICGSSIMCRLTFMAMAVNPHFAKLFMEDVCMRYDYSPN
-HDIKI------FEVYADENSWENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNDVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGR---YHATPKKN--RYC-GPGDNGGMQPIQE
-DMFQVLVCV
-;
-t40                 
-GIVSECRMIIRDE--SDDAIDEV-C------------LVASMVKALSGCENQARNNRECAI--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGIP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLGRVYPDNPTFSKLKEGAPHVISH--PYFLGIDMFHDQVFYRGS--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDHGDRQESPHGIEHNMRKSVLLDS---SIGY-I-VIIKNLNSMMGRLNHHESRAVVTFPLR---GAEDPKQI------------------MEG
-HFDK-E-E------ARPVVQDAPGVPGK----AQWVGRVRAWCSSEIKT-----------SELPRNDAIVVEVGANVYQQISRMKTDIPIYAHATEYAVG
-I----VKPVYD-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRATL-KLKMIQLDQ----KTLSQ
--NQKKR--LCQCTWLDACPLQ------MGMKIMLQGKKTPSKK-DYEIAADPVIMYFYQSPIIMRRTDVFEGTNNKKAQAMRI------RSTASQSIGDD
-EMLN--MPQVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANVGEK---YAEPHQIRN-----------------KVSTNVIKLLYCKDC-
-SCNKVLKILVWQLCDSV-DDWQTLTSDPCVSAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALEW-EMDMSHRN
--SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRNIFILA---CPVASGGEQDENT-ERSQHYI-VYAEL----QNDHKSPIHANK
-VMNKMLDWDTGKT-MDREAA-MCREIKLFV-------AETNVWKQNDHSVMFIVISDAQNRLICGSSIMCRLTFMAMAVNPHFAKLFMEESCVRYDYSAN
-HDIKI------FEVYANENSWENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASVPAITEITRTV--VIC--MYISI-LRNNVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YQATPKKD--KFC-GPGDNGGMQTIQE
-DMFQVLVCV
-;
-t90                 
-GIVSECRMIIRDE--SDDAIDEV-C------------LVASMVKALSGCENQARNNRECAI--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGIP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLGRVYPDNPTFSKLKEGAPHVISH--PYFLGIDMFHDQVFYRGS--LTLPDPRYELSMSVMYAQHHSFSQ
-KRCLNALDHGDRQESPHGIEHNMRKSVLLDS---PIGY-I-VIIKNVNSMMGRLNHHESRAVVTFPLR---GAEDPKQI------------------MEG
-HFDK-E-E------ARPVVQDAPGVPGK----AQWVGRVRAWCSSEIKT-----------SELPRNDAIVPEVGANVYQQISRMKTDIPIYAHATEYAVG
-I----VKPVYD-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLMHLETCHKPIMGTVKGDRCRATL-KLKMIQLDQ----KTLSQ
--NQKKR--LCQCTWLDACPLQ------LGMKIMLQGKKTPSKK-DYEIAADPVIMYFYQSPIIMRRTDVFEGTNNKKAQAMRV------RSTASQSIGDD
-EMLN--MPLVQNAMCVSSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQSANQGEK---YAEPHQIRN-----------------KVSTNVIKLLYCKDC-
-SCNKVLKILVWQLCDSV-DDWQTLTSDPCVSAEPNPPVCVWQRELVPQL---NRNVEDLARIIYFGPDEH-------DEGKMMRKIFALEW-EMDMSHRN
--SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRNIFILA---CPVASGGEQDENT-ERSQHYI-VYAEL----QNDHKSPINANK
-VMNKMLDWDTGKT-MDREAA-MCREIKLFV-------AETNVWKQNDHSVMFIVISDAQNRLICGSSIMCGLTFMAMAVNPHFAKLFMEESCVRYDYSRN
-HDIKI------FEVYANENSWENVRNF-EMMSGRAGAQINH-PQLPEQVC-PPCHLTVSNLKGVC-ASVPAITEITRTV--VIC--MYISI-LRNNVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKD--KFC-GPGDNGGMQTIQE
-DMFQVLVCV
-;
-t4                  
-GIVSECRMIIRDE--PDDAIDEV-C------------LVASMVKELSGCENQARNNRECAI--SPPFIGV---RELFKR-YG-CMEGIGCVNTVAGMP-S
-ESSVWMFDRFMYKLTHSMVW--------GDLGRVFPDNATFSKLKEGAPHVISV--PYFLGIDMFHDQVFYRGS--LTLPDPRYEMSMSVMYAQHHSFSQ
-KRCLNALDYGDRQESPHGIEHNMRKNVLLDN---PIGH-L-VIIKNENSMMGRLNHHESRAVVTFPLR---GAEDPKQK------------------MEG
-SFDK-E-E------ARPVVQDAPGVPGR----AQWVGRVRPWCSSDVKA-----------SELPRNDAIWPEVGANVYQQISRMKTNIPIYPHVTEYAVG
-I----VKPFYL-NEWKQEAQGQGEA-GASIPCVDSPDVQYELKHAEVKKLMHD-SLYLWHLETCVKPIMGTVKGDRCRATL-KLKMIVLDP----KTLSQ
--NQKRR--LCQRTWLDASPLQ------VGMKIMLQGKKTPSKK-DYEIAADPVIMYFYQSPIIMRHTDVFEGTNNKKAQAMRL------RSTASQSIGDD
-EMLN--MPLIQNAMCVQSEMVRKCQPD-GQDKRGYTWMAKD-DTLCPQLHNQAEK---YAEPHQIRN-----------------KVSVNVIKLLYCKDC-
-SCNKVLKILVWQLCESV-DDWQTLTSDPCISAEPNPPVCVWQRELVPQL---NRNIEDLARIIYFGPDEH-------DEGKMMGKIFALEW-EHDMSHRD
--SSVDDNYV-IEMLPFMCHRVGPWGHYAQQLAD-RLVLTRPHT---LRDIFILA---CPVASGGEQDAVT-ERSQHYI-VYAEL----QNDHKSPISASK
-HMNKMLDWDTGKT-MDREAA-MCREIKLFY-------AETNVWKQNDHSVMFI-ISDAQNRLICGSSIMCGLTFMATACNPHFAKLFMEEVCMRYDYAAN
-HDIKI------SEVYAEENSWENVRNF-EMMSGRAGAQINH-PQLPEQVV-PPCHLTVSNLKGVC-ASCPAITEITRTV--VIC--MYVSI-LRNVVMQY
-VFYYKENRSVR-----------QNNTGKAELPK---------------------HHMQDIFID-ELYPGH---YHATPKKN--RCC-GPGDNGGMQTVQE
-DMFQVLVCV
-;
-t36                 
-MIWSEVRKMVRER--REQAIDNK-C------------LIAARVKMMSGYVLQVRNALEDAL--YVFFTGTKGTRELVKY-YM-CMEGHGCVNTMAKKS-S
-QSGIWKFNAFMC-LMHLMEG--------GDL--------------------CSY--PSFLGMCMFHAMVQSKGD--LVLPDSPNEDSVSFMYIQHHSFHE
-KRCLNPLNVGDREDSEHIKEKHMRI----YA---NIGG-H-IIIREWNDVMGRLNHIEPGAEVIFPLRK--RGQHSKPV------------------IDG
-FFAK-D-E------DRPGIQNAVSVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYRINRKVGANAYDQDSRMKAAAPVYPHIMEYAHG
-M----FNPFYGLSEPKNNAQGNGEN-PMNKPCVESEDCQYEKKHASMDKLMHQ-SLYLMHINIMSKPAMGEWVGNRCRNELTALRIIQLDVGVSGKTLGQ
--NIGVSKLLNDRTWLATSPLE------IGCGVMSVEKKEASPK-EFEVAADPTVIYFYRNLIIQKITDVLSAVRMESPQEMRT------QDVNSSSLGDN
-NGQA--MNIVPYWVCVASGVVRKTHKD-SVDKRGQTWTAKS-DFLCPLAVDQGEP---GAEQKPAVGEENPICKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLYADSCPIA-VNAAVCGWKRELVPGL---NHSCEHLAKSVYFEPDGE-------GEGKVMLKIFGLDWCEVERSHEH
--SSVDDNYN-VNMLPFQNSRKDPVGHYVQDLED-ARRLIRPGT---ARSLTILF-YGCQYYSGEFQDCEI-ERSQLYN-VYCEH----KQDHKSAIIANK
-QEQKGMDWNTGKE-MEQGPK-IILHGSLFF-------AEPNIVRQPGVSHIFI-GNDARRVLICGKSMMPGHRFMREACVPFFHKLFMAVNQMRYDYMMN
-YDIKIYETHWRMGVYALDNSWETLNVS-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIKIY--MWGTINFKNRVMQY
-CNYYKENRSVR-----------INNTGLAELPK---------------------YHHQNILID-ELYSNV---YPAAPKKH--QYM-GVGDVGGYEVICE
-NLFQILVVE
-;
-t87                 
-MIWSEVRKMVRER--REQAIDNK-C------------LIAARVKMMSGYMLQVRNALEDAL--YVFFTGNKGTRELVKY-YM-CMEGHGCVNTMAKKS-S
-QSGIWKFNAFMC-LMHLMEG--------GDL--------------------CSY--PSFLGMCMFHAMVQSKGD--LVLPDSPNEDSVSFMYIQHHSFHE
-KRCLNPLNVGDREDSDHVKEKHMRI----YA---NIGG-H-IIIREWNDVMGRLNHIEPGAEVIFPLRK--RGQHSKPV------------------IDG
-FFAK-D-E------DRPGIQNAMSVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYRINRKVGANAYDQDSRMKAAAPVYPHIMEYAHG
-M----FNPFYGLSEPKNNAQGNGEN-PMNKPCVESEDCQYEKKHASMDKLMHQ-SLYLMHINVMSKPAMGEWVGNRCRNDLTALRIIQLDVGHSGKTLGQ
--NIGVSKLLNDRTWLATSPLE------IGCLVMSVEKKEASGK-EFEVAADPTVIYFYRNLIIAKITDVLSAVRMESPQEMRE------QDVNSSSLGDN
-NGQA--MNIVPYWVCVGSGVVRKTHKD-SVDKRGQTWTAKS-DFLCPLAMDQGEI---GAEQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLYADSCPIA-INAAVCGWKRELVPGL---NHSCEHLAKSVYFEPDGE-------GEGKVMLKIFGLDWCEVERSHEH
--SSVDDNYN-VNMLPFQNSRKDPVGHYVQDLED-ARRLIRPGT---ARSLTILF-YGCQYYSGEFQDCEI-ERSQLYN-VYCEH----KQDHKSAIIANK
-QEQKGMDWNTGKE-MEQGPK-VILHGTLFF-------AESNIVRQPGVSHIFI-GNDARRVLICGLSMMPGHRFMREACVPFFHKLFMAVNQMRYDYMVN
-YDIKIYETHWRMGVYALDNSWETLNVS-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIKIY--MWGTICFKNRVMQY
-CNYYKENRSVR-----------INNTGLAELPK---------------------YHHQNILID-ELYSNV---YPAAPKKH--QYM-GVGDVGGYEMICE
-NLFQILVVE
-;
-t89                 
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-S
-QSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSY--PSFLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHE
-KRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIMEYAHG
-M----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVGVRCRNELTALRIVQLDVGHSGKTLGQ
--NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AAEQRPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLEWCEVERSHEH
--SSIDDNYT-VNMLEFPNSRKDPVGHYVQNLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-VYCEL----KQDHKSAIIANK
-QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFT-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYVTN
-YDIKIYETHWRVGVYAIDNSWETLNVS-EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQY
-CNYYKENRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNNI---YPAAPKKH--KFL-GVGDVGGYEIICE
-NLFQILVVE
-;
-t39                 
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-S
-QSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSY--PSFLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHE
-KRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIMEYAHG
-M----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVGVRCRNELTALRIVQLDVGHSGKTLGQ
--NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AAEQRPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLEWCEVERSHEH
--SSIDDNYT-VNMLEFPNSRKDPVGHYVQNLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-VYCEL----KQDHKSAIIANK
-QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFT-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYVTN
-YDIKIYETHWRVGVYAIDNSWETLNVS-EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQY
-CNYYKENRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNNI---YPAAPKKH--KFL-GVGDVGGYEIICE
-NLFQILVVE
-;
-t8                  
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-S
-QSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSY--PSFLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHE
-KRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKINRKVGANAYDQVSRMKAAAPVYPHIMEYAHG
-M----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHVNIMSKPAMGEWVGVRCRNELTALRIVQLDVGHSGKTLGQ
--NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AAEQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLEWCEVERSHEH
--SSIDDNYT-VNMLPFPNSRKDPVGHYVQDLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-VYCEL----KQDHKSAIIANK
-QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFT-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAANQMRYDYVTN
-YDIKIYETHWRVGVYAIDNSWETLNVS-EMTSGRMGAKINHLPRLPEHVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQY
-CNYYKENRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNDI---YPAAPKKH--KFL-GVGDVGGYEIICE
-NLFQILVVE
-;
-t6                  
-MIWSEHRKMVREG--REQAIDNK-C------------LIAKRVKVMSGYILQVRNAPEDAL--YNFFTGHKGTRELVKY-YM-CMEGEGVVNTMAKKS-S
-QSGIWKFNAFMC-LMRLMQG--------GDL--------------------CSH--PSFLGMCMFYAMVQSKGD--LVLPDSCNEDSVSFMYIQHHSFHE
-KRCLNPLNVGDREDSDHTKEKHMRI----YA---NIGG-H-IIIREWNDVMGRLNVIEPEAEVIFPLRK--RGQHSKPV------------------IDG
-FFAK-D-E------ERPGIQNAMNVPCG----DQWVGSIRGWCSSQHRYGLANHILVHEPSKLHKTYKVVRKVGANAYDQVSRMKAAAPVYPHIMEYAHG
-M----FNPFYGLSEPKNNAQGNGEN-PMNVPCVESEDCQYEKKHASMTKLMHQ-SLYLMHINIMSKPAMGEWVGVRCRNELTALRIVQLDVGHSGKTLGQ
--NIGVSKLLNDRTWLATSPLE------IGCGVISVEKKEASPK-EFEVAADPTVIYFYRSLIIVHITDVLSAVRMDSPQEMRN------QDVNSPSLGDN
-NGQA--MNIVPYWVCVASGVVRKMHKD-SVEKRGQTWEAKS-DFLCPLAVDQGEP---AAEQKPAVGEKNPICKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLFPDSCPFA-LNAAVCGWKRELVPGL---NHSCEHLAKGVYFEPDGE-------DEGKMMLKIFGLEWCEVERSHER
--SSIDDNYT-VNMLPFPNSRKDPVGHYVQDLED-AIRLIRPGT---ARSLTILL-YGCQYYSGEFQDCEV-ERSQCYN-IYCEL----KQDHKSAIIANK
-QEQKGMDWNTGKE-MEQGPK-IILHGCLFF-------AEPNIVRQPGVSHIFI-ENDARRMLICGNSMMPRHRFMREACVPFFHKLFMAVNQMRYDYMTN
-YDIKIYETHWRVGVYAIDNSWETLNVS-EMTSGRMGAKINHLPRLPEQVI-PPCMLTVSGLKDTM-AGMKQETEITKTPDIEIY--MWGTINFKNQVMQY
-CNYYKENRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYNNI---YPAAPKKH--KFL-GVGDVGGYEIICE
-NLFQILVVE
-;
-t58                 
-MIWSEYRHMVREG--RDQAIDNK-C------------LIAARVKVMSGYVLQVRNAPEDAL--YNFFTGHKGTRELVKY-YM-CMEGEGCVNTMAKKS-S
-QSGIWKFNAFMC-LMHLMQG--------GDL--------------------CSH--PSFLGMCMFHAMVKSKGN--LVLPDSCNEDSVSFMYIQHHSFHE
-KRCLNHLNVGDREDSEHIKEKHMRV----YA---SIGG-H-IIIREWNDVMGRLNHIEPGAEVTFPLRR--RGQASKPV------------------IDG
-FFAK-D-E------DRPGIQNAMSVPCG----DQWVGSVRGWCSSQHRYGLAIHILVHQQSRLHKTYNIDRKNGANAYEQDSRMKAGAPVYPHIMEYAHG
-M----FNPFYGMSEPKNNAQGNGEN-PMNVPCVESDDCQYEKKHASMDKQMHQ-SLYLMHMNIMSKPAMGEWVGNRCRNELTALHVVQLDVGFSGKTLGQ
--NIGISELLNDRTWLATSPLE------IGCGVMAVEKKEASPK-EFEVAADPTVIYFYRNLIIQHITDVLSAVRMDSPQEMRV------QDVNSPSLGDN
-NGQA--MNIVPYWVCVVSGVVRKTHKD-SVEKRGQTWTAKS-DFLCPIAVNQGEP---GAEQKPAVGA-NPIVKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLFADSCPTA-VNAAVCAWKRELVPGL---NHSCEHLAKSVYFEPDGE-------DEGKMMLKIFGLDWCEVERSHEH
--SSVDDNYN-VNMLPFPNSRQDPVGHYVQDLED-LLRLIRPGT---ARSLTVLF-YGCQYYSGQFQDCEI-ERSQLYN-VYCEL----KQDHKSAIMANK
-QEQKGMDWNTGKE-MEQGPK-IILHGVLFF-------AEPNVVRQPGVSHIFV-GNDARRMLICGLSMMPGHRFMKEACVPFFHKLFMAVRRMRYDYMSN
-YDIKIYETHWRPGVYALDNSWETLNVS-EMTSGRIGAKINHLPRLPETVI-PPCVLTVSGLKDTM-AGMKHGTEITKTPDIKIH--MWGTINFKNKVMQY
-CTYYKENRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYSNI---YPATPKKH--QYM-GVGDVGGYEVICE
-NLFQILVVE
-;
-t54                 
-MIWSEYRHMVREG--RDQAIDNK-C------------LIAARVKVMSGYVLQVRNAPEDAL--YNFFTGHKGTRELVKY-YM-CMEGEGCVHTMAKKS-S
-QSGIWKFNAFMC-LMHLMQG--------GDL--------------------CSH--PSFLGMCMFHAMVQSKGN--LVLPDSCNEDSVSFMYIQHHSFHE
-KRCLNHLNVGDREDSEHIKEKHMRI----YA---SIGG-H-IIIREWNEVMGRLNHIEVGAEVTFPLRR--RGQASKPV------------------IDG
-FFAK-D-E------DRPGIQNAMSVPCG----EQWVGSVRGWCSSQHRYGLAIHILVHQQSRLHKTYNIDRKNGANAYDQDSRMKAGAPVYPHIMEYAHG
-M----FVPFYGMSEPKNNAQGNGEN-PMNVPCVESDDCQYEKKHASMDKQMHQ-SLYLMHMNIMSKPAMGEWVGNRCRNELTALHIVQLDVGFSGKTLGQ
--NIGISELLNDRTWLATSPLE------IGCGVMAVEKKEASPK-EFEVAADPTVIYFYRNLIIQHITDVLSAVRMDSPQEMRV------QDVNSPSLGDN
-NGQA--MNIVPYWVCVVSGVVRKTHKD-SVEKRGQTWTAKS-DFLCPIAVNQGEP---GAEQKPAVGA-DPIVKPWQFVIMNTTTFAKNIFRLLYVKDV-
-SCNGVLPLLKWQLCDSH-GDWQSLFADSCPIA-VNAAVCAWKRELVPGL---NHSCEHLAKSVYFEPDGE-------DEGKMMLKIFGLDWCEVERSHEH
--SSVDDNYN-VNMLPFPNSRKDPVGHYVQDLED-LLRLIRPGT---ARSLTVLF-YGCQYYSGEFQDCEI-ERSQLYN-VYCEL----KQDHKSAIMANK
-QEQKGMDWNTGKE-MEQGPK-IILHGVLFF-------AEPNVVRQPGVSHIFV-GNDARRMLICGLSMMPGHRFMKEACVPFFHKLFMAVRRMRYDYMTN
-YDIKIYETHWRPGVYALDNSWETLNVS-EMTSGRIGAKINHLPRLPETVI-PPCVLTVSGLKDTM-AGMKHGTEITKTPDIKIH--MWGTINFKNKVMQY
-CTYYKENRSVR-----------INNTGGAELPK---------------------YHHQNILID-ELYSNI---YPATPKKH--QYM-GVGDVGGYEVICE
-NLFQILVVE
-;
-t65                 
-MIWSEYRQMVREG--NDQSIDNK-C------------LIADRVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNS--PSFLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGK-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRK--GGQDSKPF------------------IDG
-FF------------DRPGIANAMSVKCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECQYEHKHAAMEKLMHH-SLYLMRVNTMSKPVMGDWVGNRCRAELTALQTVQLDVGSSGKTLGQ
--NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-EVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPVLVCIQKVDSVSLGDD
-DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPAAVNEGEH---GAEQRP-FGTQNPVCKPWRFVIMNTQTFAKNIIRLLYIKDI-
-SCNQVLQLLDWQLCDSH-GDWQSLMADSCPNA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEGQMTMKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDYKSAIIANQ
-QEHKGMEWDTGKE-MQQGPK-VVVHLALFYAPSNVLAAEPNIIGQPQVSHVFV-GNDARRMLIVGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYMWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTV-AGAPDETEITKSPVIHIV--MWADIMFKNCVMQY
-CTYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDV---YPAAQKKY--QVM-GVGDIGGYELICE
-DLFQILVCQ
-;
-t29                 
-MIWSEYRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNC--PSFLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLFVGDSQDSQHQREKQLRI----YG---RIGK-V-VIIKVWNAAMGRLNHVEPPAEVMFPLRR--GGSDSKPF------------------LDG
-FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILIHGPSKLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIMEYAHG
-M----VKPFYGQSEPKNEAQGNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMPKPVMGDWDGNRCRAELTALQTVQLDVGSSGKTLGQ
--NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-EVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPVLVCIQKVDSVSLGDD
-DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGTHNPVCKPWRFVIMHTQTFSKNIIRLLYIKDI-
-SCNQVLQLLDWQLCDSH-GDWQSLMADSCPNA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMSQKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQELEDSALRLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDYKSAIIANQ
-QDHKGMEWDTGKE-MQQGPK-VVVHLALFYMPSNVLAAEPNIIGQPQVSHWFV-GNDARRMLIVGVSMMPAYKFMREACVPFFRKLFMADNQVRYDYMWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTV-AGAPDETEITKSPVIHIV--MWADIMFKNCVMQY
-CTYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDL---YPAAPKKY--QEM-GVGDIGGYELIVE
-DLFQILVCE
-;
-t98                 
-MIWSEHRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTKELVKF-YF-CMEGCGCVNTMAKKS-S
-QSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNS--PPFLGMCMFHPQVQMKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGK-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRR--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHNPSRLHRTYAINKKMGANVYQQSSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAELTALQTVQLDVGSSEKTLGQ
--NIVTSKRLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-EVEVAAD---IYFYRNMVVQRHTDVVAAVRMQSPQEMRNPVLVCIQKVDSASLGDD
-DPQM--MKIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNTQTFSKNIIRLLYIKDI-
-SCNQVLQLLDWQLCDSH-GDWQSLMADSCPPA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMTMKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSEMFERSQLYR-VYCEI----KKDYKSAIIANQ
-QEHKGMEWDTGKE-MQQGPK-IVVHLGLFYMPSNVLAAEPNIIGQPQVSHVFV-ANDARRMLIVGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCDLTVSGLKRTV-AGPPDETEITKSPVIHIV--MWADIVFKNCVMQY
-CTYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNLLTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELIVE
-DLFQILVCE
-;
-t83                 
-MIWSEYRQMVREG--NDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTKELIKF-YF-CMEGCGTVNTMAKDS-S
-QSAPWKFNRFMC-LMHLMQS--------GDL--------------------CNS--PSFLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGK-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRR--GGSCSKPF------------------VDG
-FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILIHNPSRLHRTYAINKKMGANVYQQTSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAELTALQTVQLDLGSSGKTLGQ
--NIVTSKKLGDRTWLAASPLQ------IGCGIMVQEKKIASPQ-EVEVAAD---IYFYRNMVVQRHTDVVAAVRMQSPQEMRNPVLVCIQKVDSISLGDD
-DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGTQNPVCRPWRFVIMNMQTFSKNIIRLLYIKDI-
-SCNQVLQLLDWQLCDSH-GDWQSLMADSCPPA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMTMKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQELED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSDMFERSQLYR-VYCEI----KKDYKSAIIANQ
-QEHKGMEWDTGKE-MQQGPQ-IEVHLALFYMPSNVLPAEPNIIGQPQVSHVFV-GNDARRMLIVGVSLMPAYKFMREACVPFFRKLFMAENQVRYDYMWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPCILTVSGLKRTI-AGAPDETEITKSPVIHIV--MWADIMFKNCVMQY
-CTYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNLLTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELIVE
-DLFQILVCE
-;
-t95                 
-MIWSEYRQMVREG--TDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQL--------GDL--------------------CNP--PSFLGMCMFHPQVRSKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYTGDSQDSQHLREKQLRI----YG---RIGR-V-VILQVWNAVMGRLNHHEPPAEVMFPLRK--GGSNSKPV------------------YDG
-FF------------DRPAIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINRKVGANVYQQTSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECVYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGHRCRAELTELQTVQLDVGSSGKTLGQ
--NIVTSKKLGDRTWLAASPLQ------IGCGVMVQEKKIASPQ-QVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRCRKLVCIQKVDSPSLGDD
-DPQM--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGGQNPACKPWHFVIMNRQTFAKNMIRLLYIKDI-
-SCNEVLQLLDWQLCDSH-GDWQSLIADSCPNA-SNIAVCCWKRELMPGL---NFSCEHLAKTVYFKPDGE-------DEGQMIMKIFNLDWCEVEKSHEK
--SSVDDNYD-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALIILF-YGCQYYSGKFQDSELFERSQLYR-MYCEI----KKDHKSAIIANQ
-QEHKGMEWDTGKE-MQQGPK-VVLHHALFYAPSNVLAAEPNIIGQPQVSHVFV-GNDARRMLITGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWN
-YDIKIYETHYRMGVYAVDNSWETLVYC-EMTSGRIGAKVNHLPRLPEQVT-PPWVLTVSGLKRTV-AGAPDETEITKSPIIHII--MWEEIMFKNCVMQY
-CTYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELICE
-DLFQILVCE
-;
-t20                 
-MIWSEYRQMVREG--TDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELIKF-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQL--------GDL--------------------CNP--PSFLGMCMFHPQVRSKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDSQDSQHLREKQLRI----YG---RIGR-V-VILQVWNAVMGRLNHHEPPAEVMFPLRK--GGSNSKAV------------------YDG
-FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINRKVGANVYQQMSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPSVESGECVYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGHRCRAELTELQTVQLDVGSSGKTLGQ
--NIVTSKKLGDRTWLAAPPLQ------IGCDVMVQEKKIASPQ-QVEVAAD---IYFYRNMVVQRLTDVVAAVRMQSPQEMRTPKLVCIQKVDSPSLGDD
-DPQC--MNIVPYWVCVCSGVVKKAEPD-SVDKRGKTWVAKS-DFLCPPAVNEGEH---GAEQRPVFGGQNPACQPWHFVIMNTQTFAKNMIRLLYIKDI-
-SCNQVLQLLDWQLCDSH-GDWQSLIADSCPNA-VNIAVCCWKRELMPGL---NFSCEHLAKTVYFKPDGE-------DEGQMIMKIFNLDWCEVEKSHEK
--SSVDDNYD-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALIILF-YGCQYYSGKFQDSELFERSQLYR-MYCEI----KKDHKSAIIANQ
-QEHKGMEWDTGKE-MQQGPK-VVLHHALFYAPSNVLAAEPNIIGQPQVSHVFV-GDDARRMLITGVSMMPAYKFMREACVPFFRKLFMAENQVRYDYVWN
-YDIKIYETHYRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVT-PPWVLTVSGLKRTV-AGAPDETEITKSPIIHII--MWEDIMFKNCVMQY
-CTYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QVM-GVGDIGGYELICE
-DLFQILVCE
-;
-t69                 
-MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGHKGTRELVKY-YH-CMEGCGCVNTMAKSS-S
-QSAPWKFNRFMC-LMHLMQE--------GDL--------------------CNS--PGFLGMCMFHPQVQRKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSQHLREKQLRM----YG---EIGK-V-VIIKVVNAVMGRLNHVEPSAEVMFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWVGSIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQISRMKALAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAELTALKTGQLDVGSSGKTLGQ
--NIMTSKKLGDRTWLAANPLQ------IGRGVMVWEKKVASPQ-EVEVAAD---IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDD
-VPQM--MNIVPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAMNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNTETFAKNIIRLLYVKDV-
-SCNQVLQLLDWQLCDSH-GDWQSLVADSCPNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEGQMIVKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHNSAIIANQ
-QEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQVSVVFV-GNDGRRMLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYAWN
-YNIKIYETHFRDGVYAVDNSWETLVYV-EMASGRIGAKINHQPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPIIHIV--MWADIMFKNCVMQY
-CNYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QIM-GVGDIGGYELICE
-DLFQILVCE
-;
-t2                  
-MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELVKY-YH-CMEGCGCVNTMAKSS-S
-QSAPWKFNRFMC-LMYLMQD--------GDL--------------------CNS--PGFLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSQHLREKQLRM----YG---EIGK-V-VIIKVVNAVMGRLNHHEPSAEVMFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWMGSIKGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQISRMKALAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAELTALKTGQLDVGSSGKTLGQ
--NIMVSKKLGDRTWLAASPLQ------IGCGVMVWEKKVPSPQ-EVEVAAD---IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDD
-VPQM--MNIVPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAMNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNVETFAKNIIRLLYVKDV-
-SCNQVLQLLDWQLCDSH-GDWQSMVADSCHNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEGQMMVKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHNSAIIANQ
-QEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQVSVVFV-GNDARRMLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYNWN
-YNIKIYETHFRVGVYAVDNSWETLVYV-EMASGRIGAKINHMPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPIIHIV--MWADIMFKNCVMQY
-CNYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QIM-GVGDIGGYELICE
-DLFQILVCE
-;
-t10                 
-MIWSDYRQMVREG--GDDSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YNFFTGQKGTRELVKY-YH-CMEGCGCVNTMAKSS-S
-QSAPWKFNRFMC-LMYLMQD--------GDL--------------------CNS--PGFLGMCMFHPQVQAKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSQHLREKQLRM----YG---EIGK-V-VIIKVVNAVMGRLNHHEPSAEVMFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWMGSIKGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQISRMKALAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQGNGEN-PMNVPCVESGECQYENKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAELTALKTGQLDVGSSGKTLGQ
--NIMVSKKLGDRTWLAASPLQ------IGCGVMVWEKKVPSPQ-EVEVAAD---IYFYRNMVIECLTDVVRAVRMQSPQEMRAPVLVCIQKVDSPSLGDD
-VPQM--MNIVPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAMNEGEH---GAEQRPVFGTQNPVCKPWRFVIMNVETFAKNIIRLLYVKDV-
-SCNQVLQLLDWQLCDSH-GDWQSMVADSCHNA-VNIAVCCWKRELMPGL---NHSCQHLAKTVYFKPDGE-------DEGQMMVKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFMQSHGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHNSAIIANQ
-QEHKGMDWDTGKE-MQQGPK-IVVVLALFYQPSNVLAAEPNIMGQPQVSVVFV-GNDARRMLIVGCSMMPDYKFMREACVPFFRKLFMAEVQDRYDYNWN
-YNIKIYETHFRVGVYAVDNSWETLVYV-EMASGRIGAKINHMPRLPEQVI-PPCILTVSGLKRTI-ADEPDETEITKTPIIHIV--MWADIMFKNCVMQY
-CNYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDI---YPAAPKKY--QIM-GVGDIGGYELICE
-DLFQILVCE
-;
-t31                 
-MIWSEYRSMVREG--ADQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKQS-S
-QSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNL--PSFLGMCMFHNQVQCKGE--LVLPDNVNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSQHLREKQLRI----YQ---NIGK-V-VIIKVWNANMGRLNHHEPPAEVMFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMNVPCG----DQWVGCIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQTSRMKAAAPIYPHIMEYAHG
-M----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVMGDWVGNRCRAELTALKTVQLDVGSNGKTLGK
--NIMTPKKLGDRTWLAASPLQ------IGCGVMVQEKKVASPQ-EVE-AAD---IFFYRNMVIQRLTDVVAAVRMQSPQEMRPPVLVCIQYVDSPSLGDD
-TPQM--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKA-DFLCPPAVSEGEH---GAEQRPVFGMQNPACKPWRFVIMNTQTFAKNIIRLLYIKDV-
-SCNAVLQLLDWQLCYSH-GDWQSLIADSCPTA-ANIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMIMKIFNLDWCEVEKSHEK
--SSVDDNYH-VNMLPFAQSNRDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIIANQ
-HEVKGMDWNTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIVGQPQVSHVFV-GNDARRMLIVGVSVMPSYKFMREACVPFFHKLFMADNQVRHEYMWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGANINHLPRLPEQVV-PPCILTVSGLKRTI-AGSPDETEITKTLIYHIV--MWADIMFKNCVMQY
-STYYKENRSVR-----------ANNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRVM-GVGDIGGYEMICE
-DLFQILVCE
-;
-t15                 
-MIWSEYRSMVREG--SDQSIDNH-C------------LIAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNS--PSFLGMCMFHNQVPNKGA--LVLPDNVNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSQHLREKQLRI----YP---SIGK-V-VIIKVWNAAMGRLNHHEPPAEVMFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWVGCIRGWCSSQHQYGLANHILVHGPSKLHRTYAINRKMGANVYQQTSRMKAAAPLYPHIMEYAHG
-M----VEPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPVLGDWVGNRCRAELTALKTVQLDIGNSGKTLGQ
--NIMTPKRLGERTWLAASPLQ------IGCGVVVQEKKVASPQ-EVEVAAD---IYFYRNMVIQTLTDVVAAVRMQSPQEMRPPVLVCIQDVDSVSLGDD
-TPQM--MNIAPYWVCVCSGVVKKTQPD-SVDKRGKTWVAKS-DFLCPPAVSEGEH---GAEQRPVFGMRNPICKPWRFVIMNTQTFAKNIIRLLYVKDV-
-SCNAVLQLLDWQLCYSH-GDWQSLIADSCSTA-ANIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMIVKIFHLDWCEVEKSHEK
--SSVDDNYH-VNMLPFAQSNGDPVGHYVQGLED-ALRLIRPGT---ARALVILS-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIVANQ
-QEVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIVGQPQVSHVFV-GNDARRMLIVGVSVMPAYKFMREACVPFFHKLFMAENQVRHDYMWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQY
-STYYKENRSVR-----------GNNTGGAELPK---------------------YHQQNILTD-ELYSDV---YPTAPKKYVIRVM-GVGDIGGYELICE
-DLFQILVCQ
-;
-t63                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKLMSGVVRQVRNAPEDAL--YTFFTGQKGKRELIKY-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQD--------GDL--------------------CNS--PSFLGMCMFHNQVSFKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDEQDSSHLREKQLRL----YA---RIGK-V-VIIKVWNAVMGRLNHHEPPAAVMFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWMGIIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVGSRCRAELTALKTVQLDVGSSGKTLGQ
--NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVASPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDD
-TPQK--MNIAPYWVCVCSGVVKKAQLD-SVEKRGKTWVAKS-DFLCPPAVSEGEH---GPEQRPVFGVQNPVCKPWRFVIMNTQTFAANIIRLLYVKDV-
-SCNAVLQLLDWQLCYSH-EDWQSLIADACPTA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEGQMFMKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFVQSNGDPVGHYVQGLED-ALLLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIIANQ
-QGVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIIGQPQVSHVFV-DNDARRMLIVGQSVMPPYKFMREACVPFFHKLFMAENQVRHDYVWN
-YDIKIYETHFRMGVYAIDNSWETLVYC-EMTSGRIGAKINHQPRLPEQVV-PPCVLTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQY
-STYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQM-GMGDIGGYELICE
-DLFQILVCE
-;
-t50                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKLMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNHFMC-LMHLMQN--------GDL--------------------CNS--PSFLGMCMFHNQVSVKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSSHLREKQLRL----YA---RIGK-V-VIIKVWNAVMGRLNHHEPPAEVMFPLRK--CGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWMGVIRGWCSSQHQYGLANHVLVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVGSRCRAELTALKTVQLDVGSSGKTLGQ
--NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVASPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDD
-TPQK--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAVSEGEH---GPEQRPVFGVQNPVCKPWRFVIMNTQT-AKNIIRLLYVKDV-
-SCNAVLQLLDWQLCYSH-GDWQSLIADACSTA-VNIAVCCWKRELMPGL---NHSVEHLAKSVYFKPDGE-------DEGQMIMKIFNLDWCEVEKSHEK
--SSVDDNYN-VNMLPFVQSNGDPVGHYVQGLED-ALLLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIMANQ
-QGVKGMDWDTGKE-MQQGPK-IVMHLALFYAPSNVLAAEPNIIGQPQVSHVFV-DNDARRMLIVGQSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHQPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQY
-STYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQM-GMGDIGGYELICE
-DLFQILVCE
-;
-t25                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LTAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNS--PSFLGMCMFVNQVSFKGE--LVLPDNPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSSHLREKQLRL----YA---RIGK-V-VIIKVWNAVMGRLNHHEPPAEVVFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWMGVIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRANTMSKPVMGDWVGSRCRAELTALKIVQLDVGSSGKTLGQ
--NIMTPKKLGDRTWLAASPLQ------IGCDVMVQEKKVASPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRLPVLVCIQDVDSPSLGDD
-TPQK--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAVSEGEH---GPEQRPVFGMQNPVCKPWRFVIMNTQTFAKNIIRLLYVKDV-
-SCNAVLQLLDWQLCYSH-GDWQSLIADACPTA-VNIAVCCWKRELMPGL---NHSCEHLAKSVYFKPDGE-------DEGQMIMKIFNLDWCEVEKSHEK
--SSVDDNYD-VNMLPFVQSNGDPVGHYVQGLED-ALLLIRPGT---ARALVILF-YGCQYYSGKFQDSELFERSQLYR-VYCEI----KKDHKSTIIANQ
-QGVKGMDWDTGKE-MQQGPK-IVVHLTLFYAPSNVLAAEPNIFGQPQVSHVFV-DNDARRMLIVGQSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWN
-YDIKIYETHFRMGVYAVDNSWEALVYC-EMTSGRTGAKINHQPRLPEQVV-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQY
-STYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIRQM-GMGDIGGYELICE
-DLFQILVCE
-;
-t51                 
-MIWSEYRSMVREG--SDQSIDNK-C------------LIAARVKMMSGVVRQVRNAPEDAL--YTFFTGQKGTRELIKY-YF-CMEGCGCVNTMAKNS-S
-QSAPWKFNRFMC-LMHLMQN--------GDL--------------------CNS--PSFLGMCMFHVQVQFKGE--LVLPDHPNENSVEFMYRRHHSLSD
-KRCLNLLYVGDNQDSQHLREKQLRI----YA---RIGK-V-VIIKVWNAVMGRLNHHEPPAEVVFPLRK--GGSDSKPF------------------IDG
-FF------------DRPGIANAMSVPCG----DQWVGVIRGWCSSQHQYGLANHILVHGPSKLHRTYAINKKMGANVYQQDSRMKAAAPLYPHIMEYAHG
-M----VKPFYGISEPKNEAQKNGEN-PMNVPCVESGECQYESKHAAMEKLMHQ-SLYLMRVNTMSKPIMGDWVGNRCRADLTALKTVQLDVGSSGKTLGQ
--NIMTPKNLGDKTWLAASPLQ------IGCGIMVQEKKVASPQ-EVEVAAD---IYFYRNMVIQRLTDVVAAVRMQSPQEMRPPVLVCIQDVDSPSLGDD
-TPQM--MNIAPYWVCVCSGVVKKAQPD-SVDKRGKTWVAKS-DFLCPPAISEGEH---GAEQRPVFGMQNPVCRPWRFVIMNTQTFAKNVIRLLYVKDV-
-SCNKVLQLLDWQLCYSH-GDWQSLIADACPAA-VNIAVCCWKRELMPGL---NHSCEHLAKTVYFKPDGE-------DEGQMIMKIFGLDWCEVEKSHEE
--SSVDDNYN-VNMLPFVSSNGDPVGHYVQGLED-ALRLIRPGT---ARALVILF-YGCQFYSGKFQDSELFERSQLYR-VYCEI----KKDHKSAIIANQ
-QGVKGMDWDTGKE-MQQGPK-IVVHLALFYAPSNVLAAEPNIIGQPQVSHVFV-DNDIRRMLIVGVSVMPAYKFMREACVPFFHKLFMAENQVRHDYVWN
-YDIKIYETHFRMGVYAVDNSWETLVYC-EMTSGRIGAKINHLPRLPEQVF-PPCILTVSGLKRTI-AGAPDETEITKTLIYHIV--MWADIMFKNCVMQY
-ATYYKENRSVR-----------VNNTGGAELPK---------------------YHQQNILTD-ELYSDM---YPAAPKKYVIREM-GVGDIGGYELICE
-DLFQILVCE
-;
-t9                  
-MIWSECRQMVREK--TDNAIDNQ-C------------LIAARVKENSGHVKQVRNDSEDIL--YNHFTGKKGARELIKR-YV-CMEGHDCVNTVANVS-S
-QSAIWKFDRFMCDLMHLMQN--------GDL--------------------CSY--PSFLPMCMFVPQVLSKGE--LVLPDSSNEESISFVYLQHHSFSV
-KRCLNYLNVGDSADSKHLKEKHLRA----EGMPGNIGK-H-VIINVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------IDG
-FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHDPSSLHRTFAINRKMGANVYQQTSRMKASAPFYPHCMEYAHG
-V----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIDCQYENKHATMTKLMHH-SLYLMRMHTMSKPIMGDVNGNRCRADLTALKMLQLDIGFSAKTLGQ
--NVVVPHLLGHRTWLATSPLQ------IGCGVMIFGNKIGSAN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDD
-DNQA--MVILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKV-DFLCPPAFNQGEH---RAEQKPASKFEHPVCGPWEFVIVNYQTSAKDIILLLYIKDV-
-GCNCVLELLNWQLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMVLKIFGLDWCEMEKSHQR
--SGVDDNYQ-VNMLPFNHSKNNPVGHYVQGLED-ALNLIRPGT---ARALNILF-YGCEVYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIIAHK
-YEHKGMDWDTGKE-AQQGPE-VVHHNLLFF-------AEPNIHGQPGVGHIFV-GNDARRKLIAGVSFMSMVKFMCEACVPFFRKLFMAVGQMRYDYVNN
-YDIKIWETVFRGGVYAIENSWETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETK-AGLIDGTEITKTPDIGIC--MWETIHFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAALPK---------------------YHHQNTLVD-ELYSDV---YPAAPKKK--VCM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t47                 
-MIWSECRQMVREK--SDNAIDNQ-C------------QIAARVKRNSGHVKQVRNDSEDIL-CYHHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-S
-QSAVWNFDRFMCDLMHLMQN--------GDL--------------------CSY--PSFLPMCMFVSQVLSKGE--LVLPDSSNEESISFVYLQHHSFSD
-KRCLNYLNVGDNSDSKHLKEKHLRA----QGMPGNIGK-H-VIINVWNAVMGRLNHHESPAEVVFPLRQ--GGPDSKPM------------------IDG
-FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHDPSNLHRTFAINRKMGANVYQQASRMKASAPFYHHCMEYAHG
-V----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESRDCQYENKHATMTKLMHQ-SLYLMRMHTMSKPIMGHVNGNRCRADLTALKMLQLDIGFSAKTLCQ
--NIVVAHLLGHRTWLATSPLQ------IGCMVMIFGNKIGSAN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRE------QDVDSHSLGDD
-DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKM-DFLCPPAFNQGEH---RAEQKPALKFKHPVCGPWEFVIVNYQTSAKDIILLLYIKDV-
-GCNCVLELLKWQLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCDRLAKHIYFQPDGE-------DEGKMILKIFGLDWCEMEKSHQR
--SGVDDNVQ-VNMLPFNHSKHNPVGHYVQGLED-ELNLIRPGT---ARALNILF-YGCEYYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIMACK
-YRHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIQGQPGVGHIFV-GNDARRKLIAGLSFMAMMKFMCEACVPFFRKLFMAVGHMRYDYVSN
-YDIKIWETVFRGGVYAIENSWETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETK-AGIIDGTEITKTPEIGIC--MWDTIEFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNTLVD-ELYSDI---YPAAPKKK--VCM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t60                 
-MIWSECRQMVREK--TDNAIDNQ-C------------QIAARVKENSGHVKQVRNDSEDIL-CYHHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-S
-QSAVWNFDRFMCDLMHLMQN--------GDL--------------------CSV--PSFLPMCMFVSQVLHKGE--LVLPDSSNEESISFVYLQHHSFSD
-KRCLNYLNVGDNADSKHLKEKHLRA----QGMPGNIGK-H-VIINVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------IDG
-FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHNPSNLHRTFAINRKMGANVYQQTSRMKASAPFYHHCMEYAHG
-V----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIDCQYESKHAAMTKLMHQ-SLYLMRIHTMSKPIMGDVNGNRCRADLTALKMLQLDIGFSAKTLGQ
--NIVVPHCLGHRTWLATSPLQ------IGCMVMIFGNKIGSEN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDD
-DNQA--MNILPYVVCVCSGVVRKDHPDTSIHKRGRTWLAKV-DFLCPPAFNQGEH---RAEQKPAFKFKHPVCGPWEFVIVNYQTEAKDIILLLYIKDV-
-GCNCVLELLEWQLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMILKIFGLDWCEMEKSHQR
--SGVDDNYQ-VNMLPFNHSKHNPVGHYVQGLED-ALNLIRPGT---ARALNILF-YGCEYYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIMAYK
-FEHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIQGQPGVGHIFV-GNDARRKLIAGVSFMAVMKFMCEACVPFFRKLFMAVGQMRYDYMNN
-YDIKIWETFFRGGVYAIENSWETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETR-AGIIEGTEITKTPDIGIC--MWDTIHFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNTLVD-ELYSDI---YPAAPKKK--VCM-GVGEVGGYEVMGE
-DLFQILVCE
-;
-t30                 
-MIWSECRQMVREK--TDNAIDNQ-C------------QIAARVKENSGHVKQVRNDSEDIL-CYHHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-S
-QSAVWNFDRFMCDLMHLMQN--------GDL--------------------CSV--PSFLPMCMFVSQVLHKGE--LVLPDSSNEESISFVYLQHHSFSE
-KRCLNYLNVGDNADSRHLKEKHLRA----QGMPGNIGK-H-VIISVWNAVMGRLNHHEPPAEVVFPLRQ--GGPDSKPM------------------MDG
-FFDK-D-D------DRPGIANAMSVPCG----EQWGGPTRGWCSSQQKFGLASHTLSHTPSNLHRTFAINRKMGANVYQQTSRMKASAPFYHHCMEYAHG
-V----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIDCQYENKHATMTKLMHQ-SLYLMRMHTMSKPIMGDVNGNRCRADLTALKMLQLDIGFSAKTLGQ
--NIIVPHCLGHRTWLATSPLQ------IGCMVMIVGNKIGSEN-EFEAAADPTVIYFYRNRIVRRLADVISTVRMNSPQEMRN------QDVDSHSLGDD
-DNQA--MNILPYVVCVCSGVVRKEHPDTSISKRGRTWLAKI-DFLCPPAFNQGEH---RAEQKPAFKFKHPCCGPWEFVIVNYQTSAKDIILLLYIKDV-
-GCNCVLELLKWQLCTSH-GDWQSLVADSCVWA-HNVAVCEWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMILKIFGLDWCEMEKSHQR
--SGVDDNYQ-VNMLPFKHSKHNPVGHYVQGLED-ALNLIRPGT---ARALNILF-YGCEYYSGEFQDSES-ERSWIYN-VYCEI----KKDHKSAIMAYK
-YEHKGMDWDTGKE-AEQGPE-VVHHNLLFF-------AEPNIHGQPGVGHIFV-GNDARRHLIAGVSFMAVVKFMCEACVPFFRKLFMAVGQMRYDYVNN
-YDIKIWETVFRGGVYAIENSWETLVLC-EMTSGRCGAKMNHLPRLFEQVC-PPCILTVSGLKETR-AGIIDGTEITKTPDIGIC--MWDTIHFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHDQNTLVD-ELYSDV---YPAAPKKK--VCM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t70                 
-MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKEDSGHVKQVRNASEDIM--YNHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-S
-QSAVWKFDRFMCDLMHLMQD--------GDL--------------------CSY--PSFLPMCMFVAQVIAKGE--LVLPDSSTEESISFMYLQHHSFSD
-KRCLNYLNVGDNEDSKHAKEKFLRG----DG---GIGQ-H-VIINVWNAVMGRLNHHEPPPEVVFPLRQ--GGPDSKPM------------------VDG
-FFDK-D-D------DRPGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLAFHTLSHDPSKLHRTFAINQKMGANVYQQMSRMKTPAPFYPHVMEYAHG
-V----CKPFYEHSEPKNEAQGNGEKVPMNVPCVESMDCQYENKHAPMAKLMHQDSLYLMRMHTMSKPLMGDVNGNRCRADLTSLKMLQLDIGFCAKTLGQ
--NIVVPKLLGHRTWLATAPLQ------IGCGMMIFGNKIGSTQ-EFEAAADPTVIYFYRNRIVRRMADVISTVRMKSPQEMRG------QDVDSHSLGDD
-DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKI-DFLFPPAFNQGEH---HAEQKPVFGFKHPHCGPWEFVICNYQTVAKDIILLLYIKDV-
-GCNCVLELLAWQLCTSH-GDWQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEGKMILKIFGLDWCEVERSHQR
--SGVDDNYK-VNMLPFSHSKHNPVGHYVQGLGD-ALRLIRPGT---ARALNILF-YGCQYCSGEFQDSEE-ERSWIYN-VYCEI----KKDHKSAILAHK
-YKHKGMDWDTGKE-MEQGPK-VVNYNLLFY-------AEPNIHGQPRVGHIFV-GNDAHRKLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNN
-YDIKIWETAFRGGVYAIENSWETLVLC-EMTSGRSGAKMNHLPRLFEQVC-PPCLLTVSGLKETV-AGIIDGTEITKTPEIGIC--MWDTIHFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHNQNTLVD-ELYSDV---YPAAPKKQ--HYM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t91                 
-MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKEDSGHVKQVRNASEDIM--YNHFTGKKGARELIKR-YI-CMEGHDCVNTMANVS-S
-QSAVWKFDRFMCDLMHLMQD--------GDL--------------------CSY--PSFLPMCMFVAQVIAKGE--LVLPDSSTEESISFMYLQHHSFSD
-KRCLNYLNVGDNEDSKHAKEKFLRG----DG---GIGQ-H-VIINVWNAVMGRLNHHEPPPEVVFPLRQ--GGPDSKPM------------------VDG
-FFDK-D-D------DRPGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLAFHTLSHDPSKLHRTFAINQKMGANVYQQMSRMKTPAPFYPHVMEYAHG
-V----CKPFYEHSEPKNEAQGNGEKVPMNVPCVESMDCQYENKHAPMAKLMHQ-SLYLMRMHTMSKPLMGDVNGNRCRADLTSLKMLQLDIGFCAKTLGQ
--NIVVPKLLGHRTWLATAPLQ------IGCGMMIFGNKIGSTQ-EFEAAADPTVIYFYRNRIVRRMADVISTVRMKSPQEMRG------QDVDSHSLGDD
-DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKI-DFLFPPAFNQGEH---HAEQKPVFGFKHPHCGPWEFVICNYQTVAKDIILLLYIKDV-
-GCNCVLELLAWQLCTSH-GDWQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEGKMILKIFGLDWCEVERSHQR
--SGVDDNYK-VNMLPFSHSKHNPVGHYVQGLGD-ALRLIRPGT---ARALNILF-YGCQYCSGEFQDSEE-ERSWIYN-VYCEI----KKDHKSAILAHK
-YKHKGMDWDTGKE-MEQGPK-VVNYNLLFY-------AEPNIHGQPRVGHIFV-GNDAHRKLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNN
-YDIKIWETAFRGGVYAIENSWETLVLC-EMTSGRSGAKMNHLPRLFEQVC-PPCLLTVSGLKETV-AGIIDGTEITKTPEIGIC--MWDTIHFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHNQNTLVD-ELYSDV---YPAAPKKQ--HYM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t49                 
-MIWSECRQMVREK--NDNAIDNQ-C------------LIAARVKENSGHVKQVRNASEDIM--YNHFTGNKGACELIKG-YV-CMEGHDCVNTMANIS-S
-QSAVWKFDRFMCDLMHLMQD--------GDL--------------------CSY--PSFLPMCMFVAQVIAKGE--LVLPDSSNEESISFMYLQHHSFSD
-KRCLNCLNVGDNEDSKHLKEKFLRA----DG---GIGQ-H-VIINMWNAVMGRLNHHEPPPEVVYPLRQ--GGPNSKPM------------------VDG
-FFDK-D-D------DRPGIANAMNVPCG----DQWGGPIRGWCSSQHRFGLAFHTLKHDPSKLHRTFAINEKMGANVYQQNSRMKASAPFYPHVMEYAHG
-V----CKPFYEHSEPKNDAQGNGDKVPMNVPCVESMDCQYENKHAPMAKLMHQ-SLYLMRMYTMSKPIMGDVNGNRCRAELTSLKMLQLDIGFSAKTLGQ
--NIVPPKLLGHRTWLATSPLQ------IGCGVMIFGNKIGSTQ-EFESAADPTVIYFYRNRIVKRMADVISTVRMKSPQEMRG------QDVDSHSLGDD
-DNQA--MNILPYWVCVCSGVVRKEHPDTSINKRGRTWLAKI-DFLFPPAFNQGEH---HAEQKPVFGFKHPHCGPWEFVICNYQTMAKDIILLLYIKDV-
-GCNCVLELLAWQLCTSH-GDWQSLVADSCIWA-HNVAVCAWKRELVPGL---NHSCEHLAKHIYFQPDGE-------DEGKMIIKIFGLDWCEVEKSHQR
--SGVDDNYK-VNMLPFSHSNHNPVGHYVQGLGD-ALRLIRPGT---ARALNILF-YGCEYYSGEFQDSEE-ERSWIYN-VYCEI----KKDHKSAIMAHK
-YEHKGMDWDTGKE-MEQGPK-VVHHNILFY-------AEPNIHGQPRVGHIFV-GNDAVRNLIAGVSFMSIMKFMCEACVPFFRKLFMAVRQMRYMYMNN
-YDIKIWETAFRGGVYAMENSWETLVLC-EMTSGRVGARMNHLPRLFEQVC-PPCILTVSGLKETV-AGVIDGTEITKTPEIGIC--MWDTIHFKNPVMQY
-CCYYKEPRSVR-----------VNNTGGAELPK---------------------YHNFNALVD-ELYSDV---YPAAPKKK--HYM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t52                 
-MIWSEERQMVREK--VDNAVDNQ-C------------LIAARVKENCGHVKQVRNASEDIL--YNHFTGKKGARELIKR-YI-CMEGHDCVNTMAHDS-S
-QSATWKFDRFMCDLMHLMQG--------GDL--------------------CSY--PSFLPVCMFVAQVINKGE--LVLPDSSNEESISFMYLQHHSFSE
-KRCLNYLNVGDNEDSKHLKEKFLRA----DG---NIGQ-H-VIINMWNAVMGRLNHHEPPAEVNFPLRQ--GGPDSKPM------------------VDG
-FFDK-D-D------DSPGIANAMNVPCG----DQWGGPIRGWCSSQHKFGLASHTLSHDPSKLHRTFGINKNMGANVYQQTSRMKANAPFYPHVMEYAHG
-V----CKPFYEHSEPKNEAQGNGEK-PMNVPCVESIECQYENKHATMAKLMHD-SLYLMRMHTMSKPVMGDVNGHRCRADLTALKMLQLDIGFSAKTLGQ
--NIVAPKLLGVRTWLATSPLQ------IGCGVMIFGNKIGSTQ-EFEAAADPTVIYFYRNRIIRRVADVISTVRMKSPQEMRE------QDVDSHSLGDD
-DNQA--MTILPHWVCVVSGVVRKEHPDTSINKRGSTWLAKV-DFLCPPAFNQGEH---HAEQKPVFGFKHPHVGPWEFVICNYQTSAHDIILLLYIKDV-
-GCNCVLELLVWQLCTSH-GDWQSLVADSCVWA-HNVAVCAWKRELVPGL---NHSCERLAKHIYFQPDGE-------DEGKMILKIFELNWCEVEKSHQH
--SGVDDNYQ-VNMLPFDHCKHNPVGHYVQGLED-ALGLIRPGT---ARALNILF-YGCQYYSGEFQDSEA-ERSWIYN-VYCEI----KKDHKSGIMAHK
-YDHKGVDWDTGKE-MEQGPK-VLHHNLLFY-------AEPNIHGQPTVGHIFV-GNDARRKLIAGVSFMSVVKFMCEACVPFFRKLFMAFRQMRYDYVNN
-YDIKIWETVFRGGVYAIENSWETLILC-EMTSGRCGAKMNHMPRLFEQVC-PPCILTVSGLKETM-AGVIDGTEITKTPDIGIG--MWDSIHFKNPVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNSLVD-ELYSDV---YPAAPKKK--HYM-GVGDVGGYEVMGE
-DLFQILVCE
-;
-t43                 
-MIWSEVRQMVREG--SDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-S
-QSAVWKFDRFMCALMHLMQK--------GDL--------------------CSH--PSFLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIGH-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSK-M------------------VDG
-FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVNFGLANHTLVQ-PSKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAGLTALKVVQLDIGFSSKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGVDVMVMGNKIGSPS-EFEVAADPTIIWFYRNCIVHKLADTVSTAKMKSPQEMRH------QDVDSPSLGDD
-DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---EREQRPVYGFKHPGCRPWQFVIANYQTSAKNIIMLLYVKDV-
-SCNGVLQLLNWHLCDSH-GDWQSLVADSCCWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFLHSRQNPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVIAHK
-HEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLITGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYNVN
-YDIKIWETHIRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCVLTVSGLKQPM-AGYNDQTEITKTPDICIC--TWGTIHFKNFVMQY
-CVYYKENRSVR-----------VNNTGGAELPQ---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t1                  
-MIWSEVRQMMREG--TDNAIDNQ-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-S
-QSAVWKFDRFMCCLMHLMQN--------GDL--------------------CSH--PSFLGMCMFVEQVRCKGE--LVLPDSPNEESLSFVYIQHHSFSD
-KRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIGR-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKPV------------------VDG
-FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAKLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGRHTWLATSPLQ------IGCDMMVMGNKIGSPS-EFEVAADPTIIWFYRDCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDD
-DQQE--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---EAEQRPVYGFVHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFMQSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-VEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLITGVSVMPTYKFMCGACVQFFHKLFMAVRNMRYDYTVN
-YDIKIWETHIRQGVYAVENSWETLITC-EMTSGRIGAKINHLPRLPEQVV-PPCILTVSGLKQPM-AGYNDETQITKTPDICIC--TWGTIHFKNSVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t86                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKPVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-S
-QSAVWKFDRFMCALMHLMQN--------GDL--------------------CSH--PSFLGMCMFHEQVRRKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNCLNVGDNDDSEHLKEKHLRI----YG---QIGR-H-VIINVWNAFMGRLNHHEPPAEAVYPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKMGANVYHQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAGLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPS-EFEVAADPTIIWFYRNCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDD
-DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---GAEQRPVYGFQHPRCRPWQFVIANYQTFAKNIIMLLYVKDV-
-SCNRVLQLLNWQLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFIHSRDNPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYP-VYCEM----KKDHKSAVVAHK
-AEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLITGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVN
-YDIKIWETHIRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNDETQITKTPDICIC--GVGTIHFKNLVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t72                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKVS-S
-QSAVWKFDRFMCALMHLMQN--------GDL--------------------CSH--PSFLGMCMFHEQVRRKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNCLNAGDNDDSEHLKEKHLRT----YG---QIGR-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------HRPGIANAVSVPCA----DQVGGPLRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKIGANVYQQTSRMKADAPVYPHIMEYAHG
-V----YKPFYERSEPKNEAQGNGEK-QGNVPCVESVECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAGLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPS-EFEVAADPTIIWFYRNCIVHKLADTVSTAKMKAPQEMRH------QDVDSPSLGDD
-DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFKQGEH---EAEQRPVYGFQHPRCRPWQFVIANYQSSAKNIIMLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGQMVLKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFIHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-VEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLITGFSIMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVN
-YDIKIWETHIRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPV-AGYNDETQITKTPDICIC--TWGTIHFKNSVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t96                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHVQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-S
-QSAVWKFDRFMCALMHLMQV--------GDL--------------------CSH--PSFLGMCMFHEQVRRKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNCLNVGDNDDSEHLKEKHLRV----YG---QIGR-H-VIINVWNAFMGRLNHHEPPAEVVYPLRK--GGPDSKLM------------------VDG
-FFDK-E-D------ERPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVQ-PSKLHRTFKINKKIGANVYQQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMECQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAGLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGCDVMVIGNKIGSPS-EFEIAADPTIIWFYRNCIVHKLADTVSTAKMKAPQEMRV------QDVDSPSLGDD
-DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFNQGEH---EAEQRPVYGFQHPRCRPWQFVIGNYQTSAKNIIMLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCMWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFIRSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDAEA-ERSWIYD-VYCEM----KKDHKSAVYAHK
-VEHKGMDWDTGKE-MNQGPK-IVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLISGVSVMPTYKFMCGACVPFFHKLFMAVRNMRYDYTVN
-YDVKIWETHIRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNMETQITKTPDICIC--TWGTIHFKNSVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDV---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHG
-;
-t44                 
-MIWSEVRQMVREG--TDNAIDTR-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFSGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-S
-QSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSH--PSFLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNYLNVGDNDDSEHLKEKHLRI----YG---VIGK-H-VIINVWNAFMGRLNHHEPPADVEYPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------DRPGIANAVSVPCG----DQVGGPIRGWCSSQVKFGLANHTLAQNPSKLHRTFKINKKMGANVYQQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYDRSEPKNEAQGNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGYVDGHRCRAGLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGCDIMVMGNKIGSPS-EFEVAADPTIIWFYRNCIVHKLADVVSTAKMKSPQEMRV------QDVDSPSLGDD
-DQQA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKN-DFLCPPAFEQGEH---EAEQCPVHGFKHPRCRPWQFVIADYQTSAKNIIMLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVLKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFMHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCEYYSGQFPDCEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-HEHKGMDWDTGKE-MNQGPK-VVMHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLITGVSVMPTYKFMCNACVPFFHKLFMAVRNMRYDYTVN
-YDIKIWETHMRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGYNDETEITKTPDICIC--TWGTIHFKNSVMQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNMLVD-ELYSDM---YPAAPKKK--VYV-GAGDVGGYEVMSE
-DLFQILVHA
-;
-t45                 
-MIWSEVRQMVREG--TDNAIDNC-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YK-CMEGHDCVNTMAKSS-S
-QSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSV--PSFLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNYLNVGDNDDSEHLKEKHLRI----YG---EIGK-H-VIINVWNAFMGRLNHHEPPAEVMYPLRK--GGPESKPM------------------VDG
-FFDK-E-D------DRPGIANAVSVPCT----DQVGGPIRGWCSSQVKFGLANHTLVHNPSKLHRTFAINKKMGANVYQQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAGLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPA-EFEVAADPTIIWFYRNCIVHKLADLVSTAKMKSPQEMRV------QDVDSPSLGDD
-DQEA--MDILPYWVCVMSGVVRKEQPD-SVNKRGRTWLAKK-DFLVPPAFNQGEH---EAEQKPVYGFDHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVHKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFFHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCQYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-HQHKGMDWDTGKE-MNQGPK-VVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLIPGVSVMHDYKFMCGACVPFFHKLFMAVRNMRYDYTVN
-YDIKIWETHLRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGFVDETEITKTPDICIC--TWGTIHFKNSVVQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t74                 
-MIWSEVRQMVREG--TDNAIDNC-C------------LIAARVKHMQGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHDCVNTMAKPS-S
-QSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSV--PSFLGMCMFHEQVRCKGE--LVLPDSPNEESVSFVYIQHHSFSD
-KRCLNYLNVGDNDDSEHIKEKHLRI----YG---EIGK-H-VIINVWNAFMGRLNHHEPPAEVMYPLRK--GGPESKPM------------------VDG
-FFDK-E-D------DRPGIANAVSVPCA----DQVGGPIRGWCSSQVKFGLANHTLVHNPSKLHRTFAINKKMGANVYQQTSRMKAEAPVYPHIMEYAHG
-V----CKPFYERSEPKNEAQGNGEK-QGNVPCVESMDCQYENKHAIMAKLMHP-PLYLMRMETMSKPPMGDVDGHRCRAGLTALKIVQLDIGFSAKTLGQ
-LNIIDCKLLGHRTWLATSPLQ------IGCDVMVVGNKIGSPA-GFEVAADPTIIWFYRNCIVHKLADLVSTAKMKSPQEMRV------QDVDSPSLGDD
-DQEA--MDILPYWVCVTSGVVRKEQPD-SVNKRGRTWLAKK-DFLVPPAFNQGEH---EAEQKPVYGFDHPRCRPWQFVIANYQTSAKNIIMLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCVWA-HNVAVCGWKRELVPGL---NHSCEMLAKTVYFEPDGE-------DEGKMVHKIFELDWVEMEKSHQQ
--SSVDDNYL-VNMLPFFHSRENPVGHYVQGLED-PMHLIRPGT---ARKLNILF-YGCQYYSGQFPDGEA-ERSWIYD-VYCEM----KKDHKSAVVAHK
-HQHKGMDWDTGKE-MNQGPK-VVLHGVLFN-------AEPNIHGQPGVSHVFM-GNDATRKLIPGVSVMHDYKFMCGACVPFFHKLFMAVRNMRYDYTVN
-YDIKIWETHLRHGVYAVENSWETLVTC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQPM-AGFVDETEITKTPDICIC--TWGTIHFKNSVVQY
-CCYYKENRSVR-----------VNNTGGAELPK---------------------YHHQNILVD-ELYSDM---YPAAPKKK--HYV-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t26                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHVKQVRNANEDAL--YQNFTGKKGAREKIKR-YL-CMEGHECVVTMAKNS-S
-ISAMWKFDRFMCDLMHLMQN--------GDL--------------------CSF--PSFLGMCMFHDQVRCKGE--LVLPDSKNEESVSFVYIQHHSFSD
-KRCLNYLNVGDNEDSEHLKEKHLRV----YG---NIGK-H-VIINSWNAMMGRLNHHEPAAEVVYPLRK--GGPESKPM------------------VDG
-FFDK-E-D------DRPGIANAVSVPCD----DQWGGPVRGWCSSQHKFGLADHTLIHIPSKLHRTFAINKKMGANVYQQTSRMKAAAPVYSHVMEYAHK
-V----VKPFYARSEPKNEAQGNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLMRMQTMAKPPMGDVDGHRCRAGLTALKIVQLDIGFSQKTLGQ
--NIIDSKHLGHRTWLATSPLQ------IGCSAMVMGNKIGSPQ-EVELAADPTVIYFYRNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDD
-DQQP--MNIIPYWVCVTSGVVHKEQPD-SVNKRGRTWTAKN-DFLCPDAFNQGEH---GAEQKPTHGFEHPRCRPWQFVIPVYQTGAKNIILLLYIKDV-
-SVNGVLQLLIWQLCDSH-GDWQSLVADSCAWA-VNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEGKMVIKIFGLDWCEIEKSHQQ
--SSVDDNYL-VNMLPFTHSRETPVGHYVQGLED-PMHLMRPGT---ARALNILF-YGCEYYSGQFPDGEP-ERSWIYD-VYCEL----KKDHKNAIVAVK
-HEHKGMDWDTGKE-MNHGPK-VIVHGVLFH-------AEPNIGGQPGVSHVFV-GNDATRKLIAGVSVMPIVKFMCGACVPFFRKLFMALRNMRYDYASN
-YDIKIVETHLREGVYAVENSWETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQSV-SGYNDETEITKTPDIKIC--TWGTIHFKNSVMQY
-CCYYKENRSVR-----------LNNTGGAELPK---------------------YHHQNVLVD-ELYGEA---YPAAPKKK--HYM-GAGDVGGYEVMSE
-DLFQILVHE
-;
-t61                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHVKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHECVNTMAKNS-S
-VSAVWKFDQFMCDLMHLMQN--------GDL--------------------CSF--PSFLGMCMFHEQVRCKGE--LVLSDSKNEESVSFVYIQHPSFSD
-KRCLNYLNVGDNEDSEHLKEKVLRV----YG---DIGK-H-VIINVWNAMMGRLNHHEPAAEVVCPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------DRPGVANAVSVPCD----DQWGGPVRGWCSSQHKFGLADHTLVHIPSKLHRTFAITKKMGANVYQQTSRMKATAPVYPHVMEYAHG
-V----VKPFYDRSEPKNEAQGNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLVKMQTMSKPPMGDVDGHRCRAGLTALKIVQLDIGFSSKTLGQ
--NIIHSKLLGHRTWLATSPLQ------IGCDVMVMGNKIGSPQ-EVELAADPSVIYFYQNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDD
-DQQP--MNIIPYWVCVTSGVVRKEQPD-SVNKRGHTWTAKN-DFLCPPAYNQGEH---GAEQKPVHGFEHPRCRPWQFVISVYRTGAKNINLLLYIKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCAWA-VNVAVCGWKRELVPGL---NHACEMLAKSVYFEPDGE-------DEGKMVLKIFGLDWCEIEKSHQQ
--SSVDDNYL-VNMLPFAHSRQTPVGHYVQGLED-PMHLMRPGT---ARALNILF-YGCEYYSGHFPDGEA-ERSWIYD-MYCEL----KKDHKSAIVAVK
-HCHKGMDWDTGKE-MNHGPK-VIIHGLLFH-------AEPNIGGQPGVSHVFV-GNDATRKLIAGASVMFIVKFMCGACVPFFRKLFMALRNMRYDYSQN
-YDIKIVETHLREGVYAIENSWETLVVC-EMTSGRMGAKINHLPRLPEQVI-PPCILTVSGLKRAV-NGYNDETEITKTPDIKIC--TWGTIHFKNSVMQY
-CCYYKENRSVR-----------FNNTGGAELPK---------------------YHHQNVLVD-ELYSEL---YPAAPKKA--HYM-GAGDIGGYEVMSE
-DLFQILVHE
-;
-t97                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHMSGHMKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGHECVNTMAKNS-S
-VSAVWKFDRFMCDLMHLMQN--------GDL--------------------CSF--PSFLGMCMFHQQVRCKGE--LVLPDSKNEESVSFVYIQHHSFND
-KRCLNYLNVGDNEDSEHLEEKHLRV----YG---NIGK-H-VIINVWNAMMGRLNHHEPAAEVVCPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------DRPGVANAMSVPCD----DQWGGPVRGWCSSQHKFGLADHTLVHVPSKLHRTFPINKKMGANVYQQTSRMKATAPVYPHVMEYAHG
-V----IKPFYDRSEPKNEAQGNGEK-QWNVPCVESMDCQYENKHATMAKLMHP-PLYLVKMQTMSKPPMGDVDGHRCRAGLTALQIVQLDIGFSAKTLGQ
--NIIHSKLLGHRTWLATSPLQ------IGCDVVVMGNKIGSPQ-EVELAADPSVIYFYQNCIVQKMADVVSTVKMKSPQEMRV------QDVDSASLGDD
-DQQP--MNIIPYWVCVTSGVVRKEQPD-SVNKRGRTWSAKN-DFLCPPAFNQGEH---GAEQKPVHEFQHPRCRPWQFVISVYRTGAKNINLLLYIKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLVADSCAWA-VNLAVCGWKRELVPGL---NHACEMLAKSVYFEPDGE-------DEGKMNLKIFGLDWCEIEKSHQQ
--SSVDDNYL-VNMLPFTHSRETPVGHYVQDLED-PMHLMRPGT---ARALNILF-YGCEYYSGHFPDGEP-ERSWIYD-MYCEL----KKDHKSAIVAVK
-HCHKGMDWDTGKE-MNHGPK-VIIHGVLFH-------AEPNIGGQPGVSHVFV-GNDATRKLIAGVSVMPIVKFMCGACVPFFRKLFMALRNMRYDYSQN
-YDIKIVETHLREGVYAVENSWETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCILTVSGLKQAV-NDCNDETEITKTPDIKIC--TWPTIHFKNGMMQY
-CCYYKENRSVR-----------FNNTGGAELPK---------------------YHHQNVLVD-ELYSEV---YPAAPKKA--FYM-GAGDIGGYEVMSE
-DLFQILVHK
-;
-t17                 
-MIWSEVRQMVREG--ADNAIDNR-C------------LIAARVKHFSGHTKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGQDCVNTMAKSS-S
-QSAVWKFDRFMCDLVHLMQN---GARGSGDL--------------------CSF--PSFLGMCMFHEQVRCKGE--LVLPDSKNEESVSFVYIQHHSFSD
-KRCLNELNVGDNEDSIHLKEKHLRI----YG---NIGK-V-VIINVWNAMMGRLNHHEPAAEVVYPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------DRPGIANAVAVPCS----DQWGGPVRGWCSSQHKFGLADHTLVHVPSLLHRTFAINRKMGANVYQQTSRMKAAAPVYPHMMEYAHG
-V----VKPFYERSEPKNEAQGNGEK-QWNVPCVQSVDCQYENKHATMAKLMHP-PLYLMRMETMSKPPMGDVDGVRCRAGLTALKIVQLDIGFSAKTLGQ
--NIIDSKLLGHRTWLATSPLQ------IGCDVMVVGNKIGSPQ-EFELAADPTVIYFYRNCIVQKLADVVSTVKMKSPQEMRV------QDVDSPSLGDD
-NQQS--MNIIPYWVCVHSGVVQKEQPD-SVHKRGRTWTAKN-DFLCPPAFDQGEH---GAEQKPVHGFEHPRCRPWQFVIANYQTGAKNIILLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLSADSCAWA-HNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEGKMVIKIFGLDWCEMEKAHQQ
--SSVDDNYL-VNMLPFTHSRENPVGHYVQGLED-PMHLIRPGT---ARALNILF-YGCEYYSGQFPDGEP-ERSWIYD-VYCEL----KKDHKSAIVAVK
-HEHKGMDWDTGKE-MNQGPK-VIIHGVLFH-------AEVNIHGQPGVSHVFV-GNDATRKLIAGVSVMPFVKFMCGACVPFFRKLFMALRNMRYDYTSN
-YDIKIIETHLRNGVYAVENSWETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKQAM-AGVNDETEITKTPDIKIC--TWGTIHFKNFVMQY
-CVYYKENRSVR-----------FNNTGGAELPK---------------------YHHQNALVD-ELYSDV---YPAAPKKK--HYM-GEGDVGGYEVMSE
-DLFQILVHA
-;
-t11                 
-MIWSEVRQMVREG--TDNAIDNR-C------------LIAARVKHFSGHTKQVRNANEDAL--YQNFTGQKGAREKIKR-YL-CMEGQDCVNTMAKSS-S
-QSAVWKFDRFMCDLVHLMQN---GARGSGDL--------------------CSF--PSFLGMCMFHEQVRCKGE--LVLPDSKNEESVSFVYIQHHSFSD
-KRCLNSLNVGDNEDSIHLKEKHLRI----YG---DIGK-H-VIINVWNAMMGRLNHHEPAAEVVYPLRK--GGPDSKPM------------------VDG
-FFDK-E-D------DRPGIANAVAVPCS----DQWGGPVRGWCSSQHKFGLADHTLVHVPSLLHRTFAINKKMGANVYQQTSRMKAAAPVYPHMMEYAHG
-V----VKPFYERSEPKNEAQGNGEK-QWNVPCVQSVDCQYENKHATMAKLMHP-PLYLMRMETMSKPPMGDVDGVRCRAGLTALKIVQLDIGFSAKTLGQ
--NIIDSKLLGHRTWLATSPLQ------IGCDVMVVGNKIGSPQ-EFELAADPTVIYFYRNCIVQKLADVVSTVKMKSPQEMRV------QDVDSPSLGDD
-NQQS--MNIIPYWVCVHSGVVQKEQPD-SVHKRGRTWTAKN-DFLCPPAFDQGEH---GAEQKPVHGFEHPRCRPWQFVIANYQTGAKNIILLLYVKDV-
-SCNGVLQLLNWQLCDSH-GDWQSLSADSCAWA-HNVAVCGWKRELVPGL---NHACEMLAKTVYFEPDGE-------DEGKMVIKIFGLDWCEMEKAHQQ
--SSVDDNYL-VNMLPFTHSRENPVGHYVQGLED-PMHLIRPGT---ARALNILF-YGCEYYSGQFPDGEP-ERSWIYD-VYCEL----KKDHKSAIVAVK
-HEHKGMDWDTGKE-MNQGPK-VIIHGILFH-------AEVNIHGQPGVSHVFV-GNDATRKLIAGVSVMPFVKFMCGACVPFFRKLFMALRNMRYDYTSN
-YDIKIMETHLRNGVYAVENSWETLVVC-EMTSGRIGAKINHLPRLPEQVI-PPCMLTVSGLKQAM-AGVNDETEITKTPDIKIC--TWGTIHFKNFVMQY
-CVYYKENRSVR-----------FNNTGGAELPK---------------------YHHQNVLVD-ELYSDG---YPAAPKKK--HYM-GEGDVGGYEVMSE
-DLFQILVHA
-;
-t23                 
-MIWSECQRMLREH--EDQAIANE-C------------LIAFKVKLVNGHVKQVRNASEDAH--YTFFAGEKGARELIKR-YS-CMEGDGCVNTMAEGR-S
-ESAVWKFDPFMCQLTHSMQS--------GDL--------------------CSV--PSFLGVCMFQRQVVMKGE--LVLPDSADEGSVSFMYIQHHSFAA
-KRCLNVLNVGDNEDSVHLRHKQLRV----YG---KIGK-H-VIISVPNAIMGRLNHHEPSAIVVFPLRQ--RGADSKSV------------------GDG
-FYDK-D-E------DRPGIANAVSVPVA----EQWVGSVRGWYSSEHKYGLANHILI-GPSKLHRTYQTTAKMGANVVKATNRMKRPQPVYPHVMEYANG
-V----VKPFYEVAESKNEAQGNGEK-PVNVPCVESPDCQYESKHARVNKLMHP-SLYLMCMEAMNKPIMGDWDGNRCRSPLCLLKVIQLDMGVSGKTLGQ
--NIVMAKLLGERTWLATSPLQ------IGCDVVAVGKKPESPQ-EFECAADPTVIYFYKNLIIQQAADYVSAVQVKSPQEMRY------QDVNSPSDGDE
-NGQS--MHIGPYWVCVSSEVVKKSQPD-SVDKRGRTWVAKN-EFLCPPDHMQGEHSIEGAEQKPFFGFAGPFPQPWQFVIVNPQTWAHNIIRLLYCKDV-
-SCNCVLTCLNWVLCDSH-GDWHSLIADACPCA-HNVAVCGWKRELVPGL---NHSNEHMAKTIYFEPDGH-------DEGKMILNIFGLDWCEVETSHQE
--SSSDDNHL-VNMLPFGVSRDDPVGHYMLGLED-AIRLYRPGT---ARALNILF---VNYYSGDFQDPEL-ERSQLYN-VYCEQ----KQDHRNAIRASK
-NDHKGMAWDTAKD-MEQGPK-MVEHQVLFY-------AEPNMHGQPEVIHIFI-GNDAMCMLIPGMSVMVHHKFMRAACMPFFNKLFMAVRYMRYDYVDN
-YDIKIDETRYRDGVYARRNSWETANVC-EMSSGRSGAKINHNPRLPEQVT-PPRSLTVSGLKDTM-PGHPDVTEITKTPVIAIV--MWGTINLKNHVMQY
-CCYYKETRSVR-----------VNNTGGAELPK---------------------YHYQNILVD-ELYSND---YPAAPKKA--QFM-GVGDVGGYEIVCE
-DIFQILVCD
-;
-t76                 
-LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGGI--VTNFHGF---AEMPKN-HD-VMEEQGGPGTCLAPQQS
-ADTSWPFVMFTVDLAHRCRG--------GDMPQNTGDSMTCPHLAEGLAAVNS---RAFIGVSIYDLKVSHKMI--QACNPIQN---------DNHAFSD
-QRCLNDLSQGVVGASFPKMQHGVRH----YK---K--------RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPAR
-NFIQLS-MVRDTPHRLPKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQNTLHRQYLVDVELQATMVFVAARMKTDSSMYMSVREILHG
-------------CGIKDEAQADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRCLRYKNDLTGDQLVQLAD----NTCAW
--NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------SK-------VEPKCAQFYSKSCTHC----------------TM------CSVGSHASEED
-ALDLYTHKPVPDAQCFVSRVARNIPEH-SPCK-----------------------------P---CS-----------------VEEVCYCKVCDSKDVR
-AVKNAYQDLQVPLSKLK-APWLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEENDLNCDDFELGW-NLKH----
----EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQPCHAAHAQDIPTEQ---TRYQIHTFLDDSI-RRDLCNQ-GCHEENMVWRDDLKDPISTEV
-IADKLHEWPTNVN-KENSAD----HRQLFH-------ANSSALDKHQHNVVMN-GSPCIRALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCA
-MNITIQCLHTGEGVMCNVKCKEFLQREDEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPLIAEP--LYLVI-YVNAVEPY
-TDAYKKPKSMHQFQFDDCQIRYRTNTGFEETPVGATHLTHVCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDHNASEQKE--AHV-PMGDEGRISRAKD
-EIMYIRDLE
-;
-t53                 
-LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGGI--VTNFHGF---AEMPKN-YD-VMEEQGGPGTCLAPQQS
-ADTSWPFVMFTVDLAHRCRG--------GDIPQNTGDSMTCPHLAEGLAAVNS---RAFIGVSTYDLKVSHKMI--QACNPIQN---------DNHAFSD
-QRCLNDLAQGVVGASHPKMQHGVRH----YK---K--------RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPAR
-NFIQLS-MVRDTPHGLPKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQNTLHRQYLVDVELGATMVFVAARMKTDLSMYMSVREILHG
-------------CGIKDEAQADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRCLRYKNDLAGDQLVQLAD----NTCAW
--NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------SK-------VEPKCAQFYSKSCTHC----------------TM------CSVGSHASEED
-ALDLYTHRPVPDAQCFVSRVARNIPEH-SPCK-----------------------------P---CS-----------------VEEVCYCKVCDSKDVR
-AVKNAYQDLQVPLSKLK-APWLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEENDLNCDDFELGW-NLKP----
----EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQPCHAAHAQDIPTEQ---TRYQIHTFLDDSI-RRDLCNQ-GCHEENMVWRDDLKDPISTEV
-IADKLHEWPTNQN-KENSAD----HRQLFH-------ANSSALDKHQHNVVMN-GSPCIRALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCA
-MNITIQCLHTGEGVVCNVKCKEFLQREDEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPLIAEP--LYLVI-YVNAVEPY
-TDAYKKPKSMHQFQFDDCQIRYRTNTGFEETPMGATHLTHVCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDHNASEQKE--AHV-PMGDQGRISRAKD
-EIMYIRDLE
-;
-t16                 
-LSSSHEVRVVNHKSKPDEHIADK-D------------MCADAMCNGSGHTGRIHNAVEGGI--VTNFHGF---AEMPKN-YD-VMEEQGGPGTCLAPQQS
-ADTSWPFVMFTVDLAHRCRG--------GDIPQNTGDSMTCPHLAEGLAAVNS---RAFIGVSTYDLKVSHKMI--QACNPIQN---------DNHAFSD
-QRCLNDLAQGVVGASHPKMQHGVRH----YK---K--------RVYENEVGGRLDDAEAIDDMGVWIRW--EGVKHAWCHPIGSCPDHLVCSLLVLQPAR
-NFIQLS-MVRDTPHGLPKMASAAPVYKQTCHLEQVQGTARMWGKSGPRVVLNGHMLK-TQNTLHRQYLVDVELGATMVFVAARMKTDLSMYMSVREILHG
-------------CGIKDEAQADGQR-PATLIVVLSKDNKGITEHGAVLKKIHP----------LCKRCMENGRCLRYKNDLAGDQLVQLAD----NTCLW
--NLFEC--LRDSKSLFGSPLFIKVDEDRGFTAP-------SK-------VEPKCAQFYSKSCTHC----------------TM------CSVGSHASEED
-ALDLYTHKPVPDAQCFVSRVARNIPEH-SPCK-----------------------------P---CS-----------------VEEVCYCKVCDSKDVR
-AVKNAYQDLQVPLSKLK-APWLSMGHCECWEEDINNILSVVKHELVDDVDRMNRLTEVAAKMAYFGPDGFHWDVELWEENDLNCDDFELGW-NLKP----
----EDDHPL-LCIGSFSVHKYVSVMVYPLPMND-CVRMSQPCHAAHAQDIPTEQ---TRYQIHTFLDDSI-RRDLCNQ-GCHEENMVWRDDLKDPISTEV
-IADKLHEWPTNQN-KENSAD----HRQLFH-------ANSSALDKHQHNVVMN-GSPCIRALIIGGSSVGVNHFMMGPCQEFFTDLFMMYEGLQYACVCA
-MNITIQCLHTGEGVVCNVKCKEFLQREDEMKAGLIGIICNHLSRMIMVIL-VHCLLTHAGLKSME-IGFDR-TGVVRMPLIAEP--LYLVI-YVNAVEPY
-TDAYKKPKSMHQFQFDDCQIRYRTNTGFEETPMGATHLTHVCVCVPHPWTKGKSEILQNMGSA-VLYNDVIRDYNASEQKE--AHV-PMGDQGRISRAKD
-EIMYIRDLE
-;
-t42                 
-LSSSHEMRVVHHKSKPDEEIADQ-D------------LCAEEMCKGSGHTGRIHSAVEGGI--WTNFHGF---AEMPKN-YD-VMEEQGGPGTCIAPRQS
-ADTSWPFMVFTVDLAHRCRG--------GDTPTQAGDSMTFPHLAEGLPAVNS---RAFVGVSSYDLRVSHKMI--QACTLIQN---------DNVAFSD
-QRPLNDLNQGCVGTSHPKMPHGVRH----YK---K--------KVYENEVGDRLDDAEGIDDVGVWMRW--NGVKHAWCHIIGSCPDHLVCSLLVLQPGR
-NFIQLS-VVHDTPHRLPKMASAAAVFKQTCHLEQVPGTARMWGKSGPRVRLNGHVLK-NQNILHRQYLVDVNLGATMVFVLARMKTDASMYMSHREILHG
-GTFDAAKPFRQICGTKDEAQPDGRR-PATLLVVLSKDNQGITEHGAVLKHVHP----------LCKKDCNNNRCLRCKNVLAGNQLIQLSD----VTCAW
--NLFEC--LGDSESLFGSPLAIKVDEDRGFTAP-------SK-------VEPKCAQFYSKSCTHH----------------MM------CSVGSNASEED
-ALELYTHKPVPDPQCFVSIVVRNIPEH-SPCK-----------------------------P---CS-----------------VEEVAYCKNCDSKDVR
-AVQNAYQDLAVPLSKLK-APWLSMGHCECWEEDINNILSMVKHELVVDQDMVNRSPEVAAKMAYFGPDGFHWDVELCEESDLTVDDFELGW-VLKP----
----EDDHPL-ICIGSFSVHKQFSVMVYPLPMND-AIRMSQPCHAAHAQDIHTDQ---DRYDVRTFLGHSI-KCHMCNQ-ACHEENIVWRDDLKDPITTEV
-IAEKLQEWPTNQN-KENVAD----HRQLFH-------ANSSALDKHRHNVMMN-GSACIRTLIIGGSIVGVNVFMMEPCQEFFTDLFMVYEGLQYAVVCA
-VNIIIQCLHTNEGVVCNVKCKEFLQREEDMKSGLIGIICNHISRMCMHIL-VVCLLTHCGLKAME-IPFDI-TGVVRGPLITEP--LYLII-YVNAVEPY
-TDAYKKPKSMHQFQFDDVQIRYRTNTGFEENPKLATHLVHVCVVVPHPWTKGKSEILQNMESA-HLYNAVIRDNNASEQKE--AHV-PVGDEGRISRAKN
-EILYIRDLE
-;
-t24                 
-QSSSHEMRVVHHKSKPDEEITDQ-D------------LCAEEMCKGSGHTGRIHSAVEGGI--WTNFHGF---AEMPKN-YD-VMEEQGGPGTCVAPRQS
-ADTNWPFMVFPVELAHRCRG--------GDTP--------FPHLAEGLPAVNS---RAFIGVSSYDLKVSHKMI--QACNPIQN---------DNVAFSD
-QRVLNDLSQGCVGTSHPKMPHGVRH----YK---K--------RVYENEVGDRLDDAEAVDDVGVWMRW--AGVKVAVCHVIGSCPDHLVVSLLVLQPAR
-NFIQLS-VVHDTPHRLPKMASAAAVFKQTCHLEQVAGTARVWGKSGPRVKLNGHVLK-NQNVLHRQYLVDVDLGATMVFVAARMKTDASMYMSHREILHG
-GTFDAAKPFRQICGVKDEAQPDGQR-PATLLVVLSKDNVGITEHGAVLKHVHP----------LCKKDCNNNRCLRCKNVLAGNQLVQLAD----ITCAW
--NLFEC--LGDSESLFGSPLAIKVDEDRGFTAP-------SK-------VEPKCQQFYSKSCTHC----------------VM------CSVGSNASEED
-ALELYTHKPVPDPQCFVSIVVRNIPEH-SPCK-----------------------------P---CS-----------------VEEVCYCKNCDSKDVR
-ATQNAYQELAIPLSKLK-APWLSMGHCECWEEGINNILSMVKHELVVDQDMVNRSPEVAAKMAYFGPDGFHWDIELCEENDLTCDDFELGW-VLKP----
----EDDHPL-ICIGSFSVHKQFSVMVYPLPMND-AIRMSQPCYAAHAQDIHTDQ---DRYDIRTFLEHSI-RCHLCNQ-ACHEENIVWRDDLKDPITTEV
-IADKLQEWPTNQN-AENVAD----HRQLFH-------ANSSCLDRHRHNVMMN-GSSCIRTLIIGGSIVGVNVFMMGPCQEFFTDLFMVYEGLQYAVVCA
-INIIIQVLHTNEGVVCNVKCKEFLQREDDMKSGLIGIICNHISRMCMHIL-VHCLLTHCGLKAME-IPFDR-TGVVRGPLIAEP--LYLII-YVNAVEPY
-TDAYKKPKSMHQFQFDDVQIRYRTNTGFEENPKLATHLVHVCVVVPHPWTKGKSEILQNMESARHLYNAVIRDNNASHQKE--AHV-PAGDQGRISRAKN
-EILYIRDLE
diff --git a/test/example.ph b/test/example.ph
deleted file mode 100644
index 5f84796..0000000
--- a/test/example.ph
+++ /dev/null
@@ -1,2526 +0,0 @@
- 100 1209
-t73          LIVSQIRVMV RDG--IHKAM DEE-V----- -------LIA RRVKPYSGNG
-t66          LIVSQIRVMV RDG--IHKAM DEE-V----- -------LIA RRVKPCSGNG
-t32          LIVSQIRVMV RDG--IHKAM DEE-V----- -------LIA RRVKPYSGNG
-t75          LIVSEIRVMV RDE--VHKAM DEE-C----- -------LIA RRVKPYSGNG
-t79          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTFSGSQ
-t27          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTMSGSQ
-t93          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTMSGSQ
-t59          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTFSGSQ
-t7           LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKKFSGSQ
-t78          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTFSGSQ
-t12          LIVSEVRVMV RDG--INIAI DEL-C----- -------LIA NRVKAFSGHQ
-t81          LIVSEVRHMV RDG--ANVAI DEL-C----- -------LIA CRVKAFSGHG
-t21          LIVSEVRHMV RDG--ANIAI DEL-C----- -------LIA CRVKAFSGHG
-t80          LIVSEVRHMV RDG--VNIAV DEI-C----- -------LIA NRVKSMSGQG
-t14          LIVSEVRHMV RDG--VNIAV DEI-C----- -------LIA NRVKSMSGQG
-t85          LIVSEVRHVV RDG--VNIAV DEI-C----- -------LIA NRVKSMSGQG
-t62          LIVSEVRVMV RDG--IHIAV DEI-C----- -------LIA NRVKCMSGQG
-t19          LIVSEVRHMV RDG--INIAV DEI-C----- -------LIA NRVKCVSGQG
-t77          LIVSEVRHMV RDG--INIAV DEI-C----- -------LIA NRVKSMSGQG
-t88          LIVSECRLII RDG--NHDAI DEM-CCVAND LNNEIERLVA SMVKSFRGHD
-t37          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t35          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t48          LIVSDMRLII REG--SDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t55          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t46          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t67          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t57          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-t56          LIVSEWRLFI RDG--HDDAI DEM-CCEANE LNNDIEKLVA SMVKGFRGHD
-t13          GIVSECRMII RDE--HDDAI DEM-C----- -------LVA SMVKKLSGCE
-t5           GIVSECRMII RDE--HDDAI DEM-C----- -------LVA SMVKKLSGCE
-t38          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-t33          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-t100         GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-t34          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-t84          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCD
-t92          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-t3           GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-t22          GIVSECRVII RDQ--SDDAI DER-Y----- -------LVA SVVKRLSGCE
-t64          GIVSECRMII RDE--TDDAI DEV-C----- -------LVA SMVKKLSGCE
-t18          GIVSECRMII RDE--TDDAI DEV-C----- -------LVA SMVKKLSGCE
-t68          GIVSECRMII RDE--TDDAI DEV-C----- -------LVA SMVKKLSGCE
-t28          GIVSECRMII RDE--ADDAI DEM-C----- -------LVA SMVKKLSGCE
-t82          GIVSECRMII RDE--ADDAI DEM-C----- -------LVA SMVKKLSGCE
-t41          GIVSECRMII RDE--ADDAI DEM-C----- -------LVA SMVKKLSGCE
-t71          GIVSECRMII RDQ--SDDAI DEMVV----- -------LVA SMVKEMSGCE
-t94          GIVSECRMII RDQ--SDDAI DEMVC----- -------LVA SMVKELSGCE
-t99          GIVSEVRMII RDE--SDDAI DEM-C----- -------LVA SMVKALSGCE
-t40          GIVSECRMII RDE--SDDAI DEV-C----- -------LVA SMVKALSGCE
-t90          GIVSECRMII RDE--SDDAI DEV-C----- -------LVA SMVKALSGCE
-t4           GIVSECRMII RDE--PDDAI DEV-C----- -------LVA SMVKELSGCE
-t36          MIWSEVRKMV RER--REQAI DNK-C----- -------LIA ARVKMMSGYV
-t87          MIWSEVRKMV RER--REQAI DNK-C----- -------LIA ARVKMMSGYM
-t89          MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-t39          MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-t8           MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-t6           MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-t58          MIWSEYRHMV REG--RDQAI DNK-C----- -------LIA ARVKVMSGYV
-t54          MIWSEYRHMV REG--RDQAI DNK-C----- -------LIA ARVKVMSGYV
-t65          MIWSEYRQMV REG--NDQSI DNK-C----- -------LIA DRVKMMSGVV
-t29          MIWSEYRQMV REG--NDQSI DNK-C----- -------LIA ARVKMMSGVV
-t98          MIWSEHRQMV REG--NDQSI DNK-C----- -------LIA ARVKMMSGVV
-t83          MIWSEYRQMV REG--NDQSI DNK-C----- -------LIA ARVKMMSGVV
-t95          MIWSEYRQMV REG--TDQSI DNK-C----- -------LIA ARVKMMSGVV
-t20          MIWSEYRQMV REG--TDQSI DNK-C----- -------LIA ARVKMMSGVV
-t69          MIWSDYRQMV REG--GDDSI DNK-C----- -------LIA ARVKMMSGVV
-t2           MIWSDYRQMV REG--GDDSI DNK-C----- -------LIA ARVKMMSGVV
-t10          MIWSDYRQMV REG--GDDSI DNK-C----- -------LIA ARVKMMSGVV
-t31          MIWSEYRSMV REG--ADQSI DNK-C----- -------LIA ARVKMMSGVV
-t15          MIWSEYRSMV REG--SDQSI DNH-C----- -------LIA ARVKMMSGVV
-t63          MIWSEYRSMV REG--SDQSI DNK-C----- -------LTA ARVKLMSGVV
-t50          MIWSEYRSMV REG--SDQSI DNK-C----- -------LTA ARVKLMSGVV
-t25          MIWSEYRSMV REG--SDQSI DNK-C----- -------LTA ARVKMMSGVV
-t51          MIWSEYRSMV REG--SDQSI DNK-C----- -------LIA ARVKMMSGVV
-t9           MIWSECRQMV REK--TDNAI DNQ-C----- -------LIA ARVKENSGHV
-t47          MIWSECRQMV REK--SDNAI DNQ-C----- -------QIA ARVKRNSGHV
-t60          MIWSECRQMV REK--TDNAI DNQ-C----- -------QIA ARVKENSGHV
-t30          MIWSECRQMV REK--TDNAI DNQ-C----- -------QIA ARVKENSGHV
-t70          MIWSECRQMV REK--NDNAI DNQ-C----- -------LIA ARVKEDSGHV
-t91          MIWSECRQMV REK--NDNAI DNQ-C----- -------LIA ARVKEDSGHV
-t49          MIWSECRQMV REK--NDNAI DNQ-C----- -------LIA ARVKENSGHV
-t52          MIWSEERQMV REK--VDNAV DNQ-C----- -------LIA ARVKENCGHV
-t43          MIWSEVRQMV REG--SDNAI DNR-C----- -------LIA ARVKHVQGHV
-t1           MIWSEVRQMM REG--TDNAI DNQ-C----- -------LIA ARVKHMQGHV
-t86          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKPVQGHV
-t72          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHVQGHV
-t96          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHVQGHV
-t44          MIWSEVRQMV REG--TDNAI DTR-C----- -------LIA ARVKHMQGHV
-t45          MIWSEVRQMV REG--TDNAI DNC-C----- -------LIA ARVKHMQGHV
-t74          MIWSEVRQMV REG--TDNAI DNC-C----- -------LIA ARVKHMQGHV
-t26          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHMSGHV
-t61          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHMSGHV
-t97          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHMSGHM
-t17          MIWSEVRQMV REG--ADNAI DNR-C----- -------LIA ARVKHFSGHT
-t11          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHFSGHT
-t23          MIWSECQRML REH--EDQAI ANE-C----- -------LIA FKVKLVNGHV
-t76          LSSSHEVRVV NHKSKPDEHI ADK-D----- -------MCA DAMCNGSGHT
-t53          LSSSHEVRVV NHKSKPDEHI ADK-D----- -------MCA DAMCNGSGHT
-t16          LSSSHEVRVV NHKSKPDEHI ADK-D----- -------MCA DAMCNGSGHT
-t42          LSSSHEMRVV HHKSKPDEEI ADQ-D----- -------LCA EEMCKGSGHT
-t24          QSSSHEMRVV HHKSKPDEEI TDQ-D----- -------LCA EEMCKGSGHT
-
-             TQVRNDVEDA N--CQEFVGI ---RELGKH- YK-CMDGFHT VNNGAGEN-S
-             TQVRNDVEDA N--CQEFVGI ---RELGKH- YK-CMDGFHT VNNGAGEN-S
-             TQVRNDVEDA N--CQEFVGI ---RELGKH- YK-CMDGFHT VNNGAGEN-S
-             NQIRNDIEDA N--GQEFVGI ---RELGKH- YD-CMDGYHT VNNGAGEN-S
-             NQVRNAVEDA A--RPDFVGT ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             NQVRNAVEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             NQVRNAVEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             NQVRNAVEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             GQVRNAIEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             GQVRNAIEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             NQVRNAMEDA Q--RPDFVGI ---RELGKQ- YQ-CMDGHGA VDTGAGRN-S
-             HQVRNAVEDA A--RPDFIGI ---RELGKP- Y--CMDGHGA VNTGAGHN-S
-             NQVRNAVEDA P--RPDFIGV ---RELGKP- Y--CMDGHGA VNTGAGVN-S
-             NQVRNAMEMA A--RQNFVGM ---RELEKV- YE-CMDGQGA VNTEAGNN-S
-             NQVRNAMEMA A--RQNFVGM ---RELEKV- YQ-CMDGQGA VNTEAGNN-S
-             NQVRNAMEMA A--RQNFVGM ---RELDKA- YQ-CMDGQKA VNTEAGNN-S
-             NQARNAMEMA A--RQNFVGM ---RELGKQ- YQ-CMDGQGA VNTEAGNN-S
-             NQARNAMEMA A--RQNFVGM ---RELGKQ- YQ-CMDGQGA VNTEAGNN-S
-             NQARNAMEMA A--RQNFVGM ---RELGKQ- YH-CMDGQGT VNTEAGNN-S
-             SQARNNSECM R--SAPFIGV ---RELFKR- YHKCVEGAGC VHTVAGTP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             SQARNNAECI I--AAPFIGV ---RELFKR- YIKCVEGAGC VYTVA-AP-S
-             NQARNNHECA I--PPPFHGV ---REMFKRV YE-CMEGIGC VNTVAGNP-S
-             NQARNNHECA I--PPPFHGV ---REMFKRV YE-CMEGIGC VNTVAGNP-S
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             QQARNNRECA T--SIPFLGV ---RELWKR- YE-CMEGIGC VNTVAGKP-S
-             NQARNNRECA I--SIPFLGV ---RELWKR- YE-CMEGIGC VNTVAGTP-S
-             NQTRNNRECA IT-SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGMP-S
-             NQTRNNRECA IT-SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGMP-S
-             NQTRNNRECA I--SPPFIGV ---RELFKR- YG-CVEGIGC VNTVAGMP-S
-             NQARNNRECA I--SPPFIGV ---RELFKR- YH-CMEGIGC VNTVAGMP-S
-             NQARNNRECA I--SPPFIGL ---RELFKR- YV-CMEGIGC VNTVAGMP-S
-             NQARNNRECA I--SPPFIGL ---RELFKR- YV-CMEGIGC VNTVAGMP-S
-             NQARNNSECA I--SPQFIGV ---RELFKR- YR-CMEGIGC VNTVAGAP-S
-             NQARNNRECA I--SPPFTGV ---RELFKR- YR-CMEGIGC VNTVAGIP-S
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGIP-S
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGIP-S
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGIP-S
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGMP-S
-             LQVRNALEDA L--YVFFTGT KGTRELVKY- YM-CMEGHGC VNTMAKKS-S
-             LQVRNALEDA L--YVFFTGN KGTRELVKY- YM-CMEGHGC VNTMAKKS-S
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGC VNTMAKKS-S
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGC VHTMAKKS-S
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YNFFTGQ KGTKELVKF- YF-CMEGCGC VNTMAKKS-S
-             RQVRNAPEDA L--YNFFTGQ KGTKELIKF- YF-CMEGCGT VNTMAKDS-S
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YNFFTGH KGTRELVKY- YH-CMEGCGC VNTMAKSS-S
-             RQVRNAPEDA L--YNFFTGQ KGTRELVKY- YH-CMEGCGC VNTMAKSS-S
-             RQVRNAPEDA L--YNFFTGQ KGTRELVKY- YH-CMEGCGC VNTMAKSS-S
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKQS-S
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YTFFTGQ KGKRELIKY- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             KQVRNDSEDI L--YNHFTGK KGARELIKR- YV-CMEGHDC VNTVANVS-S
-             KQVRNDSEDI L-CYHHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             KQVRNDSEDI L-CYHHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             KQVRNDSEDI L-CYHHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             KQVRNASEDI M--YNHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             KQVRNASEDI M--YNHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             KQVRNASEDI M--YNHFTGN KGACELIKG- YV-CMEGHDC VNTMANIS-S
-             KQVRNASEDI L--YNHFTGK KGARELIKR- YI-CMEGHDC VNTMAHDS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKVS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             KQVRNANEDA L--YQNFSGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YK-CMEGHDC VNTMAKSS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             KQVRNANEDA L--YQNFTGK KGAREKIKR- YL-CMEGHEC VVTMAKNS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHEC VNTMAKNS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHEC VNTMAKNS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGQDC VNTMAKSS-S
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGQDC VNTMAKSS-S
-             KQVRNASEDA H--YTFFAGE KGARELIKR- YS-CMEGDGC VNTMAEGR-S
-             GRIHNAVEGG I--VTNFHGF ---AEMPKN- HD-VMEEQGG PGTCLAPQQS
-             GRIHNAVEGG I--VTNFHGF ---AEMPKN- YD-VMEEQGG PGTCLAPQQS
-             GRIHNAVEGG I--VTNFHGF ---AEMPKN- YD-VMEEQGG PGTCLAPQQS
-             GRIHSAVEGG I--WTNFHGF ---AEMPKN- YD-VMEEQGG PGTCIAPRQS
-             GRIHSAVEGG I--WTNFHGF ---AEMPKN- YD-VMEEQGG PGTCVAPRQS
-
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVKRDVQK FPKLKEGAPN
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVKRDVQK FPKLKEGAPN
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVKQDVQK FPKLKEGAPN
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVQQDVHK FPKLKEGAPN
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             ESAVVIFDVW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             ESAVWIFDIW MCKLAHGMQW --------GD IGRVSVDHPK FLKLEEGAPR
-             ESAVWIFDIW MYKLSHGMQW --------GD IGRVGVDHPK FLKLEEGAPN
-             ESAVWIFDIW MYKLSHGMQW --------GD IGRVDVDHPK FLKLEEGAPN
-             ESAVWIFDIW MCKLTHGMQD FGD-----GD IGRVVVDHPK FEKLEEGAPN
-             ESAVWIFDIW MCKLTHGMQD FGD-----GD IGRVVCDHPK FEKLEEGAPN
-             ESAVWIFDIC MCKLTHGMQD --------GD IGRVVCDHPK FEKLEEGAPN
-             ESAVWIFDIW MCRLTHGMQD --------GD IGRVECDHPK FAKLEEGAPN
-             ESAVWIFDIW MCRLTHGMQD --------GD IGRVECDHPK FAKLEEGAPN
-             ESAVWIFDIW LCRLTHGMQD --------GD IGRVECDHPK FAKLEEGAPN
-             DSPVWMFDQF MCQLTHSMVD --------GD LGRVVQDNVI FAKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVMDNWT FTKLKEGAPH
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVMDNWT FTKLKEGAPH
-             ESPVWMFDKF MCHLTHSMVV --------GD LGRVLRDNTT FAKLKEGAPV
-             ESSAWMFDKV MYQLTHSMVW --------GD LRRVVHDNVT FSKLKEGAPH
-             ESSAWMFDKV MYQLTHSMVW --------GD LRRVVHDNVT FSKLKEGAPH
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             QSSVWMFDRF MYKLTHSMVW --------GD LGRVYWDNLT FQKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVYVDNQT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LRRVFPDNAT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LRRVFPDNAT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LRRVFPDNAH FSKLKEGAPH
-             ESSVWMFDQF MYKLTHSMIW --------GD LGRVFPDNAT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVFPDNCT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVFPDNCT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LARVFHDNGT FAKLKEGAPH
-             ESSVWMFDRF MYRLTHSMVW --------GD LGRVFQDNAT FSKLKEGAPH
-             ESSIWMFDRF MYKLTHSMVW --------GD LGQVFPDVST FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVYPDNPT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVYPDNPT FSKLKEGAPH
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVFPDNAT FSKLKEGAPH
-             QSGIWKFNAF MC-LMHLMEG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMHLMEG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMHLMQG --------GD L--------- ----------
-             QSGIWKFNAF MC-LMHLMQG --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQL --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQL --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQE --------GD L--------- ----------
-             QSAPWKFNRF MC-LMYLMQD --------GD L--------- ----------
-             QSAPWKFNRF MC-LMYLMQD --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQD --------GD L--------- ----------
-             QSAPWKFNHF MC-LMHLMQN --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             QSAIWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWNFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWNFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWNFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCDLMHLMQD --------GD L--------- ----------
-             QSAVWKFDRF MCDLMHLMQD --------GD L--------- ----------
-             QSAVWKFDRF MCDLMHLMQD --------GD L--------- ----------
-             QSATWKFDRF MCDLMHLMQG --------GD L--------- ----------
-             QSAVWKFDRF MCALMHLMQK --------GD L--------- ----------
-             QSAVWKFDRF MCCLMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCALMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCALMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCALMHLMQV --------GD L--------- ----------
-             QSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             ISAMWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             VSAVWKFDQF MCDLMHLMQN --------GD L--------- ----------
-             VSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             QSAVWKFDRF MCDLVHLMQN ---GARGSGD L--------- ----------
-             QSAVWKFDRF MCDLVHLMQN ---GARGSGD L--------- ----------
-             ESAVWKFDPF MCQLTHSMQS --------GD L--------- ----------
-             ADTSWPFVMF TVDLAHRCRG --------GD MPQNTGDSMT CPHLAEGLAA
-             ADTSWPFVMF TVDLAHRCRG --------GD IPQNTGDSMT CPHLAEGLAA
-             ADTSWPFVMF TVDLAHRCRG --------GD IPQNTGDSMT CPHLAEGLAA
-             ADTSWPFMVF TVDLAHRCRG --------GD TPTQAGDSMT FPHLAEGLPA
-             ADTNWPFMVF PVELAHRCRG --------GD TP-------- FPHLAEGLPA
-
-             CSSFVKPYFM GCDMFHKQVE YRGTHGLVLD DTWNEESATF PYPQVHSRSD
-             CSSFVKPYFM GCDMFHKQVE YRGTHGLVLD DTWNEESATF PYPQVHSRSD
-             CSSFVKPYFM GCDMFHKQVE YRGTHGLVLD DTWNEESATF PYPQVHSRSD
-             CSSFVKPVFM GCDMFHRQVQ NRGNHGLVLD DTWNEESGTF PYPQVHSRNE
-             CSSIPMPYFL GVDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSMPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSCPMPYFL GCEMFHRQVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             CSSLPMPYFL GVDMFHRQVT IKGAKGLVLP DIWNESPMAF PYAQVHSKSH
-             CSSLPMPYFL GVDMFHKQVT LKGAKGLVLP DIWNESPMAF PYAQVHSKSH
-             CSSHPVPYFL GIDMFHKQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             CSSHPMPYFL GVDMFHEQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             CSSIPMPYFL GIDMFHKQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             CSSLPMPYFL GIDMFHNQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             CSSLPMPYFL GIDMFHKQVM GKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             CSSLPMPYFL GIDMFHRQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             CISL--PHFL GIDMFHTQVF VGGH--LILP DPCYELSISV MYAGHASYNQ
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             CIAI--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             CIAL--PYFM GIDMFHIQVF LGGD--LILP DPCYELSISV MYAGHASYNQ
-             CIAL--PYFM GIDMFHIQVF IGGD--LILP DPCYELSISV MYAGHASYNQ
-             CISL--PYFL GMDMFHQQVF MGGN--LILP DPCYELSISV MYAGHASYNQ
-             CISH--PYFL GIDMFHIQVY SKGF--LTLP DPRYEISMSV MYSQHHSFSM
-             CISH--PYFL GIDMFHIQVY SKGF--LTLP DPRYEISMSV MYSQHHSFSM
-             CISQ--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             CIAV--PNYL NIDMFHIQVF YKGP--LTLP DPHYELSMSV MYAQHHSFSQ
-             CISA--PYYL NIDMFHIQVF YKGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHDQVV YRGP--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHEQVV YRGP--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHDQVV YRGP--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHAQVF YRGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             VISH--PYFL GIDMFHGQVV YRGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             VISH--PYFL GIDMFHGQVV YRGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             VISV--PYFL GIDMFHGQVF LRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHGQVF YRGS--LTLP DPRYELSMSV MYAQHHSMSQ
-             VISQ--PYFL GIDMFHDQVF YRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHDQVF YRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISH--PYFL GIDMFHDQVF YRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             VISV--PYFL GIDMFHDQVF YRGS--LTLP DPRYEMSMSV MYAQHHSFSQ
-             -CSY--PSFL GMCMFHAMVQ SKGD--LVLP DSPNEDSVSF MYIQHHSFHE
-             -CSY--PSFL GMCMFHAMVQ SKGD--LVLP DSPNEDSVSF MYIQHHSFHE
-             -CSY--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             -CSY--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             -CSY--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             -CSH--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             -CSH--PSFL GMCMFHAMVK SKGN--LVLP DSCNEDSVSF MYIQHHSFHE
-             -CSH--PSFL GMCMFHAMVQ SKGN--LVLP DSCNEDSVSF MYIQHHSFHE
-             -CNS--PSFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNC--PSFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PPFL GMCMFHPQVQ MKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PSFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNP--PSFL GMCMFHPQVR SKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNP--PSFL GMCMFHPQVR SKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PGFL GMCMFHPQVQ RKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PGFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PGFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNL--PSFL GMCMFHNQVQ CKGE--LVLP DNVNENSVEF MYRRHHSLSD
-             -CNS--PSFL GMCMFHNQVP NKGA--LVLP DNVNENSVEF MYRRHHSLSD
-             -CNS--PSFL GMCMFHNQVS FKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PSFL GMCMFHNQVS VKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PSFL GMCMFVNQVS FKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             -CNS--PSFL GMCMFHVQVQ FKGE--LVLP DHPNENSVEF MYRRHHSLSD
-             -CSY--PSFL PMCMFVPQVL SKGE--LVLP DSSNEESISF VYLQHHSFSV
-             -CSY--PSFL PMCMFVSQVL SKGE--LVLP DSSNEESISF VYLQHHSFSD
-             -CSV--PSFL PMCMFVSQVL HKGE--LVLP DSSNEESISF VYLQHHSFSD
-             -CSV--PSFL PMCMFVSQVL HKGE--LVLP DSSNEESISF VYLQHHSFSE
-             -CSY--PSFL PMCMFVAQVI AKGE--LVLP DSSTEESISF MYLQHHSFSD
-             -CSY--PSFL PMCMFVAQVI AKGE--LVLP DSSTEESISF MYLQHHSFSD
-             -CSY--PSFL PMCMFVAQVI AKGE--LVLP DSSNEESISF MYLQHHSFSD
-             -CSY--PSFL PVCMFVAQVI NKGE--LVLP DSSNEESISF MYLQHHSFSE
-             -CSH--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSH--PSFL GMCMFVEQVR CKGE--LVLP DSPNEESLSF VYIQHHSFSD
-             -CSH--PSFL GMCMFHEQVR RKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSH--PSFL GMCMFHEQVR RKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSH--PSFL GMCMFHEQVR RKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSH--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSV--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSV--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             -CSF--PSFL GMCMFHDQVR CKGE--LVLP DSKNEESVSF VYIQHHSFSD
-             -CSF--PSFL GMCMFHEQVR CKGE--LVLS DSKNEESVSF VYIQHPSFSD
-             -CSF--PSFL GMCMFHQQVR CKGE--LVLP DSKNEESVSF VYIQHHSFND
-             -CSF--PSFL GMCMFHEQVR CKGE--LVLP DSKNEESVSF VYIQHHSFSD
-             -CSF--PSFL GMCMFHEQVR CKGE--LVLP DSKNEESVSF VYIQHHSFSD
-             -CSV--PSFL GVCMFQRQVV MKGE--LVLP DSADEGSVSF MYIQHHSFAA
-             VNS---RAFI GVSIYDLKVS HKMI--QACN PIQN------ ---DNHAFSD
-             VNS---RAFI GVSTYDLKVS HKMI--QACN PIQN------ ---DNHAFSD
-             VNS---RAFI GVSTYDLKVS HKMI--QACN PIQN------ ---DNHAFSD
-             VNS---RAFV GVSSYDLRVS HKMI--QACT LIQN------ ---DNVAFSD
-             VNS---RAFI GVSSYDLKVS HKMI--QACN PIQN------ ---DNVAFSD
-
-             KRCLNGLHQG DHEESVH--- HAPRI----M R---LIGH-H LVIIVLMNHD
-             KRCLNGLHQG DHEESVH--- HAPRI----M R---LIGH-H LVIIVLMNHD
-             KRCLNGLHQG DHEESVH--- HAPRI----M R---LIGH-H LVIIVLMNHD
-             KRCINKLHQG DHNESCH--- HNPRI----V R---RIGH-H LVIIVLVNRD
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGL-N LVIISYANVD
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             KRCLNVLVQG DHDESRH--- HNARI----V A---RIGM-N MVIIRYLNVE
-             KRCLNVLVQG DHEESEH--- HNARI----M S---KIGT-H LVIINIINVE
-             KRCLNVLVQG DHEESEH--- HNARI----M S---RIGT-H LVIVNVINVE
-             RRVLNVLHQG DVEES-H--- HSARC----V R---RIGF-H LVIIVFWNVE
-             RRVLNVLHQG DVEES-H--- HSARC----V R---RIGF-H LVIIVYWNVE
-             RRVLNVLHQG DHEES-H--- VSARC----M R---RIGF-H LVIINFWNVE
-             RRVLNVLHQG DHEES-H--- HSARC----M R---RIGY-H RVIINYWNVE
-             RRVLNVLHQG DHEES-H--- HSARC----M R---RIGYGH LVIINFWNVE
-             RRVLNVLHQG DHEES-H--- HSARC----M R---RIGY-V LVIINFWNVE
-             KRCINNLDQG DQEDSNHRKE HKIRASVLLY R---QIGI-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             KRCINGLDNG DRQDSDPQKE HKIRNSVLLY R---QIGL-L -VIIKEANEI
-             KRCLNNLDQG DREDSSHRKE HKIRRSVLLY Q---QIGC-L -VITRERNEL
-             KRCLNGLDHG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKDANSM
-             KRCLNGLDHG DREESPHQIE HKMRKSVLIY S---PIGY-L -VIIKDANSM
-             KRCLNGLDVG DREESPHHID HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             KRCLNALDHG DREESPHQIE HKMRKSVLLY N---PIGY-L -VIIKNANSM
-             KRCLNALDYG DREESPHQIE HKMRKSVLLY Y---TIGW-L -VIIKNADSM
-             KRCLNALDHG DTQESPHGIE HNMRNSVLLY N---PIGF-L -VIIKNINSM
-             KRCLNALDHG DTQESPHGIE HNMRNSVLLY N---PIGF-L -VIIKNINSM
-             KRCLNALDHG DTQESPHGIE HNMRNSVLLY N---PIGF-L -VIIKNINSM
-             KRCLNPLDHG DRQESSHGIE HNMRSSVLLY N---PIGF-L -VIIDNINPM
-             KRCLNPLDHG DRQESPHGIE HNMRSSVLLY N---PIGF-L -VIIDNINPM
-             KRCLNPLDHG DRQESPHGIE HNMRSSVLLY N---PIGF-L -VIIDNINPM
-             KRCLNHLDHG DRQESPHGIE HNMRKSVLLY N---PQGY-L -VIIKNVNSM
-             KRCLNTLDHG DRQESPHGIE HNMRKSVLLY D---PIGY-L -VIIKNVNSM
-             KRCLNALDHG DRQESPHGIE HNMRKSVLLD S---PIGY-L -VIIKNINSM
-             KRCLNALDHG DRQESPHGIE HNMRKSVLLD S---SIGY-I -VIIKNLNSM
-             KRCLNALDHG DRQESPHGIE HNMRKSVLLD S---PIGY-I -VIIKNVNSM
-             KRCLNALDYG DRQESPHGIE HNMRKNVLLD N---PIGH-L -VIIKNENSM
-             KRCLNPLNVG DREDSEHIKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             KRCLNPLNVG DREDSDHVKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             KRCLNHLNVG DREDSEHIKE KHMRV----Y A---SIGG-H -IIIREWNDV
-             KRCLNHLNVG DREDSEHIKE KHMRI----Y A---SIGG-H -IIIREWNEV
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGK-V -VIIKVWNAV
-             KRCLNLLFVG DSQDSQHQRE KQLRI----Y G---RIGK-V -VIIKVWNAA
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGK-V -VIIKVWNAV
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGK-V -VIIKVWNAV
-             KRCLNLLYTG DSQDSQHLRE KQLRI----Y G---RIGR-V -VILQVWNAV
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGR-V -VILQVWNAV
-             KRCLNLLYVG DNQDSQHLRE KQLRM----Y G---EIGK-V -VIIKVVNAV
-             KRCLNLLYVG DNQDSQHLRE KQLRM----Y G---EIGK-V -VIIKVVNAV
-             KRCLNLLYVG DNQDSQHLRE KQLRM----Y G---EIGK-V -VIIKVVNAV
-             KRCLNLLYVG DNQDSQHLRE KQLRI----Y Q---NIGK-V -VIIKVWNAN
-             KRCLNLLYVG DNQDSQHLRE KQLRI----Y P---SIGK-V -VIIKVWNAA
-             KRCLNLLYVG DEQDSSHLRE KQLRL----Y A---RIGK-V -VIIKVWNAV
-             KRCLNLLYVG DNQDSSHLRE KQLRL----Y A---RIGK-V -VIIKVWNAV
-             KRCLNLLYVG DNQDSSHLRE KQLRL----Y A---RIGK-V -VIIKVWNAV
-             KRCLNLLYVG DNQDSQHLRE KQLRI----Y A---RIGK-V -VIIKVWNAV
-             KRCLNYLNVG DSADSKHLKE KHLRA----E GMPGNIGK-H -VIINVWNAV
-             KRCLNYLNVG DNSDSKHLKE KHLRA----Q GMPGNIGK-H -VIINVWNAV
-             KRCLNYLNVG DNADSKHLKE KHLRA----Q GMPGNIGK-H -VIINVWNAV
-             KRCLNYLNVG DNADSRHLKE KHLRA----Q GMPGNIGK-H -VIISVWNAV
-             KRCLNYLNVG DNEDSKHAKE KFLRG----D G---GIGQ-H -VIINVWNAV
-             KRCLNYLNVG DNEDSKHAKE KFLRG----D G---GIGQ-H -VIINVWNAV
-             KRCLNCLNVG DNEDSKHLKE KFLRA----D G---GIGQ-H -VIINMWNAV
-             KRCLNYLNVG DNEDSKHLKE KFLRA----D G---NIGQ-H -VIINMWNAV
-             KRCLNCLNVG DNDDSEHLKE KHLRI----Y G---QIGH-H -VIINVWNAF
-             KRCLNCLNVG DNDDSEHLKE KHLRI----Y G---QIGR-H -VIINVWNAF
-             KRCLNCLNVG DNDDSEHLKE KHLRI----Y G---QIGR-H -VIINVWNAF
-             KRCLNCLNAG DNDDSEHLKE KHLRT----Y G---QIGR-H -VIINVWNAF
-             KRCLNCLNVG DNDDSEHLKE KHLRV----Y G---QIGR-H -VIINVWNAF
-             KRCLNYLNVG DNDDSEHLKE KHLRI----Y G---VIGK-H -VIINVWNAF
-             KRCLNYLNVG DNDDSEHLKE KHLRI----Y G---EIGK-H -VIINVWNAF
-             KRCLNYLNVG DNDDSEHIKE KHLRI----Y G---EIGK-H -VIINVWNAF
-             KRCLNYLNVG DNEDSEHLKE KHLRV----Y G---NIGK-H -VIINSWNAM
-             KRCLNYLNVG DNEDSEHLKE KVLRV----Y G---DIGK-H -VIINVWNAM
-             KRCLNYLNVG DNEDSEHLEE KHLRV----Y G---NIGK-H -VIINVWNAM
-             KRCLNELNVG DNEDSIHLKE KHLRI----Y G---NIGK-V -VIINVWNAM
-             KRCLNSLNVG DNEDSIHLKE KHLRI----Y G---DIGK-H -VIINVWNAM
-             KRCLNVLNVG DNEDSVHLRH KQLRV----Y G---KIGK-H -VIISVPNAI
-             QRCLNDLSQG VVGASFPKMQ HGVRH----Y K---K----- ---RVYENEV
-             QRCLNDLAQG VVGASHPKMQ HGVRH----Y K---K----- ---RVYENEV
-             QRCLNDLAQG VVGASHPKMQ HGVRH----Y K---K----- ---RVYENEV
-             QRPLNDLNQG CVGTSHPKMP HGVRH----Y K---K----- ---KVYENEV
-             QRVLNDLSQG CVGTSHPKMP HGVRH----Y K---K----- ---RVYENEV
-
-             MGRLNHLEPD AVIPSPLRIG GDGWVPKPI- ---------- -------EDG
-             MGRLNHLEPD AVIPSPLRIG GDGWVPKPI- ---------- -------EDG
-             MGRLNHLEPD AVIPSPLRIG GDGWVPKPI- ---------- -------EDG
-             MGRLNYIEPD ALVPSPLRFG GDEWVPKPI- ---------- -------EDG
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------GDG
-             MGRLNHCEDQ AIVYSPLRYG GAGFVSKPI- ---------- -------ADG
-             MGRLNHCEDQ AIVYSPLRYG GAGFVSKPI- ---------- -------ADG
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------ADG
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------ADG
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------ADG
-             MGRLNHCEDD AMVYSPLRIG GAGTHSKPI- ---------- -------ADG
-             MQRLNHCEDK AIVYSPDRIG GAGFHSKPI- ---------- -------ADG
-             MQRLNHCEDK AIVYSPDRIG GAGFHSKPI- ---------- -------ADG
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPV- ---------- -------DDG
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPV- ---------- -------DDG
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------NDG
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------ADG
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------ADG
-             MGRLIHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------ADG
-             MNRLNHKEPE NGIIFPLR-- -DAQDPKQI- ---------- -------LNG
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKERK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKERK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             MGRLNHKEPR DGVIFPHR-- -GAQGPKQL- ---------- -------ANG
-             MGRLNHHESR AVVAFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESR AIVAFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESR LIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHYESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             MGRLNHHESC AIVMFPLR-- -GAEGPKQI- ---------- -------IEG
-             MGRLNHHESC AMVMFPLR-- -GAEGPKQI- ---------- -------MEG
-             MGRLNHHESR AVVGFPLR-- -GAENPKQI- ---------- -------MEG
-             MGRLNHHESR AVVGFPLR-- -GAENPKQI- ---------- -------MEG
-             MGRLNHYESR AVVGFPLR-- -GAENPKQI- ---------- -------MEG
-             MGRLNHHESR AIVTFPLR-- -GAEHPKQI- ---------- -------VEG
-             MGRLNHHESR AIVTFPLR-- -GAEHPKQI- ---------- -------MEG
-             MGRLNHHESR AIVTFPLR-- -GAEHPKQI- ---------- -------MEG
-             MGRLNHHESR AVVTFPLR-- -GADNPRQI- ---------- -------MEG
-             MGRLNHHESR AKVTFPLR-- -GADNPRQI- ---------- -------MEG
-             MGRLNHHESR AVFAFPLR-- -GAENPKQI- ---------- -------MEG
-             MGRLNHHESR AVVTFPLR-- -GAEDPKQI- ---------- -------MEG
-             MGRLNHHESR AVVTFPLR-- -GAEDPKQI- ---------- -------MEG
-             MGRLNHHESR AVVTFPLR-- -GAEDPKQK- ---------- -------MEG
-             MGRLNHIEPG AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             MGRLNHIEPG AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             MGRLNHIEPG AEVTFPLRR- -RGQASKPV- ---------- -------IDG
-             MGRLNHIEVG AEVTFPLRR- -RGQASKPV- ---------- -------IDG
-             MGRLNHHEPP AEVMFPLRK- -GGQDSKPF- ---------- -------IDG
-             MGRLNHVEPP AEVMFPLRR- -GGSDSKPF- ---------- -------LDG
-             MGRLNHHEPP AEVMFPLRR- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVMFPLRR- -GGSCSKPF- ---------- -------VDG
-             MGRLNHHEPP AEVMFPLRK- -GGSNSKPV- ---------- -------YDG
-             MGRLNHHEPP AEVMFPLRK- -GGSNSKAV- ---------- -------YDG
-             MGRLNHVEPS AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPS AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPS AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AAVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVMFPLRK- -CGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVVFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVVFPLRK- -GGSDSKPF- ---------- -------IDG
-             MGRLNHHEPP AEVVFPLRQ- -GGPDSKPM- ---------- -------IDG
-             MGRLNHHESP AEVVFPLRQ- -GGPDSKPM- ---------- -------IDG
-             MGRLNHHEPP AEVVFPLRQ- -GGPDSKPM- ---------- -------IDG
-             MGRLNHHEPP AEVVFPLRQ- -GGPDSKPM- ---------- -------MDG
-             MGRLNHHEPP PEVVFPLRQ- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPP PEVVFPLRQ- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPP PEVVYPLRQ- -GGPNSKPM- ---------- -------VDG
-             MGRLNHHEPP AEVNFPLRQ- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPP AEVVYPLRK- -GGPDSK-M- ---------- -------VDG
-             MGRLNHHEPP AEVVYPLRK- -GGPDSKPV- ---------- -------VDG
-             MGRLNHHEPP AEAVYPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPP AEVVYPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPP AEVVYPLRK- -GGPDSKLM- ---------- -------VDG
-             MGRLNHHEPP ADVEYPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPP AEVMYPLRK- -GGPESKPM- ---------- -------VDG
-             MGRLNHHEPP AEVMYPLRK- -GGPESKPM- ---------- -------VDG
-             MGRLNHHEPA AEVVYPLRK- -GGPESKPM- ---------- -------VDG
-             MGRLNHHEPA AEVVCPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPA AEVVCPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPA AEVVYPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPA AEVVYPLRK- -GGPDSKPM- ---------- -------VDG
-             MGRLNHHEPS AIVVFPLRQ- -RGADSKSV- ---------- -------GDG
-             GGRLDDAEAI DDMGVWIRW- -EGVKHAWCH PIGSCPDHLV CSLLVLQPAR
-             GGRLDDAEAI DDMGVWIRW- -EGVKHAWCH PIGSCPDHLV CSLLVLQPAR
-             GGRLDDAEAI DDMGVWIRW- -EGVKHAWCH PIGSCPDHLV CSLLVLQPAR
-             GDRLDDAEGI DDVGVWMRW- -NGVKHAWCH IIGSCPDHLV CSLLVLQPGR
-             GDRLDDAEAV DDVGVWMRW- -AGVKVAVCH VIGSCPDHLV VSLLVLQPAR
-
-             FFDK-D-Q-- ----SRPDVA NASIVPDK-- --DQWVGAHN QWGSSLRKVG
-             FFDK-D-Q-- ----SRPDVA NASIVPDK-- --DQWVGAHN QWGSSLRKVG
-             FFDK-D-Q-- ----ARPDVA NASIVPDK-- --DQWVGAHN QWGSSLRKVG
-             FFDK-D-Q-- ----ARPDVA NA-IVPDR-- --DQWVGAHK EWGSSLCKVG
-             FFDK-D-Q-- ----ARPLMA NAVCVPEN-- --DQWTGAVG QWCSSVVKCG
-             FFDK-D-Q-- ----ARPLMA NAVCVPEN-- --DQWTGAVG QWCSSVVKCG
-             FFDK-D-Q-- ----ARPLMA NAVCVPEN-- --DQWTGAVG QWCSSVVKCG
-             FFDK-D-Q-- ----ARPLMA NAHCVPEN-- --DQWTGAVG QWCSSVVKCG
-             FFDK-D-Q-- ----ARPLMA NAHCVPEN-- --DQWTGAVG QWCSSVVKCG
-             FFDK-D-Q-- ----ARPLMA NAHCVPEN-- --DQWTGAVG QWCSSVVKCG
-             FFDK-D-Q-- ----ARPLIA NAHIVPEN-- --DQWTGAVA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPIIA NAHIVPVN-- --DQWTGPMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPIIA NAHIVPIY-- --DQWTGPMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPVIA SAHIVPEH-- --DQWSGAMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPVIA SAHIVPEH-- --DQWSGAMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEH-- --DQWSGAMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEY-- --DQWSGAMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEY-- --DQWSGAMA QWCSSVIKCG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEY-- --DQWSGAMP QWVSSVIKCG
-             LFDK-E-E-- ----NRPMVQ DADSVVGS-- --AQWAGQHR SWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             LFEK-E-E-- ----NRPMVQ DAGSVPER-- --AQWPGQQR AWCSSDDKA-
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             HFDK-E-E-- ----ARPIVQ DAASVPGK-- --AQWVGRVR AWCSSDVKA-
-             HFDK-E-E-- ----ARPIVQ DAASVPGK-- --AQWVGRVR AWCSSDVKA-
-             HFDK-E-E-- ----ARPIVQ DAASVPEK-- --AQWVGRVR AWCSSDVKA-
-             HFDK-E-E-- ----ARPIVK DAASVPGK-- --AQWVGRIR AWCSSDVKA-
-             HFDK-E-E-- ----ARPIVQ DAASVPGE-- --AQWVGHIR AWCSSDIKA-
-             HFDK-E-E-- ----ARPIVQ DAASVPGE-- --AQWVGHIR AWCSSDIKA-
-             HFDK-E-E-- ----ARPVVQ DAPGVPGK-- --AQWVGKVR AWCSSDVKA-
-             HFDK-E-E-- ----ARPVVQ DAPGVPEQ-- --AQWVGKMR AWCSSDVKA-
-             HFDK-EKE-- ----ARPVVQ DAPGVPGK-- --AQWVGRIR AWCSSDVKA-
-             HFDK-E-E-- ----ARPVVQ DAPGVPGK-- --AQWVGRVR AWCSSEIKT-
-             HFDK-E-E-- ----ARPVVQ DAPGVPGK-- --AQWVGRVR AWCSSEIKT-
-             SFDK-E-E-- ----ARPVVQ DAPGVPGR-- --AQWVGRVR PWCSSDVKA-
-             FFAK-D-E-- ----DRPGIQ NAVSVPCG-- --DQWVGSIR GWCSSQHRYG
-             FFAK-D-E-- ----DRPGIQ NAMSVPCG-- --DQWVGSIR GWCSSQHRYG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             FFAK-D-E-- ----DRPGIQ NAMSVPCG-- --DQWVGSVR GWCSSQHRYG
-             FFAK-D-E-- ----DRPGIQ NAMSVPCG-- --EQWVGSVR GWCSSQHRYG
-             FF-------- ----DRPGIA NAMSVKCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPAIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGSIK GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGSIK GWCSSQHQYG
-             FF-------- ----DRPGIA NAMNVPCG-- --DQWVGCIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGCIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGIIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGVIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGVIR GWCSSQHQYG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGVIR GWCSSQHQYG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             FFDK-D-D-- ----DRPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHKFG
-             FFDK-D-D-- ----DRPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHKFG
-             FFDK-D-D-- ----DRPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHRFG
-             FFDK-D-D-- ----DSPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHKFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVNFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             FFDK-E-D-- ----HRPGIA NAVSVPCA-- --DQVGGPLR GWCSSQVKFG
-             FFDK-E-D-- ----ERPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCG-- --DQVGGPIR GWCSSQVKFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCT-- --DQVGGPIR GWCSSQVKFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             FFDK-E-D-- ----DRPGIA NAVSVPCD-- --DQWGGPVR GWCSSQHKFG
-             FFDK-E-D-- ----DRPGVA NAVSVPCD-- --DQWGGPVR GWCSSQHKFG
-             FFDK-E-D-- ----DRPGVA NAMSVPCD-- --DQWGGPVR GWCSSQHKFG
-             FFDK-E-D-- ----DRPGIA NAVAVPCS-- --DQWGGPVR GWCSSQHKFG
-             FFDK-E-D-- ----DRPGIA NAVAVPCS-- --DQWGGPVR GWCSSQHKFG
-             FYDK-D-E-- ----DRPGIA NAVSVPVA-- --EQWVGSVR GWYSSEHKYG
-             NFIQLS-MVR DTPHRLPKMA SAAPVYKQTC HLEQVQGTAR MWGKSGPRVV
-             NFIQLS-MVR DTPHGLPKMA SAAPVYKQTC HLEQVQGTAR MWGKSGPRVV
-             NFIQLS-MVR DTPHGLPKMA SAAPVYKQTC HLEQVQGTAR MWGKSGPRVV
-             NFIQLS-VVH DTPHRLPKMA SAAAVFKQTC HLEQVPGTAR MWGKSGPRVR
-             NFIQLS-VVH DTPHRLPKMA SAAAVFKQTC HLEQVAGTAR VWGKSGPRVK
-
-             LAVHDLR-NI SDLYRCVWMD CHLGANHYRQ ISRMKMITPT YTHMTEYANG
-             LAVHDLR-NI SDLYRCVWMD CHLGANHYRQ ISRMKMITPT YTHMTEYANG
-             LAVHDLR-NI SDLYRCVWMD CHLGANHYRQ ISRMKMITPT YTHMTEYANG
-             LAVHDLR-NV SDLYRCVWME CVLGANHYQQ VSRMKMVTPA YTHMTEYANG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             LADHPLE-NI SRLLRCVVME CILGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             LANHDLE-NI SRLLRCVVME CVLGANVYHQ ASRMKMHGPY YAHVTEYAHG
-             LANHELE-DV SRLLRCVGME CNLGANHYHQ VSRMKMHGPI YSHMTEYAVG
-             LANHELK-VV SRLLRCVGME CNLGANHYHQ VSRMKMHGPI YSHMTEYAHG
-             LANHDLE-NV SRLLRCVMID CNQGANHYIQ ISRMKVHGPT YSHMTEYAHG
-             LANHDLE-NV SRLLRCVMID CNQGANHYIQ ISRMKVHGPT YSHMTEYAHG
-             LANHDLE-NV SRLLRCVEID CNQGANHYVQ ISRMKMYGPT YSHMTEYAHG
-             LANHDLE-NV SRLLRCVVID CNHGANHYVQ ISRMKMHGPT YSHMTEYAHG
-             LANHDLE-NV SRLLRCVVID CNHGANHYVQ ISRMKMHGPT YSHMTEYAHG
-             LANHDLE-NV SRLLRCVVID VNQGANHYVQ ISRMKMHGPT YSHMTEYAHG
-             ---------- SQLPRNTHIV VEIGANVYEQ FSRMKTNIPI YAHVTEYAVG
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTVIPI YARVTEYAVG
-             ---------- SQLPRNTRIV AEVGANVYEQ YSRMKTVIPI YARVTEYAVG
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             ---------- SKLPRNTKMV AEIGANVYEQ ASRMKTNIPI YAHVTEYALG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SHLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             ---------- SRLPRNDPVV HEVGANVYQQ ISRMKTSIPI YAHVTEYAVG
-             ---------- SQLPTNDPIV PEVGANVYQQ VSRMKTSIPI YAHVTEYAVG
-             ---------- SKLPRNDPIV PEVGANVYQQ LSRMKTNIPI YAHVTEYAVG
-             ---------- SKLPRNDPIV PEVGANVYQQ LSRMKTNIPI YAHVTEYAVG
-             ---------- SKLPRNDPIV PEVGANVYQQ ISRMKTNIPI YAHVTEYAVG
-             ---------- SQLPRNDPIV PEVGANVYQQ DSRMKTNIPI YAHVTEYACG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI YAHTTEYACG
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI YAHTTEYACG
-             ---------- SQLPRNDTIV PEVGANVYQQ VSRVKTHIPI YAHVTEYAVG
-             ---------- SQLPRNDTIV PEVGANVYQQ VSRVKTNIPI YAHVTEYAVG
-             ---------- SELPRNDAIV PEVGANVYQQ VSRMKTNIPI YAHATEYAVG
-             ---------- SELPRNDAIV VEVGANVYQQ ISRMKTDIPI YAHATEYAVG
-             ---------- SELPRNDAIV PEVGANVYQQ ISRMKTDIPI YAHATEYAVG
-             ---------- SELPRNDAIW PEVGANVYQQ ISRMKTNIPI YPHVTEYAVG
-             LANHILVHEP SKLHKTYRIN RKVGANAYDQ DSRMKAAAPV YPHIMEYAHG
-             LANHILVHEP SKLHKTYRIN RKVGANAYDQ DSRMKAAAPV YPHIMEYAHG
-             LANHILVHEP SKLHKTYKIN RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             LANHILVHEP SKLHKTYKIN RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             LANHILVHEP SKLHKTYKIN RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             LANHILVHEP SKLHKTYKVV RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             LAIHILVHQQ SRLHKTYNID RKNGANAYEQ DSRMKAGAPV YPHIMEYAHG
-             LAIHILVHQQ SRLHKTYNID RKNGANAYDQ DSRMKAGAPV YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             LANHILIHGP SKLHRTYAIN KKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             LANHILVHNP SRLHRTYAIN KKMGANVYQQ SSRMKAAAPL YPHIMEYAHG
-             LANHILIHNP SRLHRTYAIN KKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN RKVGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN RKVGANVYQQ MSRMKAAAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ ISRMKALAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ ISRMKALAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ ISRMKALAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ TSRMKAAAPI YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN RKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             LANHVLVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             LASHTLSHDP SSLHRTFAIN RKMGANVYQQ TSRMKASAPF YPHCMEYAHG
-             LASHTLSHDP SNLHRTFAIN RKMGANVYQQ ASRMKASAPF YHHCMEYAHG
-             LASHTLSHNP SNLHRTFAIN RKMGANVYQQ TSRMKASAPF YHHCMEYAHG
-             LASHTLSHTP SNLHRTFAIN RKMGANVYQQ TSRMKASAPF YHHCMEYAHG
-             LAFHTLSHDP SKLHRTFAIN QKMGANVYQQ MSRMKTPAPF YPHVMEYAHG
-             LAFHTLSHDP SKLHRTFAIN QKMGANVYQQ MSRMKTPAPF YPHVMEYAHG
-             LAFHTLKHDP SKLHRTFAIN EKMGANVYQQ NSRMKASAPF YPHVMEYAHG
-             LASHTLSHDP SKLHRTFGIN KNMGANVYQQ TSRMKANAPF YPHVMEYAHG
-             LANHTLVQ-P SKLHRTFKIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             LANHTLVQ-P SKLHRTFKIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             LANHTLVQ-P SKLHRTFKIN KKMGANVYHQ TSRMKAEAPV YPHIMEYAHG
-             LANHTLVQ-P SKLHRTFKIN KKIGANVYQQ TSRMKADAPV YPHIMEYAHG
-             LANHTLVQ-P SKLHRTFKIN KKIGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             LANHTLAQNP SKLHRTFKIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             LANHTLVHNP SKLHRTFAIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             LANHTLVHNP SKLHRTFAIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             LADHTLIHIP SKLHRTFAIN KKMGANVYQQ TSRMKAAAPV YSHVMEYAHK
-             LADHTLVHIP SKLHRTFAIT KKMGANVYQQ TSRMKATAPV YPHVMEYAHG
-             LADHTLVHVP SKLHRTFPIN KKMGANVYQQ TSRMKATAPV YPHVMEYAHG
-             LADHTLVHVP SLLHRTFAIN RKMGANVYQQ TSRMKAAAPV YPHMMEYAHG
-             LADHTLVHVP SLLHRTFAIN KKMGANVYQQ TSRMKAAAPV YPHMMEYAHG
-             LANHILI-GP SKLHRTYQTT AKMGANVVKA TNRMKRPQPV YPHVMEYANG
-             LNGHMLK-TQ NTLHRQYLVD VELQATMVFV AARMKTDSSM YMSVREILHG
-             LNGHMLK-TQ NTLHRQYLVD VELGATMVFV AARMKTDLSM YMSVREILHG
-             LNGHMLK-TQ NTLHRQYLVD VELGATMVFV AARMKTDLSM YMSVREILHG
-             LNGHVLK-NQ NILHRQYLVD VNLGATMVFV LARMKTDASM YMSHREILHG
-             LNGHVLK-NQ NVLHRQYLVD VDLGATMVFV AARMKTDASM YMSHREILHG
-
-             L----WHPFY KASDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             L----WHPFY KASDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             L----WHPFY KASDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             L----WHPFY KNPDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             L----WKPFY QASDHKNEAQ GVGER-THQL PCVESHTCQY EVKHAKVCKL
-             L----WKPFY QASDHKNEAQ GVGER-THQL PCVESHTCQY EVKHAKVCKL
-             L----WKPFY QASDHKNEAQ GVGER-THQL PCVESHTCQY EVKHAKVCKL
-             M----WKPFY QASDHKNEAQ GVGER-THQL PCVDSHTCQY EVKHAQVCKL
-             M----WKPFY QASDHKNEAQ GVGER-THQL PCVDSHTCQY EVKHAQVCKL
-             M----WKPFY QASDHKNEAQ GVGER-THQL PCVDSHTCQY EVKHAQVCKL
-             L----WKPFY QTSDHKNEAQ GVGES-THQL PCVESQTCQY EVKHAKVCKL
-             L----WKPFY QASEHKNEAQ GLGER-PHQL PCVESQTCQY EIKVAKVCKL
-             L----WKPFY QASEHKNEAQ GVGER-PHQL PCVESQKCQY EVKVAKVCKL
-             L----WKPFY QASDHKNDAQ GVGER-PHQL PCVESQTCQY EMKHAKVCKL
-             L----WKPFY QASDHKSDAQ GVGER-PHQL PCVESQTCQY EMKHAKVCKL
-             L----WKPFY QASDHKNDAQ GVGER-PHQL PCVESQTCQY EVKHANVCKL
-             L----WKPFY QASDHKNDAQ GVGER-PHQL PCVEPQTCQY EVKHAKVCKL
-             L----WKPFY QASDHKNDAQ GVGER-THQL PCVEPQTCQY EVKHAKVCKL
-             L----WKPFY QASDHKNDAQ GVGER-VHQL PCVEPQTCQY EVKHAKVCKH
-             V----ERPFY E-SEFKNEAQ GWGES-GTSI PCVDSPDVQY EMKVAWVDKL
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----PRPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----PRPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----ARPFY D-AEFKNEAQ RQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             V----DRPFY D-SEFKNEAQ GQGES-GTSI PCVDSPDVQY ELKHAWVDKL
-             I----VKPFY D-NEWKQEAQ GQGEA-GACI PCVDSKDVQY ELKHAYVKKL
-             I----VKPFY D-NEWKQEAQ GQGEA-GACI PCVDSKDVQY ELKHAYVKKL
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             I----IKPFY D-NEWKQEAQ GQGEA-GASI PCVNSPDVQY ELKHAHIKKL
-             I----VKPFY D-NEWKQEAQ GQGEA-GASI PCVNSPDVQY ELKHAHIKKL
-             I----VKPFY D-NEWKQEAQ GVGEA-GASI PCVDSPDVQY ELKHAEVRKL
-             I----VKPFY D-NEWKQEAQ GVGEA-GASI PCVDSPDVQY ELKHAEVRKL
-             I----VKPFY D-NEWKQEAQ GVGEA-GASI PCVDSPDVQY ELKHAEVRKL
-             I----VKPFY E-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             I----VKPFY E-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHANVKKL
-             I----VKPFY E-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHANVKKL
-             I----VKPFY N-NEWKQEAQ GQGEA-GASI PCVDSPDDQY ELKHAEVKKL
-             I----VKPFY N-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             I----VKPFY D-NEWKQEAQ GQGET-GASI PCVDSPDVQY EMKHAEVKKL
-             I----VKPVY D-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             I----VKPVY D-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             I----VKPFY L-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNK PCVESEDCQY EKKHASMDKL
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNK PCVESEDCQY EKKHASMDKL
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             M----FNPFY GMSEPKNNAQ GNGEN-PMNV PCVESDDCQY EKKHASMDKQ
-             M----FVPFY GMSEPKNNAQ GNGEN-PMNV PCVESDDCQY EKKHASMDKQ
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECQY EHKHAAMEKL
-             M----VKPFY GQSEPKNEAQ GNGEN-PMNV PSVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECVY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECVY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PCVESGECQY ENKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PCVESGECQY ENKHAAMEKL
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PCVESGECQY ENKHAAMEKL
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             M----VEPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIDCQY ENKHATMTKL
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESRDCQY ENKHATMTKL
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIDCQY ESKHAAMTKL
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIDCQY ENKHATMTKL
-             V----CKPFY EHSEPKNEAQ GNGEKVPMNV PCVESMDCQY ENKHAPMAKL
-             V----CKPFY EHSEPKNEAQ GNGEKVPMNV PCVESMDCQY ENKHAPMAKL
-             V----CKPFY EHSEPKNDAQ GNGDKVPMNV PCVESMDCQY ENKHAPMAKL
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIECQY ENKHATMAKL
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             V----YKPFY ERSEPKNEAQ GNGEK-QGNV PCVESVECQY ENKHAIMAKL
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             V----CKPFY DRSEPKNEAQ GNGEK-QGNV PCVESMDCQY ENKHAIMAKL
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMDCQY ENKHAIMAKL
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMDCQY ENKHAIMAKL
-             V----VKPFY ARSEPKNEAQ GNGEK-QWNV PCVESMDCQY ENKHATMAKL
-             V----VKPFY DRSEPKNEAQ GNGEK-QWNV PCVESMDCQY ENKHATMAKL
-             V----IKPFY DRSEPKNEAQ GNGEK-QWNV PCVESMDCQY ENKHATMAKL
-             V----VKPFY ERSEPKNEAQ GNGEK-QWNV PCVQSVDCQY ENKHATMAKL
-             V----VKPFY ERSEPKNEAQ GNGEK-QWNV PCVQSVDCQY ENKHATMAKL
-             V----VKPFY EVAESKNEAQ GNGEK-PVNV PCVESPDCQY ESKHARVNKL
-             ---------- --CGIKDEAQ ADGQR-PATL IVVLSKDNKG ITEHGAVLKK
-             ---------- --CGIKDEAQ ADGQR-PATL IVVLSKDNKG ITEHGAVLKK
-             ---------- --CGIKDEAQ ADGQR-PATL IVVLSKDNKG ITEHGAVLKK
-             GTFDAAKPFR QICGTKDEAQ PDGRR-PATL LVVLSKDNQG ITEHGAVLKH
-             GTFDAAKPFR QICGVKDEAQ PDGQR-PATL LVVLSKDNVG ITEHGAVLKH
-
-             VHG-ALYLIG MKTVVKPLLG DWEGCKCRS- --KLYVSQLD H----KTLSK
-             VHG-ALYLIG MKTVVKPLLG DWEGCKCRS- --KLYVSQLD H----KTLSK
-             VHG-ALYLIG MKTVVKPLLG DWEGCKCRS- --KLYVSQLD H----KTLSK
-             VHG-ALYLIG MKTVAKPVLG DWEGCKCRSD LIKLYVSQLD H----KTLSK
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             VHH-ALYLLG IHTVMKPHLG NVDGCRCRSD LNNLILSQLD D----KTLSK
-             VHH-ALYLLG IHTVMKPHLG NVDGCRCRSD LNNLILSQLD D----KTLSK
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             VHH-ALYLLA LHTMMKPRLG DIDGCRCRSE LNKLALSQLD D----KTLSK
-             VHV-ALYLVG LKTVVKPKLG DWDGIRCRSE LNKLYLSQLD D----KTLSK
-             VHV-ALYLVG LKTVVKPKLG DWDGVRCRSD LNKLYLSQLD D----KTLSK
-             VHG-ALYLIA LKTVVKPKLG VWQGCRCRSQ LSKLVLSQLD E----KTLSK
-             VHG-ALYLIA LKTVVKPKLG VWQGCRCRSQ LSKLVLSQLD E----KTLSK
-             VHA-ALYLIG LKTVVKPELG VWEGCRCRSQ LSKLALSQLD E----KTLSK
-             VHG-ALYLIG LQTVVKPKLG VWEGVQCRSQ LSKLILSQLD D----KTLSK
-             VHG-ALYLIG LQNVVKPKLG VWEGVQCRSQ LSKLILSQLD D----KTLSK
-             VHG-ALYLIG LQTVVKPKLG VWEGCQCRSQ LSKLILSQLD D----KTLSK
-             MHT-ALYLMP LATVHKPEMG TVRGERCRAI L-KLLMMQLD ------TLSR
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHS-ALYLMP LATVHKPQMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHS-ALYLMP LSTVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             MHT-ALYLMP LPTVHKPKMG TVKGERCRAM L-KLNMMQLD E----KTLSQ
-             MHT-SLYLMH IETCHKPVMG TVKGNRCRAI L-KLSMIQLD Q----KTLSQ
-             MHT-SLYLMH IETCHKPVMG TVKGNRCRAI L-KLSMIQLD Q----KTLSQ
-             VHT-SLYLMH IDTCHKPVMG TIKGNRCRAI L-KLTMIQLD Q----KTLSQ
-             VHN-SLYLMH IDTCHKPAMG TVKGNRCRAI L-KLTMIQLD Q----KTLSQ
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD Q----KTLSQ
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD V----KTLSQ
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD V----KTLSQ
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD V----KTLSQ
-             MHT-SLYLMH LGTCHKPVMG TVKGDRCRAI L-KLSMIQLD Q----KTLSQ
-             MHT-SLYLMH LKTCHKPVMG TVKGDRCRAI L-KLKMIQLD Q----KTLSQ
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLPMIQLD Q----KTLSH
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLPMIQLD Q----KTLSH
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLPMIQLD Q----KTLSH
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLSMIQLD E----KTLSQ
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLNMIQLD Q----KTLSQ
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLNMIQLD Q----KTLSQ
-             MHD-SLYLPH LETCHKPIMG TVKGGRCRAS L-KLKMIQLD Q----KTLSQ
-             MHD-SLYLPH LETCHKPIMG TVKGGRCRAS L-KLNMIQLD Q----KTLSQ
-             MHD-SLYLMH IETCHKPIMG TVKGDRCRAT L-KLKMIQLD Q----KTLSQ
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAT L-KLKMIQLD Q----KTLSQ
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAT L-KLKMIQLD Q----KTLSQ
-             MHD-SLYLWH LETCVKPIMG TVKGDRCRAT L-KLKMIVLD P----KTLSQ
-             MHQ-SLYLMH INIMSKPAMG EWVGNRCRNE LTALRIIQLD VGVSGKTLGQ
-             MHQ-SLYLMH INVMSKPAMG EWVGNRCRND LTALRIIQLD VGHSGKTLGQ
-             MHQ-SLYLMH INIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             MHQ-SLYLMH INIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             MHQ-SLYLMH VNIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             MHQ-SLYLMH INIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             MHQ-SLYLMH MNIMSKPAMG EWVGNRCRNE LTALHVVQLD VGFSGKTLGQ
-             MHQ-SLYLMH MNIMSKPAMG EWVGNRCRNE LTALHIVQLD VGFSGKTLGQ
-             MHH-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALQTVQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMPKPVMG DWDGNRCRAE LTALQTVQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALQTVQLD VGSSEKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALQTVQLD LGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGHRCRAE LTELQTVQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGHRCRAE LTELQTVQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTGQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTGQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTGQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTVQLD VGSNGKTLGK
-             MHQ-SLYLMR VNTMSKPVLG DWVGNRCRAE LTALKTVQLD IGNSGKTLGQ
-             MHQ-SLYLMR ANTMSKPVMG DWVGSRCRAE LTALKTVQLD VGSSGKTLGQ
-             MHQ-SLYLMR ANTMSKPVMG DWVGSRCRAE LTALKTVQLD VGSSGKTLGQ
-             MHQ-SLYLMR ANTMSKPVMG DWVGSRCRAE LTALKIVQLD VGSSGKTLGQ
-             MHQ-SLYLMR VNTMSKPIMG DWVGNRCRAD LTALKTVQLD VGSSGKTLGQ
-             MHH-SLYLMR MHTMSKPIMG DVNGNRCRAD LTALKMLQLD IGFSAKTLGQ
-             MHQ-SLYLMR MHTMSKPIMG HVNGNRCRAD LTALKMLQLD IGFSAKTLCQ
-             MHQ-SLYLMR IHTMSKPIMG DVNGNRCRAD LTALKMLQLD IGFSAKTLGQ
-             MHQ-SLYLMR MHTMSKPIMG DVNGNRCRAD LTALKMLQLD IGFSAKTLGQ
-             MHQDSLYLMR MHTMSKPLMG DVNGNRCRAD LTSLKMLQLD IGFCAKTLGQ
-             MHQ-SLYLMR MHTMSKPLMG DVNGNRCRAD LTSLKMLQLD IGFCAKTLGQ
-             MHQ-SLYLMR MYTMSKPIMG DVNGNRCRAE LTSLKMLQLD IGFSAKTLGQ
-             MHD-SLYLMR MHTMSKPVMG DVNGHRCRAD LTALKMLQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKVVQLD IGFSSKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAK LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG YVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR MQTMAKPPMG DVDGHRCRAG LTALKIVQLD IGFSQKTLGQ
-             MHP-PLYLVK MQTMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSSKTLGQ
-             MHP-PLYLVK MQTMSKPPMG DVDGHRCRAG LTALQIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGVRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-PLYLMR METMSKPPMG DVDGVRCRAG LTALKIVQLD IGFSAKTLGQ
-             MHP-SLYLMC MEAMNKPIMG DWDGNRCRSP LCLLKVIQLD MGVSGKTLGQ
-             IHP------- ---LCKRCME NGRCLRYKND LTGDQLVQLA D----NTCAW
-             IHP------- ---LCKRCME NGRCLRYKND LAGDQLVQLA D----NTCAW
-             IHP------- ---LCKRCME NGRCLRYKND LAGDQLVQLA D----NTCLW
-             VHP------- ---LCKKDCN NNRCLRCKNV LAGNQLIQLS D----VTCAW
-             VHP------- ---LCKKDCN NNRCLRCKNV LAGNQLVQLA D----ITCAW
-
-             -NLGLY--MQ KRTWLATAPL Q------IGC MFMLVGRKKN SEE-NYNKAA
-             -NLGLY--MQ KRTWLATAPL Q------IGC MFMLVGRKKN SEE-NYNKAA
-             -NLGLY--MQ KRTWLATAPL Q------IGC MFMLVGRKKN SEE-NYNKAA
-             -NMGLY--MR NRTWLATSPL Q------IGC IFMLVGRKKN SEE-NYNKAA
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SAN-NYNRAG
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SAN-NYNRAG
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SAN-NYNRAG
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SGN-NYNQAG
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SGN-NYNRAG
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SGN-NYNRAG
-             -NCFQY--LG NMTWLATSPL H------VGC MIIF------ ----------
-             -NCFIY--LG NMTWLATSPL Q------IGW LVLFDGRKRQ SAE-DYNRAA
-             -NCFRY--LG NMTWLATSPL Q------NGC VVIFAGRKRQ SAE-DYNRAA
-             -NCSIY--LG NMTWLATSPL Q------IGC VILFGGRKRQ SHGLNYNRAA
-             -NCSIY--LG NMTWLATSPL Q------IGC VILFGGRKRQ SHGLNYNRAA
-             -NCSIY--LG NMTWLATSPL Q------IGC IILFGGRKRQ SHGLNYNRAA
-             -NCSIY--LG NMTWLATSPL Q------IGC IIMFDGRKRQ SHGLQYNRAA
-             -NCSIY--LG NMTWLATSPL Q------IGC IILFDGRKRQ SHGLQYNRAA
-             -NCNIY--LG NMTWLATFPL Q------IGC IILFDGRKRQ SYGLQYNRAA
-             -NQLPK--LC QGTWLDASPL Q------IGV QVMLVGKKGG SKK-EYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV KVVLVGKKRG SKK-DYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             -NQIIK--LC QRTWLDASPL Q------IGV NCVLPGKKGG SNK-DYELAA
-             -NQRAK--LC QRTWLDTSPL Q------MGM TLVLVGKKVG SKK-DYEVAA
-             -NQRAK--LC QRTWLDTSPL Q------MGM TLVLVGKKVG SKK-DYEVAA
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLVGKKVG SKK-DYEIAA
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLVGKKVG SKK-DYEIAA
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLVGKKVG SKK-DYEIAA
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLMGKKVG SKK-DYEIAA
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLMGKKVG SKK-DYEIAA
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLMGKKVG SKK-DYEIAA
-             -NVRAR--LC QRTWLDTSPL Q------MGM VAVLLGKKLG SKK-DYEIAA
-             -NQAAR--LC KRTWLDTSPL Q------MGM NVVLIGQKLG SKH-DYEIAA
-             -NQPRR--LC QRTWLDASPL Q------VGM NIMLMGKKAP SKK-DYEIAA
-             -NQPRR--LC QRTWLDASPL Q------VGM NIMLKGKKAP SKK-DYEIAA
-             -NQPRR--LC QRTWLDASPL Q------VGM NIMLMGKKAP SKK-NYEIAA
-             -NQRPG--LC QRTWLDANPL Q------MGM NTMLVGKKTP SKK-DYEIAA
-             -NQRPG--LC QRTWLDASPL Q------MGM HIMLVGKKTP SKK-DYEIAA
-             -NQRPG--LC QRTWLDASPL Q------MGM HIMLVGKKTP SKK-DYEIAA
-             -NQQRR--LC QRTWLDSSPL Q------MGM KIMLQGKKTP SKK-DYEIAA
-             -NQQRR--LC QRTWLDASPL Q------MGM KIMLQGKKIP SKK-DYEIAA
-             -NQKRR--LC QRTWLDASPL Q------MGM KMMLQGKKTP SKK-DYEIAA
-             -NQKKR--LC QCTWLDACPL Q------MGM KIMLQGKKTP SKK-DYEIAA
-             -NQKKR--LC QCTWLDACPL Q------LGM KIMLQGKKTP SKK-DYEIAA
-             -NQKRR--LC QRTWLDASPL Q------VGM KIMLQGKKTP SKK-DYEIAA
-             -NIGVSKLLN DRTWLATSPL E------IGC GVMSVEKKEA SPK-EFEVAA
-             -NIGVSKLLN DRTWLATSPL E------IGC LVMSVEKKEA SGK-EFEVAA
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             -NIGISELLN DRTWLATSPL E------IGC GVMAVEKKEA SPK-EFEVAA
-             -NIGISELLN DRTWLATSPL E------IGC GVMAVEKKEA SPK-EFEVAA
-             -NIVTSKKLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-EVEVAA
-             -NIVTSKKLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-EVEVAA
-             -NIVTSKRLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-EVEVAA
-             -NIVTSKKLG DRTWLAASPL Q------IGC GIMVQEKKIA SPQ-EVEVAA
-             -NIVTSKKLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-QVEVAA
-             -NIVTSKKLG DRTWLAAPPL Q------IGC DVMVQEKKIA SPQ-QVEVAA
-             -NIMTSKKLG DRTWLAANPL Q------IGR GVMVWEKKVA SPQ-EVEVAA
-             -NIMVSKKLG DRTWLAASPL Q------IGC GVMVWEKKVP SPQ-EVEVAA
-             -NIMVSKKLG DRTWLAASPL Q------IGC GVMVWEKKVP SPQ-EVEVAA
-             -NIMTPKKLG DRTWLAASPL Q------IGC GVMVQEKKVA SPQ-EVE-AA
-             -NIMTPKRLG ERTWLAASPL Q------IGC GVVVQEKKVA SPQ-EVEVAA
-             -NIMTPKKLG DRTWLAASPL Q------IGC DVMVQEKKVA SPQ-EVEVAA
-             -NIMTPKKLG DRTWLAASPL Q------IGC DVMVQEKKVA SPQ-EVEVAA
-             -NIMTPKKLG DRTWLAASPL Q------IGC DVMVQEKKVA SPQ-EVEVAA
-             -NIMTPKNLG DKTWLAASPL Q------IGC GIMVQEKKVA SPQ-EVEVAA
-             -NVVVPHLLG HRTWLATSPL Q------IGC GVMIFGNKIG SAN-EFEAAA
-             -NIVVAHLLG HRTWLATSPL Q------IGC MVMIFGNKIG SAN-EFEAAA
-             -NIVVPHCLG HRTWLATSPL Q------IGC MVMIFGNKIG SEN-EFEAAA
-             -NIIVPHCLG HRTWLATSPL Q------IGC MVMIVGNKIG SEN-EFEAAA
-             -NIVVPKLLG HRTWLATAPL Q------IGC GMMIFGNKIG STQ-EFEAAA
-             -NIVVPKLLG HRTWLATAPL Q------IGC GMMIFGNKIG STQ-EFEAAA
-             -NIVPPKLLG HRTWLATSPL Q------IGC GVMIFGNKIG STQ-EFESAA
-             -NIVAPKLLG VRTWLATSPL Q------IGC GVMIFGNKIG STQ-EFEAAA
-             LNIIDCKLLG HRTWLATSPL Q------IGV DVMVMGNKIG SPS-EFEVAA
-             LNIIDCKLLG RHTWLATSPL Q------IGC DMMVMGNKIG SPS-EFEVAA
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPS-EFEVAA
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPS-EFEVAA
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVIGNKIG SPS-EFEIAA
-             LNIIDCKLLG HRTWLATSPL Q------IGC DIMVMGNKIG SPS-EFEVAA
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPA-EFEVAA
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVVGNKIG SPA-GFEVAA
-             -NIIDSKHLG HRTWLATSPL Q------IGC SAMVMGNKIG SPQ-EVELAA
-             -NIIHSKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPQ-EVELAA
-             -NIIHSKLLG HRTWLATSPL Q------IGC DVVVMGNKIG SPQ-EVELAA
-             -NIIDSKLLG HRTWLATSPL Q------IGC DVMVVGNKIG SPQ-EFELAA
-             -NIIDSKLLG HRTWLATSPL Q------IGC DVMVVGNKIG SPQ-EFELAA
-             -NIVMAKLLG ERTWLATSPL Q------IGC DVVAVGKKPE SPQ-EFECAA
-             -NLFEC--LR DSKSLFGSPL FIKVDEDRGF TAP------- SK-------V
-             -NLFEC--LR DSKSLFGSPL FIKVDEDRGF TAP------- SK-------V
-             -NLFEC--LR DSKSLFGSPL FIKVDEDRGF TAP------- SK-------V
-             -NLFEC--LG DSESLFGSPL AIKVDEDRGF TAP------- SK-------V
-             -NLFEC--LG DSESLFGSPL AIKVDEDRGF TAP------- SK-------V
-
-             DPTVIWFYTQ PIVYV-ADVF GCTKGKNPQE MRG------N NVMSESLGDD
-             DPTVIWFYTQ PIVYV-ADVF GCTKRKNPQE MRG------N NVMSESLGDD
-             DPTVIWFYTQ PIVYV-ADVF GCTKGKNPQE MRG------N NVMSESLGDD
-             DPTVIWFYTQ PIVYV-ADVF GCTKGKNPQE MRK------N NVISESLGDD
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             ---------- ---------- ---------- --V------N NVLSQSLGDD
-             DPTTISFCRK PIVQH-ADVF GCDRDKDPQE MRT------N NVISESLGDD
-             DPTTIAFCRK PIVQH-ADVF GCDKDKDPQE MRM------N NVISESLGDD
-             DPTTICFYKK PIVVQGADVF GCARGKDPQE MKA------N NVISGSLGDD
-             DPTTICFYKK PIVVQGADVF GCARGKDPQE MKA------N NVISGSLGDD
-             DPTMICFYKK PIVVQGADIF GCARGKDPQE MKS------N NVISGSLGDD
-             DPTTICFYKK PIVVQGADIF GCARGKDPQE MKA------N NVTSGSLGDD
-             DPTTICFYKK PIVVQGADIF GCARGKDPQE MKA------N NVTSGSLGDD
-             DPTTICFYKK PIVVQGADIF GCARGKDPQE MKA------N NVTSGSLGDD
-             DQVIIYFYQA PIIYVKADVF SGTVAKKAQA MR-------K STGSQSIGDD
-             DPVIIYFYQA PIIHHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             DPVIIYFYQA PIIYHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             DPVIIYFYQA PIIYHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             DPVIIYFYQA PIIHHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             DPVIIYFYQA PIIHHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             DPVIIYFYQA PIIHHKADVF AGTVAKKAQA MRS------R SIGSPSVGDD
-             DPVIIYFYQA PIIHHKADVF AGTVAKKAQA MRS------R SIGSPSVGDD
-             DPVIIYFYQA PIIHHKADVF SGTVAKKAQA MRQ------Q STGSQSVGDD
-             DPVIMYFYDA PMIMRPTDVF EGTNNKKAQA MRS------R STASQSIGDD
-             DPVIMYFYDA PMIMRPTDVF EGTNNKKAQA MRS------R STASQSIGDD
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DPVIKYFYQA PIIMRRTDVF EGTDDQKAQA MRV------R STASQSIGDD
-             DPVIMYFYQA PIIMRRTDVF EGTDDQKAQA MRL------R STASRSIGDD
-             DPVIMYFYQA PIIMRRTDVF EGTHNKKAQA MRV------R STASQSIGDD
-             DPVIMYFYQA PIIMRRTDVF EGTHNKKAQA MRV------R STASQSIGDD
-             DPVIMYFYQA PIIMRRTDVF EGTHNKKAQA MRV------R STASQSIGDD
-             DPVIMYFYQA PIIMRRTDVF EGTNNKKSQA MRV------Q STSSQSIGDD
-             DPVIMYFYQA PIIMQRTDVF EGTNNKKSQA MRV------H STSSQSIGDD
-             DPVIMYFYQA PIIMQRTDVF EGTNNKKSQA MRV------H STSSQSIGDD
-             DPAIMHFYRA PIIMRRTDVF EGTNNKKAQA MRI------R STASQSIGDD
-             DPAIMYFYQA TIIMRRTDVF EGTNNKKAQA MRM------R STASQSIGDD
-             DPVIMYFYQS PIIMRRTDVF EGTNNKKAQA MRV------R STASQSIGDD
-             DPVIMYFYQS PIIMRRTDVF EGTNNKKAQA MRI------R STASQSIGDD
-             DPVIMYFYQS PIIMRRTDVF EGTNNKKAQA MRV------R STASQSIGDD
-             DPVIMYFYQS PIIMRHTDVF EGTNNKKAQA MRL------R STASQSIGDD
-             DPTVIYFYRN LIIQKITDVL SAVRMESPQE MRT------Q DVNSSSLGDN
-             DPTVIYFYRN LIIAKITDVL SAVRMESPQE MRE------Q DVNSSSLGDN
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             DPTVIYFYRN LIIQHITDVL SAVRMDSPQE MRV------Q DVNSPSLGDN
-             DPTVIYFYRN LIIQHITDVL SAVRMDSPQE MRV------Q DVNSPSLGDN
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRTPVLVCIQ KVDSVSLGDD
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRTPVLVCIQ KVDSVSLGDD
-             D---IYFYRN MVVQRHTDVV AAVRMQSPQE MRNPVLVCIQ KVDSASLGDD
-             D---IYFYRN MVVQRHTDVV AAVRMQSPQE MRNPVLVCIQ KVDSISLGDD
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRCRKLVCIQ KVDSPSLGDD
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRTPKLVCIQ KVDSPSLGDD
-             D---IYFYRN MVIECLTDVV RAVRMQSPQE MRAPVLVCIQ KVDSPSLGDD
-             D---IYFYRN MVIECLTDVV RAVRMQSPQE MRAPVLVCIQ KVDSPSLGDD
-             D---IYFYRN MVIECLTDVV RAVRMQSPQE MRAPVLVCIQ KVDSPSLGDD
-             D---IFFYRN MVIQRLTDVV AAVRMQSPQE MRPPVLVCIQ YVDSPSLGDD
-             D---IYFYRN MVIQTLTDVV AAVRMQSPQE MRPPVLVCIQ DVDSVSLGDD
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRLPVLVCIQ DVDSPSLGDD
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRLPVLVCIQ DVDSPSLGDD
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRLPVLVCIQ DVDSPSLGDD
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRPPVLVCIQ DVDSPSLGDD
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRN------Q DVDSHSLGDD
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRE------Q DVDSHSLGDD
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRN------Q DVDSHSLGDD
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRN------Q DVDSHSLGDD
-             DPTVIYFYRN RIVRRMADVI STVRMKSPQE MRG------Q DVDSHSLGDD
-             DPTVIYFYRN RIVRRMADVI STVRMKSPQE MRG------Q DVDSHSLGDD
-             DPTVIYFYRN RIVKRMADVI STVRMKSPQE MRG------Q DVDSHSLGDD
-             DPTVIYFYRN RIIRRVADVI STVRMKSPQE MRE------Q DVDSHSLGDD
-             DPTIIWFYRN CIVHKLADTV STAKMKSPQE MRH------Q DVDSPSLGDD
-             DPTIIWFYRD CIVHKLADTV STAKMKAPQE MRV------Q DVDSPSLGDD
-             DPTIIWFYRN CIVHKLADTV STAKMKAPQE MRV------Q DVDSPSLGDD
-             DPTIIWFYRN CIVHKLADTV STAKMKAPQE MRH------Q DVDSPSLGDD
-             DPTIIWFYRN CIVHKLADTV STAKMKAPQE MRV------Q DVDSPSLGDD
-             DPTIIWFYRN CIVHKLADVV STAKMKSPQE MRV------Q DVDSPSLGDD
-             DPTIIWFYRN CIVHKLADLV STAKMKSPQE MRV------Q DVDSPSLGDD
-             DPTIIWFYRN CIVHKLADLV STAKMKSPQE MRV------Q DVDSPSLGDD
-             DPTVIYFYRN CIVQKMADVV STVKMKSPQE MRV------Q DVDSASLGDD
-             DPSVIYFYQN CIVQKMADVV STVKMKSPQE MRV------Q DVDSASLGDD
-             DPSVIYFYQN CIVQKMADVV STVKMKSPQE MRV------Q DVDSASLGDD
-             DPTVIYFYRN CIVQKLADVV STVKMKSPQE MRV------Q DVDSPSLGDD
-             DPTVIYFYRN CIVQKLADVV STVKMKSPQE MRV------Q DVDSPSLGDD
-             DPTVIYFYKN LIIQQAADYV SAVQVKSPQE MRY------Q DVNSPSDGDE
-             EPKCAQFYSK SCTHC----- ---------- -TM------C SVGSHASEED
-             EPKCAQFYSK SCTHC----- ---------- -TM------C SVGSHASEED
-             EPKCAQFYSK SCTHC----- ---------- -TM------C SVGSHASEED
-             EPKCAQFYSK SCTHH----- ---------- -MM------C SVGSNASEED
-             EPKCQQFYSK SCTHC----- ---------- -VM------C SVGSNASEED
-
-             NLQD--MSGV PVTVCTSSVM VRKDMQD-SV DKRGCTWNAK E-DHLCPSSF
-             NLQD--MSGV PVTVCTSSVM VRKDMQD-SV DKRGCTWNAK E-DHLCPSSF
-             NLQD--MSGV PVTVCTSSVM VRKDMQD-SV DKRGCTWNAK E-DHLCPSSF
-             NLQD--MPGM PVTVCTSSVM VRKDMHQ-SV DKRGYTWHAK E-DHLCPDSF
-             SLQQ--MPAV PVDVCVMSVM VNKSMPQ-SH DKRGYTWQAK Q-DHLFPVNV
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNC
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNC
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNF
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNF
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNF
-             SLQQ--MHAM PVTVVVVSHM VKKSMPQ-SH DKRGYTWQAK DFDQLIPVSF
-             FLQQ--MPAV PVSVCVYSHM VKKFVPQ-SH EKRGYTWKAK E-DHLVPISY
-             FLQQ--MPAV PVSVCVHSHM VKKFVPQ-SH EKRGVTWKAK E-DHLVPISL
-             RLQQ--MPAM PVTICVSSYM VKKSVIQ-SH QKRGYTWRAK E-DHLIPVSF
-             RLQQ--MPAM PVTICVSSYM VKKSVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             RLQH--MPAM PVTICVFSYM VKKAVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             RLQQ--MPAM PVTICVFSYM VKKSVPQ-SH VKRGYTWRAK E-DHLIPVSF
-             RLQQ--MPAM PVTICVFSYM VKKLVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             RLQQ--MPAM PVTICVFSYM VKKSVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             GMQS--MPLM QNAVCVWSKM VRKVQPD-GQ DKREQTWMAK D-DTLCPPSM
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DALCPPCK
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWVAK D-DTLCPPCK
-             GMQK--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWVAK D-DTLCPPCK
-             GTQV--MPLM QNLVCVWSKM VRKCMID-GQ EKREQTWMAK D-DKLCPPSQ
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK D-DTLCPQSR
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK D-DTLCPQSR
-             DMLN--MPLT QNAMCVESEM VRKSQPD-GQ DKRGYTWVAK E-DDLCPQSG
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSE
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DMLI--MPLV QNAMCVKSEM VRKCQPD-GP DKRGYTWMAK D-DTLCPVSA
-             DMLI--MPLV QNAMCVNPEM VRKCQPD-GQ DKRGYTWMAK N-DTLCPVSA
-             DMLK--MPLV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             DMLK--MPLV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             DMLK--MPLR QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             DMLN--MPLV QNAMCVSSEM VRKCQPD-GQ NKRGCTWMAK N-DTLCPQSG
-             DMLN--MPLV QNAMCVSSEM VRKCQPD-GQ NKRGYTWMAK H-DTLCPQSG
-             DMLN--MPLV QNAMCVSSEM VRKCQPD-GQ NKRGYTWMAK H-DTLCPQSG
-             DMLN--MPLH QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSP
-             DMLN--MPLH QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLYPQSA
-             EMLN--MPLV QNAMCVPSEM VRKCQPD-GQ DKRGYTWMAK D-DPLCPQSA
-             EMLN--MPQV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             EMLN--MPLV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             EMLN--MPLI QNAMCVQSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQLH
-             NGQA--MNIV PYWVCVASGV VRKTHKD-SV DKRGQTWTAK S-DFLCPLAV
-             NGQA--MNIV PYWVCVGSGV VRKTHKD-SV DKRGQTWTAK S-DFLCPLAM
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             NGQA--MNIV PYWVCVVSGV VRKTHKD-SV EKRGQTWTAK S-DFLCPIAV
-             NGQA--MNIV PYWVCVVSGV VRKTHKD-SV EKRGQTWTAK S-DFLCPIAV
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPAAV
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             DPQM--MKIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             DPQC--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             VPQM--MNIV PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAM
-             VPQM--MNIV PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAM
-             VPQM--MNIV PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAM
-             TPQM--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK A-DFLCPPAV
-             TPQM--MNIA PYWVCVCSGV VKKTQPD-SV DKRGKTWVAK S-DFLCPPAV
-             TPQK--MNIA PYWVCVCSGV VKKAQLD-SV EKRGKTWVAK S-DFLCPPAV
-             TPQK--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAV
-             TPQK--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAV
-             TPQM--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAI
-             DNQA--MVIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK V-DFLCPPAF
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK M-DFLCPPAF
-             DNQA--MNIL PYVVCVCSGV VRKDHPDTSI HKRGRTWLAK V-DFLCPPAF
-             DNQA--MNIL PYVVCVCSGV VRKEHPDTSI SKRGRTWLAK I-DFLCPPAF
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK I-DFLFPPAF
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK I-DFLFPPAF
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK I-DFLFPPAF
-             DNQA--MTIL PHWVCVVSGV VRKEHPDTSI NKRGSTWLAK V-DFLCPPAF
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             DQQE--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             DQEA--MDIL PYWVCVMSGV VRKEQPD-SV NKRGRTWLAK K-DFLVPPAF
-             DQEA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK K-DFLVPPAF
-             DQQP--MNII PYWVCVTSGV VHKEQPD-SV NKRGRTWTAK N-DFLCPDAF
-             DQQP--MNII PYWVCVTSGV VRKEQPD-SV NKRGHTWTAK N-DFLCPPAY
-             DQQP--MNII PYWVCVTSGV VRKEQPD-SV NKRGRTWSAK N-DFLCPPAF
-             NQQS--MNII PYWVCVHSGV VQKEQPD-SV HKRGRTWTAK N-DFLCPPAF
-             NQQS--MNII PYWVCVHSGV VQKEQPD-SV HKRGRTWTAK N-DFLCPPAF
-             NGQS--MHIG PYWVCVSSEV VKKSQPD-SV DKRGRTWVAK N-EFLCPPDH
-             ALDLYTHKPV PDAQCFVSRV ARNIPEH-SP CK-------- ----------
-             ALDLYTHRPV PDAQCFVSRV ARNIPEH-SP CK-------- ----------
-             ALDLYTHKPV PDAQCFVSRV ARNIPEH-SP CK-------- ----------
-             ALELYTHKPV PDPQCFVSIV VRNIPEH-SP CK-------- ----------
-             ALELYTHKPV PDPQCFVSIV VRNIPEH-SP CK-------- ----------
-
-             CKGER---ED EPGGVTQ--- ---------- ----RCIENI AKLLYIKDV-
-             CKGER---ED EPGGVTQ--- ---------- ----RCIENI AKLLYIKDV-
-             CKGER---ED EPGGVTQ--- ---------- ----RCIENI AKLLYIKDV-
-             CKGEK---EE EPGGVRR--- ---------- ----RIVENI VKLLYIKDV-
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             VKGEQ---EE EPEGPNN--- ---------- ----RVVHNI VKLLYTKDV-
-             CKGEH---EE EPEGAQY--- ---------- ----RVVQNI VKLLYTKDV-
-             CKGEH---EE EPEGAQY--- ---------- ----RCVQNI VKLLYTKDV-
-             CKGEL---DE EPDAAQQ--- ---------- ----RIVQNI VKLLYTKDV-
-             CKGEL---DE EPDAAQQ--- ---------- ----RIVQNI VKLLYTKDV-
-             CKGEL---DE EPDGAQQ--- ---------- ----RVVQNI VKLLYTKDV-
-             CKGEL---EE EPEGAQH--- ---------- ----RMVQNI VKLLYTKDV-
-             CKGEL---EE EPEGAKQ--- ---------- ----RMVQNI VKLLYTKDV-
-             CKGEL---EE EPEGAQQ--- ---------- ----RIVQNI VKLLYTKDI-
-             KRGEK---TA EPTQWMG--- ---------- ----TVTVNK IKLLYCKDC-
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             DQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             EQGEK---AA EPTQWED--- ---------- ----ICTANV IKLLYCKDC-
-             DQGEK---HH EPHHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             DQGEK---HH EPHHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             DQGEK---YA EPQHIRN--- ---------- ----QFSENV IKLLYCKDC-
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             GQGEK---YA EPHQIKN--- ---------- ----KFSVNV IKLLYCKDC-
-             GQGEC---YA EPHQTCN--- ---------- ----KFRVNV IKLLYCKDC-
-             NQGEK---YA EPHVIGD--- ---------- ----KVSVNV IKLLYCKDC-
-             NQGEK---YA EPHVIGD--- ---------- ----KVSVNV IKLLYCKDC-
-             NQGEK---YA EPVVIGD--- ---------- ----KVSVNV IKLLYCKDC-
-             NQGEK---FA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             NQGEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             NQGEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             NQGEK---YA EPHQIRN--- ---------- ----KISVNV IKLLYCKDC-
-             NQGEK---YA EPHQIRN--- ---------- ----KISVNV IKLLYCKDC-
-             NVGEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             NVGEK---YA EPHQIRN--- ---------- ----KVSTNV IKLLYCKDC-
-             NQGEK---YA EPHQIRN--- ---------- ----KVSTNV IKLLYCKDC-
-             NQAEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             DQGEP---GA EQKPAVGEEN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             DQGEI---GA EQKPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             DQGEP---AA EQRPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             DQGEP---AA EQRPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             DQGEP---AA EQKPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             DQGEP---AA EQKPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             NQGEP---GA EQKPAVGA-N PIVKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             NQGEP---GA EQKPAVGA-D PIVKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             NEGEH---GA EQRP-FGTQN PVCKPWRFVI MNTQTFAKNI IRLLYIKDI-
-             NEGEH---GA EQRPVFGTHN PVCKPWRFVI MHTQTFSKNI IRLLYIKDI-
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNTQTFSKNI IRLLYIKDI-
-             NEGEH---GA EQRPVFGTQN PVCRPWRFVI MNMQTFSKNI IRLLYIKDI-
-             NEGEH---GA EQRPVFGGQN PACKPWHFVI MNRQTFAKNM IRLLYIKDI-
-             NEGEH---GA EQRPVFGGQN PACQPWHFVI MNTQTFAKNM IRLLYIKDI-
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNTETFAKNI IRLLYVKDV-
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNVETFAKNI IRLLYVKDV-
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNVETFAKNI IRLLYVKDV-
-             SEGEH---GA EQRPVFGMQN PACKPWRFVI MNTQTFAKNI IRLLYIKDV-
-             SEGEH---GA EQRPVFGMRN PICKPWRFVI MNTQTFAKNI IRLLYVKDV-
-             SEGEH---GP EQRPVFGVQN PVCKPWRFVI MNTQTFAANI IRLLYVKDV-
-             SEGEH---GP EQRPVFGVQN PVCKPWRFVI MNTQT-AKNI IRLLYVKDV-
-             SEGEH---GP EQRPVFGMQN PVCKPWRFVI MNTQTFAKNI IRLLYVKDV-
-             SEGEH---GA EQRPVFGMQN PVCRPWRFVI MNTQTFAKNV IRLLYVKDV-
-             NQGEH---RA EQKPASKFEH PVCGPWEFVI VNYQTSAKDI ILLLYIKDV-
-             NQGEH---RA EQKPALKFKH PVCGPWEFVI VNYQTSAKDI ILLLYIKDV-
-             NQGEH---RA EQKPAFKFKH PVCGPWEFVI VNYQTEAKDI ILLLYIKDV-
-             NQGEH---RA EQKPAFKFKH PCCGPWEFVI VNYQTSAKDI ILLLYIKDV-
-             NQGEH---HA EQKPVFGFKH PHCGPWEFVI CNYQTVAKDI ILLLYIKDV-
-             NQGEH---HA EQKPVFGFKH PHCGPWEFVI CNYQTVAKDI ILLLYIKDV-
-             NQGEH---HA EQKPVFGFKH PHCGPWEFVI CNYQTMAKDI ILLLYIKDV-
-             NQGEH---HA EQKPVFGFKH PHVGPWEFVI CNYQTSAHDI ILLLYIKDV-
-             NQGEH---ER EQRPVYGFKH PGCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             NQGEH---EA EQRPVYGFVH PRCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             NQGEH---GA EQRPVYGFQH PRCRPWQFVI ANYQTFAKNI IMLLYVKDV-
-             KQGEH---EA EQRPVYGFQH PRCRPWQFVI ANYQSSAKNI IMLLYVKDV-
-             NQGEH---EA EQRPVYGFQH PRCRPWQFVI GNYQTSAKNI IMLLYVKDV-
-             EQGEH---EA EQCPVHGFKH PRCRPWQFVI ADYQTSAKNI IMLLYVKDV-
-             NQGEH---EA EQKPVYGFDH PRCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             NQGEH---EA EQKPVYGFDH PRCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             NQGEH---GA EQKPTHGFEH PRCRPWQFVI PVYQTGAKNI ILLLYIKDV-
-             NQGEH---GA EQKPVHGFEH PRCRPWQFVI SVYRTGAKNI NLLLYIKDV-
-             NQGEH---GA EQKPVHEFQH PRCRPWQFVI SVYRTGAKNI NLLLYIKDV-
-             DQGEH---GA EQKPVHGFEH PRCRPWQFVI ANYQTGAKNI ILLLYVKDV-
-             DQGEH---GA EQKPVHGFEH PRCRPWQFVI ANYQTGAKNI ILLLYVKDV-
-             MQGEHSIEGA EQKPFFGFAG PFPQPWQFVI VNPQTWAHNI IRLLYCKDV-
-             ---------- -P---CS--- ---------- ----VEEVCY CKVCDSKDVR
-             ---------- -P---CS--- ---------- ----VEEVCY CKVCDSKDVR
-             ---------- -P---CS--- ---------- ----VEEVCY CKVCDSKDVR
-             ---------- -P---CS--- ---------- ----VEEVAY CKNCDSKDVR
-             ---------- -P---CS--- ---------- ----VEEVCY CKNCDSKDVR
-
-             LCNEVLNGLQ WQLCWSV-GD WESLIPQACW DAKKDLAVCA WKMELVPGL-
-             LCNEVLNGLQ WQLCWSV-GD WESLIPQACW DAKKDLAVCA WKMELVPGL-
-             LCNDVLNLLV WQLCWSV-GD WESLIPQACW DAKKDLAVCA WKMELVPGL-
-             LCNQVLNLLQ WQLCWSV-GD WESLVPQACW GAKKDLAVCA WKMELVPGL-
-             DCNMVLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE GARRDLAVCA WKRELVPGL-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE GARRDLAVCA WKRELVPGL-
-             DCNIDLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             DCNTVLSLLI WQLC--H-GD WEQLVPQACA GARSDLAVCA WKRELVPGL-
-             DCNVVLSLLV WQLC--H-GD WEPLIPQACQ TAKKDLAVCA WKRELVPGL-
-             DCNVVLSLLV WQLC--H-GD WEPLVPQACQ TAKKDLAVCA WKRELVPGL-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACS NARKDLAVCA WKRELVPGL-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACS NARKDLAVCA WKRELVPGL-
-             SCNKVLSMLI WQIC--H-GD WEPQIPKACN AARKDLAVCA WKRELVPGL-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACD AARKDLAVCA WKRELVPGL-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACD AARKDLAVCA WKRELVPGL-
-             SCNVVLSMLI WQIC--H-GD WEPQLPKACD AARKDLAVCA WKRELVPGL-
-             SCNEVMKILS WWLCNSV-GD WQTLMSQACI TADPNPPVCV WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQSLMNDACR SANPNYPVCI WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACS SANPNYPVCI WKRELVPGL-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACS SANPNYPVCI WKRELVPGL-
-             SCNEVLRVLS WWLCDSV-GD WRTLMSDACA LANPNPPVCV WKRELVPGL-
-             SCNKVLKILV WQLCESV-DD WQTLSSDACM HAEQNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLSSDACM HAEQNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNTPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEHNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WVTLASDACL SAEPQPPVCV WQRELVPQL-
-             SCNKVLKILK WQLCESV-DD WQTLASDACI LAKPQPPVCV WQRELVPQL-
-             SCNQVLKILV WQLCESV-DD WQTLTSDPCM SAQVNPPVCV WQRELVPQL-
-             SCNQVLKILI WQLCESV-DD WQTLTSDPCM SAQVNPPVCV WQRELVPQL-
-             SCNQVLKILV WQLCESV-DD WQTLTSDPCM SAQVNPPVCV WQRELVPQL-
-             SCNKMLKILV WQLCESV-DD WQTLASDPCV SAEPNSPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDPCM SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLASDPCM SAEPNPPVCV WQRELVPQL-
-             SCNQVLKILV WQLCESV-DD WQTLTSDPCV PAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLTSDPCV PAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCDSVQDD WQPLTSDPCV NAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCDSV-DD WQTLTSDPCV SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCDSV-DD WQTLTSDPCV SAEPNPPVCV WQRELVPQL-
-             SCNKVLKILV WQLCESV-DD WQTLTSDPCI SAEPNPPVCV WQRELVPQL-
-             SCNGVLPLLK WQLCDSH-GD WQSLYADSCP IA-VNAAVCG WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLYADSCP IA-INAAVCG WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLFADSCP TA-VNAAVCA WKRELVPGL-
-             SCNGVLPLLK WQLCDSH-GD WQSLFADSCP IA-VNAAVCA WKRELVPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP NA-VNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP NA-VNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP PA-VNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP PA-VNIAVCC WKRELMPGL-
-             SCNEVLQLLD WQLCDSH-GD WQSLIADSCP NA-SNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSLIADSCP NA-VNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSLVADSCP NA-VNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSMVADSCH NA-VNIAVCC WKRELMPGL-
-             SCNQVLQLLD WQLCDSH-GD WQSMVADSCH NA-VNIAVCC WKRELMPGL-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADSCP TA-ANIAVCC WKRELMPGL-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADSCS TA-ANIAVCC WKRELMPGL-
-             SCNAVLQLLD WQLCYSH-ED WQSLIADACP TA-VNIAVCC WKRELMPGL-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADACS TA-VNIAVCC WKRELMPGL-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADACP TA-VNIAVCC WKRELMPGL-
-             SCNKVLQLLD WQLCYSH-GD WQSLIADACP AA-VNIAVCC WKRELMPGL-
-             GCNCVLELLN WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             GCNCVLELLK WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             GCNCVLELLE WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             GCNCVLELLK WQLCTSH-GD WQSLVADSCV WA-HNVAVCE WKRELVPGL-
-             GCNCVLELLA WQLCTSH-GD WQSLVADSCI WA-HNVAVCA WKRELVPGL-
-             GCNCVLELLA WQLCTSH-GD WQSLVADSCI WA-HNVAVCA WKRELVPGL-
-             GCNCVLELLA WQLCTSH-GD WQSLVADSCI WA-HNVAVCA WKRELVPGL-
-             GCNCVLELLV WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             SCNGVLQLLN WHLCDSH-GD WQSLVADSCC WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             SCNRVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCM WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             SVNGVLQLLI WQLCDSH-GD WQSLVADSCA WA-VNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCA WA-VNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCA WA-VNLAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLSADSCA WA-HNVAVCG WKRELVPGL-
-             SCNGVLQLLN WQLCDSH-GD WQSLSADSCA WA-HNVAVCG WKRELVPGL-
-             SCNCVLTCLN WVLCDSH-GD WHSLIADACP CA-HNVAVCG WKRELVPGL-
-             AVKNAYQDLQ VPLSKLK-AP WLSMGHCECW EEDINNILSV VKHELVDDVD
-             AVKNAYQDLQ VPLSKLK-AP WLSMGHCECW EEDINNILSV VKHELVDDVD
-             AVKNAYQDLQ VPLSKLK-AP WLSMGHCECW EEDINNILSV VKHELVDDVD
-             AVQNAYQDLA VPLSKLK-AP WLSMGHCECW EEDINNILSM VKHELVVDQD
-             ATQNAYQELA IPLSKLK-AP WLSMGHCECW EEGINNILSM VKHELVVDQD
-
-             --NRNNENLA KVIYFGPDGH -------DEG PMQAKIVTLH W-EMDVSHRG
-             --NRNNENLA KVIYFGPDGH -------DEG PMQAKIVTLH W-EMDVSHRG
-             --NRNNENLA KVIYFGPDGH -------DEG PMQAKIVTLH W-EMDVSHRG
-             --NRNNENLA KIIYFGPDGH -------DEG NMQAKIVTLH W-EMDVSHRG
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             --NHNNENLA KVIYFGPDGH -------DEG PMGRKIVDLH W-EMEASHRD
-             --NCNNEYLA KIIYFGPDGH -------DEG PMGRKIVDLH W-EMEASHRD
-             --NCNNEYLA KIIYFGPDGH -------DEG PMGRKIIQLH W-EMEASHRD
-             --NHNNENLA KIMYFGHDGH -------DEG PMGRKIVTLH V-EMEVSHRE
-             --NHNNENLA KIMYFGHDGH -------DEG PMGRKIVTLH V-EMEVSHRE
-             --NHNNEDLA KIMYFGPDGH -------DEG PMGRKIVNLH V-EMEVSHRE
-             --NHNDENLA KIMYFGPDGH -------DEG PMGEKIVNLH V-EMEASHRE
-             --NHNDENLA KIMYFGPDGH -------DEG PMGEKIVNLH V-EMEASHRE
-             --NHNDENLA KIMYFGPDGH -------DEG PMGEKIVNLH V-EMEASHRE
-             --NRSVENLA KIIYFCPDEH -------DER KMWGKIFALE W-EMDISHRH
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRM
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRV
-             --NRNVENLA KIIYFCPDEH -------DER KMWGKIFCLE W-EMDISHRH
-             --NRNIEDLA RIIYFGPDEH -------DEG KMMNKIFALE W-EMDMSHRV
-             --NRNIEDLA RIIYFGPDEH -------DEG KMMNKIFALE W-EMDMSHRV
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             --NRNVEDLA RVIYFGPDEH -------DEG KMMPKIFKLA W-EMDMSHRA
-             --NRNVEDLA RVIYFGPDEH -------DEG KMMSKIFNLE W-EMDMSHRT
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMSKIFALE W-EMDMSHRV
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMFKIFALE W-EMDMSHRV
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMSKIFALE W-EMDMSHRV
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMSKIFALE W-EMDMSHRI
-             --NRNVEDLA RTIYFGPDEH -------DEG KMMSKIYALE W-EMDMSHRV
-             --NRNVEDLA RTIYFGPDEH -------DEG KMMSKIYALE W-EMDMSHRV
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRD
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRD
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMNKIFALE W-EMDMSHRD
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRN
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRN
-             --NRNIEDLA RIIYFGPDEH -------DEG KMMGKIFALE W-EHDMSHRD
-             --NHSCEHLA KSVYFEPDGE -------GEG KVMLKIFGLD WCEVERSHEH
-             --NHSCEHLA KSVYFEPDGE -------GEG KVMLKIFGLD WCEVERSHEH
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHEH
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHEH
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHEH
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHER
-             --NHSCEHLA KSVYFEPDGE -------DEG KMMLKIFGLD WCEVERSHEH
-             --NHSCEHLA KSVYFEPDGE -------DEG KMMLKIFGLD WCEVERSHEH
-             --NHSCEHLA KSVYFKPDGE -------DEG QMTMKIFNLD WCEVEKSHEK
-             --NHSCEHLA KTVYFKPDGE -------DEG QMSQKIFNLD WCEVEKSHEK
-             --NHSCEHLA KTVYFKPDGE -------DEG QMTMKIFNLD WCEVEKSHEK
-             --NHSCEHLA KTVYFKPDGE -------DEG QMTMKIFNLD WCEVEKSHEK
-             --NFSCEHLA KTVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             --NFSCEHLA KTVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             --NHSCQHLA KTVYFKPDGE -------DEG QMIVKIFNLD WCEVEKSHEK
-             --NHSCQHLA KTVYFKPDGE -------DEG QMMVKIFNLD WCEVEKSHEK
-             --NHSCQHLA KTVYFKPDGE -------DEG QMMVKIFNLD WCEVEKSHEK
-             --NHSCEHLA KTVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             --NHSCEHLA KTVYFKPDGE -------DEG QMIVKIFHLD WCEVEKSHEK
-             --NHSCEHLA KSVYFKPDGE -------DEG QMFMKIFNLD WCEVEKSHEK
-             --NHSVEHLA KSVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             --NHSCEHLA KSVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             --NHSCEHLA KTVYFKPDGE -------DEG QMIMKIFGLD WCEVEKSHEE
-             --NHSCERLA KHIYFQPDGE -------DEG KMVLKIFGLD WCEMEKSHQR
-             --NHSCDRLA KHIYFQPDGE -------DEG KMILKIFGLD WCEMEKSHQR
-             --NHSCERLA KHIYFQPDGE -------DEG KMILKIFGLD WCEMEKSHQR
-             --NHSCERLA KHIYFQPDGE -------DEG KMILKIFGLD WCEMEKSHQR
-             --NHSCEHLA KHIYFQPDGE -------DEG KMILKIFGLD WCEVERSHQR
-             --NHSCEHLA KHIYFQPDGE -------DEG KMILKIFGLD WCEVERSHQR
-             --NHSCEHLA KHIYFQPDGE -------DEG KMIIKIFGLD WCEVEKSHQR
-             --NHSCERLA KHIYFQPDGE -------DEG KMILKIFELN WCEVEKSHQH
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG QMVLKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVHKIFELD WVEMEKSHQQ
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVHKIFELD WVEMEKSHQQ
-             --NHACEMLA KTVYFEPDGE -------DEG KMVIKIFGLD WCEIEKSHQQ
-             --NHACEMLA KSVYFEPDGE -------DEG KMVLKIFGLD WCEIEKSHQQ
-             --NHACEMLA KSVYFEPDGE -------DEG KMNLKIFGLD WCEIEKSHQQ
-             --NHACEMLA KTVYFEPDGE -------DEG KMVIKIFGLD WCEMEKAHQQ
-             --NHACEMLA KTVYFEPDGE -------DEG KMVIKIFGLD WCEMEKAHQQ
-             --NHSNEHMA KTIYFEPDGH -------DEG KMILNIFGLD WCEVETSHQE
-             RMNRLTEVAA KMAYFGPDGF HWDVELWEEN DLNCDDFELG W-NLKH----
-             RMNRLTEVAA KMAYFGPDGF HWDVELWEEN DLNCDDFELG W-NLKP----
-             RMNRLTEVAA KMAYFGPDGF HWDVELWEEN DLNCDDFELG W-NLKP----
-             MVNRSPEVAA KMAYFGPDGF HWDVELCEES DLTVDDFELG W-VLKP----
-             MVNRSPEVAA KMAYFGPDGF HWDIELCEEN DLTCDDFELG W-VLKP----
-
-             -SSVDDNVV- VVMLAFAVSF CHPWGHYIQG LGD-QHKLAR PNT---AQKL
-             -SSVDDNVV- VVMLAFAVSF CHPWGHYIQG LGD-QHKLAR PNT---AQKL
-             -SSVDDNVV- VVMLAFAVSF CHPWGHYIQG LGD-QHKLAR PNT---AQKL
-             -SSVDDNVV- VVMLAFQASF CDPWGHYIQG LGD-QYKLAR PNT---ARQL
-             -SSVRDNMI- VIMLPFNINS IDPWRHYILG LND-QIQLTR PNT---ARRL
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ARRL
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ARRL
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ACRL
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ACRL
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ACRL
-             -SSVRDNML- VIMLPFLVNN LDPWRHYILG LND-QIQLTR PNT---ARRL
-             -SSVRDNYI- VIMLPFKINS RDPWRHYILG IND-QVCLNR PET---ARRL
-             -SSVRDNII- VIMLPFKINS RDPWRHYILG LND-QVCLTR PET---ARRL
-             -SSVKDNMIR VIMLPFSNSS VDPWRHVILG LND-QIKLTR PNT---AHRL
-             -SSVKDNMIR VIMLPFPSSS VDPWRHVILG LND-QIKLTR PNT---AHRL
-             -SSVKDNMIR VVMLPFDNNS WDPWRHVILG LND-QIKLTR PNT---AHRL
-             -SSVKDNMIR VIMLPFSNNS WDPWRHVILG LND-KIKLTR PNT---AHRL
-             -SSVKDNMIR VIMLPFSNNS WDPWRHVILG LND-QIKLTR PNT---AHRL
-             -SSVKDNMIR VIMLPFGENS WDPWRHVILG LND-QIKLTR PNT---AHRL
-             -SSVDDNHC- VEMLPFMCQR VDPWGHYVQI LAD-RQDLAR PVT---LQAL
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             -SSVDDNQC- VELLPYNCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQV LAD-RLDLTR PVT---LQGL
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLVLTR PVT---LHGL
-             -SSVDDNQC- VELLPYLCQR MDPWGHYVQI LAD-RLNLTR PVT---LQGL
-             -SSVDDNVC- VEMLPFVCQK MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQV LAD-QLHLTR PHT---LRDL
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQV LAD-QLHLTR PHT---LRDL
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQI LAD-QLNLTR PHT---LREL
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQI LAD-QLNLTR PHT---LREL
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQI LAD-QLNLTR PHT---LREL
-             -SSVDDNYI- IEMLPFVCDR IGPWGHYAQI LAD-QLNLTR PHT---LREL
-             -SSVDDNYI- IEMLPFVCDR IGPWGHYAQI LAD-QLNLTR PHT---LREL
-             -SSVDDNYI- IEMLPFVCDR IGPWGHYAQI LAD-QLNLTR PHT---LREL
-             -SSVDDNYV- IEMLPFVCHR VGPWGHYAQV QAD-QQNLTR PHT---LADL
-             -SSVDDNYV- IDMLPFICHR VGPWGHYAQV LAD-QINLTR PHT---LRDL
-             -SSVDDNFV- IEMLPFVCHR IGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             -SSVDDNFV- IEMLPFVCHR IGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             -SSVDDNFV- IEMLPFVCHR IGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             -SSVDYNYV- IEMLPFVYHR VGPWGHYAQM LSD-QIVLTR PHT---LRDL
-             -SSVDYNYV- IEMLPFVYHR VGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             -SSVDYNYV- IEMLPFVYHR VGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRDL
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-KLVLTR PHT---LRDL
-             SSSVDDNYI- IEMLPFVCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRDI
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRNI
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRNI
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRDI
-             -SSVDDNYN- VNMLPFQNSR KDPVGHYVQD LED-ARRLIR PGT---ARSL
-             -SSVDDNYN- VNMLPFQNSR KDPVGHYVQD LED-ARRLIR PGT---ARSL
-             -SSIDDNYT- VNMLEFPNSR KDPVGHYVQN LED-AIRLIR PGT---ARSL
-             -SSIDDNYT- VNMLEFPNSR KDPVGHYVQN LED-AIRLIR PGT---ARSL
-             -SSIDDNYT- VNMLPFPNSR KDPVGHYVQD LED-AIRLIR PGT---ARSL
-             -SSIDDNYT- VNMLPFPNSR KDPVGHYVQD LED-AIRLIR PGT---ARSL
-             -SSVDDNYN- VNMLPFPNSR QDPVGHYVQD LED-LLRLIR PGT---ARSL
-             -SSVDDNYN- VNMLPFPNSR KDPVGHYVQD LED-LLRLIR PGT---ARSL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LED-ALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LEDSALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LED-ALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LED-ALRLIR PGT---ARAL
-             -SSVDDNYD- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYD- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYH- VNMLPFAQSN RDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYH- VNMLPFAQSN GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFVQSN GDPVGHYVQG LED-ALLLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFVQSN GDPVGHYVQG LED-ALLLIR PGT---ARAL
-             -SSVDDNYD- VNMLPFVQSN GDPVGHYVQG LED-ALLLIR PGT---ARAL
-             -SSVDDNYN- VNMLPFVSSN GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             -SGVDDNYQ- VNMLPFNHSK NNPVGHYVQG LED-ALNLIR PGT---ARAL
-             -SGVDDNVQ- VNMLPFNHSK HNPVGHYVQG LED-ELNLIR PGT---ARAL
-             -SGVDDNYQ- VNMLPFNHSK HNPVGHYVQG LED-ALNLIR PGT---ARAL
-             -SGVDDNYQ- VNMLPFKHSK HNPVGHYVQG LED-ALNLIR PGT---ARAL
-             -SGVDDNYK- VNMLPFSHSK HNPVGHYVQG LGD-ALRLIR PGT---ARAL
-             -SGVDDNYK- VNMLPFSHSK HNPVGHYVQG LGD-ALRLIR PGT---ARAL
-             -SGVDDNYK- VNMLPFSHSN HNPVGHYVQG LGD-ALRLIR PGT---ARAL
-             -SGVDDNYQ- VNMLPFDHCK HNPVGHYVQG LED-ALGLIR PGT---ARAL
-             -SSVDDNYL- VNMLPFLHSR QNPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFMQSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFIHSR DNPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFIHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFIRSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFMHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFFHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFFHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             -SSVDDNYL- VNMLPFTHSR ETPVGHYVQG LED-PMHLMR PGT---ARAL
-             -SSVDDNYL- VNMLPFAHSR QTPVGHYVQG LED-PMHLMR PGT---ARAL
-             -SSVDDNYL- VNMLPFTHSR ETPVGHYVQD LED-PMHLMR PGT---ARAL
-             -SSVDDNYL- VNMLPFTHSR ENPVGHYVQG LED-PMHLIR PGT---ARAL
-             -SSVDDNYL- VNMLPFTHSR ENPVGHYVQG LED-PMHLIR PGT---ARAL
-             -SSSDDNHL- VNMLPFGVSR DDPVGHYMLG LED-AIRLYR PGT---ARAL
-             ---EDDHPL- LCIGSFSVHK YVSVMVYPLP MND-CVRMSQ PCHAAHAQDI
-             ---EDDHPL- LCIGSFSVHK YVSVMVYPLP MND-CVRMSQ PCHAAHAQDI
-             ---EDDHPL- LCIGSFSVHK YVSVMVYPLP MND-CVRMSQ PCHAAHAQDI
-             ---EDDHPL- ICIGSFSVHK QFSVMVYPLP MND-AIRMSQ PCHAAHAQDI
-             ---EDDHPL- ICIGSFSVHK QFSVMVYPLP MND-AIRMSQ PCYAAHAQDI
-
-             SILT---VFH FSGGFRDKPM -ERSQLHS-T YSED----KK DQKVLIHAMK
-             SILT---VFH FSGGFRDKPM -ERSQLHS-T YSED----KK DQKVLIHAMK
-             SILT---VFH FSGGFRDKPM -ERSQLHS-T YSED----KK DQKVLIHAMK
-             SILV---VMH FSGGFRDKPI -ERSQLHC-T YSEN----KK DQKVVIRAMK
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             SILH---VMH YSGAFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             SILH---VMH YSGAFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             SILM---VMH YSGEFHDKSP -ERSQLHFDS YSEH----KN DHKCVILASK
-             SILA---VMH YSGEFHDKSP -ERSHLHF-R YSEM----KN DVKCVI---K
-             SILV---VMH YSGEFHDKSP -ERSHLHY-R YSEV----KN DVKCVILASK
-             SILV---VTH YSGGFHDKSA -ERSQHHF-I YNEV----KD DHKCVILASK
-             SILV---VTH YSGGFHDKSA -ERSQHHF-I YNEV----KD DHKCVILASK
-             SILV---VMH YSGGFHDKSS -ERSQHHF-I YNEV----KN DHKCVILASK
-             SILV---VMH YSGGFHDKSA -ERSQHHF-I YNEI----KN DHKCVILASK
-             SILV---VMH YSGGFHDKSA -ERSQHHF-I YNEI----KN DHKCVILASK
-             SILV---VMH YSGGFHDNSA -ERSQHHF-I YNEV----KN DHKCVILASK
-             SILP---CPH ASGKEQDGAV -ERSQHYV-V YAEL----QV DHKCTIAAHK
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             SILP---CPH ASGKEQDGAE -ERSQHYG-V YQEL----QN DAKSTIDANK
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DAKSTIDANK
-             GILV---CPH ASGKEQDGAM -ERSQHYV-V YAEL----QN DHKNTINANK
-             YILAC--CPV ASGKEQDGNK -ERSQHYT-I YAEI----QN DHKNPISANN
-             YILAC--CPV ASGKEQDGNK -ERSQHYT-I YAEI----QN DHKNPISANN
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             YILA---CPV ASGKEQDGAK -ERSQCYT-I YAEL----QN DHKSLISANH
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             YILA---CPV ASGKEQDGAK -ERSQCYT-I YAEL----QN DHKSLIAANH
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             FILS---CPV ASGKEQDGAT -ERSQYYV-V YAEL----QN DHKSPISANK
-             FILA---CPV ASGKEQDGAT -ERSQHYV-V YAEL----QN DHKSPISANK
-             FILS---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             FILS---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             FILS---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             FILA---CRV ASGGEVDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             FILA---CPV ASGGEQDGNA -ERSQHYI-V YAEL----VN DHKSPISANK
-             FILA---CPV ASGGEQDGNA -ERSQHYI-V YAEL----VN DHKSPISANK
-             FILA---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             FILA---CYV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPILANK
-             FILA---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QD DHKSPISANK
-             FILA---CPV ASGGEQDENT -ERSQHYI-V YAEL----QN DHKSPIHANK
-             FILA---CPV ASGGEQDENT -ERSQHYI-V YAEL----QN DHKSPINANK
-             FILA---CPV ASGGEQDAVT -ERSQHYI-V YAEL----QN DHKSPISASK
-             TILF-YGCQY YSGEFQDCEI -ERSQLYN-V YCEH----KQ DHKSAIIANK
-             TILF-YGCQY YSGEFQDCEI -ERSQLYN-V YCEH----KQ DHKSAIIANK
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-V YCEL----KQ DHKSAIIANK
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-V YCEL----KQ DHKSAIIANK
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-V YCEL----KQ DHKSAIIANK
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-I YCEL----KQ DHKSAIIANK
-             TVLF-YGCQY YSGQFQDCEI -ERSQLYN-V YCEL----KQ DHKSAIMANK
-             TVLF-YGCQY YSGEFQDCEI -ERSQLYN-V YCEL----KQ DHKSAIMANK
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DYKSAIIANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DYKSAIIANQ
-             VILF-YGCQY YSGKFQDSEM FERSQLYR-V YCEI----KK DYKSAIIANQ
-             VILF-YGCQY YSGKFQDSDM FERSQLYR-V YCEI----KK DYKSAIIANQ
-             IILF-YGCQY YSGKFQDSEL FERSQLYR-M YCEI----KK DHKSAIIANQ
-             IILF-YGCQY YSGKFQDSEL FERSQLYR-M YCEI----KK DHKSAIIANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHNSAIIANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHNSAIIANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHNSAIIANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIIANQ
-             VILS-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIVANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIIANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIMANQ
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSTIIANQ
-             VILF-YGCQF YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIIANQ
-             NILF-YGCEV YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIIAHK
-             NILF-YGCEY YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIMACK
-             NILF-YGCEY YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIMAYK
-             NILF-YGCEY YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIMAYK
-             NILF-YGCQY CSGEFQDSEE -ERSWIYN-V YCEI----KK DHKSAILAHK
-             NILF-YGCQY CSGEFQDSEE -ERSWIYN-V YCEI----KK DHKSAILAHK
-             NILF-YGCEY YSGEFQDSEE -ERSWIYN-V YCEI----KK DHKSAIMAHK
-             NILF-YGCQY YSGEFQDSEA -ERSWIYN-V YCEI----KK DHKSGIMAHK
-             NILF-YGCEY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVIAHK
-             NILF-YGCEY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             NILF-YGCEY YSGQFPDGEA -ERSWIYP-V YCEM----KK DHKSAVVAHK
-             NILF-YGCEY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             NILF-YGCEY YSGQFPDAEA -ERSWIYD-V YCEM----KK DHKSAVYAHK
-             NILF-YGCEY YSGQFPDCEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             NILF-YGCQY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             NILF-YGCQY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             NILF-YGCEY YSGQFPDGEP -ERSWIYD-V YCEL----KK DHKNAIVAVK
-             NILF-YGCEY YSGHFPDGEA -ERSWIYD-M YCEL----KK DHKSAIVAVK
-             NILF-YGCEY YSGHFPDGEP -ERSWIYD-M YCEL----KK DHKSAIVAVK
-             NILF-YGCEY YSGQFPDGEP -ERSWIYD-V YCEL----KK DHKSAIVAVK
-             NILF-YGCEY YSGQFPDGEP -ERSWIYD-V YCEL----KK DHKSAIVAVK
-             NILF---VNY YSGDFQDPEL -ERSQLYN-V YCEQ----KQ DHRNAIRASK
-             PTEQ---TRY QIHTFLDDSI -RRDLCNQ-G CHEENMVWRD DLKDPISTEV
-             PTEQ---TRY QIHTFLDDSI -RRDLCNQ-G CHEENMVWRD DLKDPISTEV
-             PTEQ---TRY QIHTFLDDSI -RRDLCNQ-G CHEENMVWRD DLKDPISTEV
-             HTDQ---DRY DVRTFLGHSI -KCHMCNQ-A CHEENIVWRD DLKDPITTEV
-             HTDQ---DRY DIRTFLEHSI -RCHLCNQ-A CHEENIVWRD DLKDPITTEV
-
-             -RNKGLDWHA GND-MKGGPK -IIYLGMLFY -------AEN NVAKQKAHFV
-             -RNKGLDWHA GND-MKGGPK -IIYLGMLFY -------AEN NVAKQKAHFV
-             -RNKGLDWHA GND-MKGGPK -IIYLGMLFY -------AEN NVAKQKAHFV
-             -RNKGCDWHA GKD-MAGGPK -IIYVGMLFY -------AES NWAKQKAHFV
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             -VNKDHDWIT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             -VNKDHDWIT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             -HNKGLDWAT GKDDMKGGAK -IMMSGALFY -------AEQ NWIRARNHFV
-             -SNKGLDWTA GKDGMKGEAK -AMMNGALFY -------AEQ NWFRKKNHFV
-             -SNKGLDWTA GKDGMKGENK -AMMNGTLFY -------AEQ NWFRQKNHFV
-             -CNKGLDWAA GKD-MKGGAK -VMMNGALFY -------AER NWIRQKHHFV
-             -CNKGLDWAA GKD-MKGGAK -IMMNGALFY -------AER NWIRQKHHFV
-             -SNKGLDWAA GKD-MKGGAK -MMANGALFY -------EER NWIRQKNHFV
-             -ANKPLDWAA GKD-MKGGAK -MMANGALFY -------AER NWIRQKNHFV
-             -ANKGLDWAA GKD-MKGGAK -MMVNGALFY -------AER NWIRQKNHFV
-             -ANKGLDWAA GKD-MKGGAK -MMVNGALFY -------AER NWIRQKNHFV
-             YQDKMKDWDT GKN-MDEGAK -MYVEIHLFY -------AEN NIRRQNDHSV
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLRKQNEHSV
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLRKQNEHSV
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLIKQNEHSV
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLRKQNEHSV
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NIRKQNEHSV
-             NPNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NIRKLNEHSV
-             NPNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NIRKQNEHSV
-             VPRKMLDWDT GKN-MDKGAK GMYHEIVLFF -------AEN NVKKQVEHSV
-             QPNKMLDWDT GKT-MDRGAA -MCGEIKLFY -------AEP NVWNQNDHSV
-             QPNKMLDWDT GKT-MDRGAA -MCGEIKLFY -------AEP NVWNQNDHSV
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             HPDKMLDWDT GKS-MDRGAA -MCREIKLFY -------AEP NVWKQNDHSV
-             HPNKLLDWDT GKT-MDRGAA -MCHEIKLFH -------AEP NVWRQNDHSV
-             HLNKMLDWDT GKT-MDREAT -MCREMKLFY -------AET NLWKQNDHSV
-             HLNKMLDWDT GKT-MDREAT -MCREMKLFY -------AET NLWKQNDHSV
-             HLNKMLDWDT GKT-MDREAT -MCREMKLFY -------AET NLWKQNDHSV
-             VLNKMLDWDT GKT-MDREAA -MCREIKLFY -------AET NVWKQNDHSV
-             VLNKMLDWDT GKT-MDREAA -MCRDIKLFY -------AET NVWKQNDHSV
-             VLNKMLDWDT GKT-MDREAA -MCRDIKLFY -------AET NVWKQNDHSV
-             HMNKMLDWDT GKT-MDFEAA -MCREIKLFY -------AET NVWKINDHSV
-             VVNKMLDWDM GKT-MDFEAA -MCREIKLFY -------AET NVWKQNNHSV
-             HMRKMLDWDT GKT-MDREAA -VCREIKLFY -------AET NCWKQNDHSV
-             VMNKMLDWDT GKT-MDREAA -MCREIKLFV -------AET NVWKQNDHSV
-             VMNKMLDWDT GKT-MDREAA -MCREIKLFV -------AET NVWKQNDHSV
-             HMNKMLDWDT GKT-MDREAA -MCREIKLFY -------AET NVWKQNDHSV
-             QEQKGMDWNT GKE-MEQGPK -IILHGSLFF -------AEP NIVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -VILHGTLFF -------AES NIVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -IILHGVLFF -------AEP NVVRQPGVSH
-             QEQKGMDWNT GKE-MEQGPK -IILHGVLFF -------AEP NVVRQPGVSH
-             QEHKGMEWDT GKE-MQQGPK -VVVHLALFY APSNVLAAEP NIIGQPQVSH
-             QDHKGMEWDT GKE-MQQGPK -VVVHLALFY MPSNVLAAEP NIIGQPQVSH
-             QEHKGMEWDT GKE-MQQGPK -IVVHLGLFY MPSNVLAAEP NIIGQPQVSH
-             QEHKGMEWDT GKE-MQQGPQ -IEVHLALFY MPSNVLPAEP NIIGQPQVSH
-             QEHKGMEWDT GKE-MQQGPK -VVLHHALFY APSNVLAAEP NIIGQPQVSH
-             QEHKGMEWDT GKE-MQQGPK -VVLHHALFY APSNVLAAEP NIIGQPQVSH
-             QEHKGMDWDT GKE-MQQGPK -IVVVLALFY QPSNVLAAEP NIMGQPQVSV
-             QEHKGMDWDT GKE-MQQGPK -IVVVLALFY QPSNVLAAEP NIMGQPQVSV
-             QEHKGMDWDT GKE-MQQGPK -IVVVLALFY QPSNVLAAEP NIMGQPQVSV
-             HEVKGMDWNT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIVGQPQVSH
-             QEVKGMDWDT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIVGQPQVSH
-             QGVKGMDWDT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIIGQPQVSH
-             QGVKGMDWDT GKE-MQQGPK -IVMHLALFY APSNVLAAEP NIIGQPQVSH
-             QGVKGMDWDT GKE-MQQGPK -IVVHLTLFY APSNVLAAEP NIFGQPQVSH
-             QGVKGMDWDT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIIGQPQVSH
-             YEHKGMDWDT GKE-AQQGPE -VVHHNLLFF -------AEP NIHGQPGVGH
-             YRHKGMDWDT GKE-AEQGPE -VVHHNLLFF -------AEP NIQGQPGVGH
-             FEHKGMDWDT GKE-AEQGPE -VVHHNLLFF -------AEP NIQGQPGVGH
-             YEHKGMDWDT GKE-AEQGPE -VVHHNLLFF -------AEP NIHGQPGVGH
-             YKHKGMDWDT GKE-MEQGPK -VVNYNLLFY -------AEP NIHGQPRVGH
-             YKHKGMDWDT GKE-MEQGPK -VVNYNLLFY -------AEP NIHGQPRVGH
-             YEHKGMDWDT GKE-MEQGPK -VVHHNILFY -------AEP NIHGQPRVGH
-             YDHKGVDWDT GKE-MEQGPK -VLHHNLLFY -------AEP NIHGQPTVGH
-             HEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             AEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             HEHKGMDWDT GKE-MNQGPK -VVMHGVLFN -------AEP NIHGQPGVSH
-             HQHKGMDWDT GKE-MNQGPK -VVLHGVLFN -------AEP NIHGQPGVSH
-             HQHKGMDWDT GKE-MNQGPK -VVLHGVLFN -------AEP NIHGQPGVSH
-             HEHKGMDWDT GKE-MNHGPK -VIVHGVLFH -------AEP NIGGQPGVSH
-             HCHKGMDWDT GKE-MNHGPK -VIIHGLLFH -------AEP NIGGQPGVSH
-             HCHKGMDWDT GKE-MNHGPK -VIIHGVLFH -------AEP NIGGQPGVSH
-             HEHKGMDWDT GKE-MNQGPK -VIIHGVLFH -------AEV NIHGQPGVSH
-             HEHKGMDWDT GKE-MNQGPK -VIIHGILFH -------AEV NIHGQPGVSH
-             NDHKGMAWDT AKD-MEQGPK -MVEHQVLFY -------AEP NMHGQPEVIH
-             IADKLHEWPT NVN-KENSAD ----HRQLFH -------ANS SALDKHQHNV
-             IADKLHEWPT NQN-KENSAD ----HRQLFH -------ANS SALDKHQHNV
-             IADKLHEWPT NQN-KENSAD ----HRQLFH -------ANS SALDKHQHNV
-             IAEKLQEWPT NQN-KENVAD ----HRQLFH -------ANS SALDKHRHNV
-             IADKLQEWPT NQN-AENVAD ----HRQLFH -------ANS SCLDRHRHNV
-
-             VFL-ISDATR LLIVHEGCMI DYTFMEFACH PFFAELFMEH MVARYQYYSN
-             VFL-ISDATR LLIVHEGCMI DYTFMEFACH PFFAELFMEH MVARYQYYSN
-             VFL-LSDATR LLIVHEGCMI DYTFMEFACH PFFAELFMEH MVARYQYYSN
-             VFL-ISDATR LLIHHVGCMI EYTFMEFACH PFFAELFMEH MVIRYQYYNN
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFSELFMEH VYIRYQYINN
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFSELFMEH VYIRYQYVNN
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFSELFMEH VYIRYQYVNN
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFAELFMEH VYIRYQYVNN
-             IFL-ICDAVR ILILHHGCMT DRTFMEFACN PFFAELFMEH VYIRYQYVNN
-             IFL-ICDAVR ILILHHGCMT DRTFMEFACN PFFAELFMEH VYIRYQYVNN
-             IFL-ICDAVR ILIVLHGCMT AWTFMEFACN PFFAELFMEH VYIRYQYVNN
-             IFV-FCDAVR ILIMHSGVMI GYTFMEFACN PFFAELFMEH VMVRYQYESN
-             IFV-ICDAVR ILIVHSGVMT GFTFMEFACN PFFAELFMEH VYIRYQYQAN
-             IFV-VCDAVR ILIVHYGCMI GYTFMDFACN PFFAELFMDH VFIRYVYMNN
-             IFV-VCDAVR ILIVHYRCMI GYTFMDFACN PFFAELFMDH VFIRYQYMNN
-             IFV-VCDAVR ILIVHYGCMV PYTFMAFACN PFFAELFMEH VFIRYQYVNN
-             IFI-ICDAVR ILIVHYGCMV GDTFMDFACN PFFAELFMEH VFIRYQYIPN
-             IFV-ICDAVR ILIVHYGCMV GDTFMDFACN PFFAELFMEH VFIRYQYIPN
-             IFV-ICDAVR ILIVHYGCMV GDTFMDFACN PFFAELFMEH VVIRYQYIPN
-             IFW-ISDAKK RLICGMSSMC LVTFMTLACN PLFAKLFMEV VPMRYDYLTN
-             TFV-ISDAQK RLICGVSSMV MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             TFV-ISDAQK RLICGVSSMA MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             TFV-ISDAQK RLICGVSSMV MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             IFI-IADAQK RLICGVSSMC LQTFMNLACN PFFAKLFMEV IPMRYDYQTN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFSKLFMEV VCMRYNYTSN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFSKLFMEV VCMRYNYTSN
-             MFI-ISDAQN KLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             VFI-ISDAVN RLICANSIMC GLTFMAMACN PHFAKLFMEV VCMRYDYFSN
-             MFI-ISDASN RLICANSIMC GLTFMAMACN PHFAKLFMEV VCMRYEYFSN
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV VCVHYDYGAN
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV VCVHYDYGAN
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV VCVHYDYGAN
-             MFI-ISDAQN RLICGNSIMC GITFMAMACN PHFAKLFMEV ACMRYDYFAN
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV ACMRYDYFAN
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV ACMRYDYFAN
-             MFI-VSDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEG VCMRYDYSAN
-             MFI-VSDAHN RLICGNSIMC ALTFMAMACN PHFAKLFMEA VCMRYDYSAN
-             MFI-VSDAQN RLICGSSIMC RLTFMAMAVN PHFAKLFMED VCMRYDYSPN
-             MFIVISDAQN RLICGSSIMC RLTFMAMAVN PHFAKLFMEE SCVRYDYSAN
-             MFIVISDAQN RLICGSSIMC GLTFMAMAVN PHFAKLFMEE SCVRYDYSRN
-             MFI-ISDAQN RLICGSSIMC GLTFMATACN PHFAKLFMEE VCMRYDYAAN
-             IFI-GNDARR VLICGKSMMP GHRFMREACV PFFHKLFMAV NQMRYDYMMN
-             IFI-GNDARR VLICGLSMMP GHRFMREACV PFFHKLFMAV NQMRYDYMVN
-             IFT-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAV NQMRYDYVTN
-             IFT-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAV NQMRYDYVTN
-             IFT-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAA NQMRYDYVTN
-             IFI-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAV NQMRYDYMTN
-             IFV-GNDARR MLICGLSMMP GHRFMKEACV PFFHKLFMAV RRMRYDYMSN
-             IFV-GNDARR MLICGLSMMP GHRFMKEACV PFFHKLFMAV RRMRYDYMTN
-             VFV-GNDARR MLIVGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYMWN
-             WFV-GNDARR MLIVGVSMMP AYKFMREACV PFFRKLFMAD NQVRYDYMWN
-             VFV-ANDARR MLIVGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYVWN
-             VFV-GNDARR MLIVGVSLMP AYKFMREACV PFFRKLFMAE NQVRYDYMWN
-             VFV-GNDARR MLITGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYVWN
-             VFV-GDDARR MLITGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYVWN
-             VFV-GNDGRR MLIVGCSMMP DYKFMREACV PFFRKLFMAE VQDRYDYAWN
-             VFV-GNDARR MLIVGCSMMP DYKFMREACV PFFRKLFMAE VQDRYDYNWN
-             VFV-GNDARR MLIVGCSMMP DYKFMREACV PFFRKLFMAE VQDRYDYNWN
-             VFV-GNDARR MLIVGVSVMP SYKFMREACV PFFHKLFMAD NQVRHEYMWN
-             VFV-GNDARR MLIVGVSVMP AYKFMREACV PFFHKLFMAE NQVRHDYMWN
-             VFV-DNDARR MLIVGQSVMP PYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             VFV-DNDARR MLIVGQSVMP AYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             VFV-DNDARR MLIVGQSVMP AYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             VFV-DNDIRR MLIVGVSVMP AYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             IFV-GNDARR KLIAGVSFMS MVKFMCEACV PFFRKLFMAV GQMRYDYVNN
-             IFV-GNDARR KLIAGLSFMA MMKFMCEACV PFFRKLFMAV GHMRYDYVSN
-             IFV-GNDARR KLIAGVSFMA VMKFMCEACV PFFRKLFMAV GQMRYDYMNN
-             IFV-GNDARR HLIAGVSFMA VVKFMCEACV PFFRKLFMAV GQMRYDYVNN
-             IFV-GNDAHR KLIAGVSFMS IMKFMCEACV PFFRKLFMAV RQMRYMYMNN
-             IFV-GNDAHR KLIAGVSFMS IMKFMCEACV PFFRKLFMAV RQMRYMYMNN
-             IFV-GNDAVR NLIAGVSFMS IMKFMCEACV PFFRKLFMAV RQMRYMYMNN
-             IFV-GNDARR KLIAGVSFMS VVKFMCEACV PFFRKLFMAF RQMRYDYVNN
-             VFM-GNDATR KLITGVSVMP TYKFMCGACV PFFHKLFMAV RNMRYDYNVN
-             VFM-GNDATR KLITGVSVMP TYKFMCGACV QFFHKLFMAV RNMRYDYTVN
-             VFM-GNDATR KLITGVSVMP TYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             VFM-GNDATR KLITGFSIMP TYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             VFM-GNDATR KLISGVSVMP TYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             VFM-GNDATR KLITGVSVMP TYKFMCNACV PFFHKLFMAV RNMRYDYTVN
-             VFM-GNDATR KLIPGVSVMH DYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             VFM-GNDATR KLIPGVSVMH DYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             VFV-GNDATR KLIAGVSVMP IVKFMCGACV PFFRKLFMAL RNMRYDYASN
-             VFV-GNDATR KLIAGASVMF IVKFMCGACV PFFRKLFMAL RNMRYDYSQN
-             VFV-GNDATR KLIAGVSVMP IVKFMCGACV PFFRKLFMAL RNMRYDYSQN
-             VFV-GNDATR KLIAGVSVMP FVKFMCGACV PFFRKLFMAL RNMRYDYTSN
-             VFV-GNDATR KLIAGVSVMP FVKFMCGACV PFFRKLFMAL RNMRYDYTSN
-             IFI-GNDAMC MLIPGMSVMV HHKFMRAACM PFFNKLFMAV RYMRYDYVDN
-             VMN-GSPCIR ALIIGGSSVG VNHFMMGPCQ EFFTDLFMMY EGLQYACVCA
-             VMN-GSPCIR ALIIGGSSVG VNHFMMGPCQ EFFTDLFMMY EGLQYACVCA
-             VMN-GSPCIR ALIIGGSSVG VNHFMMGPCQ EFFTDLFMMY EGLQYACVCA
-             MMN-GSACIR TLIIGGSIVG VNVFMMEPCQ EFFTDLFMVY EGLQYAVVCA
-             MMN-GSSCIR TLIIGGSIVG VNVFMMGPCQ EFFTDLFMVY EGLQYAVVCA
-
-             VDIKIFDTCF RSAVYAVDNS WETLCDY-EM LSGYFGAEIN HNPRLPEQVC
-             VDIKIFDTCF RSAVYAVDNS WETLCDY-EM LSGYFGAEIN HNPRLPEQVC
-             VDIKIFDTCF RSAVYAVDNS WETLCDY-EM LSGYFGAEIN HNPRLPEQVC
-             VDIKIFDTCF RGAVYAEDNS WETLCGY-EM LSGYFGAEIN HNPRLPEQVC
-             HDIKIKDTVF RLAVYAWDNF WETLCKC-EM LSGHVGAKIN HNPRLFEQVC
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             HDIKIKDTEF RLAVYAWENS WETLCNC-EM LSGHIGAKIN HNPRLFEQVC
-             HDIKIKDTCF RLAVYAWENS WETLCNV-EM LSGHFGAKIN HVPRLPEQVC
-             HDIKIKDTCF RLAVYAWENS WETLCNV-EM LSGHFGAKIN HVPRLPEQVC
-             HDIKIMDTCF RVAVYTWENS WETCFNR-EM LSGTFGAKIS HNPRLPEQVI
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGAKIS HNPRLPEQVI
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGAKIS HNPRLPEQVI
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGARIS HVPRLPEQVI
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGARIS HVPRLPEQVI
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGARIS HVPRLPEQVI
-             HDIKI----- -MEVYAPENS WETIKNV-EM VSGKEGAEIN HTPQLPEQVI
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -IEVYAPDNS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             HDIKI----- -KEVYAPENS WETIKNV-EM VSGKAGKQIN HEPQLPEQVI
-             HSIKI----- -FEVYADENS WENVRNF-EM VSGRAGAHIN HIPQLPEQAY
-             HSIKI----- -FEVYADENS WENVRNF-EM VSGRAGAHIN HIPQLPEQAY
-             HSIKI----- -FEVYADENS WENIRNF-EM VSGRAGAYIN HIPQLPEQAV
-             HSIKI----- -FEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             HSIKI----- -FEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             HSIKI----- -LEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             HSIKI----- -LEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             HSIKI----- -LEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             HSIKI----- -FEVYAEDDS WENICNF-EM MSGRTGAQIN HIPQLPEQVC
-             HSIKI----- -FEVYAEENS WENVCNF-EM MSGRAGAQIN HIPQLPEQVC
-             HDIKI----- -FEVYAAENS WENARNF-EM MSGRAGAEIN H-PQLPEQVC
-             HDIKI----- -FEVYAAENS WENARNF-EM MSGRAGAEIN H-PQLPEQVC
-             HDIKI----- -FEVYAVENS WENARNF-EM MSGRAGAEIN H-PQLPEQVC
-             PDIKI----- -FEVYAAENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             PDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             PDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             HDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             HDIKI----- -VEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             HDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             HDIKI----- -FEVYANENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             HDIKI----- -FEVYANENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             HDIKI----- -SEVYAEENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVV
-             YDIKIYETHW RMGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIYETHW RMGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEQVI
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEQVI
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEHVI
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEQVI
-             YDIKIYETHW RPGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPETVI
-             YDIKIYETHW RPGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPETVI
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             YDIKIYETHY RMGVYAVDNS WETLVYC-EM TSGRIGAKVN HLPRLPEQVT
-             YDIKIYETHY RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             YNIKIYETHF RDGVYAVDNS WETLVYV-EM ASGRIGAKIN HQPRLPEQVI
-             YNIKIYETHF RVGVYAVDNS WETLVYV-EM ASGRIGAKIN HMPRLPEQVI
-             YNIKIYETHF RVGVYAVDNS WETLVYV-EM ASGRIGAKIN HMPRLPEQVI
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGANIN HLPRLPEQVV
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVV
-             YDIKIYETHF RMGVYAIDNS WETLVYC-EM TSGRIGAKIN HQPRLPEQVV
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HQPRLPEQVV
-             YDIKIYETHF RMGVYAVDNS WEALVYC-EM TSGRTGAKIN HQPRLPEQVV
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVF
-             YDIKIWETVF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             YDIKIWETVF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             YDIKIWETFF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             YDIKIWETVF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             YDIKIWETAF RGGVYAIENS WETLVLC-EM TSGRSGAKMN HLPRLFEQVC
-             YDIKIWETAF RGGVYAIENS WETLVLC-EM TSGRSGAKMN HLPRLFEQVC
-             YDIKIWETAF RGGVYAMENS WETLVLC-EM TSGRVGARMN HLPRLFEQVC
-             YDIKIWETVF RGGVYAIENS WETLILC-EM TSGRCGAKMN HMPRLFEQVC
-             YDIKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIWETHI RQGVYAVENS WETLITC-EM TSGRIGAKIN HLPRLPEQVV
-             YDIKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDVKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIWETHM RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIWETHL RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIWETHL RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIVETHL REGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIVETHL REGVYAIENS WETLVVC-EM TSGRMGAKIN HLPRLPEQVI
-             YDIKIVETHL REGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIIETHL RNGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIMETHL RNGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             YDIKIDETRY RDGVYARRNS WETANVC-EM SSGRSGAKIN HNPRLPEQVT
-             MNITIQCLHT GEGVMCNVKC KEFLQREDEM KAGLIGIICN HLSRMIMVIL
-             MNITIQCLHT GEGVVCNVKC KEFLQREDEM KAGLIGIICN HLSRMIMVIL
-             MNITIQCLHT GEGVVCNVKC KEFLQREDEM KAGLIGIICN HLSRMIMVIL
-             VNIIIQCLHT NEGVVCNVKC KEFLQREEDM KSGLIGIICN HISRMCMHIL
-             INIIIQVLHT NEGVVCNVKC KEFLQREDDM KSGLIGIICN HISRMCMHIL
-
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIAIRVSGS E-SENVVLQY
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIAIRVSGS E-SENVVLQY
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIAIRVSGS E-SENVVLQY
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIPIRISGS E-SENVVLQY
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IRIKIREPGS E-SENTVVMY
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IRIKIREPGS E-SENTVVMY
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IRIKIREPGS E-SENTVVMY
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IGIKIREPGS Q-SENTVVMY
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IGIKIREPGS Q-SENTVVMY
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IGIKIREPGS Q-SENTVVMY
-             -PPCELTVSG LKGKH-VGWP YLTDITRTPL IRIQIREPGS E-CENSVVMY
-             -PPCDLTVSG LKGKQ-NGLP YLTDITRTPL IRIQIRVPGS E-SENVVVMY
-             -PPCDLTVSG LKGKQ-NGWP YLTDITRTPL IRIQIRVPGS E-SENITVMY
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IKIHIRVPGS Q-SENHVVMY
-             -PPCELTVSG LKGKH-NGWP YLTEITRTPL IKIHIRVPGS Q-SENHVVMY
-             -PPCDLTVSG LKGKH-NGWP YLTDITRTPL IKIHIRIPGS Q-SENHVVMY
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IRIHIRVPGS E-SENHVVMY
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IRIHIRVPGS E-SENHVVMY
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IRIHIRVPGS E-SENHVVMY
-             -PPCNLTVSN LKGMI-PPCP ALTEITRTV- -FIV--MYYA I-LRNKIMQY
-             -PPCCLTVSN LKGMI-PPVP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIM--MYVA M-LRNDIMQY
-             -PPCCLTVSN LKGMI-PPVP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             -PPCCLTVSN LKGMI-PPVP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             -PPCSLTVSN LKGMM-PPCP AMTEITRTV- -III--MYYA I-LRNEIMQY
-             -PPCKLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYGS I-LRNDVMQY
-             -PPCVLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYGS I-LRNDVMQY
-             -PPCHLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYVS I-LRNDVMQY
-             -PPCVLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYVS I-LRNDVMQY
-             -PPCVLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYVS I-LRNDVMQY
-             -PPCVLTVSN LKGVA-ASCP AMTEITRTA- -VIV--MYVS I-LRNDVMRY
-             -PPCVLTVSN LKGVA-ASCP AMTEITRTA- -VIV--MYVS I-LRNDVMRY
-             -PPCVLTVSN LKGVA-ASCP AMTEITRTA- -VIV--MYVS I-LRNDVMRY
-             -PPCHLTVSN LKGCC-ASVP AITEITRTV- -VIC--MYVS I-LCNVVMQY
-             -PPCVLTVSN LKGCC-ASCP ANTEITRTV- -VIC--MYVS I-LRNVVMQY
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASCP DITEITRTV- -VIC--MYVS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASCP DITEITRTV- -VIC--MYIS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASCP DITEITRTV- -VIC--MYIS I-LRNDVMQY
-             NPPCHLTVSN LKGVC-ASCP AITEITRTV- -VIV--MWIS I-LRNDVMQY
-             NPPCHLTVSN LKGVC-ASCP AITEITRTV- -VIV--MWIS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             -PPCHLTVSN LKGVC-ASVP AITEITRTV- -VIC--MYIS I-LRNNVMQY
-             -PPCHLTVSN LKGVC-ASVP AITEITRTV- -VIC--MYIS I-LRNNVMQY
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNVVMQY
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IKIY--MWGT INFKNRVMQY
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IKIY--MWGT ICFKNRVMQY
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             -PPCVLTVSG LKDTM-AGMK HGTEITKTPD IKIH--MWGT INFKNKVMQY
-             -PPCVLTVSG LKDTM-AGMK HGTEITKTPD IKIH--MWGT INFKNKVMQY
-             -PPCILTVSG LKRTV-AGAP DETEITKSPV IHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTV-AGAP DETEITKSPV IHIV--MWAD IMFKNCVMQY
-             -PPCDLTVSG LKRTV-AGPP DETEITKSPV IHIV--MWAD IVFKNCVMQY
-             -PPCILTVSG LKRTI-AGAP DETEITKSPV IHIV--MWAD IMFKNCVMQY
-             -PPWVLTVSG LKRTV-AGAP DETEITKSPI IHII--MWEE IMFKNCVMQY
-             -PPWVLTVSG LKRTV-AGAP DETEITKSPI IHII--MWED IMFKNCVMQY
-             -PPCILTVSG LKRTI-ADEP DETEITKTPI IHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-ADEP DETEITKTPI IHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-ADEP DETEITKTPI IHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-AGSP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             -PPCVLTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             -PPCILTVSG LKETK-AGLI DGTEITKTPD IGIC--MWET IHFKNPVMQY
-             -PPCILTVSG LKETK-AGII DGTEITKTPE IGIC--MWDT IEFKNPVMQY
-             -PPCILTVSG LKETR-AGII EGTEITKTPD IGIC--MWDT IHFKNPVMQY
-             -PPCILTVSG LKETR-AGII DGTEITKTPD IGIC--MWDT IHFKNPVMQY
-             -PPCLLTVSG LKETV-AGII DGTEITKTPE IGIC--MWDT IHFKNPVMQY
-             -PPCLLTVSG LKETV-AGII DGTEITKTPE IGIC--MWDT IHFKNPVMQY
-             -PPCILTVSG LKETV-AGVI DGTEITKTPE IGIC--MWDT IHFKNPVMQY
-             -PPCILTVSG LKETM-AGVI DGTEITKTPD IGIG--MWDS IHFKNPVMQY
-             -PPCVLTVSG LKQPM-AGYN DQTEITKTPD ICIC--TWGT IHFKNFVMQY
-             -PPCILTVSG LKQPM-AGYN DETQITKTPD ICIC--TWGT IHFKNSVMQY
-             -PPCILTVSG LKQPM-AGYN DETQITKTPD ICIC--GVGT IHFKNLVMQY
-             -PPCILTVSG LKQPV-AGYN DETQITKTPD ICIC--TWGT IHFKNSVMQY
-             -PPCILTVSG LKQPM-AGYN METQITKTPD ICIC--TWGT IHFKNSVMQY
-             -PPCILTVSG LKQPM-AGYN DETEITKTPD ICIC--TWGT IHFKNSVMQY
-             -PPCILTVSG LKQPM-AGFV DETEITKTPD ICIC--TWGT IHFKNSVVQY
-             -PPCILTVSG LKQPM-AGFV DETEITKTPD ICIC--TWGT IHFKNSVVQY
-             -PPCILTVSG LKQSV-SGYN DETEITKTPD IKIC--TWGT IHFKNSVMQY
-             -PPCILTVSG LKRAV-NGYN DETEITKTPD IKIC--TWGT IHFKNSVMQY
-             -PPCILTVSG LKQAV-NDCN DETEITKTPD IKIC--TWPT IHFKNGMMQY
-             -PPCMLTVSG LKQAM-AGVN DETEITKTPD IKIC--TWGT IHFKNFVMQY
-             -PPCMLTVSG LKQAM-AGVN DETEITKTPD IKIC--TWGT IHFKNFVMQY
-             -PPRSLTVSG LKDTM-PGHP DVTEITKTPV IAIV--MWGT INLKNHVMQY
-             -VHCLLTHAG LKSME-IGFD R-TGVVRMPL IAEP--LYLV I-YVNAVEPY
-             -VHCLLTHAG LKSME-IGFD R-TGVVRMPL IAEP--LYLV I-YVNAVEPY
-             -VHCLLTHAG LKSME-IGFD R-TGVVRMPL IAEP--LYLV I-YVNAVEPY
-             -VVCLLTHCG LKAME-IPFD I-TGVVRGPL ITEP--LYLI I-YVNAVEPY
-             -VHCLLTHCG LKAME-IPFD R-TGVVRGPL IAEP--LYLI I-YVNAVEPY
-
-             CLYYEENKSI R--------- --QNNTGSAD LPK------- ----------
-             CLYYEENKSI R--------- --QNNTGSAD LPK------- ----------
-             CLYYEENKSI R--------- --QNNTGSAD LPK------- ----------
-             CLYYEENKSI R--------- --QNNTGSAV LPK------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             MVYYKERKSI R--------- --QNNTGCAN LPQ------- ----------
-             MVYYKERKSI R--------- --QNNTGCAN LPQ------- ----------
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             CFYYKENRSV R--------- --INNTGQAE LPK------- ----------
-             VFYYRENRSV R--------- --QNNTGNAE LPK------- ----------
-             VFYYRENRSV R--------- --QNNTGNAE LPK------- ----------
-             VFYYRENRIV R--------- --QNNTGVAE LPK------- ----------
-             VFYYRENRIV R--------- --QNNTGVAE LPK------- ----------
-             VFYYRENRIV R--------- --QNNTGVAE LPK------- ----------
-             VFYYRENRIA R--------- --QNNTGVAE LPK------- ----------
-             VFYYRENRIA R--------- --QNNTGVAE LPK------- ----------
-             VFYYRENRIA R--------- --QNNTGVAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGAAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VVYYKENRSV R--------- --QNNTGKAE LPR------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPR------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             CNYYKENRSV R--------- --INNTGLAE LPK------- ----------
-             CNYYKENRSV R--------- --INNTGLAE LPK------- ----------
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             CNYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CNYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CNYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             STYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             STYYKENRSV R--------- --GNNTGGAE LPK------- ----------
-             STYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             STYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             STYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ATYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAA LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKEPRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CVYYKENRSV R--------- --VNNTGGAE LPQ------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --LNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             CCYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             CVYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             CVYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             CCYYKETRSV R--------- --VNNTGGAE LPK------- ----------
-             TDAYKKPKSM HQFQFDDCQI RYRTNTGFEE TPVGATHLTH VCVCVPHPWT
-             TDAYKKPKSM HQFQFDDCQI RYRTNTGFEE TPMGATHLTH VCVCVPHPWT
-             TDAYKKPKSM HQFQFDDCQI RYRTNTGFEE TPMGATHLTH VCVCVPHPWT
-             TDAYKKPKSM HQFQFDDVQI RYRTNTGFEE NPKLATHLVH VCVVVPHPWT
-             TDAYKKPKSM HQFQFDDVQI RYRTNTGFEE NPKLATHLVH VCVVVPHPWT
-
-             ----DRLVNS FVD-ELYNSI ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             ----DRLVNS FVD-ELYNSI ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             ----DRLVNS FVD-ELYNSI ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             ----DRLVNN FVD-ELYNSV ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             ----ARLVNK VVD-ELYNNV ---YHAIPKK E--MNQ-GVG DSGGVEMVQE
-             ----ARLVNK VVD-ELYNNV ---YHAIPKK D--MNQ-GVG DSGGVEMVQE
-             ----ARLVNK VVD-ELYNNV ---YHAIPKK D--MNQ-GVG DSGGVEMVQE
-             ----HRLVNK VVD-ELYNNV ---YHAIPKK D--MNQ-GVG DSGGVEMVQE
-             ----HRLVNK VVD-ELYNNP ---YHAIPKK D--MNQ-GVG DSGGIEMVQE
-             ----HRLVNK VVD-ELYNNP ---YHAIPKK D--MNQ-GVG DSGGIEMVQE
-             ----HRLVNK VVD-ELYNNV ---YHAIPKK D--INV-GVG DSGGMEVVQE
-             ----HRLVVK VAD-ELYNNI ---YHAIPKK D--GVLLGIG DSGGMEMVQE
-             ----HRLVVK VAD-ELYNNI ---YHAIPKK D--GVLLGIG DSGGMEMAQE
-             ----HRLVDQ VVD-ELYSKF ---YHAIPKK P--GNM-GVG DSGGMEMVQE
-             ----HRLVDQ VVD-ELYSKF ---YHAIPKK P--GNM-GVG DSGGMEMVQE
-             ----HRLVDK VVD-ELYSKF ---YHAIPKK P--GNM-GIG DSGGMEMVQE
-             ----HRLVDR VVD-ELYSKF ---YHAIPKK P--GNM-DVG DSGGMEMVME
-             ----HRLVDK VVD-ELYSKF ---YHAIPKK P--GNM-DVG DSGGMEMVME
-             ----HRLVDK VVD-ELYSKF ---YHAIPKK P--GNM-DVG DSGGMEMVME
-             ----HHMQNI FID-ELYPGG ---YHAAPKK E--EMV-GPG DNGGVEDIKE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-APG DNGGVEAIRE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-APG DNGGVEAIRE
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-APG DNGGVEAIRE
-             ----HHVQNV FID-ELYPGH ---YHAAPKK N--ENV-GPG DNGGVEGIKE
-             ----HHMQDV FID-ELYLGP ---YHASPKK D--RFC-NPG DNGGMETYQE
-             ----HHMQDV FID-ELYLGP ---YHASPKK D--RFC-NPG DNGGMDTYQE
-             ----HHMQDV FID-ELYLGP ---YHASPKK E--RFC-NVG DNGGMETIQE
-             ----HHMQDV FID-ELYLGP ---YHASPKK E--RFC-NPG DNGGMETIQE
-             ----HHMQDV FID-ELYLGP ---YHASPKK E--RFC-NPG DNGGMETIQE
-             ----HHMQDI FID-ELYLGP ---YHASPKK Q--RFC-NPG ENGGMETIRE
-             ----HHMQDI FID-ELYLGP ---YHASPKK E--RFC-NPG ENGGMETIRE
-             ----HHMQDI FID-ELYLGP ---YHASPKK E--RFC-NPG ENGGMETIRE
-             ----HHMQDI FID-ELYPGQ ---YHASPKK K--KIC-GPG DNGGMETIEE
-             ----HHMQDI FID-ELYPGL ---YHASPKK K--KVC-GPG DNGGMETIQE
-             ----HHMQDI VID-ELYPGP ---YHATPKK H--RFC-GTG DNGGMQAIQE
-             ----HHMQDI FID-ELYPGP ---YHATPKK H--RFC-GTG DNGGMQAIQE
-             ----HHMQDI FID-ELYPGP ---DHATPKK H--RFC-GTG DNGGMQTIQE
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RYC-GPG DNGGMQVIEE
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RFC-GPG DNGGMQVIEE
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RFC-GPG DNGGMQVIEE
-             ----HPMQEI FID-ELYPGH ---YHATPKK N--RFC-GPG DNGGMQSMQE
-             ----HPVQDI FID-ELYPGH ---YHATPKK V--RFC-GPG DNGGMQAIQE
-             ----HHMQDI FID-ELYPGR ---YHATPKK N--RYC-GPG DNGGMQPIQE
-             ----HHMQDI FID-ELYPGH ---YQATPKK D--KFC-GPG DNGGMQTIQE
-             ----HHMQDI FID-ELYPGH ---YHATPKK D--KFC-GPG DNGGMQTIQE
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RCC-GPG DNGGMQTVQE
-             ----YHHQNI LID-ELYSNV ---YPAAPKK H--QYM-GVG DVGGYEVICE
-             ----YHHQNI LID-ELYSNV ---YPAAPKK H--QYM-GVG DVGGYEMICE
-             ----YHHQNI LID-ELYNNI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             ----YHHQNI LID-ELYNNI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             ----YHHQNI LID-ELYNDI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             ----YHHQNI LID-ELYNNI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             ----YHHQNI LID-ELYSNI ---YPATPKK H--QYM-GVG DVGGYEVICE
-             ----YHHQNI LID-ELYSNI ---YPATPKK H--QYM-GVG DVGGYEVICE
-             ----YHQQNI LTD-ELYSDV ---YPAAQKK Y--QVM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDL ---YPAAPKK Y--QEM-GVG DIGGYELIVE
-             ----YHQQNL LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELIVE
-             ----YHQQNL LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELIVE
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QIM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QIM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QIM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRVM-GVG DIGGYEMICE
-             ----YHQQNI LTD-ELYSDV ---YPTAPKK YVIRVM-GVG DIGGYELICE
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRQM-GMG DIGGYELICE
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRQM-GMG DIGGYELICE
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRQM-GMG DIGGYELICE
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIREM-GVG DIGGYELICE
-             ----YHHQNT LVD-ELYSDV ---YPAAPKK K--VCM-GVG DVGGYEVMGE
-             ----YHHQNT LVD-ELYSDI ---YPAAPKK K--VCM-GVG DVGGYEVMGE
-             ----YHHQNT LVD-ELYSDI ---YPAAPKK K--VCM-GVG EVGGYEVMGE
-             ----YHDQNT LVD-ELYSDV ---YPAAPKK K--VCM-GVG DVGGYEVMGE
-             ----YHNQNT LVD-ELYSDV ---YPAAPKK Q--HYM-GVG DVGGYEVMGE
-             ----YHNQNT LVD-ELYSDV ---YPAAPKK Q--HYM-GVG DVGGYEVMGE
-             ----YHNFNA LVD-ELYSDV ---YPAAPKK K--HYM-GVG DVGGYEVMGE
-             ----YHHQNS LVD-ELYSDV ---YPAAPKK K--HYM-GVG DVGGYEVMGE
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNI LVD-ELYSDV ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNM LVD-ELYSDM ---YPAAPKK K--VYV-GAG DVGGYEVMSE
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             ----YHHQNV LVD-ELYGEA ---YPAAPKK K--HYM-GAG DVGGYEVMSE
-             ----YHHQNV LVD-ELYSEL ---YPAAPKK A--HYM-GAG DIGGYEVMSE
-             ----YHHQNV LVD-ELYSEV ---YPAAPKK A--FYM-GAG DIGGYEVMSE
-             ----YHHQNA LVD-ELYSDV ---YPAAPKK K--HYM-GEG DVGGYEVMSE
-             ----YHHQNV LVD-ELYSDG ---YPAAPKK K--HYM-GEG DVGGYEVMSE
-             ----YHYQNI LVD-ELYSND ---YPAAPKK A--QFM-GVG DVGGYEIVCE
-             KGKSEILQNM GSA-VLYNDV IRDHNASEQK E--AHV-PMG DEGRISRAKD
-             KGKSEILQNM GSA-VLYNDV IRDHNASEQK E--AHV-PMG DQGRISRAKD
-             KGKSEILQNM GSA-VLYNDV IRDYNASEQK E--AHV-PMG DQGRISRAKD
-             KGKSEILQNM ESA-HLYNAV IRDNNASEQK E--AHV-PVG DEGRISRAKN
-             KGKSEILQNM ESARHLYNAV IRDNNASHQK E--AHV-PAG DQGRISRAKN
-
-             DIFQILVCV
-             DIFQILVCV
-             DIFQILVCV
-             DIFQILVCV
-             DVFQILVCI
-             DVFQILVCI
-             DVFQILVCI
-             DVFQILVCI
-             DVFQILVCI
-             DVFQILVCI
-             DVFQILVCI
-             DLFQILVCA
-             DLFQILVCV
-             DVFQILVCL
-             DVFQILVCL
-             DLFQILVCI
-             DVFQILVCV
-             DVFQILVCV
-             DVFQILVCA
-             DMFQVLVCR
-             DMFQVLVCK
-             DMFQVLVCK
-             DMFQVLVCK
-             DMFQVLVCK
-             DMFQVLVCK
-             DMFQVLVCK
-             DMFQVLVCK
-             DMFQVLVCQ
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCI
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVYV
-             DMFQVLVYV
-             DMFQVLVYV
-             DVFQVLVCV
-             DVFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             DMFQVLVCV
-             NLFQILVVE
-             NLFQILVVE
-             NLFQILVVE
-             NLFQILVVE
-             NLFQILVVE
-             NLFQILVVE
-             NLFQILVVE
-             NLFQILVVE
-             DLFQILVCQ
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCQ
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVCE
-             DLFQILVHE
-             DLFQILVHE
-             DLFQILVHE
-             DLFQILVHE
-             DLFQILVHG
-             DLFQILVHA
-             DLFQILVHE
-             DLFQILVHE
-             DLFQILVHE
-             DLFQILVHE
-             DLFQILVHK
-             DLFQILVHA
-             DLFQILVHA
-             DIFQILVCD
-             EIMYIRDLE
-             EIMYIRDLE
-             EIMYIRDLE
-             EILYIRDLE
-             EILYIRDLE
-
diff --git a/test/example.ph3 b/test/example.ph3
deleted file mode 100644
index bc08705..0000000
--- a/test/example.ph3
+++ /dev/null
@@ -1,2601 +0,0 @@
- 100 1209 I 
-t73          LIVSQIRVMV RDG--IHKAM DEE-V----- -------LIA RRVKPYSGNG
-             TQVRNDVEDA N--CQEFVGI ---RELGKH- YK-CMDGFHT VNNGAGEN-S
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVKRDVQK FPKLKEGAPN
-             CSSFVKPYFM GCDMFHKQVE YRGTHGLVLD DTWNEESATF PYPQVHSRSD
-             KRCLNGLHQG DHEESVH--- HAPRI----M R---LIGH-H LVIIVLMNHD
-             MGRLNHLEPD AVIPSPLRIG GDGWVPKPI- ---------- -------EDG
-             FFDK-D-Q-- ----SRPDVA NASIVPDK-- --DQWVGAHN QWGSSLRKVG
-             LAVHDLR-NI SDLYRCVWMD CHLGANHYRQ ISRMKMITPT YTHMTEYANG
-             L----WHPFY KASDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             VHG-ALYLIG MKTVVKPLLG DWEGCKCRS- --KLYVSQLD H----KTLSK
-             -NLGLY--MQ KRTWLATAPL Q------IGC MFMLVGRKKN SEE-NYNKAA
-             DPTVIWFYTQ PIVYV-ADVF GCTKGKNPQE MRG------N NVMSESLGDD
-             NLQD--MSGV PVTVCTSSVM VRKDMQD-SV DKRGCTWNAK E-DHLCPSSF
-             CKGER---ED EPGGVTQ--- ---------- ----RCIENI AKLLYIKDV-
-             LCNEVLNGLQ WQLCWSV-GD WESLIPQACW DAKKDLAVCA WKMELVPGL-
-             --NRNNENLA KVIYFGPDGH -------DEG PMQAKIVTLH W-EMDVSHRG
-             -SSVDDNVV- VVMLAFAVSF CHPWGHYIQG LGD-QHKLAR PNT---AQKL
-             SILT---VFH FSGGFRDKPM -ERSQLHS-T YSED----KK DQKVLIHAMK
-             -RNKGLDWHA GND-MKGGPK -IIYLGMLFY -------AEN NVAKQKAHFV
-             VFL-ISDATR LLIVHEGCMI DYTFMEFACH PFFAELFMEH MVARYQYYSN
-             VDIKIFDTCF RSAVYAVDNS WETLCDY-EM LSGYFGAEIN HNPRLPEQVC
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIAIRVSGS E-SENVVLQY
-             CLYYEENKSI R--------- --QNNTGSAD LPK------- ----------
-             ----DRLVNS FVD-ELYNSI ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             DIFQILVCV
-
-t66          LIVSQIRVMV RDG--IHKAM DEE-V----- -------LIA RRVKPCSGNG
-             TQVRNDVEDA N--CQEFVGI ---RELGKH- YK-CMDGFHT VNNGAGEN-S
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVKRDVQK FPKLKEGAPN
-             CSSFVKPYFM GCDMFHKQVE YRGTHGLVLD DTWNEESATF PYPQVHSRSD
-             KRCLNGLHQG DHEESVH--- HAPRI----M R---LIGH-H LVIIVLMNHD
-             MGRLNHLEPD AVIPSPLRIG GDGWVPKPI- ---------- -------EDG
-             FFDK-D-Q-- ----SRPDVA NASIVPDK-- --DQWVGAHN QWGSSLRKVG
-             LAVHDLR-NI SDLYRCVWMD CHLGANHYRQ ISRMKMITPT YTHMTEYANG
-             L----WHPFY KASDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             VHG-ALYLIG MKTVVKPLLG DWEGCKCRS- --KLYVSQLD H----KTLSK
-             -NLGLY--MQ KRTWLATAPL Q------IGC MFMLVGRKKN SEE-NYNKAA
-             DPTVIWFYTQ PIVYV-ADVF GCTKRKNPQE MRG------N NVMSESLGDD
-             NLQD--MSGV PVTVCTSSVM VRKDMQD-SV DKRGCTWNAK E-DHLCPSSF
-             CKGER---ED EPGGVTQ--- ---------- ----RCIENI AKLLYIKDV-
-             LCNEVLNGLQ WQLCWSV-GD WESLIPQACW DAKKDLAVCA WKMELVPGL-
-             --NRNNENLA KVIYFGPDGH -------DEG PMQAKIVTLH W-EMDVSHRG
-             -SSVDDNVV- VVMLAFAVSF CHPWGHYIQG LGD-QHKLAR PNT---AQKL
-             SILT---VFH FSGGFRDKPM -ERSQLHS-T YSED----KK DQKVLIHAMK
-             -RNKGLDWHA GND-MKGGPK -IIYLGMLFY -------AEN NVAKQKAHFV
-             VFL-ISDATR LLIVHEGCMI DYTFMEFACH PFFAELFMEH MVARYQYYSN
-             VDIKIFDTCF RSAVYAVDNS WETLCDY-EM LSGYFGAEIN HNPRLPEQVC
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIAIRVSGS E-SENVVLQY
-             CLYYEENKSI R--------- --QNNTGSAD LPK------- ----------
-             ----DRLVNS FVD-ELYNSI ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             DIFQILVCV
-
-t32          LIVSQIRVMV RDG--IHKAM DEE-V----- -------LIA RRVKPYSGNG
-             TQVRNDVEDA N--CQEFVGI ---RELGKH- YK-CMDGFHT VNNGAGEN-S
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVKQDVQK FPKLKEGAPN
-             CSSFVKPYFM GCDMFHKQVE YRGTHGLVLD DTWNEESATF PYPQVHSRSD
-             KRCLNGLHQG DHEESVH--- HAPRI----M R---LIGH-H LVIIVLMNHD
-             MGRLNHLEPD AVIPSPLRIG GDGWVPKPI- ---------- -------EDG
-             FFDK-D-Q-- ----ARPDVA NASIVPDK-- --DQWVGAHN QWGSSLRKVG
-             LAVHDLR-NI SDLYRCVWMD CHLGANHYRQ ISRMKMITPT YTHMTEYANG
-             L----WHPFY KASDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             VHG-ALYLIG MKTVVKPLLG DWEGCKCRS- --KLYVSQLD H----KTLSK
-             -NLGLY--MQ KRTWLATAPL Q------IGC MFMLVGRKKN SEE-NYNKAA
-             DPTVIWFYTQ PIVYV-ADVF GCTKGKNPQE MRG------N NVMSESLGDD
-             NLQD--MSGV PVTVCTSSVM VRKDMQD-SV DKRGCTWNAK E-DHLCPSSF
-             CKGER---ED EPGGVTQ--- ---------- ----RCIENI AKLLYIKDV-
-             LCNDVLNLLV WQLCWSV-GD WESLIPQACW DAKKDLAVCA WKMELVPGL-
-             --NRNNENLA KVIYFGPDGH -------DEG PMQAKIVTLH W-EMDVSHRG
-             -SSVDDNVV- VVMLAFAVSF CHPWGHYIQG LGD-QHKLAR PNT---AQKL
-             SILT---VFH FSGGFRDKPM -ERSQLHS-T YSED----KK DQKVLIHAMK
-             -RNKGLDWHA GND-MKGGPK -IIYLGMLFY -------AEN NVAKQKAHFV
-             VFL-LSDATR LLIVHEGCMI DYTFMEFACH PFFAELFMEH MVARYQYYSN
-             VDIKIFDTCF RSAVYAVDNS WETLCDY-EM LSGYFGAEIN HNPRLPEQVC
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIAIRVSGS E-SENVVLQY
-             CLYYEENKSI R--------- --QNNTGSAD LPK------- ----------
-             ----DRLVNS FVD-ELYNSI ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             DIFQILVCV
-
-t75          LIVSEIRVMV RDE--VHKAM DEE-C----- -------LIA RRVKPYSGNG
-             NQIRNDIEDA N--GQEFVGI ---RELGKH- YD-CMDGYHT VNNGAGEN-S
-             ESAMWIFDLW MCKLNHGMQR --------GD IGRVQQDVHK FPKLKEGAPN
-             CSSFVKPVFM GCDMFHRQVQ NRGNHGLVLD DTWNEESGTF PYPQVHSRNE
-             KRCINKLHQG DHNESCH--- HNPRI----V R---RIGH-H LVIIVLVNRD
-             MGRLNYIEPD ALVPSPLRFG GDEWVPKPI- ---------- -------EDG
-             FFDK-D-Q-- ----ARPDVA NA-IVPDR-- --DQWVGAHK EWGSSLCKVG
-             LAVHDLR-NV SDLYRCVWME CVLGANHYQQ VSRMKMVTPA YTHMTEYANG
-             L----WHPFY KNPDHKNEAQ GVGEK-PHQL PCVESETCQY ETKHAKVCKQ
-             VHG-ALYLIG MKTVAKPVLG DWEGCKCRSD LIKLYVSQLD H----KTLSK
-             -NMGLY--MR NRTWLATSPL Q------IGC IFMLVGRKKN SEE-NYNKAA
-             DPTVIWFYTQ PIVYV-ADVF GCTKGKNPQE MRK------N NVISESLGDD
-             NLQD--MPGM PVTVCTSSVM VRKDMHQ-SV DKRGYTWHAK E-DHLCPDSF
-             CKGEK---EE EPGGVRR--- ---------- ----RIVENI VKLLYIKDV-
-             LCNQVLNLLQ WQLCWSV-GD WESLVPQACW GAKKDLAVCA WKMELVPGL-
-             --NRNNENLA KIIYFGPDGH -------DEG NMQAKIVTLH W-EMDVSHRG
-             -SSVDDNVV- VVMLAFQASF CDPWGHYIQG LGD-QYKLAR PNT---ARQL
-             SILV---VMH FSGGFRDKPI -ERSQLHC-T YSEN----KK DQKVVIRAMK
-             -RNKGCDWHA GKD-MAGGPK -IIYVGMLFY -------AES NWAKQKAHFV
-             VFL-ISDATR LLIHHVGCMI EYTFMEFACH PFFAELFMEH MVIRYQYYNN
-             VDIKIFDTCF RGAVYAEDNS WETLCGY-EM LSGYFGAEIN HNPRLPEQVC
-             -PPCTITVSG LKGKLHNRWP VLTQITRTMR IQIPIRISGS E-SENVVLQY
-             CLYYEENKSI R--------- --QNNTGSAV LPK------- ----------
-             ----DRLVNN FVD-ELYNSV ---YTAAPKK K--RHL-GIG DNGGMELVRE
-             DIFQILVCV
-
-t79          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTFSGSQ
-             NQVRNAVEDA A--RPDFVGT ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             CSSIPMPYFL GVDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGL-N LVIISYANVD
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------GDG
-             FFDK-D-Q-- ----ARPLMA NAVCVPEN-- --DQWTGAVG QWCSSVVKCG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             L----WKPFY QASDHKNEAQ GVGER-THQL PCVESHTCQY EVKHAKVCKL
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SAN-NYNRAG
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             SLQQ--MPAV PVDVCVMSVM VNKSMPQ-SH DKRGYTWQAK Q-DHLFPVNV
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             DCNMVLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             -SSVRDNMI- VIMLPFNINS IDPWRHYILG LND-QIQLTR PNT---ARRL
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFSELFMEH VYIRYQYINN
-             HDIKIKDTVF RLAVYAWDNF WETLCKC-EM LSGHVGAKIN HNPRLFEQVC
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IRIKIREPGS E-SENTVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----ARLVNK VVD-ELYNNV ---YHAIPKK E--MNQ-GVG DSGGVEMVQE
-             DVFQILVCI
-
-t27          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTMSGSQ
-             NQVRNAVEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             MGRLNHCEDQ AIVYSPLRYG GAGFVSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPLMA NAVCVPEN-- --DQWTGAVG QWCSSVVKCG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             L----WKPFY QASDHKNEAQ GVGER-THQL PCVESHTCQY EVKHAKVCKL
-             VHH-ALYLLG IHTVMKPHLG NVDGCRCRSD LNNLILSQLD D----KTLSK
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SAN-NYNRAG
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNC
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE GARRDLAVCA WKRELVPGL-
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ARRL
-             SILH---VMH YSGAFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             -VNKDHDWIT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFSELFMEH VYIRYQYVNN
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IRIKIREPGS E-SENTVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----ARLVNK VVD-ELYNNV ---YHAIPKK D--MNQ-GVG DSGGVEMVQE
-             DVFQILVCI
-
-t93          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTMSGSQ
-             NQVRNAVEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             MGRLNHCEDQ AIVYSPLRYG GAGFVSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPLMA NAVCVPEN-- --DQWTGAVG QWCSSVVKCG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             L----WKPFY QASDHKNEAQ GVGER-THQL PCVESHTCQY EVKHAKVCKL
-             VHH-ALYLLG IHTVMKPHLG NVDGCRCRSD LNNLILSQLD D----KTLSK
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SAN-NYNRAG
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNC
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE GARRDLAVCA WKRELVPGL-
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ARRL
-             SILH---VMH YSGAFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             -VNKDHDWIT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFSELFMEH VYIRYQYVNN
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IRIKIREPGS E-SENTVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----ARLVNK VVD-ELYNNV ---YHAIPKK D--MNQ-GVG DSGGVEMVQE
-             DVFQILVCI
-
-t59          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTFSGSQ
-             NQVRNAVEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             ESAVVIFDVW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPLMA NAHCVPEN-- --DQWTGAVG QWCSSVVKCG
-             LADHPLE-NI SRLLRCVVME CILGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             M----WKPFY QASDHKNEAQ GVGER-THQL PCVDSHTCQY EVKHAQVCKL
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SGN-NYNQAG
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNF
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             DCNIDLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ACRL
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             IFL-ICDAVR ILILHHGCMT DHTFMEFACN PFFAELFMEH VYIRYQYVNN
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IGIKIREPGS Q-SENTVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----HRLVNK VVD-ELYNNV ---YHAIPKK D--MNQ-GVG DSGGVEMVQE
-             DVFQILVCI
-
-t7           LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKKFSGSQ
-             GQVRNAIEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             CSSMPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPLMA NAHCVPEN-- --DQWTGAVG QWCSSVVKCG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             M----WKPFY QASDHKNEAQ GVGER-THQL PCVDSHTCQY EVKHAQVCKL
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SGN-NYNRAG
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNF
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ACRL
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             IFL-ICDAVR ILILHHGCMT DRTFMEFACN PFFAELFMEH VYIRYQYVNN
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IGIKIREPGS Q-SENTVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----HRLVNK VVD-ELYNNP ---YHAIPKK D--MNQ-GVG DSGGIEMVQE
-             DVFQILVCI
-
-t78          LIVSEVRVMV RDG--LNIAI DEL-C----- -------LIA NRVKTFSGSQ
-             GQVRNAIEDA A--RPDFVGI ---RELGKQ- YE-CMDGVGA VDTGAGDN-S
-             ESAVVIFDIW MCQLPHGMQW --------GD IGRVVVDHPK FLKLEEGAPN
-             CSSIPMPYFL GCDMFHREVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLHQG DHEESRH--- HNARI----V R---RIGM-N LVIISYANVD
-             MGRLNHCEDE AIVFSPLRYG GAGFVSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPLMA NAHCVPEN-- --DQWTGAVG QWCSSVVKCG
-             LADHPLE-NI SRLLRCVVME CVLGANVYHQ ISRMKMHGPT YSHVMEYAHG
-             M----WKPFY QASDHKNEAQ GVGER-THQL PCVDSHTCQY EVKHAQVCKL
-             VHH-ALYLLG LRTVMKPHLG DVDGCRCRSD LNNLILSQLD D----KTLSK
-             -NCFTY--LG NMTWLATSPL H------IGC MIIFVGRKQQ SGN-NYNRAG
-             DPTTICFCRK PIVMH-ADVF GCARAKDPQE MRM------N NVISESLGDD
-             SLQQ--MPAV PVTVCVMSHM VKKSMPQ-SH DKRGYTWQAK Q-DHLFPVNF
-             VKGEQ---EE EPEGADQ--- ---------- ----RTVHDM VRLLYSKDV-
-             DCNIVLSLLV WQLC--H-GD WEPLLPQACE SARRDLAVCA WKRELVPGL-
-             --NHNNEFLA KIIYFGPDGH -------DEG PMGQKIVDLH W-EMEASHRE
-             -SSVRDNMI- VIMLPFSINS IDPWRHYILG LND-QIQLTR PNT---ACRL
-             SILH---VMH YSGEFHDKSA -ERSQLHS-R YSEH----KN DHKCVILASK
-             -HNKDHDWAT GKDEMKGGAK -IMNPGALFY -------AEQ NWVRPKNHFV
-             IFL-ICDAVR ILILHHGCMT DRTFMEFACN PFFAELFMEH VYIRYQYVNN
-             HDIKIKDTVF RLAVYAWENF WETLCNC-EM LSGHVGAKIN HNPRLFEQVC
-             -PPVELTVSG LKGKV-NGWP YLTDITRTPL IGIKIREPGS Q-SENTVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----HRLVNK VVD-ELYNNP ---YHAIPKK D--MNQ-GVG DSGGIEMVQE
-             DVFQILVCI
-
-t12          LIVSEVRVMV RDG--INIAI DEL-C----- -------LIA NRVKAFSGHQ
-             NQVRNAMEDA Q--RPDFVGI ---RELGKQ- YQ-CMDGHGA VDTGAGRN-S
-             ESAVWIFDIW MCKLAHGMQW --------GD IGRVSVDHPK FLKLEEGAPR
-             CSSCPMPYFL GCEMFHRQVI LKGAKGLVLP D--NEDSMAF PYVQVHSRSV
-             KRCLNVLVQG DHDESRH--- HNARI----V A---RIGM-N MVIIRYLNVE
-             MGRLNHCEDD AMVYSPLRIG GAGTHSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPLIA NAHIVPEN-- --DQWTGAVA QWCSSVIKCG
-             LANHDLE-NI SRLLRCVVME CVLGANVYHQ ASRMKMHGPY YAHVTEYAHG
-             L----WKPFY QTSDHKNEAQ GVGES-THQL PCVESQTCQY EVKHAKVCKL
-             VHH-ALYLLA LHTMMKPRLG DIDGCRCRSE LNKLALSQLD D----KTLSK
-             -NCFQY--LG NMTWLATSPL H------VGC MIIF------ ----------
-             ---------- ---------- ---------- --V------N NVLSQSLGDD
-             SLQQ--MHAM PVTVVVVSHM VKKSMPQ-SH DKRGYTWQAK DFDQLIPVSF
-             VKGEQ---EE EPEGPNN--- ---------- ----RVVHNI VKLLYTKDV-
-             DCNTVLSLLI WQLC--H-GD WEQLVPQACA GARSDLAVCA WKRELVPGL-
-             --NHNNENLA KVIYFGPDGH -------DEG PMGRKIVDLH W-EMEASHRD
-             -SSVRDNML- VIMLPFLVNN LDPWRHYILG LND-QIQLTR PNT---ARRL
-             SILM---VMH YSGEFHDKSP -ERSQLHFDS YSEH----KN DHKCVILASK
-             -HNKGLDWAT GKDDMKGGAK -IMMSGALFY -------AEQ NWIRARNHFV
-             IFL-ICDAVR ILIVLHGCMT AWTFMEFACN PFFAELFMEH VYIRYQYVNN
-             HDIKIKDTEF RLAVYAWENS WETLCNC-EM LSGHIGAKIN HNPRLFEQVC
-             -PPCELTVSG LKGKH-VGWP YLTDITRTPL IRIQIREPGS E-CENSVVMY
-             VIYYKERKSI R--------- --QNNTGCAK LPQ------- ----------
-             ----HRLVNK VVD-ELYNNV ---YHAIPKK D--INV-GVG DSGGMEVVQE
-             DVFQILVCI
-
-t81          LIVSEVRHMV RDG--ANVAI DEL-C----- -------LIA CRVKAFSGHG
-             HQVRNAVEDA A--RPDFIGI ---RELGKP- Y--CMDGHGA VNTGAGHN-S
-             ESAVWIFDIW MYKLSHGMQW --------GD IGRVGVDHPK FLKLEEGAPN
-             CSSLPMPYFL GVDMFHRQVT IKGAKGLVLP DIWNESPMAF PYAQVHSKSH
-             KRCLNVLVQG DHEESEH--- HNARI----M S---KIGT-H LVIINIINVE
-             MQRLNHCEDK AIVYSPDRIG GAGFHSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPIIA NAHIVPVN-- --DQWTGPMA QWCSSVIKCG
-             LANHELE-DV SRLLRCVGME CNLGANHYHQ VSRMKMHGPI YSHMTEYAVG
-             L----WKPFY QASEHKNEAQ GLGER-PHQL PCVESQTCQY EIKVAKVCKL
-             VHV-ALYLVG LKTVVKPKLG DWDGIRCRSE LNKLYLSQLD D----KTLSK
-             -NCFIY--LG NMTWLATSPL Q------IGW LVLFDGRKRQ SAE-DYNRAA
-             DPTTISFCRK PIVQH-ADVF GCDRDKDPQE MRT------N NVISESLGDD
-             FLQQ--MPAV PVSVCVYSHM VKKFVPQ-SH EKRGYTWKAK E-DHLVPISY
-             CKGEH---EE EPEGAQY--- ---------- ----RVVQNI VKLLYTKDV-
-             DCNVVLSLLV WQLC--H-GD WEPLIPQACQ TAKKDLAVCA WKRELVPGL-
-             --NCNNEYLA KIIYFGPDGH -------DEG PMGRKIVDLH W-EMEASHRD
-             -SSVRDNYI- VIMLPFKINS RDPWRHYILG IND-QVCLNR PET---ARRL
-             SILA---VMH YSGEFHDKSP -ERSHLHF-R YSEM----KN DVKCVI---K
-             -SNKGLDWTA GKDGMKGEAK -AMMNGALFY -------AEQ NWFRKKNHFV
-             IFV-FCDAVR ILIMHSGVMI GYTFMEFACN PFFAELFMEH VMVRYQYESN
-             HDIKIKDTCF RLAVYAWENS WETLCNV-EM LSGHFGAKIN HVPRLPEQVC
-             -PPCDLTVSG LKGKQ-NGLP YLTDITRTPL IRIQIRVPGS E-SENVVVMY
-             MVYYKERKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVVK VAD-ELYNNI ---YHAIPKK D--GVLLGIG DSGGMEMVQE
-             DLFQILVCA
-
-t21          LIVSEVRHMV RDG--ANIAI DEL-C----- -------LIA CRVKAFSGHG
-             NQVRNAVEDA P--RPDFIGV ---RELGKP- Y--CMDGHGA VNTGAGVN-S
-             ESAVWIFDIW MYKLSHGMQW --------GD IGRVDVDHPK FLKLEEGAPN
-             CSSLPMPYFL GVDMFHKQVT LKGAKGLVLP DIWNESPMAF PYAQVHSKSH
-             KRCLNVLVQG DHEESEH--- HNARI----M S---RIGT-H LVIVNVINVE
-             MQRLNHCEDK AIVYSPDRIG GAGFHSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPIIA NAHIVPIY-- --DQWTGPMA QWCSSVIKCG
-             LANHELK-VV SRLLRCVGME CNLGANHYHQ VSRMKMHGPI YSHMTEYAHG
-             L----WKPFY QASEHKNEAQ GVGER-PHQL PCVESQKCQY EVKVAKVCKL
-             VHV-ALYLVG LKTVVKPKLG DWDGVRCRSD LNKLYLSQLD D----KTLSK
-             -NCFRY--LG NMTWLATSPL Q------NGC VVIFAGRKRQ SAE-DYNRAA
-             DPTTIAFCRK PIVQH-ADVF GCDKDKDPQE MRM------N NVISESLGDD
-             FLQQ--MPAV PVSVCVHSHM VKKFVPQ-SH EKRGVTWKAK E-DHLVPISL
-             CKGEH---EE EPEGAQY--- ---------- ----RCVQNI VKLLYTKDV-
-             DCNVVLSLLV WQLC--H-GD WEPLVPQACQ TAKKDLAVCA WKRELVPGL-
-             --NCNNEYLA KIIYFGPDGH -------DEG PMGRKIIQLH W-EMEASHRD
-             -SSVRDNII- VIMLPFKINS RDPWRHYILG LND-QVCLTR PET---ARRL
-             SILV---VMH YSGEFHDKSP -ERSHLHY-R YSEV----KN DVKCVILASK
-             -SNKGLDWTA GKDGMKGENK -AMMNGTLFY -------AEQ NWFRQKNHFV
-             IFV-ICDAVR ILIVHSGVMT GFTFMEFACN PFFAELFMEH VYIRYQYQAN
-             HDIKIKDTCF RLAVYAWENS WETLCNV-EM LSGHFGAKIN HVPRLPEQVC
-             -PPCDLTVSG LKGKQ-NGWP YLTDITRTPL IRIQIRVPGS E-SENITVMY
-             MVYYKERKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVVK VAD-ELYNNI ---YHAIPKK D--GVLLGIG DSGGMEMAQE
-             DLFQILVCV
-
-t80          LIVSEVRHMV RDG--VNIAV DEI-C----- -------LIA NRVKSMSGQG
-             NQVRNAMEMA A--RQNFVGM ---RELEKV- YE-CMDGQGA VNTEAGNN-S
-             ESAVWIFDIW MCKLTHGMQD FGD-----GD IGRVVVDHPK FEKLEEGAPN
-             CSSHPVPYFL GIDMFHKQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             RRVLNVLHQG DVEES-H--- HSARC----V R---RIGF-H LVIIVFWNVE
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPV- ---------- -------DDG
-             FFDK-D-Q-- ----ARPVIA SAHIVPEH-- --DQWSGAMA QWCSSVIKCG
-             LANHDLE-NV SRLLRCVMID CNQGANHYIQ ISRMKVHGPT YSHMTEYAHG
-             L----WKPFY QASDHKNDAQ GVGER-PHQL PCVESQTCQY EMKHAKVCKL
-             VHG-ALYLIA LKTVVKPKLG VWQGCRCRSQ LSKLVLSQLD E----KTLSK
-             -NCSIY--LG NMTWLATSPL Q------IGC VILFGGRKRQ SHGLNYNRAA
-             DPTTICFYKK PIVVQGADVF GCARGKDPQE MKA------N NVISGSLGDD
-             RLQQ--MPAM PVTICVSSYM VKKSVIQ-SH QKRGYTWRAK E-DHLIPVSF
-             CKGEL---DE EPDAAQQ--- ---------- ----RIVQNI VKLLYTKDV-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACS NARKDLAVCA WKRELVPGL-
-             --NHNNENLA KIMYFGHDGH -------DEG PMGRKIVTLH V-EMEVSHRE
-             -SSVKDNMIR VIMLPFSNSS VDPWRHVILG LND-QIKLTR PNT---AHRL
-             SILV---VTH YSGGFHDKSA -ERSQHHF-I YNEV----KD DHKCVILASK
-             -CNKGLDWAA GKD-MKGGAK -VMMNGALFY -------AER NWIRQKHHFV
-             IFV-VCDAVR ILIVHYGCMI GYTFMDFACN PFFAELFMDH VFIRYVYMNN
-             HDIKIMDTCF RVAVYTWENS WETCFNR-EM LSGTFGAKIS HNPRLPEQVI
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IKIHIRVPGS Q-SENHVVMY
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVDQ VVD-ELYSKF ---YHAIPKK P--GNM-GVG DSGGMEMVQE
-             DVFQILVCL
-
-t14          LIVSEVRHMV RDG--VNIAV DEI-C----- -------LIA NRVKSMSGQG
-             NQVRNAMEMA A--RQNFVGM ---RELEKV- YQ-CMDGQGA VNTEAGNN-S
-             ESAVWIFDIW MCKLTHGMQD FGD-----GD IGRVVCDHPK FEKLEEGAPN
-             CSSHPMPYFL GVDMFHEQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             RRVLNVLHQG DVEES-H--- HSARC----V R---RIGF-H LVIIVYWNVE
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPV- ---------- -------DDG
-             FFDK-D-Q-- ----ARPVIA SAHIVPEH-- --DQWSGAMA QWCSSVIKCG
-             LANHDLE-NV SRLLRCVMID CNQGANHYIQ ISRMKVHGPT YSHMTEYAHG
-             L----WKPFY QASDHKSDAQ GVGER-PHQL PCVESQTCQY EMKHAKVCKL
-             VHG-ALYLIA LKTVVKPKLG VWQGCRCRSQ LSKLVLSQLD E----KTLSK
-             -NCSIY--LG NMTWLATSPL Q------IGC VILFGGRKRQ SHGLNYNRAA
-             DPTTICFYKK PIVVQGADVF GCARGKDPQE MKA------N NVISGSLGDD
-             RLQQ--MPAM PVTICVSSYM VKKSVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             CKGEL---DE EPDAAQQ--- ---------- ----RIVQNI VKLLYTKDV-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACS NARKDLAVCA WKRELVPGL-
-             --NHNNENLA KIMYFGHDGH -------DEG PMGRKIVTLH V-EMEVSHRE
-             -SSVKDNMIR VIMLPFPSSS VDPWRHVILG LND-QIKLTR PNT---AHRL
-             SILV---VTH YSGGFHDKSA -ERSQHHF-I YNEV----KD DHKCVILASK
-             -CNKGLDWAA GKD-MKGGAK -IMMNGALFY -------AER NWIRQKHHFV
-             IFV-VCDAVR ILIVHYRCMI GYTFMDFACN PFFAELFMDH VFIRYQYMNN
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGAKIS HNPRLPEQVI
-             -PPCELTVSG LKGKH-NGWP YLTEITRTPL IKIHIRVPGS Q-SENHVVMY
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVDQ VVD-ELYSKF ---YHAIPKK P--GNM-GVG DSGGMEMVQE
-             DVFQILVCL
-
-t85          LIVSEVRHVV RDG--VNIAV DEI-C----- -------LIA NRVKSMSGQG
-             NQVRNAMEMA A--RQNFVGM ---RELDKA- YQ-CMDGQKA VNTEAGNN-S
-             ESAVWIFDIC MCKLTHGMQD --------GD IGRVVCDHPK FEKLEEGAPN
-             CSSIPMPYFL GIDMFHKQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             RRVLNVLHQG DHEES-H--- VSARC----M R---RIGF-H LVIINFWNVE
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------NDG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEH-- --DQWSGAMA QWCSSVIKCG
-             LANHDLE-NV SRLLRCVEID CNQGANHYVQ ISRMKMYGPT YSHMTEYAHG
-             L----WKPFY QASDHKNDAQ GVGER-PHQL PCVESQTCQY EVKHANVCKL
-             VHA-ALYLIG LKTVVKPELG VWEGCRCRSQ LSKLALSQLD E----KTLSK
-             -NCSIY--LG NMTWLATSPL Q------IGC IILFGGRKRQ SHGLNYNRAA
-             DPTMICFYKK PIVVQGADIF GCARGKDPQE MKS------N NVISGSLGDD
-             RLQH--MPAM PVTICVFSYM VKKAVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             CKGEL---DE EPDGAQQ--- ---------- ----RVVQNI VKLLYTKDV-
-             SCNKVLSMLI WQIC--H-GD WEPQIPKACN AARKDLAVCA WKRELVPGL-
-             --NHNNEDLA KIMYFGPDGH -------DEG PMGRKIVNLH V-EMEVSHRE
-             -SSVKDNMIR VVMLPFDNNS WDPWRHVILG LND-QIKLTR PNT---AHRL
-             SILV---VMH YSGGFHDKSS -ERSQHHF-I YNEV----KN DHKCVILASK
-             -SNKGLDWAA GKD-MKGGAK -MMANGALFY -------EER NWIRQKNHFV
-             IFV-VCDAVR ILIVHYGCMV PYTFMAFACN PFFAELFMEH VFIRYQYVNN
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGAKIS HNPRLPEQVI
-             -PPCDLTVSG LKGKH-NGWP YLTDITRTPL IKIHIRIPGS Q-SENHVVMY
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVDK VVD-ELYSKF ---YHAIPKK P--GNM-GIG DSGGMEMVQE
-             DLFQILVCI
-
-t62          LIVSEVRVMV RDG--IHIAV DEI-C----- -------LIA NRVKCMSGQG
-             NQARNAMEMA A--RQNFVGM ---RELGKQ- YQ-CMDGQGA VNTEAGNN-S
-             ESAVWIFDIW MCRLTHGMQD --------GD IGRVECDHPK FAKLEEGAPN
-             CSSLPMPYFL GIDMFHNQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             RRVLNVLHQG DHEES-H--- HSARC----M R---RIGY-H RVIINYWNVE
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEY-- --DQWSGAMA QWCSSVIKCG
-             LANHDLE-NV SRLLRCVVID CNHGANHYVQ ISRMKMHGPT YSHMTEYAHG
-             L----WKPFY QASDHKNDAQ GVGER-PHQL PCVEPQTCQY EVKHAKVCKL
-             VHG-ALYLIG LQTVVKPKLG VWEGVQCRSQ LSKLILSQLD D----KTLSK
-             -NCSIY--LG NMTWLATSPL Q------IGC IIMFDGRKRQ SHGLQYNRAA
-             DPTTICFYKK PIVVQGADIF GCARGKDPQE MKA------N NVTSGSLGDD
-             RLQQ--MPAM PVTICVFSYM VKKSVPQ-SH VKRGYTWRAK E-DHLIPVSF
-             CKGEL---EE EPEGAQH--- ---------- ----RMVQNI VKLLYTKDV-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACD AARKDLAVCA WKRELVPGL-
-             --NHNDENLA KIMYFGPDGH -------DEG PMGEKIVNLH V-EMEASHRE
-             -SSVKDNMIR VIMLPFSNNS WDPWRHVILG LND-KIKLTR PNT---AHRL
-             SILV---VMH YSGGFHDKSA -ERSQHHF-I YNEI----KN DHKCVILASK
-             -ANKPLDWAA GKD-MKGGAK -MMANGALFY -------AER NWIRQKNHFV
-             IFI-ICDAVR ILIVHYGCMV GDTFMDFACN PFFAELFMEH VFIRYQYIPN
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGARIS HVPRLPEQVI
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IRIHIRVPGS E-SENHVVMY
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVDR VVD-ELYSKF ---YHAIPKK P--GNM-DVG DSGGMEMVME
-             DVFQILVCV
-
-t19          LIVSEVRHMV RDG--INIAV DEI-C----- -------LIA NRVKCVSGQG
-             NQARNAMEMA A--RQNFVGM ---RELGKQ- YQ-CMDGQGA VNTEAGNN-S
-             ESAVWIFDIW MCRLTHGMQD --------GD IGRVECDHPK FAKLEEGAPN
-             CSSLPMPYFL GIDMFHKQVM GKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             RRVLNVLHQG DHEES-H--- HSARC----M R---RIGYGH LVIINFWNVE
-             MGRLNHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEY-- --DQWSGAMA QWCSSVIKCG
-             LANHDLE-NV SRLLRCVVID CNHGANHYVQ ISRMKMHGPT YSHMTEYAHG
-             L----WKPFY QASDHKNDAQ GVGER-THQL PCVEPQTCQY EVKHAKVCKL
-             VHG-ALYLIG LQNVVKPKLG VWEGVQCRSQ LSKLILSQLD D----KTLSK
-             -NCSIY--LG NMTWLATSPL Q------IGC IILFDGRKRQ SHGLQYNRAA
-             DPTTICFYKK PIVVQGADIF GCARGKDPQE MKA------N NVTSGSLGDD
-             RLQQ--MPAM PVTICVFSYM VKKLVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             CKGEL---EE EPEGAKQ--- ---------- ----RMVQNI VKLLYTKDV-
-             SCNVVLSMLI WQIC--H-GD WEPQIPKACD AARKDLAVCA WKRELVPGL-
-             --NHNDENLA KIMYFGPDGH -------DEG PMGEKIVNLH V-EMEASHRE
-             -SSVKDNMIR VIMLPFSNNS WDPWRHVILG LND-QIKLTR PNT---AHRL
-             SILV---VMH YSGGFHDKSA -ERSQHHF-I YNEI----KN DHKCVILASK
-             -ANKGLDWAA GKD-MKGGAK -MMVNGALFY -------AER NWIRQKNHFV
-             IFV-ICDAVR ILIVHYGCMV GDTFMDFACN PFFAELFMEH VFIRYQYIPN
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGARIS HVPRLPEQVI
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IRIHIRVPGS E-SENHVVMY
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVDK VVD-ELYSKF ---YHAIPKK P--GNM-DVG DSGGMEMVME
-             DVFQILVCV
-
-t77          LIVSEVRHMV RDG--INIAV DEI-C----- -------LIA NRVKSMSGQG
-             NQARNAMEMA A--RQNFVGM ---RELGKQ- YH-CMDGQGT VNTEAGNN-S
-             ESAVWIFDIW LCRLTHGMQD --------GD IGRVECDHPK FAKLEEGAPN
-             CSSLPMPYFL GIDMFHRQVM AKGSKGLILP DTWNEASMAF PYPQVHSKSH
-             RRVLNVLHQG DHEES-H--- HSARC----M R---RIGY-V LVIINFWNVE
-             MGRLIHCEDE AIIYSPLRIG GAGFHSKPI- ---------- -------ADG
-             FFDK-D-Q-- ----ARPVIA NAHIVPEY-- --DQWSGAMP QWVSSVIKCG
-             LANHDLE-NV SRLLRCVVID VNQGANHYVQ ISRMKMHGPT YSHMTEYAHG
-             L----WKPFY QASDHKNDAQ GVGER-VHQL PCVEPQTCQY EVKHAKVCKH
-             VHG-ALYLIG LQTVVKPKLG VWEGCQCRSQ LSKLILSQLD D----KTLSK
-             -NCNIY--LG NMTWLATFPL Q------IGC IILFDGRKRQ SYGLQYNRAA
-             DPTTICFYKK PIVVQGADIF GCARGKDPQE MKA------N NVTSGSLGDD
-             RLQQ--MPAM PVTICVFSYM VKKSVPQ-SH QKRGYTWRAK E-DHLIPVSF
-             CKGEL---EE EPEGAQQ--- ---------- ----RIVQNI VKLLYTKDI-
-             SCNVVLSMLI WQIC--H-GD WEPQLPKACD AARKDLAVCA WKRELVPGL-
-             --NHNDENLA KIMYFGPDGH -------DEG PMGEKIVNLH V-EMEASHRE
-             -SSVKDNMIR VIMLPFGENS WDPWRHVILG LND-QIKLTR PNT---AHRL
-             SILV---VMH YSGGFHDNSA -ERSQHHF-I YNEV----KN DHKCVILASK
-             -ANKGLDWAA GKD-MKGGAK -MMVNGALFY -------AER NWIRQKNHFV
-             IFV-ICDAVR ILIVHYGCMV GDTFMDFACN PFFAELFMEH VVIRYQYIPN
-             HDIKIMDTCF RVAVYTWENS WETCCNR-EM LSGTFGARIS HVPRLPEQVI
-             -PPCELTVSG LKGKH-NGWP YLTDITRTPL IRIHIRVPGS E-SENHVVMY
-             CVYYKEHKSI R--------- --QNNTGCAN LPQ------- ----------
-             ----HRLVDK VVD-ELYSKF ---YHAIPKK P--GNM-DVG DSGGMEMVME
-             DVFQILVCA
-
-t88          LIVSECRLII RDG--NHDAI DEM-CCVAND LNNEIERLVA SMVKSFRGHD
-             SQARNNSECM R--SAPFIGV ---RELFKR- YHKCVEGAGC VHTVAGTP-S
-             DSPVWMFDQF MCQLTHSMVD --------GD LGRVVQDNVI FAKLKEGAPH
-             CISL--PHFL GIDMFHTQVF VGGH--LILP DPCYELSISV MYAGHASYNQ
-             KRCINNLDQG DQEDSNHRKE HKIRASVLLY R---QIGI-L -VIIKEANEL
-             MNRLNHKEPE NGIIFPLR-- -DAQDPKQI- ---------- -------LNG
-             LFDK-E-E-- ----NRPMVQ DADSVVGS-- --AQWAGQHR SWCSSDDKA-
-             ---------- SQLPRNTHIV VEIGANVYEQ FSRMKTNIPI YAHVTEYAVG
-             V----ERPFY E-SEFKNEAQ GWGES-GTSI PCVDSPDVQY EMKVAWVDKL
-             MHT-ALYLMP LATVHKPEMG TVRGERCRAI L-KLLMMQLD ------TLSR
-             -NQLPK--LC QGTWLDASPL Q------IGV QVMLVGKKGG SKK-EYELAA
-             DQVIIYFYQA PIIYVKADVF SGTVAKKAQA MR-------K STGSQSIGDD
-             GMQS--MPLM QNAVCVWSKM VRKVQPD-GQ DKREQTWMAK D-DTLCPPSM
-             KRGEK---TA EPTQWMG--- ---------- ----TVTVNK IKLLYCKDC-
-             SCNEVMKILS WWLCNSV-GD WQTLMSQACI TADPNPPVCV WKRELVPGL-
-             --NRSVENLA KIIYFCPDEH -------DER KMWGKIFALE W-EMDISHRH
-             -SSVDDNHC- VEMLPFMCQR VDPWGHYVQI LAD-RQDLAR PVT---LQAL
-             SILP---CPH ASGKEQDGAV -ERSQHYV-V YAEL----QV DHKCTIAAHK
-             YQDKMKDWDT GKN-MDEGAK -MYVEIHLFY -------AEN NIRRQNDHSV
-             IFW-ISDAKK RLICGMSSMC LVTFMTLACN PLFAKLFMEV VPMRYDYLTN
-             HDIKI----- -MEVYAPENS WETIKNV-EM VSGKEGAEIN HTPQLPEQVI
-             -PPCNLTVSN LKGMI-PPCP ALTEITRTV- -FIV--MYYA I-LRNKIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGG ---YHAAPKK E--EMV-GPG DNGGVEDIKE
-             DMFQVLVCR
-
-t37          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIHHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLRKQNEHSV
-             TFV-ISDAQK RLICGVSSMV MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPVP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             DMFQVLVCK
-
-t35          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTVIPI YARVTEYAVG
-             V----PRPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LATVHKPQMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIYHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLRKQNEHSV
-             TFV-ISDAQK RLICGVSSMA MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             DMFQVLVCK
-
-t48          LIVSDMRLII REG--SDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEVGANVYEQ YSRMKTVIPI YARVTEYAVG
-             V----PRPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIYHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLIKQNEHSV
-             TFV-ISDAQK RLICGVSSMV MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             DMFQVLVCK
-
-t55          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             CIAI--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LSTVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIHHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DTLCPPCE
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACR SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             -SSVDDNQC- VELLPYNCQR MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NLRKQNEHSV
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-SPG DNGGVEAIRE
-             DMFQVLVCK
-
-t46          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVHDNWT FTKLKEGAPH
-             CIAL--PYFM GIDMFHIQVF VGGN--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             MGRLNHKEPK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV KVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIHHKADVF AGTVAKKSQA MRS------R SIGSQSVGDD
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWMAK D-DALCPPCK
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQSLMNDACR SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRH
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQV LAD-RLDLTR PVT---LQGL
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DHKSTIDANK
-             NDNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NIRKQNEHSV
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPDNS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPCP ALTEITRTP- -FIM--MYVA M-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-APG DNGGVEAIRE
-             DMFQVLVCK
-
-t67          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVMDNWT FTKLKEGAPH
-             CIAL--PYFM GIDMFHIQVF LGGD--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPRKE HKIRNSVLLY R---QIGL-L -VIIKEANEL
-             MGRLNHKERK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             V----ARPFY D-AEFKNEAQ RQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIHHKADVF AGTVAKKAQA MRS------R SIGSPSVGDD
-             GMQN--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWVAK D-DTLCPPCK
-             EQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACS SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRM
-             -SSVDDNQC- VELLPYVCQR MDPWGHYVQI LAD-RLVLTR PVT---LHGL
-             SILP---CPH ASGKEQDGAE -ERSQHYG-V YQEL----QN DAKSTIDANK
-             NPNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NIRKLNEHSV
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPVP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-APG DNGGVEAIRE
-             DMFQVLVCK
-
-t57          LIVSDMRLII REG--NDDAI DEM-CCVANE LNNVIERLVA SMVKEFRGHD
-             CQARNNSECI T--AAAFIGT ---RELFKR- YPKCMEGARC VHTVAGPP-S
-             ESPVWMFDKF MCQLTHSMVN --------GD LGRVVMDNWT FTKLKEGAPH
-             CIAL--PYFM GIDMFHIQVF IGGD--LILP DPCYELSISV MYAGHASYNQ
-             KRCINGLDNG DRQDSDPQKE HKIRNSVLLY R---QIGL-L -VIIKEANEI
-             MGRLNHKERK NGVIFPLR-- -GAQGPKQI- ---------- -------SNG
-             LFEK-E-E-- ----NRPMVQ DAGSVPGR-- --KQWAGQHR AWCSSDDKA-
-             ---------- SQLPRNTRIV AEIGANVYEQ YSRMKTNIPI YARVTEYAVG
-             V----ARPFY D-AEFKNEAQ GQGES-GTSI PCVDSPDIQY EMKHAWVEKL
-             MHS-ALYLMP LATVHKPEMG TVKGERCRTI L-KLLMVQLD E----KTLSQ
-             -NQIPD--LC QRTWLDASPL Q------IGV QVVLVGKKRG SKK-DYELAA
-             DPVIIYFYQA PIIHHKADVF AGTVAKKAQA MRS------R SIGSPSVGDD
-             GMQK--MPLM QNAVCVWSQM VRKVQPD-GQ DKREQTWVAK D-DTLCPPCK
-             DQGEK---AA EPTQWVG--- ---------- ----TCTSNV IKLLYCKDC-
-             SCNEVLKILA WWLCDSV-GD WQTLMNDACS SANPNYPVCI WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER RMWGKIFALE W-EMDISHRV
-             -SSVDDNQC- VELLPYLCQR MDPWGHYVQI LAD-RLNLTR PVT---LQGL
-             SILP---CPH ASGKEQDGAV -ERSQHYG-V YQEL----QN DAKSTIDANK
-             NPNKMLDWDT GKN-MDKGAK -MFYKIVLFY -------AEN NIRKQNEHSV
-             TFV-ISDAQK RLICGVSSMC MRTFMTLACN PFFAKLFMEV VPMSYDYVPN
-             HDIKI----- -IEVYAPENS WETTKVV-EM VSGKSGAQIN HTPQLPEQVI
-             -PPCCLTVSN LKGMI-PPVP ALTEITRTP- -FIV--MYVA I-LRNDIMQY
-             CFYYKENRSV R--------- --LNNTGRAE LPK------- ----------
-             ----HHMQNI FID-ELYPGP ---YHAAPKK E--ELM-APG DNGGVEAIRE
-             DMFQVLVCK
-
-t56          LIVSEWRLFI RDG--HDDAI DEM-CCEANE LNNDIEKLVA SMVKGFRGHD
-             SQARNNAECI I--AAPFIGV ---RELFKR- YIKCVEGAGC VYTVA-AP-S
-             ESPVWMFDKF MCHLTHSMVV --------GD LGRVLRDNTT FAKLKEGAPV
-             CISL--PYFL GMDMFHQQVF MGGN--LILP DPCYELSISV MYAGHASYNQ
-             KRCLNNLDQG DREDSSHRKE HKIRRSVLLY Q---QIGC-L -VITRERNEL
-             MGRLNHKEPR DGVIFPHR-- -GAQGPKQL- ---------- -------ANG
-             LFEK-E-E-- ----NRPMVQ DAGSVPER-- --AQWPGQQR AWCSSDDKA-
-             ---------- SKLPRNTKMV AEIGANVYEQ ASRMKTNIPI YAHVTEYALG
-             V----DRPFY D-SEFKNEAQ GQGES-GTSI PCVDSPDVQY ELKHAWVDKL
-             MHT-ALYLMP LPTVHKPKMG TVKGERCRAM L-KLNMMQLD E----KTLSQ
-             -NQIIK--LC QRTWLDASPL Q------IGV NCVLPGKKGG SNK-DYELAA
-             DPVIIYFYQA PIIHHKADVF SGTVAKKAQA MRQ------Q STGSQSVGDD
-             GTQV--MPLM QNLVCVWSKM VRKCMID-GQ EKREQTWMAK D-DKLCPPSQ
-             EQGEK---AA EPTQWED--- ---------- ----ICTANV IKLLYCKDC-
-             SCNEVLRVLS WWLCDSV-GD WRTLMSDACA LANPNPPVCV WKRELVPGL-
-             --NRNVENLA KIIYFCPDEH -------DER KMWGKIFCLE W-EMDISHRH
-             -SSVDDNVC- VEMLPFVCQK MDPWGHYVQI LAD-RLDLTR PVT---LQGL
-             GILV---CPH ASGKEQDGAM -ERSQHYV-V YAEL----QN DHKNTINANK
-             VPRKMLDWDT GKN-MDKGAK GMYHEIVLFF -------AEN NVKKQVEHSV
-             IFI-IADAQK RLICGVSSMC LQTFMNLACN PFFAKLFMEV IPMRYDYQTN
-             HDIKI----- -KEVYAPENS WETIKNV-EM VSGKAGKQIN HEPQLPEQVI
-             -PPCSLTVSN LKGMM-PPCP AMTEITRTV- -III--MYYA I-LRNEIMQY
-             CFYYKENRSV R--------- --INNTGQAE LPK------- ----------
-             ----HHVQNV FID-ELYPGH ---YHAAPKK N--ENV-GPG DNGGVEGIKE
-             DMFQVLVCQ
-
-t13          GIVSECRMII RDE--HDDAI DEM-C----- -------LVA SMVKKLSGCE
-             NQARNNHECA I--PPPFHGV ---REMFKRV YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKV MYQLTHSMVW --------GD LRRVVHDNVT FSKLKEGAPH
-             CISH--PYFL GIDMFHIQVY SKGF--LTLP DPRYEISMSV MYSQHHSFSM
-             KRCLNGLDHG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKDANSM
-             MGRLNHHESR AVVAFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-NEWKQEAQ GQGEA-GACI PCVDSKDVQY ELKHAYVKKL
-             MHT-SLYLMH IETCHKPVMG TVKGNRCRAI L-KLSMIQLD Q----KTLSQ
-             -NQRAK--LC QRTWLDTSPL Q------MGM TLVLVGKKVG SKK-DYEVAA
-             DPVIMYFYDA PMIMRPTDVF EGTNNKKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK D-DTLCPQSR
-             DQGEK---HH EPHHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLSSDACM HAEQNPPVCV WQRELVPQL-
-             --NRNIEDLA RIIYFGPDEH -------DEG KMMNKIFALE W-EMDMSHRV
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQV LAD-QLHLTR PHT---LRDL
-             YILAC--CPV ASGKEQDGNK -ERSQHYT-I YAEI----QN DHKNPISANN
-             QPNKMLDWDT GKT-MDRGAA -MCGEIKLFY -------AEP NVWNQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFSKLFMEV VCMRYNYTSN
-             HSIKI----- -FEVYADENS WENVRNF-EM VSGRAGAHIN HIPQLPEQAY
-             -PPCKLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYGS I-LRNDVMQY
-             VFYYRENRSV R--------- --QNNTGNAE LPK------- ----------
-             ----HHMQDV FID-ELYLGP ---YHASPKK D--RFC-NPG DNGGMETYQE
-             DMFQVLVCV
-
-t5           GIVSECRMII RDE--HDDAI DEM-C----- -------LVA SMVKKLSGCE
-             NQARNNHECA I--PPPFHGV ---REMFKRV YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKV MYQLTHSMVW --------GD LRRVVHDNVT FSKLKEGAPH
-             CISH--PYFL GIDMFHIQVY SKGF--LTLP DPRYEISMSV MYSQHHSFSM
-             KRCLNGLDHG DREESPHQIE HKMRKSVLIY S---PIGY-L -VIIKDANSM
-             MGRLNHHESR AIVAFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-NEWKQEAQ GQGEA-GACI PCVDSKDVQY ELKHAYVKKL
-             MHT-SLYLMH IETCHKPVMG TVKGNRCRAI L-KLSMIQLD Q----KTLSQ
-             -NQRAK--LC QRTWLDTSPL Q------MGM TLVLVGKKVG SKK-DYEVAA
-             DPVIMYFYDA PMIMRPTDVF EGTNNKKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK D-DTLCPQSR
-             DQGEK---HH EPHHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLSSDACM HAEQNPPVCV WQRELVPQL-
-             --NRNIEDLA RIIYFGPDEH -------DEG KMMNKIFALE W-EMDMSHRV
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQV LAD-QLHLTR PHT---LRDL
-             YILAC--CPV ASGKEQDGNK -ERSQHYT-I YAEI----QN DHKNPISANN
-             QPNKMLDWDT GKT-MDRGAA -MCGEIKLFY -------AEP NVWNQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFSKLFMEV VCMRYNYTSN
-             HSIKI----- -FEVYADENS WENVRNF-EM VSGRAGAHIN HIPQLPEQAY
-             -PPCVLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYGS I-LRNDVMQY
-             VFYYRENRSV R--------- --QNNTGNAE LPK------- ----------
-             ----HHMQDV FID-ELYLGP ---YHASPKK D--RFC-NPG DNGGMDTYQE
-             DMFQVLVCV
-
-t38          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             CISQ--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNGLDVG DREESPHHID HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             MGRLNHHESR LIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             VHT-SLYLMH IDTCHKPVMG TIKGNRCRAI L-KLTMIQLD Q----KTLSQ
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLVGKKVG SKK-DYEIAA
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKSQPD-GQ DKRGYTWVAK E-DDLCPQSG
-             DQGEK---YA EPQHIRN--- ---------- ----QFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQI LAD-QLNLTR PHT---LREL
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             MFI-ISDAQN KLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             HSIKI----- -FEVYADENS WENIRNF-EM VSGRAGAYIN HIPQLPEQAV
-             -PPCHLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYVS I-LRNDVMQY
-             VFYYRENRIV R--------- --QNNTGVAE LPK------- ----------
-             ----HHMQDV FID-ELYLGP ---YHASPKK E--RFC-NVG DNGGMETIQE
-             DMFQVLVCI
-
-t33          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             MGRLNHYESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SHLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             VHN-SLYLMH IDTCHKPAMG TVKGNRCRAI L-KLTMIQLD Q----KTLSQ
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLVGKKVG SKK-DYEIAA
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNTPVCV WQRELVPQL-
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQI LAD-QLNLTR PHT---LREL
-             YILA---CPV ASGKEQDGAK -ERSQCYT-I YAEL----QN DHKSLISANH
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             HSIKI----- -FEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             -PPCVLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYVS I-LRNDVMQY
-             VFYYRENRIV R--------- --QNNTGVAE LPK------- ----------
-             ----HHMQDV FID-ELYLGP ---YHASPKK E--RFC-NPG DNGGMETIQE
-             DMFQVLVCV
-
-t100         GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD Q----KTLSQ
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLVGKKVG SKK-DYEIAA
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSE
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             -SSVDDNYI- IEMLPFVCDR VGPWGHYAQI LAD-QLNLTR PHT---LREL
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             HSIKI----- -FEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             -PPCVLTVSN LKGVA-ASCP AITEITRTA- -VIV--MYVS I-LRNDVMQY
-             VFYYRENRIV R--------- --QNNTGVAE LPK------- ----------
-             ----HHMQDV FID-ELYLGP ---YHASPKK E--RFC-NPG DNGGMETIQE
-             DMFQVLVCV
-
-t34          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD V----KTLSQ
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLMGKKVG SKK-DYEIAA
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             -SSVDDNYI- IEMLPFVCDR IGPWGHYAQI LAD-QLNLTR PHT---LREL
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             HSIKI----- -LEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             -PPCVLTVSN LKGVA-ASCP AMTEITRTA- -VIV--MYVS I-LRNDVMRY
-             VFYYRENRIA R--------- --QNNTGVAE LPK------- ----------
-             ----HHMQDI FID-ELYLGP ---YHASPKK Q--RFC-NPG ENGGMETIRE
-             DMFQVLVCV
-
-t84          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCD
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD V----KTLSQ
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLMGKKVG SKK-DYEIAA
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEHNPPVCV WQRELVPQL-
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             -SSVDDNYI- IEMLPFVCDR IGPWGHYAQI LAD-QLNLTR PHT---LREL
-             YILA---CPV ASGKEQDGAK -ERSQCYT-I YAEL----QN DHKSLIAANH
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             HSIKI----- -LEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             -PPCVLTVSN LKGVA-ASCP AMTEITRTA- -VIV--MYVS I-LRNDVMRY
-             VFYYRENRIA R--------- --QNNTGVAE LPK------- ----------
-             ----HHMQDI FID-ELYLGP ---YHASPKK E--RFC-NPG ENGGMETIRE
-             DMFQVLVCV
-
-t92          GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-             DQARNNHECA I--SHPFHGV ---REMFKR- YE-CMEGIGC VNTVAGNP-S
-             ESSAWMFDKF MYQLTHSMVW --------GD LGRVYYDNIT FSKLKEGAPH
-             CISH--PFFL GIDMFHIQVY FKGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNGLDVG DREESPHQIE HKMRKSVLIY N---PIGY-L -VIIKNANSL
-             MGRLNHHESR AIVTFPLR-- -GAEGPKQV- ---------- -------MEG
-             LFLK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI FAHVTEYAVG
-             I----VKPFY D-SEWKQEAQ GQGEA-GACI PCVDSPDVQY ELKHAYVKKL
-             VHT-SLYLMH IDTCHKPVMG TVKGNRCRAI L-KLTMIQLD V----KTLSQ
-             -NQRAR--LC QRTWLDTSPL Q------MGM TIVLMGKKVG SKK-DYEIAA
-             DPVIMYFYQA PMIMRPTDVF EGTNNRKAQA MRS------R STASQSIGDD
-             DMLN--MPLT QNAMCVESEM VRKCQPD-GQ DKRGYTWVAK E-DTLCPQSG
-             DQGEK---YA EPQHIRN--- ---------- ----KFSENV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDACV SAEPNPPVCV WQRELVPQL-
-             --NRNAEDLA RIIYFGPDEH -------DEG KMMCKIFALE W-EMDMSHRM
-             -SSVDDNYI- IEMLPFVCDR IGPWGHYAQI LAD-QLNLTR PHT---LREL
-             YILA---CPV ASGKEQDGAQ -ERSQCYT-I YAEL----QN DHKSLISANH
-             VPNKMLDWDT GKT-MDRGAA -MCAEIKLFY -------AEP NVWKQNDHSV
-             MFI-ISDAQN RLIVANSIMV GQTFMAMACN PHFAKLFMEV VVMRYDYCSN
-             HSIKI----- -LEVYADENS WENIRNF-EM VSGRAGAHIN HIPQLPEQAC
-             -PPCVLTVSN LKGVA-ASCP AMTEITRTA- -VIV--MYVS I-LRNDVMRY
-             VFYYRENRIA R--------- --QNNTGVAE LPK------- ----------
-             ----HHMQDI FID-ELYLGP ---YHASPKK E--RFC-NPG ENGGMETIRE
-             DMFQVLVCV
-
-t3           GIVSECRMII RDE--SDDAI DEM-C----- -------LVA SMVKKLSGCE
-             QQARNNRECA T--SIPFLGV ---RELWKR- YE-CMEGIGC VNTVAGKP-S
-             QSSVWMFDRF MYKLTHSMVW --------GD LGRVYWDNLT FQKLKEGAPH
-             CIAV--PNYL NIDMFHIQVF YKGP--LTLP DPHYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DREESPHQIE HKMRKSVLLY N---PIGY-L -VIIKNANSM
-             MGRLNHHESC AIVMFPLR-- -GAEGPKQI- ---------- -------IEG
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SRLPRNDPVV HEVGANVYQQ ISRMKTSIPI YAHVTEYAVG
-             I----IKPFY D-NEWKQEAQ GQGEA-GASI PCVNSPDVQY ELKHAHIKKL
-             MHT-SLYLMH LGTCHKPVMG TVKGDRCRAI L-KLSMIQLD Q----KTLSQ
-             -NVRAR--LC QRTWLDTSPL Q------MGM VAVLLGKKLG SKK-DYEIAA
-             DPVIKYFYQA PIIMRRTDVF EGTDDQKAQA MRV------R STASQSIGDD
-             DMLI--MPLV QNAMCVKSEM VRKCQPD-GP DKRGYTWMAK D-DTLCPVSA
-             GQGEK---YA EPHQIKN--- ---------- ----KFSVNV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WVTLASDACL SAEPQPPVCV WQRELVPQL-
-             --NRNVEDLA RVIYFGPDEH -------DEG KMMPKIFKLA W-EMDMSHRA
-             -SSVDDNYV- IEMLPFVCHR VGPWGHYAQV QAD-QQNLTR PHT---LADL
-             FILS---CPV ASGKEQDGAT -ERSQYYV-V YAEL----QN DHKSPISANK
-             HPDKMLDWDT GKS-MDRGAA -MCREIKLFY -------AEP NVWKQNDHSV
-             VFI-ISDAVN RLICANSIMC GLTFMAMACN PHFAKLFMEV VCMRYDYFSN
-             HSIKI----- -FEVYAEDDS WENICNF-EM MSGRTGAQIN HIPQLPEQVC
-             -PPCHLTVSN LKGCC-ASVP AITEITRTV- -VIC--MYVS I-LCNVVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGQ ---YHASPKK K--KIC-GPG DNGGMETIEE
-             DMFQVLVCV
-
-t22          GIVSECRVII RDQ--SDDAI DER-Y----- -------LVA SVVKRLSGCE
-             NQARNNRECA I--SIPFLGV ---RELWKR- YE-CMEGIGC VNTVAGTP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVYVDNQT FSKLKEGAPH
-             CISA--PYYL NIDMFHIQVF YKGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDYG DREESPHQIE HKMRKSVLLY Y---TIGW-L -VIIKNADSM
-             MGRLNHHESC AMVMFPLR-- -GAEGPKQI- ---------- -------MEG
-             LFDK-E-E-- ----ARPMVQ DAASVPGR-- --AQWVGRVR AWCSSDVKA-
-             ---------- SQLPTNDPIV PEVGANVYQQ VSRMKTSIPI YAHVTEYAVG
-             I----VKPFY D-NEWKQEAQ GQGEA-GASI PCVNSPDVQY ELKHAHIKKL
-             MHT-SLYLMH LKTCHKPVMG TVKGDRCRAI L-KLKMIQLD Q----KTLSQ
-             -NQAAR--LC KRTWLDTSPL Q------MGM NVVLIGQKLG SKH-DYEIAA
-             DPVIMYFYQA PIIMRRTDVF EGTDDQKAQA MRL------R STASRSIGDD
-             DMLI--MPLV QNAMCVNPEM VRKCQPD-GQ DKRGYTWMAK N-DTLCPVSA
-             GQGEC---YA EPHQTCN--- ---------- ----KFRVNV IKLLYCKDC-
-             SCNKVLKILK WQLCESV-DD WQTLASDACI LAKPQPPVCV WQRELVPQL-
-             --NRNVEDLA RVIYFGPDEH -------DEG KMMSKIFNLE W-EMDMSHRT
-             -SSVDDNYV- IDMLPFICHR VGPWGHYAQV LAD-QINLTR PHT---LRDL
-             FILA---CPV ASGKEQDGAT -ERSQHYV-V YAEL----QN DHKSPISANK
-             HPNKLLDWDT GKT-MDRGAA -MCHEIKLFH -------AEP NVWRQNDHSV
-             MFI-ISDASN RLICANSIMC GLTFMAMACN PHFAKLFMEV VCMRYEYFSN
-             HSIKI----- -FEVYAEENS WENVCNF-EM MSGRAGAQIN HIPQLPEQVC
-             -PPCVLTVSN LKGCC-ASCP ANTEITRTV- -VIC--MYVS I-LRNVVMQY
-             VFYYKENRSV R--------- --QNNTGAAE LPK------- ----------
-             ----HHMQDI FID-ELYPGL ---YHASPKK K--KVC-GPG DNGGMETIQE
-             DMFQVLVCV
-
-t64          GIVSECRMII RDE--TDDAI DEV-C----- -------LVA SMVKKLSGCE
-             NQTRNNRECA IT-SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGMP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LRRVFPDNAT FSKLKEGAPH
-             VISH--PYFL GIDMFHDQVV YRGP--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DTQESPHGIE HNMRNSVLLY N---PIGF-L -VIIKNINSM
-             MGRLNHHESR AVVGFPLR-- -GAENPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPIVQ DAASVPGK-- --AQWVGRVR AWCSSDVKA-
-             ---------- SKLPRNDPIV PEVGANVYQQ LSRMKTNIPI YAHVTEYAVG
-             I----VKPFY D-NEWKQEAQ GVGEA-GASI PCVDSPDVQY ELKHAEVRKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLPMIQLD Q----KTLSH
-             -NQPRR--LC QRTWLDASPL Q------VGM NIMLMGKKAP SKK-DYEIAA
-             DPVIMYFYQA PIIMRRTDVF EGTHNKKAQA MRV------R STASQSIGDD
-             DMLK--MPLV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             NQGEK---YA EPHVIGD--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNQVLKILV WQLCESV-DD WQTLTSDPCM SAQVNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMSKIFALE W-EMDMSHRV
-             -SSVDDNFV- IEMLPFVCHR IGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             FILS---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             HLNKMLDWDT GKT-MDREAT -MCREMKLFY -------AET NLWKQNDHSV
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV VCVHYDYGAN
-             HDIKI----- -FEVYAAENS WENARNF-EM MSGRAGAEIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI VID-ELYPGP ---YHATPKK H--RFC-GTG DNGGMQAIQE
-             DMFQVLVCV
-
-t18          GIVSECRMII RDE--TDDAI DEV-C----- -------LVA SMVKKLSGCE
-             NQTRNNRECA IT-SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGMP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LRRVFPDNAT FSKLKEGAPH
-             VISH--PYFL GIDMFHEQVV YRGP--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DTQESPHGIE HNMRNSVLLY N---PIGF-L -VIIKNINSM
-             MGRLNHHESR AVVGFPLR-- -GAENPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPIVQ DAASVPGK-- --AQWVGRVR AWCSSDVKA-
-             ---------- SKLPRNDPIV PEVGANVYQQ LSRMKTNIPI YAHVTEYAVG
-             I----VKPFY D-NEWKQEAQ GVGEA-GASI PCVDSPDVQY ELKHAEVRKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLPMIQLD Q----KTLSH
-             -NQPRR--LC QRTWLDASPL Q------VGM NIMLKGKKAP SKK-DYEIAA
-             DPVIMYFYQA PIIMRRTDVF EGTHNKKAQA MRV------R STASQSIGDD
-             DMLK--MPLV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             NQGEK---YA EPHVIGD--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNQVLKILI WQLCESV-DD WQTLTSDPCM SAQVNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMFKIFALE W-EMDMSHRV
-             -SSVDDNFV- IEMLPFVCHR IGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             FILS---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             HLNKMLDWDT GKT-MDREAT -MCREMKLFY -------AET NLWKQNDHSV
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV VCVHYDYGAN
-             HDIKI----- -FEVYAAENS WENARNF-EM MSGRAGAEIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGP ---YHATPKK H--RFC-GTG DNGGMQAIQE
-             DMFQVLVCV
-
-t68          GIVSECRMII RDE--TDDAI DEV-C----- -------LVA SMVKKLSGCE
-             NQTRNNRECA I--SPPFIGV ---RELFKR- YG-CVEGIGC VNTVAGMP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LRRVFPDNAH FSKLKEGAPH
-             VISH--PYFL GIDMFHDQVV YRGP--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DTQESPHGIE HNMRNSVLLY N---PIGF-L -VIIKNINSM
-             MGRLNHYESR AVVGFPLR-- -GAENPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPIVQ DAASVPEK-- --AQWVGRVR AWCSSDVKA-
-             ---------- SKLPRNDPIV PEVGANVYQQ ISRMKTNIPI YAHVTEYAVG
-             I----VKPFY D-NEWKQEAQ GVGEA-GASI PCVDSPDVQY ELKHAEVRKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLPMIQLD Q----KTLSH
-             -NQPRR--LC QRTWLDASPL Q------VGM NIMLMGKKAP SKK-NYEIAA
-             DPVIMYFYQA PIIMRRTDVF EGTHNKKAQA MRV------R STASQSIGDD
-             DMLK--MPLR QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             NQGEK---YA EPVVIGD--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNQVLKILV WQLCESV-DD WQTLTSDPCM SAQVNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMSKIFALE W-EMDMSHRV
-             -SSVDDNFV- IEMLPFVCHR IGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             FILS---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             HLNKMLDWDT GKT-MDREAT -MCREMKLFY -------AET NLWKQNDHSV
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV VCVHYDYGAN
-             HDIKI----- -FEVYAVENS WENARNF-EM MSGRAGAEIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGP ---DHATPKK H--RFC-GTG DNGGMQTIQE
-             DMFQVLVCV
-
-t28          GIVSECRMII RDE--ADDAI DEM-C----- -------LVA SMVKKLSGCE
-             NQARNNRECA I--SPPFIGV ---RELFKR- YH-CMEGIGC VNTVAGMP-S
-             ESSVWMFDQF MYKLTHSMIW --------GD LGRVFPDNAT FSKLKEGAPH
-             VISH--PYFL GIDMFHAQVF YRGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNPLDHG DRQESSHGIE HNMRSSVLLY N---PIGF-L -VIIDNINPM
-             MGRLNHHESR AIVTFPLR-- -GAEHPKQI- ---------- -------VEG
-             HFDK-E-E-- ----ARPIVK DAASVPGK-- --AQWVGRIR AWCSSDVKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ DSRMKTNIPI YAHVTEYACG
-             I----VKPFY E-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLSMIQLD E----KTLSQ
-             -NQRPG--LC QRTWLDANPL Q------MGM NTMLVGKKTP SKK-DYEIAA
-             DPVIMYFYQA PIIMRRTDVF EGTNNKKSQA MRV------Q STSSQSIGDD
-             DMLN--MPLV QNAMCVSSEM VRKCQPD-GQ NKRGCTWMAK N-DTLCPQSG
-             NQGEK---FA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNKMLKILV WQLCESV-DD WQTLASDPCV SAEPNSPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMSKIFALE W-EMDMSHRI
-             -SSVDYNYV- IEMLPFVYHR VGPWGHYAQM LSD-QIVLTR PHT---LRDL
-             FILA---CRV ASGGEVDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             VLNKMLDWDT GKT-MDREAA -MCREIKLFY -------AET NVWKQNDHSV
-             MFI-ISDAQN RLICGNSIMC GITFMAMACN PHFAKLFMEV ACMRYDYFAN
-             PDIKI----- -FEVYAAENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP DITEITRTV- -VIC--MYVS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RYC-GPG DNGGMQVIEE
-             DMFQVLVYV
-
-t82          GIVSECRMII RDE--ADDAI DEM-C----- -------LVA SMVKKLSGCE
-             NQARNNRECA I--SPPFIGL ---RELFKR- YV-CMEGIGC VNTVAGMP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVFPDNCT FSKLKEGAPH
-             VISH--PYFL GIDMFHGQVV YRGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNPLDHG DRQESPHGIE HNMRSSVLLY N---PIGF-L -VIIDNINPM
-             MGRLNHHESR AIVTFPLR-- -GAEHPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPIVQ DAASVPGE-- --AQWVGHIR AWCSSDIKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI YAHTTEYACG
-             I----VKPFY E-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHANVKKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLNMIQLD Q----KTLSQ
-             -NQRPG--LC QRTWLDASPL Q------MGM HIMLVGKKTP SKK-DYEIAA
-             DPVIMYFYQA PIIMQRTDVF EGTNNKKSQA MRV------H STSSQSIGDD
-             DMLN--MPLV QNAMCVSSEM VRKCQPD-GQ NKRGYTWMAK H-DTLCPQSG
-             NQGEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDPCM SAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RTIYFGPDEH -------DEG KMMSKIYALE W-EMDMSHRV
-             -SSVDYNYV- IEMLPFVYHR VGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             FILA---CPV ASGGEQDGNA -ERSQHYI-V YAEL----VN DHKSPISANK
-             VLNKMLDWDT GKT-MDREAA -MCRDIKLFY -------AET NVWKQNDHSV
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV ACMRYDYFAN
-             PDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP DITEITRTV- -VIC--MYIS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RFC-GPG DNGGMQVIEE
-             DMFQVLVYV
-
-t41          GIVSECRMII RDE--ADDAI DEM-C----- -------LVA SMVKKLSGCE
-             NQARNNRECA I--SPPFIGL ---RELFKR- YV-CMEGIGC VNTVAGMP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVFPDNCT FSKLKEGAPH
-             VISH--PYFL GIDMFHGQVV YRGS--LTLP DPRYELSMSV MYSQHHSFSQ
-             KRCLNPLDHG DRQESPHGIE HNMRSSVLLY N---PIGF-L -VIIDNINPM
-             MGRLNHHESR AIVTFPLR-- -GAEHPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPIVQ DAASVPGE-- --AQWVGHIR AWCSSDIKA-
-             ---------- SQLPRNDPIV PEVGANVYQQ VSRMKTNIPI YAHTTEYACG
-             I----VKPFY E-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHANVKKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAI L-KLNMIQLD Q----KTLSQ
-             -NQRPG--LC QRTWLDASPL Q------MGM HIMLVGKKTP SKK-DYEIAA
-             DPVIMYFYQA PIIMQRTDVF EGTNNKKSQA MRV------H STSSQSIGDD
-             DMLN--MPLV QNAMCVSSEM VRKCQPD-GQ NKRGYTWMAK H-DTLCPQSG
-             NQGEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLASDPCM SAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RTIYFGPDEH -------DEG KMMSKIYALE W-EMDMSHRV
-             -SSVDYNYV- IEMLPFVYHR VGPWGHYAQM LAD-QIVLTR PHT---LRDL
-             FILA---CPV ASGGEQDGNA -ERSQHYI-V YAEL----VN DHKSPISANK
-             VLNKMLDWDT GKT-MDREAA -MCRDIKLFY -------AET NVWKQNDHSV
-             MFI-ISDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEV ACMRYDYFAN
-             PDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP DITEITRTV- -VIC--MYIS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RFC-GPG DNGGMQVIEE
-             DMFQVLVYV
-
-t71          GIVSECRMII RDQ--SDDAI DEMVV----- -------LVA SMVKEMSGCE
-             NQARNNSECA I--SPQFIGV ---RELFKR- YR-CMEGIGC VNTVAGAP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LARVFHDNGT FAKLKEGAPH
-             VISV--PYFL GIDMFHGQVF LRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNHLDHG DRQESPHGIE HNMRKSVLLY N---PQGY-L -VIIKNVNSM
-             MGRLNHHESR AVVTFPLR-- -GADNPRQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPVVQ DAPGVPGK-- --AQWVGKVR AWCSSDVKA-
-             ---------- SQLPRNDTIV PEVGANVYQQ VSRVKTHIPI YAHVTEYAVG
-             I----VKPFY N-NEWKQEAQ GQGEA-GASI PCVDSPDDQY ELKHAEVKKL
-             MHD-SLYLPH LETCHKPIMG TVKGGRCRAS L-KLKMIQLD Q----KTLSQ
-             -NQQRR--LC QRTWLDSSPL Q------MGM KIMLQGKKTP SKK-DYEIAA
-             DPAIMHFYRA PIIMRRTDVF EGTNNKKAQA MRI------R STASQSIGDD
-             DMLN--MPLH QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSP
-             NQGEK---YA EPHQIRN--- ---------- ----KISVNV IKLLYCKDC-
-             SCNQVLKILV WQLCESV-DD WQTLTSDPCV PAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRD
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRDL
-             FILA---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPISANK
-             HMNKMLDWDT GKT-MDFEAA -MCREIKLFY -------AET NVWKINDHSV
-             MFI-VSDAQN RLICGNSIMC GLTFMAMACN PHFAKLFMEG VCMRYDYSAN
-             HDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             NPPCHLTVSN LKGVC-ASCP AITEITRTV- -VIV--MWIS I-LRNDVMQY
-             VVYYKENRSV R--------- --QNNTGKAE LPR------- ----------
-             ----HPMQEI FID-ELYPGH ---YHATPKK N--RFC-GPG DNGGMQSMQE
-             DVFQVLVCV
-
-t94          GIVSECRMII RDQ--SDDAI DEMVC----- -------LVA SMVKELSGCE
-             NQARNNRECA I--SPPFTGV ---RELFKR- YR-CMEGIGC VNTVAGIP-S
-             ESSVWMFDRF MYRLTHSMVW --------GD LGRVFQDNAT FSKLKEGAPH
-             VISH--PYFL GIDMFHGQVF YRGS--LTLP DPRYELSMSV MYAQHHSMSQ
-             KRCLNTLDHG DRQESPHGIE HNMRKSVLLY D---PIGY-L -VIIKNVNSM
-             MGRLNHHESR AKVTFPLR-- -GADNPRQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPVVQ DAPGVPEQ-- --AQWVGKMR AWCSSDVKA-
-             ---------- SQLPRNDTIV PEVGANVYQQ VSRVKTNIPI YAHVTEYAVG
-             I----VKPFY N-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             MHD-SLYLPH LETCHKPIMG TVKGGRCRAS L-KLNMIQLD Q----KTLSQ
-             -NQQRR--LC QRTWLDASPL Q------MGM KIMLQGKKIP SKK-DYEIAA
-             DPAIMYFYQA TIIMRRTDVF EGTNNKKAQA MRM------R STASQSIGDD
-             DMLN--MPLH QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLYPQSA
-             NQGEK---YA EPHQIRN--- ---------- ----KISVNV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLTSDPCV PAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRD
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-KLVLTR PHT---LRDL
-             FILA---CYV ASGGEQDGNT -ERSQHYI-V YAEL----QN DHKSPILANK
-             VVNKMLDWDM GKT-MDFEAA -MCREIKLFY -------AET NVWKQNNHSV
-             MFI-VSDAHN RLICGNSIMC ALTFMAMACN PHFAKLFMEA VCMRYDYSAN
-             HDIKI----- -VEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             NPPCHLTVSN LKGVC-ASCP AITEITRTV- -VIV--MWIS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPR------- ----------
-             ----HPVQDI FID-ELYPGH ---YHATPKK V--RFC-GPG DNGGMQAIQE
-             DVFQVLVCV
-
-t99          GIVSEVRMII RDE--SDDAI DEM-C----- -------LVA SMVKALSGCE
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGIP-S
-             ESSIWMFDRF MYKLTHSMVW --------GD LGQVFPDVST FSKLKEGAPH
-             VISQ--PYFL GIDMFHDQVF YRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DRQESPHGIE HNMRKSVLLD S---PIGY-L -VIIKNINSM
-             MGRLNHHESR AVFAFPLR-- -GAENPKQI- ---------- -------MEG
-             HFDK-EKE-- ----ARPVVQ DAPGVPGK-- --AQWVGRIR AWCSSDVKA-
-             ---------- SELPRNDAIV PEVGANVYQQ VSRMKTNIPI YAHATEYAVG
-             I----VKPFY D-NEWKQEAQ GQGET-GASI PCVDSPDVQY EMKHAEVKKL
-             MHD-SLYLMH IETCHKPIMG TVKGDRCRAT L-KLKMIQLD Q----KTLSQ
-             -NQKRR--LC QRTWLDASPL Q------MGM KMMLQGKKTP SKK-DYEIAA
-             DPVIMYFYQS PIIMRRTDVF EGTNNKKAQA MRV------R STASQSIGDD
-             EMLN--MPLV QNAMCVPSEM VRKCQPD-GQ DKRGYTWMAK D-DPLCPQSA
-             NVGEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNKVLKILV WQLCDSVQDD WQPLTSDPCV NAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMNKIFALE W-EMDMSHRD
-             SSSVDDNYI- IEMLPFVCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRDI
-             FILA---CPV ASGGEQDGNT -ERSQHYI-V YAEL----QD DHKSPISANK
-             HMRKMLDWDT GKT-MDREAA -VCREIKLFY -------AET NCWKQNDHSV
-             MFI-VSDAQN RLICGSSIMC RLTFMAMAVN PHFAKLFMED VCMRYDYSPN
-             HDIKI----- -FEVYADENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNDVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGR ---YHATPKK N--RYC-GPG DNGGMQPIQE
-             DMFQVLVCV
-
-t40          GIVSECRMII RDE--SDDAI DEV-C----- -------LVA SMVKALSGCE
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGIP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVYPDNPT FSKLKEGAPH
-             VISH--PYFL GIDMFHDQVF YRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DRQESPHGIE HNMRKSVLLD S---SIGY-I -VIIKNLNSM
-             MGRLNHHESR AVVTFPLR-- -GAEDPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPVVQ DAPGVPGK-- --AQWVGRVR AWCSSEIKT-
-             ---------- SELPRNDAIV VEVGANVYQQ ISRMKTDIPI YAHATEYAVG
-             I----VKPVY D-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAT L-KLKMIQLD Q----KTLSQ
-             -NQKKR--LC QCTWLDACPL Q------MGM KIMLQGKKTP SKK-DYEIAA
-             DPVIMYFYQS PIIMRRTDVF EGTNNKKAQA MRI------R STASQSIGDD
-             EMLN--MPQV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             NVGEK---YA EPHQIRN--- ---------- ----KVSTNV IKLLYCKDC-
-             SCNKVLKILV WQLCDSV-DD WQTLTSDPCV SAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRN
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRNI
-             FILA---CPV ASGGEQDENT -ERSQHYI-V YAEL----QN DHKSPIHANK
-             VMNKMLDWDT GKT-MDREAA -MCREIKLFV -------AET NVWKQNDHSV
-             MFIVISDAQN RLICGSSIMC RLTFMAMAVN PHFAKLFMEE SCVRYDYSAN
-             HDIKI----- -FEVYANENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASVP AITEITRTV- -VIC--MYIS I-LRNNVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGH ---YQATPKK D--KFC-GPG DNGGMQTIQE
-             DMFQVLVCV
-
-t90          GIVSECRMII RDE--SDDAI DEV-C----- -------LVA SMVKALSGCE
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGIP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVYPDNPT FSKLKEGAPH
-             VISH--PYFL GIDMFHDQVF YRGS--LTLP DPRYELSMSV MYAQHHSFSQ
-             KRCLNALDHG DRQESPHGIE HNMRKSVLLD S---PIGY-I -VIIKNVNSM
-             MGRLNHHESR AVVTFPLR-- -GAEDPKQI- ---------- -------MEG
-             HFDK-E-E-- ----ARPVVQ DAPGVPGK-- --AQWVGRVR AWCSSEIKT-
-             ---------- SELPRNDAIV PEVGANVYQQ ISRMKTDIPI YAHATEYAVG
-             I----VKPVY D-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             MHD-SLYLMH LETCHKPIMG TVKGDRCRAT L-KLKMIQLD Q----KTLSQ
-             -NQKKR--LC QCTWLDACPL Q------LGM KIMLQGKKTP SKK-DYEIAA
-             DPVIMYFYQS PIIMRRTDVF EGTNNKKAQA MRV------R STASQSIGDD
-             EMLN--MPLV QNAMCVSSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQSA
-             NQGEK---YA EPHQIRN--- ---------- ----KVSTNV IKLLYCKDC-
-             SCNKVLKILV WQLCDSV-DD WQTLTSDPCV SAEPNPPVCV WQRELVPQL-
-             --NRNVEDLA RIIYFGPDEH -------DEG KMMRKIFALE W-EMDMSHRN
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRNI
-             FILA---CPV ASGGEQDENT -ERSQHYI-V YAEL----QN DHKSPINANK
-             VMNKMLDWDT GKT-MDREAA -MCREIKLFV -------AET NVWKQNDHSV
-             MFIVISDAQN RLICGSSIMC GLTFMAMAVN PHFAKLFMEE SCVRYDYSRN
-             HDIKI----- -FEVYANENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVC
-             -PPCHLTVSN LKGVC-ASVP AITEITRTV- -VIC--MYIS I-LRNNVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGH ---YHATPKK D--KFC-GPG DNGGMQTIQE
-             DMFQVLVCV
-
-t4           GIVSECRMII RDE--PDDAI DEV-C----- -------LVA SMVKELSGCE
-             NQARNNRECA I--SPPFIGV ---RELFKR- YG-CMEGIGC VNTVAGMP-S
-             ESSVWMFDRF MYKLTHSMVW --------GD LGRVFPDNAT FSKLKEGAPH
-             VISV--PYFL GIDMFHDQVF YRGS--LTLP DPRYEMSMSV MYAQHHSFSQ
-             KRCLNALDYG DRQESPHGIE HNMRKNVLLD N---PIGH-L -VIIKNENSM
-             MGRLNHHESR AVVTFPLR-- -GAEDPKQK- ---------- -------MEG
-             SFDK-E-E-- ----ARPVVQ DAPGVPGR-- --AQWVGRVR PWCSSDVKA-
-             ---------- SELPRNDAIW PEVGANVYQQ ISRMKTNIPI YPHVTEYAVG
-             I----VKPFY L-NEWKQEAQ GQGEA-GASI PCVDSPDVQY ELKHAEVKKL
-             MHD-SLYLWH LETCVKPIMG TVKGDRCRAT L-KLKMIVLD P----KTLSQ
-             -NQKRR--LC QRTWLDASPL Q------VGM KIMLQGKKTP SKK-DYEIAA
-             DPVIMYFYQS PIIMRHTDVF EGTNNKKAQA MRL------R STASQSIGDD
-             EMLN--MPLI QNAMCVQSEM VRKCQPD-GQ DKRGYTWMAK D-DTLCPQLH
-             NQAEK---YA EPHQIRN--- ---------- ----KVSVNV IKLLYCKDC-
-             SCNKVLKILV WQLCESV-DD WQTLTSDPCI SAEPNPPVCV WQRELVPQL-
-             --NRNIEDLA RIIYFGPDEH -------DEG KMMGKIFALE W-EHDMSHRD
-             -SSVDDNYV- IEMLPFMCHR VGPWGHYAQQ LAD-RLVLTR PHT---LRDI
-             FILA---CPV ASGGEQDAVT -ERSQHYI-V YAEL----QN DHKSPISASK
-             HMNKMLDWDT GKT-MDREAA -MCREIKLFY -------AET NVWKQNDHSV
-             MFI-ISDAQN RLICGSSIMC GLTFMATACN PHFAKLFMEE VCMRYDYAAN
-             HDIKI----- -SEVYAEENS WENVRNF-EM MSGRAGAQIN H-PQLPEQVV
-             -PPCHLTVSN LKGVC-ASCP AITEITRTV- -VIC--MYVS I-LRNVVMQY
-             VFYYKENRSV R--------- --QNNTGKAE LPK------- ----------
-             ----HHMQDI FID-ELYPGH ---YHATPKK N--RCC-GPG DNGGMQTVQE
-             DMFQVLVCV
-
-t36          MIWSEVRKMV RER--REQAI DNK-C----- -------LIA ARVKMMSGYV
-             LQVRNALEDA L--YVFFTGT KGTRELVKY- YM-CMEGHGC VNTMAKKS-S
-             QSGIWKFNAF MC-LMHLMEG --------GD L--------- ----------
-             -CSY--PSFL GMCMFHAMVQ SKGD--LVLP DSPNEDSVSF MYIQHHSFHE
-             KRCLNPLNVG DREDSEHIKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             MGRLNHIEPG AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             FFAK-D-E-- ----DRPGIQ NAVSVPCG-- --DQWVGSIR GWCSSQHRYG
-             LANHILVHEP SKLHKTYRIN RKVGANAYDQ DSRMKAAAPV YPHIMEYAHG
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNK PCVESEDCQY EKKHASMDKL
-             MHQ-SLYLMH INIMSKPAMG EWVGNRCRNE LTALRIIQLD VGVSGKTLGQ
-             -NIGVSKLLN DRTWLATSPL E------IGC GVMSVEKKEA SPK-EFEVAA
-             DPTVIYFYRN LIIQKITDVL SAVRMESPQE MRT------Q DVNSSSLGDN
-             NGQA--MNIV PYWVCVASGV VRKTHKD-SV DKRGQTWTAK S-DFLCPLAV
-             DQGEP---GA EQKPAVGEEN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLYADSCP IA-VNAAVCG WKRELVPGL-
-             --NHSCEHLA KSVYFEPDGE -------GEG KVMLKIFGLD WCEVERSHEH
-             -SSVDDNYN- VNMLPFQNSR KDPVGHYVQD LED-ARRLIR PGT---ARSL
-             TILF-YGCQY YSGEFQDCEI -ERSQLYN-V YCEH----KQ DHKSAIIANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGSLFF -------AEP NIVRQPGVSH
-             IFI-GNDARR VLICGKSMMP GHRFMREACV PFFHKLFMAV NQMRYDYMMN
-             YDIKIYETHW RMGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IKIY--MWGT INFKNRVMQY
-             CNYYKENRSV R--------- --INNTGLAE LPK------- ----------
-             ----YHHQNI LID-ELYSNV ---YPAAPKK H--QYM-GVG DVGGYEVICE
-             NLFQILVVE
-
-t87          MIWSEVRKMV RER--REQAI DNK-C----- -------LIA ARVKMMSGYM
-             LQVRNALEDA L--YVFFTGN KGTRELVKY- YM-CMEGHGC VNTMAKKS-S
-             QSGIWKFNAF MC-LMHLMEG --------GD L--------- ----------
-             -CSY--PSFL GMCMFHAMVQ SKGD--LVLP DSPNEDSVSF MYIQHHSFHE
-             KRCLNPLNVG DREDSDHVKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             MGRLNHIEPG AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             FFAK-D-E-- ----DRPGIQ NAMSVPCG-- --DQWVGSIR GWCSSQHRYG
-             LANHILVHEP SKLHKTYRIN RKVGANAYDQ DSRMKAAAPV YPHIMEYAHG
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNK PCVESEDCQY EKKHASMDKL
-             MHQ-SLYLMH INVMSKPAMG EWVGNRCRND LTALRIIQLD VGHSGKTLGQ
-             -NIGVSKLLN DRTWLATSPL E------IGC LVMSVEKKEA SGK-EFEVAA
-             DPTVIYFYRN LIIAKITDVL SAVRMESPQE MRE------Q DVNSSSLGDN
-             NGQA--MNIV PYWVCVGSGV VRKTHKD-SV DKRGQTWTAK S-DFLCPLAM
-             DQGEI---GA EQKPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLYADSCP IA-INAAVCG WKRELVPGL-
-             --NHSCEHLA KSVYFEPDGE -------GEG KVMLKIFGLD WCEVERSHEH
-             -SSVDDNYN- VNMLPFQNSR KDPVGHYVQD LED-ARRLIR PGT---ARSL
-             TILF-YGCQY YSGEFQDCEI -ERSQLYN-V YCEH----KQ DHKSAIIANK
-             QEQKGMDWNT GKE-MEQGPK -VILHGTLFF -------AES NIVRQPGVSH
-             IFI-GNDARR VLICGLSMMP GHRFMREACV PFFHKLFMAV NQMRYDYMVN
-             YDIKIYETHW RMGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IKIY--MWGT ICFKNRVMQY
-             CNYYKENRSV R--------- --INNTGLAE LPK------- ----------
-             ----YHHQNI LID-ELYSNV ---YPAAPKK H--QYM-GVG DVGGYEMICE
-             NLFQILVVE
-
-t89          MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             -CSY--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             LANHILVHEP SKLHKTYKIN RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             MHQ-SLYLMH INIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             DQGEP---AA EQRPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHEH
-             -SSIDDNYT- VNMLEFPNSR KDPVGHYVQN LED-AIRLIR PGT---ARSL
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-V YCEL----KQ DHKSAIIANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             IFT-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAV NQMRYDYVTN
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             ----YHHQNI LID-ELYNNI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             NLFQILVVE
-
-t39          MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             -CSY--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             LANHILVHEP SKLHKTYKIN RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             MHQ-SLYLMH INIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             DQGEP---AA EQRPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHEH
-             -SSIDDNYT- VNMLEFPNSR KDPVGHYVQN LED-AIRLIR PGT---ARSL
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-V YCEL----KQ DHKSAIIANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             IFT-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAV NQMRYDYVTN
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             ----YHHQNI LID-ELYNNI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             NLFQILVVE
-
-t8           MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             -CSY--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             LANHILVHEP SKLHKTYKIN RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             MHQ-SLYLMH VNIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             DQGEP---AA EQKPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHEH
-             -SSIDDNYT- VNMLPFPNSR KDPVGHYVQD LED-AIRLIR PGT---ARSL
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-V YCEL----KQ DHKSAIIANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             IFT-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAA NQMRYDYVTN
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEHVI
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             ----YHHQNI LID-ELYNDI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             NLFQILVVE
-
-t6           MIWSEHRKMV REG--REQAI DNK-C----- -------LIA KRVKVMSGYI
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGV VNTMAKKS-S
-             QSGIWKFNAF MC-LMRLMQG --------GD L--------- ----------
-             -CSH--PSFL GMCMFYAMVQ SKGD--LVLP DSCNEDSVSF MYIQHHSFHE
-             KRCLNPLNVG DREDSDHTKE KHMRI----Y A---NIGG-H -IIIREWNDV
-             MGRLNVIEPE AEVIFPLRK- -RGQHSKPV- ---------- -------IDG
-             FFAK-D-E-- ----ERPGIQ NAMNVPCG-- --DQWVGSIR GWCSSQHRYG
-             LANHILVHEP SKLHKTYKVV RKVGANAYDQ VSRMKAAAPV YPHIMEYAHG
-             M----FNPFY GLSEPKNNAQ GNGEN-PMNV PCVESEDCQY EKKHASMTKL
-             MHQ-SLYLMH INIMSKPAMG EWVGVRCRNE LTALRIVQLD VGHSGKTLGQ
-             -NIGVSKLLN DRTWLATSPL E------IGC GVISVEKKEA SPK-EFEVAA
-             DPTVIYFYRS LIIVHITDVL SAVRMDSPQE MRN------Q DVNSPSLGDN
-             NGQA--MNIV PYWVCVASGV VRKMHKD-SV EKRGQTWEAK S-DFLCPLAV
-             DQGEP---AA EQKPAVGEKN PICKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLFPDSCP FA-LNAAVCG WKRELVPGL-
-             --NHSCEHLA KGVYFEPDGE -------DEG KMMLKIFGLE WCEVERSHER
-             -SSIDDNYT- VNMLPFPNSR KDPVGHYVQD LED-AIRLIR PGT---ARSL
-             TILL-YGCQY YSGEFQDCEV -ERSQCYN-I YCEL----KQ DHKSAIIANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGCLFF -------AEP NIVRQPGVSH
-             IFI-ENDARR MLICGNSMMP RHRFMREACV PFFHKLFMAV NQMRYDYMTN
-             YDIKIYETHW RVGVYAIDNS WETLNVS-EM TSGRMGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKDTM-AGMK QETEITKTPD IEIY--MWGT INFKNQVMQY
-             CNYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             ----YHHQNI LID-ELYNNI ---YPAAPKK H--KFL-GVG DVGGYEIICE
-             NLFQILVVE
-
-t58          MIWSEYRHMV REG--RDQAI DNK-C----- -------LIA ARVKVMSGYV
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGC VNTMAKKS-S
-             QSGIWKFNAF MC-LMHLMQG --------GD L--------- ----------
-             -CSH--PSFL GMCMFHAMVK SKGN--LVLP DSCNEDSVSF MYIQHHSFHE
-             KRCLNHLNVG DREDSEHIKE KHMRV----Y A---SIGG-H -IIIREWNDV
-             MGRLNHIEPG AEVTFPLRR- -RGQASKPV- ---------- -------IDG
-             FFAK-D-E-- ----DRPGIQ NAMSVPCG-- --DQWVGSVR GWCSSQHRYG
-             LAIHILVHQQ SRLHKTYNID RKNGANAYEQ DSRMKAGAPV YPHIMEYAHG
-             M----FNPFY GMSEPKNNAQ GNGEN-PMNV PCVESDDCQY EKKHASMDKQ
-             MHQ-SLYLMH MNIMSKPAMG EWVGNRCRNE LTALHVVQLD VGFSGKTLGQ
-             -NIGISELLN DRTWLATSPL E------IGC GVMAVEKKEA SPK-EFEVAA
-             DPTVIYFYRN LIIQHITDVL SAVRMDSPQE MRV------Q DVNSPSLGDN
-             NGQA--MNIV PYWVCVVSGV VRKTHKD-SV EKRGQTWTAK S-DFLCPIAV
-             NQGEP---GA EQKPAVGA-N PIVKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLFADSCP TA-VNAAVCA WKRELVPGL-
-             --NHSCEHLA KSVYFEPDGE -------DEG KMMLKIFGLD WCEVERSHEH
-             -SSVDDNYN- VNMLPFPNSR QDPVGHYVQD LED-LLRLIR PGT---ARSL
-             TVLF-YGCQY YSGQFQDCEI -ERSQLYN-V YCEL----KQ DHKSAIMANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGVLFF -------AEP NVVRQPGVSH
-             IFV-GNDARR MLICGLSMMP GHRFMKEACV PFFHKLFMAV RRMRYDYMSN
-             YDIKIYETHW RPGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPETVI
-             -PPCVLTVSG LKDTM-AGMK HGTEITKTPD IKIH--MWGT INFKNKVMQY
-             CTYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             ----YHHQNI LID-ELYSNI ---YPATPKK H--QYM-GVG DVGGYEVICE
-             NLFQILVVE
-
-t54          MIWSEYRHMV REG--RDQAI DNK-C----- -------LIA ARVKVMSGYV
-             LQVRNAPEDA L--YNFFTGH KGTRELVKY- YM-CMEGEGC VHTMAKKS-S
-             QSGIWKFNAF MC-LMHLMQG --------GD L--------- ----------
-             -CSH--PSFL GMCMFHAMVQ SKGN--LVLP DSCNEDSVSF MYIQHHSFHE
-             KRCLNHLNVG DREDSEHIKE KHMRI----Y A---SIGG-H -IIIREWNEV
-             MGRLNHIEVG AEVTFPLRR- -RGQASKPV- ---------- -------IDG
-             FFAK-D-E-- ----DRPGIQ NAMSVPCG-- --EQWVGSVR GWCSSQHRYG
-             LAIHILVHQQ SRLHKTYNID RKNGANAYDQ DSRMKAGAPV YPHIMEYAHG
-             M----FVPFY GMSEPKNNAQ GNGEN-PMNV PCVESDDCQY EKKHASMDKQ
-             MHQ-SLYLMH MNIMSKPAMG EWVGNRCRNE LTALHIVQLD VGFSGKTLGQ
-             -NIGISELLN DRTWLATSPL E------IGC GVMAVEKKEA SPK-EFEVAA
-             DPTVIYFYRN LIIQHITDVL SAVRMDSPQE MRV------Q DVNSPSLGDN
-             NGQA--MNIV PYWVCVVSGV VRKTHKD-SV EKRGQTWTAK S-DFLCPIAV
-             NQGEP---GA EQKPAVGA-D PIVKPWQFVI MNTTTFAKNI FRLLYVKDV-
-             SCNGVLPLLK WQLCDSH-GD WQSLFADSCP IA-VNAAVCA WKRELVPGL-
-             --NHSCEHLA KSVYFEPDGE -------DEG KMMLKIFGLD WCEVERSHEH
-             -SSVDDNYN- VNMLPFPNSR KDPVGHYVQD LED-LLRLIR PGT---ARSL
-             TVLF-YGCQY YSGEFQDCEI -ERSQLYN-V YCEL----KQ DHKSAIMANK
-             QEQKGMDWNT GKE-MEQGPK -IILHGVLFF -------AEP NVVRQPGVSH
-             IFV-GNDARR MLICGLSMMP GHRFMKEACV PFFHKLFMAV RRMRYDYMTN
-             YDIKIYETHW RPGVYALDNS WETLNVS-EM TSGRIGAKIN HLPRLPETVI
-             -PPCVLTVSG LKDTM-AGMK HGTEITKTPD IKIH--MWGT INFKNKVMQY
-             CTYYKENRSV R--------- --INNTGGAE LPK------- ----------
-             ----YHHQNI LID-ELYSNI ---YPATPKK H--QYM-GVG DVGGYEVICE
-             NLFQILVVE
-
-t65          MIWSEYRQMV REG--NDQSI DNK-C----- -------LIA DRVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             -CNS--PSFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AEVMFPLRK- -GGQDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVKCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECQY EHKHAAMEKL
-             MHH-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALQTVQLD VGSSGKTLGQ
-             -NIVTSKKLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-EVEVAA
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRTPVLVCIQ KVDSVSLGDD
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPAAV
-             NEGEH---GA EQRP-FGTQN PVCKPWRFVI MNTQTFAKNI IRLLYIKDI-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP NA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KSVYFKPDGE -------DEG QMTMKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DYKSAIIANQ
-             QEHKGMEWDT GKE-MQQGPK -VVVHLALFY APSNVLAAEP NIIGQPQVSH
-             VFV-GNDARR MLIVGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYMWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             -PPCILTVSG LKRTV-AGAP DETEITKSPV IHIV--MWAD IMFKNCVMQY
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDV ---YPAAQKK Y--QVM-GVG DIGGYELICE
-             DLFQILVCQ
-
-t29          MIWSEYRQMV REG--NDQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             -CNC--PSFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLFVG DSQDSQHQRE KQLRI----Y G---RIGK-V -VIIKVWNAA
-             MGRLNHVEPP AEVMFPLRR- -GGSDSKPF- ---------- -------LDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILIHGP SKLHRTYAIN KKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GQSEPKNEAQ GNGEN-PMNV PSVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR VNTMPKPVMG DWDGNRCRAE LTALQTVQLD VGSSGKTLGQ
-             -NIVTSKKLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-EVEVAA
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRTPVLVCIQ KVDSVSLGDD
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             NEGEH---GA EQRPVFGTHN PVCKPWRFVI MHTQTFSKNI IRLLYIKDI-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP NA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KTVYFKPDGE -------DEG QMSQKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LEDSALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DYKSAIIANQ
-             QDHKGMEWDT GKE-MQQGPK -VVVHLALFY MPSNVLAAEP NIIGQPQVSH
-             WFV-GNDARR MLIVGVSMMP AYKFMREACV PFFRKLFMAD NQVRYDYMWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             -PPCILTVSG LKRTV-AGAP DETEITKSPV IHIV--MWAD IMFKNCVMQY
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDL ---YPAAPKK Y--QEM-GVG DIGGYELIVE
-             DLFQILVCE
-
-t98          MIWSEHRQMV REG--NDQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTKELVKF- YF-CMEGCGC VNTMAKKS-S
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             -CNS--PPFL GMCMFHPQVQ MKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AEVMFPLRR- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILVHNP SRLHRTYAIN KKMGANVYQQ SSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALQTVQLD VGSSEKTLGQ
-             -NIVTSKRLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-EVEVAA
-             D---IYFYRN MVVQRHTDVV AAVRMQSPQE MRNPVLVCIQ KVDSASLGDD
-             DPQM--MKIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNTQTFSKNI IRLLYIKDI-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP PA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KTVYFKPDGE -------DEG QMTMKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEM FERSQLYR-V YCEI----KK DYKSAIIANQ
-             QEHKGMEWDT GKE-MQQGPK -IVVHLGLFY MPSNVLAAEP NIIGQPQVSH
-             VFV-ANDARR MLIVGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYVWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             -PPCDLTVSG LKRTV-AGPP DETEITKSPV IHIV--MWAD IVFKNCVMQY
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNL LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELIVE
-             DLFQILVCE
-
-t83          MIWSEYRQMV REG--NDQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTKELIKF- YF-CMEGCGT VNTMAKDS-S
-             QSAPWKFNRF MC-LMHLMQS --------GD L--------- ----------
-             -CNS--PSFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AEVMFPLRR- -GGSCSKPF- ---------- -------VDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILIHNP SRLHRTYAIN KKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALQTVQLD LGSSGKTLGQ
-             -NIVTSKKLG DRTWLAASPL Q------IGC GIMVQEKKIA SPQ-EVEVAA
-             D---IYFYRN MVVQRHTDVV AAVRMQSPQE MRNPVLVCIQ KVDSISLGDD
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             NEGEH---GA EQRPVFGTQN PVCRPWRFVI MNMQTFSKNI IRLLYIKDI-
-             SCNQVLQLLD WQLCDSH-GD WQSLMADSCP PA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KTVYFKPDGE -------DEG QMTMKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQE LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSDM FERSQLYR-V YCEI----KK DYKSAIIANQ
-             QEHKGMEWDT GKE-MQQGPQ -IEVHLALFY MPSNVLPAEP NIIGQPQVSH
-             VFV-GNDARR MLIVGVSLMP AYKFMREACV PFFRKLFMAE NQVRYDYMWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             -PPCILTVSG LKRTI-AGAP DETEITKSPV IHIV--MWAD IMFKNCVMQY
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNL LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELIVE
-             DLFQILVCE
-
-t95          MIWSEYRQMV REG--TDQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQL --------GD L--------- ----------
-             -CNP--PSFL GMCMFHPQVR SKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYTG DSQDSQHLRE KQLRI----Y G---RIGR-V -VILQVWNAV
-             MGRLNHHEPP AEVMFPLRK- -GGSNSKPV- ---------- -------YDG
-             FF-------- ----DRPAIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN RKVGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECVY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGHRCRAE LTELQTVQLD VGSSGKTLGQ
-             -NIVTSKKLG DRTWLAASPL Q------IGC GVMVQEKKIA SPQ-QVEVAA
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRCRKLVCIQ KVDSPSLGDD
-             DPQM--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             NEGEH---GA EQRPVFGGQN PACKPWHFVI MNRQTFAKNM IRLLYIKDI-
-             SCNEVLQLLD WQLCDSH-GD WQSLIADSCP NA-SNIAVCC WKRELMPGL-
-             --NFSCEHLA KTVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             -SSVDDNYD- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             IILF-YGCQY YSGKFQDSEL FERSQLYR-M YCEI----KK DHKSAIIANQ
-             QEHKGMEWDT GKE-MQQGPK -VVLHHALFY APSNVLAAEP NIIGQPQVSH
-             VFV-GNDARR MLITGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYVWN
-             YDIKIYETHY RMGVYAVDNS WETLVYC-EM TSGRIGAKVN HLPRLPEQVT
-             -PPWVLTVSG LKRTV-AGAP DETEITKSPI IHII--MWEE IMFKNCVMQY
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELICE
-             DLFQILVCE
-
-t20          MIWSEYRQMV REG--TDQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTRELIKF- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQL --------GD L--------- ----------
-             -CNP--PSFL GMCMFHPQVR SKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DSQDSQHLRE KQLRI----Y G---RIGR-V -VILQVWNAV
-             MGRLNHHEPP AEVMFPLRK- -GGSNSKAV- ---------- -------YDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN RKVGANVYQQ MSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PSVESGECVY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGHRCRAE LTELQTVQLD VGSSGKTLGQ
-             -NIVTSKKLG DRTWLAAPPL Q------IGC DVMVQEKKIA SPQ-QVEVAA
-             D---IYFYRN MVVQRLTDVV AAVRMQSPQE MRTPKLVCIQ KVDSPSLGDD
-             DPQC--MNIV PYWVCVCSGV VKKAEPD-SV DKRGKTWVAK S-DFLCPPAV
-             NEGEH---GA EQRPVFGGQN PACQPWHFVI MNTQTFAKNM IRLLYIKDI-
-             SCNQVLQLLD WQLCDSH-GD WQSLIADSCP NA-VNIAVCC WKRELMPGL-
-             --NFSCEHLA KTVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             -SSVDDNYD- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             IILF-YGCQY YSGKFQDSEL FERSQLYR-M YCEI----KK DHKSAIIANQ
-             QEHKGMEWDT GKE-MQQGPK -VVLHHALFY APSNVLAAEP NIIGQPQVSH
-             VFV-GDDARR MLITGVSMMP AYKFMREACV PFFRKLFMAE NQVRYDYVWN
-             YDIKIYETHY RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVT
-             -PPWVLTVSG LKRTV-AGAP DETEITKSPI IHII--MWED IMFKNCVMQY
-             CTYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QVM-GVG DIGGYELICE
-             DLFQILVCE
-
-t69          MIWSDYRQMV REG--GDDSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGH KGTRELVKY- YH-CMEGCGC VNTMAKSS-S
-             QSAPWKFNRF MC-LMHLMQE --------GD L--------- ----------
-             -CNS--PGFL GMCMFHPQVQ RKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSQHLRE KQLRM----Y G---EIGK-V -VIIKVVNAV
-             MGRLNHVEPS AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGSIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ ISRMKALAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PCVESGECQY ENKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTGQLD VGSSGKTLGQ
-             -NIMTSKKLG DRTWLAANPL Q------IGR GVMVWEKKVA SPQ-EVEVAA
-             D---IYFYRN MVIECLTDVV RAVRMQSPQE MRAPVLVCIQ KVDSPSLGDD
-             VPQM--MNIV PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAM
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNTETFAKNI IRLLYVKDV-
-             SCNQVLQLLD WQLCDSH-GD WQSLVADSCP NA-VNIAVCC WKRELMPGL-
-             --NHSCQHLA KTVYFKPDGE -------DEG QMIVKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHNSAIIANQ
-             QEHKGMDWDT GKE-MQQGPK -IVVVLALFY QPSNVLAAEP NIMGQPQVSV
-             VFV-GNDGRR MLIVGCSMMP DYKFMREACV PFFRKLFMAE VQDRYDYAWN
-             YNIKIYETHF RDGVYAVDNS WETLVYV-EM ASGRIGAKIN HQPRLPEQVI
-             -PPCILTVSG LKRTI-ADEP DETEITKTPI IHIV--MWAD IMFKNCVMQY
-             CNYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QIM-GVG DIGGYELICE
-             DLFQILVCE
-
-t2           MIWSDYRQMV REG--GDDSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTRELVKY- YH-CMEGCGC VNTMAKSS-S
-             QSAPWKFNRF MC-LMYLMQD --------GD L--------- ----------
-             -CNS--PGFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSQHLRE KQLRM----Y G---EIGK-V -VIIKVVNAV
-             MGRLNHHEPS AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGSIK GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ ISRMKALAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PCVESGECQY ENKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTGQLD VGSSGKTLGQ
-             -NIMVSKKLG DRTWLAASPL Q------IGC GVMVWEKKVP SPQ-EVEVAA
-             D---IYFYRN MVIECLTDVV RAVRMQSPQE MRAPVLVCIQ KVDSPSLGDD
-             VPQM--MNIV PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAM
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNVETFAKNI IRLLYVKDV-
-             SCNQVLQLLD WQLCDSH-GD WQSMVADSCH NA-VNIAVCC WKRELMPGL-
-             --NHSCQHLA KTVYFKPDGE -------DEG QMMVKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHNSAIIANQ
-             QEHKGMDWDT GKE-MQQGPK -IVVVLALFY QPSNVLAAEP NIMGQPQVSV
-             VFV-GNDARR MLIVGCSMMP DYKFMREACV PFFRKLFMAE VQDRYDYNWN
-             YNIKIYETHF RVGVYAVDNS WETLVYV-EM ASGRIGAKIN HMPRLPEQVI
-             -PPCILTVSG LKRTI-ADEP DETEITKTPI IHIV--MWAD IMFKNCVMQY
-             CNYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QIM-GVG DIGGYELICE
-             DLFQILVCE
-
-t10          MIWSDYRQMV REG--GDDSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YNFFTGQ KGTRELVKY- YH-CMEGCGC VNTMAKSS-S
-             QSAPWKFNRF MC-LMYLMQD --------GD L--------- ----------
-             -CNS--PGFL GMCMFHPQVQ AKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSQHLRE KQLRM----Y G---EIGK-V -VIIKVVNAV
-             MGRLNHHEPS AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGSIK GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ ISRMKALAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ GNGEN-PMNV PCVESGECQY ENKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTGQLD VGSSGKTLGQ
-             -NIMVSKKLG DRTWLAASPL Q------IGC GVMVWEKKVP SPQ-EVEVAA
-             D---IYFYRN MVIECLTDVV RAVRMQSPQE MRAPVLVCIQ KVDSPSLGDD
-             VPQM--MNIV PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAM
-             NEGEH---GA EQRPVFGTQN PVCKPWRFVI MNVETFAKNI IRLLYVKDV-
-             SCNQVLQLLD WQLCDSH-GD WQSMVADSCH NA-VNIAVCC WKRELMPGL-
-             --NHSCQHLA KTVYFKPDGE -------DEG QMMVKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFMQSH GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHNSAIIANQ
-             QEHKGMDWDT GKE-MQQGPK -IVVVLALFY QPSNVLAAEP NIMGQPQVSV
-             VFV-GNDARR MLIVGCSMMP DYKFMREACV PFFRKLFMAE VQDRYDYNWN
-             YNIKIYETHF RVGVYAVDNS WETLVYV-EM ASGRIGAKIN HMPRLPEQVI
-             -PPCILTVSG LKRTI-ADEP DETEITKTPI IHIV--MWAD IMFKNCVMQY
-             CNYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDI ---YPAAPKK Y--QIM-GVG DIGGYELICE
-             DLFQILVCE
-
-t31          MIWSEYRSMV REG--ADQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKQS-S
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             -CNL--PSFL GMCMFHNQVQ CKGE--LVLP DNVNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSQHLRE KQLRI----Y Q---NIGK-V -VIIKVWNAN
-             MGRLNHHEPP AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMNVPCG-- --DQWVGCIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ TSRMKAAAPI YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVMG DWVGNRCRAE LTALKTVQLD VGSNGKTLGK
-             -NIMTPKKLG DRTWLAASPL Q------IGC GVMVQEKKVA SPQ-EVE-AA
-             D---IFFYRN MVIQRLTDVV AAVRMQSPQE MRPPVLVCIQ YVDSPSLGDD
-             TPQM--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK A-DFLCPPAV
-             SEGEH---GA EQRPVFGMQN PACKPWRFVI MNTQTFAKNI IRLLYIKDV-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADSCP TA-ANIAVCC WKRELMPGL-
-             --NHSCEHLA KTVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             -SSVDDNYH- VNMLPFAQSN RDPVGHYVQG LED-ALRLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIIANQ
-             HEVKGMDWNT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIVGQPQVSH
-             VFV-GNDARR MLIVGVSVMP SYKFMREACV PFFHKLFMAD NQVRHEYMWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGANIN HLPRLPEQVV
-             -PPCILTVSG LKRTI-AGSP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             STYYKENRSV R--------- --ANNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRVM-GVG DIGGYEMICE
-             DLFQILVCE
-
-t15          MIWSEYRSMV REG--SDQSI DNH-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             -CNS--PSFL GMCMFHNQVP NKGA--LVLP DNVNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSQHLRE KQLRI----Y P---SIGK-V -VIIKVWNAA
-             MGRLNHHEPP AEVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGCIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN RKMGANVYQQ TSRMKAAAPL YPHIMEYAHG
-             M----VEPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPVLG DWVGNRCRAE LTALKTVQLD IGNSGKTLGQ
-             -NIMTPKRLG ERTWLAASPL Q------IGC GVVVQEKKVA SPQ-EVEVAA
-             D---IYFYRN MVIQTLTDVV AAVRMQSPQE MRPPVLVCIQ DVDSVSLGDD
-             TPQM--MNIA PYWVCVCSGV VKKTQPD-SV DKRGKTWVAK S-DFLCPPAV
-             SEGEH---GA EQRPVFGMRN PICKPWRFVI MNTQTFAKNI IRLLYVKDV-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADSCS TA-ANIAVCC WKRELMPGL-
-             --NHSCEHLA KTVYFKPDGE -------DEG QMIVKIFHLD WCEVEKSHEK
-             -SSVDDNYH- VNMLPFAQSN GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             VILS-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIVANQ
-             QEVKGMDWDT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIVGQPQVSH
-             VFV-GNDARR MLIVGVSVMP AYKFMREACV PFFHKLFMAE NQVRHDYMWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVV
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             STYYKENRSV R--------- --GNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDV ---YPTAPKK YVIRVM-GVG DIGGYELICE
-             DLFQILVCQ
-
-t63          MIWSEYRSMV REG--SDQSI DNK-C----- -------LTA ARVKLMSGVV
-             RQVRNAPEDA L--YTFFTGQ KGKRELIKY- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQD --------GD L--------- ----------
-             -CNS--PSFL GMCMFHNQVS FKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DEQDSSHLRE KQLRL----Y A---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AAVMFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGIIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR ANTMSKPVMG DWVGSRCRAE LTALKTVQLD VGSSGKTLGQ
-             -NIMTPKKLG DRTWLAASPL Q------IGC DVMVQEKKVA SPQ-EVEVAA
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRLPVLVCIQ DVDSPSLGDD
-             TPQK--MNIA PYWVCVCSGV VKKAQLD-SV EKRGKTWVAK S-DFLCPPAV
-             SEGEH---GP EQRPVFGVQN PVCKPWRFVI MNTQTFAANI IRLLYVKDV-
-             SCNAVLQLLD WQLCYSH-ED WQSLIADACP TA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KSVYFKPDGE -------DEG QMFMKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFVQSN GDPVGHYVQG LED-ALLLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIIANQ
-             QGVKGMDWDT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIIGQPQVSH
-             VFV-DNDARR MLIVGQSVMP PYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             YDIKIYETHF RMGVYAIDNS WETLVYC-EM TSGRIGAKIN HQPRLPEQVV
-             -PPCVLTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             STYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRQM-GMG DIGGYELICE
-             DLFQILVCE
-
-t50          MIWSEYRSMV REG--SDQSI DNK-C----- -------LTA ARVKLMSGVV
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNHF MC-LMHLMQN --------GD L--------- ----------
-             -CNS--PSFL GMCMFHNQVS VKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSSHLRE KQLRL----Y A---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AEVMFPLRK- -CGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGVIR GWCSSQHQYG
-             LANHVLVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR ANTMSKPVMG DWVGSRCRAE LTALKTVQLD VGSSGKTLGQ
-             -NIMTPKKLG DRTWLAASPL Q------IGC DVMVQEKKVA SPQ-EVEVAA
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRLPVLVCIQ DVDSPSLGDD
-             TPQK--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAV
-             SEGEH---GP EQRPVFGVQN PVCKPWRFVI MNTQT-AKNI IRLLYVKDV-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADACS TA-VNIAVCC WKRELMPGL-
-             --NHSVEHLA KSVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             -SSVDDNYN- VNMLPFVQSN GDPVGHYVQG LED-ALLLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIMANQ
-             QGVKGMDWDT GKE-MQQGPK -IVMHLALFY APSNVLAAEP NIIGQPQVSH
-             VFV-DNDARR MLIVGQSVMP AYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HQPRLPEQVV
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             STYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRQM-GMG DIGGYELICE
-             DLFQILVCE
-
-t25          MIWSEYRSMV REG--SDQSI DNK-C----- -------LTA ARVKMMSGVV
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             -CNS--PSFL GMCMFVNQVS FKGE--LVLP DNPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSSHLRE KQLRL----Y A---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AEVVFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWMGVIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR ANTMSKPVMG DWVGSRCRAE LTALKIVQLD VGSSGKTLGQ
-             -NIMTPKKLG DRTWLAASPL Q------IGC DVMVQEKKVA SPQ-EVEVAA
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRLPVLVCIQ DVDSPSLGDD
-             TPQK--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAV
-             SEGEH---GP EQRPVFGMQN PVCKPWRFVI MNTQTFAKNI IRLLYVKDV-
-             SCNAVLQLLD WQLCYSH-GD WQSLIADACP TA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KSVYFKPDGE -------DEG QMIMKIFNLD WCEVEKSHEK
-             -SSVDDNYD- VNMLPFVQSN GDPVGHYVQG LED-ALLLIR PGT---ARAL
-             VILF-YGCQY YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSTIIANQ
-             QGVKGMDWDT GKE-MQQGPK -IVVHLTLFY APSNVLAAEP NIFGQPQVSH
-             VFV-DNDARR MLIVGQSVMP AYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             YDIKIYETHF RMGVYAVDNS WEALVYC-EM TSGRTGAKIN HQPRLPEQVV
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             STYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIRQM-GMG DIGGYELICE
-             DLFQILVCE
-
-t51          MIWSEYRSMV REG--SDQSI DNK-C----- -------LIA ARVKMMSGVV
-             RQVRNAPEDA L--YTFFTGQ KGTRELIKY- YF-CMEGCGC VNTMAKNS-S
-             QSAPWKFNRF MC-LMHLMQN --------GD L--------- ----------
-             -CNS--PSFL GMCMFHVQVQ FKGE--LVLP DHPNENSVEF MYRRHHSLSD
-             KRCLNLLYVG DNQDSQHLRE KQLRI----Y A---RIGK-V -VIIKVWNAV
-             MGRLNHHEPP AEVVFPLRK- -GGSDSKPF- ---------- -------IDG
-             FF-------- ----DRPGIA NAMSVPCG-- --DQWVGVIR GWCSSQHQYG
-             LANHILVHGP SKLHRTYAIN KKMGANVYQQ DSRMKAAAPL YPHIMEYAHG
-             M----VKPFY GISEPKNEAQ KNGEN-PMNV PCVESGECQY ESKHAAMEKL
-             MHQ-SLYLMR VNTMSKPIMG DWVGNRCRAD LTALKTVQLD VGSSGKTLGQ
-             -NIMTPKNLG DKTWLAASPL Q------IGC GIMVQEKKVA SPQ-EVEVAA
-             D---IYFYRN MVIQRLTDVV AAVRMQSPQE MRPPVLVCIQ DVDSPSLGDD
-             TPQM--MNIA PYWVCVCSGV VKKAQPD-SV DKRGKTWVAK S-DFLCPPAI
-             SEGEH---GA EQRPVFGMQN PVCRPWRFVI MNTQTFAKNV IRLLYVKDV-
-             SCNKVLQLLD WQLCYSH-GD WQSLIADACP AA-VNIAVCC WKRELMPGL-
-             --NHSCEHLA KTVYFKPDGE -------DEG QMIMKIFGLD WCEVEKSHEE
-             -SSVDDNYN- VNMLPFVSSN GDPVGHYVQG LED-ALRLIR PGT---ARAL
-             VILF-YGCQF YSGKFQDSEL FERSQLYR-V YCEI----KK DHKSAIIANQ
-             QGVKGMDWDT GKE-MQQGPK -IVVHLALFY APSNVLAAEP NIIGQPQVSH
-             VFV-DNDIRR MLIVGVSVMP AYKFMREACV PFFHKLFMAE NQVRHDYVWN
-             YDIKIYETHF RMGVYAVDNS WETLVYC-EM TSGRIGAKIN HLPRLPEQVF
-             -PPCILTVSG LKRTI-AGAP DETEITKTLI YHIV--MWAD IMFKNCVMQY
-             ATYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHQQNI LTD-ELYSDM ---YPAAPKK YVIREM-GVG DIGGYELICE
-             DLFQILVCE
-
-t9           MIWSECRQMV REK--TDNAI DNQ-C----- -------LIA ARVKENSGHV
-             KQVRNDSEDI L--YNHFTGK KGARELIKR- YV-CMEGHDC VNTVANVS-S
-             QSAIWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSY--PSFL PMCMFVPQVL SKGE--LVLP DSSNEESISF VYLQHHSFSV
-             KRCLNYLNVG DSADSKHLKE KHLRA----E GMPGNIGK-H -VIINVWNAV
-             MGRLNHHEPP AEVVFPLRQ- -GGPDSKPM- ---------- -------IDG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             LASHTLSHDP SSLHRTFAIN RKMGANVYQQ TSRMKASAPF YPHCMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIDCQY ENKHATMTKL
-             MHH-SLYLMR MHTMSKPIMG DVNGNRCRAD LTALKMLQLD IGFSAKTLGQ
-             -NVVVPHLLG HRTWLATSPL Q------IGC GVMIFGNKIG SAN-EFEAAA
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRN------Q DVDSHSLGDD
-             DNQA--MVIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK V-DFLCPPAF
-             NQGEH---RA EQKPASKFEH PVCGPWEFVI VNYQTSAKDI ILLLYIKDV-
-             GCNCVLELLN WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             --NHSCERLA KHIYFQPDGE -------DEG KMVLKIFGLD WCEMEKSHQR
-             -SGVDDNYQ- VNMLPFNHSK NNPVGHYVQG LED-ALNLIR PGT---ARAL
-             NILF-YGCEV YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIIAHK
-             YEHKGMDWDT GKE-AQQGPE -VVHHNLLFF -------AEP NIHGQPGVGH
-             IFV-GNDARR KLIAGVSFMS MVKFMCEACV PFFRKLFMAV GQMRYDYVNN
-             YDIKIWETVF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             -PPCILTVSG LKETK-AGLI DGTEITKTPD IGIC--MWET IHFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAA LPK------- ----------
-             ----YHHQNT LVD-ELYSDV ---YPAAPKK K--VCM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t47          MIWSECRQMV REK--SDNAI DNQ-C----- -------QIA ARVKRNSGHV
-             KQVRNDSEDI L-CYHHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             QSAVWNFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSY--PSFL PMCMFVSQVL SKGE--LVLP DSSNEESISF VYLQHHSFSD
-             KRCLNYLNVG DNSDSKHLKE KHLRA----Q GMPGNIGK-H -VIINVWNAV
-             MGRLNHHESP AEVVFPLRQ- -GGPDSKPM- ---------- -------IDG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             LASHTLSHDP SNLHRTFAIN RKMGANVYQQ ASRMKASAPF YHHCMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESRDCQY ENKHATMTKL
-             MHQ-SLYLMR MHTMSKPIMG HVNGNRCRAD LTALKMLQLD IGFSAKTLCQ
-             -NIVVAHLLG HRTWLATSPL Q------IGC MVMIFGNKIG SAN-EFEAAA
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRE------Q DVDSHSLGDD
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK M-DFLCPPAF
-             NQGEH---RA EQKPALKFKH PVCGPWEFVI VNYQTSAKDI ILLLYIKDV-
-             GCNCVLELLK WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             --NHSCDRLA KHIYFQPDGE -------DEG KMILKIFGLD WCEMEKSHQR
-             -SGVDDNVQ- VNMLPFNHSK HNPVGHYVQG LED-ELNLIR PGT---ARAL
-             NILF-YGCEY YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIMACK
-             YRHKGMDWDT GKE-AEQGPE -VVHHNLLFF -------AEP NIQGQPGVGH
-             IFV-GNDARR KLIAGLSFMA MMKFMCEACV PFFRKLFMAV GHMRYDYVSN
-             YDIKIWETVF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             -PPCILTVSG LKETK-AGII DGTEITKTPE IGIC--MWDT IEFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNT LVD-ELYSDI ---YPAAPKK K--VCM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t60          MIWSECRQMV REK--TDNAI DNQ-C----- -------QIA ARVKENSGHV
-             KQVRNDSEDI L-CYHHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             QSAVWNFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSV--PSFL PMCMFVSQVL HKGE--LVLP DSSNEESISF VYLQHHSFSD
-             KRCLNYLNVG DNADSKHLKE KHLRA----Q GMPGNIGK-H -VIINVWNAV
-             MGRLNHHEPP AEVVFPLRQ- -GGPDSKPM- ---------- -------IDG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             LASHTLSHNP SNLHRTFAIN RKMGANVYQQ TSRMKASAPF YHHCMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIDCQY ESKHAAMTKL
-             MHQ-SLYLMR IHTMSKPIMG DVNGNRCRAD LTALKMLQLD IGFSAKTLGQ
-             -NIVVPHCLG HRTWLATSPL Q------IGC MVMIFGNKIG SEN-EFEAAA
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRN------Q DVDSHSLGDD
-             DNQA--MNIL PYVVCVCSGV VRKDHPDTSI HKRGRTWLAK V-DFLCPPAF
-             NQGEH---RA EQKPAFKFKH PVCGPWEFVI VNYQTEAKDI ILLLYIKDV-
-             GCNCVLELLE WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             --NHSCERLA KHIYFQPDGE -------DEG KMILKIFGLD WCEMEKSHQR
-             -SGVDDNYQ- VNMLPFNHSK HNPVGHYVQG LED-ALNLIR PGT---ARAL
-             NILF-YGCEY YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIMAYK
-             FEHKGMDWDT GKE-AEQGPE -VVHHNLLFF -------AEP NIQGQPGVGH
-             IFV-GNDARR KLIAGVSFMA VMKFMCEACV PFFRKLFMAV GQMRYDYMNN
-             YDIKIWETFF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             -PPCILTVSG LKETR-AGII EGTEITKTPD IGIC--MWDT IHFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNT LVD-ELYSDI ---YPAAPKK K--VCM-GVG EVGGYEVMGE
-             DLFQILVCE
-
-t30          MIWSECRQMV REK--TDNAI DNQ-C----- -------QIA ARVKENSGHV
-             KQVRNDSEDI L-CYHHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             QSAVWNFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSV--PSFL PMCMFVSQVL HKGE--LVLP DSSNEESISF VYLQHHSFSE
-             KRCLNYLNVG DNADSRHLKE KHLRA----Q GMPGNIGK-H -VIISVWNAV
-             MGRLNHHEPP AEVVFPLRQ- -GGPDSKPM- ---------- -------MDG
-             FFDK-D-D-- ----DRPGIA NAMSVPCG-- --EQWGGPTR GWCSSQQKFG
-             LASHTLSHTP SNLHRTFAIN RKMGANVYQQ TSRMKASAPF YHHCMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIDCQY ENKHATMTKL
-             MHQ-SLYLMR MHTMSKPIMG DVNGNRCRAD LTALKMLQLD IGFSAKTLGQ
-             -NIIVPHCLG HRTWLATSPL Q------IGC MVMIVGNKIG SEN-EFEAAA
-             DPTVIYFYRN RIVRRLADVI STVRMNSPQE MRN------Q DVDSHSLGDD
-             DNQA--MNIL PYVVCVCSGV VRKEHPDTSI SKRGRTWLAK I-DFLCPPAF
-             NQGEH---RA EQKPAFKFKH PCCGPWEFVI VNYQTSAKDI ILLLYIKDV-
-             GCNCVLELLK WQLCTSH-GD WQSLVADSCV WA-HNVAVCE WKRELVPGL-
-             --NHSCERLA KHIYFQPDGE -------DEG KMILKIFGLD WCEMEKSHQR
-             -SGVDDNYQ- VNMLPFKHSK HNPVGHYVQG LED-ALNLIR PGT---ARAL
-             NILF-YGCEY YSGEFQDSES -ERSWIYN-V YCEI----KK DHKSAIMAYK
-             YEHKGMDWDT GKE-AEQGPE -VVHHNLLFF -------AEP NIHGQPGVGH
-             IFV-GNDARR HLIAGVSFMA VVKFMCEACV PFFRKLFMAV GQMRYDYVNN
-             YDIKIWETVF RGGVYAIENS WETLVLC-EM TSGRCGAKMN HLPRLFEQVC
-             -PPCILTVSG LKETR-AGII DGTEITKTPD IGIC--MWDT IHFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHDQNT LVD-ELYSDV ---YPAAPKK K--VCM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t70          MIWSECRQMV REK--NDNAI DNQ-C----- -------LIA ARVKEDSGHV
-             KQVRNASEDI M--YNHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             QSAVWKFDRF MCDLMHLMQD --------GD L--------- ----------
-             -CSY--PSFL PMCMFVAQVI AKGE--LVLP DSSTEESISF MYLQHHSFSD
-             KRCLNYLNVG DNEDSKHAKE KFLRG----D G---GIGQ-H -VIINVWNAV
-             MGRLNHHEPP PEVVFPLRQ- -GGPDSKPM- ---------- -------VDG
-             FFDK-D-D-- ----DRPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHKFG
-             LAFHTLSHDP SKLHRTFAIN QKMGANVYQQ MSRMKTPAPF YPHVMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEKVPMNV PCVESMDCQY ENKHAPMAKL
-             MHQDSLYLMR MHTMSKPLMG DVNGNRCRAD LTSLKMLQLD IGFCAKTLGQ
-             -NIVVPKLLG HRTWLATAPL Q------IGC GMMIFGNKIG STQ-EFEAAA
-             DPTVIYFYRN RIVRRMADVI STVRMKSPQE MRG------Q DVDSHSLGDD
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK I-DFLFPPAF
-             NQGEH---HA EQKPVFGFKH PHCGPWEFVI CNYQTVAKDI ILLLYIKDV-
-             GCNCVLELLA WQLCTSH-GD WQSLVADSCI WA-HNVAVCA WKRELVPGL-
-             --NHSCEHLA KHIYFQPDGE -------DEG KMILKIFGLD WCEVERSHQR
-             -SGVDDNYK- VNMLPFSHSK HNPVGHYVQG LGD-ALRLIR PGT---ARAL
-             NILF-YGCQY CSGEFQDSEE -ERSWIYN-V YCEI----KK DHKSAILAHK
-             YKHKGMDWDT GKE-MEQGPK -VVNYNLLFY -------AEP NIHGQPRVGH
-             IFV-GNDAHR KLIAGVSFMS IMKFMCEACV PFFRKLFMAV RQMRYMYMNN
-             YDIKIWETAF RGGVYAIENS WETLVLC-EM TSGRSGAKMN HLPRLFEQVC
-             -PPCLLTVSG LKETV-AGII DGTEITKTPE IGIC--MWDT IHFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHNQNT LVD-ELYSDV ---YPAAPKK Q--HYM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t91          MIWSECRQMV REK--NDNAI DNQ-C----- -------LIA ARVKEDSGHV
-             KQVRNASEDI M--YNHFTGK KGARELIKR- YI-CMEGHDC VNTMANVS-S
-             QSAVWKFDRF MCDLMHLMQD --------GD L--------- ----------
-             -CSY--PSFL PMCMFVAQVI AKGE--LVLP DSSTEESISF MYLQHHSFSD
-             KRCLNYLNVG DNEDSKHAKE KFLRG----D G---GIGQ-H -VIINVWNAV
-             MGRLNHHEPP PEVVFPLRQ- -GGPDSKPM- ---------- -------VDG
-             FFDK-D-D-- ----DRPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHKFG
-             LAFHTLSHDP SKLHRTFAIN QKMGANVYQQ MSRMKTPAPF YPHVMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEKVPMNV PCVESMDCQY ENKHAPMAKL
-             MHQ-SLYLMR MHTMSKPLMG DVNGNRCRAD LTSLKMLQLD IGFCAKTLGQ
-             -NIVVPKLLG HRTWLATAPL Q------IGC GMMIFGNKIG STQ-EFEAAA
-             DPTVIYFYRN RIVRRMADVI STVRMKSPQE MRG------Q DVDSHSLGDD
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK I-DFLFPPAF
-             NQGEH---HA EQKPVFGFKH PHCGPWEFVI CNYQTVAKDI ILLLYIKDV-
-             GCNCVLELLA WQLCTSH-GD WQSLVADSCI WA-HNVAVCA WKRELVPGL-
-             --NHSCEHLA KHIYFQPDGE -------DEG KMILKIFGLD WCEVERSHQR
-             -SGVDDNYK- VNMLPFSHSK HNPVGHYVQG LGD-ALRLIR PGT---ARAL
-             NILF-YGCQY CSGEFQDSEE -ERSWIYN-V YCEI----KK DHKSAILAHK
-             YKHKGMDWDT GKE-MEQGPK -VVNYNLLFY -------AEP NIHGQPRVGH
-             IFV-GNDAHR KLIAGVSFMS IMKFMCEACV PFFRKLFMAV RQMRYMYMNN
-             YDIKIWETAF RGGVYAIENS WETLVLC-EM TSGRSGAKMN HLPRLFEQVC
-             -PPCLLTVSG LKETV-AGII DGTEITKTPE IGIC--MWDT IHFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHNQNT LVD-ELYSDV ---YPAAPKK Q--HYM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t49          MIWSECRQMV REK--NDNAI DNQ-C----- -------LIA ARVKENSGHV
-             KQVRNASEDI M--YNHFTGN KGACELIKG- YV-CMEGHDC VNTMANIS-S
-             QSAVWKFDRF MCDLMHLMQD --------GD L--------- ----------
-             -CSY--PSFL PMCMFVAQVI AKGE--LVLP DSSNEESISF MYLQHHSFSD
-             KRCLNCLNVG DNEDSKHLKE KFLRA----D G---GIGQ-H -VIINMWNAV
-             MGRLNHHEPP PEVVYPLRQ- -GGPNSKPM- ---------- -------VDG
-             FFDK-D-D-- ----DRPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHRFG
-             LAFHTLKHDP SKLHRTFAIN EKMGANVYQQ NSRMKASAPF YPHVMEYAHG
-             V----CKPFY EHSEPKNDAQ GNGDKVPMNV PCVESMDCQY ENKHAPMAKL
-             MHQ-SLYLMR MYTMSKPIMG DVNGNRCRAE LTSLKMLQLD IGFSAKTLGQ
-             -NIVPPKLLG HRTWLATSPL Q------IGC GVMIFGNKIG STQ-EFESAA
-             DPTVIYFYRN RIVKRMADVI STVRMKSPQE MRG------Q DVDSHSLGDD
-             DNQA--MNIL PYWVCVCSGV VRKEHPDTSI NKRGRTWLAK I-DFLFPPAF
-             NQGEH---HA EQKPVFGFKH PHCGPWEFVI CNYQTMAKDI ILLLYIKDV-
-             GCNCVLELLA WQLCTSH-GD WQSLVADSCI WA-HNVAVCA WKRELVPGL-
-             --NHSCEHLA KHIYFQPDGE -------DEG KMIIKIFGLD WCEVEKSHQR
-             -SGVDDNYK- VNMLPFSHSN HNPVGHYVQG LGD-ALRLIR PGT---ARAL
-             NILF-YGCEY YSGEFQDSEE -ERSWIYN-V YCEI----KK DHKSAIMAHK
-             YEHKGMDWDT GKE-MEQGPK -VVHHNILFY -------AEP NIHGQPRVGH
-             IFV-GNDAVR NLIAGVSFMS IMKFMCEACV PFFRKLFMAV RQMRYMYMNN
-             YDIKIWETAF RGGVYAMENS WETLVLC-EM TSGRVGARMN HLPRLFEQVC
-             -PPCILTVSG LKETV-AGVI DGTEITKTPE IGIC--MWDT IHFKNPVMQY
-             CCYYKEPRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHNFNA LVD-ELYSDV ---YPAAPKK K--HYM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t52          MIWSEERQMV REK--VDNAV DNQ-C----- -------LIA ARVKENCGHV
-             KQVRNASEDI L--YNHFTGK KGARELIKR- YI-CMEGHDC VNTMAHDS-S
-             QSATWKFDRF MCDLMHLMQG --------GD L--------- ----------
-             -CSY--PSFL PVCMFVAQVI NKGE--LVLP DSSNEESISF MYLQHHSFSE
-             KRCLNYLNVG DNEDSKHLKE KFLRA----D G---NIGQ-H -VIINMWNAV
-             MGRLNHHEPP AEVNFPLRQ- -GGPDSKPM- ---------- -------VDG
-             FFDK-D-D-- ----DSPGIA NAMNVPCG-- --DQWGGPIR GWCSSQHKFG
-             LASHTLSHDP SKLHRTFGIN KNMGANVYQQ TSRMKANAPF YPHVMEYAHG
-             V----CKPFY EHSEPKNEAQ GNGEK-PMNV PCVESIECQY ENKHATMAKL
-             MHD-SLYLMR MHTMSKPVMG DVNGHRCRAD LTALKMLQLD IGFSAKTLGQ
-             -NIVAPKLLG VRTWLATSPL Q------IGC GVMIFGNKIG STQ-EFEAAA
-             DPTVIYFYRN RIIRRVADVI STVRMKSPQE MRE------Q DVDSHSLGDD
-             DNQA--MTIL PHWVCVVSGV VRKEHPDTSI NKRGSTWLAK V-DFLCPPAF
-             NQGEH---HA EQKPVFGFKH PHVGPWEFVI CNYQTSAHDI ILLLYIKDV-
-             GCNCVLELLV WQLCTSH-GD WQSLVADSCV WA-HNVAVCA WKRELVPGL-
-             --NHSCERLA KHIYFQPDGE -------DEG KMILKIFELN WCEVEKSHQH
-             -SGVDDNYQ- VNMLPFDHCK HNPVGHYVQG LED-ALGLIR PGT---ARAL
-             NILF-YGCQY YSGEFQDSEA -ERSWIYN-V YCEI----KK DHKSGIMAHK
-             YDHKGVDWDT GKE-MEQGPK -VLHHNLLFY -------AEP NIHGQPTVGH
-             IFV-GNDARR KLIAGVSFMS VVKFMCEACV PFFRKLFMAF RQMRYDYVNN
-             YDIKIWETVF RGGVYAIENS WETLILC-EM TSGRCGAKMN HMPRLFEQVC
-             -PPCILTVSG LKETM-AGVI DGTEITKTPD IGIG--MWDS IHFKNPVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNS LVD-ELYSDV ---YPAAPKK K--HYM-GVG DVGGYEVMGE
-             DLFQILVCE
-
-t43          MIWSEVRQMV REG--SDNAI DNR-C----- -------LIA ARVKHVQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             QSAVWKFDRF MCALMHLMQK --------GD L--------- ----------
-             -CSH--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNCLNVG DNDDSEHLKE KHLRI----Y G---QIGH-H -VIINVWNAF
-             MGRLNHHEPP AEVVYPLRK- -GGPDSK-M- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVNFG
-             LANHTLVQ-P SKLHRTFKIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKVVQLD IGFSSKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGV DVMVMGNKIG SPS-EFEVAA
-             DPTIIWFYRN CIVHKLADTV STAKMKSPQE MRH------Q DVDSPSLGDD
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             NQGEH---ER EQRPVYGFKH PGCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             SCNGVLQLLN WHLCDSH-GD WQSLVADSCC WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFLHSR QNPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCEY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVIAHK
-             HEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLITGVSVMP TYKFMCGACV PFFHKLFMAV RNMRYDYNVN
-             YDIKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCVLTVSG LKQPM-AGYN DQTEITKTPD ICIC--TWGT IHFKNFVMQY
-             CVYYKENRSV R--------- --VNNTGGAE LPQ------- ----------
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t1           MIWSEVRQMM REG--TDNAI DNQ-C----- -------LIA ARVKHMQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             QSAVWKFDRF MCCLMHLMQN --------GD L--------- ----------
-             -CSH--PSFL GMCMFVEQVR CKGE--LVLP DSPNEESLSF VYIQHHSFSD
-             KRCLNCLNVG DNDDSEHLKE KHLRI----Y G---QIGR-H -VIINVWNAF
-             MGRLNHHEPP AEVVYPLRK- -GGPDSKPV- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             LANHTLVQ-P SKLHRTFKIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAK LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG RHTWLATSPL Q------IGC DMMVMGNKIG SPS-EFEVAA
-             DPTIIWFYRD CIVHKLADTV STAKMKAPQE MRV------Q DVDSPSLGDD
-             DQQE--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             NQGEH---EA EQRPVYGFVH PRCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFMQSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCEY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             VEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLITGVSVMP TYKFMCGACV QFFHKLFMAV RNMRYDYTVN
-             YDIKIWETHI RQGVYAVENS WETLITC-EM TSGRIGAKIN HLPRLPEQVV
-             -PPCILTVSG LKQPM-AGYN DETQITKTPD ICIC--TWGT IHFKNSVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t86          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKPVQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             QSAVWKFDRF MCALMHLMQN --------GD L--------- ----------
-             -CSH--PSFL GMCMFHEQVR RKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNCLNVG DNDDSEHLKE KHLRI----Y G---QIGR-H -VIINVWNAF
-             MGRLNHHEPP AEAVYPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             LANHTLVQ-P SKLHRTFKIN KKMGANVYHQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPS-EFEVAA
-             DPTIIWFYRN CIVHKLADTV STAKMKAPQE MRV------Q DVDSPSLGDD
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             NQGEH---GA EQRPVYGFQH PRCRPWQFVI ANYQTFAKNI IMLLYVKDV-
-             SCNRVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFIHSR DNPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCEY YSGQFPDGEA -ERSWIYP-V YCEM----KK DHKSAVVAHK
-             AEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLITGVSVMP TYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             YDIKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQPM-AGYN DETQITKTPD ICIC--GVGT IHFKNLVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t72          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHVQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKVS-S
-             QSAVWKFDRF MCALMHLMQN --------GD L--------- ----------
-             -CSH--PSFL GMCMFHEQVR RKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNCLNAG DNDDSEHLKE KHLRT----Y G---QIGR-H -VIINVWNAF
-             MGRLNHHEPP AEVVYPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----HRPGIA NAVSVPCA-- --DQVGGPLR GWCSSQVKFG
-             LANHTLVQ-P SKLHRTFKIN KKIGANVYQQ TSRMKADAPV YPHIMEYAHG
-             V----YKPFY ERSEPKNEAQ GNGEK-QGNV PCVESVECQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPS-EFEVAA
-             DPTIIWFYRN CIVHKLADTV STAKMKAPQE MRH------Q DVDSPSLGDD
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             KQGEH---EA EQRPVYGFQH PRCRPWQFVI ANYQSSAKNI IMLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG QMVLKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFIHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCEY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             VEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLITGFSIMP TYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             YDIKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQPV-AGYN DETQITKTPD ICIC--TWGT IHFKNSVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t96          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHVQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             QSAVWKFDRF MCALMHLMQV --------GD L--------- ----------
-             -CSH--PSFL GMCMFHEQVR RKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNCLNVG DNDDSEHLKE KHLRV----Y G---QIGR-H -VIINVWNAF
-             MGRLNHHEPP AEVVYPLRK- -GGPDSKLM- ---------- -------VDG
-             FFDK-E-D-- ----ERPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             LANHTLVQ-P SKLHRTFKIN KKIGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMECQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVIGNKIG SPS-EFEIAA
-             DPTIIWFYRN CIVHKLADTV STAKMKAPQE MRV------Q DVDSPSLGDD
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             NQGEH---EA EQRPVYGFQH PRCRPWQFVI GNYQTSAKNI IMLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCM WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFIRSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCEY YSGQFPDAEA -ERSWIYD-V YCEM----KK DHKSAVYAHK
-             VEHKGMDWDT GKE-MNQGPK -IVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLISGVSVMP TYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             YDVKIWETHI RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQPM-AGYN METQITKTPD ICIC--TWGT IHFKNSVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNI LVD-ELYSDV ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHG
-
-t44          MIWSEVRQMV REG--TDNAI DTR-C----- -------LIA ARVKHMQGHV
-             KQVRNANEDA L--YQNFSGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             QSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSH--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNYLNVG DNDDSEHLKE KHLRI----Y G---VIGK-H -VIINVWNAF
-             MGRLNHHEPP ADVEYPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCG-- --DQVGGPIR GWCSSQVKFG
-             LANHTLAQNP SKLHRTFKIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY DRSEPKNEAQ GNGEK-QGNV PCVESMDCQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG YVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGC DIMVMGNKIG SPS-EFEVAA
-             DPTIIWFYRN CIVHKLADVV STAKMKSPQE MRV------Q DVDSPSLGDD
-             DQQA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK N-DFLCPPAF
-             EQGEH---EA EQCPVHGFKH PRCRPWQFVI ADYQTSAKNI IMLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVLKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFMHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCEY YSGQFPDCEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             HEHKGMDWDT GKE-MNQGPK -VVMHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLITGVSVMP TYKFMCNACV PFFHKLFMAV RNMRYDYTVN
-             YDIKIWETHM RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQPM-AGYN DETEITKTPD ICIC--TWGT IHFKNSVMQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNM LVD-ELYSDM ---YPAAPKK K--VYV-GAG DVGGYEVMSE
-             DLFQILVHA
-
-t45          MIWSEVRQMV REG--TDNAI DNC-C----- -------LIA ARVKHMQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YK-CMEGHDC VNTMAKSS-S
-             QSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSV--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNYLNVG DNDDSEHLKE KHLRI----Y G---EIGK-H -VIINVWNAF
-             MGRLNHHEPP AEVMYPLRK- -GGPESKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCT-- --DQVGGPIR GWCSSQVKFG
-             LANHTLVHNP SKLHRTFAIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMDCQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPA-EFEVAA
-             DPTIIWFYRN CIVHKLADLV STAKMKSPQE MRV------Q DVDSPSLGDD
-             DQEA--MDIL PYWVCVMSGV VRKEQPD-SV NKRGRTWLAK K-DFLVPPAF
-             NQGEH---EA EQKPVYGFDH PRCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVHKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFFHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCQY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             HQHKGMDWDT GKE-MNQGPK -VVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLIPGVSVMH DYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             YDIKIWETHL RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQPM-AGFV DETEITKTPD ICIC--TWGT IHFKNSVVQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t74          MIWSEVRQMV REG--TDNAI DNC-C----- -------LIA ARVKHMQGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHDC VNTMAKPS-S
-             QSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSV--PSFL GMCMFHEQVR CKGE--LVLP DSPNEESVSF VYIQHHSFSD
-             KRCLNYLNVG DNDDSEHIKE KHLRI----Y G---EIGK-H -VIINVWNAF
-             MGRLNHHEPP AEVMYPLRK- -GGPESKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCA-- --DQVGGPIR GWCSSQVKFG
-             LANHTLVHNP SKLHRTFAIN KKMGANVYQQ TSRMKAEAPV YPHIMEYAHG
-             V----CKPFY ERSEPKNEAQ GNGEK-QGNV PCVESMDCQY ENKHAIMAKL
-             MHP-PLYLMR METMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSAKTLGQ
-             LNIIDCKLLG HRTWLATSPL Q------IGC DVMVVGNKIG SPA-GFEVAA
-             DPTIIWFYRN CIVHKLADLV STAKMKSPQE MRV------Q DVDSPSLGDD
-             DQEA--MDIL PYWVCVTSGV VRKEQPD-SV NKRGRTWLAK K-DFLVPPAF
-             NQGEH---EA EQKPVYGFDH PRCRPWQFVI ANYQTSAKNI IMLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCV WA-HNVAVCG WKRELVPGL-
-             --NHSCEMLA KTVYFEPDGE -------DEG KMVHKIFELD WVEMEKSHQQ
-             -SSVDDNYL- VNMLPFFHSR ENPVGHYVQG LED-PMHLIR PGT---ARKL
-             NILF-YGCQY YSGQFPDGEA -ERSWIYD-V YCEM----KK DHKSAVVAHK
-             HQHKGMDWDT GKE-MNQGPK -VVLHGVLFN -------AEP NIHGQPGVSH
-             VFM-GNDATR KLIPGVSVMH DYKFMCGACV PFFHKLFMAV RNMRYDYTVN
-             YDIKIWETHL RHGVYAVENS WETLVTC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQPM-AGFV DETEITKTPD ICIC--TWGT IHFKNSVVQY
-             CCYYKENRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHHQNI LVD-ELYSDM ---YPAAPKK K--HYV-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t26          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHMSGHV
-             KQVRNANEDA L--YQNFTGK KGAREKIKR- YL-CMEGHEC VVTMAKNS-S
-             ISAMWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSF--PSFL GMCMFHDQVR CKGE--LVLP DSKNEESVSF VYIQHHSFSD
-             KRCLNYLNVG DNEDSEHLKE KHLRV----Y G---NIGK-H -VIINSWNAM
-             MGRLNHHEPA AEVVYPLRK- -GGPESKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVSVPCD-- --DQWGGPVR GWCSSQHKFG
-             LADHTLIHIP SKLHRTFAIN KKMGANVYQQ TSRMKAAAPV YSHVMEYAHK
-             V----VKPFY ARSEPKNEAQ GNGEK-QWNV PCVESMDCQY ENKHATMAKL
-             MHP-PLYLMR MQTMAKPPMG DVDGHRCRAG LTALKIVQLD IGFSQKTLGQ
-             -NIIDSKHLG HRTWLATSPL Q------IGC SAMVMGNKIG SPQ-EVELAA
-             DPTVIYFYRN CIVQKMADVV STVKMKSPQE MRV------Q DVDSASLGDD
-             DQQP--MNII PYWVCVTSGV VHKEQPD-SV NKRGRTWTAK N-DFLCPDAF
-             NQGEH---GA EQKPTHGFEH PRCRPWQFVI PVYQTGAKNI ILLLYIKDV-
-             SVNGVLQLLI WQLCDSH-GD WQSLVADSCA WA-VNVAVCG WKRELVPGL-
-             --NHACEMLA KTVYFEPDGE -------DEG KMVIKIFGLD WCEIEKSHQQ
-             -SSVDDNYL- VNMLPFTHSR ETPVGHYVQG LED-PMHLMR PGT---ARAL
-             NILF-YGCEY YSGQFPDGEP -ERSWIYD-V YCEL----KK DHKNAIVAVK
-             HEHKGMDWDT GKE-MNHGPK -VIVHGVLFH -------AEP NIGGQPGVSH
-             VFV-GNDATR KLIAGVSVMP IVKFMCGACV PFFRKLFMAL RNMRYDYASN
-             YDIKIVETHL REGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQSV-SGYN DETEITKTPD IKIC--TWGT IHFKNSVMQY
-             CCYYKENRSV R--------- --LNNTGGAE LPK------- ----------
-             ----YHHQNV LVD-ELYGEA ---YPAAPKK K--HYM-GAG DVGGYEVMSE
-             DLFQILVHE
-
-t61          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHMSGHV
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHEC VNTMAKNS-S
-             VSAVWKFDQF MCDLMHLMQN --------GD L--------- ----------
-             -CSF--PSFL GMCMFHEQVR CKGE--LVLS DSKNEESVSF VYIQHPSFSD
-             KRCLNYLNVG DNEDSEHLKE KVLRV----Y G---DIGK-H -VIINVWNAM
-             MGRLNHHEPA AEVVCPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGVA NAVSVPCD-- --DQWGGPVR GWCSSQHKFG
-             LADHTLVHIP SKLHRTFAIT KKMGANVYQQ TSRMKATAPV YPHVMEYAHG
-             V----VKPFY DRSEPKNEAQ GNGEK-QWNV PCVESMDCQY ENKHATMAKL
-             MHP-PLYLVK MQTMSKPPMG DVDGHRCRAG LTALKIVQLD IGFSSKTLGQ
-             -NIIHSKLLG HRTWLATSPL Q------IGC DVMVMGNKIG SPQ-EVELAA
-             DPSVIYFYQN CIVQKMADVV STVKMKSPQE MRV------Q DVDSASLGDD
-             DQQP--MNII PYWVCVTSGV VRKEQPD-SV NKRGHTWTAK N-DFLCPPAY
-             NQGEH---GA EQKPVHGFEH PRCRPWQFVI SVYRTGAKNI NLLLYIKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCA WA-VNVAVCG WKRELVPGL-
-             --NHACEMLA KSVYFEPDGE -------DEG KMVLKIFGLD WCEIEKSHQQ
-             -SSVDDNYL- VNMLPFAHSR QTPVGHYVQG LED-PMHLMR PGT---ARAL
-             NILF-YGCEY YSGHFPDGEA -ERSWIYD-M YCEL----KK DHKSAIVAVK
-             HCHKGMDWDT GKE-MNHGPK -VIIHGLLFH -------AEP NIGGQPGVSH
-             VFV-GNDATR KLIAGASVMF IVKFMCGACV PFFRKLFMAL RNMRYDYSQN
-             YDIKIVETHL REGVYAIENS WETLVVC-EM TSGRMGAKIN HLPRLPEQVI
-             -PPCILTVSG LKRAV-NGYN DETEITKTPD IKIC--TWGT IHFKNSVMQY
-             CCYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             ----YHHQNV LVD-ELYSEL ---YPAAPKK A--HYM-GAG DIGGYEVMSE
-             DLFQILVHE
-
-t97          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHMSGHM
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGHEC VNTMAKNS-S
-             VSAVWKFDRF MCDLMHLMQN --------GD L--------- ----------
-             -CSF--PSFL GMCMFHQQVR CKGE--LVLP DSKNEESVSF VYIQHHSFND
-             KRCLNYLNVG DNEDSEHLEE KHLRV----Y G---NIGK-H -VIINVWNAM
-             MGRLNHHEPA AEVVCPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGVA NAMSVPCD-- --DQWGGPVR GWCSSQHKFG
-             LADHTLVHVP SKLHRTFPIN KKMGANVYQQ TSRMKATAPV YPHVMEYAHG
-             V----IKPFY DRSEPKNEAQ GNGEK-QWNV PCVESMDCQY ENKHATMAKL
-             MHP-PLYLVK MQTMSKPPMG DVDGHRCRAG LTALQIVQLD IGFSAKTLGQ
-             -NIIHSKLLG HRTWLATSPL Q------IGC DVVVMGNKIG SPQ-EVELAA
-             DPSVIYFYQN CIVQKMADVV STVKMKSPQE MRV------Q DVDSASLGDD
-             DQQP--MNII PYWVCVTSGV VRKEQPD-SV NKRGRTWSAK N-DFLCPPAF
-             NQGEH---GA EQKPVHEFQH PRCRPWQFVI SVYRTGAKNI NLLLYIKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLVADSCA WA-VNLAVCG WKRELVPGL-
-             --NHACEMLA KSVYFEPDGE -------DEG KMNLKIFGLD WCEIEKSHQQ
-             -SSVDDNYL- VNMLPFTHSR ETPVGHYVQD LED-PMHLMR PGT---ARAL
-             NILF-YGCEY YSGHFPDGEP -ERSWIYD-M YCEL----KK DHKSAIVAVK
-             HCHKGMDWDT GKE-MNHGPK -VIIHGVLFH -------AEP NIGGQPGVSH
-             VFV-GNDATR KLIAGVSVMP IVKFMCGACV PFFRKLFMAL RNMRYDYSQN
-             YDIKIVETHL REGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCILTVSG LKQAV-NDCN DETEITKTPD IKIC--TWPT IHFKNGMMQY
-             CCYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             ----YHHQNV LVD-ELYSEV ---YPAAPKK A--FYM-GAG DIGGYEVMSE
-             DLFQILVHK
-
-t17          MIWSEVRQMV REG--ADNAI DNR-C----- -------LIA ARVKHFSGHT
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGQDC VNTMAKSS-S
-             QSAVWKFDRF MCDLVHLMQN ---GARGSGD L--------- ----------
-             -CSF--PSFL GMCMFHEQVR CKGE--LVLP DSKNEESVSF VYIQHHSFSD
-             KRCLNELNVG DNEDSIHLKE KHLRI----Y G---NIGK-V -VIINVWNAM
-             MGRLNHHEPA AEVVYPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVAVPCS-- --DQWGGPVR GWCSSQHKFG
-             LADHTLVHVP SLLHRTFAIN RKMGANVYQQ TSRMKAAAPV YPHMMEYAHG
-             V----VKPFY ERSEPKNEAQ GNGEK-QWNV PCVQSVDCQY ENKHATMAKL
-             MHP-PLYLMR METMSKPPMG DVDGVRCRAG LTALKIVQLD IGFSAKTLGQ
-             -NIIDSKLLG HRTWLATSPL Q------IGC DVMVVGNKIG SPQ-EFELAA
-             DPTVIYFYRN CIVQKLADVV STVKMKSPQE MRV------Q DVDSPSLGDD
-             NQQS--MNII PYWVCVHSGV VQKEQPD-SV HKRGRTWTAK N-DFLCPPAF
-             DQGEH---GA EQKPVHGFEH PRCRPWQFVI ANYQTGAKNI ILLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLSADSCA WA-HNVAVCG WKRELVPGL-
-             --NHACEMLA KTVYFEPDGE -------DEG KMVIKIFGLD WCEMEKAHQQ
-             -SSVDDNYL- VNMLPFTHSR ENPVGHYVQG LED-PMHLIR PGT---ARAL
-             NILF-YGCEY YSGQFPDGEP -ERSWIYD-V YCEL----KK DHKSAIVAVK
-             HEHKGMDWDT GKE-MNQGPK -VIIHGVLFH -------AEV NIHGQPGVSH
-             VFV-GNDATR KLIAGVSVMP FVKFMCGACV PFFRKLFMAL RNMRYDYTSN
-             YDIKIIETHL RNGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKQAM-AGVN DETEITKTPD IKIC--TWGT IHFKNFVMQY
-             CVYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             ----YHHQNA LVD-ELYSDV ---YPAAPKK K--HYM-GEG DVGGYEVMSE
-             DLFQILVHA
-
-t11          MIWSEVRQMV REG--TDNAI DNR-C----- -------LIA ARVKHFSGHT
-             KQVRNANEDA L--YQNFTGQ KGAREKIKR- YL-CMEGQDC VNTMAKSS-S
-             QSAVWKFDRF MCDLVHLMQN ---GARGSGD L--------- ----------
-             -CSF--PSFL GMCMFHEQVR CKGE--LVLP DSKNEESVSF VYIQHHSFSD
-             KRCLNSLNVG DNEDSIHLKE KHLRI----Y G---DIGK-H -VIINVWNAM
-             MGRLNHHEPA AEVVYPLRK- -GGPDSKPM- ---------- -------VDG
-             FFDK-E-D-- ----DRPGIA NAVAVPCS-- --DQWGGPVR GWCSSQHKFG
-             LADHTLVHVP SLLHRTFAIN KKMGANVYQQ TSRMKAAAPV YPHMMEYAHG
-             V----VKPFY ERSEPKNEAQ GNGEK-QWNV PCVQSVDCQY ENKHATMAKL
-             MHP-PLYLMR METMSKPPMG DVDGVRCRAG LTALKIVQLD IGFSAKTLGQ
-             -NIIDSKLLG HRTWLATSPL Q------IGC DVMVVGNKIG SPQ-EFELAA
-             DPTVIYFYRN CIVQKLADVV STVKMKSPQE MRV------Q DVDSPSLGDD
-             NQQS--MNII PYWVCVHSGV VQKEQPD-SV HKRGRTWTAK N-DFLCPPAF
-             DQGEH---GA EQKPVHGFEH PRCRPWQFVI ANYQTGAKNI ILLLYVKDV-
-             SCNGVLQLLN WQLCDSH-GD WQSLSADSCA WA-HNVAVCG WKRELVPGL-
-             --NHACEMLA KTVYFEPDGE -------DEG KMVIKIFGLD WCEMEKAHQQ
-             -SSVDDNYL- VNMLPFTHSR ENPVGHYVQG LED-PMHLIR PGT---ARAL
-             NILF-YGCEY YSGQFPDGEP -ERSWIYD-V YCEL----KK DHKSAIVAVK
-             HEHKGMDWDT GKE-MNQGPK -VIIHGILFH -------AEV NIHGQPGVSH
-             VFV-GNDATR KLIAGVSVMP FVKFMCGACV PFFRKLFMAL RNMRYDYTSN
-             YDIKIMETHL RNGVYAVENS WETLVVC-EM TSGRIGAKIN HLPRLPEQVI
-             -PPCMLTVSG LKQAM-AGVN DETEITKTPD IKIC--TWGT IHFKNFVMQY
-             CVYYKENRSV R--------- --FNNTGGAE LPK------- ----------
-             ----YHHQNV LVD-ELYSDG ---YPAAPKK K--HYM-GEG DVGGYEVMSE
-             DLFQILVHA
-
-t23          MIWSECQRML REH--EDQAI ANE-C----- -------LIA FKVKLVNGHV
-             KQVRNASEDA H--YTFFAGE KGARELIKR- YS-CMEGDGC VNTMAEGR-S
-             ESAVWKFDPF MCQLTHSMQS --------GD L--------- ----------
-             -CSV--PSFL GVCMFQRQVV MKGE--LVLP DSADEGSVSF MYIQHHSFAA
-             KRCLNVLNVG DNEDSVHLRH KQLRV----Y G---KIGK-H -VIISVPNAI
-             MGRLNHHEPS AIVVFPLRQ- -RGADSKSV- ---------- -------GDG
-             FYDK-D-E-- ----DRPGIA NAVSVPVA-- --EQWVGSVR GWYSSEHKYG
-             LANHILI-GP SKLHRTYQTT AKMGANVVKA TNRMKRPQPV YPHVMEYANG
-             V----VKPFY EVAESKNEAQ GNGEK-PVNV PCVESPDCQY ESKHARVNKL
-             MHP-SLYLMC MEAMNKPIMG DWDGNRCRSP LCLLKVIQLD MGVSGKTLGQ
-             -NIVMAKLLG ERTWLATSPL Q------IGC DVVAVGKKPE SPQ-EFECAA
-             DPTVIYFYKN LIIQQAADYV SAVQVKSPQE MRY------Q DVNSPSDGDE
-             NGQS--MHIG PYWVCVSSEV VKKSQPD-SV DKRGRTWVAK N-EFLCPPDH
-             MQGEHSIEGA EQKPFFGFAG PFPQPWQFVI VNPQTWAHNI IRLLYCKDV-
-             SCNCVLTCLN WVLCDSH-GD WHSLIADACP CA-HNVAVCG WKRELVPGL-
-             --NHSNEHMA KTIYFEPDGH -------DEG KMILNIFGLD WCEVETSHQE
-             -SSSDDNHL- VNMLPFGVSR DDPVGHYMLG LED-AIRLYR PGT---ARAL
-             NILF---VNY YSGDFQDPEL -ERSQLYN-V YCEQ----KQ DHRNAIRASK
-             NDHKGMAWDT AKD-MEQGPK -MVEHQVLFY -------AEP NMHGQPEVIH
-             IFI-GNDAMC MLIPGMSVMV HHKFMRAACM PFFNKLFMAV RYMRYDYVDN
-             YDIKIDETRY RDGVYARRNS WETANVC-EM SSGRSGAKIN HNPRLPEQVT
-             -PPRSLTVSG LKDTM-PGHP DVTEITKTPV IAIV--MWGT INLKNHVMQY
-             CCYYKETRSV R--------- --VNNTGGAE LPK------- ----------
-             ----YHYQNI LVD-ELYSND ---YPAAPKK A--QFM-GVG DVGGYEIVCE
-             DIFQILVCD
-
-t76          LSSSHEVRVV NHKSKPDEHI ADK-D----- -------MCA DAMCNGSGHT
-             GRIHNAVEGG I--VTNFHGF ---AEMPKN- HD-VMEEQGG PGTCLAPQQS
-             ADTSWPFVMF TVDLAHRCRG --------GD MPQNTGDSMT CPHLAEGLAA
-             VNS---RAFI GVSIYDLKVS HKMI--QACN PIQN------ ---DNHAFSD
-             QRCLNDLSQG VVGASFPKMQ HGVRH----Y K---K----- ---RVYENEV
-             GGRLDDAEAI DDMGVWIRW- -EGVKHAWCH PIGSCPDHLV CSLLVLQPAR
-             NFIQLS-MVR DTPHRLPKMA SAAPVYKQTC HLEQVQGTAR MWGKSGPRVV
-             LNGHMLK-TQ NTLHRQYLVD VELQATMVFV AARMKTDSSM YMSVREILHG
-             ---------- --CGIKDEAQ ADGQR-PATL IVVLSKDNKG ITEHGAVLKK
-             IHP------- ---LCKRCME NGRCLRYKND LTGDQLVQLA D----NTCAW
-             -NLFEC--LR DSKSLFGSPL FIKVDEDRGF TAP------- SK-------V
-             EPKCAQFYSK SCTHC----- ---------- -TM------C SVGSHASEED
-             ALDLYTHKPV PDAQCFVSRV ARNIPEH-SP CK-------- ----------
-             ---------- -P---CS--- ---------- ----VEEVCY CKVCDSKDVR
-             AVKNAYQDLQ VPLSKLK-AP WLSMGHCECW EEDINNILSV VKHELVDDVD
-             RMNRLTEVAA KMAYFGPDGF HWDVELWEEN DLNCDDFELG W-NLKH----
-             ---EDDHPL- LCIGSFSVHK YVSVMVYPLP MND-CVRMSQ PCHAAHAQDI
-             PTEQ---TRY QIHTFLDDSI -RRDLCNQ-G CHEENMVWRD DLKDPISTEV
-             IADKLHEWPT NVN-KENSAD ----HRQLFH -------ANS SALDKHQHNV
-             VMN-GSPCIR ALIIGGSSVG VNHFMMGPCQ EFFTDLFMMY EGLQYACVCA
-             MNITIQCLHT GEGVMCNVKC KEFLQREDEM KAGLIGIICN HLSRMIMVIL
-             -VHCLLTHAG LKSME-IGFD R-TGVVRMPL IAEP--LYLV I-YVNAVEPY
-             TDAYKKPKSM HQFQFDDCQI RYRTNTGFEE TPVGATHLTH VCVCVPHPWT
-             KGKSEILQNM GSA-VLYNDV IRDHNASEQK E--AHV-PMG DEGRISRAKD
-             EIMYIRDLE
-
-t53          LSSSHEVRVV NHKSKPDEHI ADK-D----- -------MCA DAMCNGSGHT
-             GRIHNAVEGG I--VTNFHGF ---AEMPKN- YD-VMEEQGG PGTCLAPQQS
-             ADTSWPFVMF TVDLAHRCRG --------GD IPQNTGDSMT CPHLAEGLAA
-             VNS---RAFI GVSTYDLKVS HKMI--QACN PIQN------ ---DNHAFSD
-             QRCLNDLAQG VVGASHPKMQ HGVRH----Y K---K----- ---RVYENEV
-             GGRLDDAEAI DDMGVWIRW- -EGVKHAWCH PIGSCPDHLV CSLLVLQPAR
-             NFIQLS-MVR DTPHGLPKMA SAAPVYKQTC HLEQVQGTAR MWGKSGPRVV
-             LNGHMLK-TQ NTLHRQYLVD VELGATMVFV AARMKTDLSM YMSVREILHG
-             ---------- --CGIKDEAQ ADGQR-PATL IVVLSKDNKG ITEHGAVLKK
-             IHP------- ---LCKRCME NGRCLRYKND LAGDQLVQLA D----NTCAW
-             -NLFEC--LR DSKSLFGSPL FIKVDEDRGF TAP------- SK-------V
-             EPKCAQFYSK SCTHC----- ---------- -TM------C SVGSHASEED
-             ALDLYTHRPV PDAQCFVSRV ARNIPEH-SP CK-------- ----------
-             ---------- -P---CS--- ---------- ----VEEVCY CKVCDSKDVR
-             AVKNAYQDLQ VPLSKLK-AP WLSMGHCECW EEDINNILSV VKHELVDDVD
-             RMNRLTEVAA KMAYFGPDGF HWDVELWEEN DLNCDDFELG W-NLKP----
-             ---EDDHPL- LCIGSFSVHK YVSVMVYPLP MND-CVRMSQ PCHAAHAQDI
-             PTEQ---TRY QIHTFLDDSI -RRDLCNQ-G CHEENMVWRD DLKDPISTEV
-             IADKLHEWPT NQN-KENSAD ----HRQLFH -------ANS SALDKHQHNV
-             VMN-GSPCIR ALIIGGSSVG VNHFMMGPCQ EFFTDLFMMY EGLQYACVCA
-             MNITIQCLHT GEGVVCNVKC KEFLQREDEM KAGLIGIICN HLSRMIMVIL
-             -VHCLLTHAG LKSME-IGFD R-TGVVRMPL IAEP--LYLV I-YVNAVEPY
-             TDAYKKPKSM HQFQFDDCQI RYRTNTGFEE TPMGATHLTH VCVCVPHPWT
-             KGKSEILQNM GSA-VLYNDV IRDHNASEQK E--AHV-PMG DQGRISRAKD
-             EIMYIRDLE
-
-t16          LSSSHEVRVV NHKSKPDEHI ADK-D----- -------MCA DAMCNGSGHT
-             GRIHNAVEGG I--VTNFHGF ---AEMPKN- YD-VMEEQGG PGTCLAPQQS
-             ADTSWPFVMF TVDLAHRCRG --------GD IPQNTGDSMT CPHLAEGLAA
-             VNS---RAFI GVSTYDLKVS HKMI--QACN PIQN------ ---DNHAFSD
-             QRCLNDLAQG VVGASHPKMQ HGVRH----Y K---K----- ---RVYENEV
-             GGRLDDAEAI DDMGVWIRW- -EGVKHAWCH PIGSCPDHLV CSLLVLQPAR
-             NFIQLS-MVR DTPHGLPKMA SAAPVYKQTC HLEQVQGTAR MWGKSGPRVV
-             LNGHMLK-TQ NTLHRQYLVD VELGATMVFV AARMKTDLSM YMSVREILHG
-             ---------- --CGIKDEAQ ADGQR-PATL IVVLSKDNKG ITEHGAVLKK
-             IHP------- ---LCKRCME NGRCLRYKND LAGDQLVQLA D----NTCLW
-             -NLFEC--LR DSKSLFGSPL FIKVDEDRGF TAP------- SK-------V
-             EPKCAQFYSK SCTHC----- ---------- -TM------C SVGSHASEED
-             ALDLYTHKPV PDAQCFVSRV ARNIPEH-SP CK-------- ----------
-             ---------- -P---CS--- ---------- ----VEEVCY CKVCDSKDVR
-             AVKNAYQDLQ VPLSKLK-AP WLSMGHCECW EEDINNILSV VKHELVDDVD
-             RMNRLTEVAA KMAYFGPDGF HWDVELWEEN DLNCDDFELG W-NLKP----
-             ---EDDHPL- LCIGSFSVHK YVSVMVYPLP MND-CVRMSQ PCHAAHAQDI
-             PTEQ---TRY QIHTFLDDSI -RRDLCNQ-G CHEENMVWRD DLKDPISTEV
-             IADKLHEWPT NQN-KENSAD ----HRQLFH -------ANS SALDKHQHNV
-             VMN-GSPCIR ALIIGGSSVG VNHFMMGPCQ EFFTDLFMMY EGLQYACVCA
-             MNITIQCLHT GEGVVCNVKC KEFLQREDEM KAGLIGIICN HLSRMIMVIL
-             -VHCLLTHAG LKSME-IGFD R-TGVVRMPL IAEP--LYLV I-YVNAVEPY
-             TDAYKKPKSM HQFQFDDCQI RYRTNTGFEE TPMGATHLTH VCVCVPHPWT
-             KGKSEILQNM GSA-VLYNDV IRDYNASEQK E--AHV-PMG DQGRISRAKD
-             EIMYIRDLE
-
-t42          LSSSHEMRVV HHKSKPDEEI ADQ-D----- -------LCA EEMCKGSGHT
-             GRIHSAVEGG I--WTNFHGF ---AEMPKN- YD-VMEEQGG PGTCIAPRQS
-             ADTSWPFMVF TVDLAHRCRG --------GD TPTQAGDSMT FPHLAEGLPA
-             VNS---RAFV GVSSYDLRVS HKMI--QACT LIQN------ ---DNVAFSD
-             QRPLNDLNQG CVGTSHPKMP HGVRH----Y K---K----- ---KVYENEV
-             GDRLDDAEGI DDVGVWMRW- -NGVKHAWCH IIGSCPDHLV CSLLVLQPGR
-             NFIQLS-VVH DTPHRLPKMA SAAAVFKQTC HLEQVPGTAR MWGKSGPRVR
-             LNGHVLK-NQ NILHRQYLVD VNLGATMVFV LARMKTDASM YMSHREILHG
-             GTFDAAKPFR QICGTKDEAQ PDGRR-PATL LVVLSKDNQG ITEHGAVLKH
-             VHP------- ---LCKKDCN NNRCLRCKNV LAGNQLIQLS D----VTCAW
-             -NLFEC--LG DSESLFGSPL AIKVDEDRGF TAP------- SK-------V
-             EPKCAQFYSK SCTHH----- ---------- -MM------C SVGSNASEED
-             ALELYTHKPV PDPQCFVSIV VRNIPEH-SP CK-------- ----------
-             ---------- -P---CS--- ---------- ----VEEVAY CKNCDSKDVR
-             AVQNAYQDLA VPLSKLK-AP WLSMGHCECW EEDINNILSM VKHELVVDQD
-             MVNRSPEVAA KMAYFGPDGF HWDVELCEES DLTVDDFELG W-VLKP----
-             ---EDDHPL- ICIGSFSVHK QFSVMVYPLP MND-AIRMSQ PCHAAHAQDI
-             HTDQ---DRY DVRTFLGHSI -KCHMCNQ-A CHEENIVWRD DLKDPITTEV
-             IAEKLQEWPT NQN-KENVAD ----HRQLFH -------ANS SALDKHRHNV
-             MMN-GSACIR TLIIGGSIVG VNVFMMEPCQ EFFTDLFMVY EGLQYAVVCA
-             VNIIIQCLHT NEGVVCNVKC KEFLQREEDM KSGLIGIICN HISRMCMHIL
-             -VVCLLTHCG LKAME-IPFD I-TGVVRGPL ITEP--LYLI I-YVNAVEPY
-             TDAYKKPKSM HQFQFDDVQI RYRTNTGFEE NPKLATHLVH VCVVVPHPWT
-             KGKSEILQNM ESA-HLYNAV IRDNNASEQK E--AHV-PVG DEGRISRAKN
-             EILYIRDLE
-
-t24          QSSSHEMRVV HHKSKPDEEI TDQ-D----- -------LCA EEMCKGSGHT
-             GRIHSAVEGG I--WTNFHGF ---AEMPKN- YD-VMEEQGG PGTCVAPRQS
-             ADTNWPFMVF PVELAHRCRG --------GD TP-------- FPHLAEGLPA
-             VNS---RAFI GVSSYDLKVS HKMI--QACN PIQN------ ---DNVAFSD
-             QRVLNDLSQG CVGTSHPKMP HGVRH----Y K---K----- ---RVYENEV
-             GDRLDDAEAV DDVGVWMRW- -AGVKVAVCH VIGSCPDHLV VSLLVLQPAR
-             NFIQLS-VVH DTPHRLPKMA SAAAVFKQTC HLEQVAGTAR VWGKSGPRVK
-             LNGHVLK-NQ NVLHRQYLVD VDLGATMVFV AARMKTDASM YMSHREILHG
-             GTFDAAKPFR QICGVKDEAQ PDGQR-PATL LVVLSKDNVG ITEHGAVLKH
-             VHP------- ---LCKKDCN NNRCLRCKNV LAGNQLVQLA D----ITCAW
-             -NLFEC--LG DSESLFGSPL AIKVDEDRGF TAP------- SK-------V
-             EPKCQQFYSK SCTHC----- ---------- -VM------C SVGSNASEED
-             ALELYTHKPV PDPQCFVSIV VRNIPEH-SP CK-------- ----------
-             ---------- -P---CS--- ---------- ----VEEVCY CKNCDSKDVR
-             ATQNAYQELA IPLSKLK-AP WLSMGHCECW EEGINNILSM VKHELVVDQD
-             MVNRSPEVAA KMAYFGPDGF HWDIELCEEN DLTCDDFELG W-VLKP----
-             ---EDDHPL- ICIGSFSVHK QFSVMVYPLP MND-AIRMSQ PCYAAHAQDI
-             HTDQ---DRY DIRTFLEHSI -RCHLCNQ-A CHEENIVWRD DLKDPITTEV
-             IADKLQEWPT NQN-AENVAD ----HRQLFH -------ANS SCLDRHRHNV
-             MMN-GSSCIR TLIIGGSIVG VNVFMMGPCQ EFFTDLFMVY EGLQYAVVCA
-             INIIIQVLHT NEGVVCNVKC KEFLQREDDM KSGLIGIICN HISRMCMHIL
-             -VHCLLTHCG LKAME-IPFD R-TGVVRGPL IAEP--LYLI I-YVNAVEPY
-             TDAYKKPKSM HQFQFDDVQI RYRTNTGFEE NPKLATHLVH VCVVVPHPWT
-             KGKSEILQNM ESARHLYNAV IRDNNASHQK E--AHV-PAG DQGRISRAKN
-             EILYIRDLE
-
diff --git a/test/test_alignment_scores.cpp b/test/test_alignment_scores.cpp
deleted file mode 100644
index 56ea6c1..0000000
--- a/test/test_alignment_scores.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// File: test_alignment_scores.cpp
-// Created by: Julien Dutheil
-// Created on: Wed Dec 14 16:35 2011
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Container/VectorSiteContainer.h>
-#include <Bpp/Seq/Container/SiteContainerTools.h>
-#include <Bpp/Seq/SiteTools.h>
-#include <iostream>
-
-using namespace bpp;
-using namespace std;
-
-int main() {
-  RNA* alpha = new RNA();
-  SiteContainer* sites = new VectorSiteContainer(alpha);
-  BasicSequence seq1("seq1", "----AUGCCG---GCGU----UUU----G--G-CCGACGUGUUUU--", alpha);
-  BasicSequence seq2("seq2", "---GAAGGCG---G-GU----UUU----GC-GACCGACG--UUUU--", alpha);
-  BasicSequence seq3("seq3", "---GAA-CCG---G-GU----UUU----VC-GACCGGAG--UUUU--", alpha);
-  sites->addSequence(seq1, false);
-  sites->addSequence(seq2, false);
-  sites->addSequence(seq3, false);
-
-  //Create alignment indexes:
-  RowMatrix<size_t> index1;
-  SiteContainerTools::getSequencePositions(*sites, index1);
-
-  vector<int> scores = SiteContainerTools::getColumnScores(index1, index1);
-  VectorTools::print(scores);
-  for (size_t i = 0; i < sites->getNumberOfSites(); ++i) {
-    if (SiteTools::isGapOnly(sites->getSite(i))) {
-      if (scores[i] != 0) return 1;
-    } else {
-      if (scores[i] != 1) return 1;
-    }
-  }
-
-  SiteContainer* sites2 = new VectorSiteContainer(alpha);
-  BasicSequence seq21("seq1", "----AUGCCGGCGU-UUUG--G-CCGACGUGUUUU", alpha);
-  BasicSequence seq22("seq2", "---GAAGGCGG-GUU-UUGC-GACCGAC--GUUUU", alpha);
-  BasicSequence seq23("seq3", "---GAA-CCGG-GUUU-UVC-GACCGGA--GUUUU", alpha);
-  sites2->addSequence(seq21, false);
-  sites2->addSequence(seq22, false);
-  sites2->addSequence(seq23, false);
-
-  RowMatrix<size_t> index2;
-  SiteContainerTools::getSequencePositions(*sites2, index2);
-
-  vector<int> scores12 = SiteContainerTools::getColumnScores(index1, index2);
-  VectorTools::print(scores12);
-
-  //Just a simple test, please check output by eye for better evaluation!
-  if (scores12.size() != index1.getNumberOfColumns()) return 1;
-
-  vector<int> scores21 = SiteContainerTools::getColumnScores(index2, index1);
-  VectorTools::print(scores21);
-
-  if (scores21.size() != index2.getNumberOfColumns()) return 1;
-  
-  vector<double> sp12 = SiteContainerTools::getSumOfPairsScores(index1, index2);
-  VectorTools::print(sp12);
-
-  vector<double> sp21 = SiteContainerTools::getSumOfPairsScores(index2, index1);
-  VectorTools::print(sp21);
-
-  return 0;
-}
diff --git a/test/test_containers.cpp b/test/test_bfgs.cpp
similarity index 64%
copy from test/test_containers.cpp
copy to test/test_bfgs.cpp
index 8cdb459..9eb7bc4 100644
--- a/test/test_containers.cpp
+++ b/test/test_bfgs.cpp
@@ -1,7 +1,7 @@
 //
-// File: test_containers.cpp
+// File: test_bfgs.cpp
 // Created by: Julien Dutheil
-// Created on: Mon Nov 01 10:15 2010
+// Created on: Mon Jan 31 19:45 2011
 //
 
 /*
@@ -37,32 +37,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Container/VectorSiteContainer.h>
-#include <Bpp/Seq/Container/SiteContainerTools.h>
+#include <Bpp/Numeric/Function/BfgsMultiDimensions.h>
+#include <vector>
 #include <iostream>
+#include "PolynomialFunction.h"
 
 using namespace bpp;
 using namespace std;
 
 int main() {
-  //ProteicAlphabet* alpha = new ProteicAlphabet;
-  RNA* alpha = new RNA();
-  SiteContainer* sites = new VectorSiteContainer(alpha);
-  BasicSequence seq1("seq1", "----AUGCCG---GCGU----UUU----G--G-CCGACGUGUUUU--", alpha);
-  BasicSequence seq2("seq2", "---GAAGGCG---G-GU----UUU----GC-GACCGACG--UUUU--", alpha);
-  sites->addSequence(seq1, false);
-  sites->addSequence(seq2, false);
-
-  cout << sites->getNumberOfSites() << endl;
-  cout << sites->toString("seq1") << endl;
-  cout << sites->toString("seq2") << endl;
-  SiteContainerTools::removeGapOnlySites(*sites);
-  cout << endl;
-  
-  cout << sites->getNumberOfSites() << endl;
-  cout << sites->toString("seq1") << endl;
-  cout << sites->toString("seq2") << endl;
-
-  return (sites->getNumberOfSites() == 30 ? 0 : 1);
+  PolynomialFunction1Der1 f;
+  cout << f.getValue() << endl;
+  BfgsMultiDimensions optimizer(&f);
+  optimizer.init(f.getParameters());
+  optimizer.optimize();
+  double minf = optimizer.getFunctionValue();
+  double x = f.getParameterValue("x");
+  double y = f.getParameterValue("y");
+  double z = f.getParameterValue("z");
+  cout << "x=" << x << endl;
+  cout << "y=" << y << endl;
+  cout << "z=" << z << endl;
+  cout << "f=" << minf << endl;
+  cout << setprecision(20) << (abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3)) << endl;
+  bool test = abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3) < 0.01;
+  return (test ? 0 : 1);
 }
diff --git a/test/test_bowker.cpp b/test/test_bowker.cpp
deleted file mode 100644
index f71ef32..0000000
--- a/test/test_bowker.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// File: test_bowker.cpp
-// Created by: Julien Dutheil
-// Created on: Sat Apr 16 13:19 2009
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/AlphabetTools.h>
-#include <Bpp/Seq/SequenceTools.h>
-#include <iostream>
-
-using namespace bpp;
-using namespace std;
-
-BasicSequence* getRandomSequence(const Alphabet* alphabet, unsigned int size) {
-  string seq = "";
-  for (unsigned int i = 0; i < size; ++i)
-    seq += alphabet->intToChar(RandomTools::giveIntRandomNumberBetweenZeroAndEntry(static_cast<int>(alphabet->getSize())));
-  return new BasicSequence("random seq", seq, alphabet);
-}
-
-int test(const Alphabet* alphabet, unsigned int size, unsigned int rep) {
-  double n01 = 0;
-  double n05 = 0;
-  double n10 = 0;
-  double n50 = 0;
-
-  //ofstream out("pvalues.txt", ios::out);
-  for (unsigned int i = 0; i < rep; ++i) {
-    ApplicationTools::displayGauge(i, rep-1);
-    auto_ptr<BasicSequence> seq1(getRandomSequence(alphabet, size));
-    auto_ptr<BasicSequence> seq2(getRandomSequence(alphabet, size));
-    auto_ptr<BowkerTest> test(SequenceTools::bowkerTest(*seq1, *seq2));
-    double p = test->getPValue();
-    if (p <= 0.01) n01++;
-    if (p <= 0.05) n05++;
-    if (p <= 0.10) n10++;
-    if (p <= 0.50) n50++;
-    //out << p << endl;
-  }
-  //out.close();
-
-  cout << n01 / rep <<
-  "\t" << n05 / rep <<
-  "\t" << n10 / rep <<
-  "\t" << n50 / rep << endl;
-
-  if (abs(n01*100 / rep - 1 ) > 1) return 1;
-  if (abs(n05*100 / rep - 5 ) > 1) return 1;
-  if (abs(n10*100 / rep - 10) > 1) return 1;
-  if (abs(n50*100 / rep - 50) > 1) return 1;
-  return 0;
-}
-
-int main() {
-  //ProteicAlphabet* alpha = new ProteicAlphabet;
-  RNA* alpha = new RNA();
-  BasicSequence seq1("seq1", "----AUGCCG---GCGU----UUU----G--G-CCGACGUGUUUU--", alpha);
-  BasicSequence seq2("seq2", "---GAAGGCG---G-GU----UUU----GC-GACCGACG--UUUU--", alpha);
-  auto_ptr<BowkerTest> btest(SequenceTools::bowkerTest(seq1, seq2));
-  cout << btest->getStatistic() << "\t" << btest->getPValue() << endl;
-  delete alpha;
-
-  test(&AlphabetTools::DNA_ALPHABET, 1000, 5000);
-  test(&AlphabetTools::PROTEIN_ALPHABET, 20000, 5000);
- 
-  return 0;
-}
diff --git a/test/test_dAGraphObs.cpp b/test/test_dAGraphObs.cpp
new file mode 100644
index 0000000..34d2aed
--- /dev/null
+++ b/test/test_dAGraphObs.cpp
@@ -0,0 +1,159 @@
+//
+// File: test_dAGraphObs.cpp
+// Created by: Laurent Guéguen
+// Created on: 2016
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "../src/Bpp/Graph/DAGraph.h"
+#include "../src/Bpp/Graph/AssociationDAGraphImplObserver.h"
+
+#include <vector>
+#include <iostream>
+using namespace bpp;
+using namespace std;
+
+int main() {
+  AssociationDAGlobalGraphObserver<string,unsigned int> grObs;
+
+  shared_ptr<string> zero(new string("zero"));
+  shared_ptr<string> one(new string("one"));
+  shared_ptr<string> two(new string("two"));
+  shared_ptr<string> three(new string("three"));
+  shared_ptr<string> four(new string("four"));
+  shared_ptr<string> five(new string("five"));
+  shared_ptr<string> six(new string("six"));
+  shared_ptr<unsigned int> r3(new unsigned int(3));
+  shared_ptr<unsigned int> r1(new unsigned int(5));
+
+  cout << "Creating node zero." << endl;
+  grObs.createNode(zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Creating node one from the number zero." << endl;
+  grObs.createNode(one);
+  grObs.addFather(one,zero,r1);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Creating node two from the number one." << endl;
+  grObs.createNode(one,two);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Linking two to zero." << endl;
+  grObs.addFather(zero,two,r3);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");  
+
+
+  cout << "Linking one to three and two to four." << endl;
+  grObs.createNode(one,three);
+  grObs.createNode(two,four);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << endl;
+
+  cout << "Linking three to zero." << endl;
+  grObs.addFather(zero,three);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  // so now we have zero -> one -> two -> zero ...
+  vector<shared_ptr<string> > fromOne = grObs.getOutgoingNeighbors(zero);
+  vector<shared_ptr<string> > fromThree = grObs.getOutgoingNeighbors(two);
+  bool test = (*(fromOne.begin()) == one) && (*(fromThree.begin()) == zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Is this a DAG?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  
+  // the DAG must be considered as unvalid at this point
+  test &= !grObs.isValid();
+  
+  
+  cout << "Removing 2->0 and 3->0"<< endl;
+  grObs.removeSon(two,zero);
+  grObs.removeSon(three,zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Is this a DAG?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the DAG is valid at this point
+  test &= grObs.isValid();
+
+  cout << endl;
+  cout << "Iteration on sons  of 1:" << endl;
+  
+  unique_ptr<AssociationDAGraphObserver<string, unsigned int>::NodeIterator> in0It=grObs.sonsIterator(one);
+
+  for (;!in0It->end();in0It->next())
+    cout << ***in0It << endl;
+
+  cout << "Reroot on one" << endl;
+
+  grObs.rootAt(one);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Linking 3->2"<< endl;
+  grObs.addFather(three, two);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+
+  cout << endl;
+
+  cout << "Is this a DAG?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the DAG must be considered as valid at this point
+  test &= grObs.isValid();
+  cout << endl;
+
+  cout << "Add nodes five and six" << endl;
+  grObs.createNode(five);
+  grObs.createNode(six);
+  grObs.addFather(four,five);
+  grObs.addFather(five,six);
+  grObs.addFather(six,four);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+
+  cout << endl;
+
+  cout << "Is this a DAG?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the tree must be considered as unvalid at this point
+  test &= !grObs.isValid();
+  cout << endl;
+
+  cout << "Reroot on two" << endl;
+
+  grObs.rootAt(two);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+
+  cout << "Is this a DAG?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the tree must be considered as unvalid at this point
+  test &= grObs.isValid();
+  cout << endl;
+
+  cout << "Test " << (test? "passed":"failed") << endl;
+
+  return (test ? 0 : 1);
+}
diff --git a/test/test_derivative1.cpp b/test/test_derivative1.cpp
new file mode 100644
index 0000000..e2e7fb1
--- /dev/null
+++ b/test/test_derivative1.cpp
@@ -0,0 +1,117 @@
+//
+// File: test_derivative1.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Oct 28 12:49 2010
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Numeric/Function/TwoPointsNumericalDerivative.h>
+#include <Bpp/Numeric/Function/ThreePointsNumericalDerivative.h>
+#include <Bpp/Numeric/Function/FivePointsNumericalDerivative.h>
+#include <Bpp/Numeric/Random/RandomTools.h>
+#include <vector>
+#include <iostream>
+#include "PolynomialFunction.h"
+
+using namespace bpp;
+using namespace std;
+
+int main() {
+  PolynomialFunction1 f;
+  PolynomialFunction1Der1 f1;
+  ParameterList pl = f.getParameters();
+  TwoPointsNumericalDerivative nd2pt(&f)  ; nd2pt.setParametersToDerivate(pl.getParameterNames());
+  ThreePointsNumericalDerivative nd3pt(&f); nd3pt.setParametersToDerivate(pl.getParameterNames());
+  FivePointsNumericalDerivative nd5pt(&f) ; nd5pt.setParametersToDerivate(pl.getParameterNames());
+  
+  for (unsigned int repeat = 0; repeat < 10000; ++repeat) {
+    for (size_t i = 0; i < pl.size(); ++i) {
+      double val = RandomTools::giveRandomNumberBetweenZeroAndEntry(100) - 50;
+      pl[i].setValue(val);
+    }
+
+    nd2pt.setParameters(pl);
+    vector<double> derivativesNum2pt(pl.size());
+    for (size_t i = 0; i < pl.size(); ++i) {
+      derivativesNum2pt[i] = nd2pt.getFirstOrderDerivative(pl.getParameterNames()[i]);
+    }
+
+    nd3pt.setParameters(pl);
+    vector<double> derivativesNum3pt(pl.size());
+    for (size_t i = 0; i < pl.size(); ++i) {
+      derivativesNum3pt[i] = nd3pt.getFirstOrderDerivative(pl.getParameterNames()[i]);
+    }
+
+    nd5pt.setParameters(pl);
+    vector<double> derivativesNum5pt(pl.size());
+    for (size_t i = 0; i < pl.size(); ++i) {
+      derivativesNum5pt[i] = nd5pt.getFirstOrderDerivative(pl.getParameterNames()[i]);
+    }
+
+    vector<double> derivativesAna(pl.size());
+    f1.setParameters(pl);
+    bool test = true;
+    for (size_t i = 0; i < pl.size(); ++i) {
+      derivativesAna[i] = f1.getFirstOrderDerivative(pl.getParameterNames()[i]);
+      if (abs(derivativesAna[i] - derivativesNum2pt[i]) > std::sqrt(nd2pt.getInterval())) test = false;
+      if (abs(derivativesAna[i] - derivativesNum3pt[i]) > std::sqrt(nd2pt.getInterval())) test = false;
+      if (abs(derivativesAna[i] - derivativesNum5pt[i]) > std::sqrt(nd2pt.getInterval())) test = false;
+    }
+
+    //Test:
+    if (!test) {
+      //Failure!
+      for (size_t i = 0; i < pl.size(); ++i) {
+        cout << setprecision(20) << pl[i].getName() << "=" << pl[i].getValue() << endl;
+        cout << setprecision(20) << "Ana. Der.     =" << derivativesAna[i]    << endl;
+        cout << setprecision(20) << "Num. Der. 2pts=" << derivativesNum2pt[i] << endl;
+        cout << setprecision(20) << "Num. Der. 3pts=" << derivativesNum3pt[i] << endl;
+        cout << setprecision(20) << "Num. Der. 5pts=" << derivativesNum5pt[i] << endl;
+      }
+      return 1;
+    } else {
+      //for (unsigned int i = 0; i < pl.size(); ++i) {
+      //  cout << pl[i].getName();
+      //  cout << "\t" << pl[i].getValue();
+      //  cout << "\t" << derivativesAna[i];
+      //  cout << "\t" << derivativesNum2pt[i];
+      //  cout << "\t" << derivativesNum3pt[i];
+      //  cout << "\t" << derivativesNum5pt[i];
+      //  cout << endl;
+      //}
+    }
+  }
+  return 0;
+}
diff --git a/test/test_distributions.cpp b/test/test_distributions.cpp
new file mode 100644
index 0000000..20257b4
--- /dev/null
+++ b/test/test_distributions.cpp
@@ -0,0 +1,155 @@
+//
+// File: test_distirbutions.cpp
+// Created by: Julien Dutheil
+// Created on: Fri Jun 8 20:54 2012
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Numeric/Prob/ExponentialDiscreteDistribution.h>
+#include <Bpp/Numeric/Prob/TruncatedExponentialDiscreteDistribution.h>
+
+using namespace bpp;
+using namespace std;
+
+void testSumProbs(const DiscreteDistribution& dist) throw (Exception) {
+  cout << "Test sum of probabilities: ";
+  cout.flush();
+  double s = VectorTools::sum(dist.getProbabilities());
+  if (abs(s - 1.0) > 0.000001)
+    throw Exception("Probabilities sum to " + TextTools::toString(s));
+  cout << "ok" << endl;
+}
+
+void testEqualProbs(const DiscreteDistribution& dist) throw (Exception) {
+  cout << "Test equality of probabilities: ";
+  cout.flush();
+  for (size_t i = 1; i < dist.getNumberOfCategories(); ++i)
+    if (abs(dist.getProbability(i) - dist.getProbability(i - 1)) > 0.000001)
+      throw Exception("Probability " + TextTools::toString(i) + " and " + TextTools::toString(i - 1) + " differ.");
+  cout << "ok" << endl;
+}
+
+int main() {
+  try {
+
+    cout << "Testing Exponential distribution with lambda = 0.2:" << endl;
+    for (unsigned int i = 2; i <= 100; i += 5) {
+      cout << "Testing " << i << " classes." << endl;
+      ExponentialDiscreteDistribution expDist(i, 0.2);
+      testSumProbs(expDist);
+      testEqualProbs(expDist);
+    }
+
+    cout << "Testing Exponential distribution with lambda = 5:" << endl;
+    for (unsigned int i = 2; i <= 100;  i += 5) {
+      cout << "Testing " << i << " classes." << endl;
+      ExponentialDiscreteDistribution expDist(i, 5);
+      testSumProbs(expDist);
+      testEqualProbs(expDist);
+    }
+
+    cout << "Testing Truncated Exponential distribution with lambda = 0.2 and t = 0.1:" << endl;
+    for (unsigned int i = 2; i <= 100; i += 5) {
+      cout << "Testing " << i << " classes." << endl;
+      TruncatedExponentialDiscreteDistribution trExpDist(i, 0.2, 0.1);
+      testSumProbs(trExpDist);
+      testEqualProbs(trExpDist);
+    }
+
+    cout << "Testing Truncated Exponential distribution with lambda = 5 and t = 0.1:" << endl;
+    for (unsigned int i = 2; i <= 100; i += 5) {
+      cout << "Testing " << i << " classes." << endl;
+      TruncatedExponentialDiscreteDistribution trExpDist(i, 5, 0.1);
+      testSumProbs(trExpDist);
+      testEqualProbs(trExpDist);
+    }
+
+    cout << "Testing Truncated Exponential distribution with lambda = 0.2 and t = 4:" << endl;
+    for (unsigned int i = 2; i <= 100; i += 5) {
+      cout << "Testing " << i << " classes." << endl;
+      TruncatedExponentialDiscreteDistribution trExpDist(i, 0.2, 4);
+      testSumProbs(trExpDist);
+      testEqualProbs(trExpDist);
+    }
+
+    cout << "Testing Truncated Exponential distribution with lambda = 5 and t = 4:" << endl;
+    for (unsigned int i = 2; i <= 100; i += 5) {
+      cout << "Testing " << i << " classes." << endl;
+      TruncatedExponentialDiscreteDistribution trExpDist(i, 5, 4);
+      testSumProbs(trExpDist);
+      testEqualProbs(trExpDist);
+    }
+
+    //Now makes some more precise calculations:
+
+    cout << "Check values for exponential distribution:" << endl;
+    // x = -log(1-p)/lambda
+    ExponentialDiscreteDistribution expDist(4, 0.2);
+    cout << expDist.getLowerBound() << "\t" << "0" << endl;;
+    cout << expDist.getBound(0)     << "\t" << "1.438410" << endl;;
+    cout << expDist.getBound(1)     << "\t" << "3.465736" << endl;;
+    cout << expDist.getBound(2)     << "\t" << "6.931472" << endl;;
+    cout << expDist.getUpperBound() << "\t" << "+inf" << endl;;
+
+    if (abs(expDist.getLowerBound() - 0) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(expDist.getBound(0) - 1.438410) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(expDist.getBound(1) - 3.465736) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(expDist.getBound(2) - 6.931472) > 0.0001) throw Exception("Unvalid bound.");
+
+    cout << "Check values for truncated exponential distribution:" << endl;
+    // x = -log(1 - (1 - lambda*t) * p) / lambda
+    TruncatedExponentialDiscreteDistribution trExpDist(4, 0.2, 1);
+    cout << trExpDist.getLowerBound() << "\t" << "0" << endl;;
+    cout << trExpDist.getBound(0)     << "\t" << "0.2318813" << endl;;
+    cout << trExpDist.getBound(1)     << "\t" << "0.4750416" << endl;;
+    cout << trExpDist.getBound(2)     << "\t" << "0.7306344" << endl;;
+    cout << trExpDist.getUpperBound() << "\t" << "1" << endl;;
+
+    if (abs(trExpDist.getLowerBound() - 0) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(trExpDist.getBound(0) - 0.2318813) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(trExpDist.getBound(1) - 0.4750416) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(trExpDist.getBound(2) - 0.7306344) > 0.0001) throw Exception("Unvalid bound.");
+    if (abs(trExpDist.getUpperBound() - 1) > 0.0001) throw Exception("Unvalid bound.");
+
+
+
+
+    return 0;
+  } catch(Exception& ex) {
+    cout << "failed :(" << endl;
+    return 1;
+  }
+}
+
diff --git a/test/test_alphabets.cpp b/test/test_downhill.cpp
similarity index 67%
copy from test/test_alphabets.cpp
copy to test/test_downhill.cpp
index bf5b346..f9fa6a4 100644
--- a/test/test_alphabets.cpp
+++ b/test/test_downhill.cpp
@@ -1,7 +1,7 @@
 //
-// File: test_alphabets.cpp
+// File: test_downhill.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Wed Oct 27 18:46 2010
 //
 
 /*
@@ -37,29 +37,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
+#include <Bpp/Numeric/Function/DownhillSimplexMethod.h>
+#include <vector>
 #include <iostream>
+#include "PolynomialFunction.h"
 
 using namespace bpp;
 using namespace std;
 
 int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
-
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
-
-  return (0);
+  PolynomialFunction1 f;
+  cout << f.getValue() << endl;
+  DownhillSimplexMethod optimizer(&f);
+  optimizer.init(f.getParameters());
+  optimizer.optimize();
+  double minf = f.getValue();
+  double x = f.getParameterValue("x");
+  double y = f.getParameterValue("y");
+  double z = f.getParameterValue("z");
+  cout << "x=" << x << endl;
+  cout << "y=" << y << endl;
+  cout << "z=" << z << endl;
+  cout << "f=" << minf << endl;
+  cout << setprecision(20) << (abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3)) << endl;
+  bool test = abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3) < optimizer.getStopCondition()->getTolerance();
+  return (test ? 0 : 1);
 }
diff --git a/test/test_alphabets.cpp b/test/test_eigen.cpp
similarity index 64%
copy from test/test_alphabets.cpp
copy to test/test_eigen.cpp
index bf5b346..9883f52 100644
--- a/test/test_alphabets.cpp
+++ b/test/test_eigen.cpp
@@ -1,11 +1,11 @@
 //
-// File: test_alphabets.cpp
+// File: test_eigen.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Thu Feb 5 07:50 2009
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. Bio++Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
 for numerical calculus. This file is part of the Bio++ project.
@@ -37,29 +37,37 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
+#include <Bpp/Numeric/Matrix/Matrix.h>
+#include <Bpp/Numeric/Matrix/MatrixTools.h>
+#include <vector>
 #include <iostream>
 
 using namespace bpp;
 using namespace std;
 
 int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
-
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
-
-  return (0);
+  RowMatrix<double> m(2,2);
+  m(0,0) = 2.3;
+  m(0,1) = 1.4;
+  m(1,0) = 5.0;
+  m(1,1) = -0.9;
+  EigenValue<double> eigen(m);
+  RowMatrix<double> D  = eigen.getD();
+  const vector<double> L  = eigen.getRealEigenValues();
+  RowMatrix<double> V1 = eigen.getV();
+  RowMatrix<double> V2;
+  MatrixTools::inv(V1, V2);
+  cout << "M=" << endl;
+  MatrixTools::print(m);
+  cout << "D=" << endl;
+  MatrixTools::print(D);
+  cout << "V1=" << endl;
+  MatrixTools::print(V1);
+  cout << "V2=" << endl;
+  MatrixTools::print(V2);
+  RowMatrix<double> test;
+  MatrixTools::mult(V1, L, V2, test);
+  cout << "V1 . D . V2=" << endl;
+  MatrixTools::print(test);
+  return (test.equals(m) ? 0 : 1);
 }
diff --git a/src/Bpp/Seq/Container/SequenceContainerIterator.cpp b/test/test_gradient.cpp
similarity index 61%
rename from src/Bpp/Seq/Container/SequenceContainerIterator.cpp
rename to test/test_gradient.cpp
index 977949d..1e7d2ef 100644
--- a/src/Bpp/Seq/Container/SequenceContainerIterator.cpp
+++ b/test/test_gradient.cpp
@@ -1,14 +1,14 @@
 //
-// File: SequenceContainerIterator.cpp
+// File: test_gradient.cpp
 // Created by: Julien Dutheil
-// Created on: Tue Feb 26 14:44 2013
+// Created on: Thu Oct 28 10:28 2010
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus. This file is part of the Bio++ project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,39 +37,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "SequenceContainerIterator.h"
-
-using namespace bpp;
-
-// From the STL:
+#include <Bpp/Numeric/Function/ConjugateGradientMultiDimensions.h>
+#include <vector>
 #include <iostream>
+#include "PolynomialFunction.h"
 
+using namespace bpp;
 using namespace std;
 
-/******************************************************************************/
-	
-AbstractSequenceContainerIterator::AbstractSequenceContainerIterator(const OrderedSequenceContainer& sequences) :
-  sequences_(&sequences),
-  currentPosition_(0)
-{}
-
-/******************************************************************************/
-	
-SimpleSequenceContainerIterator::SimpleSequenceContainerIterator(const OrderedSequenceContainer& sequences):
-  AbstractSequenceContainerIterator(sequences) {}
-
-const Sequence* SimpleSequenceContainerIterator::nextSequence()
-{
-	const Sequence* s = &sequences_->getSequence(currentPosition_);
-	currentPosition_++;
-	return s;
+int main() {
+  PolynomialFunction1Der1 f;
+  cout << f.getValue() << endl;
+  ConjugateGradientMultiDimensions optimizer(&f);
+  optimizer.init(f.getParameters());
+  optimizer.optimize();
+  double minf = optimizer.getFunctionValue();
+  double x = f.getParameterValue("x");
+  double y = f.getParameterValue("y");
+  double z = f.getParameterValue("z");
+  cout << "x=" << x << endl;
+  cout << "y=" << y << endl;
+  cout << "z=" << z << endl;
+  cout << "f=" << minf << endl;
+  cout << setprecision(20) << (abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3)) << endl;
+  bool test = abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3) < optimizer.getStopCondition()->getTolerance();
+  return (test ? 0 : 1);
 }
-
-bool SimpleSequenceContainerIterator::hasMoreSequences() const
-{
-	return currentPosition_ < sequences_->getNumberOfSequences();
-}
-
-/******************************************************************************/
-
-
diff --git a/test/test_graphObs.cpp b/test/test_graphObs.cpp
new file mode 100644
index 0000000..769c4bc
--- /dev/null
+++ b/test/test_graphObs.cpp
@@ -0,0 +1,144 @@
+//
+// File: test_graphObs.cpp
+// Created by: Thomas Bigot
+// Created on: 2016
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "../src/Bpp/Graph/AssociationGraphImplObserver.h"
+#include <vector>
+#include <iostream>
+using namespace bpp;
+using namespace std;
+
+int main() {
+  AssociationGlobalGraphObserver<string,unsigned int> grObs(true);
+  shared_ptr<string> zero(new string("zero"));
+  shared_ptr<string> one(new string("one"));
+  shared_ptr<string> two(new string("two"));
+  shared_ptr<string> three(new string("three"));
+  shared_ptr<unsigned int> r3(new unsigned int(3));
+  shared_ptr<unsigned int> r2(new unsigned int(4));
+  
+  cout << "Creating node zero." << endl;
+  grObs.createNode(zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Creating node one from the number zero." << endl;
+  grObs.createNode(zero,one);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Creating node two from the number one." << endl;
+  grObs.createNode(one,two);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Linking two to zero." << endl;
+  grObs.link(two,zero,r3);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Linking one to three." << endl;
+  grObs.createNode(one,three,r2);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Linking three to zero." << endl;
+  grObs.link(three,zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  // so now we have zero -> one -> two -> zero ...
+  vector<shared_ptr<string> > fromZero = grObs.getOutgoingNeighbors(zero);
+  vector<shared_ptr<string> > fromTwo = grObs.getOutgoingNeighbors(two);
+
+  bool test = (*(fromZero.begin()) == one) && (*(fromTwo.begin()) == zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+
+
+  cout << endl;
+  cout << "Iteration on all nodes:" << endl;
+  
+  unique_ptr<AssociationGlobalGraphObserver<string, unsigned int>::NodeIterator> nIt=grObs.allNodesIterator();
+
+  for (;!nIt->end();nIt->next())
+  {
+    cout << ***nIt << endl;
+  }
+
+  cout << endl;
+  cout << "Iteration on all edges:" << endl;
+  
+  unique_ptr<AssociationGlobalGraphObserver<string, unsigned int>::EdgeIterator> eIt=grObs.allEdgesIterator();
+
+  for (;!eIt->end();eIt->next())
+  {
+    cout << ***eIt << endl;
+  }
+
+  cout << endl;
+  cout << "Iteration on outgoing nodes neighbor of 1:" << endl;
+  
+  unique_ptr<AssociationGlobalGraphObserver<string, unsigned int>::NodeIterator> on1It=grObs.outgoingNeighborNodesIterator(one);
+
+  for (;!on1It->end();on1It->next())
+  {
+    cout << ***on1It << endl;
+  }
+
+  cout << endl;
+  cout << "Iteration on incoming nodes neighbor of 0:" << endl;
+  
+  unique_ptr<AssociationGlobalGraphObserver<string, unsigned int>::NodeIterator> in0It=grObs.incomingNeighborNodesIterator(zero);
+
+  for (;!in0It->end();in0It->next())
+  {
+    cout << ***in0It << endl;
+  }
+
+  cout << endl;
+  cout << "Iteration on outgoing edges neighbor of 1:" << endl;
+  
+  unique_ptr<AssociationGlobalGraphObserver<string, unsigned int>::EdgeIterator> oe1It=grObs.outgoingEdgesIterator(one);
+
+  for (;!oe1It->end();oe1It->next())
+  {
+    cout << ***oe1It << endl;
+  }
+
+  cout << endl;
+  
+  cout << "Iteration on incoming edges neighbor of 0:" << endl;
+  
+  unique_ptr<AssociationGlobalGraphObserver<string, unsigned int>::EdgeIterator> ie0It=grObs.incomingEdgesIterator(zero);
+
+  for (;!ie0It->end();ie0It->next())
+  {
+    cout << ***ie0It << endl;
+  }
+
+    
+  return (test ? 0 : 1);
+}
diff --git a/test/test_io.cpp b/test/test_io.cpp
deleted file mode 100644
index b8feb95..0000000
--- a/test/test_io.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// File: test_io.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Nov 01 10:16 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Io/Fasta.h>
-#include <Bpp/Seq/Io/Mase.h>
-#include <Bpp/Seq/Io/Clustal.h>
-#include <Bpp/Seq/Io/Phylip.h>
-#include <iostream>
-
-using namespace bpp;
-using namespace std;
-
-int main() {
-  //This program reads a protein alignment generated using SimProt
-  //[http://www.uhnresearch.ca/labs/tillier/simprotWEB/] in various file formats
-  ProteicAlphabet* alpha = new ProteicAlphabet;
-  Fasta fasta;
-  const SiteContainer* sites1 = fasta.readAlignment("example.fasta", alpha);
-  //test number of seq
-  cout << "example.fasta contains " << sites1->getNumberOfSequences() << " sequences" << endl;
-  if (sites1->getNumberOfSequences() != 100) {
-    return 1;
-  }
-
-  Mase mase;
-  const SiteContainer* sites2 = mase.readAlignment("example.mase", alpha);
-  Clustal clustal;
-  const SiteContainer* sites3 = clustal.readAlignment("example.aln", alpha);
-  Phylip phylip(true, false);
-  const SiteContainer* sites4 = phylip.readAlignment("example.ph", alpha);
-  Phylip phylip3(true, true);
-  const SiteContainer* sites5 = phylip3.readAlignment("example.ph3", alpha);
-
-  cout << sites1->getNumberOfSequences() << "\t" << sites1->getNumberOfSites() << endl;
-  cout << sites2->getNumberOfSequences() << "\t" << sites2->getNumberOfSites() << endl;
-  cout << sites3->getNumberOfSequences() << "\t" << sites3->getNumberOfSites() << endl;
-  cout << sites4->getNumberOfSequences() << "\t" << sites4->getNumberOfSites() << endl;
-  cout << sites5->getNumberOfSequences() << "\t" << sites5->getNumberOfSites() << endl;
-  
-  //Test:
-  bool test = sites1->getNumberOfSequences() == sites2->getNumberOfSequences()
-           && sites1->getNumberOfSequences() == sites3->getNumberOfSequences()
-           && sites1->getNumberOfSequences() == sites4->getNumberOfSequences()
-           && sites1->getNumberOfSequences() == sites5->getNumberOfSequences()
-           && sites1->getNumberOfSites()     == sites2->getNumberOfSites()
-           && sites1->getNumberOfSites()     == sites3->getNumberOfSites()
-           && sites1->getNumberOfSites()     == sites4->getNumberOfSites()
-           && sites1->getNumberOfSites()     == sites5->getNumberOfSites();
-
-  delete sites1;
-  delete sites2;
-  delete sites3;
-  delete sites4;
-  delete sites5;
-
-  delete alpha;
-
-  return (test ? 0 : 1);
-}
diff --git a/test/test_alphabets.cpp b/test/test_matrices.cpp
similarity index 73%
copy from test/test_alphabets.cpp
copy to test/test_matrices.cpp
index bf5b346..d64ec91 100644
--- a/test/test_alphabets.cpp
+++ b/test/test_matrices.cpp
@@ -1,7 +1,7 @@
 //
-// File: test_alphabets.cpp
+// File: test_matrices.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Nov 2011
 //
 
 /*
@@ -37,29 +37,31 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
+#include <Bpp/Numeric/Matrix/Matrix.h>
+#include <Bpp/Numeric/Matrix/MatrixTools.h>
+#include <vector>
 #include <iostream>
 
 using namespace bpp;
 using namespace std;
 
 int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
-
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
-
-  return (0);
+  RowMatrix<double> m(2,2);
+  m(0,0) = 2.3;
+  m(0,1) = 1.4;
+  m(1,0) = 5.0;
+  m(1,1) = -0.9;
+  MatrixTools::print(m);
+  RowMatrix<double> n(2, 2);
+  MatrixTools::transpose(m, n),
+  MatrixTools::print(n);
+  RowMatrix<double> m2(2, 2);
+  MatrixTools::transpose(n, m2);
+  RowMatrix<double> o(2, 2);
+  MatrixTools::mult(m, n, o);
+  MatrixTools::print(o);
+ 
+  bool test = m.equals(m2, 0.000001);
+  ApplicationTools::displayBooleanResult("Test passed", test);
+  return (test ? 0 : 1);
 }
diff --git a/test/test_mva.cpp b/test/test_mva.cpp
new file mode 100644
index 0000000..4bd2765
--- /dev/null
+++ b/test/test_mva.cpp
@@ -0,0 +1,175 @@
+//
+// File: test_mva.cpp
+// Created by: Matheu Groussin
+// Created on: Tue Mar 22 14:54 2011
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+#include <stdlib.h>
+#include <ctime>
+#include <set>
+#include <map>
+#include <cmath>
+
+using namespace std;
+
+#include <Bpp/Numeric/Matrix/EigenValue.h>
+#include <Bpp/Numeric/Matrix/MatrixTools.h>
+#include <Bpp/Numeric/Matrix/Matrix.h>
+#include <Bpp/Numeric/Stat/Mva/DualityDiagram.h>
+#include <Bpp/Numeric/Stat/Mva/PrincipalComponentAnalysis.h>
+#include <Bpp/Numeric/Stat/Mva/CorrespondenceAnalysis.h>
+#include <Bpp/Numeric/VectorTools.h>
+
+using namespace bpp;
+
+/*This program performs some tests for the Pca, Coa and Dudi classes*/
+
+int main(int args, char ** argv)
+{
+	unsigned int nRows = 3;
+	unsigned int nCols = 3;
+	RowMatrix<double> matrix(nRows, nCols);
+	RowMatrix<double> matrix2(nRows, nCols+1);
+	RowMatrix<double> matrix3(nRows, nCols);
+	
+	matrix(0,0) = 10;
+	matrix(1,0) = 20;
+	matrix(2,0) = 30;
+	matrix(0,1) = 20;
+	matrix(1,1) = 10;
+	matrix(2,1) = 40;
+	matrix(0,2) = 30;
+	matrix(1,2) = 40;
+	matrix(2,2) = 10;
+	
+	cout << endl;
+	cout << "First test for the Pca class, with a square matrix : " << endl;
+	cout << endl;
+	cout << "Here's the input matrix : " << endl;
+	MatrixTools::print(matrix, cout);
+	
+	vector<double> rowW(nRows);
+	vector<double> colW(nCols);
+	VectorTools::fill(rowW, 1./static_cast<double>(nRows));
+	VectorTools::fill(colW, 1.);
+	
+	//The constructor with row and column weights is called
+	PrincipalComponentAnalysis* pca1 = new PrincipalComponentAnalysis(matrix, 3, rowW, colW, true, true);
+	
+	cout << "The matrix of Row Coordinates : " << endl;
+	MatrixTools::print(pca1->getRowCoordinates(),cout);
+	cout << endl;
+	cout << endl;
+	
+			
+	matrix2(0,0) = 10;
+	matrix2(1,0) = 20;
+	matrix2(2,0) = 30;
+	matrix2(0,1) = 20;
+	matrix2(1,1) = 10;
+	matrix2(2,1) = 40;
+	matrix2(0,2) = 30;
+	matrix2(1,2) = 40;
+	matrix2(2,2) = 10;
+	matrix2(0,3) = 50;
+	matrix2(1,3) = 10;
+	matrix2(2,3) = 10;
+	
+	cout << endl;
+	cout << "Second test for the Pca class, with a matrix containing more columns than rows: " << endl;
+	cout << endl;
+	cout << "Here's the input matrix : " << endl;
+	MatrixTools::print(matrix2,cout);
+	
+	//The constructor without row and column weigths is called. Default weights will be created.
+	PrincipalComponentAnalysis* pca2 = new PrincipalComponentAnalysis(matrix2, 3, true, true);
+	
+	cout << "The matrix of Principal Axes : " << endl;
+	MatrixTools::print(pca2->getPrincipalAxes(),cout);
+	cout << endl;
+	cout << endl;
+	
+	
+	matrix3(0,0) = 0.10;
+	matrix3(1,0) = 0.20;
+	matrix3(2,0) = 0.30;
+	matrix3(0,1) = 0.40;
+	matrix3(1,1) = 0.50;
+	matrix3(2,1) = 0.60;
+	matrix3(0,2) = 0.50;
+	matrix3(1,2) = 0.30;
+	matrix3(2,2) = 0.10;	
+	
+	cout << endl;
+	cout << "Test for the Coa class, with a square matrix : " << endl;
+	cout << endl;
+	cout << "Here's the input matrix : " << endl;
+	MatrixTools::print(matrix3,cout);
+	
+	//The Coa constructor is called.
+	CorrespondenceAnalysis* coa = new CorrespondenceAnalysis(matrix3, 3);
+
+	cout << "The matrix of Principal Components : " << endl;
+	MatrixTools::print(coa->getPrincipalComponents(),cout);
+	cout << endl;
+	cout << endl;
+	
+	
+	delete pca1;
+	delete pca2;
+	delete coa;
+  return 0;	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Bpp/Seq/DNAToRNA.cpp b/test/test_numconstants.cpp
similarity index 58%
rename from src/Bpp/Seq/DNAToRNA.cpp
rename to test/test_numconstants.cpp
index 411c883..916d390 100644
--- a/src/Bpp/Seq/DNAToRNA.cpp
+++ b/test/test_numconstants.cpp
@@ -1,14 +1,14 @@
 //
-// File: DNAToRNA.cpp
+// File: test_numconstants.cpp
 // Created by: Julien Dutheil
-// Created on: Sun Oct 12 14:39:29 2003
+// Created on: Wed Aug 28 20:45 2012
 //
 
 /*
 Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
-for sequences analysis.
+for numerical calculus. This file is part of the Bio++ project.
 
 This software is governed by the CeCILL  license under French law and
 abiding by the rules of distribution of free software.  You can  use, 
@@ -37,42 +37,26 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include "DNAToRNA.h"
+#include <Bpp/Numeric/NumConstants.h>
+
+#include <iostream>
+#include <limits>
 
 using namespace bpp;
 using namespace std;
 
-/******************************************************************************/
-
-int DNAToRNA::translate(int state) const throw (BadIntException)
-{
-	dna_->intToChar(state);
-	return state;
-}
-
-/******************************************************************************/
-
-string DNAToRNA::translate(const std::string& state) const throw (BadCharException)
-{
-	int i = dna_->charToInt(state);
-	return rna_->intToChar(i);
-}
-
-/******************************************************************************/
-
-int DNAToRNA::reverse(int state) const throw (BadIntException) 
-{
-	rna_->intToChar(state);
-	return state;
-}
-
-/******************************************************************************/
-
-string DNAToRNA::reverse(const std::string& state) const throw (BadCharException)
-{
-	int i = rna_->charToInt(state);
-	return dna_->intToChar(i);
+int main() {
+  cout << "Min double\t:" << numeric_limits<double>::min() << endl;
+  cout << "Max double\t:" << numeric_limits<double>::max() << endl;
+  cout << "bpp::NumConstants::INF()\t:" << NumConstants::INF() << endl;
+  cout << "bpp::NumConstants::MINF()\t:" << NumConstants::MINF() << endl;
+  cout << "bpp::NumConstants::PINF()\t:" << NumConstants::PINF() << endl;
+  cout << "bpp::NumConstants::NaNF()\t:" << NumConstants::NaN() << endl;
+  if (numeric_limits<double>::min() < NumConstants::MINF()) return 1;
+  if (numeric_limits<double>::max() > NumConstants::PINF()) return 1;
+  cout << "Compiler implements infinity\t:" << (numeric_limits<double>::has_infinity ? "yes" : "no") << endl;
+  cout << "Compiler implements quiet nan\t:" << (numeric_limits<double>::has_quiet_NaN ? "yes" : "no") << endl;
+  cout << "Compiler implements signaling nan\t:" << (numeric_limits<double>::has_signaling_NaN ? "yes" : "no") << endl;
+  return 0;
 }
 
-/******************************************************************************/
-
diff --git a/test/test_alphabets.cpp b/test/test_powell.cpp
similarity index 68%
rename from test/test_alphabets.cpp
rename to test/test_powell.cpp
index bf5b346..d649265 100644
--- a/test/test_alphabets.cpp
+++ b/test/test_powell.cpp
@@ -1,7 +1,7 @@
 //
-// File: test_alphabets.cpp
+// File: test_powell.cpp
 // Created by: Julien Dutheil
-// Created on: Sat Oct 30 17:10 2010
+// Created on: Wed Oct 27 18:46 2010
 //
 
 /*
@@ -37,29 +37,29 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Alphabet/ProteicAlphabet.h>
-#include <Bpp/Seq/Alphabet/DefaultAlphabet.h>
-#include <Bpp/Seq/Alphabet/CodonAlphabet.h>
+#include <Bpp/Numeric/Function/PowellMultiDimensions.h>
+#include <vector>
 #include <iostream>
+#include "PolynomialFunction.h"
 
 using namespace bpp;
 using namespace std;
 
 int main() {
-  //This is a very simple test that instanciate all alpahabet classes.
-  NucleicAlphabet* dna = new DNA();
-  NucleicAlphabet* rna = new RNA();
-  Alphabet* pro = new ProteicAlphabet;
-  Alphabet* def = new DefaultAlphabet;
-  Alphabet* cdn = new CodonAlphabet(rna);
-
-  delete dna;
-  delete rna;
-  delete pro;
-  delete def;
-  delete cdn;
-
-  return (0);
+  PolynomialFunction1 f;
+  cout << f.getValue() << endl;
+  PowellMultiDimensions optimizer(&f);
+  optimizer.init(f.getParameters());
+  optimizer.optimize();
+  double minf = f.getValue();
+  double x = f.getParameterValue("x");
+  double y = f.getParameterValue("y");
+  double z = f.getParameterValue("z");
+  cout << "x=" << x << endl;
+  cout << "y=" << y << endl;
+  cout << "z=" << z << endl;
+  cout << "f=" << minf << endl;
+  cout << setprecision(20) << (abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3)) << endl;
+  bool test = abs(minf) + abs(x - 5) + abs(y + 2) + abs(z - 3) < optimizer.getStopCondition()->getTolerance();
+  return (test ? 0 : 1);
 }
diff --git a/test/test_range.cpp b/test/test_range.cpp
new file mode 100644
index 0000000..5a2c4f9
--- /dev/null
+++ b/test/test_range.cpp
@@ -0,0 +1,198 @@
+//
+// File: test_range.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Nov 5 16:12 2011
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Numeric/Range.h>
+#include <Bpp/Numeric/VectorTools.h>
+#include <iostream>
+
+using namespace bpp;
+using namespace std;
+
+template<class T> void test_range(RangeCollection<T>& collection) {
+  cout << collection.toString() << endl;
+ 
+  Range<unsigned int> r(10, 13);
+  cout << "Adding " << r.toString() << endl;
+  collection.addRange(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(18, 21);
+  cout << "Adding " << r.toString() << endl;
+  collection.addRange(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(25, 23);
+  cout << "Adding " << r.toString() << endl;
+  collection.addRange(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(7, 11);
+  cout << "Adding " << r.toString() << endl;
+  collection.addRange(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(9, 24);
+  cout << "Restricting to " << r.toString() << endl;
+  collection.restrictTo(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(5, 23);
+  cout << "Restricting to " << r.toString() << endl;
+  collection.restrictTo(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(19, 24);
+  cout << "Adding " << r.toString() << endl;
+  collection.addRange(r);
+  cout << collection.toString() << endl;
+
+  r = Range<unsigned int>(0, 50);
+  cout << "Adding " << r.toString() << endl;
+  collection.addRange(r);
+  cout << collection.toString() << endl;
+}
+
+int main() {
+  
+  cout << endl << "..:: Definitions ::.." << endl;
+  Range<unsigned int> r1(3, 6);
+  Range<unsigned int> r2(10, 12);
+  Range<unsigned int> r3(0, 2);
+  Range<unsigned int> r4(0, 5);
+  Range<unsigned int> r5(4, 25);
+  Range<unsigned int> r6(4, 5);
+  Range<unsigned int> r7(1, 50);
+  Range<unsigned int> r8(1, 3);
+  Range<unsigned int> r9(6, 8);
+  cout << "r1: " << r1.toString() << endl;
+  cout << "r2: " << r2.toString() << endl;
+  cout << "r3: " << r3.toString() << endl;
+  cout << "r4: " << r4.toString() << endl;
+  cout << "r5: " << r5.toString() << endl;
+  cout << "r6: " << r6.toString() << endl;
+  cout << "r7: " << r7.toString() << endl;
+  cout << "r8: " << r8.toString() << endl;
+  cout << "r9: " << r9.toString() << endl;
+  
+  cout << endl << "..:: Overlaps ::.." << endl;
+  cout << r1.overlap(r2) << endl;
+  if (r1.overlap(r2)) return 1;
+  cout << r1.overlap(r3) << endl;
+  if (r1.overlap(r3)) return 1;
+  cout << r1.overlap(r4) << endl;
+  if (!r1.overlap(r4)) return 1;
+  cout << r1.overlap(r5) << endl;
+  if (!r1.overlap(r5)) return 1;
+  cout << r1.overlap(r6) << endl;
+  if (!r1.overlap(r6)) return 1;
+  cout << r1.overlap(r7) << endl;
+  if (!r1.overlap(r7)) return 1;
+  cout << r1.overlap(r8) << endl;
+  if (r1.overlap(r8)) return 1;
+  cout << r1.overlap(r9) << endl;
+  if (r1.overlap(r9)) return 1;
+
+  cout << endl << "..:: Contiguous ::.." << endl;
+  cout << r1.isContiguous(r2) << endl;
+  if (r1.isContiguous(r2)) return 1;
+  cout << r1.isContiguous(r3) << endl;
+  if (r1.isContiguous(r3)) return 1;
+  cout << r1.isContiguous(r4) << endl;
+  if (r1.isContiguous(r4)) return 1;
+  cout << r1.isContiguous(r5) << endl;
+  if (r1.isContiguous(r5)) return 1;
+  cout << r1.isContiguous(r6) << endl;
+  if (r1.isContiguous(r6)) return 1;
+  cout << r1.isContiguous(r7) << endl;
+  if (r1.isContiguous(r7)) return 1;
+  cout << r1.isContiguous(r8) << endl;
+  if (!r1.isContiguous(r8)) return 1;
+  cout << r1.isContiguous(r9) << endl;
+  if (!r1.isContiguous(r9)) return 1;
+
+  Range<unsigned int> r;
+
+  cout << endl << "..:: Expand ::.." << endl;
+  r = r1; r.expandWith(r2); cout << "r1 \\/ r2: " << r.toString() << endl;
+  if (r != r1) return 1;
+  r = r1; r.expandWith(r3); cout << "r1 \\/ r3: " << r.toString() << endl;
+  if (r != r1) return 1;
+  r = r1; r.expandWith(r4); cout << "r1 \\/ r4: " << r.toString() << endl;
+  if (r != Range<unsigned int>(0, 6)) return 1;
+  r = r1; r.expandWith(r5); cout << "r1 \\/ r5: "  << r.toString() << endl;
+  if (r != Range<unsigned int>(3, 25)) return 1;
+  r = r1; r.expandWith(r6); cout << "r1 \\/ r6: "  << r.toString() << endl;
+  if (r != r1) return 1;
+  r = r1; r.expandWith(r7); cout << "r1 \\/ r7: "  << r.toString() << endl;
+  if (r != r7) return 1;
+
+  cout << endl << "..:: Slice ::.." << endl;
+  r = r1; r.sliceWith(r2); cout << "r1 /\\ r2: " << r.toString() << endl;
+  if (r != Range<unsigned int>(0, 0)) return 1;
+  r = r1; r.sliceWith(r3); cout << "r1 /\\ r3: " << r.toString() << endl;
+  if (r != Range<unsigned int>(0, 0)) return 1;
+  r = r1; r.sliceWith(r4); cout << "r1 /\\ r4: " << r.toString() << endl;
+  if (r != Range<unsigned int>(3, 5)) return 1;
+  r = r1; r.sliceWith(r5); cout << "r1 /\\ r5: "  << r.toString() << endl;
+  if (r != Range<unsigned int>(4, 6)) return 1;
+  r = r1; r.sliceWith(r6); cout << "r1 /\\ r6: "  << r.toString() << endl;
+  if (r != r6) return 1;
+  r = r1; r.sliceWith(r7); cout << "r1 /\\ r7: "  << r.toString() << endl;
+  if (r != r1) return 1;
+
+  cout << endl << "..:: Operators ::.." << endl;
+  r = r1; r += 1; cout << "r1 += 1: " << r.toString() << endl;
+  if (r != Range<unsigned int>(4, 7)) return 1;
+  r = r1 + 2; cout << "r1 + 2: " << r.toString() << endl;
+  if (r != Range<unsigned int>(5, 8)) return 1;
+  r = r1; r -= 1; cout << "r1 -= 1: " << r.toString() << endl;
+  if (r != Range<unsigned int>(2, 5)) return 1;
+  r = r1 - 2; cout << "r1 - 2: " << r.toString() << endl;
+  if (r != Range<unsigned int>(1, 4)) return 1;
+
+  cout << endl << "..:: MultiRange ::.." << endl;
+  MultiRange<unsigned int> mr;
+  test_range(mr);
+
+  cout << endl << "..:: RangeSet ::.." << endl;
+  RangeSet<unsigned int> rs;
+  test_range(rs);
+
+  return 0;
+}
diff --git a/test/test_reparametrization.cpp b/test/test_reparametrization.cpp
new file mode 100644
index 0000000..c503ca8
--- /dev/null
+++ b/test/test_reparametrization.cpp
@@ -0,0 +1,98 @@
+//
+// File: test_derivative1.cpp
+// Created by: Julien Dutheil
+// Created on: Thu Oct 28 12:49 2010
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Numeric/Random/RandomTools.h>
+#include <Bpp/Numeric/Function/PowellMultiDimensions.h>
+#include <Bpp/Numeric/Function/ReparametrizationFunctionWrapper.h>
+#include <vector>
+#include <iostream>
+
+using namespace bpp;
+using namespace std;
+
+class MyFunction:
+  public virtual Function,
+  public AbstractParametrizable
+{
+  private:
+    double fval_;
+ 
+  public:
+    MyFunction() : AbstractParametrizable(""), fval_(0) {
+      //We declare parameters here:
+      addParameter_(new Parameter("x", 0, new IntervalConstraint(-1, 7, true, true), true));
+      addParameter_(new Parameter("y", 0, new IntervalConstraint(-4, 4, true, true), true));
+      fireParameterChanged(getParameters());
+    }
+ 
+    MyFunction* clone() const { return new MyFunction(*this); }
+ 
+  public:
+    void setParameters(const ParameterList& pl) 
+        throw (ParameterNotFoundException, ConstraintException, Exception)
+    {
+      matchParametersValues(pl);
+    }
+    double getValue() const throw (Exception) { return fval_; }
+ 
+    void fireParameterChanged(const ParameterList& pl) {
+      double x = getParameterValue("x");
+      double y = getParameterValue("y");
+      fval_ = cos(x) + sin(y);
+    }
+};
+
+int main() {
+  MyFunction f;
+  ReparametrizationFunctionWrapper fw(&f);
+  ParameterList pl = fw.getParameters();
+  PowellMultiDimensions optimizer(&fw);
+  optimizer.init(pl);
+  optimizer.optimize();
+  double minf = f.getValue();
+  double x = f.getParameterValue("x");
+  double y = f.getParameterValue("y");
+  cout << "x=" << x << endl;
+  cout << "y=" << y << endl;
+  cout << "f=" << minf << endl;
+
+  cout << setprecision(20) << (abs(x - 3.141593) + abs(y + 1.570796)) << endl;
+  bool test = (abs(x - 3.141593) + abs(y + 1.570796)) < optimizer.getStopCondition()->getTolerance();
+  return (test ? 0 : 1);
+}
diff --git a/test/test_sample.cpp b/test/test_sample.cpp
new file mode 100644
index 0000000..e09dfb1
--- /dev/null
+++ b/test/test_sample.cpp
@@ -0,0 +1,131 @@
+//
+// File: test_sample.cpp
+// Created by: Julien Dutheil
+// Created on: Wed Sep 28 14:36 2011
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Numeric/VectorTools.h>
+#include <Bpp/Numeric/Random/RandomTools.h>
+#include <vector>
+#include <string>
+#include <iostream>
+#include <cmath>
+
+using namespace bpp;
+using namespace std;
+
+int main() {
+  //Create vector:
+  vector<string> pop;
+  pop.push_back("A");
+  pop.push_back("B");
+  pop.push_back("C");
+  pop.push_back("D");
+  pop.push_back("E");
+  unsigned int n = 10000;
+
+  cout << "-*- Check without replacement -*-" << endl;
+  for (unsigned int k = 1; k < 5; ++k) {
+    map<string, unsigned int> counts;
+    for (unsigned int i = 0; i < n; ++i) {
+      vector<string> sample(k);
+      RandomTools::getSample(pop, sample, false);
+      for (size_t j = 0; j < sample.size(); ++j) {
+        counts[sample[j]]++;
+      }
+    }
+    for (map<string, unsigned int>::iterator it = counts.begin(); it != counts.end(); ++it) {
+      double fobs = static_cast<double>(it->second) / static_cast<double>(n);
+      double fexp = static_cast<double>(k) / 5.;
+      cout << it->first << "\t" << it->second << "\t" << fobs << "\t" << fexp << endl;
+      if (abs(fobs - fexp) > 0.1)
+        return 1;
+    }
+    cout << "---------------------------------------" << endl;
+  }
+
+  cout << "-*- Check with replacement -*-" << endl;
+  for (unsigned int k = 1; k < 5; ++k) {
+    map<string, unsigned int> counts;
+    for (unsigned int i = 0; i < n; ++i) {
+      vector<string> sample(k);
+      RandomTools::getSample(pop, sample, true);
+      for (size_t j = 0; j < sample.size(); ++j) {
+        counts[sample[j]]++;
+      }
+    }
+    for (map<string, unsigned int>::iterator it = counts.begin(); it != counts.end(); ++it) {
+      double fobs = static_cast<double>(it->second) / static_cast<double>(n);
+      double fexp = static_cast<double>(k) / 5.;
+      cout << it->first << "\t" << it->second << "\t" << fobs << "\t" << fexp << endl;
+      if (abs(fobs - fexp) > 0.1)
+        return 1;
+    }
+    cout << "---------------------------------------" << endl;
+  }
+
+  cout << "-*- Check with replacement and weights -*-" << endl;
+  vector<double> weights;
+  weights.push_back(2);
+  weights.push_back(3);
+  weights.push_back(8);
+  weights.push_back(2);
+  weights.push_back(1);
+  double sumw = VectorTools::sum(weights);
+  vector<double> fexp = weights / sumw;
+  for (unsigned int k = 1; k < 5; ++k) {
+    map<string, unsigned int> counts;
+    for (unsigned int i = 0; i < n; ++i) {
+      vector<string> sample(k);
+      RandomTools::getSample(pop, weights, sample, true);
+      for (size_t j = 0; j < sample.size(); ++j) {
+        counts[sample[j]]++;
+      }
+    }
+    for (size_t i = 0; i < pop.size(); ++i) {
+      double fobs = static_cast<double>(counts[pop[i]]) / static_cast<double>(n*k);
+      cout << pop[i] << "\t" << counts[pop[i]] << "\t" << fobs << "\t" << fexp[i] << endl;
+      if (abs(fobs - fexp[i]) > 0.1)
+        return 1;
+    }
+    cout << "---------------------------------------" << endl;
+  }
+
+
+
+  return 0;
+}
+
diff --git a/test/test_sequences.cpp b/test/test_sequences.cpp
deleted file mode 100644
index 15811d4..0000000
--- a/test/test_sequences.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-// File: test_sequences.cpp
-// Created by: Julien Dutheil
-// Created on: Mon Dec 130 17:10 2010
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include <Bpp/Seq/Alphabet/DNA.h>
-#include <Bpp/Seq/Alphabet/AlphabetTools.h>
-#include <Bpp/Seq/SequenceTools.h>
-#include <iostream>
-
-using namespace bpp;
-using namespace std;
-
-int main() {
-  BasicSequence seq1("test DNA", "ATTTCG---TCGTT-AAAGCWCATGCATCGATC", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif1("motif", "ATTT", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif2("motif", "TCG", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif3("motif", "GATC", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif4("motif", "CGTC", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif5("motif", "CWCAT", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif6("motif", "CTCAT", &AlphabetTools::DNA_ALPHABET);
-  BasicSequence motif7("motif", "AAGCA", &AlphabetTools::DNA_ALPHABET);
-  size_t pos;
-
-  cout << "--- Strict match ---" << endl;
-
-  pos = SequenceTools::findFirstOf(seq1, motif1);
-  if (pos != 0) return 1;
-  cout << motif1.toString() << ": " << pos << endl;
-  
-  pos = SequenceTools::findFirstOf(seq1, motif2);
-  if (pos != 3) return 1;
-  cout << motif2.toString() << ": " << pos << endl;
-
-  pos = SequenceTools::findFirstOf(seq1, motif3);
-  if (pos != 29) return 1;
-  cout << motif3.toString() << ": " << pos << endl;
-
-  pos = SequenceTools::findFirstOf(seq1, motif4);
-  if (pos != 33) return 1;
-  cout << motif4.toString() << ": " << pos << endl;
-
-  pos = SequenceTools::findFirstOf(seq1, motif5);
-  if (pos != 19) return 1;
-  cout << motif5.toString() << ": " << pos << endl;
-
-  cout << "--- Degenerated match ---" << endl;
-
-  pos = SequenceTools::findFirstOf(seq1, motif6, false);
-  if (pos != 19) return 1;
-  cout << motif6.toString() << ": " << pos << endl;
-
-  pos = SequenceTools::findFirstOf(seq1, motif7, false);
-  if (pos != 16) return 1;
-  cout << motif7.toString() << ": " << pos << endl;
-
-  return (0);
-}
diff --git a/test/test_simplex.cpp b/test/test_simplex.cpp
new file mode 100644
index 0000000..6c82e30
--- /dev/null
+++ b/test/test_simplex.cpp
@@ -0,0 +1,117 @@
+//
+// File: test_simplex.cpp
+// Created by: Laurent Guéguen
+// Created on: vendredi 5 juillet 2013, à 11h 08
+//
+
+/*
+   Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+   This software is a computer program whose purpose is to provide classes
+   for numerical calculus. This file is part of the Bio++ project.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+ */
+
+#include <Bpp/Numeric/Prob/Simplex.h>
+#include <Bpp/Text/TextTools.h>
+
+#include <iostream>
+#include <limits>
+
+using namespace bpp;
+using namespace std;
+
+int main()
+{
+  try
+  {
+    vector<double> prob;
+    prob.push_back(0.1);
+    prob.push_back(0.2);
+    prob.push_back(0.3);
+    prob.push_back(0.15);
+    prob.push_back(0.1);
+    prob.push_back(0.05);
+    prob.push_back(0.1);
+
+    vector<Simplex*> vpsi;
+    vpsi.push_back(new Simplex(prob, 1));
+    vpsi.push_back(new Simplex(prob, 2));
+    vpsi.push_back(new Simplex(prob, 3));
+
+    for (size_t i = 0; i < 3; i++)
+    {
+      cout << "Method " << i + 1 << endl;
+      for (size_t j = 0; j < prob.size() - 1; j++)
+      {
+        cout << vpsi[i]->getParameterValue("theta" + TextTools::toString(j + 1)) << "\t";
+      }
+      cout << endl;
+    }
+
+
+    cout << "Prob:";
+    for (size_t j = 0; j < prob.size(); j++)
+    {
+      cout << prob[j] << "\t";
+    }
+    cout << endl;
+    for (size_t i = 0; i < 3; i++)
+    {
+      for (size_t j = 0; j < prob.size() - 1; j++)
+      {
+        vpsi[i]->setParameterValue("theta" + TextTools::toString(j + 1),
+                                   vpsi[i]->getParameterValue("theta" + TextTools::toString(j + 1)) + 0.1);
+      }
+      for (size_t j = 0; j < prob.size() - 1; j++)
+      {
+        vpsi[i]->setParameterValue("theta" + TextTools::toString(j + 1),
+                                   vpsi[i]->getParameterValue("theta" + TextTools::toString(j + 1)) - 0.1);
+      }
+      cout << "Method " << i + 1 << endl;
+      cout << "prob\t";
+      for (size_t j = 0; j < prob.size(); j++)
+      {
+        cout << vpsi[i]->prob(j) << "\t";
+      }
+      cout << endl;
+    }
+
+    for (size_t i = 0; i < 3; i++)
+    {
+      delete vpsi[i];
+    }
+    return 0;
+  }
+  catch (Exception& ex)
+  {
+    cout << "failed :(" << endl;
+    return 1;
+  }
+}
+
diff --git a/test/test_containers.cpp b/test/test_stats.cpp
similarity index 54%
rename from test/test_containers.cpp
rename to test/test_stats.cpp
index 8cdb459..58a5442 100644
--- a/test/test_containers.cpp
+++ b/test/test_stats.cpp
@@ -1,11 +1,11 @@
 //
-// File: test_containers.cpp
+// File: test_stats.cpp
 // Created by: Julien Dutheil
-// Created on: Mon Nov 01 10:15 2010
+// Created on: Thu Dec 9 15:38 2010
 //
 
 /*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+Copyright or © or Copr. Bio++Development Team, (November 17, 2004)
 
 This software is a computer program whose purpose is to provide classes
 for numerical calculus. This file is part of the Bio++ project.
@@ -37,32 +37,51 @@ The fact that you are presently reading this means that you have had
 knowledge of the CeCILL license and that you accept its terms.
 */
 
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Container/VectorSiteContainer.h>
-#include <Bpp/Seq/Container/SiteContainerTools.h>
+#include <Bpp/Numeric/Stat/ContingencyTableTest.h>
+#include <Bpp/Numeric/VectorTools.h>
+#include <Bpp/Numeric/Random/ContingencyTableGenerator.h>
+#include <Bpp/Numeric/Random/RandomTools.h>
+#include <Bpp/Numeric/Matrix/MatrixTools.h>
+#include <vector>
 #include <iostream>
+#include <cmath>
 
 using namespace bpp;
 using namespace std;
 
+//tbl<-rbind(c(6,12,16,20),c(9,34,28,12))
+//chisq.test(tbl);
 int main() {
-  //ProteicAlphabet* alpha = new ProteicAlphabet;
-  RNA* alpha = new RNA();
-  SiteContainer* sites = new VectorSiteContainer(alpha);
-  BasicSequence seq1("seq1", "----AUGCCG---GCGU----UUU----G--G-CCGACGUGUUUU--", alpha);
-  BasicSequence seq2("seq2", "---GAAGGCG---G-GU----UUU----GC-GACCGACG--UUUU--", alpha);
-  sites->addSequence(seq1, false);
-  sites->addSequence(seq2, false);
+  vector< vector<size_t> > table;
+  vector<size_t> row1;
+  row1.push_back(6);
+  row1.push_back(12);
+  row1.push_back(16);
+  row1.push_back(20);
+  table.push_back(row1);
+  vector<size_t> row2;
+  row2.push_back(9);
+  row2.push_back(34);
+  row2.push_back(28);
+  row2.push_back(12);
+  table.push_back(row2);
+  ContingencyTableTest test(table);
+  VectorTools::print(test.getMarginRows());
+  VectorTools::print(test.getMarginColumns());
+  ContingencyTableGenerator ctRand(test.getMarginRows(), test.getMarginColumns());
+  RowMatrix<size_t> rtable = ctRand.rcont2();
+  MatrixTools::print(rtable);
 
-  cout << sites->getNumberOfSites() << endl;
-  cout << sites->toString("seq1") << endl;
-  cout << sites->toString("seq2") << endl;
-  SiteContainerTools::removeGapOnlySites(*sites);
-  cout << endl;
-  
-  cout << sites->getNumberOfSites() << endl;
-  cout << sites->toString("seq1") << endl;
-  cout << sites->toString("seq2") << endl;
+  cout << test.getStatistic() << " \t" << test.getPValue() << endl;
+  if (abs(test.getPValue() - 0.01324) > 0.0001)
+    return 1;
 
-  return (sites->getNumberOfSites() == 30 ? 0 : 1);
+  //Now test permutations:
+  ContingencyTableTest test2(table, 20000);
+  cout << test2.getStatistic() << " \t" << test2.getPValue() << endl;
+  if (abs(test2.getPValue() - 0.01324) > 0.01)
+    return 1;
+
+  return 0;
 }
+
diff --git a/test/test_text_tools.cpp b/test/test_text_tools.cpp
new file mode 100644
index 0000000..c466711
--- /dev/null
+++ b/test/test_text_tools.cpp
@@ -0,0 +1,112 @@
+//
+// File: test_text_tools.cpp
+// Created by: Julien Dutheil
+// Created on: Mon Nov 5 16:12 2011
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include <Bpp/Text/TextTools.h>
+#include <Bpp/Text/StringTokenizer.h>
+#include <iostream>
+
+using namespace bpp;
+using namespace std;
+
+int main()
+{
+  cout << "Testing string conversion..." << endl;
+  if ( TextTools::isDecimalNumber("aazz")) { cout << "aazz is not a decimal number!" << endl; return 1; }
+  if ( TextTools::isDecimalNumber("-aazz")) { cout << "-aazz is not a decimal number!" << endl; return 1; }
+  if ( TextTools::isDecimalNumber("-3.45z")) { cout << "-3.45z is not a decimal number!" << endl; return 1; }
+  if (!TextTools::isDecimalNumber("0")) { cout << "0 is a decimal number!" << endl; return 1; }
+  if (!TextTools::isDecimalNumber("123")) { cout << "123 is a decimal number!" << endl; return 1; }
+  if (!TextTools::isDecimalNumber("-123")) { cout << "-123 is a decimal number!" << endl; return 1; }
+  if (!TextTools::isDecimalNumber("-123.456")) { cout << "-123.456 is a decimal number!" << endl; return 1; }
+  if (!TextTools::isDecimalInteger("123456")) { cout << "123456 is a decimal integer!" << endl; return 1; }
+  if (!TextTools::isDecimalInteger("-7890")) { cout << "-7890 is a decimal integer!" << endl; return 1; }
+  if (!TextTools::isDecimalNumber("-123.456e-5")) { cout << "-123.456e-5 is a decimal number!" << endl; return 1; }
+  if ( TextTools::isDecimalNumber("-123.456e-5.8")) { cout << "-123.456e-5.8 is not a decimal number!" << endl; return 1; }
+  if (!TextTools::isDecimalInteger("-123e6")) { cout << "-123e6 is a decimal integer!" << endl; return 1; }
+  if ( TextTools::isDecimalInteger("-123.456e5")) { cout << "-123.456e5 is not a decimal integer!" << endl; return 1; }
+  if ( TextTools::isDecimalInteger("-123e-6")) { cout << "-123e-6 is not a decimal integer!" << endl; return 1; }
+
+  cout << "Testing string tokenizer..." << endl;
+  string t;
+  StringTokenizer st1(" aaazzer  aeerd a    eer", " \t", false, false);
+  if (st1.numberOfRemainingTokens() != 4) return 1;
+  cout << (t = st1.nextToken()) << endl;
+  if (t != "aaazzer") return 1;
+  cout << (t = st1.nextToken()) << endl;
+  if (t != "aeerd") return 1;
+  cout << (t = st1.nextToken()) << endl;
+  if (t != "a") return 1;
+  cout << (t = st1.nextToken()) << endl;
+  if (t != "eer") return 1;
+
+  StringTokenizer st2(" aaazzer  aeerd a    eer", " \t", false, true);
+  if (st2.numberOfRemainingTokens() != 8) return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "aaazzer") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "aeerd") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "a") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "") return 1;
+  cout << (t = st2.nextToken()) << endl;
+  if (t != "eer") return 1;
+ 
+  StringTokenizer st3(" aaazzer  aeerd a    eer", " \t", true, false);
+  if (st3.numberOfRemainingTokens() != 1) return 1;
+  cout << (t = st3.nextToken()) << endl;
+  if (t != " aaazzer  aeerd a    eer") return 1;
+
+  StringTokenizer st4(" aaazzer  aeerd a    eer", " \t", false, false);
+  cout << st4.nextToken() << "+";
+  cout << st4.unparseRemainingTokens() << endl;
+  cout << st4.nextToken() << "+";
+  cout << st4.unparseRemainingTokens() << endl;
+  cout << st4.nextToken() << "+";
+  cout << st4.unparseRemainingTokens() << endl;
+  cout << st4.nextToken() << "+";
+  cout << st4.unparseRemainingTokens() << endl;
+  return 0;
+}
diff --git a/test/test_treeGraphObs.cpp b/test/test_treeGraphObs.cpp
new file mode 100644
index 0000000..04238a3
--- /dev/null
+++ b/test/test_treeGraphObs.cpp
@@ -0,0 +1,178 @@
+//
+// File: test_treeGraphObs.cpp
+// Created by: Thomas Bigot
+// Created on: 2016
+//
+
+/*
+Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
+
+This software is a computer program whose purpose is to provide classes
+for numerical calculus. This file is part of the Bio++ project.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+*/
+
+#include "../src/Bpp/Graph/TreeGraph.h"
+#include "../src/Bpp/Graph/AssociationTreeGraphImplObserver.h"
+
+
+#include <vector>
+#include <iostream>
+using namespace bpp;
+using namespace std;
+
+int main() {
+  AssociationTreeGlobalGraphObserver<string,unsigned int> grObs(true);
+  
+  shared_ptr<string> zero(new string("zero"));
+  shared_ptr<string> one(new string("one"));
+  shared_ptr<string> two(new string("two"));
+  shared_ptr<string> three(new string("three"));
+  shared_ptr<string> four(new string("four"));
+  shared_ptr<string> five(new string("five"));
+  shared_ptr<unsigned int> r3(new unsigned int(3));
+  shared_ptr<unsigned int> r1(new unsigned int(5));
+  shared_ptr<unsigned int> r2(new unsigned int(10));
+
+  cout << "Creating node zero." << endl;
+  grObs.createNode(zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Creating node one from the number zero." << endl;
+  grObs.createNode(one);
+  grObs.link(zero,one,r2);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "The father branch of zero is " << *(grObs.getEdgeToFather(one)) << endl;
+  cout << "The father node of one is " << *(grObs.getFather(one)) << endl;
+  
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  
+  cout << "Creating node two from the number one." << endl;
+  grObs.createNode(one,two);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Linking two to zero." << endl;
+  grObs.link(two,zero,r3);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");  
+  cout << "Linking one to three and two to four." << endl;
+  grObs.createNode(one,three);
+  grObs.createNode(two,four,r1);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Linking three to zero." << endl;
+  grObs.link(three,zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+
+  vector<shared_ptr<string> > fromOne = grObs.getOutgoingNeighbors(zero);
+  vector<shared_ptr<string> > fromThree = grObs.getOutgoingNeighbors(two);
+  bool test = (*(fromOne.begin()) == one) && (*(fromThree.begin()) == zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+ 
+  cout << "Is this a tree?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  
+  // the tree must be considered as unvalid at this point
+  test &= !grObs.isValid();
+  
+  cout << "Removing 2->0 and 3->0"<< endl;
+  grObs.unlink(two,zero);
+  grObs.unlink(three,zero);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Is this a tree?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the tree is valid at this point
+  test &= grObs.isValid();
+
+  cout << endl;
+  cout << "Iteration on sons  of 1:" << endl;
+  
+  unique_ptr<AssociationTreeGraphObserver<string, unsigned int>::NodeIterator> in0It=grObs.sonsIterator(one);
+
+  for (;!in0It->end();in0It->next())
+  {
+    cout << ***in0It << endl;
+  }
+
+  cout << endl;
+  cout << " Outgoing edges  of 2:" << endl;
+ 
+  vector<shared_ptr<unsigned int> > ve=grObs.getBranches(two);
+  for (size_t i=0; i<ve.size();i++)
+    cout << *ve[i] << endl;
+
+  cout << endl;
+  
+  cout << "Iteration on outgoing edges  of 2:" << endl;
+  unique_ptr<AssociationTreeGraphObserver<string, unsigned int>::EdgeIterator> oe1It=grObs.branchesIterator(two);
+
+  for (;!oe1It->end();oe1It->next())
+  {
+    cout << ***oe1It << endl;
+  }
+
+  cout << endl ;
+
+  // add another root
+
+  cout << "Add another root " << endl;
+  
+  grObs.createNode(five);
+  grObs.link(five,two);
+
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Is this a tree?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the tree is not valid at this point
+  test &= !grObs.isValid();
+
+  cout << "Reroot on one" << endl;
+
+  try {
+    grObs.rootAt(one);
+  }
+  catch(Exception& e)
+  {
+    cout << "First undirect the tree." << endl;
+    grObs.getGraph()->makeUndirected();
+    grObs.getGraph()->outputToDot(std::cout,"undirected");
+    cout << "Then root." << endl;
+    grObs.rootAt(one);
+  }
+
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  
+  cout << "Linking 3->2"<< endl;
+  grObs.link(three, two);
+  grObs.getGraph()->outputToDot(std::cout,"myTestDirGrObs");
+  cout << "Is this a tree?\n    " << (grObs.isValid()? "TRUE":"FALSE") << endl;
+  // the tree must be considered as unvalid at this point
+  test &= !grObs.isValid();
+  
+  cout << "Test " << (test? "passed":"failed") << endl;
+
+  return (test ? 0 : 1);
+}
diff --git a/test/test_walker.cpp b/test/test_walker.cpp
deleted file mode 100644
index 06fe0d4..0000000
--- a/test/test_walker.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// File: test_walker.cpp
-// Created by: Julien Dutheil
-// Created on: Thu Nov 24 14:42 2011
-//
-
-/*
-Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
-
-This software is a computer program whose purpose is to provide classes
-for numerical calculus. This file is part of the Bio++ project.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-*/
-
-#include <Bpp/App/ApplicationTools.h>
-#include <Bpp/Seq/Alphabet/RNA.h>
-#include <Bpp/Seq/Sequence.h>
-#include <Bpp/Seq/SequenceWalker.h>
-#include <Bpp/Numeric/Random/RandomTools.h>
-#include <iostream>
-
-using namespace bpp;
-using namespace std;
-
-bool testSeq(SequenceWalker& walker, unsigned int pos, unsigned int truth) {
-  cout << 0 << endl;
-  cout << walker.getSequencePosition(0) << endl;
-  cout << 46 << endl;
-  cout << walker.getSequencePosition(46) << endl;;
-  for (unsigned int i = 0; i < 1000; ++i) {
-    ApplicationTools::displayGauge(i, 999, '=');
-    size_t r = RandomTools::giveIntRandomNumberBetweenZeroAndEntry<size_t>(47);
-    size_t x = walker.getSequencePosition(r);
-    if (walker.getSequencePosition(pos) != truth) {
-      cout << endl;
-      cerr << r << "\t" << x << endl;
-      cerr << walker.getSequencePosition(pos) << "<>" << truth << endl;
-      return false;
-    }
-  }
-  cout << endl;
-  return true;
-}
-
-bool testAln(SequenceWalker& walker, unsigned int pos, unsigned int truth) {
-  cout << 0 << endl;
-  cout << walker.getAlignmentPosition(0) << endl;
-  cout << 26 << endl;
-  cout << walker.getAlignmentPosition(26) << endl;
-  for (unsigned int i = 0; i < 1000; ++i) {
-    ApplicationTools::displayGauge(i, 999, '=');
-    size_t r = RandomTools::giveIntRandomNumberBetweenZeroAndEntry<size_t>(27);
-    walker.getAlignmentPosition(r);
-    if (walker.getAlignmentPosition(pos) != truth) {
-      cout << endl;
-      cerr << walker.getSequencePosition(pos) << "<>" << truth << endl;
-      return false;
-    }
-  }
-  cout << endl;
-  return true;
-}
-
-int main() {
-  RNA* alpha = new RNA();
-  BasicSequence seq1("seq1", "----AUGCCG---GCGU----UUU----G--G-CCGACGUGUUUU--", alpha);
-  SequenceWalker walker(seq1);
-
-  for (unsigned int i = 0; i < 27; ++i) {
-    size_t j = walker.getAlignmentPosition(i);
-    cout << i << "\t" << seq1.getChar(j) << "\t" << j << endl;
-  }
-
-  cout << endl;
-
-  if (!testAln(walker, 5, 9)) return 1;
-  if (!testAln(walker, 10, 21)) return 1;
-  if (!testAln(walker, 22, 40)) return 1;
-
-  cout << "_________________________________________________" << endl;
-
-  for (unsigned int i = 0; i < seq1.size(); ++i) {
-    cout << i << "\t" << seq1.getChar(i) << "\t" << walker.getSequencePosition(i) << endl;
-  }
-
- 
-  cout << endl;
- 
-  if (!testSeq(walker, 9, 5)) return 1;
-  if (!testSeq(walker, 21, 10)) return 1;
-  if (!testSeq(walker, 40, 22)) return 1;
-
-  return 0;
-}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/libbpp-seq.git



More information about the debian-med-commit mailing list