Skip to content

Commit 156ca53

Browse files
authored
Changes encore.hes() details output (#2484)
* Fixes #2465 * Removed arrayfication of `encore.hes` details. * changed hes so it always returns details (instead of needing to use `details=True` This is more consistent with the behaviour of `ces` and `dres`. Previously, `None` was returned instead if the details flag was `False`. * removed `details` kwarg from `hes()` * updated docstrings; * updated `encore.similarity` docs to Python 3 syntax * added changes to CHANGELOG
1 parent 7b87dc3 commit 156ca53

File tree

2 files changed

+32
-33
lines changed

2 files changed

+32
-33
lines changed

package/CHANGELOG

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ Enhancements
8686
* Improve the distance search in water bridge analysis with capped_distance (PR #2480)
8787

8888
Changes
89+
* encore.hes() doesn't accept the details keyword anymore, it always returns
90+
the relevant details instead, consistently with ces() and dres(), in the
91+
form of a dictionary (Issue #2465)
8992
* Removed instant selectors on Universe and Group objects (e.g. AtomGroup.C,
9093
Segment.r1, Universe.s4AKE). Use select_atoms instead (Issue #1377)
9194
* Calling Universe() now raises a TypeError advising you to use Universe.empty.

package/MDAnalysis/analysis/encore/similarity.py

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,16 @@
7676
>>> import MDAnalysis.analysis.encore as encore
7777
>>> from MDAnalysis.tests.datafiles import PSF, DCD, DCD2
7878
79-
8079
To calculate the Harmonic Ensemble Similarity (:func:`hes`)
8180
two ensemble objects are first created and then used for calculation: ::
8281
8382
>>> ens1 = Universe(PSF, DCD)
8483
>>> ens2 = Universe(PSF, DCD2)
85-
>>> print encore.hes([ens1, ens2])
86-
(array([[ 0. , 38279683.95892926],
87-
[ 38279683.95892926, 0. ]]), None)
84+
>>> HES, details = encore.hes([ens1, ens2])
85+
>>> print(HES)
86+
[[ 0. , 38279683.95892926],
87+
[ 38279683.95892926, 0. ]]
8888
89-
Here None is returned in the array as the default details parameter is False.
9089
HES can assume any non-negative value, i.e. no upper bound exists and the
9190
measurement can therefore be used as an absolute scale.
9291
@@ -100,7 +99,7 @@
10099
>>> ens1 = Universe(PSF, DCD)
101100
>>> ens2 = Universe(PSF, DCD2)
102101
>>> CES, details = encore.ces([ens1, ens2])
103-
>>> print CES
102+
>>> print(CES)
104103
[[ 0. 0.68070702]
105104
[ 0.68070702 0. ]]
106105
@@ -133,7 +132,7 @@
133132
134133
>>> DRES,details = encore.dres([ens1, ens2],
135134
distance_matrix = rmsd_matrix)
136-
>>> print DRES
135+
>>> print(DRES)
137136
[[ 0. , 0.67453198]
138137
[ 0.67453198, 0. ]]
139138
@@ -721,7 +720,6 @@ def hes(ensembles,
721720
cov_estimator="shrinkage",
722721
weights='mass',
723722
align=False,
724-
details=False,
725723
estimate_error=False,
726724
bootstrapping_samples=100,
727725
calc_diagonal=False):
@@ -747,9 +745,6 @@ def hes(ensembles,
747745
Note: this changes the ensembles in-place, and will thus leave your
748746
ensembles in an altered state.
749747
(default is False)
750-
details : bool, optional
751-
Save the mean and covariance matrix for each
752-
ensemble in a numpy array (default is False).
753748
estimate_error : bool, optional
754749
Whether to perform error estimation (default is False).
755750
bootstrapping_samples : int, optional
@@ -762,8 +757,9 @@ def hes(ensembles,
762757
763758
Returns
764759
-------
765-
numpy.array (bidimensional)
766-
Harmonic similarity measurements between each pair of ensembles.
760+
hes, details : numpy.array, dictionary
761+
Harmonic similarity measurements between each pair of ensembles,
762+
and dict containing mean and covariance matrix for each ensemble
767763
768764
Notes
769765
-----
@@ -804,7 +800,7 @@ def hes(ensembles,
804800
>>> ens1 = Universe(PSF, DCD)
805801
>>> ens2 = Universe(PSF, DCD2)
806802
>>> HES, details = encore.hes([ens1, ens2])
807-
>>> print HES
803+
>>> print(HES)
808804
[[ 0. 38279683.95892926]
809805
[ 38279683.95892926 0. ]]
810806
@@ -813,7 +809,7 @@ def hes(ensembles,
813809
align everything to the current timestep in the first ensemble. Note that
814810
this changes the ens1 and ens2 objects:
815811
816-
>>> print encore.hes([ens1, ens2], align=True)[0]
812+
>>> print(encore.hes([ens1, ens2], align=True)[0])
817813
[[ 0. 6880.34140106]
818814
[ 6880.34140106 0. ]]
819815
@@ -823,9 +819,14 @@ def hes(ensembles,
823819
>>> from MDAnalysis.analysis import align
824820
>>> align.AlignTraj(ens1, ens1, select="name CA", in_memory=True).run()
825821
>>> align.AlignTraj(ens2, ens1, select="name CA", in_memory=True).run()
826-
>>> print encore.hes([ens1, ens2])[0]
822+
>>> print(encore.hes([ens1, ens2])[0])
827823
[[ 0. 7032.19607004]
828824
[ 7032.19607004 0. ]]
825+
826+
.. versionchanged:: 1.0.0
827+
hes doesn't accept the *details* argument anymore, it always returns the
828+
details of the calculation instead, in the form of a dictionary
829+
829830
"""
830831

831832
if not isinstance(weights, (list, tuple, np.ndarray)) and weights == 'mass':
@@ -937,15 +938,10 @@ def hes(ensembles,
937938
values[j, i] = value
938939

939940
# Save details as required
940-
if details:
941-
kwds = {}
942-
for i in range(out_matrix_eln):
943-
kwds['ensemble{0:d}_mean'.format(i + 1)] = xs[i]
944-
kwds['ensemble{0:d}_covariance_matrix'.format(i + 1)] = sigmas[i]
945-
details = np.array(kwds)
946-
947-
else:
948-
details = None
941+
details = {}
942+
for i in range(out_matrix_eln):
943+
details['ensemble{0:d}_mean'.format(i + 1)] = xs[i]
944+
details['ensemble{0:d}_covariance_matrix'.format(i + 1)] = sigmas[i]
949945

950946
return values, details
951947

@@ -1060,8 +1056,8 @@ def ces(ensembles,
10601056
10611057
>>> ens1 = Universe(PSF, DCD)
10621058
>>> ens2 = Universe(PSF, DCD2)
1063-
>>> CES,details = encore.ces([ens1,ens2])
1064-
>>> print CES
1059+
>>> CES, details = encore.ces([ens1,ens2])
1060+
>>> print(CES)
10651061
[[ 0. 0.68070702]
10661062
[ 0.68070702 0. ]]
10671063
@@ -1073,10 +1069,10 @@ def ces(ensembles,
10731069
>>> CES, details = encore.ces([ens1,ens2],
10741070
clustering_method = [encore.DBSCAN(eps=0.45),
10751071
encore.DBSCAN(eps=0.50)])
1076-
>>> print "eps=0.45: ", CES[0]
1072+
>>> print("eps=0.45: ", CES[0])
10771073
eps=0.45: [[ 0. 0.20447236]
10781074
[ 0.20447236 0. ]]
1079-
>>> print "eps=0.5: ", CES[1]
1075+
>>> print("eps=0.5: ", CES[1])
10801076
eps=0.5: [[ 0. 0.25331629]
10811077
[ 0.25331629 0. ]]"
10821078
@@ -1336,7 +1332,7 @@ def dres(ensembles,
13361332
>>> ens1 = Universe(PSF,DCD)
13371333
>>> ens2 = Universe(PSF,DCD2)
13381334
>>> DRES, details = encore.dres([ens1,ens2])
1339-
>>> print DRES
1335+
>>> print(DRES)
13401336
[[ 0. 0.67996043]
13411337
[ 0.67996043 0. ]]
13421338
@@ -1352,7 +1348,7 @@ def dres(ensembles,
13521348
13531349
>>> DRES, details = encore.dres([ens1,ens2],
13541350
dimensionality_reduction_method = encore.PrincipalComponentAnalysis(dimension=2))
1355-
>>> print DRES
1351+
>>> print(DRES)
13561352
[[ 0. 0.69314718]
13571353
[ 0.69314718 0. ]]
13581354
@@ -1549,7 +1545,7 @@ def ces_convergence(original_ensemble,
15491545
15501546
>>> ens1 = Universe(PSF,DCD)
15511547
>>> ces_conv = encore.ces_convergence(ens1, 10)
1552-
>>> print ces_conv
1548+
>>> print(ces_conv)
15531549
[[ 0.48194205]
15541550
[ 0.40284672]
15551551
[ 0.31699026]
@@ -1658,7 +1654,7 @@ def dres_convergence(original_ensemble,
16581654
16591655
>>> ens1 = Universe(PSF,DCD)
16601656
>>> dres_conv = encore.dres_convergence(ens1, 10)
1661-
>>> print dres_conv
1657+
>>> print(dres_conv)
16621658
[[ 0.5295528 ]
16631659
[ 0.40716539]
16641660
[ 0.31158669]

0 commit comments

Comments
 (0)