PCB 구조의 열거 및 EntityStore를 통한 공유
폴리염화 바이페닐(PCB)은 화학식 에서 제공되는 유기 화합물입니다. PCB는 변압기를 포함한 수많은 공업적 응용에 사용되어 왔습니다. 여기에서는 가능한 모든 PCB의 생성과 저장을 엔티티 스토어 내의 사용자 엔티티로 설명합니다.
ChemicalData는 이미 PCB의 스캐폴드, 디페닐 (종종 비페닐이라고도 함)가 포함되어 있습니다.
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
ChemicalData에는 PCB 분자의 특정 동족 원소 또한 포함되어 있습니다.
Entity["Chemical", "PCB"][
EntityProperty["Chemical", "ColorStructureDiagram"]]
PCB의 일반적인 구조는 다음에 "X"에서 보여지는 바와 같이, 10개의 위치가 포함되어 있습니다. 가능한 모든 모노에서 데카까지의 염소화 유도체 (동족 원소 등)을 구하기위해서는 위의 10개의 위치에 가능한 모든 방법으로 -Cl을 붙입니다. 여기에서는 일반적인 구조를 이미 정의된 CloudObject에서 "MOL" 형식 표현으로 로드합니다.
molString = CloudGet[CloudObject[
"https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\
999d-546c888892d6/PCB_scaffold"]][[2]];
ImportString[molString, "MOL"]
기본적인 그룹 이론으로 모든 PCB 구조를 열거할 수 있습니다. 대체군으로 표현된 스캐폴드 전체의 본질적인 대칭 특성이 출발점이 됩니다.
biphenylSymmetry =
PermutationGroup[{Cycles[{{6, 10}, {7, 9}}],
Cycles[{{1, 5}, {2, 4}}],
Cycles[{{1, 6}, {2, 7}, {3, 8}, {4, 9}, {5, 10}}]}];
Pólya의 계수 정리에서 사이클 지표 다항식을 형성하고, 그 계수를 조작하여 210의 동족 원소 (염소를 포함하지 않기 때문에 PCB로 간주되지 않으며 치환되지 않은 탄화수소 구조를 포함)를 취득합니다.
ci = Factor[
CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
간단한 문자열 바꾸기를 사용하여 로칸트 위치의 이름을 변경한 후 총 209개의 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
같은 방법으로 모든 동족 원소 구조를 생성할 수 있습니다.
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]
동족 원소의 보다 자세한 특성을 포함하려면 미리 계산된 CloudObject에서 PCB를 데이터 집합으로 가져 오면됩니다.
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]
가져온 데이터를 방금 계산한 구조 및 이름과 함께 결합합니다.
TextGrid[(PCBdata =
SortBy[MapThread[
Flatten[{#1,
Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct,
names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
이러한 PCB 구조에 대한 사용자 정의 엔티티 스토어를 만듭니다.
store = EntityStore[
"PCB" -> <|
"Label" -> "polychlorinated biphenyl",
"LabelPlural" -> "polychlorinated biphenyls",
"Entities" -> entities,
"Properties" -> properties,
"EntityClasses" -> classes
|>]
이 세션의 스토어를 등록합니다.
PrependTo[$EntityStores, store];
랜덤 엔티티를 호출하여 엔티티 스토어를 테스트합니다.
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
모든 사용자 정의 실체가 향후 세션 또는 공개 응용 프로그램에서 사용할 수 있도록 엔티티 저장소를 CloudObject에 기록합니다.
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]