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").
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_113.png)
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_84.png)
ChemicalData enthält auch einen bestimmten Kongener des PCB-Moleküls.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_114.png)
Entity["Chemical", "PCB"][
EntityProperty["Chemical", "ColorStructureDiagram"]]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_85.png)
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.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_115.png)
molString = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_scaffold"]][[2]];
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_116.png)
ImportString[molString, "MOL"]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_86.png)
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.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_117.png)
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).
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_118.png)
ci = Factor[
CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_87.png)
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_119.png)
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_88.png)
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.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_120.png)
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'"}];
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_121.png)
(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
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_89.png)
Auf ähnliche Weise können sämtliche Kongenerstrukturen generiert werden.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_122.png)
PCBstruct =
ImportString[
StringReplacePart[molString, #, StringPosition[molString, "X"]],
"MOL"] & /@
Flatten[(First /@
GroupOrbits[biphenylSymmetry, Permutations[#],
Permute]) & /@ (LowerTriangularize[
ConstantArray["Cl", {10, 10}]] /. 0 -> "H"), 1];
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_123.png)
TextGrid[Transpose[{names, PCBstruct}] // Take[#, 2] &,
Dividers -> All]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_90.png)
Um detailliertere Eigenschaften des Kongenere zu berücksichtigen, importieren Sie PCB als Datensatz aus einem vorberechnetem CloudObject.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_124.png)
imp = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_congeners_propertylist"]];
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_125.png)
TextGrid[Take[imp, 5], Background -> {Automatic, {LightBlue}},
Dividers -> All]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_91.png)
Kombinieren Sie die importierten Daten mit den zuvor berechneten Strukturen und Namen.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_126.png)
TextGrid[(PCBdata =
SortBy[MapThread[
Flatten[{#1,
Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct,
names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_92.png)
Erstellen Sie einen benutzerspezifischen EntityStore für diese PCB-Strukturen.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_130.png)
store = EntityStore[
"PCB" -> <|
"Label" -> "polychlorinated biphenyl",
"LabelPlural" -> "polychlorinated biphenyls",
"Entities" -> entities,
"Properties" -> properties,
"EntityClasses" -> classes
|>]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_93.png)
Registrieren Sie den Store für diese Sitzung.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_131.png)
PrependTo[$EntityStores, store];
Testen Sie diesen Entity Store, indem Sie eine zufällige Entität aufrufen.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_132.png)
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
![](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/O_94.png)
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.
![Click for copyable input](assets.de/enumerate-pcb-structures-and-share-via-an-entityst/In_133.png)
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]