Psi4와 RDKit을 사용한 Fukui Index 계산_제4회: 기계 학습을 염두에 둔 다중 분자 연속 계산(배치 처리) 앱 개발
요약
본 글은 Fukui Index 계산을 위해 개발된 GUI 애플리케이션을 확장하여, 수많은 후보 화합물 목록(SMILES 파일)에 대해 연속적인 배치 처리(Batch Processing)가 가능한 기능을 소개합니다. 사용자는 설정한 계산 방법론과 기저 함수를 기반으로 대규모 스크리닝을 자동화할 수 있으며, 진행 상황 시각화와 중단 기능까지 구현하여 연구 효율성을 극대화했습니다.
핵심 포인트
- 수백~수천 개의 화합물에 대한 배치 처리(Batch Processing) 기능을 추가했습니다.
- SMILES 파일 입력을 전용으로 지원하며, 계산 자동화를 실현합니다.
- DFT, B3LYP 등 다양한 화학 계산 파라미터를 유연하게 설정할 수 있습니다.
- 진행 상황 시각화와 'Halt' 버튼을 통해 대규모 계산의 안정성을 확보했습니다.
서론: 단일 분자 분석에서 데이터 기반 스크리닝으로
'Fukui Index (福井指数)' 해설 시리즈를 총 5회에 걸쳐 전해 드리고 있습니다.
지난 제3회에서는 PySide6을 사용하여 연구자가 직관적인 마우스 조작만으로 Fukui Index 계산부터 시각화까지 원활하게 수행할 수 있는 데스크톱 GUI 애플리케이션을 개발했습니다. 이를 통해 계산 화학의 진입 장벽이 크게 낮아졌고, 눈앞에 놓인 '하나의 분자'의 반응성을 이해하기 위한 도구가 완성되었습니다.
하지만 현대의 화학 연구—특히 신약 개발이나 신소재 개발 현장—에서 우리가 평가해야 할 화합물은 1~2개가 아닙니다. 수십, 수백, 때로는 수천에 달하는 방대한 후보 화합물 목록 중에서 원하는 반응성을 가진 분자(혹은 독성의 원인이 되는 대사 부위를 가지지 않은 분자)를 신속하게 스크리닝해야 합니다.
계산이 끝날 때마다 수동으로 다음 SMILES(분자의 문자열 표기법)을 입력하고 실행 버튼을 누르는 방식은 비효율적일 뿐만 아니라 휴먼 에러의 온상입니다.
따라서 시리즈 제4회인 이번 글에서는 지금까지 구축한 계산 로직을 기반으로, 여러 SMILES가 기재된 텍스트 파일을 읽어와 **전자동으로 차례로 Fukui Index를 계속 계산하는 '다중 분자 연속 계산(배치 처리) 애플리케이션'**에 대해 소개합니다.
배치 처리 앱의 UI 설계
이번에 개발한 애플리케이션은 지난번 앱과 마찬가지로 실용성과 모던한 조작성을 추구하여, 좌우 분할형 '2 페인 구성'을 채택했습니다. 왼쪽에는 설정 및 컨트롤 영역을, 오른쪽에는 광활한 'Process Console (로그 표시)'을 배치한 세련된 외관입니다.

1. 입력의 단순화와 SMILES에 특화된 구성 (Input)
입력 데이터는 SMILES 파일(.smi 또는 .txt) 인풋에 특화시켰습니다. 사용자는 'Browse' 버튼을 통해 파일을 지정하고 출력 파일 이름만 설정하면 즉시 계산을 시작할 수 있습니다.

2. 계산 레벨의 유연한 설정 (Calculation Settings)
다수의 분자를 계산할 경우, 계산 비용(계산 시간) 관리가 매우 중요합니다. 이번에는 계산 방법론(DFT, HF, MP2), 범함수(B3LYP, wB97X-D 등), 그리고 기저 함수(3-21G부터 def2-TZVP까지)를 각각 독립된 메뉴에서 자유롭게 조합하여 선택할 수 있도록 했습니다. 탐색의 초기 단계에서는 가벼운 기저 함수로 고처리량(High Throughput)을 수행하고, 유망한 화합물을 추려낸 후에 무거운 기저 함수로 고정밀 계산을 수행하는 등, 다단계 스크리닝에 유연하게 대응할 수 있습니다.

