File size: 2,300 Bytes
eeabcff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import numpy as np
from rdkit import Chem
# from IsoSpecPy import IsoSpec
import IsoSpecPy as iso


def generate_isotopic_pattern(mol_formula, charge=1):
    """生成理论同位素模式"""
    # 初始化IsoSpec计算器
    # calculator = IsoSpec.IsoTotalProb(formula=mol_formula,
    #                                   charge=charge,
    #                                   absolute_accuracy=0.9)
    calculator = iso.IsoTotalProb(formula=mol_formula,
                                  charge=charge,
                                  absolute_accuracy=0.9)
    
    # 获取峰列表 (m/z, 强度)
    peaks = calculator.get_peaks()
    
    # 归一化强度
    intensities = np.array([p[1] for p in peaks])
    intensities /= np.max(intensities)
    
    return [(p[0], intensities[i]) for i, p in enumerate(peaks)]


def compare_isotopic_patterns(exp_pattern, theory_pattern, tolerance=0.01):
    """比较实验与理论同位素模式"""
    score = 0.0
    matched_peaks = 0
    
    for exp_mz, exp_int in exp_pattern:
        for theo_mz, theo_int in theory_pattern:
            if abs(exp_mz - theo_mz) <= tolerance:
                # 余弦相似度计算
                score += exp_int * theo_int
                matched_peaks += 1
                break
    
    # 归一化得分
    if matched_peaks > 0:
        score /= matched_peaks
    return score


# 示例用法
if __name__ == "__main__":
    # 实验数据 (示例值)
    experimental_data = [
        (151.063, 1.00),  # 基峰
        (152.066, 0.32),
        (153.069, 0.05)
    ]
    
    # 候选分子式
    candidate_formulas = ["C8H10N2O2", "C7H10N4O", "C9H10O3"]
    
    best_formula = None
    best_score = -1
    
    for formula in candidate_formulas:
        # 生成理论同位素模式
        theoretical_pattern = generate_isotopic_pattern(formula, charge=1)
        
        # 比较相似度
        score = compare_isotopic_patterns(experimental_data, theoretical_pattern)
        
        print(f"Formula: {formula} | Score: {score:.4f}")
        
        if score > best_score:
            best_score = score
            best_formula = formula
    
    print(f"\nBest match: {best_formula} (Score: {best_score:.4f})")