yat/utility/mAlignerBase.h

Code
Comments
Other
Rev Date Author Line
4353 23 Aug 23 peter 1 #ifndef _theplu_yat_utility_maligner_base_
4353 23 Aug 23 peter 2 #define _theplu_yat_utility_maligner_base_
4353 23 Aug 23 peter 3
4356 23 Aug 23 peter 4 // $Id$
4356 23 Aug 23 peter 5
4356 23 Aug 23 peter 6 /*
4356 23 Aug 23 peter 7   Copyright (C) 2023 Peter Johansson
4356 23 Aug 23 peter 8
4356 23 Aug 23 peter 9   This file is part of the yat library, https://dev.thep.lu.se/yat
4356 23 Aug 23 peter 10
4356 23 Aug 23 peter 11   The yat library is free software; you can redistribute it and/or
4356 23 Aug 23 peter 12   modify it under the terms of the GNU General Public License as
4356 23 Aug 23 peter 13   published by the Free Software Foundation; either version 3 of the
4356 23 Aug 23 peter 14   License, or (at your option) any later version.
4356 23 Aug 23 peter 15
4356 23 Aug 23 peter 16   The yat library is distributed in the hope that it will be useful,
4356 23 Aug 23 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
4356 23 Aug 23 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4356 23 Aug 23 peter 19   General Public License for more details.
4356 23 Aug 23 peter 20
4356 23 Aug 23 peter 21   You should have received a copy of the GNU General Public License
4356 23 Aug 23 peter 22   along with yat. If not, see <https://www.gnu.org/licenses/>.
4356 23 Aug 23 peter 23 */
4356 23 Aug 23 peter 24
4353 23 Aug 23 peter 25 #include "Aligner.h" // for Cigar
4353 23 Aug 23 peter 26
4353 23 Aug 23 peter 27 namespace theplu {
4353 23 Aug 23 peter 28 namespace yat {
4353 23 Aug 23 peter 29 namespace utility {
4353 23 Aug 23 peter 30
4353 23 Aug 23 peter 31   class MatrixBase;
4353 23 Aug 23 peter 32
4353 23 Aug 23 peter 33   /**
4353 23 Aug 23 peter 34      This is inherited by mAligner and basically implements
4353 23 Aug 23 peter 35      non-template features.
4353 23 Aug 23 peter 36
4353 23 Aug 23 peter 37      \since New in yat 0.21
4353 23 Aug 23 peter 38    */
4353 23 Aug 23 peter 39   class mAlignerBase
4353 23 Aug 23 peter 40   {
4353 23 Aug 23 peter 41   public:
4353 23 Aug 23 peter 42     /// mAligner::Cigar same as Aligner::Cigar
4353 23 Aug 23 peter 43     typedef Aligner::Cigar Cigar;
4353 23 Aug 23 peter 44
4353 23 Aug 23 peter 45     /**
4353 23 Aug 23 peter 46        \return CIGAR object describing the alignment
4353 23 Aug 23 peter 47     */
4353 23 Aug 23 peter 48     const Cigar& cigar(void) const;
4353 23 Aug 23 peter 49
4353 23 Aug 23 peter 50     /**
4353 23 Aug 23 peter 51        Same as cigar(void) but using BAM_CEQUAL and BAM_CDIFF instead
4353 23 Aug 23 peter 52        of BAM_CMATCH. BAM_CEQUAL implies that the kernel function is
4353 23 Aug 23 peter 53        positive for the alignment match.
4353 23 Aug 23 peter 54      */
4353 23 Aug 23 peter 55     const Cigar& cigar2(void) const;
4353 23 Aug 23 peter 56
4353 23 Aug 23 peter 57     /**
4353 23 Aug 23 peter 58        The position indicates which element in the reference sequence
4353 23 Aug 23 peter 59        that is the first being matched/aligned to a query element. The
4353 23 Aug 23 peter 60        coordinates are zero-based, i.e., position zero implies the
4353 23 Aug 23 peter 61        first query element is matched to the first reference element.
4353 23 Aug 23 peter 62
4353 23 Aug 23 peter 63        \return distance from the first reference in the alignment and
4353 23 Aug 23 peter 64        the first element of the reference.
4353 23 Aug 23 peter 65      */
4353 23 Aug 23 peter 66     size_t position(void) const;
4353 23 Aug 23 peter 67
4353 23 Aug 23 peter 68     /**
4353 23 Aug 23 peter 69        \return alignment score
4353 23 Aug 23 peter 70      */
4353 23 Aug 23 peter 71     double score(void) const;
4353 23 Aug 23 peter 72
4353 23 Aug 23 peter 73
4353 23 Aug 23 peter 74     /**
4353 23 Aug 23 peter 75        Functor calculating an affine function. A k-sized gap is
4353 23 Aug 23 peter 76        typicallly penalised as y = k*x + m
4353 23 Aug 23 peter 77      */
4353 23 Aug 23 peter 78     class Affine
4353 23 Aug 23 peter 79     {
4353 23 Aug 23 peter 80     public:
4353 23 Aug 23 peter 81       /**
4353 23 Aug 23 peter 82          Total penalty that of a k-sized gap is open + k * pen
4353 23 Aug 23 peter 83        */
4353 23 Aug 23 peter 84       Affine(double pen, double open);
4353 23 Aug 23 peter 85
4353 23 Aug 23 peter 86       /**
4353 23 Aug 23 peter 87          Total penalty that of a k-sized gap is open + k * pen
4353 23 Aug 23 peter 88
4353 23 Aug 23 peter 89          \return total penalty for a k-sized gap
4353 23 Aug 23 peter 90        */
4353 23 Aug 23 peter 91       double operator()(size_t k) const;
4353 23 Aug 23 peter 92
4353 23 Aug 23 peter 93       /// see pen in Constructor
4353 23 Aug 23 peter 94       double penalty(void) const;
4353 23 Aug 23 peter 95
4353 23 Aug 23 peter 96       /// see open in Constructor
4353 23 Aug 23 peter 97       double open_penalty(void) const;
4353 23 Aug 23 peter 98     private:
4353 23 Aug 23 peter 99       double pen_;
4353 23 Aug 23 peter 100       double open_;
4353 23 Aug 23 peter 101     };
4353 23 Aug 23 peter 102
4353 23 Aug 23 peter 103
4353 23 Aug 23 peter 104     /**
4353 23 Aug 23 peter 105        Class holding the result of an alignment
4353 23 Aug 23 peter 106      */
4353 23 Aug 23 peter 107     class Alignment
4353 23 Aug 23 peter 108     {
4353 23 Aug 23 peter 109     public:
4353 23 Aug 23 peter 110       /// Default constructor
4353 23 Aug 23 peter 111       Alignment(void);
4353 23 Aug 23 peter 112
4353 23 Aug 23 peter 113       /// \return CIGAR describing the alignment
4353 23 Aug 23 peter 114       Aligner::Cigar& cigar(void);
4353 23 Aug 23 peter 115
4353 23 Aug 23 peter 116       /// \return CIGAR describing the alignment
4353 23 Aug 23 peter 117       const Aligner::Cigar& cigar(void) const;
4353 23 Aug 23 peter 118
4353 23 Aug 23 peter 119       /**
4353 23 Aug 23 peter 120          First base in the reference that the query is aligned
4353 23 Aug 23 peter 121          against. Zero implies that the first reference base is
4353 23 Aug 23 peter 122          included in the alignment.
4353 23 Aug 23 peter 123        */
4353 23 Aug 23 peter 124       const size_t& position(void) const;
4353 23 Aug 23 peter 125
4353 23 Aug 23 peter 126       /// \return modifiable position
4353 23 Aug 23 peter 127       size_t& position(void);
4353 23 Aug 23 peter 128
4353 23 Aug 23 peter 129       /// \return total score of the alignment
4353 23 Aug 23 peter 130       const double& score(void) const;
4353 23 Aug 23 peter 131
4353 23 Aug 23 peter 132       /// \return total score of the alignment
4353 23 Aug 23 peter 133       double& score(void);
4353 23 Aug 23 peter 134
4353 23 Aug 23 peter 135       /**
4353 23 Aug 23 peter 136          \return true if score of this Alignment is less than score
4353 23 Aug 23 peter 137          of \c other
4353 23 Aug 23 peter 138       */
4353 23 Aug 23 peter 139       bool operator<(const Alignment& other) const;
4353 23 Aug 23 peter 140     private:
4353 23 Aug 23 peter 141       Aligner::Cigar cigar_;
4353 23 Aug 23 peter 142       size_t position_;
4353 23 Aug 23 peter 143       double score_;
4353 23 Aug 23 peter 144     }; // end Alignment
4353 23 Aug 23 peter 145
4353 23 Aug 23 peter 146
4353 23 Aug 23 peter 147     /**
4353 23 Aug 23 peter 148        Kernel function that returns 1 if the two elements are equal
4353 23 Aug 23 peter 149        and user defined mismatch penalty otherwise.
4353 23 Aug 23 peter 150      */
4353 23 Aug 23 peter 151     class MatchKernel
4353 23 Aug 23 peter 152     {
4353 23 Aug 23 peter 153     public:
4353 23 Aug 23 peter 154       /**
4353 23 Aug 23 peter 155          \brief constructor
4353 23 Aug 23 peter 156          \param mismatch_pen When query and reference are not equal,
4353 23 Aug 23 peter 157          the negated value of \c mismatch_pen is returned.
4353 23 Aug 23 peter 158        */
4353 23 Aug 23 peter 159       MatchKernel(double mismatch_pen);
4353 23 Aug 23 peter 160
4353 23 Aug 23 peter 161       /**
4353 23 Aug 23 peter 162          \return 1 if *reference == *query'; other minus mismatch
4353 23 Aug 23 peter 163          penalty as defined in constructor.
4353 23 Aug 23 peter 164        */
4353 23 Aug 23 peter 165       template<typename Iterator1, typename Iterator2>
4353 23 Aug 23 peter 166       double operator()(Iterator1 reference,
4353 23 Aug 23 peter 167                         Iterator2 query) const;
4353 23 Aug 23 peter 168     private:
4353 23 Aug 23 peter 169       double mismatch_;
4353 23 Aug 23 peter 170     }; // end MatchKernel
4353 23 Aug 23 peter 171
4353 23 Aug 23 peter 172
4353 23 Aug 23 peter 173   protected:
4353 23 Aug 23 peter 174     /**
4353 23 Aug 23 peter 175        \param insertion penalty for an insertion
4353 23 Aug 23 peter 176
4353 23 Aug 23 peter 177        \param deletion penalty for a deletion
4353 23 Aug 23 peter 178      */
4353 23 Aug 23 peter 179     mAlignerBase(const Affine& insertion, const Affine& deletion);
4353 23 Aug 23 peter 180
4353 23 Aug 23 peter 181     /// penalty for an insertion
4353 23 Aug 23 peter 182     Affine insertion_;
4353 23 Aug 23 peter 183     /// penalty for an deletion
4353 23 Aug 23 peter 184     Affine deletion_;
4353 23 Aug 23 peter 185
4353 23 Aug 23 peter 186     /// Describes the best alignment
4353 23 Aug 23 peter 187     Alignment best_;
4353 23 Aug 23 peter 188
4353 23 Aug 23 peter 189     /// see cigar2(void)
4353 23 Aug 23 peter 190     Cigar cigar2_;
4353 23 Aug 23 peter 191
4353 23 Aug 23 peter 192   }; // end of mAlignerBase
4353 23 Aug 23 peter 193
4353 23 Aug 23 peter 194
4353 23 Aug 23 peter 195   // template implementations
4353 23 Aug 23 peter 196
4353 23 Aug 23 peter 197
4353 23 Aug 23 peter 198   // MatchKernel
4353 23 Aug 23 peter 199   template<typename Iterator1, typename Iterator2>
4353 23 Aug 23 peter 200   double mAlignerBase::MatchKernel::operator()(Iterator1 reference,
4353 23 Aug 23 peter 201                                                Iterator2 query) const
4353 23 Aug 23 peter 202   {
4353 23 Aug 23 peter 203     return *reference == *query ? 1.0 : -mismatch_;
4353 23 Aug 23 peter 204   }
4353 23 Aug 23 peter 205
4353 23 Aug 23 peter 206 }}}
4353 23 Aug 23 peter 207 #endif