[go: up one dir, main page]

0% found this document useful (0 votes)
79 views7 pages

Symmetry-Corrected RMSD Calculations in Python

Uploaded by

mayaazwir
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views7 pages

Symmetry-Corrected RMSD Calculations in Python

Uploaded by

mayaazwir
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

Meli and Biggin J Cheminform (2020) 12:49

https://doi.org/10.1186/s13321-020-00455-2 Journal of Cheminformatics

SOFTWARE Open Access

spyrmsd: symmetry‑corrected RMSD


calculations in Python
Rocco Meli* and Philip C. Biggin

Abstract
Root mean square displacement (RMSD) calculations play a fundamental role in the comparison of different con-
formers of the same ligand. This is particularly important in the evaluation of protein-ligand docking, where different
ligand poses are generated by docking software and their quality is usually assessed by RMSD calculations. Unfor-
tunately, many RMSD calculation tools do not take into account the symmetry of the molecule, remain difficult to
integrate flawlessly in cheminformatics and machine learning pipelines—which are often written in Python—or
are shipped within large code bases. Here we present a new open-source RMSD calculation tool written in Python,
designed to be extremely lightweight and easy to integrate into existing software.
Keywords: RMSD, Symmetry, Software, Python

Introduction atoms of different conformers of the same ligand. In dif-


Computational structure-based drug discovery has ferent words, atoms are often assumed to be labelled
steadily gained traction partially thanks to the constant according to their position in a coordinate file (or data
improvements in available software, now often free and structure) and they are paired according to such label.
open source. Protein-ligand docking in particular is now This assumption breaks down when such labels are not
a standard tool employed in the early stages of drug dis- conserved—i.e. the order of atoms is different in the two
covery pipelines in order to screen possible drugs acting structures being compared—and/or for symmetric mol-
on a known target of interest. ecules. In the case of symmetric molecules, different
Protein-ligand docking consists of the prediction of binding poses can be chemically identical but different in
binding modes and binding affinity of a (flexible) ligand terms of atom-atom mapping. Since molecular connec-
to a target of known structure. The performance of dock- tivity is naturally represented by graphs (atoms as verti-
ing programs is often assessed by their ability to reproduce ces and bonds as edges), tools from graph theory can be
the crystallographic pose of the bound ligand. A com- used to obtain the correct atom-atom mapping for two
mon metric to evaluate the difference between the pre- different conformers of the same molecule, thus avoiding
dicted binding pose and the crystallographic pose is the the problems outlined above.
heavy-atoms root mean square displacement (RMSD) [1], Here we present a new Python tool, spyrmsd, for the
although other metrics have been suggested [2]. RMSD calculation of symmetry-corrected RMSDs based on
calculations are also used in other contexts, for example graph isomorphisms.
for the evaluation of diversity in generated conformers [3].
Many simple scripts to compute RMSDs are based on Implementation
the assumption of a direct one-to-one mapping between spyrmsd is implemented in pure Python and there-
fore it is easy to integrate in existing Python libraries
and Python pipelines, particularly common in chemin-
*Correspondence: rocco.meli@biodtp.ox.ac.uk formatics and machine learning projects. In this section
Department of Biochemistry, South Parks Rd., Oxford OX1 3QU, UK we describe the implementation of the different types of

© The Author(s) 2020. This article is licensed under a Creative Commons Attribution 4.0 International License, which permits use, sharing,
adaptation, distribution and reproduction in any medium or format, as long as you give appropriate credit to the original author(s) and
the source, provide a link to the Creative Commons licence, and indicate if changes were made. The images or other third party material
in this article are included in the article’s Creative Commons licence, unless indicated otherwise in a credit line to the material. If material
is not included in the article’s Creative Commons licence and your intended use is not permitted by statutory regulation or exceeds the
permitted use, you will need to obtain permission directly from the copyright holder. To view a copy of this licence, visit http://creat​iveco​
mmons​.org/licen​ses/by/4.0/. The Creative Commons Public Domain Dedication waiver (http://creat​iveco​mmons​.org/publi​cdoma​in/
zero/1.0/) applies to the data made available in this article, unless otherwise stated in a credit line to the data.
Meli and Biggin J Cheminform (2020) 12:49 Page 2 of 7

RMSD calculations implemented in spyrmsd, their use,


and their shortcomings.

Standard RMSD
Let us call A and B the N × 3 matrices of atomic coordi-
nates of two conformers A and B of the same molecule.
The standard RMSD is simply defined as

