11
11
from scipy .stats import skewnorm
12
12
13
13
if TYPE_CHECKING :
14
+ from gemdat .jumps import Jumps
14
15
from gemdat .orientations import Orientations
15
16
from gemdat .trajectory import Trajectory
16
17
@@ -127,7 +128,7 @@ def dataframe(self):
127
128
def _get_vibrational_amplitudes_hist (
128
129
* , trajectories : list [Trajectory ], bins : int
129
130
) -> VibrationalAmplitudeHist :
130
- """Calculate vabrational amplitudes histogram.
131
+ """Calculate vibrational amplitudes histogram.
131
132
132
133
Helper for `vibrational_amplitudes`.
133
134
"""
@@ -150,3 +151,38 @@ def _get_vibrational_amplitudes_hist(
150
151
std = np .std (data , axis = 0 )
151
152
152
153
return VibrationalAmplitudeHist (amplitudes = amplitudes , counts = mean , std = std )
154
+
155
+
156
+ def _jumps_vs_distance (jumps : Jumps , * , resolution : float , n_parts : int ) -> pd .DataFrame :
157
+ """Calculate jumps vs distance histogram.
158
+
159
+ Helper for `jumps_vs_distance`.
160
+ """
161
+ sites = jumps .sites
162
+ trajectory = jumps .trajectory
163
+ lattice = trajectory .get_lattice ()
164
+
165
+ pdist = lattice .get_all_distances (sites .frac_coords , sites .frac_coords )
166
+
167
+ bin_max = (1 + pdist .max () // resolution ) * resolution
168
+ n_bins = int (bin_max / resolution ) + 1
169
+ x = np .linspace (0 , bin_max , n_bins )
170
+
171
+ bin_idx = np .digitize (pdist , bins = x )
172
+ data = []
173
+ for transitions_part in jumps .split (n_parts = n_parts ):
174
+ counts = np .zeros_like (x )
175
+ for idx , n in zip (bin_idx .flatten (), transitions_part .matrix ().flatten ()):
176
+ counts [idx ] += n
177
+ for idx in range (n_bins ):
178
+ if counts [idx ] > 0 :
179
+ data .append ((x [idx ], counts [idx ]))
180
+
181
+ df = pd .DataFrame (data = data , columns = ['Displacement' , 'count' ])
182
+
183
+ grouped = df .groupby (['Displacement' ])
184
+ mean = grouped .mean ().reset_index ().rename (columns = {'count' : 'mean' })
185
+ std = grouped .std ().reset_index ().rename (columns = {'count' : 'std' })
186
+ df = mean .merge (std , how = 'inner' )
187
+
188
+ return df
0 commit comments