Химия и PascalABC.Net

Да, если Вы выбрали учебник (пособие) по тому или иному языку, либо по программированию на базе того или иного языка. Я напомню, что в основе программы лежит алгоритм (чаще - набор алгоритмов). Умение программировать включает в себя умение строить алгоритмы. Но алгоритм не зависит от языка программирования, поскольку любая программа - всего лишь запись алгоритма по правилам той или иной системы программирования. С Д.Кнутом, боюсь, Вы если и справитесь, то уже не в этой жизни - слишком академичен этот труд для решения повседневных задачек.

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

И еще, если Вы выбрали синтаксис языка Турбо Паскаль, вряд ли наш форум будет Вам полезен. Здесь PascalАВС.NЕТ: мы не хотим мириться с технологиями программирования полувековой давности.

1
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5C=COC5OC4=C1
2
COC1=C2C3=C(C(=O)OCC3)C(=O)OC2=C4C5C=COC5OC4=C1
3
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5CC(OC5OC4=C1)O
4
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C(=C1)OC5C4(C=CO5)O

Это что, под LISP писали? )))

1 лайк

Вот так можно с файлами. На экран тоже дублируется.

var
  MT := Dict(KV('C', 12.0096), 
             KV('O', 15.99903),
             KV('H', 1.00811));// Таблица Менделеева (сокращённая версия)

function Mass(mol: string): real;
begin
  result := 0;
  foreach var atom: char in mol do
  begin
    var a := atom.ToUpper;
    if a in MT then
      result += MT[a];  
  end; 
end;

begin
  var smiles := ReadAllLines('file_SMILES.txt');
  var res := OpenWrite('file_SMILES_results.txt');
  var i := 0;
  while i < smiles.Length do
  begin
    var num := smiles[i];
    var mol := smiles[i + 1];
    var s := $'{num,4}: {mol,60}   ({Mass(mol):f7}) ';
    s.Println;
    res.Writeln(s);
    i += 2;
  end;  
  res.Close();
end.

Что тут можно менять:

  1. Саму таблицу Менделеева, разумеется
  2. В строке var s := $'{num,4}: {mol,60} ({Mass(mol):f7}) '; числа 4 и 60 – для выравнивания. Их можно или вообще убрать (вместе с запятыми), или поменять под собственные нужды. Число 7 в {Mass(mol):f7} – количество знаков дробной части массы.

Как-то так. А заняться Вам лучше (как мне кажется) не Кнутом, а скачать бесплатные книжки с сайта PascalABC.NET, прямо с главной страницы внизу. В данном состоянии они Вам будут полезнее :slight_smile:

2 лайка

Уважаемые коллеги, спасибо вам за ответы. Это действительно всё интересно. Книги я с сайта скачал и очень внимательно прочитал. Именно про них я и писал: они дают полную информацию о стркутуре языка, но не позволяют развить ту самую “извилину програмиста” которая позволяет во всем этом массиве ориентироваться. Большое спасибо за новый код. Я постараюсь его пошагово разобрать. Приведённый мной файл -это не код. Это описание молекул.

PascalABC.NET позиционируется не только как язык для обучения программированию, но и как язык для научных вычислений. Надо пользоваться! :slight_smile:

1 лайк

А что, учитываем только буковки, цифры и прочие значки пропускаем? Количество буковок множим на их атомарные веса?

Вроде да. Я так понял, что это не школьная химическая формула, типа H2SO4. А цифры указывают номер атома. Если я неправ, то надо переделывать программу.

Я думаю, тут сложнее. COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5C=COC5OC4=C1

Слишком много “атомов” без номера, а есть и повторяющиеся. Ну да не суть. Если просто сумма, то чего голову ломать?

Да, не совсем ясно. Если там какой подвох, топикстартер скажет :slight_smile:

Химия - это наука!

2 лайка
 - В этой квартире раньше жил химик, - говорит хозяин молодому человеку,
   который хочет снять у него квартиру.
 - Он постоянно экспериментировал и как раз в этой комнате.
 - А-а... Вероятно, пятно на потолке - это результат его экспериментов?
 - Нет, это сам химик.
...Что смешно: те лекарства, что подробно делаем, точно выдерживая технологию,
сами и глотаем. А потом слышны медицинские крики — как же, точно по формуле
СН3СОС2Н5 плюс метилхлотилгидрат на пару — не помогает, а точно такая же
швейцарская сволочь эту бациллу берет. Опять проверяем СН3СОС2Н5 на пару — не берет,
и, что особенно противно, название у них одинаковые.
     (М. Жванецкий)
1 лайк

Рад, что задача заинтересовала вас. Чтоб избежать повторений, я предлагаю ознакомиться с описанием принципа построения формулу по ссылке, которую я дал в самом начале. Особенно обратите внимание на раздел “Основные принципы построения SMILES”.

Это машинное описание структурной формулы молекулы. Химическая формула данного вещества значительно проще. Теоретически, имеет смысл попробовать машинно переводить СМАЙЛы в нормальные формулы и считать уже их…

А нельзя попроще этот вопрос решить для начала. Ну например, та же формула 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 лайка