1 
 N  2
RMSDstandard =  (Aij − Bij )2 .
N
i=1 j=0

If we define the displacement ri = ai − bi—where ai is


the i-th row of A and bi is the i-th row of B—the standard
RMSD can be written more compactly as


1  N
RMSDstandard =  ri2 . (1)
N
i=1

This simple formula, which assumes the atomic coordi-


nates to be provided in the same order for both conform-
Fig. 1 Atom–atom mapping for the benzene molecule after a mirror
ers, is easy to compute. In spyrmsd the calculation of operation with and without symmetry correction
RMSDstandard is vectorised using numpy [4] for speed.
A serious drawback of standard RMSD calculations is
that they do not take into account molecular symmetry.
This is problematic since atoms of the same specie are where
intrinsically indistinguishable and therefore symme- N −1
try operations conserve molecular properties. Figure 1 Sij =

Bki Akj .
shows the atom–atom mapping for benzene with and
k=0
without symmetry correction after a mirror operation;
it is clear that a simple positional atom–atom mapping The minimum RMSD is then given by [5]
leads to artificially inflated results. Symmetry corrections 
would lead to the correct result expected with indistin- GA + GB − 2max
RMSDmin = (2)
guishable atoms. N
where GA = Tr AT A , GB = Tr BT B and max is the
Quaternion characteristic polynomial method maximum eigenvalue of K . The eigenvalues of K can be
Standard RMSD calculations take into account the possi- obtained by finding the roots of the characteristic poly-
ble translations between the two conformers. In order to nomial P() = det (K − I) [6], where I is the identity
measure conformational similarity—and neglect transla- matrix. For the matrix K the characteristic polynomial is
tions—the RMSD can be computed on optimally super- given by [5]
imposed structures. This minimised RMSD for a pair of
molecules can be computed efficiently using the quater- P() = 4 + C2 2 + C1  + C0 ,
nion characteristic polynomial (QCP) method [5], which
circumvent the need of finding orthogonal (rigid-body) where C2 = −2 Tr MT M (with M = BT A ),
rotations and special considerations for edge cases. C1 = −8 det M and C0 = det K . The largest characteristic
The QCP methods is based on the calculation a 4 × 4 polynomial root P(max ) = 0 can be efficiently computed
symmetric key matrix [5]

S00 + S11 + S22 S12 − S21 S20 − S02 S01 − S10


 
S00 − S11 − S22 S01 + S10 S20 + S02
K=
 
− S00 + S11 − S22 S12 + S21 
− S00 − S11 + S22
Meli and Biggin J Cheminform (2020) 12:49 Page 3 of 7

using the Newton-Raphson method [7] starting from the


initial guess (GA + GB )/2 [5].
Care should be taken when the two molecules A and
B overlap perfectly. In such case, max = (GA + GB )/2
and therefore the term GA + GB − 2max in Eq. (2) can
become negative due to numerical errors.
In spyrmsd the solution of the characteristic poly-
nomial equation P(max ) = 0 is based on the Newton–
Raphson method implemented in scipy [8] while other
vector and matrix operations are vectorised using numpy.

Hungarian algorithm for symmetry correction


The Hungarian algorithm [9, 10] is an algorithm to solve
the linear sum assignment problem [11] (also known as Fig. 2 Crystal pose (green) and second-best docking pose (cyan)
minimum weight matching in bipartite graphs) and has for the ligand of the protein-ligand complex 1DRJ. The Hungarian
been previously proposed as a method to introduce sym- method assigns the ring oxygen to an oxygen atom nearby
metry corrections in RMSD calculations [12]. If D is the (d = 1.6 Å, grey) while the graph isomorphism method correctly
maps one ring oxygen to the other (d = 3.3 Å, yellow). The Hungarian
N × N matrix of squared pairwise distances between all
method results in an artificially low RMSD of 1.00 Å, compared to the
atoms of the conformer A to all atoms of the conformer correct RMSD of 2.46 Å obtained with graph isomorphisms
B, the linear weight assignment problem consists in find-
ing the assignment matrix X that minimises the assign-
ment cost ij Dij Xij , where Xij = 1 if and only if atom

i of conformer A is assigned to atom j of conformer B. low RMSD values [13]. Figure 2 shows a simple situation
The RMSD computed using the Hungarian algorithm is where unphysical assignments arise and lead to a RMSD
therefore given by value lower than the correct one.

