File: test_nucleicacids.py

package info (click to toggle)
mdanalysis 2.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 116,696 kB
  • sloc: python: 92,135; ansic: 8,156; makefile: 215; sh: 138
file content (140 lines) | stat: -rw-r--r-- 4,594 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8
#
# MDAnalysis --- https://www.mdanalysis.org
# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors
# (see the file AUTHORS for the full list of names)
#
# Released under the Lesser GNU Public Licence, v2.1 or any higher version
#
# Please cite your use of MDAnalysis in published work:
#
# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler,
# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein.
# MDAnalysis: A Python package for the rapid analysis of molecular dynamics
# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th
# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy.
# doi: 10.25080/majora-629e541a-00e
#
# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein.
# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations.
# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787
#

import MDAnalysis as mda

import pytest

from pytest import approx

from MDAnalysis.analysis.nucleicacids import (
    NucPairDist,
    WatsonCrickDist,
    MajorPairDist,
    MinorPairDist,
)

from MDAnalysisTests.datafiles import RNA_PSF, RNA_PDB

from MDAnalysis.core.groups import ResidueGroup


@pytest.fixture(scope="module")
def u():
    return mda.Universe(RNA_PSF, RNA_PDB)


@pytest.fixture(scope="module")
def strand(unv=u):
    unv = mda.Universe(RNA_PSF, RNA_PDB)
    return unv.select_atoms("segid RNAA")


def test_empty_ag_error(strand):
    strand1 = ResidueGroup([strand.residues[0]])
    strand2 = ResidueGroup([strand.residues[1]])

    with pytest.raises(ValueError, match="returns an empty AtomGroup"):
        NucPairDist.select_strand_atoms(strand1, strand2, "UNK1", "O2")


@pytest.fixture(scope="module")
def wc_rna(strand, client_NucPairDist):
    strand1 = ResidueGroup([strand.residues[0], strand.residues[21]])
    strand2 = ResidueGroup([strand.residues[1], strand.residues[22]])

    WC = WatsonCrickDist(strand1, strand2)
    WC.run(**client_NucPairDist)
    return WC


def test_wc_dist_shape(wc_rna):
    assert wc_rna.results.distances.shape == (1, 2)


def test_wc_dist_results_keys(wc_rna):
    assert "distances" in wc_rna.results


def test_wc_dist(wc_rna):
    assert wc_rna.results.distances[0, 0] == approx(4.3874702, rel=1e-3)
    assert wc_rna.results.distances[0, 1] == approx(4.1716404, rel=1e-3)


def test_wc_dist_invalid_residue_types(u):
    strand = u.select_atoms("resid 1-10")
    strand1 = ResidueGroup([strand.residues[0], strand.residues[21]])
    strand2 = ResidueGroup([strand.residues[2], strand.residues[22]])
    with pytest.raises(ValueError, match="is not a valid nucleic acid"):
        WatsonCrickDist(strand1, strand2)


def test_selection_length_mismatch(strand):
    sel1 = strand.residues[1:10]
    sel2 = strand.residues[1:9]
    with pytest.raises(ValueError, match="Selections must be same length"):
        NucPairDist(sel1, sel2)


def test_wc_dist_deprecation_warning(strand):
    strand1 = [strand.residues[0], strand.residues[21]]
    strand2 = [strand.residues[1], strand.residues[22]]

    with pytest.deprecated_call():
        WatsonCrickDist(strand1, strand2)


def test_wc_dist_strand_verification(strand):
    strand1 = [strand.residues[0], strand[0]]
    strand2 = [strand.residues[1], strand.residues[22]]

    with pytest.raises(TypeError, match="contains non-Residue elements"):
        WatsonCrickDist(strand1, strand2)


@pytest.mark.parametrize("key", [0, 1, 2, "parsnips", "time", -1])
def test_wc_dis_results_keyerrs(wc_rna, key):
    with pytest.raises(KeyError, match=f"{key}"):
        wc_rna.results[key]


def test_minor_dist(strand, client_NucPairDist):
    strand1 = ResidueGroup([strand.residues[2], strand.residues[19]])
    strand2 = ResidueGroup([strand.residues[16], strand.residues[4]])

    MI = MinorPairDist(strand1, strand2)
    MI.run(**client_NucPairDist)

    assert MI.results.distances[0, 0] == approx(15.06506, rel=1e-3)
    assert MI.results.distances[0, 1] == approx(3.219116, rel=1e-3)


def test_major_dist(strand, client_NucPairDist):
    strand1 = ResidueGroup([strand.residues[1], strand.residues[4]])
    strand2 = ResidueGroup([strand.residues[11], strand.residues[8]])

    MA = MajorPairDist(strand1, strand2)
    MA.run(**client_NucPairDist)

    assert MA.results.distances[0, 0] == approx(26.884272, rel=1e-3)
    assert MA.results.distances[0, 1] == approx(13.578535, rel=1e-3)