/*!
* @class Score
*
* @headerfile <seqan/score.h>
*
* @brief Scoring scheme.
*
* @signature template <[typename TValue[, typename TSpec]]> class Score;
*
* @tparam TValue The scoring value, defaults to <tt>int</tt>.
* @tparam TSpec The specialization type, defaults to <tt>Simple</tt>.
*
* The Score class uses <b>similarity</b> scores, i.e. the greater the score
* value, the greater the similarity. Depending on the exact score, the scores
* can also be negative for dissimilarity. This choice blends in naturally with
* the BLOSUM and PAM matrices, for examples. For the edit distance common in
* computer science, this corresponds to match scores of 0, mismatch and gap
* scores of -1.
*
* @section Examples
*
* @include demos/dox/score/score.cpp
*
* The output is as follows:
*
* @include demos/dox/score/score.cpp.stdout
*
*
*
* @mfn Score#Value
*
* @brief Return the value type of the scoring scheme.
*
* @signature Value<TScore>::Type;
*
* @tparam TScore The Score specialization.
*
* @return Type The score value type of the scoring scheme.
*
* @mfn Score#SequenceEntryForScore
*
* @headerfile <seqan/score.h>
*
* @brief Returns representation type for a character of a position in a
* sequence.
*
* @note This is used for unified interfaces for position dependent and
* independent scores.
*
* @signature SequenceEntryForScore<TScore, TSequence>::Type;
*
* @tparam TScore The score type to use. Types: Score
* @tparam TSequence The underlying sequence of the alignments or gaps. Types:
* ContainerConcept
*
* @return Type The type to use for representing a character in a sequence over
* its position.
*
* @see Score#SequenceEntryForScore
* @see Score#sequenceEntryForScore
* @see ConsensusScoreSequenceEntry
*
* @fn Score#sequenceEntryForScore
*
* @brief Helper function for element access, depending on score type.
*
* @signature TAlphabet sequenceEntryForScore(scoringScheme, seq, pos);
*
* @param[in] scoringScheme The Score to get the representation for.
* @param[in] pos The position of the character.
* @param[in] seq The sequence to get the representation for.
*
* @return TAlphabet The value of <tt>seq</tt> at <tt>pos</tt>.
*
* @fn Score#scoreGapOpenHorizontal
*
* @brief Returns the score for opening a gap in horizontal direction.
*
* @signature TValue scoreGapOpenHorizontal(score, entryH, entryV);
*
* @param[in] score The Score to query.
* @param[in] entryH Entry in sequence one (horizontal), type from
* Score#SequenceEntryForScore.
* @param[in] entryV Entry in sequence two (vertical), type from
* Score#SequenceEntryForScore.
*
* @return TValue The score open cost for gaps at the given position/entry.
* TValue is the value type of score.
*
* @section Remarks
*
* Corresponds to a deletion event in sequence two and an insertion event in
* sequence one, respectively.
*
* @fn Score#scoreGapOpenVertical
*
* @brief Returns the score for opening a gap in vertical direction.
*
* @signature TValue scoreGapOpenVertical(score, entryH, entryV);
*
* @param[in] score The Score to query.
* @param[in] entryH Entry in sequence one (horizontal), type from
* Score#SequenceEntryForScore.
* @param[in] entryV Entry in sequence two (vertical), type from
* Score#SequenceEntryForScore.
*
* @return TValue The score open cost for gaps at the given position/entry.
* TValue is the value type of score.
*
* @section Remarks
*
* Corresponds to a deletion event in sequence two and an insertion event in
* sequence one, respectively.
*
* @fn Score#scoreGapExtendHorizontal
*
* @brief Returns the score for extending a gap in horizontal direction.
*
* @signature TValue scoreGapExtendHorizontal(score, entryH, entryV);
*
* @param[in] score The Score to query.
* @param[in] entryH Entry in sequence one (horizontal), type from
* Score#SequenceEntryForScore.
* @param[in] entryV Entry in sequence two (vertical), type from
* Score#SequenceEntryForScore.
*
* @return TValue The score extension cost for gaps at the given position/entry.
* TValue is the value type of score.
*
* @section Remarks
*
* Corresponds to a deletion event in sequence two and an insertion event in
* sequence one, respectively.
*
* @fn Score#scoreGapExtendVertical
*
* @brief Returns the score for extending a gap in vertical direction.
*
* @signature TValue scoreGapExtendVertical(score, entryH, entryV);
*
* @param[in] score The Score to query.
* @param[in] entryH Entry in sequence one (horizontal), type from
* Score#SequenceEntryForScore.
* @param[in] entryV Entry in sequence two (vertical), type from
* Score#SequenceEntryForScore.
*
* @return TValue The score extension cost for gaps at the given position/entry.
* TValue is the value type of score.
*
* @section Remarks
*
* Corresponds to a deletion event in sequence one and an insertion event in
* sequence two, respectively.
*
* @fn Score#scoreGapHorizontal
*
* @brief Returns the score for a gap in horizontal direction.
*
* @signature TValue scoreGapHorizontal(score, entryH, entryV);
*
* @param[in] score The Score to query.
* @param[in] entryH Entry in sequence one (horizontal), type from
* Score#SequenceEntryForScore.
* @param[in] entryV Entry in sequence two (vertical), type from
* Score#SequenceEntryForScore.
*
* @return TValue The score gap cost for gaps at the given position/entry.
* TValue is the value type of score.
*
* @section Remarks
*
* Corresponds to a deletion event in sequence two and an insertion event in
* sequence one, respectively.
*
* @fn Score#scoreGapVertical
*
* @brief Returns the score for a gap in vertical direction.
*
* @signature TValue scoreGapVertical(score, entryH, entryV);
*
* @param[in] score The Score to query.
* @param[in] entryH Entry in sequence one (horizontal), type from
* Score#SequenceEntryForScore.
* @param[in] entryV Entry in sequence two (vertical), type from
* Score#SequenceEntryForScore.
*
* @return TValue The score gap cost for gaps at the given position/entry.
* TValue is the value type of score.
*
* @section Remarks
*
* Corresponds to a deletion event in sequence two and an insertion event in
* sequence one, respectively.
*
* @fn Score#score
*
* @brief Returns similarity score for two sequence entries.
*
* @signature TValue score(score, entryH, entryV);
*
* @param[in] score The Score to use for comparing the two sequence entries.
* @param[in] entryH The entry in the first/horizontal sequence.
* @param[in] entryV The entry in the second/vertical sequence.
*
* @return TValue The score similarity cost for gaps at the given
* position/entry. TValue is the value type of score.
*
* @fn Score#loadScoreMatrix
*
* @brief Load a score matrix from a file.
*
* @signature void loadScoreMatrix(score, fileName[, meta]);
*
* @param[in,out] score The MatrixScore to load.
* @param[in] fileName The path to the file to load, CharString.
* @param[out] meta Meta information is stored here, CharString.
*/