Химия и PascalABC.Net

А нельзя попроще этот вопрос решить для начала. Ну например, та же формула COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5C=COC5OC4=C1 - я в ней вижу 17 “углеродиков” и 6 “кислородиков” - их там на самом деле столько? Или все же циферки какую-то еще кратность подразумевают? Ну просто можете, как пример, эту формулу расписать (без умножения на атомные веса, конечно)? Потом можно будет по Вашей росписи проверить свое понимание “Основных принципов…”

Вот в Интернете я сервис нашел, который обозвал это все C17H12O6 [312.278 gr/mol]%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA

1 лайк

Прочитал я про этот SMILIS - еще тот, простите мой плохой французский, геморрой. Одна светлая голова решила сэкономить и исключить из описания атомы водорода, считая, что специалисту они “и так понятно где и сколько”. В результате, чтобы всего лишь определить, а сколько все же там атомов водорода, надо раскручивать граф, отягченный различными придумками в виде дополнительных ограничителей и символов. В целом - задачка ну очень на любителя, у которого полно времени и желания изучать вузовские основы органической химии.

1 лайк

Всё уже украли до нас: http://www.cheminfo.org/Chemistry/Parsing_data/Smiles_List_to_molecule_properties/index.html

А вообще, предложена весьма нетривиальная задача, Вполне вероятно, что наряду со смайлами должна быть и обычная или брутто-формула. Иначе мы все тут сдохнем.

1 лайк

Ну да, осталось всего-ничего: библиотеку заполучить и прикрутить.

Да, это именно афлатоксин :slight_smile: Система работает. Проблема в том, что у меня таких СМАЙЛОВ 1500 штук и руками это все считать очень долго.

Вы всё правильно написали, но на данном этапе можно обойтись без водорода, оставив только углерод, кислород и уникальные компоненты. мне нужно молекулы ранжировать по массе, а задача в построении адекватной пространственной структуры не стоит.

Класс! спасибо! Но жаль ветку закрывать, поэтому я тут продолжу писать о своих попытках овладеть программированием.

Не понял. Если неизвестно, сколько в молекуле атомов водорода (а их же там не одинаково), Вы получите неверную массу и ранжирование будет некорректным. Это первое. Второе. Если бы Вы дали файл с полным списком SMILES, можно было бы для начала выловить все уникальные элементы, чтобы понять, какие атомные массы нужны, а не вбивать всю таблицу Менделеева.

2 лайка

вы правы и водород действительно надо учитывать. Тут трудно пояснить без занудства. Но если вам интересно… В органических молекулах валентности атомов чрезвычайно редко меняются. Их можно взять за константы. Например, углерод (С) всегда четырёх валентный. Это значит, что один атом углерода может присоединить к себе четыре атома водорода. В структурных формулах водород обычно не пишут, так как понятно, что любая свободная связь “забивается” водородом. Например, углерод соединяется с углеродом. Тогда получается, что одна связь истрачена на другой углерод: С-С и у каждого атома остаётся по три свободные, на которые мы можем “повесить” по одному водороду. Итого получаем: (С+3Н)-(С+3Н). Такой способ записи совершенно не академичен, но позволяет наглядно показать процесс. Естественно, следует учитывать, что в органических молекулах атомы между собой могут связываться двумя и тремя связями (например: С=С. Здесь два атома углерода связались двойной связью и поэтому у каждого осталось ещё по две, и как следствие, у каждого должно быть ещё по два водорода). Это необходимо учитывать в СМАЙЛсах они обозначаются чёрточками. Теоретически, посчитав количество углерода и определив по схеме количество пустых связей, то всегда можно сказать, какое количество водорода будет в молекуле.

Вы дали ссылку на замечательный ресурс! Ещё раз - большое спасибо! сейчас сделаю таблицу и постараюсь опубликовать.

Спасибо, я последний раз с химией, как с наукой, соприкасался в 1971 году, правда, это была не органическая, а физическая химия. Но тогда еще умели заставить учиться, так что кое-что до сих пор в голове задержалось, в частности, теория валентности. Именно поэтому и возник вопрос, что нужно не просто подсчитывать количество “буквочек”, а учитывать свободные связи, считая, что они заняты одновалентным водородом. А этот процесс как раз алгоритмически и представляет собой обход графа, зашифрованного в SMILES. Отсюда и речь о том, что эта задача отнюдь не тривиальна.

