#sorting #printing #rounding #string-formatting
#сортировка #печать #округление #форматирование строк
Вопрос:
В масс-спектрометрии (MS) молекулы ионизировались и разбивались на фрагменты (ионы), которые отклонялись сильным магнитным полем в соответствии с их отношением массы к заряду (m / z) и, наконец, обнаруживались. Результирующие данные с детектора называются масс-спектром, которые представляют (m / z) s результирующих фрагментов в зависимости от соответствующих интенсивностей (обилия). В приведенном ниже примере приведен масс-спектр толуола (C7h8). Как показано на рисунке, наиболее интенсивному иону (m /z = 91) присваивается значение 100%, и оно называется базовым пиком:
В табличном формате он будет представлен в виде:
m/z, A
45.47, 8.91
46.62, 9.21
...
91.27, 100
93.541, 54.369
Где первый столбец соответствует фрагментам m / z, а второй — относительному содержанию; каждая строка называется пиком.
Для правильного форматирования такого рода данных в таблицу, готовую к публикации, например, следующим образом:
| Analyte | Molecular formula | Molecular weight (Da) | [M] *m/z* | MS fragments m/z |
|---------|-------------------|-----------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Toluene | C7H8 | 92.14 | 91 | 94 (5), 93 (72), **91 (100)**, 91 (2), 89 (4), 78 (2), 76 (1), 67 (5), 65 (50), 64 (6), 64 (27), 62 (10), 61 (5), 54 (4), 53 (6), 52 (23), 51 (12), 50 (1), 47 (9), 45 (9). |
Я начал писать скрипт (на Python), который должен был выполнять следующее:
- Чтение табличных масс-спектров многих молекул из текстовых файлов (txt или csv)
- Для каждого файла отсортируйте пики по уменьшению m / z
- Округлите как (m / z) s, так и относительное содержание (A) до ближайшего целого числа
- Отбрасывайте пики со слабым относительным содержанием (A<1)
- Распечатайте список базовых пиков и пиков в соответствии с приведенным выше примером
- Создайте таблицу в формате публикации, как .pdf или .doc
Это моя попытка использовать библиотеку python pandas:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import glob, os
from os.path import splitext
os.chdir("/path_to_inupt_file")
import pandas as pd
def print_mzlist(fx):
# Read peaks table and sort according to *m/z*
f = pd.read_csv(fx)
compname=str(os.path.splitext(fx)[0])
df = pd.DataFrame(f)
dfs = df.sort('m_z',ascending=False)
# Strip peaks with *A* < 1
dfss = dfs.query('A > 1')
# Select base peak with A = 100% and add 1 to m/z because the ionization mode is positive
base_peak=dfs.query('A == 100') 1
# Create the list of peaks with base_peak as first element
peaks_list = ""
bps = str("%s MS1[%0.f]: " %(compname.title(), base_peak['m_z']))
# Append the Compound name *compname* and *base_peak*
peaks_list = peaks_list bps
# Append peaks list
for index, row in dfss.iterrows():
peaks_list = str ("%.0f (%0.f), " % (row['m_z'], row['A']))
peaks_list = peaks_list[:-2] '.'
return (peaks_list)
# Open the text file to store results
text_file = open("Results.txt", "w")
# Reading csv files and printing the results
for filename in glob.glob("*.csv"):
print "Processing the file", filename
pk= print_mzlist(filename)
text_file.write("{}n".format(pk))
print "Wrinting results to:", text_file.name
text_file.close()
print "Done"
Вывод:
Xylene MS1[92]: 107 (6), 106 (66), 105 (29), 104 (3), 103 (6), 102 (1), 92 (8), 91 (100), 89 (2), 79 (7), 78 (6), 77 (12), 74 (1), 65 (6), 63 (5), 62 (2), 53 (3), 52 (3), 51 (9), 50 (4), 41 (1), 39 (8), 38 (1), 27 (4).
Toluene MS1[92]: 94 (5), 93 (72), 91 (100), 91 (2), 89 (4), 78 (2), 76 (1), 67 (5), 65 (50), 64 (6), 64 (27), 62 (10), 61 (5), 54 (4), 53 (6), 52 (23), 51 (12), 50 (1), 47 (9), 45 (9).
Cumene MS1[106]: 121 (3), 120 (27), 106 (9), 105 (100), 104 (3), 103 (7), 102 (1), 91 (6), 79 (12), 78 (6), 77 (14), 65 (2), 63 (2), 53 (1), 52 (3), 51 (9), 50 (3), 41 (3), 39 (6), 28 (1), 27 (4).
Styrene MS1[105]: 105 (9), 104 (100), 103 (41), 102 (6), 89 (2), 79 (2), 78 (35), 77 (17), 76 (4), 75 (2), 74 (3), 65 (1), 63 (5), 62 (2), 52 (7), 51 (17), 50 (7), 39 (6), 38 (1), 27 (3).
Исходные файлы csv доступны в этом репозитории github.
Что мне нужно от сообщества stackoverflow:
- Пересмотрите код (любые предложения)
- Посоветуйте мне метод (или библиотеку) для форматирования результатов в виде таблицы и распечатки в формате PDF или doc
Комментарии:
1. В чем здесь вопрос? Вы просите нас создать программу для вас?
2. Мне нужна только небольшая помощь или предложения по сценарию (библиотеки, функции). Я работаю над.
3. Вам не нужны никакие библиотеки. Просто прочитайте файл построчно, превратите большую часть строк текста в набор чисел, поместите их в список, отбросьте, отсортируйте и округлите числа, затем распечатайте их в требуемом формате