Tạo trình soạn thảo / trình hiển thị phân tử: Lập trình hướng đối tượng, cấu trúc dữ liệu và phân tử


12

Tôi mới lập trình và tôi đang cố gắng giải quyết vấn đề lớn đầu tiên của mình và viết chương trình lớn đầu tiên của mình. Tôi đã tìm kiếm các ví dụ mã nguồn mở để học hỏi, nhưng cho đến nay chỉ tìm thấy mã bằng các ngôn ngữ mà tôi không hiểu đầy đủ hoặc điều đó có liên quan nhưng vẫn còn quá xa để tôi thực sự học được. Tôi gặp khó khăn khi thực hiện một số bước khái niệm ở đây.

Tôi muốn tạo ra một phần mềm đơn giản để xây dựng, sửa đổi và sau đó đại diện cho các phân tử hữu cơ nhỏ. Đây chủ yếu là một bài tập học tập. Người dùng sẽ cung cấp một chuỗi SMILES hoặc chọn từ một tập hợp các phân tử khởi động cơ bản và sau đó có thể xây dựng trên phân tử đó bằng đồ họa hoặc thông qua cú pháp nhập văn bản. Tuy nhiên, tôi thậm chí không ở điểm phức tạp đó. Tôi thậm chí không thể hiểu đầy đủ cách tạo các lớp / đối tượng để lưu trữ các phân tử. Vì vậy, câu hỏi của tôi ngắn gọn: Làm thế nào để tôi sử dụng các lớp / đối tượng để xây dựng các phân tử trong khi vẫn giữ được tất cả các mức thông tin và tôi nên sử dụng cấu trúc dữ liệu nào làm thuộc tính cho đối tượng nào? Và, các đối tượng có thể là thuộc tính cho các đối tượng khác?

Đây là dòng suy nghĩ của tôi cho đến nay: Tôi đã nghĩ sẽ có một lớp "Phân tử", sau đó là lớp / lớp "Nguyên tử" và lớp con "Liên kết" và có thể cả lớp con "Nhóm chức năng". Đó có vẻ là một nơi tốt để bắt đầu, nhưng có lẽ tôi đang hiểu nhầm OOP và điều này thật tệ. Nhưng sau đó, vấn đề của tôi thực sự trở nên khó hiểu (đối với tôi). Mặc dù tôi có tất cả các khái niệm / ý tưởng / lớp học này, tôi không hoàn toàn nắm bắt được cơ sở dữ liệu nào là cần thiết để đại diện cho phân tử. Một danh sách các nguyên tử sẽ là một điều tốt để có. Danh sách đó có thể là một danh sách các đối tượng nguyên tử không? Tôi cũng sẽ cần phải có một cách để lưu trữ kết nối. Một ma trận 2D có vẻ như là một ý tưởng tốt, với thứ tự liên kết là số nguyên trong các vị trí ma trận.

Tại thời điểm này, tôi bắt đầu bị choáng ngợp với nhiệm vụ. Là tất cả mọi thứ tôi đang làm cho đến nay có ý nghĩa? Đính kèm một khía cạnh hiển thị / vẽ trên đầu trang này có thể có nghĩa là tôi cần viết lại / làm lại rất nhiều thứ này, nhưng tôi chỉ cố gắng đến một điểm mà ít nhất tôi có thể lưu trữ các phân tử với dữ liệu liên quan và sau đó truy cập dữ liệu đó để kiểm tra / sửa đổi. Tôi đã nghĩ đến việc làm điều này trong Python, vì vậy mã / lớp có thể trông giống như thế này: http://pastebin.com/uUi1BMzr

Có lẽ đây thực sự là một câu hỏi lập trình cho StackOverflow, nhưng tôi nghĩ nó đã đủ cụ thể để đi đến đây. Bất kỳ trợ giúp sẽ được đánh giá rất cao, ngay cả khi bạn chỉ ra nơi tôi đã thực hiện các sai lầm khái niệm. Cảm ơn trước.


