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 »).
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
ChemicalData contient également un congénère particulier de la molécule de PCB.
Entity["Chemical", "PCB"][
EntityProperty["Chemical", "ColorStructureDiagram"]]
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.
molString = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_scaffold"]][[2]];
ImportString[molString, "MOL"]
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.
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).
ci = Factor[
CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
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.
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 la même manière, générez de manière exhaustive toutes les structures des congénères.
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]
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é.
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]
Combinez les données importées avec les structures et les noms calculés précédemment.
TextGrid[(PCBdata =
SortBy[MapThread[
Flatten[{#1,
Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct,
names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
Créez un magasin d'entités personnalisé pour ces structures PCB.
store = EntityStore[
"PCB" -> <|
"Label" -> "polychlorinated biphenyl",
"LabelPlural" -> "polychlorinated biphenyls",
"Entities" -> entities,
"Properties" -> properties,
"EntityClasses" -> classes
|>]
Enregistrez le magasin pour cette session.
PrependTo[$EntityStores, store];
Testez le magasin d'entités en appelant une entité aléatoire.
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
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.
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]