Wolfram Language

Umfassenderer Zugang zur Knowledgebase

PCB-Strukturen via EntityStore abzählen und teilen

Polychlorierte Biphenyle (PCB) wurden früher häufig in der Industrie verwendet, zum Beispiel bei der Herstellung von Transformatoren. In diesem Beispiel illustrieren wir, wie alle möglichen Polychlorierte Biphenyl-Verbindungen als benutzerdefinierte Entitäten in einem Entitäten-Store generiert und gespeichert werden.

ChemicalData enthält bereits das PCB-Grundgerüst Biphenyl (früher "Diphenyl").

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

ChemicalData enthält auch einen bestimmten Kongener des PCB-Moleküls.

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

Die generische Struktur umfasst 10 Ecken, markiert mit "X". Um alle möglichen mono- bis deka-chlorierten Verbindungen mit gleichem Ursprung oder Struktur, sogenannte Kongenere, zu eruieren, muss man diesen 10 Lokanten Chloro-Substituenten in allen möglichen Varianten zuordnen. In diesem Beispiel wird die generische Struktur im "MOL"-Format aus dem vordefinierten CloudObject geladen.

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]=

Mithilfe von Kniffen elementarer Gruppentheorie können alle PCB-Strukturen abgezählt werden. Ausgangspunkt ist die wesentliche Symmetrie des gesamten Gerüsts, ausgedrückt als Permutationsgruppe.

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}}]}];

Setzen Sie das Zyklenzeiger-Polynom des Satzes von Pólya ein und manipulieren Sie deren Koeffizienten, um 210 Kongenere zu erhalten (die unsubstittuierte Kohlenwasserstoff-Struktur eingeschlossen, die kein PCB ist aufgrund des fehlenden Chlors).

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]=

Nach der Umbenennung der Lokanten-Positionen durch einfaches Ersetzen der Strings werden alle 209 Namen unter Berücksichtigung der Nomenklatur der IUPAC (Internationale Union für reine und angewandte Chemie) generiert.

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=

Auf ähnliche Weise können sämtliche Kongenerstrukturen generiert werden.

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]=

Um detailliertere Eigenschaften des Kongenere zu berücksichtigen, importieren Sie PCB als Datensatz aus einem vorberechnetem 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]=

Kombinieren Sie die importierten Daten mit den zuvor berechneten Strukturen und Namen.

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]=

Erstellen Sie einen benutzerspezifischen EntityStore für diese PCB-Strukturen.

Den kompletten Wolfram Language-Input zeigen
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]=

Registrieren Sie den Store für diese Sitzung.

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

Testen Sie diesen Entity Store, indem Sie eine zufällige Entität aufrufen.

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

Um alle benutzerspezifischen Entitäten für zukünftige Sitzungen oder Anwendungen durch andere zur Verfügung zu stellen, schreiben Sie den EntityStore in ein CloudObject.

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

Verwandte Beispiele

en es ja ko pt-br ru zh