1
Ngoài ra, đối với bất kỳ ai đang cố gắng làm điều gì đó tương tự, tôi vừa tìm thấy một gói python mã nguồn mở tốt đẹp đã giúp tôi với một vài khái niệm gọi là MMTK, cho bộ công cụ cơ học phân tử.
Nate

1
Bạn đã xem OpenBabel chưa? Điều đó nên có mọi thứ bạn cần trong tầm tay.
Deathbreath

Câu trả lời:


5

viết phần mềm là một quá trình lặp - viết mã -> xem bạn có thể đi được bao xa sau đó lên kế hoạch cho các bước tiếp theo -> viết mã -> lặp lại. Ở giai đoạn này trong việc học nghệ thuật, tôi khuyên bạn nên sớm nhảy vào để thử nước. Không cần lập kế hoạch cho toàn bộ hệ thống lên phía trước. Có python sẽ là một ngôn ngữ đầu tiên tốt. Để hình dung, hãy thử MatPlotLib, NumPy và SciPy cũng tiện dụng. Phần mềm quy mô công nghiệp luôn dựa vào việc kéo vào các thư viện dựng sẵn, thay vì tự viết mọi thứ, nhưng các giải pháp đơn giản có thể và nên tự viết, đặc biệt là khi học lập trình. Bố cục OO của bạn có vẻ ổn bây giờ. Khi / nếu các mối quan hệ đối tượng của bạn cần thay đổi sau này, hành động tái hiện lại chính mã của bạn là một kinh nghiệm đáng để làm chủ. Chào mừng bạn!


Cảm ơn các đầu vào. Tôi sẽ giữ nó. Tôi cũng đang tìm hiểu một chút về việc chuyển và biến đổi một thuộc tính / biến đối tượng. Thật là hấp dẫn khi lấy thứ gì đó từ thế giới thực và cố gắng thể hiện nó bằng mã máy tính.
Nate

9

Mục tiêu của bạn có rất nhiều thử thách. Tôi sẽ chia chúng thành nhiều phần.

SMILES không phải là một ngôn ngữ tầm thường để phân tích, và các quy tắc cho nhận thức thơm không được xác định rõ. Định nghĩa ngữ pháp chi tiết từ dự án OpenSMILES sẽ giúp một số.

SMILES định nghĩa cấu trúc liên kết, nhưng không cung cấp thông tin 2D hoặc 3D. Làm một trong hai là khó. (Đó là, nếu bạn muốn nó trông đẹp.)

Thực sự, bạn nên tìm đến bộ công cụ cheminformatics RDKit (hoặc OpenBabel, nhưng tôi thích RDKit hơn). Nó có một trình phân tích cú pháp SMILES được xây dựng, cũng như bố cục 2D và tôi tin rằng việc tạo hình dạng 3D. OpenBabel cũng vậy.

Sau đó, để hiển thị, bạn sẽ phải tìm ra hệ thống GUI. Trên thực tế, ở đây bộ công cụ cheminformatics CDK, trong Java, là công nghệ tiên tiến nhất.

Nhưng bạn đang ở trong những điều cơ bản về cách biểu diễn một phân tử. Có sự khác biệt giữa mô hình dữ liệu phân tử nhỏ và phân tử lớn (protein, DNA), nhưng vì bạn quan tâm đến SMILES có nghĩa là bạn định hướng phân tử nhỏ.

Bạn có thể xem các tài liệu API cho RDKit, OpenBabel, CDK, OEChem và Indigo, trong số nhiều tài liệu khác. Điều đó sẽ cho bạn ý tưởng về những cách đa dạng mà mọi người phát triển API lớp của họ. Trong số này, tôi thích OEChem nhất, tiếp theo là RDKit. Mặc dù OEChem là nguồn mở, API vẫn trực tuyến và có thể đọc tự do, cùng với các ví dụ về việc sử dụng.

