20 #include <type_traits> 25 #include <range/v3/algorithm/equal.hpp> 39 #include <seqan3/io/detail/record.hpp> 175 SEQAN3_CONCEPT StructureFileInputTraits = requires(t v)
179 requires WritableAlphabet<typename t::seq_alphabet>;
180 requires WritableAlphabet<typename t::seq_legal_alphabet>;
181 requires ExplicitlyConvertibleTo<typename t::seq_legal_alphabet, typename t::seq_alphabet>;
182 requires SequenceContainer<typename t::template seq_container<typename t::seq_alphabet>>;
189 requires WritableAlphabet<typename t::id_alphabet>;
190 requires SequenceContainer<typename t::template id_container<typename t::id_alphabet>>;
197 requires std::is_floating_point_v<typename t::bpp_prob>;
220 requires std::is_same_v<typename t::structure_alphabet, dssp9>
221 || RnaStructureAlphabet<typename t::structure_alphabet>;
222 requires SequenceContainer<typename t::template structure_container<typename t::structure_alphabet>>;
230 <
typename t::template structured_seq_alphabet
231 <
typename t::seq_alphabet,
typename t::structure_alphabet>,
232 typename t::seq_alphabet,
typename t::structure_alphabet>,
233 typename t::template structured_seq_alphabet<typename t::seq_alphabet, typename t::structure_alphabet>>;
245 requires std::is_floating_point_v<typename t::energy_type::value_type>;
246 requires SequenceContainer<typename t::template energy_container<typename t::energy_type>>;
249 requires std::is_floating_point_v<typename t::react_type>;
250 requires SequenceContainer<typename t::template react_container<typename t::react_type>>;
257 requires WritableAlphabet<typename t::comment_alphabet>;
258 requires SequenceContainer<typename t::template comment_container<typename t::comment_alphabet>>;
266 requires SequenceContainer<typename t::template offset_container<typename t::offset_type>>;
303 template<
typename _seq_alphabet>
307 template<
typename _seq_container>
316 template<
typename _
id_alphabet>
320 template<
typename _
id_container>
332 template<
typename _bpp_prob,
typename _bpp_partner>
336 template<
typename _bpp_item>
340 template<
typename _bpp_queue>
344 template<
typename _bpp_container>
353 template<
typename _structure_alphabet>
357 template<
typename _structure_container>
363 template<
typename _seq_alphabet,
typename _structure_alphabet>
367 template<
typename _structured_seq_alphabet>
371 template<
typename _structured_seq_container>
380 template<
typename _energy_type>
389 template<
typename _react_type>
393 template<
typename _react_container>
402 template<
typename _comment_alphabet>
406 template<
typename _comment_container>
415 template<
typename _offset_type>
436 template<
typename _seq_alphabet,
typename _structure_alphabet>
586 detail::TypeListOfStructureFileInputFormats valid_formats_
588 Char stream_char_type_ =
char>
620 static_assert([]() constexpr
622 for (
field f : selected_field_ids::as_array)
623 if (!field_ids::contains(f))
627 "You selected a field that is not valid for structure files, please refer to the documentation " 628 "of structure_file_input::field_ids for the accepted values.");
630 static_assert([]() constexpr
635 }(),
"You may not select field::STRUCTURED_SEQ and either of field::SEQ and field::STRUCTURE " 636 "at the same time.");
643 using seq_type =
typename traits_type::template seq_container<typename traits_type::seq_alphabet>;
646 using id_type =
typename traits_type::template id_container<typename traits_type::id_alphabet>;
648 using bpp_type =
typename traits_type::template bpp_container
649 <
typename traits_type::template bpp_queue
650 <
typename traits_type::template bpp_item
651 <
typename traits_type::bpp_prob,
typename traits_type::bpp_partner>>>;
653 using structure_type =
typename traits_type::template structure_container
654 <
typename traits_type::structure_alphabet>;
657 <
typename traits_type::template structured_seq_alphabet
658 <
typename traits_type::seq_alphabet,
typename traits_type::structure_alphabet>>;
662 using react_type =
typename traits_type::template react_container<typename traits_type::react_type>;
664 using comment_type =
typename traits_type::template comment_container
665 <
typename traits_type::comment_alphabet>;
683 using seq_column_type =
typename traits_type::template seq_container_container<seq_type>;
686 using id_column_type =
typename traits_type::template id_container_container<id_type>;
688 using bpp_column_type =
typename traits_type::template bpp_container_container<bpp_type>;
734 using iterator = detail::in_file_iterator<structure_file_input>;
775 primary_stream{
new std::ifstream{filename, std::ios_base::in | std::ios::binary}, stream_deleter_default}
777 if (!primary_stream->good())
778 throw file_open_error{
"Could not open file " + filename.
string() +
" for reading."};
781 secondary_stream = detail::make_secondary_istream(*primary_stream, filename);
784 detail::set_format(format, filename);
805 template<IStream2 stream_t, StructureFileInputFormat file_format>
807 file_format
const & SEQAN3_DOXYGEN_ONLY(format_tag),
809 primary_stream{&stream, stream_deleter_noop},
810 format{detail::structure_file_input_format<file_format>{}}
812 static_assert(meta::in<valid_formats, file_format>::value,
813 "You selected a format that is not in the valid_formats of this file.");
816 secondary_stream = detail::make_secondary_istream(*primary_stream);
823 template<IStream2 stream_t, StructureFileInputFormat file_format>
825 file_format
const & SEQAN3_DOXYGEN_ONLY(format_tag),
827 primary_stream{
new stream_t{std::move(stream)}, stream_deleter_default},
828 format{detail::structure_file_input_format<file_format>{}}
830 static_assert(meta::in<valid_formats, file_format>::value,
831 "You selected a format that is not in the valid_formats of this file.");
834 secondary_stream = detail::make_secondary_istream(*primary_stream);
906 return record_buffer;
918 static_assert(structure_file_input::selected_field_ids::contains(f),
919 "You requested a field via get that was not selected for the file.");
923 return seqan3::get<f>(file.columns_buffer);
930 return std::move(get<f>(file));
937 static_assert(i < structure_file_input::selected_field_ids::as_array.
size(),
938 "You requested a field number larger than the number of selected fields for the file.");
941 return std::get<i>(file.columns_buffer);
948 return std::move(get<i>(file));
957 return std::get<t>(file.columns_buffer);
964 return std::move(get<t>(file));
995 stream_ptr_t primary_stream{
nullptr, stream_deleter_noop};
997 stream_ptr_t secondary_stream{
nullptr, stream_deleter_noop};
1003 using format_type =
typename detail::variant_from_tags<valid_formats, detail::structure_file_input_format>::type;
1009 void read_next_record()
1012 record_buffer.clear();
1022 assert(!format.valueless_by_exception());
1029 "You may not select field::STRUCTURED_SEQ and field::STRUCTURE at the same time.");
1030 static_assert(!selected_field_ids::contains(
field::SEQ),
1031 "You may not select field::STRUCTURED_SEQ and field::SEQ at the same time.");
1032 f.read(*secondary_stream,
1034 detail::get_or_ignore<field::STRUCTURED_SEQ>(record_buffer),
1035 detail::get_or_ignore<field::ID>(record_buffer),
1036 detail::get_or_ignore<field::BPP>(record_buffer),
1037 detail::get_or_ignore<field::STRUCTURED_SEQ>(record_buffer),
1038 detail::get_or_ignore<field::ENERGY>(record_buffer),
1039 detail::get_or_ignore<field::REACT>(record_buffer),
1040 detail::get_or_ignore<field::REACT_ERR>(record_buffer),
1041 detail::get_or_ignore<field::COMMENT>(record_buffer),
1042 detail::get_or_ignore<field::OFFSET>(record_buffer));
1046 f.read(*secondary_stream,
1048 detail::get_or_ignore<field::SEQ>(record_buffer),
1049 detail::get_or_ignore<field::ID>(record_buffer),
1050 detail::get_or_ignore<field::BPP>(record_buffer),
1051 detail::get_or_ignore<field::STRUCTURE>(record_buffer),
1052 detail::get_or_ignore<field::ENERGY>(record_buffer),
1053 detail::get_or_ignore<field::REACT>(record_buffer),
1054 detail::get_or_ignore<field::REACT_ERR>(record_buffer),
1055 detail::get_or_ignore<field::COMMENT>(record_buffer),
1056 detail::get_or_ignore<field::OFFSET>(record_buffer));
1066 auto & seq_column_buffer = detail::get_or_ignore<field::SEQ>(columns_buffer);
1067 auto & id_column_buffer = detail::get_or_ignore<field::ID>(columns_buffer);
1068 auto & bpp_column_buffer = detail::get_or_ignore<field::BPP>(columns_buffer);
1069 auto & structure_column_buffer = detail::get_or_ignore<field::STRUCTURE>(columns_buffer);
1070 auto & structured_seq_column_buffer = detail::get_or_ignore<field::STRUCTURED_SEQ>(columns_buffer);
1071 auto & energy_column_buffer = detail::get_or_ignore<field::ENERGY>(columns_buffer);
1072 auto & react_column_buffer = detail::get_or_ignore<field::REACT>(columns_buffer);
1073 auto & react_err_column_buffer = detail::get_or_ignore<field::REACT_ERR>(columns_buffer);
1074 auto & comment_column_buffer = detail::get_or_ignore<field::COMMENT>(columns_buffer);
1075 auto & offset_column_buffer = detail::get_or_ignore<field::OFFSET>(columns_buffer);
1078 for (
auto & rec : *
this)
1080 if constexpr (selected_field_ids::contains(
field::SEQ))
1081 seq_column_buffer.push_back(std::move(seqan3::get<field::SEQ>(rec)));
1082 if constexpr (selected_field_ids::contains(
field::ID))
1083 id_column_buffer.push_back(std::move(seqan3::get<field::ID>(rec)));
1084 if constexpr (selected_field_ids::contains(
field::BPP))
1085 bpp_column_buffer.push_back(std::move(seqan3::get<field::BPP>(rec)));
1087 structure_column_buffer.push_back(std::move(seqan3::get<field::STRUCTURE>(rec)));
1089 structured_seq_column_buffer.push_back(std::move(seqan3::get<field::STRUCTURED_SEQ>(rec)));
1091 energy_column_buffer.push_back(std::move(seqan3::get<field::ENERGY>(rec)));
1092 if constexpr (selected_field_ids::contains(
field::REACT))
1093 react_column_buffer.push_back(std::move(seqan3::get<field::REACT>(rec)));
1095 react_err_column_buffer.push_back(std::move(seqan3::get<field::REACT_ERR>(rec)));
1097 comment_column_buffer.push_back(std::move(seqan3::get<field::COMMENT>(rec)));
1099 offset_column_buffer.push_back(std::move(seqan3::get<field::OFFSET>(rec)));
1112 template <IStream2 stream_type,
1114 StructureFileInputFormat file_format,
1115 detail::Fields selected_field_ids>
1116 structure_file_input(stream_type && stream, file_format
const &, selected_field_ids
const &)
1119 type_list<file_format>,
1123 template <IStream2 stream_type,
1124 StructureFileInputFormat file_format,
1125 detail::Fields selected_field_ids>
1126 structure_file_input(stream_type & stream, file_format
const &, selected_field_ids
const &)
1129 type_list<file_format>,
1148 seqan3::detail::Fields selected_field_ids,
1149 seqan3::detail::TypeListOfStructureFileInputFormats valid_formats,
1151 struct tuple_size<
seqan3::structure_file_input<traits_type, selected_field_ids, valid_formats, stream_char_t>>
1154 static constexpr
size_t value = selected_field_ids::as_array.
size();
1162 template<
size_t elem_no,
1164 seqan3::detail::Fields selected_field_ids,
1165 seqan3::detail::TypeListOfStructureFileInputFormats valid_formats,
1167 struct tuple_element<elem_no,
1168 seqan3::structure_file_input<traits_type, selected_field_ids, valid_formats, stream_char_t>>
1169 : tuple_element<elem_no, typename seqan3::structure_file_input<traits_type,
1172 stream_char_t>::file_as_tuple_type>
A seqan3::alphabet_tuple_base that joins an aminoacid alphabet with a protein structure alphabet...
Definition: structured_aa.hpp:55
The "sequence", usually a range of nucleotides or amino acids.
The protein structure alphabet of the characters "HGIEBTSCX".
Definition: dssp9.hpp:60
Provides exceptions used in the I/O module.
Sequence and fixed interactions combined in one range.
Energy of a folded sequence, represented by one float number.
The five letter RNA alphabet of A,C,G,U and the unknown character N.
Definition: rna5.hpp:46
This concept encompasses exactly the types char, signed char, unsigned char, wchar_t, char16_t and char32_t.
Comment field of arbitrary content, usually a string.
Meta-header for the structure module. It includes all headers from alphabet/structure/.
SeqAn specific customisations in the standard namespace.
::ranges::size size
Alias for ranges::size. Obtains the size of a range whose size can be calculated in constant time...
Definition: ranges:189
The main SeqAn3 namespace.
Base pair probability matrix of interactions, usually a matrix of float numbers.
Provides seqan3::rna5, container aliases and string literals.
Provides seqan3::concatenated_sequences.
Provides seqan3::rna15, container aliases and string literals.
The twenty-seven letter amino acid alphabet.
Definition: aa27.hpp:43
A class template that holds a choice of seqan3::field.
Definition: record.hpp:127
Container that stores sequences concatenated internally.
Definition: concatenated_sequences.hpp:89
Provides alphabet adaptations for standard char types.
Reactivity error values given in a vector corresponding to REACT.
Provides the seqan3::record template and the seqan3::field enum.
Sequence (SEQ) relative start position (0-based), unsigned value.
The identifier, usually a string.
The 15 letter RNA alphabet, containing all IUPAC smybols minus the gap.
Definition: rna15.hpp:48
Fixed interactions, usually a string of structure alphabet characters.
A seqan3::alphabet_tuple_base that joins a nucleotide alphabet with an RNA structure alphabet...
Definition: structured_rna.hpp:57
Provides various type traits on generic types.
Meta-header for the aminoacid submodule; includes all headers from alphabet/aminoacid/.
::ranges::default_sentinel_t default_sentinel_t
Alias for ranges::default_sentinel_t. Type of ranges::default_sentinel.
Definition: iterator:351
meta::list< types... > type_list
Type that contains multiple types, an alias for meta::list.
Definition: type_list.hpp:27
field
An enumerator for the fields used in file formats.Some of the fields are shared between formats...
Definition: record.hpp:63
Reactivity values of the sequence characters given in a vector of float numbers.
Provides the seqan3::detail::in_file_iterator class template.
This header includes C++17 filesystem support and imports it into namespace seqan3::filesystem (indep...