지난 포스팅에서는 계산 화학과 신소재 연구의 퀄리티를 높여주는 3대 시각화 프로그램(Avogadro, VESTA, PyMOL)의 활용법을 알아보았습니다. 하지만 이 프로그램들을 능수능란하게 다루기 전에 연구자들이 반드시 넘어야 할 산이 있습니다. 바로 '파일 포맷(Format)의 불일치'입니다. 아보가드로는 3차원 좌표만 있는 '.xyz' 파일을 주로 다루지만, VESTA는 주기적 경계 조건(PBC)이 포함된 '.cif' 파일을 선호하며, 실제 슈퍼컴퓨터에서 VASP 시뮬레이션을 돌리기 위해서는 'POSCAR'라는 특수한 텍스트 포맷이 필요합니다. 머신러닝으로 생성해 낸 수천 개의 새로운 분자 구조 파일(.xyz)을 시뮬레이션용 포맷으로 마우스 클릭을 통해 일일이 바꾸는 것은 물리적으로 불가능합니다. 이번 글에서는 파이썬(Python)을 활용하여 폴더 내의 모든 구조 파일을 단 1초 만에 원하는 확장자로 일괄 변환(Batch Conversion)하는 실전 스크립트를 공유합니다.
1. 화학 데이터의 만능 번역기: ASE(Atomic Simulation Environment) io 모듈
파이썬으로 분자 구조의 포맷을 자유자재로 변경할 수 있는 비결은 앞선 시리즈에서도 소개했던 ASE 라이브러리에 있습니다. ASE의 핵심 기능 중 하나인 'io(Input/Output)' 모듈은 현존하는 거의 모든 양자 화학 프로그램과 결정학 파일 포맷을 읽고(Read), 쓸(Write) 수 있는 강력한 파서를 내장하고 있습니다.
우리가 텍스트 편집기로 .cif 파일의 복잡한 대칭군(Symmetry group) 태그나 격자 상수(Lattice parameter)의 위치를 직접 파싱할 필요가 전혀 없습니다. `ase.io.read()` 함수 한 줄이면 특정 확장자의 파일을 파이썬 내부의 3차원 원자 객체(Atoms Object)로 완벽하게 인식하며, 이를 `ase.io.write()` 함수를 통해 원하는 확장자로 내보내기만 하면 프로그램이 알아서 해당 포맷의 국제 표준 규격에 맞게 텍스트를 재배열해 줍니다. 이는 마치 수십 개국의 언어를 동시통역하는 만능 번역기와 같습니다.
2. 실전 파이썬 코드: .xyz 파일을 .cif와 VASP(POSCAR)로 일괄 변환
아래의 코드는 특정 폴더(예: `input_xyz`) 안에 들어있는 수십~수백 개의 `.xyz` 분자 좌표 파일을 읽어들여, 각각을 결정학 표준 포맷인 `.cif` 파일과 VASP 시뮬레이션 입력 파일인 `POSCAR` 포맷으로 변환한 뒤 별도의 결과 폴더에 자동으로 저장하는 실전 스크립트입니다.
import os
import glob
from ase.io import read, write
# 1. 작업할 디렉토리 설정
input_folder = './input_xyz/'
output_cif_folder = './output_cif/'
output_vasp_folder = './output_vasp/'
# 2. 결과물을 저장할 폴더가 없다면 자동으로 생성
os.makedirs(output_cif_folder, exist_ok=True)
os.makedirs(output_vasp_folder, exist_ok=True)
# 3. input_folder 내의 모든 .xyz 파일 목록 불러오기
xyz_files = glob.glob(os.path.join(input_folder, '*.xyz'))
print(f"총 {len(xyz_files)}개의 파일을 변환합니다...")
# 4. 반복문을 통한 일괄 변환 수행
for file_path in xyz_files:
# 순수 파일명만 추출 (예: 'molecule1.xyz' -> 'molecule1')
base_name = os.path.basename(file_path).replace('.xyz', '')
try:
# ASE를 통해 xyz 파일 읽기
atoms = read(file_path)
# 주기적 경계 조건(PBC) 및 임의의 격자 크기(Cell) 설정 (분자의 경우)
# xyz는 격자 정보가 없으므로 cif/vasp 변환을 위해 가상의 격자 20x20x20 Å 추가
atoms.set_cell([20.0, 20.0, 20.0])
atoms.center() # 분자를 격자 정중앙에 배치
atoms.set_pbc(True) # 주기성 활성화
# 5. 원하는 포맷으로 각각 저장
cif_output = os.path.join(output_cif_folder, f"{base_name}.cif")
write(cif_output, atoms, format='cif')
vasp_output = os.path.join(output_vasp_folder, f"{base_name}_POSCAR")
write(vasp_output, atoms, format='vasp')
print(f"[성공] {base_name} 변환 완료")
except Exception as e:
print(f"[실패] {base_name} 오류 발생: {e}")
print("모든 변환 작업이 완료되었습니다!")
3. 스크립트 핵심 리뷰: Cell 설정과 주기적 경계 조건(PBC)의 이해
위 코드에서 가장 주의 깊게 보아야 할 부분은 데이터를 읽고 쓰는 과정 사이에 삽입된 `atoms.set_cell()`과 `atoms.set_pbc(True)` 명령어입니다. 본래 `.xyz` 포맷은 원자의 종류와 x, y, z 공간 좌표계 정보만 달랑 가지고 있는 '열린 공간'의 분자 포맷입니다. 반면 우리가 변환하고자 하는 `.cif`나 VASP 포맷은 반복되는 단위 세포(Unit Cell)를 전제로 하는 '주기적 구조(Periodic Structure)' 포맷입니다.
격자(Cell) 정보가 없는 데이터를 강제로 주기적 포맷으로 변환하려 하면 ASE 라이브러리는 에러를 발생시킵니다. 따라서 파이썬 스크립트 내에서 20x20x20 옹스트롬(Å) 크기의 거대한 가상의 진공 상자(Vacuum box)를 만들고, 그 중앙(`atoms.center()`)에 분자를 배치한 뒤 주기적 경계 조건(PBC)을 부여하는 전처리 과정이 필수적입니다. 이 몇 줄의 코드가 바로 스크립트 자동화 시 초보자들이 가장 많이 겪는 오류를 완벽하게 방지해 주는 핵심 노하우입니다.
결론: 데이터 전처리 자동화가 딥러닝 연구의 시작점입니다
수천 개의 데이터를 다루는 인공지능 신소재 탐색 연구에서 마우스 클릭 기반의 그래픽 사용자 인터페이스(GUI) 툴은 그 수명을 다했습니다. 오직 코딩을 통한 파이프라인만이 막대한 양의 데이터를 통제할 수 있습니다. 오늘 공유한 파이썬 일괄 변환 코드는 양자 화학 계산의 시작을 준비하는 완벽한 셋업 도구이자, 향후 머신러닝 데이터셋을 정제할 때 요긴하게 쓰일 강력한 무기입니다. 코드를 직접 복사하여 로컬 컴퓨터의 폴더 환경에 맞게 수정해 보시고, 여러분만의 데이터 자동화 워크플로우를 완성해 보시기 바랍니다. 이어지는 다음 포스팅에서는 터미널이나 VS Code 환경이 익숙하지 않은 실험실의 동료 연구자들을 위해, 이러한 파이썬 스크립트를 웹 브라우저에서 버튼 클릭만으로 실행할 수 있게 만들어주는 'Streamlit(스트림릿) 웹 대시보드 구축법'을 튜토리얼로 다루어 보겠습니다.