본문 바로가기
시뮬레이션 기반 사이언스

[계산 화학 자동화] 파이썬으로 ORCA/Gaussian 시뮬레이션 입력 파일 100개 자동 생성 및 결과 데이터(Energy, HOMO/LUMO) 파싱하기

by 지식보따리상상 2026. 5. 19.

[계산 화학 자동화] 파이썬으로 ORCA/Gaussian 시뮬레이션 입력 파일 100개 자동 생성 및 결과 데이터(Energy, HOMO/LUMO) 파싱하기

지난 포스팅에서는 파이썬(Python) 머신러닝(scikit-learn)을 활용하여 신소재의 물성을 예측하는 AI 모델을 구축해 보았습니다. 인공지능이 똑똑해지려면 결국 양질의 데이터가 대량으로 필요합니다. 금속유기골격체(MOF)의 리간드(Ligand) 구조를 스크리닝하거나 2차원 GFET 채널 물질의 특성을 연구할 때, 우리는 밀도범함수이론(DFT) 계산을 수행합니다. 하지만 100개의 후보 물질에 대해 ORCA나 Gaussian과 같은 양자 화학 소프트웨어를 돌리기 위해, 메모장을 열어 좌표(XYZ)를 복사하고 계산 키워드를 일일이 타이핑하여 100개의 입력 파일(.inp)을 만들고 계시지는 않나요? 계산이 끝난 후 수만 줄의 텍스트(.out) 속에서 'Final Energy'나 'HOMO-LUMO Gap' 수치만을 찾아 엑셀에 옮겨 적는 일은 연구자의 영혼을 갉아먹는 단순 노동입니다. 이번 글에서는 파이썬과 정규표현식(Regex)을 활용하여 계산 화학 시뮬레이션의 시작과 끝을 완벽하게 무인화하는 스크립트를 소개합니다.


1. 대량 스크리닝의 첫 단추: 입력 파일(.inp) 자동 생성기

DFT 계산을 돌리려면 원자들의 3차원 좌표가 담긴 `.xyz` 파일과, 어떤 수준(Level of theory)으로 계산할지 지시하는 키워드(예: ! B3LYP def2-SVP Opt Freq)가 결합된 입력 파일이 필요합니다.

파이썬의 문자열 포매팅(f-string)을 활용하면 특정 폴더에 있는 수십 개의 `.xyz` 파일들을 순회하며, 동일한 계산 조건을 적용한 ORCA 입력 파일들을 단 1초 만에 공장처럼 찍어낼 수 있습니다. 사용자가 실수로 전하(Charge)나 다중도(Multiplicity)를 잘못 입력하여 계산이 중간에 뻗어버리는 참사(Human Error)를 원천적으로 차단할 수 있습니다.


2. 수만 줄의 텍스트에서 보물 찾기: 정규표현식(Regex)의 마법

계산이 성공적으로 끝나면 ORCA는 방대한 양의 텍스트로 이루어진 `.out` (또는 `.log`) 파일을 뱉어냅니다. 이 거대한 텍스트의 바다에서 우리가 원하는 수치는 보통 "FINAL SINGLE POINT ENERGY"라는 특정 문장 바로 옆에 위치합니다.

파이썬의 내장 모듈인 `re` (Regular Expression, 정규표현식)를 사용하면 텍스트 파일 전체를 스캔하면서 우리가 지정한 패턴(예: 'Energy'라는 글자 뒤에 나오는 숫자)과 일치하는 데이터만 귀신같이 낚아챌 수 있습니다. 마우스 스크롤을 내리며 눈이 빠져라 수치를 찾던 과거와는 작별입니다.


3. 실전 파이썬 코드: ORCA Output 파일 일괄 파싱 및 CSV 정리

아래의 코드는 특정 폴더(./calc_results/)에 있는 수십 개의 ORCA 결과 파일(`.out`)을 한 번에 읽어 들여, 계산이 정상적으로 끝났는지 확인하고 최종 에너지(Final Energy)HOMO-LUMO 갭(Gap) 수치를 추출하여 Pandas 엑셀(CSV)로 깔끔하게 요약해 주는 실전 스크립트입니다.



