.XYZ 파일에서 원자 대체
Oct 27 2020
나는 초기 구조에서 양이온의 배치를 무작위 화하고 싶은 결정 구조를 가지고 있습니다. .xyz 파일이 있습니다 (여기에https://pastebin.com/d5UcNr2h) 원자 ID 및 좌표를 제공하고 다음 코드를 제공합니다.
structure = Import[SystemDialogInput["FileOpen"]];
Do[
If[
structure[[1,i]] == Atom[Cu],
If[RandomReal[] > 0.5, structure[[1,i]] = Atom[Ga], structure[[1,i]] = Atom[Cu]],
Unevaluated[Sequence[]]
],
{i,1,Dimensions[structure[[1]]][[1]]}
]
요컨대, 나의 현재 접근 방식은 파일을 읽고 주어진 위치의 원자 정체성이 Copper (Cu)인지 테스트하는 것입니다. 원자가 구리이면 주사위를 굴리고 RandomReal이 0.5보다 크면 원자를 갈륨 (Ga)으로 대체하고 싶습니다. 개별 논리 테스트를 시도했습니다.
structure[[1,600]]==Atom[Cu]
원자 ID가 Cu 인 경우 "True"를 반환하지만 코드를 실행할 때 실제 원자 ID를 수정하지 않습니다. 내가 무엇을 놓치고 있습니까?
감사.
답변
5 JasonB. Oct 27 2020 at 18:28
분자 가져 오기
In[14]:= m = Import["https://pastebin.com/raw/d5UcNr2h", "XYZ"];
In[15]:= OutputForm[m]
Out[15]//OutputForm= Molecule[<Cu513H210S672>]
구리 원자 지수 목록 가져 오기
In[16]:= copperSites = AtomList[m, "Cu", "AtomIndex"]
Out[16]= {483,484,485,486,487,488,489,490,491,492,<<493>>,986,987,988,989,990,991,992,993,994,995}
이제 무작위로 이들 중 일부를 선택하지만 원하는대로 선택하고 "ReplaceAtom"을 사용하여 분자를 수정합니다.
In[17]:= toReplace = RandomSample[copperSites, 10]
Out[17]= {919, 613, 543, 675, 587, 867, 715, 700, 527, 775}
In[18]:= m2 = MoleculeModify[m, {"ReplaceAtom", Thread[toReplace -> "Ga"]}, ValenceErrorHandling -> None];
OutputForm[m2]
During evaluation of In[18]:= Molecule::valenc: Invalid valence for gallium atom at position 527.
Out[19]//OutputForm= Molecule[<Cu503Ga10H210S672>]
당신은 사용하지 말아야 Part같은 객체로 작업 할 때 Molecule, 대신 같은 접근 기능을 사용 AtomList하고 BondList. 미래의 릴리스에서는 Molecule있을 것이다 AtomQ직접 그 부분에 접근하는 것은 불가능합니다.