Enumere estruturas de PCB e compartilhe via EntityStore
Um bifenilo policlorado (PCB) é um composto orgânico com a fórmula química . Os PCBs eram usados para inúmeras aplicações industriais, incluindo transformadores eléctricos. Aqui, a geração e armazenamento de todos os bifenilos policlorados (PCB) possíveis como entidades customizadas em um banco de dados de entidade é ilustrada.
ChemicalData já contém a estrutura da molécula PCB, difenil (também chamado de "bifenilo").
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_117.png)
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_82.png)
ChemicalData também contém um congênere particular da molécula de PCB.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_118.png)
Entity["Chemical", "PCB"][
EntityProperty["Chemical", "ColorStructureDiagram"]]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_83.png)
A estrutura genérica do PCB envolve 10 posições, indicadas abaixo pela letra X. Para obter todos os possíveis derivados mono a deca-clorados (ex congêneres), junte substituintes de cloro nessas 10 posições de todas as formas possíveis. Aqui, a estrutura genérica como representação de formato de "MOL" é carregada de CloudObject pré definido.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_119.png)
molString = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_scaffold"]][[2]];
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_120.png)
ImportString[molString, "MOL"]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_84.png)
Com alguma teoria de grupo básica, todas as estruturas de PCB podem ser enumeradas. A propriedade essencial de simetria de toda a estrutura molecular, expressa como um grupo de permutação, é o ponto de partida.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_121.png)
biphenylSymmetry =
PermutationGroup[{Cycles[{{6, 10}, {7, 9}}],
Cycles[{{1, 5}, {2, 4}}],
Cycles[{{1, 6}, {2, 7}, {3, 8}, {4, 9}, {5, 10}}]}];
Forme um índice de ciclo de polinômio com o teorema de enumeração de Pólya e manipule os seus coeficientes para obter uma enumeração de 210 congêneres (incluindo a estrutura de hidrocarboneto não substituído, o que não é um PCB, devido à sua falta de cloro).
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_122.png)
ci = Factor[
CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_85.png)
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_123.png)
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_86.png)
Depois de alterar o nome das posições utilizando substituições simples de cadeias de caracteres, é possível gerar todos os 209 nomes de acordo com as regras da IUPAC.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_124.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.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_125.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.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_87.png)
Da mesma maneira, gere exaustivamente todas as estruturas congêneres.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_126.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.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_127.png)
TextGrid[Transpose[{names, PCBstruct}] // Take[#, 2] &,
Dividers -> All]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_88.png)
Para incluir propriedades mais detalhadas de congêneres, importe PCB como um conjunto de dados de um CloudObject previamente calculado.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_128.png)
imp = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_congeners_propertylist"]];
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_129.png)
TextGrid[Take[imp, 5], Background -> {Automatic, {LightBlue}},
Dividers -> All]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_89.png)
Combine os dados que foram importados com as estruturas e nomes previamente computados.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_130.png)
TextGrid[(PCBdata =
SortBy[MapThread[
Flatten[{#1,
Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct,
names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_90.png)
Crie um banco de dados de entidade personalizado para essas estruturas PCB.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_134.png)
store = EntityStore[
"PCB" -> <|
"Label" -> "polychlorinated biphenyl",
"LabelPlural" -> "polychlorinated biphenyls",
"Entities" -> entities,
"Properties" -> properties,
"EntityClasses" -> classes
|>]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_91.png)
Registre o banco de dados para esta sessão.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_135.png)
PrependTo[$EntityStores, store];
Faça um teste com o banco de dados e solicite uma entidade aleatória.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_136.png)
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
![](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/O_92.png)
Para que todas as entidades personalizadas estejam disponíveis em sessões futuras ou para aplicações públicas, passe o banco de dados de entidades para um CloudObject.
![Click for copyable input](assets.pt-br/enumerate-pcb-structures-and-share-via-an-entityst/In_137.png)
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]