Wolfram 언어

풍부한 Knowledgebase 액세스

PCB 구조의 열거 및 EntityStore를 통한 공유

폴리염화 바이페닐(PCB)은 화학식 에서 제공되는 유기 화합물입니다. PCB는 변압기를 포함한 수많은 공업적 응용에 사용되어 왔습니다. 여기에서는 가능한 모든 PCB의 생성과 저장을 엔티티 스토어 내의 사용자 엔티티로 설명합니다.

ChemicalData는 이미 PCB의 스캐폴드, 디페닐 (종종 비페닐이라고도 함)가 포함되어 있습니다.

In[1]:=
Click for copyable input
Entity["Chemical", "Biphenyl"]["ColorStructureDiagram"]
Out[1]=

ChemicalData에는 PCB 분자의 특정 동족 원소 또한 포함되어 있습니다.

In[2]:=
Click for copyable input
Entity["Chemical", "PCB"][ EntityProperty["Chemical", "ColorStructureDiagram"]]
Out[2]=

PCB의 일반적인 구조는 다음에 "X"에서 보여지는 바와 같이, 10개의 위치가 포함되어 있습니다. 가능한 모든 모노에서 데카까지의 염소화 유도체 (동족 원소 등)을 구하기위해서는 위의 10개의 위치에 가능한 모든 방법으로 -Cl을 붙입니다. 여기에서는 일반적인 구조를 이미 정의된 CloudObject에서 "MOL" 형식 표현으로 로드합니다.

In[3]:=
Click for copyable input
molString = CloudGet[CloudObject[ "https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\ 999d-546c888892d6/PCB_scaffold"]][[2]];
In[4]:=
Click for copyable input
ImportString[molString, "MOL"]
Out[4]=

기본적인 그룹 이론으로 모든 PCB 구조를 열거할 수 있습니다. 대체군으로 표현된 스캐폴드 전체의 본질적인 대칭 특성이 출발점이 됩니다.

In[5]:=
Click for copyable input
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로 간주되지 않으며 치환되지 않은 탄화수소 구조를 포함)를 취득합니다.

In[6]:=
Click for copyable input
ci = Factor[ CycleIndexPolynomial[biphenylSymmetry, Array[Subscript[x, #] &, 4]]]
Out[6]=
In[7]:=
Click for copyable input
Total[CoefficientList[Expand[ci /. Subscript[x, i_] -> (x^i + 1)], x]]
Out[7]=

간단한 문자열 바꾸기를 사용하여 로칸트 위치의 이름을 변경한 후 총 209개의 IUPAC 준거하는 이름이 생성됩니다.

In[8]:=
Click for copyable input
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'"}];
In[9]:=
Click for copyable input
(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
Out[9]//Short=

같은 방법으로 모든 동족 원소 구조를 생성할 수 있습니다.

In[10]:=
Click for copyable input
PCBstruct = ImportString[ StringReplacePart[molString, #, StringPosition[molString, "X"]], "MOL"] & /@ Flatten[(First /@ GroupOrbits[biphenylSymmetry, Permutations[#], Permute]) & /@ (LowerTriangularize[ ConstantArray["Cl", {10, 10}]] /. 0 -> "H"), 1];
In[11]:=
Click for copyable input
TextGrid[Transpose[{names, PCBstruct}] // Take[#, 2] &, Dividers -> All]
Out[11]=

동족 원소의 보다 자세한 특성을 포함하려면 미리 계산된 CloudObject에서 PCB를 데이터 집합으로 가져 오면됩니다.

In[12]:=
Click for copyable input
imp = CloudGet[CloudObject[ "https://www.wolframcloud.com/objects/user-722de5bb-ef39-4cbd-\ 999d-546c888892d6/PCB_congeners_propertylist"]];
In[13]:=
Click for copyable input
TextGrid[Take[imp, 5], Background -> {Automatic, {LightBlue}}, Dividers -> All]
Out[13]=

가져온 데이터를 방금 계산한 구조 및 이름과 함께 결합합니다.

In[14]:=
Click for copyable input
TextGrid[(PCBdata = SortBy[MapThread[ Flatten[{#1, Pick[imp[[3 ;;]], imp[[3 ;;, 1]], #2]}] &, {PCBstruct, names}], #[[3]] &]) // Take[#, 2] &, Dividers -> All]
Out[14]=

이러한 PCB 구조에 대한 사용자 정의 엔티티 스토어를 만듭니다.

전체 Wolfram 언어 입력 표시하기
In[15]:=
Click for copyable input
entities = Association @@ Map["PCB" <> ToString[#[[3]]] -> <| "ColorStructureDiagram" -> #[[1]], "IUPACName" -> #[[2]], "CASNumber" -> #[[4]], "BZNumber" -> #[[3]], "PCBDescriptors" -> #[[5]], "Label" -> "PCB-BZ#" <> ToString[#[[3]]] |> &, PCBdata];
In[16]:=
Click for copyable input
properties = <| "ColorStructureDiagram" -> <|"Label" -> "structure diagram"|>, "IUPACName" -> <|"Label" -> "IUPAC name"|>, "CASNumber" -> <|"Label" -> "CAS number"|>, "BZNumber" -> <|"Label" -> "Ballschmiter-Zell number"|>, "PCBDescriptors" -> <|"Label" -> "congener shorthand notation"|>, "Toxicity" -> <| "DefaultFunction" -> Function[e, If[StringCount[e["PCBDescriptors"], ","] == 3, "highly toxic", "toxic"]], "Label" -> "dioxin-like toxicity" |>, "NumberOfChlorineSubstituents" -> <| "DefaultFunction" -> Function[e, If[e["IUPACName"] == "Decachlorobiphenyl", 10, StringCount[e["IUPACName"], NumberString]]], "Label" -> "number of chlorine substituents" |> |>;
In[17]:=
Click for copyable input
classes = <| "CoplanarPCB" -> <| "Entities" -> {"IUPACName" -> (StringFreeQ[ "2" | "2'" | "6" | "6'" | "Deca"])}, "Label" -> "Coplanar or non-ortho PCBs" |>, "NoncoplanarPCB" -> <| "Entities" -> {"IUPACName" -> StringContainsQ["2" | "2'" | "6" | "6'"]}, "Label" -> "Noncoplanar PCBs" |> |>;
In[18]:=
Click for copyable input
store = EntityStore[ "PCB" -> <| "Label" -> "polychlorinated biphenyl", "LabelPlural" -> "polychlorinated biphenyls", "Entities" -> entities, "Properties" -> properties, "EntityClasses" -> classes |>]
Out[18]=

이 세션의 스토어를 등록합니다.

In[19]:=
Click for copyable input
PrependTo[$EntityStores, store];

랜덤 엔티티를 호출하여 엔티티 스토어를 테스트합니다.

In[20]:=
Click for copyable input
EntityValue[RandomEntity["PCB"], "PropertyAssociation"]
Out[20]=

모든 사용자 정의 실체가 향후 세션 또는 공개 응용 프로그램에서 사용할 수 있도록 엔티티 저장소를 CloudObject에 기록합니다.

In[21]:=
Click for copyable input
CloudPut[store, "PCB_entity_store", Permissions -> "Public"]
Out[21]=

관련 예제

de en es fr ja pt-br ru zh