1 Graph isomorphisms for symmetry correction
 
 min Dij Xij ,
N X In order to overcome the problems of the Hungarian algo-
ij
rithm, tools from graph theory can be borrowed to per-
form an optimal atom-atom assignment based on graph
under the constraint that each row is assigned to exactly
isomorphisms. A molecule can be represented as a graph
one column and each column to exactly one row. This
G (V , E)—hereafter referred to molecular graph—where
definition is however problematic, since the solution of
the vertices V are associated to atoms and the edges E are
the assignment problem could end up pairing atoms of
associated to bonds. If two conformers A and B are rep-
different elements. In order to avoid this drawback, the
resented by graphs GA and GB, respectively, the mapping
assignment problem is solved for every element sepa-
of atoms of molecule A to atoms of molecule B becomes
rately [12]. If De is the Ne × Ne matrix of squared pair-
a graph isomorphism problem. An isomorphism between
wise distances between atoms of element e of conformer
graphs GA and GB is a bijective mapping of the vertices
A to atoms of element e of conformer B, the RMSD com-
of graph A to vertices of graph B that preserves the edge
puted using the Hungarian algorithm is given by
structure of the graphs (molecular connectivity in the
case of molecular graphs). With the bijective mapping

1
 
connecting vertices (atoms) of GA to vertices (atoms) of GB

RMSDHungarian =  min Dije Xije ,
N e X e
the RMSD between the two molecules can be computed
ij
using the standard RMSD formulation of Eq. (1).
where Xije = 1 if and only if atom i of element e in con- spyrmsd can leverage networkx [14] or graph-
former A is assigned to atom j of element e in conformer tool [15] for graph representation and graph matching.
B and were the sum on e runs over all elements of the All possible graph isomorphisms are computed using the
molecule. VF2 algorithm [16] and the lowest RMSD among all iso-
Even when the Hungarian algorithm is used to assign morphisms is retained.
atoms of the same element, problems can arise from the The graph isomorphism problem is a non-polyno-
fact that the algorithm is not aware of the overall molecu- mial (NP) problem and therefore symmetry-corrected
lar structure. This could result in unphysical assignments RMSD calculations are only suited for small to medium
which break the molecular graph and result in artificially sized molecules. In order to improve speed, graph
Meli and Biggin J Cheminform (2020) 12:49 Page 4 of 7

isomorphisms are cached by default when computing Results


the RMSD between multiple conformations of the same Testing
molecule. In order to test the correctness of spyrmsd against
OpenBabel’s obrms we redocked the PDBbind refined
set [20, 21] with smina [22] to generate different ligand
API
conformations. Ligand SDF files were downloaded
The main module of spyrmsd is the rmsd module, directly from the PDB [23] in order to avoid problems
where all the high-level RMSD functions are imple- with the connectivity present in the original PDBbind
mented. The following functions are available to the user: dataset. smina was run using the default settings with
protein PDB files stripped of water molecules. The top 10
• rmsd for the computation of the standard RMSD, binding poses were retained, resulting in a total of 40,439
• hrmsd for the computation of RMSD using the Hun- different conformations. The RMSD of each docked pose
garian algorithm, with respect to the crystal pose was computed using
• symmrmsd for the computation of symmetry-cor- symmetry-corrected RMSD with and without minimisa-
rected RMSD, tion (using the QCP method [5]).
Figures 3 and 4 show the relationship between RMSDs
symmrmsd should always be used for small molecules, in obtained with spyrmsd and obrms with and without min-
order to get the right symmetry-corrected RMSD. rmsd imisation. The RMSDs computed with the two softwares
is provided to compute the standard RMSD when sym- correlates perfectly (Spearman’s correlation coefficient of
metry does not play a role (or when the molecular graph 1.00) and present a maximum absolute error of 5 × 10−5 Å.
is too large to efficiently apply symmetry-corrections) This gives us great confidence that the two independent
and atoms are listed in the same order. hrmsd is pro- implementations are equivalent (Additional file 1).
vided for comparison with existing implementations and A comparison between the Hungarian method and
should not be used otherwise, because of the problems symmetry-corrected RMSD obtained via graph isomor-
outlined above. phisms is presented in Fig. 5. As previously pointed out,
The minimum RMSD (computed using the the Hungarian method can result in assignments incom-
QCP method [5]) can be obtained with the key- patible with the molecular connectivity and therefore
word minimize=True, with and without leads to artificially low RMSD values [13]. Therefore, the
symmetry-corrections.
spyrmsd is designed to be easily integrated in exist-
ing Python libraries or pipelines. For this reason the
application programming interface (API) is minimalistic:
only atomic coordinates and atomic numbers (rmsd and
hrmsd), and molecular adjacency matrices (symmrmsd)
have to be passed to RMSD functions in the form of
numpy arrays. This simple API makes spyrmsd com-
pletely agnostic of the way molecules are stored in dif-
ferent software, as long as they can provide the minimal
information required.

