grrmpy.io.read_listlog のソースコード

import numpy as np
from ase import Atoms
from ase.io import read

# USER
from grrmpy.io.read_com import frozen2atoms

[ドキュメント]def log2atoms(logfile,com=None,poscar=None,constraints=[]): """logファイルからAtomsオブジェクトに変換する Parameter: logfile: str or Path _list.logファイルパス. com: str or Path | FrozenAtomsを追加する場合にcomファイルを指定. | その他comファイルの情報を確認したい時はgrrmpy.structure.comfile.COMを参照 poscar: str or Path POSCARパスを設定した場合.セル情報を読み取りAtomsオブジェクトに適用する. constraints: ase.constraints | 与えたconstraintsは全てのAtomsに適用される. | 複数のconstraintsを与えたい場合はリストで与える Returns: Atoms: Atomsオブジェクト """ logtext = _open_file(logfile) hash_idx, energy_idx = _read_mark_of_list(logtext) natoms = _get_natoms(logtext, energy_idx) positions_list = (_int2float(logtext[i+1:i+natoms+1]) for i in hash_idx) # 座標を取得 elements = _get_chemical_symbols(logtext, energy_idx) if com: frozen = frozen2atoms(com) atoms_list = [Atoms(elements,positions)+frozen for positions in positions_list] else: atoms_list = [Atoms(elements,positions) for positions in positions_list] if poscar: pos_atoms = read(poscar,format="vasp") cell = pos_atoms.get_cell() for atoms in atoms_list: atoms.set_cell(cell) atoms.set_pbc(True) for atoms in atoms_list: atoms.set_constraint(constraints) return atoms_list
def read_positions(logfile): """logファイルからpositionsを読み取る Parameters: logfile: string *_list.logファイルパス Return: list of np.array: 座標のリスト """ logtext = _open_file(logfile) hash_idx, energy_idx = _read_mark_of_list(logtext) natoms = _get_natoms(logtext, energy_idx) positions_list = (_int2float(logtext[i+1:i+natoms+1]) for i in hash_idx) # 座標を取得 return positions_list def read_energies(logfile): """logファイルからenergyのリストを返す Parameters: logfile: string *_list.logファイルパス Return: list of float: エネルギーのリスト """ logtext = _open_file(logfile) _, energy_idx = _read_mark_of_list(logtext) return _logtext2energies(logtext, energy_idx)
[ドキュメント]def read_connections(logfile): """logファイルからCONNECTIONSを取得する Parameters: logfile: string TS or PT_list.logファイルパス Return: list of tuple: CONNECTIONのリスト """ logtext = _open_file(logfile) return _read_connections(logtext)
def _read_connections(logtext): connections = [ [int(text.split()[2]) if text.split()[2].isdecimal() else text.split()[2], int(text.split()[4]) if text.split()[4].isdecimal() else text.split()[4]] for text in logtext if "CONNECTION" in text] return connections def _read_mark_of_list(logtext): """logファイルから#とEnergy =のある行数を返す""" hash_idx = [i for i,text in enumerate(logtext) if "#" in text] energy_idx = [i for i,text in enumerate(logtext) if "Energy =" in text] if len(hash_idx)*2 == len(energy_idx): """ReEnergyの場合,`Energy =`が2つ出るため""" energy_idx = [i for i in energy_idx if i%2 == 0] #偶数個目のEnergy =の値だけ読み取る return hash_idx, energy_idx def _logtext2energies(logtext, energy_idx): energies = np.array([float(logtext[i].split()[2]) for i in energy_idx]) return energies def _get_chemical_symbols(logtext, energy_idx): return [text.split()[0] for text in logtext[3:energy_idx[0]]] # 元素のリストを取得 def _get_natoms(logtext, energy_idx): return len(_get_chemical_symbols(logtext, energy_idx)) def _int2float(positions): return [[float(xyz) for xyz in atom.split()[1:]] for atom in positions] def _open_file(logfile): with open(logfile,"r") as f: text = f.readlines() return text