분자 편집기 / 시각 화기 만들기 : 객체 지향 프로그래밍, 데이터 구조 및 분자


12

나는 프로그래밍에 익숙하지 않고 첫 번째 큰 문제를 해결하고 첫 번째 큰 프로그램을 작성하려고합니다. 나는 배울 코드의 오픈 소스 예제를 찾았지만, 지금까지 완전히 이해하지 못하거나 실제로 배우기에는 관련이 있지만 너무 멀리 떨어져있는 언어로 된 코드 만 발견했습니다. 여기서 개념적 단계를 수행하는 데 문제가 있습니다.

작은 유기 분자를 구축, 수정 및 나중에 나타내는 간단한 소프트웨어를 만들고 싶습니다. 이것은 주로 학습 연습입니다. 사용자는 SMILES 문자열을 제공하거나 기본 스타터 분자 세트에서 선택한 다음 그래픽으로 또는 텍스트 입력 구문을 통해 해당 분자를 빌드 할 수 있습니다. 그러나 나는 아직 복잡한 시점조차 아닙니다. 분자를 저장하기 위해 클래스 / 객체를 만드는 방법을 완전히 이해할 수조차 없습니다. 그래서 내 질문은 간결하게 : 클래스 / 객체를 사용하여 모든 수준의 정보를 유지하면서 분자를 만드는 방법과 어떤 객체의 속성으로 어떤 데이터 구조를 사용해야합니까? 그리고 객체가 다른 객체의 속성 일 수 있습니까?

여기까지의 나의 생각의 기차가있다 : 나는 "분자"클래스, "Atom"클래스 / 서브 클래스 및 "Bond"서브 클래스, 그리고 "FunctionalGroup"서브 클래스를 가질 생각이었다. 시작하기에 좋은 곳인 것 같지만 OOP를 오해하고 있으며 이것이 나쁩니다. 그러나 내 문제는 정말로 혼란스러워집니다. 비록 이러한 개념 / 아이디어 / 클래스가 모두 있지만 분자를 나타내는 데 필요한 데이터 구조를 완전히 파악하지는 못합니다. 원자 목록은 좋은 것입니다. 이 목록이 Atom 객체의 목록 일 수 있습니까? 또한 연결을 저장할 방법이 필요합니다. 2D 매트릭스는 매트릭스 위치에서 정수로 본드 순서를 갖는 좋은 생각처럼 보입니다.

이 시점에서 나는 그 일에 압도 당하기 시작했다. 지금까지하고있는 모든 것이 의미가 있습니까? 이 위에 디스플레이 / 그리기 측면을 첨부하면 이러한 많은 것들을 다시 작성 / 재 작업해야한다는 것을 의미하지만 적어도 관련 데이터가있는 분자를 저장 한 다음 액세스 할 수있는 시점에 도달하려고합니다. 해당 데이터를 확인 / 수정합니다. 파이썬에서 이것을하려고 생각했기 때문에 코드 / 클래스는 다음과 같이 보일 것입니다 : http://pastebin.com/uUi1BMzr

아마도 이것은 실제로 StackOverflow에 대한 프로그래밍 질문이지만, 여기에 갈 정도로 구체적이라고 생각했습니다. 내가 개념적 실수를 저지른 곳을 지적하더라도 도움을 주시면 감사하겠습니다. 미리 감사드립니다.


1
또한 비슷한 것을하려고하는 사람이라면 분자 역학 도구 키트에 대한 MMTK라는 몇 가지 개념을 도와주는 멋진 오픈 소스 파이썬 패키지를 발견했습니다.
Nate

1
OpenBabel을 보셨습니까? 필요한 모든 것을 갖추어야합니다.
Deathbreath

답변:


5

소프트웨어 작성은 반복적 인 프로세스입니다-코드 작성-> 다음 단계를 계획 할 수있는 거리 확인-> 코드 작성-> 반복. 이 단계에서 미술을 배우면서 물을 테스트하기 위해 곧 뛰어들 것을 제안합니다. 전체 시스템을 미리 계획 할 필요가 없습니다. 예, 파이썬은 좋은 첫 번째 언어입니다. 시각화를 위해 MatPlotLib을 사용해보십시오 .NumPy 및 SciPy도 편리합니다. 산업용 스케일 소프트웨어는 모든 것을 직접 작성하는 대신 항상 사전 빌드 라이브러리를 사용하지만, 특히 프로그래밍을 배우는 경우 간단한 솔루션을 직접 작성해야합니다. 귀하의 OO 레이아웃은 지금은 괜찮아 보입니다. 나중에 객체 관계를 변경해야 할 경우 코드 자체를 리팩토링하는 것은 마스터 할만한 가치가있는 경험입니다. 탑승을 환영합니다 !


입력 주셔서 감사합니다. 그냥 계속하겠습니다. 또한 객체 속성 / 변수를 전달하고 변경하는 방법에 대해 약간 배우고 있습니다. 현실에서 무언가를 가져 와서 컴퓨터 코드로 표현하려고 시도하는 것은 정말 매력적입니다.
Nate

9

당신의 목표에는 많은 도전이 있습니다. 그것들을 여러 부분으로 나눌 것입니다.

SMILES는 파싱하기 쉬운 언어가 아니며 향기 인식에 대한 규칙이 잘 정의되어 있지 않습니다. OpenSMILES 프로젝트의 자세한 문법 정의가 도움이 될 것입니다.

SMILES는 토폴로지를 정의하지만 2D 또는 3D 정보는 제공하지 않습니다. 어느 쪽이든 만들기가 어렵습니다. (좋아 보이기를 원한다면.)