Standalone RMSD tool


spyrmsd also offers a standalone RMSD tool as a com-
mand line interface (CLI) exposing the functional-
ity of the rmsd and symmrmsd functions. The hrmsd
function is not exposed in the CLI, to avoid erroneous
calculations.
In the standalone tool, molecular input is handled by
OpenBabel [17] (via its Python interface pybel [18]) or
RDKit [19]. Such packages are also responsible for building Fig. 3 Comparison between obrms and spyrmsd for
the adjacency matrix representing the molecular graph. symmetry-corrected RMSD calculations. The mean squared error is
OpenBabel’s own RMSD calculation tool, obrms, is 3.80 × 10−11 while the Pearson’s correlation coefficient is 1.00. The
maximum absolute error is 5.00 × 10−5 amongst all 40439 system
expected to be faster than spyrmsd as a standalone tool
tested
since it does not have any Python overhead.
Meli and Biggin J Cheminform (2020) 12:49 Page 5 of 7

hrmsd function is provided only for comparison with


existing software and should not be used otherwise.

Speed
By design, spyrmsd is written fully in Python and lever-
ages fast libraries that are easy to install (using the pip
or conda package managers). This means that there is
some overhead compared to the most efficient imple-
mentations in other compiled libraries.
Figure 6 shows a speed comparison between spyrmsd
and obrms for 100 randomly selected systems. Error
bars are obtained by repeating the measurements 25
times. spyrmsd is usually comparable or an order of
magnitude slower than obrms. This is expected since
Python comes with some overhead compared to com-
piled code. The difference between the graph-tool
and networkx backends is more difficult to elucidate:
graph-tool seems to be generally slightly faster, but
networkx has clearly more variation from system to
Fig. 4 Comparison between obrms and spyrmsd for minimised system (see Fig. 7).
symmetry-corrected RMSD calculations. The mean squared error is Benchmarking was performed on an Apple MacBook
3.28 × 10−12 while the Pearson’s correlation coefficient is 1.00. The Pro (macOS 10.15) with a 2.6 GHz 6-Core Intel Core i7
maximum absolute error is 5.00 × 10−6 amongst all 40439 system
processor and 32 GB of 2400 MHz DDR4 memory (Addi-
tested
tional file 2).

Discussion
Despite being somewhat slower than other state-of-the-
art tools for RMSD calculation, we believe that spyrmsd
could be extremely useful to the community: it is a light-
weight tool with focussed functionality, it is easy to use
and integrate in existing Python codebases and pipelines,
and it is easy to install via popular package managers.

Easy installation
spyrmsd is available on the Python Package Index
(PyPI) [24] and via the conda package manager [25] on
the conda-forge channel [26]. This provides easy cross-
platform installation of spyrmsd and all its dependen-
cies to work as a library (with networkx). On macOS
and Linux, users can get some speed improvement by
installing graph-tool, which is also available via the
conda package manager.
In order to use spyrmsd as a standalone tool, users
will have to install either OpenBabel or RDKit with their
preferred installation method.

Easy integration in existing libraries


Fig. 5 Comparison between symmetry-correction performed
spyrmsd is easy to integrate into existing pipelines
with the Hungarian method or leveraging graph isomorphisms. thanks to its clean and simple API. Standard RMSD cal-
The Hungarian algorithm often results in artificially low RMSDs due culations require atomic coordinates and atomic num-
to atom-atom assignments breaking the molecular connectivity. bers only, while symmetry-corrected RMSD calculations
The green cross corresponds to the protein-ligand complex 1DRJ also require adjacency matrices in order to compute
analysed in Fig. 2
graph isomorphisms. Atomic coordinates and atomic
Meli and Biggin J Cheminform (2020) 12:49 Page 6 of 7

