Привет, Хабр! Аргентум на связи, сегодня мы будем решать химические задачи, проводить исследования по химии с нуля на языке программирования Python. Это первая, моя дебютная статья из серии "Змеиная наука", где мы будем создавать программное обеспечение для научных вычислений.
Почему именно Python? В рейтинге GitHub'а он занял 2-е место, уступив место JavaScript, а количество курсов "Стань программистом за 2 месяца и получай $300к в наносекунду" просто зашкаливает. Из-за этого, кстати, на одну ваканзию Junior Python разработчика может прилететь до 1000, а может и больше, заявок. Но он, довольно легко изучается, по сравнению с многими другими языками.
Химия, как наука, всегда требовала точности, глубокого анализа и системного подхода. С развитием вычислительных технологий открылись новые перспективы для химиков: возможность использовать программирование для моделирования, анализа данных и ускорения процессов исследований. В этой статье мы погрузимся в мир химии, представленный через призму Python - мощного языка программирования, который стал надежным инструментом для химиков в их исследованиях. Мы рассмотрим ключевые библиотеки (а может даже обойдемся без них), инструменты и подходы, позволяющие применять Python для анализа химических данных, создания моделей молекулярной структуры и многого другого. Давайте вместе исследуем, как Python становится неотъемлемой частью химических исследований, расширяя горизонты возможностей в этой захватывающей научной области.
Краткое введение
Для работы, нам желательно создать рабочее окружение. Вы можете использовать GitHub и Git, но здесь я приведу примеры без системы контроля версий.
Ниже я привел код для создания и активации виртуального окружения Python. Почему мы не устанавливаем библиотеку в систему, и не создавать эти ваши окружения? Потому что это плохая практика, и сам pip не даст вам этого (PEP 668). Ну, как не даст, даст, но с флагом --break-system-packages
# Способ для Linux-систем
python3 -m venv venv # создаем виртуальное окружение
source venv/bin/activate # активируем его
pip3 install --upgrade pip # обновляем pip
Теория
Вспомним школьную программу. А вы помните её?
1. Что такое относительная атомная масса и молекулярная масса:
Относительная атомная масса (также известная как атомная массовая единица, amu) - это масса атома в единицах массы атома углерода-12. Она используется для измерения массы атомов и молекул.
Относительная молекулярная масса - это сумма относительных атомных масс атомов в молекуле. Она позволяет определить массу молекулы в отношении массы атома углерода-12.
2. Число Авогадро:
Число Авогадро равно приближенно 6.02214076 x 10^23 и представляет собой количество атомов или молекул в одном моле вещества. Это основная константа, используемая для связи массы атомов и молекул с массой вещества в молях.
3. Моли:
Моль - это единица измерения количества вещества. Один моль вещества содержит число Авогадро частиц (около 6.022 x 10^23) атомов, молекул или других элементарных частиц.
4. Металлы и неметаллы:
Металлы - это элементы, обладающие характерными свойствами, такими как отличная теплопроводность, проводимость электричества, металлический блеск и гибкость. Примеры металлов включают железо, медь и алюминий.
Неметаллы - это элементы, обладающие характеристиками, противоположными металлам. Неметаллы обычно плохо проводят тепло и электричество и могут быть хрупкими. Примеры неметаллов включают кислород, азот и серу.
5. Электроны, нейтроны и протоны:
Электроны - это элементарные частицы, обладающие отрицательным электрическим зарядом. Они находятся в орбиталях вокруг ядра атома.
Протоны - это элементарные частицы, обладающие положительным электрическим зарядом, и они находятся в ядре атома.
Нейтроны - это элементарные частицы, не имеющие электрического заряда, и они также находятся в ядре атома.
6. Заряд ядра и энергетические уровни:
Заряд ядра - это сумма зарядов протонов в атомном ядре, который определяет химические свойства элемента.
Энергетические уровни - это уровни энергии, на которых находятся электроны в атоме. Электроны находятся на определенных энергетических уровнях и могут переходить между ними, поглощая или испуская энергию в форме света (спектральных линий).
Практика
Весь код будет в моем репозитории на GitHub. Там будет модифицированный код, здесь я приведу базовые функции
-
Относительная молекулярная масса элемента
Исходный код нашего калькулятора:
import re
from collections import Counter
class Element:
def __init__(self, short_name: str, electronic_conf_of_outer_layer: str,
name: str, atomic_number: int, relative_atomic_mass: float,
group: str, period: int, row: int, group_num: int,
side_group: bool, is_metal: bool):
self.short_name = short_name
self.electronic_conf_of_outer_layer = electronic_conf_of_outer_layer
self.name = name
self.atomic_number = atomic_number
self.relative_atomic_mass = relative_atomic_mass
self.group = group
self.side_group = side_group
self.is_metal = is_metal
self.period = period
self.row = row
self.group_num = group_num
ELEMENTS = {
# Символ ЭлКонф Название АтомноеЧисло ОтносАтомМасса группа период ряд
# номерГруппы ЭтопобочнаяГруппа ЭтоМетал
'H': Element('H', '1s^1', 'Водород', 1, 1.00794, 'A', 1, 1, 1, False, False),
'He': Element('He', '1s^2', 'Гелий', 2, 4.002602, 'A', 8, 1, 1, False, False),
'Li': Element('Li', '2s^1', 'Литий', 3, 6.941, 'A', 1, 2, 2, False, True),
'Be': Element('Be', '2s^2', 'Бериллий', 4, 9.01218, 'A', 2, 2, 2, False, True),
'B': Element('B', '2s^2 2p^1', 'Бор', 5, 10.811, 'A', 3, 2, 2, False, False),
'C': Element('C', '2s^2 2p^2', 'Углерод', 6, 12.011, 'A', 4, 2, 2, False, False),
'N': Element('N', '2s^2 2p^3', 'Азот', 7, 14.0067, 'A', 5, 2, 2, False, False),
'O': Element('O', '2s^2 2p^4', 'Кислород', 8, 15.9994, 'A', 6, 2, 2, False, False),
'F': Element('F', '2s^2 2p^5', 'Фтор', 9, 18.998403, 'A', 7, 2, 2, False, False),
'Ne': Element('Ne', '2s^2 2p^6', 'Неон', 10, 20.179, 'A', 8, 2, 2, False, False),
'Na': Element('Na', '3s^1', 'Натрий', 11, 22.98977, 'A', 1, 3, 3, False, True),
# добавляйте другие элементы по надобности
}
def repl(m):
return m[1] * int(m[2] if m[2] else 1)
def parse_molecule(formula: str) -> dict:
while '(' in formula:
formula = re.sub(r'\((\w*)\)(\d*)', repl, formula)
while '[' in formula:
formula = re.sub(r'\[(\w*)\](\d*)', repl, formula)
formula = re.sub(r'([A-Z][a-z]?)(\d*)', repl, formula)
formula_dict = Counter(re.findall('[A-Z][a-z]*', formula))
return formula_dict
def get_element_mass(element):
return ELEMENTS[element].relative_atomic_mass
def calculate_relative_molecular_mass(formula):
result = parse_molecule(formula)
mass = 0
for i in result.items():
print(f'{i[1]} {ELEMENTS[i[0]].name} = {ELEMENTS[i[0]].relative_atomic_mass * i[1]}')
mass += get_element_mass(i[0]) * i[1]
return mass
def main():
formula = input('Введите формулу: ')
mass = calculate_relative_molecular_mass(formula)
if mass is not None:
print(f'Относительная молекулярная масса формулы {formula} = ~{mass}')
else:
print(f'Ошибка парсинга формулы {formula}')
if __name__ == "__main__":
main()
В следующей статье мы затронем вычисления молярной массы, количества молекул, и количество вещества.
Всем удачи, всем пока, с вами был Доктор Аргентум
Комментарии (16)
profFortran
19.11.2023 11:27+7Ну так-то это всё можно написать, взяв школьный учебник химии и любой ЯП. С тем же успехом можно было решить какую-нибудь задачку с Rosalind и написать статью о применении Python в вычислительной биологии.
Как насчёт каких-то интересных задач, специфичных библиотек? По запросу "computational chemistry python" находятся такие библиотеки, как chemtools, cclib. Вот, например, куча всякого. Ну или вот обсуждение на тему, с чего начать в данной области: https://scicomp.stackexchange.com/questions/33594/getting-started-with-computational-chemistry. Можно было бы набросать обзор литературы для начинающих.
Это было бы интересно почитать.
DrArgentum Автор
19.11.2023 11:27Привет! Спасибо за твой комментарий, в следующей части все обязательно учту ;)
Эта статья была моя первая, тестовая, я пробовал силы и решил написать что-то о легком.
В следующей части этой серии я добавлю и рекомендуемую литературу, и интересные задачи. Еще раз спасибо за комментарий!
nikolz
19.11.2023 11:27-3Химия, электроны,протоны...
"Все смешалось, кони, люди..."
Электроны и протоны разве не физика?
DrArgentum Автор
19.11.2023 11:27Нет, это также и связано с химией. Эрнест Резенфорд открыл модель планетарного строения атома. А атомы, как известно, связаны также и с химией. Например протоны - они имеют заряд, который равен заряду электронов, но противоположный по знаку, и массу, равную массе атома водорода (принята в химии как единица). Число протонов и электронов одинаково
Так что электроны и протоны также связаны не только с физикой, но и с химией.
Но все равно спасибо за комментарий!
nikolz
19.11.2023 11:27-2Всегда считал, что химия - это молекулы и атомы,
а электроны и протоны - это элементарные частицы.
Да протоны имеют заряд как и электроны, но открыты они в физике элементарных частиц.
Да в химии эти понятия, но не как самостоятельные , а всегда как элемент молекул.
А у Вас молекулы исчезли и вместо них протоны и электроны появились очевидно.
----------------
Есть физика элементарных частиц, но нет химии этих частиц.
igorsimdyanov
19.11.2023 11:27Химия и методы исследования химических процессов довольно разнообразны. В ходе реакций часто образуются радикалы. Электронное строение сильно влияет на реакционную способность. Для моделирования и исследования распределение электронной плотности имеет большое значение. Сами химические реакции часто исследуют меченными атомами или при помощи изотопов разной массой. В конце-концов есть радиохимия. Есть физ-хими и хим-физика. Есть квантовая химия. Половина физики используется в современной химии, если вообще не вся.
Это не отменяет несколько наивный подход в статье, в которой Python используется вместо калькулятора. Недавно на русском языке вышла книга "Квантовая химия и квантовые вычисления с примерами на Python". Можно посмотреть уровень проблем и что при помощи python исследуется в химии. Причем в книге описаны далеко не самые актуальные на сегодняшний день проблемы. Да и вообще использовать Python для таких вычислений мягко говоря неэффективно. Хотя возможно, с точки зрения обучения, чтобы разобраться в предмете, самое то. На худой конец можно прототип разработать, перед тем, как будут задействованы видео-карты (задачи в основном матричные - вот бы что описывать на хабре, с удовольствием почитал бы).
nikolz
19.11.2023 11:27-2Ваше пояснение лишь подтверждает мое утверждение. В Вашем высказывании нет протонов и электронов, а есть меченные атомы. Химия не изучает строение и происхождение ни электронов ни протонов ни нейронов. Эти понятия в химии лишь элементы словаря.
Но это лишь мое субъективное мнение.
Goron_Dekar
19.11.2023 11:27+1А 3, 5 - разве не математика?
Физика это основа современной химии, но электроны, атомные и молекулярные орбитали, изотопные распределения, и, даже, спектры поглощения это уже давно химия. Для физики это очевидные и простые вещи, не требующие внимания, а для химии, физхимии, структурной и квантовой химии это основные понятия.
Bayfong
19.11.2023 11:27+1Изотопы, изотоны, степени окисления, овр, хиральный углерод, механизмы реакций - пошли мы на***
nikolz
19.11.2023 11:27"Почему именно Python? ... Но он, довольно легко изучается, по сравнению с многими другими языками."
Можете перечислить те многие языки, по сравнению с которыми питон проще изучать?
Интересно узнать, что именно в этих языках для Вас сложно, а в питоне - просто.
DrArgentum Автор
19.11.2023 11:27Приветствую! Это моя первая статья, попытался мысли выразить более нормально. Смотрите, здесь я имел ввиду, что благодаря популярности питона, очень много существует документаций. Также он легче некоторых других языков (лично по мне, питон - это easy to learn, hard to master) - C++ с его указателями, Haskell с его монадами и другими вещами, которые сложно сразу понять, Java я не сильно знаю, и решил не рисковать.
В любом случае, спасибо за ваше мнение!
nikolz
19.11.2023 11:27+1Полагаю, что на самом деле все гораздо проще и совсем не так как Вы себе представляете.
Широкое распространение Питона связано с тем, что его создавал Гугл.
После этого они, мягко говоря, перенесли из луа Torch 7 в питон под именем TensorFlow и занялись ИИ. В итоге по аналогии с майкрософт в области создания ОС, Гугл стал монополистом в области внедрения ИИ, что создало массовый хайп Питону.
leonP4
19.11.2023 11:27+2Создавался язык за 8 лет до основания самого Гугл. О чем вы пишите лишь разработка софта под свои нужны, собственно что делала каждая крупная компания, и не только на python. А у Гугла полно своих любимцев: Дарт, Котлин, Го. Следуя вашему посылу можно подумать что кроме ИИ Python нигде не использовался, но это не так. Во времена Симбиан будем считать что язык создавался Нокиа?
nikolz
19.11.2023 11:27+2Все верно, но... В декабре 2005 года ван Россум был принят на работу в Google, где он разработал на Python веб-приложение для рецензирования кода Mondrian. Также принимал активное участие в разработке компанией Google сервиса хостинга сайтов и web-приложений Google App Engine. 12 июля 2018 года ван Россум объявил о своём намерении покинуть пост «великодушного пожизненного диктатора» проекта по разработке языка программирования Python.
----------------------
Про Питон..
С какого года Вы его узнали ?
Если Вы его хорошо изучали, то интерпретатор в нем на порядок медленнее, чем в Луа даже сегодня. Первые версии питона вообще были тормоз.
Что бы поместить в микроконтроллеры специально сделали кастрированный Питон(микропитон).
Популярность питона связана с его продвижением именно Гуглом и переносом в него Факела для создание сетей. До этого времени это был один из заурядных скриптовых языков.
Цитата из Вики: 2008 год - Python 3.0 (называемый также «Python 3000» или «Py3K») разрабатывался с целью устранения фундаментальных изъянов в языке.
------------------
Про применение языков программирования в химии...
Есть хорошо себя зарекомендовавший язык R и он применяется для решения подобных задач.
https://pubmed.ncbi.nlm.nih.gov/23110531/
DrArgentum Автор
19.11.2023 11:27Я его изучаю уже года три. Да, я замечал, что питон довольно медленный. Но для этой статьи я взял именно его по нескольким причинам: во-первых, потому-что питон я точно знаю, а для первой статьи мне нужна была стабильность.
Про R слышал, но еще не использовал, почитаю на днях.
Спасибо за ваш комментарий
profFortran
Ну так-то это всё можно написать, взяв школьный учебник химии и любой ЯП. С тем же успехом можно было решить какую-нибудь задачку с Rosalind и написать статью о применении Python в вычислительной биологии.
Как насчёт каких-то интересных задач, специфичных библиотек? По запросу "computational chemistry python" находятся такие библиотеки, как chemtools, cclib. Вот, например, куча всякого. Ну или вот обсуждение на тему, с чего начать в данной области: https://scicomp.stackexchange.com/questions/33594/getting-started-with-computational-chemistry. Можно было бы набросать обзор литературы для начинающих.
Это было бы интересно почитать.