SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
record.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <seqan3/io/record.hpp>
16 
17 namespace seqan3
18 {
25 template <typename field_types, typename field_ids>
26 class sam_record : public record<field_types, field_ids>
27 {
30 
32  using tuple_base_t = typename base_t::base_type;
33 
35  template <field f>
36  using field_constant = typename base_t::template field_constant<f>;
37 
38  using base_t::get_impl;
39 public:
43  sam_record() = default;
44  sam_record(sam_record const &) = default;
45  sam_record & operator=(sam_record const &) = default;
46  sam_record(sam_record &&) = default;
47  sam_record & operator=(sam_record &&) = default;
48  ~sam_record() = default;
49 
51  using base_t::base_t;
53 
55  decltype(auto) id() &&
56  {
57  return get_impl(field_constant<seqan3::field::id>{}, static_cast<tuple_base_t &&>(*this));
58  }
60  decltype(auto) id() const &&
61  {
62  return get_impl(field_constant<seqan3::field::id>{}, static_cast<tuple_base_t const &&>(*this));
63  }
65  decltype(auto) id() &
66  {
67  return get_impl(field_constant<seqan3::field::id>{}, static_cast<tuple_base_t &>(*this));
68  }
70  decltype(auto) id() const &
71  {
72  return get_impl(field_constant<seqan3::field::id>{}, static_cast<tuple_base_t const &>(*this));
73  }
74 
76  decltype(auto) sequence() &&
77  {
78  return get_impl(field_constant<seqan3::field::seq>{}, static_cast<tuple_base_t &&>(*this));
79  }
81  decltype(auto) sequence() const &&
82  {
83  return get_impl(field_constant<seqan3::field::seq>{}, static_cast<tuple_base_t const &&>(*this));
84  }
86  decltype(auto) sequence() &
87  {
88  return get_impl(field_constant<seqan3::field::seq>{}, static_cast<tuple_base_t &>(*this));
89  }
91  decltype(auto) sequence() const &
92  {
93  return get_impl(field_constant<seqan3::field::seq>{}, static_cast<tuple_base_t const &>(*this));
94  }
95 
97  decltype(auto) base_qualities() &&
98  {
99  return get_impl(field_constant<seqan3::field::qual>{}, static_cast<tuple_base_t &&>(*this));
100  }
102  decltype(auto) base_qualities() const &&
103  {
104  return get_impl(field_constant<seqan3::field::qual>{}, static_cast<tuple_base_t const &&>(*this));
105  }
107  decltype(auto) base_qualities() &
108  {
109  return get_impl(field_constant<seqan3::field::qual>{}, static_cast<tuple_base_t &>(*this));
110  }
112  decltype(auto) base_qualities() const &
113  {
114  return get_impl(field_constant<seqan3::field::qual>{}, static_cast<tuple_base_t const &>(*this));
115  }
116 
118  decltype(auto) sequence_position() &&
119  {
120  return get_impl(field_constant<seqan3::field::offset>{}, static_cast<tuple_base_t &&>(*this));
121  }
123  decltype(auto) sequence_position() const &&
124  {
125  return get_impl(field_constant<seqan3::field::offset>{}, static_cast<tuple_base_t const &&>(*this));
126  }
128  decltype(auto) sequence_position() &
129  {
130  return get_impl(field_constant<seqan3::field::offset>{}, static_cast<tuple_base_t &>(*this));
131  }
133  decltype(auto) sequence_position() const &
134  {
135  return get_impl(field_constant<seqan3::field::offset>{}, static_cast<tuple_base_t const &>(*this));
136  }
137 
139  decltype(auto) alignment() &&
140  {
141  return get_impl(field_constant<seqan3::field::alignment>{}, static_cast<tuple_base_t &&>(*this));
142  }
144  decltype(auto) alignment() const &&
145  {
146  return get_impl(field_constant<seqan3::field::alignment>{}, static_cast<tuple_base_t const &&>(*this));
147  }
149  decltype(auto) alignment() &
150  {
151  return get_impl(field_constant<seqan3::field::alignment>{}, static_cast<tuple_base_t &>(*this));
152  }
154  decltype(auto) alignment() const &
155  {
156  return get_impl(field_constant<seqan3::field::alignment>{}, static_cast<tuple_base_t const &>(*this));
157  }
158 
160  decltype(auto) reference_id() &&
161  {
162  return get_impl(field_constant<seqan3::field::ref_id>{}, static_cast<tuple_base_t &&>(*this));
163  }
165  decltype(auto) reference_id() const &&
166  {
167  return get_impl(field_constant<seqan3::field::ref_id>{}, static_cast<tuple_base_t const &&>(*this));
168  }
170  decltype(auto) reference_id() &
171  {
172  return get_impl(field_constant<seqan3::field::ref_id>{}, static_cast<tuple_base_t &>(*this));
173  }
175  decltype(auto) reference_id() const &
176  {
177  return get_impl(field_constant<seqan3::field::ref_id>{}, static_cast<tuple_base_t const &>(*this));
178  }
179 
181  decltype(auto) reference_sequence() &&
182  {
183  return get_impl(field_constant<seqan3::field::ref_seq>{}, static_cast<tuple_base_t &&>(*this));
184  }
186  decltype(auto) reference_sequence() const &&
187  {
188  return get_impl(field_constant<seqan3::field::ref_seq>{}, static_cast<tuple_base_t const &&>(*this));
189  }
191  decltype(auto) reference_sequence() &
192  {
193  return get_impl(field_constant<seqan3::field::ref_seq>{}, static_cast<tuple_base_t &>(*this));
194  }
196  decltype(auto) reference_sequence() const &
197  {
198  return get_impl(field_constant<seqan3::field::ref_seq>{}, static_cast<tuple_base_t const &>(*this));
199  }
200 
202  decltype(auto) reference_position() &&
203  {
204  return get_impl(field_constant<seqan3::field::ref_offset>{}, static_cast<tuple_base_t &&>(*this));
205  }
207  decltype(auto) reference_position() const &&
208  {
209  return get_impl(field_constant<seqan3::field::ref_offset>{}, static_cast<tuple_base_t const &&>(*this));
210  }
212  decltype(auto) reference_position() &
213  {
214  return get_impl(field_constant<seqan3::field::ref_offset>{}, static_cast<tuple_base_t &>(*this));
215  }
217  decltype(auto) reference_position() const &
218  {
219  return get_impl(field_constant<seqan3::field::ref_offset>{}, static_cast<tuple_base_t const &>(*this));
220  }
221 
223  decltype(auto) header_ptr() &&
224  {
225  return get_impl(field_constant<seqan3::field::header_ptr>{}, static_cast<tuple_base_t &&>(*this));
226  }
228  decltype(auto) header_ptr() const &&
229  {
230  return get_impl(field_constant<seqan3::field::header_ptr>{}, static_cast<tuple_base_t const &&>(*this));
231  }
233  decltype(auto) header_ptr() &
234  {
235  return get_impl(field_constant<seqan3::field::header_ptr>{}, static_cast<tuple_base_t &>(*this));
236  }
238  decltype(auto) header_ptr() const &
239  {
240  return get_impl(field_constant<seqan3::field::header_ptr>{}, static_cast<tuple_base_t const &>(*this));
241  }
242 
244  decltype(auto) flag() &&
245  {
246  return get_impl(field_constant<seqan3::field::flag>{}, static_cast<tuple_base_t &&>(*this));
247  }
249  decltype(auto) flag() const &&
250  {
251  return get_impl(field_constant<seqan3::field::flag>{}, static_cast<tuple_base_t const &&>(*this));
252  }
254  decltype(auto) flag() &
255  {
256  return get_impl(field_constant<seqan3::field::flag>{}, static_cast<tuple_base_t &>(*this));
257  }
259  decltype(auto) flag() const &
260  {
261  return get_impl(field_constant<seqan3::field::flag>{}, static_cast<tuple_base_t const &>(*this));
262  }
263 
265  decltype(auto) mate_reference_id() &&
266  {
267  return std::get<0>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t &&>(*this)));
268  }
270  decltype(auto) mate_reference_id() const &&
271  {
272  return std::get<0>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t const &&>(*this)));
273  }
275  decltype(auto) mate_reference_id() &
276  {
277  return std::get<0>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t &>(*this)));
278  }
280  decltype(auto) mate_reference_id() const &
281  {
282  return std::get<0>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t const &>(*this)));
283  }
284 
286  decltype(auto) mate_position() &&
287  {
288  return std::get<1>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t &&>(*this)));
289  }
291  decltype(auto) mate_position() const &&
292  {
293  return std::get<1>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t const &&>(*this)));
294  }
296  decltype(auto) mate_position() &
297  {
298  return std::get<1>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t &>(*this)));
299  }
301  decltype(auto) mate_position() const &
302  {
303  return std::get<1>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t const &>(*this)));
304  }
305 
307  decltype(auto) template_length() &&
308  {
309  return std::get<2>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t &&>(*this)));
310  }
312  decltype(auto) template_length() const &&
313  {
314  return std::get<2>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t const &&>(*this)));
315  }
317  decltype(auto) template_length() &
318  {
319  return std::get<2>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t &>(*this)));
320  }
322  decltype(auto) template_length() const &
323  {
324  return std::get<2>(get_impl(field_constant<seqan3::field::mate>{}, static_cast<tuple_base_t const &>(*this)));
325  }
326 
328  decltype(auto) mapping_quality() &&
329  {
330  return get_impl(field_constant<seqan3::field::mapq>{}, static_cast<tuple_base_t &&>(*this));
331  }
333  decltype(auto) mapping_quality() const &&
334  {
335  return get_impl(field_constant<seqan3::field::mapq>{}, static_cast<tuple_base_t const &&>(*this));
336  }
338  decltype(auto) mapping_quality() &
339  {
340  return get_impl(field_constant<seqan3::field::mapq>{}, static_cast<tuple_base_t &>(*this));
341  }
343  decltype(auto) mapping_quality() const &
344  {
345  return get_impl(field_constant<seqan3::field::mapq>{}, static_cast<tuple_base_t const &>(*this));
346  }
347 
349  decltype(auto) cigar_sequence() &&
350  {
351  return get_impl(field_constant<seqan3::field::cigar>{}, static_cast<tuple_base_t &&>(*this));
352  }
354  decltype(auto) cigar_sequence() const &&
355  {
356  return get_impl(field_constant<seqan3::field::cigar>{}, static_cast<tuple_base_t const &&>(*this));
357  }
359  decltype(auto) cigar_sequence() &
360  {
361  return get_impl(field_constant<seqan3::field::cigar>{}, static_cast<tuple_base_t &>(*this));
362  }
364  decltype(auto) cigar_sequence() const &
365  {
366  return get_impl(field_constant<seqan3::field::cigar>{}, static_cast<tuple_base_t const &>(*this));
367  }
368 
370  decltype(auto) tags() &&
371  {
372  return get_impl(field_constant<seqan3::field::tags>{}, static_cast<tuple_base_t &&>(*this));
373  }
375  decltype(auto) tags() const &&
376  {
377  return get_impl(field_constant<seqan3::field::tags>{}, static_cast<tuple_base_t const &&>(*this));
378  }
380  decltype(auto) tags() &
381  {
382  return get_impl(field_constant<seqan3::field::tags>{}, static_cast<tuple_base_t &>(*this));
383  }
385  decltype(auto) tags() const &
386  {
387  return get_impl(field_constant<seqan3::field::tags>{}, static_cast<tuple_base_t const &>(*this));
388  }
389 };
390 } // namespace seqan3
391 
392 namespace std
393 {
394 
400 template <typename field_types, typename field_ids>
401 struct tuple_size<seqan3::sam_record<field_types, field_ids>>
402  : tuple_size<typename seqan3::sam_record<field_types, field_ids>::base_type>
403 {};
404 
410 template <size_t elem_no, typename field_types, typename field_ids>
411 struct tuple_element<elem_no, seqan3::sam_record<field_types, field_ids>>
412  : tuple_element<elem_no, typename seqan3::sam_record<field_types, field_ids>::base_type>
413 {};
414 
415 } // namespace std
The record type of seqan3::alignment_file_input.
Definition: record.hpp:27
sam_record & operator=(sam_record &&)=default
Defaulted.
decltype(auto) mate_reference_id() &&
The mate pair information with the reference name.
Definition: record.hpp:265
decltype(auto) cigar_sequence() &&
The cigar vector (std::vector<seqan3::cigar>) representing the alignment in SAM/BAM format.
Definition: record.hpp:349
decltype(auto) sequence_position() &&
Sequence (SEQ) relative start position (0-based), unsigned value.
Definition: record.hpp:118
decltype(auto) header_ptr() &&
A pointer to the seqan3::alignment_file_header object storing header information.
Definition: record.hpp:223
decltype(auto) reference_sequence() &&
The (reference) "sequence" information, usually a range of nucleotides or amino acids.
Definition: record.hpp:181
decltype(auto) mapping_quality() &&
The mate pair information given as a std::tuple of reference name, offset and template length.
Definition: record.hpp:328
decltype(auto) reference_position() &&
Sequence (REF_SEQ) relative start position (0-based), unsigned value.
Definition: record.hpp:202
sam_record(sam_record const &)=default
Defaulted.
decltype(auto) reference_id() &&
The identifier of the (reference) sequence that SEQ was aligned to.
Definition: record.hpp:160
decltype(auto) flag() &&
The alignment flag (bit information), uint16_t value.
Definition: record.hpp:244
sam_record & operator=(sam_record const &)=default
Defaulted.
decltype(auto) base_qualities() &&
The qualities, usually in phred-score notation.
Definition: record.hpp:97
typename base_t::base_type tuple_base_t
The underlying std::tuple class.
Definition: record.hpp:32
decltype(auto) tags() &&
The optional tags in the SAM format, stored in a dictionary.
Definition: record.hpp:370
sam_record()=default
Defaulted.
sam_record(sam_record &&)=default
Defaulted.
decltype(auto) mate_position() &&
The mate pair information with the position.
Definition: record.hpp:286
typename base_t::template field_constant< f > field_constant
A type alias for std::integral_constant.
Definition: record.hpp:36
~sam_record()=default
Defaulted.
decltype(auto) alignment() &&
The (pairwise) alignment stored in an seqan3::alignment object.
Definition: record.hpp:139
decltype(auto) template_length() &&
The mate pair information with the template length.
Definition: record.hpp:307
decltype(auto) id() &&
The identifier, usually a string.
Definition: record.hpp:55
Subconcept definition for seqan3::tuple_like to test for std::tuple_size-interface.
The generic concept for a (biological) sequence.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
SeqAn specific customisations in the standard namespace.
Provides the seqan3::record template and the seqan3::field enum.
The class template that file records are based on; behaves like an std::tuple.
Definition: record.hpp:223
static decltype(auto) get_impl(field_constant< f >, tuple_t &&record_as_tuple)
This is basically the seqan3::get<f>(static_cast<tuple>(record)) implementation.
Definition: record.hpp:281
detail::transfer_template_args_onto_t< field_types, std::tuple > base_type
A specialisation of std::tuple.
Definition: record.hpp:247