Язык Wolfram Language

Расширенный доступ к базе знаний Wolfram Knowledgebase

Определение структуры полихлорированных бифенилов (ПХБ) и публикация через EntityStore

Полихлорированный бифенил (ПХБ) представляет собой органическое соединение с химической формулой . В прошлом ПХБ имели ряд промышленных применений, в том числе, использовались в электрических трансформатарах. В данном примере, мы проиллюстрируем генерацию и хранение формул всех возможных полихлорированных бифенилов (ПХБ) в качестве объектов пользователя.

Данные о химических соединениях ChemicalData уже содержат информацию о ПХБ, часто под названием "дифенил" или "бифенил".

In[1]:=
Click for copyable input
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
Out[1]=

ChemicalData также содержит соединения молекулы ПХБ.

In[2]:=
Click for copyable input
Entity["Chemical", "PCB"][ EntityProperty["Chemical", "ColorStructureDiagram"]]
Out[2]=

Общая структура ПХБ включает в себя 10 сторон, обозначенных ниже крестиками. Для того, чтобы получить все возможные моно- дека-хлорированные производные (соединения), хлор-заместители присоединяются к молекуле ПХБ различными способами. Общая структура молекулы в формате "MOL" загружается из заранее созданного объекта файловой системы CloudObject.

In[3]:=
Click for copyable input
molString = CloudGet[CloudObject[ "https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\ 999d-546c888892d6/PCB_scaffold"]][[2]];
In[4]:=
Click for copyable input
ImportString[molString, "MOL"]
Out[4]=

С учетом базовой теории групп мы можем перечислить все структуры ПХБ. Существенным свойством данной структуры будет симметрия, служащая в качестве основы для молекулярных соединений.

In[5]:=
Click for copyable input
biphenylSymmetry = PermutationGroup[{Cycles[{{6, 10}, {7, 9}}], Cycles[{{1, 5}, {2, 4}}], Cycles[{{1, 6}, {2, 7}, {3, 8}, {4, 9}, {5, 10}}]}];

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

In[6]:=
Click for copyable input
ci = Factor[ CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
Out[6]=
In[7]:=
Click for copyable input
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
Out[7]=

Далее, генерируем 209 наименования полученных соединений в соответствии со стандартами организации IUPAC (Международный союз теоретической и прикладной химии).

In[8]:=
Click for copyable input
conPos = Flatten[(PositionIndex /@ First /@ GroupOrbits[biphenylSymmetry, Permutations[#], Permute]) & /@ (LowerTriangularize[ ConstantArray["Cl", {10, 10}]] /. 0 -> "H")] /. Thread[Range[10] -> {"2", "3", "4", "5", "6", "2'", "3'", "4'", "5'", "6'"}];
In[9]:=
Click for copyable input
(names = Flatten[{StringJoin[Riffle[Sort[#["Cl"]], ","]] <> "-" <> (Length[#["Cl"]] /. Thread[Range[10] -> {"Chloro", "Dichloro", "Trichloro", "Tetrachloro", "Pentachloro", "Hexachloro", "Heptachloro", "Octachloro", "Nonachloro", "Decachloro"}]) <> "biphenyl"} & /@ conPos] /. "2,2',3,3',4,4',5,5',6,6'-Decachlorobiphenyl" -> "Decachlorobiphenyl") // Short
Out[9]//Short=

Аналогичным образом генерируем все возможные структуры соединений.

In[10]:=
Click for copyable input
PCBstruct = ImportString[ StringReplacePart[molString, #, StringPosition[molString, "X"]], "MOL"] & /@ Flatten[(First /@ GroupOrbits[biphenylSymmetry, Permutations[#], Permute]) & /@ (LowerTriangularize[ ConstantArray["Cl", {10, 10}]] /. 0 -> "H"), 1];
In[11]:=
Click for copyable input
TextGrid[Transpose[{names, PCBstruct}] // Take[#, 2] &, Dividers -> All]
Out[11]=

Для того, чтобы включить в наши данные более подробные свойства полученных соединений, импортируем данныe o ПХБ из уже существующего объектa облачной файловой системы, CloudObject.

In[12]:=
Click for copyable input
imp = CloudGet[CloudObject[ "https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\ 999d-546c888892d6/PCB_congeners_propertylist"]];
In[13]:=
Click for copyable input
TextGrid[Take[imp, 5], Background -> {Automatic, {LightBlue}}, Dividers -> All]
Out[13]=

Объединим импортированные данные с ранее вычисленными структурами и названиями.

In[14]:=
Click for copyable input
TextGrid[(PCBdata = SortBy[MapThread[ Flatten[{#1, Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct, names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
Out[14]=

Сохраним информацию о полученных структурах ПХБ в качестве информационного объекта "entity store" (букв. хранилище сущностей).

код на языке Wolfram Language целиком
In[15]:=
Click for copyable input
entities = Association @@ Map["PCB" <> ToString[#[[3]]] -> <| "ColorStructureDiagram" -> #[[1]], "IUPACName" -> #[[2]], "CASNumber" -> #[[4]], "BZNumber" -> #[[3]], "PCBDescriptors" -> #[[5]], "Label" -> "PCB-BZ#" <> ToString[#[[3]]] |> &, PCBdata];
In[16]:=
Click for copyable input
properties = <| "ColorStructureDiagram" -> <|"Label" -> "structure diagram"|>, "IUPACName" -> <|"Label" -> "IUPAC name"|>, "CASNumber" -> <|"Label" -> "CAS number"|>, "BZNumber" -> <|"Label" -> "Ballschmiter-Zell number"|>, "PCBDescriptors" -> <|"Label" -> "congener shorthand notation"|>, "Toxicity" -> <| "DefaultFunction" -> Function[e, If[StringCount[e["PCBDescriptors"], ","] == 3, "highly toxic", "toxic"]], "Label" -> "dioxin-like toxicity" |>, "NumberOfChlorineSubstituents" -> <| "DefaultFunction" -> Function[e, If[e["IUPACName"] == "Decachlorobiphenyl", 10, StringCount[e["IUPACName"], NumberString]]], "Label" -> "number of chlorine substituents" |> |>;
In[17]:=
Click for copyable input
classes = <| "CoplanarPCB" -> <| "Entities" -> {"IUPACName" -> (StringFreeQ[ "2" | "2'" | "6" | "6'" | "Deca"])}, "Label" -> "Coplanar or non-ortho PCBs" |>, "NoncoplanarPCB" -> <| "Entities" -> {"IUPACName" -> StringContainsQ["2" | "2'" | "6" | "6'"]}, "Label" -> "Noncoplanar PCBs" |> |>;
In[18]:=
Click for copyable input
store = EntityStore[ "PCB" -> <| "Label" -> "polychlorinated biphenyl", "LabelPlural" -> "polychlorinated biphenyls", "Entities" -> entities, "Properties" -> properties, "EntityClasses" -> classes |>]
Out[18]=

Зарегистрируем информацию, подготовленную в данной рабочей сессии.

In[19]:=
Click for copyable input
PrependTo[$EntityStores, store];

Протестируем, доступна ли сохраненная информация для дальнейшего использования.

In[20]:=
Click for copyable input
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
Out[20]=

Для того, чтобы все пользовательские информационные объекты были доступны к использованию в дальнейшем (например, для общественных приложений), их необходимо сохранить в качестве объекта облачной системы файлов, CloudObject.

In[21]:=
Click for copyable input
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]
Out[21]=

Родственные примеры

de en es fr ja ko pt-br zh