Enumere estructuras de PCB y comparta por medio de un EntityStore
Un bifenilo policlorado (PCB) es un compuesto orgánico con la fórmula química dada por . Los PCB eran antes usados para un número de aplicaciones industriales, incluyendo tranformadores eléctricos. Aquí se ilustra la generación y almacén de todos los bifenilos policlorados (PCBs) como entidades personalizadas en una tienda de entidades.
ChemicalData ya contiene el andamio de PCB, difenil (también comúnmente llamado "bifenilo").
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
ChemicalData también contiene un congénere particular de la molécula de PCB.
Entity["Chemical", "PCB"][
EntityProperty["Chemical", "ColorStructureDiagram"]]
La estructura genérica de PCB involucra 10 sitios, indicados abajo con X. Para obtener todos los derivados mono- y deca-clorinados (ej. congéneres), adjunte cloro-sustituyentes en estos 10 localizadores de todas las formas posibles. Aquí, la estructura genérica como representación de formato "MOL" se carga desde un CloudObject predefinido.
molString = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_scaffold"]][[2]];
ImportString[molString, "MOL"]
Con un poco de teoría de grupo básica, todas las estructuras PCB pueden ser enumeradas. La propiedad esencial de simetría de todo el andamio, expresado como un grupo de permutación, es el punto de partida.
biphenylSymmetry =
PermutationGroup[{Cycles[{{6, 10}, {7, 9}}],
Cycles[{{1, 5}, {2, 4}}],
Cycles[{{1, 6}, {2, 7}, {3, 8}, {4, 9}, {5, 10}}]}];
Forme un índice de ciclo de polinomios a partir del teorema de conteo de Pólya y manipule sus coeficientes para obtener una cuenta de 210 congéneres (incluyendo la estructura de hidrocarburo no sustituido, la cual no es un PCB debido a la falta de cloro).
ci = Factor[
CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
Después de cambiar el nombre de las posiciones de localizador usando simples reemplazos de cadenas, se generan todos los 209 nombres de acuerdo con IUPAC.
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
De igual forma, genere de forma exhaustiva todas las estructuras de congéneres.
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]
Para incluir propiedades más detalladas de los congéneres, importe PCB como un conjunto de datos desde un CloudObject previamente calculado.
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]
Combine los datos importados con las estructuras y nombres previamente computados.
TextGrid[(PCBdata =
SortBy[MapThread[
Flatten[{#1,
Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct,
names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
Cree un almacén de entidades personalizado para estas estructuras PCB.
store = EntityStore[
"PCB" -> <|
"Label" -> "polychlorinated biphenyl",
"LabelPlural" -> "polychlorinated biphenyls",
"Entities" -> entities,
"Properties" -> properties,
"EntityClasses" -> classes
|>]
Registre el almacén para esta sesión.
PrependTo[$EntityStores, store];
Pruebe el almacén de entidades llamando a una entidad al azar.
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
Con el fin de hacer que todas las entidades estén disponibles en sesiones futuras o para aplicaciones públicas, pase el almacén de entidades a un CloudObject.
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]