Skip to content

Commit

Permalink
[MISC] introduce new concepts seqan3::detail::(writable_)pairwise_ali…
Browse files Browse the repository at this point in the history
…gnment

This PR finishes task seqan/product_backlog#60
by implementing seqan3::detail::(writable_)pairwise_alignment.
  • Loading branch information
marehr committed Jan 28, 2021
1 parent e285c14 commit 2ebc56d
Show file tree
Hide file tree
Showing 6 changed files with 167 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -510,16 +510,4 @@ inline bool constexpr all_model_aligned_seq = (aligned_sequence<elems> && ...);
*/
template <typename ...elems>
inline bool constexpr all_model_aligned_seq<type_list<elems...>> = all_model_aligned_seq<elems...>;

/*!\brief True, if each type models seqan3::writable_aligned_sequence; false otherwise.
* \tparam elems The pack of types to be tested.
*/
template <typename ...elems>
inline bool constexpr all_model_writable_aligned_seq = (writable_aligned_sequence<elems> && ...);

/*!\brief True, if each type in the seqan3::type_list models seqan3::writable_aligned_sequence; false otherwise.
* \tparam elems The pack of types to be tested.
*/
template <typename ...elems>
inline bool constexpr all_model_writable_aligned_seq<type_list<elems...>> = all_model_writable_aligned_seq<elems...>;
} // namespace seqan3::detail
54 changes: 54 additions & 0 deletions include/seqan3/alignment/detail/pairwise_alignment_concept.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// -----------------------------------------------------------------------------------------------------
// Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
// Copyright (c) 2016-2020, Knut Reinert & MPI für molekulare Genetik
// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
// -----------------------------------------------------------------------------------------------------

/*!\file
* \brief Provides seqan3::detail::pairwise_alignment and seqan3::detail::writable_pairwise_alignment.
* \author Marcel Ehrhardt <marcel.ehrhardt AT fu-berlin.de>
*/

#pragma once

#include <seqan3/alignment/aligned_sequence/aligned_sequence_concept.hpp>

namespace seqan3::detail
{

/*!\interface seqan3::detail::pairwise_alignment < >
* \extends seqan3::pair_like
* \ingroup alignment
* \brief A concept that models a pairwise alignment type.
*
* \details
*
* A pairwise alignment is a seqan3::pair_like of two seqan3::aligned_sequence's.
*/
//!\cond
template <typename pairwise_alignment_t>
SEQAN3_CONCEPT pairwise_alignment =
pair_like<pairwise_alignment_t> &&
aligned_sequence<std::tuple_element_t<0, std::remove_reference_t<pairwise_alignment_t>>> &&
aligned_sequence<std::tuple_element_t<1, std::remove_reference_t<pairwise_alignment_t>>>;
//!\endcond

/*!\interface seqan3::detail::writable_pairwise_alignment < >
* \extends seqan3::detail::pairwise_alignment
* \ingroup alignment
* \brief A concept that models a writable pairwise alignment type.
*
* \details
*
* A writable pairwise alignment is a seqan3::pair_like of two seqan3::writable_aligned_sequence's.
*/
//!\cond
template <typename pairwise_alignment_t>
SEQAN3_CONCEPT writable_pairwise_alignment =
pairwise_alignment<pairwise_alignment_t> &&
writable_aligned_sequence<std::tuple_element_t<0, std::remove_reference_t<pairwise_alignment_t>>> &&
writable_aligned_sequence<std::tuple_element_t<1, std::remove_reference_t<pairwise_alignment_t>>>;
//!\endcond

} // namespace seqan3::detail
8 changes: 2 additions & 6 deletions include/seqan3/io/alignment_file/detail.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include <seqan3/std/ranges>
#include <sstream>

