【发布时间】:2021-05-11 07:24:24
【问题描述】:
我从MS-DIAL metabolomics MSP spectral kit containing EI-MS, MS/MS下载了一个大文本文件
文件以 txt 文件形式打开,如下所示:
NAME: C11H11NO5; PlaSMA ID-967
PRECURSORMZ: 238.0712
PRECURSORTYPE: [M+H]+
FORMULA: C11H11NO5
Ontology: Formula predicted
INCHIKEY:
SMILES:
RETENTIONTIME: 1.74
CCS: -1
IONMODE: Positive
COLLISIONENERGY:
Comment: Annotation level-3; PlaSMA ID-967; ID title-AC_Bulb_Pos-629; Max plant tissue-LE_Ripe_Pos
Num Peaks: 2
192.06602 53
238.0757 31
NAME: Malvidin-3,5-di-O-glucoside; PlaSMA ID-3141
PRECURSORMZ: 656.19415
PRECURSORTYPE: [M+H]+
FORMULA: C29H35O17
Ontology: Anthocyanidin O-glycosides
INCHIKEY: CILLXFBAACIQNS-UHFFFAOYNA-O
SMILES: COC1=CC(=CC(OC)=C1O)C1=C(OC2OC(CO)C(O)C(O)C2O)C=C2C(OC3OC(CO)C(O)C(O)C3O)=CC(O)=CC2=[O+]1
RETENTIONTIME: 2.81
CCS: 241.3010517
IONMODE: Positive
COLLISIONENERGY:
Comment: Annotation level-1; PlaSMA ID-3141; ID title-Malvidin-3,5-di-O-glucoside; Max plant tissue-Standard only
Num Peaks: 0
每个化合物在NAME 到下一个NAME 之间都有数据。
我正在尝试做的是删除所有在Num Peaks: 中的值为零的化合物(即Num Peaks: 0。如果化合物的第 12 行是Num Peaks: 0,则删除 Thins 化合物的所有数据 - 12 行向上,删除)。
在上面的复合中,删除NAME: Malvidin-3,5-di-O-glucoside; PlaSMA ID-3141到Num Peaks: 0之间的行
之后,我需要将数据保存回txt或msp格式。
我所做的只是将数据作为列表导入:
with open('path\to\MSMS-Public-Pos-VS15.msp') as f:
lines = f.readlines()
然后创建一个带有索引的列表,其中每个化合物以 link 开头:
indices = [i for i, s in enumerate(lines) if 'NAME' in s]
我想,现在我需要附加差异大于 14 的连续索引(意味着峰值数大于零)link
# to find the difference between consecutive indices.
v = np.diff(indices)
选择那些有差异的 14 并在第一个位置添加一个元素 0
diff14 = np.where(v == 14)
diff14 = np.append([0],diff14[0])
现在我只想选择那些不在 diff14 中的值,以便创建一个包含峰数大于零的化合物的新列表
现在我需要一些循环来选择正确的索引,但不知道如何:
lines[indices[diff14[0]]: indices[diff14[1]]]
lines[indices[diff14[1]+1] : indices[diff14[2]]]
lines[indices[diff14[2]+1] : lines[indices[diff14[3]]]]
lines[indices[diff14[3]+1] : indices[diff14[4]]]
非常感谢任何更好的想法或提示
【问题讨论】:
-
您需要在这里将您的输入解析为例如列表的列表,每个元素包含一个化合物。我建议 3 个步骤:(1)将数据解析为化合物列表,(2)迭代此化合物列表,删除不需要的化合物,(3)将列表输出回文件。根据文件的大小,可以对数据进行 1 次循环,也可以使用 3 次单独的循环。
-
@oystein - “(1) 将数据解析成化合物列表” - 这对我来说是最大的困难 - 我该怎么做?
-
我将我的建议作为答案发布stackoverflow.com/a/66090874/1942837