실제로 RDKit 화학 포맷 툴킷 (또는 OpenBabel이지만 RDKit을 선호합니다)을 살펴보십시오. 그것은 2D 레이아웃뿐만 아니라 SMILES 파서가 내장되어 있으며 3D 형태 생성을 믿습니다. OpenBabel도 마찬가지입니다.

그런 다음 표시하려면 GUI 시스템을 파악해야합니다. 실제로 Java에서 CDK 화학 포맷 툴킷이 가장 고급입니다.

그러나 당신은 분자를 표현하는 방법의 기초에 있습니다. 소분자 및 대 분자 (단백질, DNA) 데이터 모델에는 차이가 있지만 SMILES에 관심이 있기 때문에 소분자 지향이라는 의미입니다.

RDKit, OpenBabel, CDK, OEChem 및 Indigo에 대한 API 문서를 볼 수 있습니다. 사람들이 클래스 API를 개발하는 다양한 방법에 대한 아이디어를 제공합니다. 이 중 OEChem이 가장 선호되며 RDKit이 그 뒤를 따릅니다. OEChem은 오픈 소스이지만 API는 사용 예제와 함께 온라인으로 자유롭게 읽을 수 있습니다.

간단히 말해 Atom 및 Bond 인스턴스 목록이있는 Molecule 클래스가 있습니다. "mol.AddAtom (요소 번호)"는 결합이없는 새로운 원자를 생성합니다. "mol.AddBond (atom1, atom2, bond_type)"은 결합을 만듭니다. 각 결합은 연결된 원자를 알아야하며 각 원자는 결합 목록이 필요합니다. 이로 인해 데이터 구조에서 많은주기가 발생하지만 연결 검색과 같은 다양한 알고리즘을 선형 시간으로 수행 할 수 있어야합니다.

2D 매트릭스를 사용하지 마십시오. 소분자에는 적합하지만 규모가 잘 맞지 않아 필요하지 않습니다. 연결 매트릭스가 필요한 알고리즘은 거의 없으며 필요할 경우 언제라도 쉽게 생성 할 수 있습니다.

"기능 그룹"이 없습니다. 너무 전문적입니다. 관심있는 원자 및 결합 목록이 포함 된 "하위 집합"또는 "조각"과 같은 것을 사용하십시오. 이렇게하면 "선택된 원자"및 "고리 하위 구조"및 "스캐 폴드"와 같은 것을 처리 할 수 ​​있습니다. 특정 부분 집합

나는 당신의 pastebin을 보았다. 파서는 그렇게 작동해서는 안됩니다. 실제 분자 구조에서 구문 분석을 분리해야합니다. 다음과 같이 해보십시오 :

class Molecule(object):
    def __init__(self):
        self.atoms = []
        self.bonds = []
        self._atom_id = 0
        self._bond_id = 0
    def _next_atom_id(self):
        atom_id = self._atom_id
        self.atom_id += 1
        return atom_id
    def AddAtom(self, eleno):
        self.atoms.append(Atom(self, self._next_atom_id(), eleno))
    def AddBond(self, atom1, atom2, bondtype):
        assert atom1.molecule is atom2.molecule
        self.bonds.append(Bond(self, self._next_bond_id(),
                               atom1, atom2, bondtype))

class Atom(object):
    def __init__(self, molecule, id, eleno):
        self.molecule = molecule
        self.id = id
        self.eleno = eleno
        self.charge = 0
        self.isotope = 0
   ..

"CC O"와 같은 간단한 선형 체인에 대한 파서는 다음과 같습니다.

def parse_linear_chain(text):
   mol = Molecule()
   prev_atom = None
   for atom_symbol in text.split():
     eleno = lookup_symbol[atom_symbol]
     atom = mol.NewAtom(eleno)
     if pre_atom is not None:
       mol.AddBond(prev_atom, atom, 1)
     prev_atom = atom
   return mol

물론 전체 SMILES 파서는 이보다 훨씬 복잡하며 전체 데이터 모델은 종종 암묵적인 수소 카운트와 같은 것을 처리해야합니다.

OpenBabel, RDKit 및 CDK 메일 링리스트도 이러한 툴킷 중 하나를 사용하기로 결정한 경우 좋은 곳입니다. Shapado가 주최하는 "Blue Obelisk"Q & A 사이트도 있습니다.


1

시작하는 또 다른 방법은 문제와 관련이있는 코드를 살펴 보는 것입니다. 이 경우 운동이 다른 프로그램으로 끝날 수도 있으며, 그렇지 않을까요?

관심있는 프로그램은

  • MD 시뮬레이션 및 분자 모델링 패키지 MMTK (위의 Nate에서 이미 제안한대로)

  • 시각화 패키지 PyMol


1

분자 객체 시스템의 세부 사항을 배우는 것은 화학자가 객체 지향 프로그래밍을 배울 수있는 훌륭한 방법입니다. 이러한 시스템을 구현하면 분자 직관이 개선됩니다. 속성, 방법면에서 원자, 분자 및 분자 집합에 대해 열심히 생각해야합니다.

다음은 도움이 될만한 멋진 파이썬 (약간 오래된) 슬라이드입니다. http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

작업 확인 : openbabel (파이썬 바인딩이 있습니다!)과 MMTK 외에도 phenix에는 ELBOW가 있습니다.

귀하의 폴리 글 로트에는 PerlMol (Perlmol.org)도 있습니다. PerlMol은 객체 지향 perl로 작성되며 CPAN에서 다운로드 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.