Nói tóm lại, có một lớp Phân tử, với một danh sách các trường hợp Nguyên tử và Trái phiếu. "mol.AddAtom (số phần tử)" tạo ra một nguyên tử mới, không có liên kết, "mol.AddBond (nguyên tử1, nguyên tử 2, bond_type)" tạo kết nối liên kết. Mỗi liên kết cần biết các nguyên tử được liên kết với nó và mỗi nguyên tử cần một danh sách các liên kết. Điều này dẫn đến rất nhiều chu kỳ trong cấu trúc dữ liệu, nhưng nó cần thiết để các thuật toán khác nhau, như tìm kiếm kết nối, có thể được thực hiện trong thời gian tuyến tính.

Không sử dụng ma trận 2D. Mặc dù khả thi đối với một phân tử nhỏ, nhưng nó không có quy mô tốt và không cần nó. Rất ít thuật toán cần ma trận kết nối và nó dễ dàng được tạo nếu / khi cần.

Không có "Nhóm chức năng". Nó quá chuyên biệt. Sử dụng một cái gì đó như "Tập hợp con" hoặc "Mảnh vỡ", chứa danh sách các nguyên tử và liên kết mà bạn quan tâm. Bằng cách đó, bạn cũng có thể xử lý những thứ như "nguyên tử được chọn" và "cấu trúc vòng" và "giàn giáo" bằng cách tham khảo các tập hợp con cụ thể.

Tôi nhìn vào pastebin của bạn. Trình phân tích cú pháp không nên làm việc theo cách đó. Bạn nên tách phân tích khỏi cấu trúc phân tử thực tế của bạn. Hãy thử một cái gì đó như thế này:

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
   ..

và sau đó trình phân tích cú pháp cho một chuỗi tuyến tính đơn giản như "CC O" là:

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

Tất nhiên, một trình phân tích cú pháp SMILES đầy đủ phức tạp hơn nhiều so với điều này và mô hình dữ liệu đầy đủ phải xử lý những thứ như số lượng hydro, thường ẩn.

Danh sách gửi thư OpenBabel, RDKit và CDK cũng là những nơi tốt để đi, nếu bạn quyết định sử dụng một trong những bộ công cụ đó. Ngoài ra còn có trang web Hỏi & Đáp "Blue Obelisk", được lưu trữ bởi Shapado.


1

Một cách tiếp cận khác để bắt đầu có thể là xem xét một số mã đã làm điều gì đó liên quan đến vấn đề của bạn. Trong trường hợp đó, bài tập của bạn thậm chí có thể kết thúc ở một số chương trình khác, và điều đó sẽ rất tuyệt phải không?

Các chương trình có thể khiến bạn quan tâm là

  • Gói MMTK mô phỏng và mô hình phân tử MD (như đã được đề xuất bởi Nate ở trên)

  • Gói trực quan PyMol


1

Học các chi tiết của một hệ thống đối tượng phân tử là một cách tuyệt vời cho các nhà hóa học học lập trình hướng đối tượng. Bạn sẽ thấy rằng việc thực hiện một hệ thống như vậy sẽ tinh chỉnh trực giác phân tử của bạn. Bạn nên suy nghĩ kỹ về các nguyên tử, phân tử và có lẽ các bộ sưu tập phân tử về các thuộc tính và phương pháp.

Dưới đây là một số slide python (cũ hơn một chút) có thể giúp: http://www.wag.caltech.edu/home/rpm/python_cference/Lecture_4.pdf

Để kiểm tra công việc của bạn: ngoài openbabel (có liên kết python!) Và MMTK, còn có ELBOW trong phenix.

Đối với polyglot trong bạn, cũng có PerlMol (Perlmol.org). PerlMol được viết bằng perl hướng đối tượng và có thể được tải xuống từ CPAN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.