/*!
* @class Seed
*
* @headerfile <seqan/seeds.h>
*
* @brief Stores the start and end positions in the horizonal and vertical
* dimension.
*
* @signature template <typename TSpec[, typename TConfig]> class Seed;
*
* @tparam TSpec The seed specialization type.
* @tparam TConfig The configuration object to use for this seed, defaults to
* @link DefaultSeedConfig @endlink.
*
* @section Examples
*
* The following example shows the usage of three seed extension algorithms
* using the tags <tt>MaxExtend</tt>, <tt>UnGappedXDrop</tt>, and
* <tt>GappedXDrop</tt>.
*
* @include demos/seeds/seeds_extension.cpp
*
* The output is as follows:
*
* @include demos/seeds/seeds_extension.cpp.stdout
*
* Here is an example for global seed chaining:
*
* @include demos/seeds/seeds_chaining.cpp
*
*
*
* @mfn Seed#Position
*
* @brief The position type of a Seed.
*
* @signature Position<TSeed>::Type;
*
* @tparam TSeed The Seed type to query.
*
* @return Type The position type of <tt>TSeed</tt>.
*
* @mfn Seed#Size
*
* @brief The size type of a Seed.
*
* @signature Size<TSeed>::Type;
*
* @tparam TSeed The Seed to query for its size type.
*
* @return Type The size type of <tt>TSeed</tt>.
*
* @mfn Seed#Diagonal
*
* @brief The diagonal type of a Seed.
*
* @signature Diagonal<TSeed>::Type;
*
* @tparam TSeed The Seed to query for its diagonal type.
*
* @return Type The diagonal type of <tt>TSeed</tt>.
*
* @mfn Seed#SeedScore
*
* @brief The seed score type of a Seed.
*
* @signature SeedScore<TSeed>::Type;
*
* @tparam TSeed The Seed to query for its seed score type.
*
* @return Type The score type of <tt>TSeed</tt>.
*
* @fn Seed#beginPositionH
*
* @brief Returns the begin position of the seed in the database (horizontal
* direction).
*
* @signature TPosition beginPositionH(seed);
*
* @param[in] seed The seed to query.
*
* @return TPosition The horizontal begin position of type @link Seed#Position
* @endlink.
*
* @fn Seed#endPositionH
*
* @brief Returns the end position of the seed in the database (horizontal
* direction).
*
* @signature TPosition endPositionH(seed);
*
* @param[in] seed The seed to query.
*
* @return TPosition The horizontal end position of type @link Seed#Position
* @endlink.
*
* @fn Seed#setBeginPositionH
*
* @brief Sets the begin position of the seed in the database (horizontal
* direction).
*
* @signature void setBeginPositionH(seed, pos);
*
* @param[in,out] seed The Seed to set the horizontal begin position for.
* @param[in] pos The value to set for the horizontal begin position.
*
* @fn Seed#setEndPositionH
*
* @brief Sets the end position of the seed in the database (horizontal
* direction).
*
* @signature void setEndPositionH(seed, pos);
*
* @param[in,out] seed The Seed to set the horizontal end position for.
* @param[in] pos The value to set for the horizontal end position.
*
* @fn Seed#beginPositionV
*
* @brief Returns the begin position of the seed in the query (vertical
* direction).
*
* @signature TPosition beginPositionV(seed);
*
* @param[in] seed The seed to query.
*
* @return TPosition The vertical begin position of type @link Seed#Position
* @endlink.
*
* @fn Seed#endPositionV
*
* @brief Returns the end position of the seed in the query (vertical
* direction).
*
* @signature TPosition endPositionV(seed);
*
* @param[in] seed The seed to query.
*
* @return TPosition The vertical end position of type @link Seed#Position
* @endlink.
*
* @fn Seed#setBeginPositionV
*
* @brief Sets the begin position of the seed in the query (vertical direction).
*
* @signature void setBeginPositionV(seed, pos);
*
* @param[in,out] seed The Seed to set the vertical begin position for.
* @param[in] pos The value to set for the vertical begin position.
*
* @fn Seed#setEndPositionV
*
* @brief Sets the end position of the seed in the query (vertical direction).
*
* @signature void setEndPositionV(seed, pos);
*
* @param[in,out] seed The Seed to set the vertical end position for.
* @param[in] pos The value to set for the vertical end position.
*
* @fn Seed#lowerDiagonal
*
* @brief Returns the leftmost diagonal of the seed (minimum diagonal value).
*
* @signature TDiagonal lowerDiagonal(seed);
*
* @param[in] seed The seed to query for its lower diagonal.
*
* @return TDiagonal The lower diagonal value of type @link Seed#Diagonal
* @endlink.
*
* @fn Seed#setLowerDiagonal
*
* @brief Sets a new value for the leftmost diagonal of a seed.
*
* @signature void setLowerDigonal(seed, diag);
*
* @param[in,out] seed The Seed to set the diagonal value for.
* @param[in] diag The value to set for the diagonal.
*
* @fn Seed#upperDiagonal
*
* @brief Returns the rightmost diagonal of the seed (maximum diagonal value).
*
* @signature TDiagonal upperDiagonal(seed);
*
* @param[in] seed The seed to query for its upper diagonal.
*
* @return TDiagonal The upper diagonal value of type @link Seed#Diagonal
* @endlink.
*
* @fn Seed#setUpperDiagonal
*
* @brief Sets a new value for the rightmost diagonal of a seed.
*
* @signature void setUpperDigonal(seed, diag);
*
* @param[in,out] seed The Seed to set the diagonal value for.
* @param[in] diag The value to set for the diagonal.
*
* @fn Seed#seedSize
*
* @brief Returns the number of matches and mismatches of the seed. This is the
* longest true diagonal fitting into its dimensions.
*
* @signature TSize seedSize(seed);
*
* @param[in] seed The Seed to query for its size.
*
* @return TSize The size of the type @link Seed#Size @endlink.
*
* @fn Seed#beginDiagonal
*
* @brief Returns the begin diagonal of a Seed.
*
* @signature TDiagonal beginDiagonal(seed);
*
* @param[in] seed The Seed to query for its begin diagonal.
*
* @return TDiagonal The diagonal of the Seed's begin position of type @link
* Seed#Diagonal @endlink.
*
* @fn Seed#endDiagonal
*
* @brief Returns the end diagonal of a Seed.
*
* @signature TDiagonal endDiagonal(seed);
*
* @param[in] seed The Seed to query for its end diagonal.
*
* @return TDiagonal The diagonal of the Seed's end position of type @link
* Seed#Diagonal @endlink.
*
* @fn Seed#score
*
* @brief Returns the score of a Seed.
*
* @signature TSeedScore score(seed);
*
* @param[in] seed The Seed to query for its score.
*
* @return TSeedScore The score value of the seed of type @link Seed#SeedScore
* @endlink.
*
* @fn Seed#setScore
*
* @brief Sets the Seed score value.
*
* @signature void setScore(seed, scoreVal);
*
* @param[in,out] seed The Seed to set the score value of.
* @param[in] scoreVal The score value to set. The type can queried from the
* type of <tt>seed</tt> using @link Seed#SeedScore
* @endlink.
*
* @fn Seed#extendSeed
*
* @headerfile <seqan/seeds.h>
*
* @brief Extends a seed.
*
* @signature void extendSeed(seed, database, query, direction, MatchExtend);
* @signature void extendSeed(seed, database, query, direction, scoringScheme,
* scoreDropOff, xDropTag);
*
* @param[in,out] seed The Seed to extend.
* @param[in] database The database (horizontal) @link SequenceConcept sequence
* @endlink.
* @param[in] query The query (vertical) @link SequenceConcept sequence
* @endlink.
* @param[in] direction The extension direction. Type: @link ExtensionDirection
* @endlink.
* @param[in] scoringScheme The @link Score @endlink object to use for scoring
* alignments and gaps.
* @param[in] scoreDropOff The score drop after which the extension should stop.
* The extension stops if this value is exceeded. Only
* given for when using an x-drop algorithm.
* @param[in] xDropTag Tag for selecting x-drop method, one of
* <tt>UnGappedXDrop</tt> and <tt>GappedXDrop</tt>.
*
* You can use the tags, <tt>MatchExtend</tt>, <tt>UnGappedXDrop</tt>, and
* <tt>GappedXDrop</tt>.
*
* Note that the diagonals updated in <tt>seed</tt> do not necessarily reflect
* the diagonals for the optimal extension but the diagonals used in all traces
* of the extension. However, they are guaranteed to include the optimal
* extension's trace.
*
* @section Examples
*
* The documentation of the class @link Seed @endlink contains an example for
* seed extension.
*
* @see ExtensionDirection
* @see SeedExtensionTags
*/