Enumérez les structures de PCB et partagez-les via un EntityStore
Un polychlorobiphényle (PCB) est un composé organique dont la formule chimique est la suivante : . Les PCB étaient autrefois utilisés pour un certain nombre d'applications industrielles, notamment dans les transformateurs électriques. Nous illustrons ici la génération et le stockage de tous les polychlorobiphényles (PCB) possibles en tant qu'entités personnalisées dans un magasin d'entités.
ChemicalData contient déjà la structure du PCB, le diphényle (également souvent appelé « biphényle »).
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_113.png)
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_84.png)
ChemicalData contient également un congénère particulier de la molécule de PCB.
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_114.png)
Entity["Chemical", "PCB"][
EntityProperty["Chemical", "ColorStructureDiagram"]]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_85.png)
La structure générique du PCB comporte 10 sites, indiqués ci-dessous par des X. Pour obtenir tous les dérivés monochlorés à décochlorés possibles (c'est-à-dire les congénères), il faut attacher des substituants chlorés à ces 10 sites de toutes les manières possibles. Ici, la structure générique en tant que représentation au format "MOL" est chargée à partir d'un CloudObject prédéfini.
![Click for copyable input](assets.en/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.en/enumerate-pcb-structures-and-share-via-an-entityst/In_116.png)
ImportString[molString, "MOL"]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_86.png)
Avec un peu de théorie des groupes, toutes les structures de PCB peuvent être énumérées. La propriété de symétrie essentielle de l'ensemble de la structure, exprimée sous la forme d'un groupe de permutation, est le point de départ.
![Click for copyable input](assets.en/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}}]}];
Formez le polynôme de l'indice de cycle à partir du théorème de comptage de Pólya et manipulez ses coefficients pour obtenir un décompte de 210 congénères (y compris la structure d'hydrocarbure non substituée, qui n'est pas un PCB en raison de l'absence de chlore).
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_118.png)
ci = Factor[
CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_87.png)
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_119.png)
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_88.png)
Après avoir renommé les positions des locants à l'aide de simples remplacements de chaînes de caractères, les 209 noms conformes à l'UICPA sont générés.
![Click for copyable input](assets.en/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.en/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.en/enumerate-pcb-structures-and-share-via-an-entityst/O_89.png)
De la même manière, générez de manière exhaustive toutes les structures des congénères.
![Click for copyable input](assets.en/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.en/enumerate-pcb-structures-and-share-via-an-entityst/In_123.png)
TextGrid[Transpose[{names, PCBstruct}] // Take[#, 2] &,
Dividers -> All]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_90.png)
Pour inclure des propriétés plus détaillées des congénères, importez le PCB en tant que jeu de données à partir d'un CloudObject précalculé.
![Click for copyable input](assets.en/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.en/enumerate-pcb-structures-and-share-via-an-entityst/In_125.png)
TextGrid[Take[imp, 5], Background -> {Automatic, {LightBlue}},
Dividers -> All]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_91.png)
Combinez les données importées avec les structures et les noms calculés précédemment.
![Click for copyable input](assets.en/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.en/enumerate-pcb-structures-and-share-via-an-entityst/O_92.png)
Créez un magasin d'entités personnalisé pour ces structures PCB.
![Click for copyable input](assets.en/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.en/enumerate-pcb-structures-and-share-via-an-entityst/O_93.png)
Enregistrez le magasin pour cette session.
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_131.png)
PrependTo[$EntityStores, store];
Testez le magasin d'entités en appelant une entité aléatoire.
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_132.png)
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
![](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/O_94.png)
Afin de rendre toutes les entités personnalisées disponibles dans les sessions futures ou pour les applications publiques, écrivez le magasin d'entités dans un CloudObject.
![Click for copyable input](assets.en/enumerate-pcb-structures-and-share-via-an-entityst/In_133.png)
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]