#include <seqan3/alignment/aligned_sequence/aligned_sequence_concept.hpp>
#include <seqan3/alignment/detail/pairwise_alignment_concept.hpp>
#include <seqan3/alphabet/cigar/cigar.hpp>
#include <seqan3/core/debug_stream/detail/to_string.hpp>
#include <seqan3/range/views/single_pass_input.hpp>
Expand Down Expand Up @@ -328,11 +328,7 @@ template <std::ranges::forward_range ref_seq_type, std::ranges::forward_range qu
* ATGCCCCGTTG--C
* ```
*/
template <tuple_like alignment_type>
//!\cond
requires (std::tuple_size_v<std::remove_cvref_t<alignment_type>> == 2) &&
detail::all_model_writable_aligned_seq<detail::tuple_type_list_t<alignment_type>>
//!\endcond
template <seqan3::detail::writable_pairwise_alignment alignment_type>
inline void alignment_from_cigar(alignment_type & alignment, std::vector<cigar> const & cigar_vector)
{
using std::get;
Expand Down
2 changes: 1 addition & 1 deletion include/seqan3/io/record.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ enum class field
comment, //!< Comment field of arbitrary content, usually a string.

// Fields unique to alignment io ...........................................
alignment, //!< The (pairwise) alignment stored in an seqan3::alignment object.
alignment, //!< The (pairwise) alignment stored in an object that models seqan3::detail::pairwise_alignment.
ref_id, //!< The identifier of the (reference) sequence that SEQ was aligned to.
ref_seq, //!< The (reference) "sequence" information, usually a range of nucleotides or amino acids.
ref_offset, //!< Sequence (REF_SEQ) relative start position (0-based), unsigned value.
Expand Down
1 change: 1 addition & 0 deletions test/unit/alignment/detail/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
seqan3_test(pairwise_alignment_concept_test.cpp)
109 changes: 109 additions & 0 deletions test/unit/alignment/detail/pairwise_alignment_concept_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
// -----------------------------------------------------------------------------------------------------
// Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
// Copyright (c) 2016-2020, Knut Reinert & MPI für molekulare Genetik
// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
// -----------------------------------------------------------------------------------------------------

#include <gtest/gtest.h>

#include <seqan3/alignment/detail/pairwise_alignment_concept.hpp>
#include <seqan3/alphabet/gap/gapped.hpp>
#include <seqan3/alphabet/nucleotide/dna4.hpp>
#include <seqan3/alphabet/nucleotide/dna5.hpp>

TEST(pairwise_alignment_concept, std_pair_gapped_sequences)
{
using gapped_sequence1_t = std::vector<seqan3::gapped<seqan3::dna4>>;
using gapped_sequence2_t = std::vector<seqan3::gapped<seqan3::dna4>>;
using alignment_t = std::pair<gapped_sequence1_t, gapped_sequence2_t>;

EXPECT_FALSE((seqan3::detail::pairwise_alignment<gapped_sequence1_t>));
EXPECT_FALSE((seqan3::detail::pairwise_alignment<gapped_sequence2_t>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t &>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const &>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t &&>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const &&>));
}

TEST(pairwise_alignment_concept, std_tuple_gapped_sequences)
{
using gapped_sequence1_t = std::vector<seqan3::gapped<seqan3::dna4>> const;
using gapped_sequence2_t = std::vector<seqan3::gapped<seqan3::dna5>>;
using alignment_t = std::tuple<gapped_sequence1_t, gapped_sequence2_t>;

EXPECT_FALSE((seqan3::detail::pairwise_alignment<gapped_sequence1_t>));
EXPECT_FALSE((seqan3::detail::pairwise_alignment<gapped_sequence2_t>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t &>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const &>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t &&>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const &&>));
}

TEST(pairwise_alignment_concept, std_tuple_gap_sequence)
{
using gap_sequence1_t = std::vector<seqan3::gap> const;
using gap_sequence2_t = std::vector<seqan3::gap>;
using alignment_t = std::tuple<gap_sequence1_t, gap_sequence2_t>;

EXPECT_FALSE((seqan3::detail::pairwise_alignment<gap_sequence1_t>));
EXPECT_FALSE((seqan3::detail::pairwise_alignment<gap_sequence2_t>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t &>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const &>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t &&>));
EXPECT_TRUE((seqan3::detail::pairwise_alignment<alignment_t const &&>));
}

TEST(writable_pairwise_alignment_concept, std_pair_gapped_sequences)
{
using gapped_sequence1_t = std::vector<seqan3::gapped<seqan3::dna4>>;
using gapped_sequence2_t = std::vector<seqan3::gapped<seqan3::dna4>>;
using alignment_t = std::pair<gapped_sequence1_t, gapped_sequence2_t>;

EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<gapped_sequence1_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<gapped_sequence2_t>));
EXPECT_TRUE((seqan3::detail::writable_pairwise_alignment<alignment_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const>));
EXPECT_TRUE((seqan3::detail::writable_pairwise_alignment<alignment_t &>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const &>));
EXPECT_TRUE((seqan3::detail::writable_pairwise_alignment<alignment_t &&>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const &&>));
}

TEST(writable_pairwise_alignment_concept, std_tuple_gapped_sequences)
{
using gapped_sequence1_t = std::vector<seqan3::gapped<seqan3::dna4>>;
using gapped_sequence2_t = std::vector<seqan3::gapped<seqan3::dna5>> const;
using alignment_t = std::tuple<gapped_sequence1_t, gapped_sequence2_t>;

EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<gapped_sequence1_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<gapped_sequence2_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t &>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const &>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t &&>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const &&>));
}

TEST(writable_pairwise_alignment_concept, std_tuple_gap_sequence)
{
using gap_sequence1_t = std::vector<seqan3::gap>;
using gap_sequence2_t = std::vector<seqan3::gap> const;
using alignment_t = std::tuple<gap_sequence1_t, gap_sequence2_t>;

EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<gap_sequence1_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<gap_sequence2_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t &>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const &>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t &&>));
EXPECT_FALSE((seqan3::detail::writable_pairwise_alignment<alignment_t const &&>));
}

0 comments on commit 2ebc56d

Please sign in to comment.