CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

1H-NMRスペクトル解析Pythonプログラムで分子構造解析・定性分析

2025-01-11 21:31:32 | python
学生時代、NMRスペクトル解析についてしっかり学ばずに卒業してしまい、めちゃくちゃ後悔している。
実験・実習でもNMRスペクトル解析は一回しかやらず、しかもNMR分析装置はいじらせてもらえず、技官が操作していた。

実験・実習は二人一組の班でやっていて、分析するサンプルは二つの班で一本、共同で分析に出していた。

IRも液クロもガスクロも、分析化学の教授がノート持ち込み可の楽勝で単位を取れるやさしい先生だったので、単位が取れただけで何も身に付かず後悔している。

NMRスペクトルのグラフをAIで分析したら、簡単に分子の構造がわかり、何の分子かまで判定出来てしまうのでは?と甘く考えていたが、実際はそうでもないらしい。

官能基ごとにピークの数、ピークの位置、ピークの面積が決まっているらしいから、OCRリーダーみたいにチャチャッと結果が出ると思った。










import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color
from scipy.signal import find_peaks
from sklearn.cluster import KMeans

class NMRAnalyzer:
def __init__(self, root):
self.root = root
self.root.title("NMRスペクトル解析ツール")
self.label = tk.Label(root, text="NMRスペクトル解析ツール", font=("Helvetica", 16))
self.label.pack()
self.canvas = tk.Canvas(root, width=600, height=400, bg="white")
self.canvas.pack()
self.upload_button = tk.Button(root, text="画像をアップロード", command=self.upload_image)
self.upload_button.pack()
self.analyze_button = tk.Button(root, text="解析開始", command=self.analyze_spectrum)
self.analyze_button.pack()
self.quit_button = tk.Button(root, text="終了", command=root.quit)
self.quit_button.pack()
self.image = None
self.spectrum_data = None
def upload_image(self):
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.png;*.jpg;*.jpeg;*.bmp")])
if file_path:
self.image = Image.open(file_path)
self.image = self.image.resize((600, 400))
self.img_tk = ImageTk.PhotoImage(self.image)
self.canvas.create_image(300, 200, image=self.img_tk)
messagebox.showinfo("成功", "画像が正常にアップロードされました!")
def analyze_spectrum(self):
if not self.image:
messagebox.showerror("エラー", "まず画像をアップロードしてください。")
return
# 画像をグレースケールに変換し、スペクトルデータを抽出
img_array = np.array(self.image.convert("L"))
spectrum = img_array.mean(axis=0)
# ピークの検出
peaks, properties = find_peaks(spectrum, height=50)
peak_heights = properties['peak_heights']
# AI解析 (KMeansクラスタリングでピークの分類)
kmeans = KMeans(n_clusters=len(peaks), random_state=0, n_init=10)
peak_positions = np.array(peaks).reshape(-1, 1)
kmeans.fit(peak_positions)
# 結果の可視化
plt.figure(figsize=(10, 6))
plt.plot(spectrum, label="NMR Spectrum")
plt.scatter(peaks, spectrum[peaks], color='red', label="Detected Peaks")
plt.xlabel("Pixel Index")
plt.ylabel("Intensity")
plt.title("NMR Spectrum Analysis")
plt.legend()
plt.show()
# 結果の表示
result_text = f"検出されたピーク数: {len(peaks)}\n"
result_text += f"ピーク位置: {peaks}\n"
result_text += f"ピーク積分値: {peak_heights.sum():.2f}\n"
messagebox.showinfo("解析結果", result_text)

if __name__ == "__main__":
root = tk.Tk()
app = NMRAnalyzer(root)
root.mainloop()

要求されたライブラリをインストールしてみたものの、skimageだけはうまくいかず、エラーがでて動かない。


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。