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 |
// $Id$ |
2899 |
13 Dec 12 |
peter |
5 |
|
2993 |
03 Mar 13 |
peter |
6 |
/* |
3999 |
08 Oct 20 |
peter |
Copyright (C) 2012, 2013, 2014, 2016, 2017, 2018, 2020 Peter Johansson |
2993 |
03 Mar 13 |
peter |
8 |
|
2993 |
03 Mar 13 |
peter |
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 |
The yat library is free software; you can redistribute it and/or |
2993 |
03 Mar 13 |
peter |
modify it under the terms of the GNU General Public License as |
2993 |
03 Mar 13 |
peter |
published by the Free Software Foundation; either version 3 of the |
2993 |
03 Mar 13 |
peter |
License, or (at your option) any later version. |
2993 |
03 Mar 13 |
peter |
15 |
|
2993 |
03 Mar 13 |
peter |
The yat library is distributed in the hope that it will be useful, |
2993 |
03 Mar 13 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
2993 |
03 Mar 13 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
2993 |
03 Mar 13 |
peter |
General Public License for more details. |
2993 |
03 Mar 13 |
peter |
20 |
|
2993 |
03 Mar 13 |
peter |
You should have received a copy of the GNU General Public License |
3753 |
17 Oct 18 |
peter |
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 |
\c bam_pair_analyse performs an operation on bam read pairs as |
2903 |
13 Dec 12 |
peter |
defined by \a visitor. The function iterates over sorted input |
2903 |
13 Dec 12 |
peter |
range of reads; if read is first read, it is cached for later |
2903 |
13 Dec 12 |
peter |
use; if read is second read and mate is present in cache, \a |
2903 |
13 Dec 12 |
peter |
visitor operates on pair, i.e., \c Visitor (\c mate, \c read) is |
2903 |
13 Dec 12 |
peter |
called. |
2903 |
13 Dec 12 |
peter |
51 |
|
2903 |
13 Dec 12 |
peter |
Type Requirements: |
3517 |
16 Aug 16 |
peter |
- \c Iterator is a \readable_iterator |
3517 |
16 Aug 16 |
peter |
- \c Iterator is a \single_pass_iterator |
2903 |
13 Dec 12 |
peter |
- \c Iterator 's \c reference type must be convertible to BamRead |
2903 |
13 Dec 12 |
peter |
- \c Visitor must have an \c operator()(BamRead, BamRead) (or any |
2903 |
13 Dec 12 |
peter |
\c const or reference combination) |
2903 |
13 Dec 12 |
peter |
58 |
|
2903 |
13 Dec 12 |
peter |
\note Input range \c [\a first, \a last \c ) must be sorted or behaviour is |
2903 |
13 Dec 12 |
peter |
undefined. |
2903 |
13 Dec 12 |
peter |
61 |
|
2899 |
13 Dec 12 |
peter |
\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 |
Function that transforms a sequence of chars to its genomic |
3475 |
08 Mar 16 |
peter |
complement (see DnaComplementer). Sequence can be transformed |
3475 |
08 Mar 16 |
peter |
in-place, i.e., begin and out can point to the same element. |
3475 |
08 Mar 16 |
peter |
73 |
|
3475 |
08 Mar 16 |
peter |
Type Requirements: |
3475 |
08 Mar 16 |
peter |
- \c InputIterator is \readable_iterator |
3475 |
08 Mar 16 |
peter |
- \c InputIterator models \single_pass_iterator |
3475 |
08 Mar 16 |
peter |
- value type of \c InputIterator is convertible to char |
3475 |
08 Mar 16 |
peter |
- \c OutputIterator models \incrementable_iterator |
3475 |
08 Mar 16 |
peter |
- \c OutputIterator is a \writable_iterator |
3475 |
08 Mar 16 |
peter |
- \c char must be convertible to value type of OutputIterator |
3475 |
08 Mar 16 |
peter |
81 |
|
3475 |
08 Mar 16 |
peter |
\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 |
Function that transforms a sequence of chars to its genomic |
3475 |
08 Mar 16 |
peter |
reverse complement, i.e., it transforms the sequence using |
3475 |
08 Mar 16 |
peter |
DnaComplementer and reverse the sequence. |
3475 |
08 Mar 16 |
peter |
92 |
|
3475 |
08 Mar 16 |
peter |
Type Requirements: |
3475 |
08 Mar 16 |
peter |
- \c BidirectionalIterator is \bidirectional_iterator |
3475 |
08 Mar 16 |
peter |
- \c BidirectionalIterator is \writable_iterator |
3475 |
08 Mar 16 |
peter |
- value type of \c BidirectionalIterator is convertible to char |
3475 |
08 Mar 16 |
peter |
- \c char must be convertible to value type of BidirectionalIterator |
3475 |
08 Mar 16 |
peter |
98 |
|
3475 |
08 Mar 16 |
peter |
\see dna_complement |
3517 |
16 Aug 16 |
peter |
\see dna_reverse_complement_copy |
3475 |
08 Mar 16 |
peter |
101 |
|
3475 |
08 Mar 16 |
peter |
\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 |
Function that transforms a sequence of chars to its genomic |
3475 |
08 Mar 16 |
peter |
reverse complement, i.e., it transforms the sequence using |
3475 |
08 Mar 16 |
peter |
DnaComplementer and reverse the sequence. |
3475 |
08 Mar 16 |
peter |
112 |
|
3475 |
08 Mar 16 |
peter |
Type Requirements: |
3517 |
16 Aug 16 |
peter |
- \c BidirectionalIterator is \readable_iterator |
3517 |
16 Aug 16 |
peter |
- \c BidirectionalIterator is \bidirectional_traversal_iterator |
3517 |
16 Aug 16 |
peter |
- value type of \c BidirectionalIterator is convertible to char |
3517 |
16 Aug 16 |
peter |
- \c char must be convertible to value type of BidirectionalIterator |
3517 |
16 Aug 16 |
peter |
118 |
|
3517 |
16 Aug 16 |
peter |
Type Requirements: |
3475 |
08 Mar 16 |
peter |
- \c InputIterator is \readable_iterator |
3475 |
08 Mar 16 |
peter |
- \c InputIterator models \single_pass_iterator |
3475 |
08 Mar 16 |
peter |
- value type of \c InputIterator is convertible to char |
3475 |
08 Mar 16 |
peter |
- \c OutputIterator models \incrementable_iterator |
3475 |
08 Mar 16 |
peter |
- \c OutputIterator is a \writable_iterator |
3475 |
08 Mar 16 |
peter |
- \c char must be convertible to value type of OutputIterator |
3475 |
08 Mar 16 |
peter |
126 |
|
3475 |
08 Mar 16 |
peter |
\see dna_complement |
3517 |
16 Aug 16 |
peter |
\see dna_reverse_complement |
3475 |
08 Mar 16 |
peter |
129 |
|
3517 |
16 Aug 16 |
peter |
\note If input range and output range overlap, behaviour is undefined. |
3517 |
16 Aug 16 |
peter |
131 |
|
3475 |
08 Mar 16 |
peter |
\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 |
// 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 |