yat/omic/algorithm.h

Code
Comments
Other
Rev Date Author Line
2899 13 Dec 12 peter 1 #ifndef theplu_yat_omic_algorithm
2899 13 Dec 12 peter 2 #define theplu_yat_omic_algorithm
2899 13 Dec 12 peter 3
2899 13 Dec 12 peter 4 // $Id$
2899 13 Dec 12 peter 5
2993 03 Mar 13 peter 6 /*
3999 08 Oct 20 peter 7   Copyright (C) 2012, 2013, 2014, 2016, 2017, 2018, 2020 Peter Johansson
2993 03 Mar 13 peter 8
2993 03 Mar 13 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
2993 03 Mar 13 peter 10
2993 03 Mar 13 peter 11   The yat library is free software; you can redistribute it and/or
2993 03 Mar 13 peter 12   modify it under the terms of the GNU General Public License as
2993 03 Mar 13 peter 13   published by the Free Software Foundation; either version 3 of the
2993 03 Mar 13 peter 14   License, or (at your option) any later version.
2993 03 Mar 13 peter 15
2993 03 Mar 13 peter 16   The yat library is distributed in the hope that it will be useful,
2993 03 Mar 13 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
2993 03 Mar 13 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2993 03 Mar 13 peter 19   General Public License for more details.
2993 03 Mar 13 peter 20
2993 03 Mar 13 peter 21   You should have received a copy of the GNU General Public License
3753 17 Oct 18 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
2993 03 Mar 13 peter 23 */
2993 03 Mar 13 peter 24
3475 08 Mar 16 peter 25 #include <yat/utility/config_public.h>
3475 08 Mar 16 peter 26
3913 18 May 20 peter 27 #ifdef YAT_HAVE_HTSLIB
3173 08 Mar 14 peter 28 #include "BamPairIterator.h"
3475 08 Mar 16 peter 29 #endif
3475 08 Mar 16 peter 30 #include "DnaComplementer.h"
2899 13 Dec 12 peter 31
3475 08 Mar 16 peter 32 #include <boost/iterator/iterator_concepts.hpp>
3475 08 Mar 16 peter 33 #include <boost/iterator/iterator_traits.hpp>
3517 16 Aug 16 peter 34 #include <boost/iterator/reverse_iterator.hpp>
3475 08 Mar 16 peter 35 #include <boost/concept_check.hpp>
3475 08 Mar 16 peter 36
3480 10 Mar 16 peter 37 #include <algorithm>
3480 10 Mar 16 peter 38 #include <vector>
3480 10 Mar 16 peter 39
2899 13 Dec 12 peter 40 namespace theplu {
2899 13 Dec 12 peter 41 namespace yat {
2899 13 Dec 12 peter 42 namespace omic {
2899 13 Dec 12 peter 43
2899 13 Dec 12 peter 44   /**
2903 13 Dec 12 peter 45      \c bam_pair_analyse performs an operation on bam read pairs as
2903 13 Dec 12 peter 46      defined by \a visitor. The function iterates over sorted input
2903 13 Dec 12 peter 47      range of reads; if read is first read, it is cached for later
2903 13 Dec 12 peter 48      use; if read is second read and mate is present in cache, \a
2903 13 Dec 12 peter 49      visitor operates on pair, i.e., \c Visitor (\c mate, \c read) is
2903 13 Dec 12 peter 50      called.
2903 13 Dec 12 peter 51
2903 13 Dec 12 peter 52      Type Requirements:
3517 16 Aug 16 peter 53      - \c Iterator is a \readable_iterator
3517 16 Aug 16 peter 54      - \c Iterator is a \single_pass_iterator
2903 13 Dec 12 peter 55      - \c Iterator 's \c reference type must be convertible to BamRead
2903 13 Dec 12 peter 56      - \c Visitor must have an \c operator()(BamRead, BamRead) (or any
2903 13 Dec 12 peter 57        \c const or reference combination)
2903 13 Dec 12 peter 58
2903 13 Dec 12 peter 59      \note Input range \c [\a first, \a last \c ) must be sorted or behaviour is
2903 13 Dec 12 peter 60      undefined.
2903 13 Dec 12 peter 61
2899 13 Dec 12 peter 62      \since New in yat 0.10
2899 13 Dec 12 peter 63    */
3481 13 Mar 16 peter 64 #ifdef YAT_HAVE_LIBBAM
2899 13 Dec 12 peter 65   template<class Iterator, class Visitor>
3475 08 Mar 16 peter 66   void bam_pair_analyse(Iterator first, Iterator last, Visitor& visitor);
3475 08 Mar 16 peter 67 #endif
3475 08 Mar 16 peter 68
3475 08 Mar 16 peter 69   /**
3475 08 Mar 16 peter 70      Function that transforms a sequence of chars to its genomic
3475 08 Mar 16 peter 71      complement (see DnaComplementer). Sequence can be transformed
3475 08 Mar 16 peter 72      in-place, i.e., begin and out can point to the same element.
3475 08 Mar 16 peter 73
3475 08 Mar 16 peter 74      Type Requirements:
3475 08 Mar 16 peter 75      - \c InputIterator is \readable_iterator
3475 08 Mar 16 peter 76      - \c InputIterator models \single_pass_iterator
3475 08 Mar 16 peter 77      - value type of \c InputIterator is convertible to char
3475 08 Mar 16 peter 78      - \c OutputIterator models \incrementable_iterator
3475 08 Mar 16 peter 79      - \c OutputIterator is a \writable_iterator
3475 08 Mar 16 peter 80      - \c char must be convertible to value type of OutputIterator
3475 08 Mar 16 peter 81
3475 08 Mar 16 peter 82      \since New in yat 0.14
3475 08 Mar 16 peter 83    */
3475 08 Mar 16 peter 84   template<typename InputIterator, typename OutputIterator>
3475 08 Mar 16 peter 85   void dna_complement(InputIterator begin, InputIterator end,
3475 08 Mar 16 peter 86                       OutputIterator out);
3475 08 Mar 16 peter 87
3475 08 Mar 16 peter 88   /**
3475 08 Mar 16 peter 89      Function that transforms a sequence of chars to its genomic
3475 08 Mar 16 peter 90      reverse complement, i.e., it transforms the sequence using
3475 08 Mar 16 peter 91      DnaComplementer and reverse the sequence.
3475 08 Mar 16 peter 92
3475 08 Mar 16 peter 93      Type Requirements:
3475 08 Mar 16 peter 94      - \c BidirectionalIterator is \bidirectional_iterator
3475 08 Mar 16 peter 95      - \c BidirectionalIterator is \writable_iterator
3475 08 Mar 16 peter 96      - value type of \c BidirectionalIterator is convertible to char
3475 08 Mar 16 peter 97      - \c char must be convertible to value type of BidirectionalIterator
3475 08 Mar 16 peter 98
3475 08 Mar 16 peter 99      \see dna_complement
3517 16 Aug 16 peter 100      \see dna_reverse_complement_copy
3475 08 Mar 16 peter 101
3475 08 Mar 16 peter 102      \since New in yat 0.14
3475 08 Mar 16 peter 103   */
3475 08 Mar 16 peter 104   template<typename BidirectionalIterator>
3475 08 Mar 16 peter 105   void dna_reverse_complement(BidirectionalIterator begin,
3475 08 Mar 16 peter 106                               BidirectionalIterator end);
3475 08 Mar 16 peter 107
3475 08 Mar 16 peter 108   /**
3475 08 Mar 16 peter 109      Function that transforms a sequence of chars to its genomic
3475 08 Mar 16 peter 110      reverse complement, i.e., it transforms the sequence using
3475 08 Mar 16 peter 111      DnaComplementer and reverse the sequence.
3475 08 Mar 16 peter 112
3475 08 Mar 16 peter 113      Type Requirements:
3517 16 Aug 16 peter 114      - \c BidirectionalIterator is \readable_iterator
3517 16 Aug 16 peter 115      - \c BidirectionalIterator is \bidirectional_traversal_iterator
3517 16 Aug 16 peter 116      - value type of \c BidirectionalIterator is convertible to char
3517 16 Aug 16 peter 117      - \c char must be convertible to value type of BidirectionalIterator
3517 16 Aug 16 peter 118
3517 16 Aug 16 peter 119      Type Requirements:
3475 08 Mar 16 peter 120      - \c InputIterator is \readable_iterator
3475 08 Mar 16 peter 121      - \c InputIterator models \single_pass_iterator
3475 08 Mar 16 peter 122      - value type of \c InputIterator is convertible to char
3475 08 Mar 16 peter 123      - \c OutputIterator models \incrementable_iterator
3475 08 Mar 16 peter 124      - \c OutputIterator is a \writable_iterator
3475 08 Mar 16 peter 125      - \c char must be convertible to value type of OutputIterator
3475 08 Mar 16 peter 126
3475 08 Mar 16 peter 127      \see dna_complement
3517 16 Aug 16 peter 128      \see dna_reverse_complement
3475 08 Mar 16 peter 129
3517 16 Aug 16 peter 130      \note If input range and output range overlap, behaviour is undefined.
3517 16 Aug 16 peter 131
3475 08 Mar 16 peter 132      \since New in yat 0.14
3475 08 Mar 16 peter 133   */
3517 16 Aug 16 peter 134   template<typename BidirectionalIterator, typename OutputIterator>
3517 16 Aug 16 peter 135   void dna_reverse_complement_copy(BidirectionalIterator begin,
3517 16 Aug 16 peter 136                                    BidirectionalIterator end,
3475 08 Mar 16 peter 137                                    OutputIterator out);
3475 08 Mar 16 peter 138
3475 08 Mar 16 peter 139
3475 08 Mar 16 peter 140   // template implementations
3475 08 Mar 16 peter 141
3481 13 Mar 16 peter 142 #ifdef YAT_HAVE_LIBBAM
3475 08 Mar 16 peter 143   template<class Iterator, class Visitor>
2902 13 Dec 12 peter 144   void bam_pair_analyse(Iterator first, Iterator last, Visitor& visitor)
2899 13 Dec 12 peter 145   {
3517 16 Aug 16 peter 146     BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Iterator>));
3517 16 Aug 16 peter 147     BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Iterator>));
3173 08 Mar 14 peter 148     BamPairIterator<Iterator> iter(first, last);
3173 08 Mar 14 peter 149     BamPairIterator<Iterator> end(last, last);
3173 08 Mar 14 peter 150     for (; iter!=end; ++iter)
3191 22 Apr 14 peter 151       visitor((*iter).first(), (*iter).second());
2899 13 Dec 12 peter 152   }
3475 08 Mar 16 peter 153 #endif
2899 13 Dec 12 peter 154
3475 08 Mar 16 peter 155
3475 08 Mar 16 peter 156   template<typename InputIterator, typename OutputIterator>
3475 08 Mar 16 peter 157   void dna_complement(InputIterator begin, InputIterator end,
3475 08 Mar 16 peter 158                       OutputIterator out)
3475 08 Mar 16 peter 159   {
3475 08 Mar 16 peter 160     BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<InputIterator>));
3475 08 Mar 16 peter 161     BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<InputIterator>));
3475 08 Mar 16 peter 162
3517 16 Aug 16 peter 163     typedef typename boost::iterator_value<InputIterator>::type value_type;
3517 16 Aug 16 peter 164     BOOST_CONCEPT_ASSERT((boost::Convertible<value_type, char>));
3475 08 Mar 16 peter 165
3475 08 Mar 16 peter 166     using namespace boost_concepts;
3475 08 Mar 16 peter 167     BOOST_CONCEPT_ASSERT((WritableIterator<OutputIterator, char>));
3475 08 Mar 16 peter 168     BOOST_CONCEPT_ASSERT((IncrementableIterator<OutputIterator>));
3475 08 Mar 16 peter 169     std::transform(begin, end, out, DnaComplementer());
3475 08 Mar 16 peter 170   }
3475 08 Mar 16 peter 171
3475 08 Mar 16 peter 172
3475 08 Mar 16 peter 173   template<typename BidirectionalIterator>
3475 08 Mar 16 peter 174   void dna_reverse_complement(BidirectionalIterator begin,
3475 08 Mar 16 peter 175                               BidirectionalIterator end)
3475 08 Mar 16 peter 176   {
3475 08 Mar 16 peter 177     BOOST_CONCEPT_ASSERT((
3475 08 Mar 16 peter 178       boost::Mutable_BidirectionalIterator<BidirectionalIterator>
3475 08 Mar 16 peter 179     ));
3475 08 Mar 16 peter 180     dna_complement(begin, end, begin);
3475 08 Mar 16 peter 181     std::reverse(begin, end);
3475 08 Mar 16 peter 182   }
3475 08 Mar 16 peter 183
3475 08 Mar 16 peter 184
3517 16 Aug 16 peter 185   template<typename BidirectionalIterator, typename OutputIterator>
3517 16 Aug 16 peter 186   void dna_reverse_complement_copy(BidirectionalIterator begin,
3517 16 Aug 16 peter 187                                    BidirectionalIterator end,
3475 08 Mar 16 peter 188                                    OutputIterator out)
3475 08 Mar 16 peter 189   {
3517 16 Aug 16 peter 190     BOOST_CONCEPT_ASSERT((boost_concepts::BidirectionalTraversal<BidirectionalIterator>));
3517 16 Aug 16 peter 191
3628 08 Mar 17 peter 192     dna_complement(boost::make_reverse_iterator(end),
3628 08 Mar 17 peter 193                    boost::make_reverse_iterator(begin), out);
3475 08 Mar 16 peter 194   }
3475 08 Mar 16 peter 195
2899 13 Dec 12 peter 196 }}}
2899 13 Dec 12 peter 197 #endif