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