Fig. 6 RMSD calculation time (including input) for 100 randomly selected systems. Error bars indicate the standard deviation over 25 repeats.
spyrmsd is comparable or an order of magnitude slower than obrms

Fig. 7 RMSD calculation time (without input) for 100 randomly selected systems. Error bars indicate the standard deviation over 25 repeats.
networkx shows a large variability between systems, while graph-tool is more consistent

numbers are usually readily available in most Python easy-to-read reports. A code coverage of 100% is tar-
libraries dealing with molecular file formats, while the geted, so that all lines of code are executed at least once
adjacency matrix of a molecule is easy to build from bond during tests.
connectivity. The code is compatible with Python 3.6 or above. Static
We believe that the simple API will favour the integration analysis tools are constantly applied to the code in order to
of spyrmsd in many existing libraries, bringing symmetry- catch errors that would be otherwise missed or discovered
corrected RMSD calculations to widely used packages. only during execution. We use mypy to perform static
checks [32] and flake8 to detect style and formatting
issues. Such tools help maintaining correctness and stabil-
Software best practices ity for future developments as well as a clean codebase.
The development of spyrmsd is based on modern soft- Finally, the code is documented using Python doc-
ware engineering best practices. The code is version-con- strings and the documentation is built automatically
trolled using git [27] and it is freely available on GitHub using sphinx [33]. This will likely make it easier to fully
(https​://githu​b.com/RMeli​/spyrm​sd) [28], released under understand the codebase thus facilitating the adoption of
the open-source and permissive MIT license. spyrmsd by other libraries.
The code is extensively tested using pytest [29]. Tests
are run automatically every time a new version of the Conclusion
code is pushed to GitHub thanks to Travis-CI bindings spyrmsd provides robust symmetry-corrected RMSD
for continuous integration [30]. The code coverage of the calculations with a clean and simple API that is easy to
test suite is reported on Codecov [31], which provides integrate in existing Python libraries and pipelines. We
Meli and Biggin J Cheminform (2020) 12:49 Page 7 of 7

believe that such a tool could be useful to the wider com- 3. O’Boyle NM, Vandermeersch T, Flynn CJ, Maguire AR, Hutchison GR (2011)
Confab—systematic generation of diverse low-energy conformers. J
munity of molecular modellers and cheminformaticians. Cheminf 3(1):8. https​://doi.org/10.1186/1758-2946-3-8
Future development of the software will focus on 4. van der Walt S, Colbert SC, Varoquaux G (2011) The numpy array: A struc-
improved automatic bond perception (to automatically ture for efficient numerical computation. Comput Sci Eng 13:98
5. Theobald DL (2005) Rapid calculation of rmsds using a quaternion-based
build molecular adjacency matrices) and speed. characteristic polynomial. Acta Cryst A 61:478–480
6. Roman S (2007) Advanced linear algebra. Springer, Berlin
Availability and requirements 7. Quarteroni A, Saleri F (2007) Numerical mathematics. Springer, Berlin
8. Virtanen P, Gommers R, Oliphant TE, Haberland M, Reddy T, Cournapeau
D, Burovski E, Peterson P, Weckesser W, Bright J, van der Walt SJ, Brett M,
• Project name: spyrmsd Wilson J, Jarrod Millman K, Mayorov N, Nelson ARJ, Jones E, Kern R, Larson
• Code: https​://githu​b.com/RMeli​/pyrms​d E, Carey CJ, Polat I, Feng Y, Moore EW (2019) Scipy 1.0–fundamental
algorithms for scientific computing in python. Nat Methods 17:261–272
• Docs: https​://spyrm​sd.readt​hedoc​s.io/ 9. Kuhn HW (1955) The hungarian method for the assignment problem. Nav
• Operating systems: Linux, macOS, Windows Res Logist Q 2:83–97
• Programming language: Python 10. Munkres J (1957) Algorithms for the assignment and transportation
problems. J Soc Indus Appl Math 5:32–38
• Other requirements: Python 3.6 or higher 11. Ignazio J, Cavalier TM (1994) Linear programming. Prentice-Hall, New York
• License: MIT 12. Allen WJ, Rizzo RC (2014) Implementation of the hungarian algorithm to
account for ligand symmetry and similarity in structure-based design. J
Chem Inf Model 54:518–529
13. Bell EW, Zhang Y (2019) Dockrmsd: an open-source tool for atom
Supplementary information mapping and rmsd calculation of symmetric molecules through graph
Supplementary information accompanies this paper at https​://doi. isomorphism. J Cheminf 11:9
org/10.1186/s1332​1-020-00455​-2. 14. Hagberg AA, Schult DA, Swart PJ (2008) Exploring network structure,
dynamics, and function using networkx. In: Proceedings of the 7th
Python in Science Conference. p. 11–5
Additional file 1. Comparison of correctness between spyrmsd and 15. graph-tool: Efficient network analysis. https​://graph​-tool.skewe​d.de/
obrms. 16. Cordella LP, Foggia P, Sansone C, Vento M (2004) A (sub)graph isomor-
phism algorithm for matching large graphs. IEEE Trans Pattern Anal Mach
Additional file 2. Speed comparison between spyrmsd (with net-
Intell 26:1367–1372
workx or graph-tool) and obrms.
17. O’Boyle NM, Banck M, James CA, Morley C, Vandermeersch T, Hutchison
GR (2011) Open babel: An open chemical toolbox. J Cheminf 33:121
Acknowledgements 18. O’Boyle NM, Morley C, Hutchison GR (2008) Pybel: a python wrapper for
This work was supported by funding from the Biotechnology and Biological the openbabel cheminformatics toolkit. Chem Cent J 2, 5
Sciences Research Council (BBSRC) [BB/MO11224/1] National Productivity 19. Rdkit: Open-source cheminformatics software. http://www.rdkit​.org/
Investment Fund (NPIF) [BB/S50760X/1] and Evotec (UK) via the Interdiscipli- 20. Wang R, Fang X, Lu Y, Wang S (2004) The pdbbind database: collection of
nary Biosciences DTP at the University of Oxford. The authors acknowledge binding affinities for protein-ligand complexes with known three-dimen-
fruitful interactions with Dr. Irfan Alibay. sional structures. J Med Chem 47:2977–2980
21. Liu Z, Li Y, Han L, Li J, Liu J, Zhao Z, Nie W, Liu Y, Wang R (2014) Pdb-wide
Authors’ contributions collection of binding data: current status of the pdbbind database. Bioin-
RM wrote spyrmsd. RM and PCB prepared the manuscript. Both authors read formatics 31:405–412
and approved the final manuscript. 22. Koes DR, Baumgartner MP, Camacho CJ (2013) Lessons learned in empiri-
cal scoring with smina from the csar 2011 benchmarking exercise. J
Data availibility statement Chem Inf Model 58:1893–1904
spyrmsd is available for download on PyPI and conda-forge, while the 23. RCSB protein data bank. https​://www.rcsb.org/
source code is available on GitHub under the MIT license: https​://githu​b.com/ 24. PyPI: Find, install and publish python packages with the python package
RMeli​/pyrms​d. The code used to produce the figures is included in the sup- index. https​://pypi.org/
plementary information. The results of docking are available on Zenodo (https​ 25. conda: Package, dependency and environment management for any
://doi.org/10.5281/zenod​o.37473​15). language. https​://conda​.io/en/lates​t/
26. conda-forge: A community-led collection of recipes, build infrastructure
Competing interests and distributions for the conda package manager. https​://conda​-forge​
The authors declare that they have no competing interests. .org/
27. Chacon S, Straub B (2014) Pro git. Apress
Received: 15 April 2020 Accepted: 21 August 2020 28. GitHub. https​://githu​b.com/
29. Krekel H, Oliveira B, Pfannschmidt R, Bruynooghe F, Laugher B, Bruhin F
(2014) pytest. https​://githu​b.com/pytes​t-dev/pytes​t
30. Travis CI. https​://travi​s-ci.org/
31. Codecov. https​://codec​ov.io/
32. mypy: Optional static typing for python. http://mypy-lang.org/
References
33. Sphinx: Python documentation generator. https​://www.sphin​x-doc.org/
1. Mukherjee S, Balius TE, Rizzo RC (2010) Docking validation resources:
protein family and ligand flexibility experiments. J Chem Inf Model
50:1986–2000 Publisher’s Note
2. Leung S, Bodkin M, von Delft F, Brennan P, Morris G (2019) Sucos is bet- Springer Nature remains neutral with regard to jurisdictional claims in pub-
ter than rmsd for evaluating fragment elaboration and docking poses. lished maps and institutional affiliations.
ChemRxiv. https​://doi.org/10.26434​/chemr​xiv.81002​03.v1

You might also like