Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions dpdata/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
"""Command line interface for dpdata."""
import argparse

from . import __version__
from .system import System, LabeledSystem, MultiSystems


def dpdata_cli():
"""dpdata cli.

Examples
--------
.. code-block:: bash

$ dpdata -iposcar POSCAR -odeepmd/npy -O data -n
"""
parser = argparse.ArgumentParser(
description="dpdata: Manipulating multiple atomic simulation data formats",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)

parser.add_argument("from_file", type=str, help="read data from a file")
parser.add_argument("--to_file", "-O", type=str, help="dump data to a file")
parser.add_argument("--from_format", "-i", type=str, default="auto", help="the format of from_file")
parser.add_argument("--to_format", "-o", type=str, help="the format of to_file")
parser.add_argument("--no-labeled", "-n", action="store_true", help="labels aren't provided")
parser.add_argument("--multi", "-m", action="store_true", help="the system contains multiple directories")
parser.add_argument("--type-map", "-t", type=str, nargs="+", help="type map")

parser.add_argument('--version', action='version', version='dpdata v%s' % __version__)

parsed_args = parser.parse_args()
convert(**vars(parsed_args))


def convert(*,
from_file: str,
from_format: str = "auto",
to_file: str = None,
to_format: str = None,
no_labeled: bool = False,
multi: bool = False,
type_map: list = None,
**kwargs):
"""Convert files from one format to another one.

Parameters
----------
from_file : str
read data from a file
from_format : str
the format of from_file
to_file : str
dump data to a file
to_format : str
the format of to_file
no_labeled : bool
labels aren't provided
multi : bool
the system contains multiple directories
type_map : list
type map
"""
if multi:
s = MultiSystems.from_file(from_file, fmt=from_format, type_map=type_map, labeled=not no_labeled)
elif not no_labeled:
s = LabeledSystem(from_file, fmt=from_format, type_map=type_map)
else:
s = System(from_file, fmt=from_format, type_map=type_map)
if to_format is not None:
out = s.to(to_format, to_file)
if isinstance(out, str):
print(out)
else:
print(s)
15 changes: 15 additions & 0 deletions dpdata/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -1082,6 +1082,21 @@ def to_fmt_obj(self, fmtobj, directory, *args, **kwargs):
for fn, ss in zip(fmtobj.to_multi_systems(self.systems.keys(), directory, **kwargs), self.systems.values()):
ss.to_fmt_obj(fmtobj, fn, *args, **kwargs)
return self

def to(self, fmt: str, *args, **kwargs) -> "MultiSystems":
"""Dump systems to the specific format.

Parameters
----------
fmt : str
format

Returns
-------
MultiSystems
self
"""
return self.to_fmt_obj(load_format(fmt), *args, **kwargs)

def __getitem__(self, key):
"""Returns proerty stored in System by key or by idx"""
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
'amber': ['parmed'],
'pymatgen': ['pymatgen'],
'docs': ['sphinx', 'recommonmark', 'sphinx_rtd_theme>=1.0.0rc1', 'numpydoc', 'm2r2', 'deepmodeling-sphinx'],
}
},
entry_points={"console_scripts": ["dpdata = dpdata.cli:dpdata_cli"]},
)

17 changes: 17 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import unittest
from context import dpdata
from poscars.poscar_ref_oh import TestPOSCARoh
import subprocess as sp


class TestCli(unittest.TestCase, TestPOSCARoh):

@classmethod
def setUpClass(cls) -> None:
sp.check_output(["dpdata", "poscars/conf.lmp", "--type-map", "O", "H", "-olammps/lmp", "-O", "tmp.lmp", "--no-labeled"])
cls.system = dpdata.System('tmp.lmp', fmt='lammps/lmp',
type_map = ['O', 'H'])

@classmethod
def tearDownClass(cls) -> None:
cls.system = None