前言

        .sdf和.msp文件都可以用来存储分子信息,.sdf文件可以用rdkit读取,.msp文件可以用matchms读取。

读取

rdkit安装

pip install rdkit

.sdf读取

from rdkit import Chem


suppl_h = Chem.SDMolSupplier('../data/HMDB/f_hmdb.sdf') # 得到一个迭代器
mols_h = [mol for mol in suppl_h if mol] 
hmdb_smi = [mol.GetProp('SMILES') for mol in mols_h]
hmdb_smi_set = set(hmdb_smi)

 分子mol有一些常用的函数:

mol.GetPropsAsDict() # 可以获得分子的所有key及其value
smi = 'COO'
mol.SetProp('SMILES', smi) # 可以设置mol的属性

.msp读取

         把.msp文件当成普通的文本文档去读取,主要涉及字符串操作。

def read_msp2mgf(file_path:str, save_path:str=None):
    f = open(file_path, 'r')
    mols = f.read().split('\n\n')[:-1]
    spectra = []
    for mol in mols:
        lines = mol.split('\n')
        Name, DB, InChIKey, SMILES, Precursor_type, Spectrum_type, PrecursorMZ, ExactMass, Num_Peaks =\
            None, None, None, None, None, None, None, None, None
        correct = True # 格式正确 
        mz, inten = [], []
        for l in lines:
            if l.startswith('Name:'):
                Name = l.split(': ')[-1]
            elif l.startswith('DB:'):
                DB = l.split(': ')[-1]
            elif l.startswith('InChIKey:'):
                InChIKey = l.split(': ')[-1]
            elif l.startswith('SMILES:'):
                SMILES = l.split(': ')[-1]
                if SMILES == 'NA':
                    correct = False
                    break # 格式不对直接跳出,没必要继续做 
            elif l.startswith('Precursor_type:'):
                Precursor_type = l.split(': ')[-1]
            elif l.startswith('Spectrum_type:'):
                Spectrum_type = l.split(': ')[-1]
            elif l.startswith('PrecursorMZ:'):
                if Spectrum_type == 'MS2' and l.split(': ')[-1] != 'NA':
                    try:
                        PrecursorMZ = float(l.split(': ')[-1])
                    except:
                        correct = False
                        print(DB)
                        break
            elif l.startswith('ExactMass:'):
                ExactMass = float(l.split(': ')[-1])
            elif l.startswith('Num Peaks:'):
                Num_Peaks = int(l.split(': ')[-1])
            elif ':' not in l:
                mz.append(float(l.split(' ')[0]))
                inten.append(float(l.split(' ')[1]))
        if correct:
            mz = np.array(mz)
            inten = np.array(inten)
            metadata = {'Name':Name, 'InChIKey':InChIKey,'SMILES':SMILES, 'ExactMass':ExactMass,'Num Peaks':Num_Peaks, 
                        'Spectrum_type':Spectrum_type, 'Precursor_type':Precursor_type,'PrecursorMZ':PrecursorMZ}
            spectrum = Spectrum(mz, inten, metadata)
            spectra.append(spectrum)
    if save_path:
        save_as_mgf(spectra, save_path)
    else:
        return spectra

        此外可以使用matchms库进行读取:

pip install matchms

        使用matchms中的load_from_msp函数:

from matchms.importing import load_from_msp

spectrums = [s for s in load_from_msp("MassBank_NIST.msp")]

结语

        有问题欢迎在评论区讨论。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