import glob
import re
import pandas as pd
import os

# 1. ORCA 결과 파일이 모여있는 폴더 경로 지정
output_files = glob.glob('./calc_results/*.out')

# 추출한 데이터를 담을 리스트
parsed_data = []

# 2. 정규표현식(Regex) 패턴 정의
# (.*?) 은 뒤에 나오는 숫자 데이터를 그룹으로 묶어서 가져오겠다는 뜻입니다.
energy_pattern = re.compile(r"FINAL SINGLE POINT ENERGY\s+(-?\d+\.\d+)")
gap_pattern = re.compile(r"HOMO-LUMO GAP\s+.*?\s+(\d+\.\d+)\s+eV")
success_pattern = re.compile(r"ORCA TERMINATED NORMALLY")

print(f"총 {len(output_files)}개의 계산 결과를 분석합니다...")

# 3. 반복문을 돌며 파일 읽기 및 데이터 추출
for file in output_files:
    file_name = os.path.basename(file)
    
    # 텍스트 파일 읽기
    with open(file, 'r', encoding='utf-8', errors='ignore') as f:
        content = f.read()
        
    # 계산 정상 종료 여부 확인
    if not success_pattern.search(content):
        print(f"[경고] {file_name}: 계산이 비정상 종료되었거나 덜 끝났습니다.")
        continue

    # 에너지 및 밴드갭 수치 찾기 (매칭되는 결과가 있으면 float로 변환)
    energy_match = energy_pattern.search(content)
    gap_match = gap_pattern.search(content)
    
    energy_val = float(energy_match.group(1)) if energy_match else None
    gap_val = float(gap_match.group(1)) if gap_match else None
    
    # 리스트에 딕셔너리 형태로 저장
    parsed_data.append({
        'Molecule': file_name.replace('.out', ''),
        'Final_Energy(Eh)': energy_val,
        'HOMO_LUMO_Gap(eV)': gap_val
    })

# 4. 추출된 데이터를 Pandas 데이터프레임으로 변환 후 CSV 저장
df = pd.DataFrame(parsed_data)
df.to_csv('DFT_Screening_Results.csv', index=False)

print("\n파싱 완료! 결과가 'DFT_Screening_Results.csv' 파일에 저장되었습니다.")
print(df.head()) # 결과 미리보기

4. 머신러닝 파이프라인과의 완벽한 시너지

이 스크립트를 실행하면 며칠 동안 돌아간 수백 개의 분자 시뮬레이션 결과가 단 1초 만에 `DFT_Screening_Results.csv`라는 하나의 마스터 파일로 압축됩니다. 눈치채셨나요? 이 정제된 CSV 파일은 앞서 28편에서 다루었던 scikit-learn 머신러닝 모델의 완벽한 '학습 데이터(Training Data)'가 됩니다.

파이썬으로 입력 파일을 100개 만들고(Input Generation) -> 슈퍼컴퓨터로 계산을 돌리고 -> 파이썬으로 결과를 파싱하여 CSV로 묶고(Output Parsing) -> 이를 머신러닝에 넣어 최적의 소재를 예측하는 것. 이것이 바로 전 세계 최고 수준의 연구 그룹들이 적용하고 있는 진정한 의미의 '연구 자동화 풀스택(Full-stack)'입니다.


결론: 반복 작업은 컴퓨터에게, 깊은 사고는 연구자에게

양자 화학 계산은 원자와 전자의 상호작용이라는 자연의 신비를 푸는 우아한 작업입니다. 하지만 그 과정에 수반되는 파일 복사, 텍스트 검색, 엑셀 타이핑은 전혀 우아하지 않습니다. 정규표현식(Regex)과 파이썬 파일 입출력 스킬은 이러한 단순 노무에서 여러분을 해방시킬 가장 예리한 메스입니다. 지금 바로 연구실 컴퓨터에 쌓여있는 수백 개의 `.out` 파일 폴더에 이 스크립트를 돌려보십시오. 컴퓨터가 데이터를 수집하는 동안, 여러분은 한 잔의 커피와 함께 그 데이터가 의미하는 물리적 현상에 대해 더 깊이 고찰할 수 있을 것입니다.