mdkits 0.1a3__tar.gz → 0.1a6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mdkits might be problematic. Click here for more details.
- {mdkits-0.1a3 → mdkits-0.1a6}/PKG-INFO +14 -14
- {mdkits-0.1a3 → mdkits-0.1a6}/README.md +13 -13
- {mdkits-0.1a3 → mdkits-0.1a6}/pyproject.toml +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/cmdline.py +3 -3
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/convert.py +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/density.py +51 -18
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/extract.py +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/log.py +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/plot.py +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/wrap.py +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/config/__init__.py +4 -4
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/config/settings.yml +1 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/mdkits.py +2 -1
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/numpy_geo.py +3 -2
- {mdkits-0.1a3 → mdkits-0.1a6}/LICENSE +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/__init__.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/,hb_distribution.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/,hb_distribution_down.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/adsorbate.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/build_bulk.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/build_interface.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/build_surface.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/cp2k_input.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/cube.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/cut_surface.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/data.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/density2.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/hartree_potential.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/hartree_potential_ave.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/hb.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/matplot.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/packmol_input.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/pdos.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/cli/supercell.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/__init__.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/arg_type.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/cp2k_input_parsing.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/encapsulated_ase.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/encapsulated_mda.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/fig_operation.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/os_operation.py +0 -0
- {mdkits-0.1a3 → mdkits-0.1a6}/src/mdkits/util/structure_parsing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: mdkits
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.1a6
|
|
4
4
|
Summary: tools for md or dft
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: molecular dynamics,density functional theory
|
|
@@ -24,9 +24,9 @@ Project-URL: Repository, https://github.com/jxxcr/mdkits
|
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
|
|
26
26
|
# MD 轨迹分析脚本
|
|
27
|
-
`
|
|
27
|
+
`mdkits` 提供了多种工具, 安装脚本:
|
|
28
28
|
```bash
|
|
29
|
-
pip install
|
|
29
|
+
pip install mdkits --upgrade
|
|
30
30
|
```
|
|
31
31
|
### 密度分布
|
|
32
32
|
|
|
@@ -49,15 +49,15 @@ pip install mdtool --upgrade
|
|
|
49
49
|
### 位置归一化
|
|
50
50
|
`wrap`用于将轨迹文件中的原子位置进行归一化处理, 如将`[FILENAME]`中的原子位置归一化到晶胞中, 并输出为`wrapped.xyz`, 默认从`cp2k`的输出文件`input_inp`中读取`ABC`和`ALPHA_BETA_GAMMA`信息作为晶胞参数:
|
|
51
51
|
```bash
|
|
52
|
-
|
|
52
|
+
mdkits wrap [FILENAME]
|
|
53
53
|
```
|
|
54
54
|
或指定`cp2k`的输入文件:
|
|
55
55
|
```bash
|
|
56
|
-
|
|
56
|
+
mdkits wrap [FILENAME] --cp2k_input_file setting.inp
|
|
57
57
|
```
|
|
58
58
|
或指定晶胞参数:
|
|
59
59
|
```bash
|
|
60
|
-
|
|
60
|
+
mdkits wrap [FILENAME] --cell 10,10,10
|
|
61
61
|
```
|
|
62
62
|
默认的`[FILENAME]`为`*-pos-1.xyz`
|
|
63
63
|
|
|
@@ -72,29 +72,29 @@ mdtool wrap [FILENAME] --cell 10,10,10
|
|
|
72
72
|
### 轨迹提取
|
|
73
73
|
`extract`用于提取轨迹文件中的特定的帧, 如从`frames.xyz`中提取第 1000 帧到第 2000 帧的轨迹文件, 并输出为`1000-2000.xyz`, `-r`选项的参数与`Python`的切片语法一致:
|
|
74
74
|
```bash
|
|
75
|
-
|
|
75
|
+
mdkits extract frames.xyz -r 1000:2000 -o 1000-2000.xyz
|
|
76
76
|
```
|
|
77
77
|
或从`cp2k`的默认输出的轨迹文件`*-pos-1.xyz`文件中提取最后一帧输出为`extracted.xyz`(`extract`的默认行为):
|
|
78
78
|
```bash
|
|
79
|
-
|
|
79
|
+
mdkits extract
|
|
80
80
|
```
|
|
81
81
|
或每50帧输出一个结构到`./coord`目录中, 同时调整输出格式为`cp2k`的`@INCLUDE coord.xyz`的形式:
|
|
82
82
|
```bash
|
|
83
|
-
|
|
83
|
+
mdkits extract -cr ::50
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
### 结构文件转换
|
|
87
87
|
`convert`用于将结构文件从一种格式转换为另一种格式, 如将`structure.xyz`转换为`out.cif`(默认文件名为`out`), 对于不储存周期性边界条件的文件, 可以使用`--cell`选项指定`PBC`:
|
|
88
88
|
```bash
|
|
89
|
-
|
|
89
|
+
mdkits convert -c structure.xyz --cell 10,10,10
|
|
90
90
|
```
|
|
91
91
|
将`structure.cif`转换为`POSCAR`:
|
|
92
92
|
```bash
|
|
93
|
-
|
|
93
|
+
mdkits convert -v structure.cif
|
|
94
94
|
```
|
|
95
95
|
将`structure.cif`转换为`structure_xyz.xyz`:
|
|
96
96
|
```bash
|
|
97
|
-
|
|
97
|
+
mdkits convert -c structure.cif -o structure_xyz
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
### 数据处理
|
|
@@ -153,9 +153,9 @@ figure2:
|
|
|
153
153
|
|
|
154
154
|
`plot`可以同时处理多个`yaml`文件, 每个`yaml`文件可以包含多个绘图配置, `mode 1`和`mode 2`的绘图配置可以自动识别, 但是`error`模式需要而外指定, 如:
|
|
155
155
|
```bash
|
|
156
|
-
|
|
156
|
+
mdkits plot *.yaml
|
|
157
157
|
```
|
|
158
158
|
和:
|
|
159
159
|
```bash
|
|
160
|
-
|
|
160
|
+
mdkits plot *.yaml --error
|
|
161
161
|
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# MD 轨迹分析脚本
|
|
2
|
-
`
|
|
2
|
+
`mdkits` 提供了多种工具, 安装脚本:
|
|
3
3
|
```bash
|
|
4
|
-
pip install
|
|
4
|
+
pip install mdkits --upgrade
|
|
5
5
|
```
|
|
6
6
|
### 密度分布
|
|
7
7
|
|
|
@@ -24,15 +24,15 @@ pip install mdtool --upgrade
|
|
|
24
24
|
### 位置归一化
|
|
25
25
|
`wrap`用于将轨迹文件中的原子位置进行归一化处理, 如将`[FILENAME]`中的原子位置归一化到晶胞中, 并输出为`wrapped.xyz`, 默认从`cp2k`的输出文件`input_inp`中读取`ABC`和`ALPHA_BETA_GAMMA`信息作为晶胞参数:
|
|
26
26
|
```bash
|
|
27
|
-
|
|
27
|
+
mdkits wrap [FILENAME]
|
|
28
28
|
```
|
|
29
29
|
或指定`cp2k`的输入文件:
|
|
30
30
|
```bash
|
|
31
|
-
|
|
31
|
+
mdkits wrap [FILENAME] --cp2k_input_file setting.inp
|
|
32
32
|
```
|
|
33
33
|
或指定晶胞参数:
|
|
34
34
|
```bash
|
|
35
|
-
|
|
35
|
+
mdkits wrap [FILENAME] --cell 10,10,10
|
|
36
36
|
```
|
|
37
37
|
默认的`[FILENAME]`为`*-pos-1.xyz`
|
|
38
38
|
|
|
@@ -47,29 +47,29 @@ mdtool wrap [FILENAME] --cell 10,10,10
|
|
|
47
47
|
### 轨迹提取
|
|
48
48
|
`extract`用于提取轨迹文件中的特定的帧, 如从`frames.xyz`中提取第 1000 帧到第 2000 帧的轨迹文件, 并输出为`1000-2000.xyz`, `-r`选项的参数与`Python`的切片语法一致:
|
|
49
49
|
```bash
|
|
50
|
-
|
|
50
|
+
mdkits extract frames.xyz -r 1000:2000 -o 1000-2000.xyz
|
|
51
51
|
```
|
|
52
52
|
或从`cp2k`的默认输出的轨迹文件`*-pos-1.xyz`文件中提取最后一帧输出为`extracted.xyz`(`extract`的默认行为):
|
|
53
53
|
```bash
|
|
54
|
-
|
|
54
|
+
mdkits extract
|
|
55
55
|
```
|
|
56
56
|
或每50帧输出一个结构到`./coord`目录中, 同时调整输出格式为`cp2k`的`@INCLUDE coord.xyz`的形式:
|
|
57
57
|
```bash
|
|
58
|
-
|
|
58
|
+
mdkits extract -cr ::50
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
### 结构文件转换
|
|
62
62
|
`convert`用于将结构文件从一种格式转换为另一种格式, 如将`structure.xyz`转换为`out.cif`(默认文件名为`out`), 对于不储存周期性边界条件的文件, 可以使用`--cell`选项指定`PBC`:
|
|
63
63
|
```bash
|
|
64
|
-
|
|
64
|
+
mdkits convert -c structure.xyz --cell 10,10,10
|
|
65
65
|
```
|
|
66
66
|
将`structure.cif`转换为`POSCAR`:
|
|
67
67
|
```bash
|
|
68
|
-
|
|
68
|
+
mdkits convert -v structure.cif
|
|
69
69
|
```
|
|
70
70
|
将`structure.cif`转换为`structure_xyz.xyz`:
|
|
71
71
|
```bash
|
|
72
|
-
|
|
72
|
+
mdkits convert -c structure.cif -o structure_xyz
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
### 数据处理
|
|
@@ -128,9 +128,9 @@ figure2:
|
|
|
128
128
|
|
|
129
129
|
`plot`可以同时处理多个`yaml`文件, 每个`yaml`文件可以包含多个绘图配置, `mode 1`和`mode 2`的绘图配置可以自动识别, 但是`error`模式需要而外指定, 如:
|
|
130
130
|
```bash
|
|
131
|
-
|
|
131
|
+
mdkits plot *.yaml
|
|
132
132
|
```
|
|
133
133
|
和:
|
|
134
134
|
```bash
|
|
135
|
-
|
|
135
|
+
mdkits plot *.yaml --error
|
|
136
136
|
```
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import click
|
|
3
3
|
from click import Context
|
|
4
4
|
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
from
|
|
5
|
+
from mdkits import __version__
|
|
6
|
+
from mdkits.config import settings
|
|
7
|
+
from mdkits.log import init_log
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
@click.group(invoke_without_command=True)
|
|
@@ -5,13 +5,18 @@ import click
|
|
|
5
5
|
import MDAnalysis
|
|
6
6
|
from MDAnalysis import Universe
|
|
7
7
|
from MDAnalysis.analysis.base import AnalysisBase
|
|
8
|
-
from
|
|
8
|
+
from mdkits.util import (
|
|
9
|
+
arg_type,
|
|
10
|
+
numpy_geo,
|
|
11
|
+
encapsulated_mda,
|
|
12
|
+
os_operation,
|
|
13
|
+
)
|
|
9
14
|
import warnings
|
|
10
15
|
warnings.filterwarnings("ignore")
|
|
11
16
|
|
|
12
17
|
|
|
13
18
|
class Density_distribution(AnalysisBase):
|
|
14
|
-
def __init__(self, filename, cell, o, distance_judg, angle_judg, dt=0.001, bin_size=0.2, return_index=False):
|
|
19
|
+
def __init__(self, filename, cell, o, element, density, update_water, distance_judg, angle_judg, surface, dt=0.001, bin_size=0.2, return_index=False):
|
|
15
20
|
u = Universe(filename)
|
|
16
21
|
u.trajectory.ts.dt = dt
|
|
17
22
|
u.dimensions = cell
|
|
@@ -25,21 +30,31 @@ class Density_distribution(AnalysisBase):
|
|
|
25
30
|
self.bin_size = bin_size
|
|
26
31
|
self.frame_count = 0
|
|
27
32
|
self.return_index = return_index
|
|
33
|
+
self.surface = surface
|
|
34
|
+
self.element = element
|
|
35
|
+
self.density = density
|
|
36
|
+
self.update_water = update_water
|
|
37
|
+
|
|
38
|
+
if surface is not None:
|
|
39
|
+
self.surface_group = self.atomgroup.select_atoms(f"{surface}")
|
|
40
|
+
else:
|
|
41
|
+
self.surface_group = False
|
|
28
42
|
|
|
29
43
|
super(Density_distribution, self).__init__(self.atomgroup.universe.trajectory, verbose=True)
|
|
30
44
|
|
|
31
45
|
def _prepare(self):
|
|
32
46
|
self.bin_num = int(self.u.dimensions[2] / self.bin_size) + 2
|
|
33
47
|
self.density_distribution = np.zeros(self.bin_num, dtype=np.float64)
|
|
34
|
-
if self.
|
|
35
|
-
self.surface_pos = ()
|
|
48
|
+
if self.surface_group:
|
|
49
|
+
self.surface_pos = np.zeros(2)
|
|
36
50
|
|
|
37
51
|
def _append(self, z):
|
|
38
52
|
bins = np.floor(z / self.bin_size).astype(int) + 1
|
|
39
53
|
np.add.at(self.density_distribution, bins, 1)
|
|
40
54
|
|
|
55
|
+
|
|
41
56
|
def _single_frame(self):
|
|
42
|
-
if self.
|
|
57
|
+
if self.update_water:
|
|
43
58
|
o_group = self.atomgroup.select_atoms("name O")
|
|
44
59
|
h_group = self.atomgroup.select_atoms("name H")
|
|
45
60
|
|
|
@@ -48,40 +63,58 @@ class Density_distribution(AnalysisBase):
|
|
|
48
63
|
self._append(o.positions[:, 2])
|
|
49
64
|
|
|
50
65
|
else:
|
|
51
|
-
group = self.atomgroup.select_atoms(f"
|
|
66
|
+
group = self.atomgroup.select_atoms(f"{self.element}")
|
|
52
67
|
self._append(group.positions[:, 2])
|
|
53
68
|
|
|
54
|
-
self.
|
|
69
|
+
if self.surface_group:
|
|
70
|
+
lower_z, upper_z = numpy_geo.find_surface(self.surface_group.positions[:, 2], layer_tolerance=1, surface_tolerance=5)
|
|
71
|
+
self.surface_pos[0] += lower_z
|
|
72
|
+
self.surface_pos[1] += upper_z
|
|
73
|
+
|
|
55
74
|
self.frame_count += 1
|
|
56
75
|
|
|
57
76
|
def _conclude(self):
|
|
58
77
|
if self.frame_count > 0:
|
|
59
78
|
V = self.u.dimensions[0] * self.u.dimensions[1] * self.bin_size
|
|
60
79
|
|
|
61
|
-
if self.
|
|
62
|
-
density_distribution = (self.density_distribution *
|
|
80
|
+
if self.density:
|
|
81
|
+
density_distribution = (self.density_distribution * self.density * 1.660539 / V) / self.frame_count
|
|
63
82
|
else:
|
|
64
83
|
density_distribution = (self.density_distribution * (10000/6.02) / V) / self.frame_count
|
|
65
84
|
|
|
66
85
|
bins_z = np.arange(len(self.density_distribution)) * self.bin_size
|
|
67
86
|
|
|
68
|
-
|
|
87
|
+
if self.surface:
|
|
88
|
+
lower_z = self.surface_pos[0] / self.frame_count
|
|
89
|
+
upper_z = self.surface_pos[1] / self.frame_count
|
|
69
90
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
mask = (bins_z >= lower_z) & (bins_z <= upper_z)
|
|
92
|
+
filtered_bins_z = bins_z[mask] - lower_z
|
|
93
|
+
filtered_density_distribution = density_distribution[mask]
|
|
94
|
+
|
|
95
|
+
conbined_data = np.column_stack((filtered_bins_z, filtered_density_distribution))
|
|
96
|
+
else:
|
|
97
|
+
conbined_data = np.column_stack((bins_z, density_distribution))
|
|
75
98
|
|
|
76
99
|
np.savetxt(self.o, conbined_data, header="Z\tdensity", fmt='%.5f', delimiter='\t')
|
|
77
100
|
|
|
78
101
|
@click.command(name='density')
|
|
79
102
|
@click.argument('filename', type=click.Path(exists=True), default=os_operation.default_file_name('*-pos-1.xyz', last=True))
|
|
80
|
-
@click.option('--cell', type=arg_type.Cell, help='set xyz file cell, --cell x,y,z,a,b,c')
|
|
81
103
|
@click.option('--cell', type=arg_type.Cell, help='set cell from cp2k input file or a list of lattice: --cell x,y,z or x,y,z,a,b,c', default='input.inp', show_default=True)
|
|
104
|
+
@click.option('--element', type=str, help='element to analysis')
|
|
105
|
+
@click.option('--density', type=float, help='output density unit (g/cm3), should give atomic mass of element, else is concentration unit (mol/L)')
|
|
82
106
|
@click.option('-o', type=str, help='output file name', default='density.dat', show_default=True)
|
|
83
|
-
|
|
84
|
-
|
|
107
|
+
@click.option('--update_water', is_flag=True, help='update water with distance or angle judgment')
|
|
108
|
+
@click.option('--distance', type=float, help='update water distance judgment', default=1.2, show_default=True)
|
|
109
|
+
@click.option('--angle', type=(float), help='update water angle judgment')
|
|
110
|
+
@click.option('--surface', type=str, help='surface element')
|
|
111
|
+
def main(filename, cell, o, element, density, update_water, distance, angle, surface):
|
|
112
|
+
"""
|
|
113
|
+
analysis density or concentration of element in a trajectory file
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
density_dist = Density_distribution(filename, cell, o=o, distance_judg=distance, angle_judg=angle, element=element, density=density, update_water=update_water, surface=surface)
|
|
117
|
+
|
|
85
118
|
density_dist.run()
|
|
86
119
|
|
|
87
120
|
|
|
@@ -18,17 +18,17 @@ _settings_files = [
|
|
|
18
18
|
|
|
19
19
|
# User configuration. It will be created automatically by the pip installer .
|
|
20
20
|
_external_files = [
|
|
21
|
-
Path(sys.prefix, 'etc', '
|
|
21
|
+
Path(sys.prefix, 'etc', 'mdkits', 'settings.yml')
|
|
22
22
|
]
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
settings = Dynaconf(
|
|
26
|
-
# Set env `
|
|
27
|
-
envvar_prefix='
|
|
26
|
+
# Set env `mdkits_FOO='bar'`,use `settings.FOO` .
|
|
27
|
+
envvar_prefix='mdkits',
|
|
28
28
|
settings_files=_settings_files, # load user configuration.
|
|
29
29
|
# environments=True, # Enable multi-level configuration,eg: default, development, production
|
|
30
30
|
load_dotenv=True, # Enable load .env
|
|
31
|
-
# env_switcher='
|
|
31
|
+
# env_switcher='mdkits_ENV',
|
|
32
32
|
lowercase_read=False, # If true, can't use `settings.foo`, but can only use `settings.FOO`
|
|
33
33
|
includes=_external_files, # Customs settings.
|
|
34
34
|
base_dir=_base_dir, # `settings.BASE_DIR`
|
|
@@ -5,6 +5,7 @@ from mdkits.cli import (
|
|
|
5
5
|
extract,
|
|
6
6
|
data,
|
|
7
7
|
plot,
|
|
8
|
+
density
|
|
8
9
|
)
|
|
9
10
|
|
|
10
11
|
|
|
@@ -12,7 +13,6 @@ from mdkits.cli import (
|
|
|
12
13
|
@click.pass_context
|
|
13
14
|
@click.version_option()
|
|
14
15
|
def cli(ctx):
|
|
15
|
-
print(ctx)
|
|
16
16
|
"""tools for md or dft"""
|
|
17
17
|
pass
|
|
18
18
|
|
|
@@ -22,6 +22,7 @@ cli.add_command(wrap.main)
|
|
|
22
22
|
cli.add_command(extract.main)
|
|
23
23
|
cli.add_command(data.main)
|
|
24
24
|
cli.add_command(plot.main)
|
|
25
|
+
cli.add_command(density.main)
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
if __name__ == '__main__':
|
|
@@ -97,7 +97,7 @@ def unwrap(atom1, atom2, coefficients, max=0, total=False):
|
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
def find_surface(surface_group:np.ndarray, layer_tolerance=1, surface_tolerance=5):
|
|
100
|
-
sort_group =
|
|
100
|
+
sort_group = np.sort(surface_group)
|
|
101
101
|
layer_mean = []
|
|
102
102
|
current_layer = [sort_group[0]]
|
|
103
103
|
for i in range(1, len(sort_group)):
|
|
@@ -106,6 +106,7 @@ def find_surface(surface_group:np.ndarray, layer_tolerance=1, surface_tolerance=
|
|
|
106
106
|
else:
|
|
107
107
|
layer_mean.append(np.mean(current_layer))
|
|
108
108
|
current_layer = [sort_group[i]]
|
|
109
|
+
layer_mean.append(np.mean(current_layer))
|
|
109
110
|
|
|
110
111
|
if len(current_layer) == 1:
|
|
111
112
|
return layer_mean[0]
|
|
@@ -115,4 +116,4 @@ def find_surface(surface_group:np.ndarray, layer_tolerance=1, surface_tolerance=
|
|
|
115
116
|
index = np.argmax(diff > 5)
|
|
116
117
|
return (layer_mean[index], layer_mean[index + 1])
|
|
117
118
|
else:
|
|
118
|
-
return layer_mean[-1]
|
|
119
|
+
return (layer_mean[-1], layer_mean[0])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|