3. 프로그레스 바와 진행 상황의 시각화, 그리고 'Halt (중단)' 버튼 추가
백그라운드 쓰레드(CalcWorkerGNN)로부터 전송되는 진행 신호를 실시간으로 받아 프로그레스 바에 완료율(0%~100%)을 표시합니다.
또한, 본 앱에는 'Halt (중단)' 버튼이 설정되어 있습니다. 수 시간에서 수일에 걸친 연속 계산 도중에 '일단 계산을 중단하고, 그때까지의 결과를 분석하고 싶다'와 같은 신호를 안전하게 처리하여, 그전까지 산출된 화합물의 데이터를 올바르게 CSV로 저장한 후 멈출 수 있습니다.
연속 계산 프로그램의 '견고성'을 지탱하는 설계 사상
하나의 분자를 계산하는 프로그램을 여러 분자의 for 루프(반복 처리)로 감싸는 것만으로는 실용적인 배치 처리 도구가 될 수 없습니다. 양자 화학 계산의 연속 실행에는 특유의 함정이 존재합니다. 본 프로그램에서는 다음 4가지 관점에서 예외 처리와 메모리 관리, 그리고 케모인포매틱스상의 동기 처리를 구현했습니다.
1. 오류로부터의 복구
분자 구조 생성(RDKit)이나, 구조 최적화/전자 상태 계산(Psi4)은 입력된 SMILES가 화학적으로 불가능한 구조이거나 SCF 계산이 수렴하지 않았을 경우 오류(예외)를 발생시킵니다.
본 프로그램에서는 분자 1개 각각의 계산 블록 전체를 try-except 구문(예외 처리)으로 감싸서, 특정 분자에서 오류가 발생하더라도 프로그램을 충돌시키지 않고 안전하게 다음 분자의 계산으로 건너뛰어 루프를 계속하는 설계로 하고 있습니다.
2. Psi4 내부 메모리 클린업 (메모리 누수 방지)
Psi4를 같은 Python 프로세스 내에서 연속적으로 여러 번 호출할 경우, 이전 계산에 사용된 파동 함수나 중간 데이터가 메모리에 잔존(메모리 누수)하여 결국 OS 전체가 멈출 위험이 있습니다.
이를 방지하기 위해 본 앱에서는 새로운 분자의 계산 루프에 진입하기 직전에 psi4.core.clean()와 같은 Psi4의 내부 상태를 강제로 리셋(초기화)하는 명령어를 명시적으로 호출함으로써, 일정한 메모리 사용량을 유지한 채 안정적으로 계산을 지속할 수 있게 했습니다.
3. 안전한 중간 저장(Halt) 인터럽트 처리
Psi4와 같은 외부 프로그램이 고속으로 전자 상태 계산을 수행하는 도중에 Python 측에서 스레드를 강제로 종료(Kill)하면, 메모리 공간 손상이나 프로세스 폭주, 그리고 출력되는 CSV 파일의 파괴가 발생할 수 있습니다.
본 앱의 'Halt' 버튼은 계산의 '인터럽트 체크 방식'을 채택하고 있습니다. 버튼이 눌리면, '현재 계산 중인 분자(1개 분자)의 처리가 완료된 타이밍'을 감지하여 안전하게 break하고 루프에서 탈출합니다. 이를 통해 그전까지 얻어진 정상적인 데이터만을 깔끔하게 정렬하여 CSV에 쓰기며, 오류를 일으키지 않고 안전하게 중간 종료하는 구조로 만들었습니다.
4. RDKit과 Psi4 간의 '원자 인덱스' 동기화
양자 화학 계산을 정확히 수행하려면, 3D 구조를 생성하는 과정에서 수소 원자를 명시적으로 추가(Chem.AddHs)해야 합니다. 하지만 최종적으로 GNN 학습 데이터로 사용할 때, 노드(정점)가 되는 각 원자의 인덱스(번호)가 원래 SMILES의 순서(중원자 순서)와 단 하나라도 어긋나면 기계 학습 입력 데이터로서 전혀 쓸모없게 됩니다.
RDKit의 AddHs 함수는, '원래 분자(중원자)의 인덱스(0부터 시작하는 번호)를 그대로 전방에 유지한 상태로, 추가된 수소 원자를 그 끝(중원자 인덱스 이후)에 붙이는' 유용한 특성을 가지고 있습니다.
본 프로그램에서는 이 특성을 이용하여, Psi4로 계산된 수소를 포함한 모든 원자의 Fukui Index 중에서 '수소 원자(H)'의 결과만을 코드 측에서 감지하여 건너뛰고 제외하고 있습니다. 이를 통해 최종 CSV에 기록되는 중원자의 Atom_Index는 SMILES를 수소 없이 읽었을 때의 원자 인덱스와 1대1로 일치하도록 제어하고 있습니다.
GNN을 염두에 둔 데이터 구조
이번 애플리케이션의 가장 큰 목적은 단순히 계산 결과 CSV 리스트를 만드는 것이 아니라, 그래프 신경망(GNN) 학습 데이터셋(Node Database)을 구축하는 데 있습니다.
GNN은 분자를 '원자(노드)'와 '결합(에지)'의 네트워크로 표현하고 학습하는 최첨단 기계 학습 방법입니다. 분자 전체의 성질을 예측할 뿐만 아니라, '어떤 원자가 반응의 시작점이 될 것인지'와 같은 국소적인 성질을 높은 정확도로 예측하는 능력이 뛰어납니다.
본 앱에서는 연속 계산 루프 안에서 추출된 Mulliken, MBIS, NPA 전하 기반의 Fukui Index($f^+$, $f^-$, $f^0$)를 분자 단위가 아닌 '원자(노드) 단위의 레코드'로 데이터프레임에 추가해 나가는 설계(장축 형식 데이터 구축)를 하고 있습니다.
출력되는 CSV 파일에는 '분자 ID', 'SMILES', '원자 인덱스 번호', '원소 기호' 외에도 각종 Fukui Index가 가지런히 나열됩니다. 이 형식이라면 PyTorch Geometric이나 DGL 같은 심층 학습 라이브러리에, 어긋남 없이 노드 특징량(Node Features)을 읽어 넣기 쉽습니다.
요약 및 다음 예고
본 기사에서는 복수 분자의 Fukui Index를 전자동으로 계산하며 계속하는 배치 처리 GUI 애플리케이션의 설계와, 인포매티크스 구축을 위한 넘버링 동기화 주의점에 대해 소개했습니다.
다음 회차는 드디어 마지막입니다. Fukui Index에 더하여 분자 전체의 거시적인 특징량을 동시에 추출하고, 재료 정보학(MI)용 '하이브리드 데이터셋'을 전자동으로 구축하는 앱을 소개할 예정입니다. 기대해 주세요!
참고 (전 코드)
import sys
import os
import re
...
논의

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn ML의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기