44
55from collections .abc import Sequence
66from itertools import combinations_with_replacement
7+ from warnings import warn
78
89from ase import Atoms
910from ase .geometry .analysis import Analysis
11+ from ase .geometry .rdf import get_rdf
1012import numpy as np
1113from numpy import float64
1214from numpy .typing import NDArray
@@ -40,7 +42,7 @@ def compute_rdf(
4042 data
4143 Dataset to compute RDF of.
4244 ana
43- ASE Analysis object for data reuse.
45+ Deprecated. Please do not use. ASE Analysis object for data reuse.
4446 filenames
4547 Filenames to output data to. Must match number of RDFs computed.
4648 by_elements
@@ -69,6 +71,18 @@ def compute_rdf(
6971 If `by_elements` is true returns a `dict` of RDF by element pairs.
7072 Otherwise returns RDF of total system filtered by elements.
7173 """
74+ if ana is not None :
75+ warn (
76+ "ana has been deprecated." ,
77+ FutureWarning ,
78+ stacklevel = 2 ,
79+ )
80+ if by_elements :
81+ raise ValueError (
82+ "Analysis.get_rdf has known bugs with by_elements."
83+ "Call without ana to use ase.geometry.rdf.get_rdf directly."
84+ )
85+
7286 index = slicelike_to_startstopstep (index )
7387
7488 if not isinstance (data , Sequence ):
@@ -82,32 +96,34 @@ def compute_rdf(
8296 ):
8397 volume = (2 * rmax ) ** 3
8498
85- if ana is None :
86- ana = Analysis (data )
87-
8899 if by_elements :
89100 elements = (
90101 tuple (sorted (set (data [0 ].get_chemical_symbols ())))
91102 if elements is None
92103 else elements
93104 )
94105
95- rdf = {
96- element : ana .get_rdf (
97- rmax = rmax ,
98- nbins = nbins ,
99- elements = element ,
100- imageIdx = slice (* index ),
101- return_dists = True ,
102- volume = volume ,
103- )
106+ rdfs = {
107+ element : [
108+ get_rdf (
109+ atoms ,
110+ rmax ,
111+ nbins ,
112+ elements = element ,
113+ volume = volume ,
114+ )
115+ for atoms in data
116+ ]
104117 for element in combinations_with_replacement (elements , 2 )
105118 }
106119
107120 # Compute RDF average
108121 rdf = {
109- element : (rdf [0 ][1 ], np .average ([rdf_i [0 ] for rdf_i in rdf ], axis = 0 ))
110- for element , rdf in rdf .items ()
122+ element : (
123+ element_rdfs [0 ][1 ],
124+ np .average ([rdf_i [0 ] for rdf_i in element_rdfs ], axis = 0 ),
125+ )
126+ for element , element_rdfs in rdfs .items ()
111127 }
112128
113129 if filenames is not None :
@@ -129,14 +145,24 @@ def compute_rdf(
129145 print (dist , rdf_i , file = out_file )
130146
131147 else :
132- rdf = ana .get_rdf (
133- rmax = rmax ,
134- nbins = nbins ,
135- elements = elements ,
136- imageIdx = slice (* index ),
137- return_dists = True ,
138- volume = volume ,
139- )
148+ if ana is not None :
149+ rdf = ana .get_rdf (
150+ rmax = rmax ,
151+ nbins = nbins ,
152+ imageIdx = slice (* index ),
153+ return_dists = True ,
154+ volume = volume ,
155+ )
156+ else :
157+ rdf = [
158+ get_rdf (
159+ atoms ,
160+ rmax ,
161+ nbins ,
162+ volume = volume ,
163+ )
164+ for atoms in data
165+ ]
140166
141167 assert isinstance (rdf , list )
142168
0 commit comments