1 лайк

SMILES очень удобен тем, что позволяет в одну строку записать пространственную формулу вещества. Суть в том, что у органических молекул пространственная ориентация определяет её биологическую активность. Простые элементы (углерод, кислород, водород) выступают как кирпичи для построения чего-то большего.

Я не спорю с тем, что для работы химиков SMILES удобен - уже хотя бы потому не спорю, что “глупо спорить о вкусе ананасов с теми, кто их ел”. Но для той цели, которую ставите Вы, удобнее был бы формат SLN, в котором водород также присутствует.

У меня после эксперимента есть вот такой файл и приходится работать с тем, что есть. file_SMILES_02.txt (5,2 КБ)

Собственно, я данную работу воспринимаю как шанс научиться основам программирования. Мне очень интересно узнать мнение “профи” о подходах к обработке информации. На данный момент, для меня всё ещё сложно определить, этот можно ли рассматривать данные как массив, или просто строки? Что об этом думают програмисты?

Рассмотрение данных в программировании зависит от алгоритма их обработки. Изначально, если файл текстовый, то он рассматривается как совокупность строк. Сакральный смысл, который Вы придаете строкам, целиком зависит от Вас. Попробуем аллегорию. Если Вы замерзаете, то страницы книги условно - топливо для костра и не обязательно вырывать их по одной. Если Вы читаете увлекательный роман, то Ваше восприятие не работает на подсчет страниц, абзацев, предлодений, строк и слов. Если Вы верстаете книгу, наоборот, до ее содержания Вам обычно нет никакого дела, зато на первый план выходят страницы, абзацы, выключка строк, интерлиньяж и прочие премудрости верстки.

На первом этапе постижения программирование озадачивает и дезориентирует именно отсутствием каких-либо рамок. К полной свободе надо привыкнуть. Тем не менее, думаю, что надо подробнее описать цель анализа. В опубликованной мной таблице представлены соединения, каждое из которых имеет свой порядковый номер. Когда проводился эксперимент, мы оперировали только номерами и не знали, какое вещество используем. Суть эксперимента была проста: в лунках специальных планшетов выращивались отдельные клетки человека. Клетки были одного типа. Вот тут фото из интернета, но суть передаёт. В лунки мы вносили вещества и смотрели, что происходит с клетками. Данные о скорости роста, скорости деления, морфологии и прочем записывались отдельно и привязаны к порядковому номеру соединения. Я хотел бы объединить эти данные и провести кластерный анализ в надежде найти закономерность между ответом клеток на воздействие и структурой вещества. Главная цель - научиться делать это самому. Так-то, конечно, заказать такую работу можно - питоноводов-биоинформатиков много…

Конкретно Ваши данные достаточно циклически читать построчно, как текстовый файл, считая пробел разделителем слов. Поскольку у Вас номера соединений совпадают с номерами строк, первое слово пропускаем, и из второго получаем нужную массу. Результат отправляем в список типа List, который затем сортируем.

Спасибо за консультацию. Постараюсь написать код и опубликую его здесь для комментариев.

Но можно пока сделать проще, примерно так:

function Mass(s: string): real;
begin
  Result := Random(110.0, 250.0)
end;

begin
  var a := ReadAllText('file_SMILES_02.txt')
      .ToWords[1::2]
      .Select((v, i) -> (i + 1, Mass(v)))
      .OrderBy(t -> t[1])
      .Select(t -> $'{t[0]} {t[1]}')
      .ToArray;
  WriteAllLines('file_Mass_02.txt', a)
end.

Осталась “мелочь” :stuck_out_tongue_winking_eye: - подменить тело функции Mass на “правильное”.

Конечно, Вы можете запустить код, он работающий.

Что-то у меня не пошла в PascalАВС.NЕТ эта штуковина, ругается на загрузку OpenBabel.dll. Говорит, “плохая она”. Несмотря на то, что вроде и инсталлировал все, как указано. Поместить не могу сообщение, потому что сбросил все. На dll и reference написал, и путь указывал полный, и в папку с исходным текстом клал… Причем, Intellisence нормально распознает в ней и классы, и методы…