63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
from diceplayer.config import PlayerConfig
|
|
from diceplayer.environment import System, Molecule, Atom
|
|
|
|
from pathlib import Path
|
|
|
|
from diceplayer.logger import logger
|
|
from diceplayer.state.state_model import StateModel
|
|
|
|
|
|
def read_system_from_phb(config: PlayerConfig) -> System:
|
|
phb_file = Path(config.dice.ljname)
|
|
if not phb_file.exists():
|
|
raise FileNotFoundError
|
|
|
|
ljc_data = phb_file.read_text(encoding="utf-8").splitlines()
|
|
|
|
combrule = ljc_data.pop(0).strip()
|
|
if combrule != config.dice.combrule:
|
|
raise ValueError(
|
|
f"Invalid combrule defined in {phb_file}. Expected the same value configured in the config file"
|
|
)
|
|
|
|
ntypes = ljc_data.pop(0).strip()
|
|
if not ntypes.isdigit():
|
|
raise ValueError(f"Invalid ntypes defined in {phb_file}")
|
|
|
|
nmol = int(ntypes)
|
|
if nmol != len(config.dice.nmol):
|
|
raise ValueError(f"Invalid nmol defined in {phb_file}")
|
|
|
|
sys = System()
|
|
|
|
for i in range(nmol):
|
|
nsites, molname = ljc_data.pop(0).split()
|
|
|
|
if not nsites.isdigit():
|
|
raise ValueError(f"Invalid nsites defined in {phb_file}")
|
|
nsites = int(nsites)
|
|
|
|
mol = Molecule(molname)
|
|
|
|
for j in range(nsites):
|
|
_fields = ljc_data.pop(0).split()
|
|
mol.add_atom(
|
|
Atom(*_fields)
|
|
)
|
|
|
|
sys.add_type(mol)
|
|
|
|
return sys
|
|
|
|
|
|
# def write_phb(phb_file: Path, state: StateModel) -> None:
|
|
# if phb_file.exists():
|
|
# raise RuntimeError(f"File {phb_file} already exists")
|
|
#
|
|
# with open(phb_file, "w") as f:
|
|
# f.write(f"{state.config.dice.combrule}\n")
|
|
# f.write(f"{len(state.system.nmols)}\n")
|
|
# f.write(f"{state.config.dice.nmol}\n")
|
|
|
|
|