การสร้างโปรแกรมแก้ไข / สร้างภาพระดับโมเลกุล: การเขียนโปรแกรมเชิงวัตถุโครงสร้างข้อมูลและโมเลกุล


12

ฉันยังใหม่กับการเขียนโปรแกรมและฉันพยายามที่จะแก้ปัญหาใหญ่ครั้งแรกของฉันและเขียนโปรแกรมใหญ่ครั้งแรกของฉัน ฉันได้ค้นหาตัวอย่างโค้ดโอเพนซอร์ซที่จะเรียนรู้ แต่จนถึงขณะนี้มีเพียงพบรหัสในภาษาที่ฉันไม่เข้าใจอย่างสมบูรณ์หรือสิ่งที่เกี่ยวข้อง แต่ยังห่างไกลเกินไปที่ฉันจะเรียนรู้จากจริง ๆ ฉันมีปัญหาในการทำตามขั้นตอนบางอย่างที่นี่

ฉันต้องการสร้างซอฟต์แวร์ง่ายๆเพื่อสร้างดัดแปลงและต่อมาเป็นตัวแทนของโมเลกุลอินทรีย์ขนาดเล็ก นี่คือการออกกำลังกายการเรียนรู้เป็นหลัก ผู้ใช้จะให้สตริง SMILES หรือเลือกจากชุดโมเลกุลเริ่มต้นพื้นฐานและจากนั้นสามารถสร้างบนโมเลกุลนั้นทั้งแบบกราฟิกหรือผ่านไวยากรณ์อินพุตข้อความ อย่างไรก็ตามฉันยังไม่ถึงจุดที่ซับซ้อน ฉันไม่เข้าใจอย่างถ่องแท้ถึงวิธีการสร้างคลาส / วัตถุเพื่อจัดเก็บโมเลกุล ดังนั้นคำถามของฉันอย่างชัดเจน: ฉันจะใช้คลาส / วัตถุเพื่อสร้างโมเลกุลในขณะที่เก็บข้อมูลในทุกระดับได้อย่างไรและฉันควรใช้โครงสร้างข้อมูลใดเป็นคุณลักษณะของวัตถุใด และวัตถุสามารถเป็นคุณลักษณะของวัตถุอื่นได้หรือไม่?

นี่คือความคิดของฉันจนถึงตอนนี้ฉันกำลังคิดว่าจะมีคลาส "โมเลกุล" จากนั้นก็เป็นคลาส / คลาสย่อย "อะตอม" และคลาสย่อย "บอนด์" และอาจเป็นคลาสย่อย "FunctionalGroup" ด้วย ดูเหมือนจะเป็นจุดเริ่มต้นที่ดี แต่บางทีฉันอาจเข้าใจผิดว่า OOP และนี่เป็นสิ่งที่ไม่ดี แต่แล้วปัญหาของฉันก็ทำให้สับสน (สำหรับฉัน) แม้ว่าฉันจะมีแนวคิด / ความคิด / ชั้นเรียนเหล่านี้ทั้งหมด แต่ฉันไม่เข้าใจอย่างเต็มที่ว่าโครงสร้างข้อมูลใดที่จำเป็นสำหรับการแทนโมเลกุล รายการของอะตอมน่าจะดี รายการนั้นอาจเป็นรายการวัตถุ Atom หรือไม่ ฉันจะต้องมีวิธีในการจัดเก็บการเชื่อมต่อ เมทริกซ์ 2D ดูเหมือนจะเป็นความคิดที่ดีโดยมีการสั่งซื้อพันธบัตรเป็นจำนวนเต็มในตำแหน่งเมทริกซ์

เมื่อมาถึงจุดนี้ฉันเริ่มรู้สึกสับสนกับภารกิจ ทุกสิ่งที่ฉันทำจนถึงทำให้รู้สึก? การแนบจอแสดงผล / การวาดภาพด้านบนอาจหมายความว่าฉันต้องเขียนใหม่ / ทำใหม่สิ่งเหล่านี้มากมาย แต่ฉันแค่พยายามไปยังจุดที่ฉันสามารถจัดเก็บโมเลกุลอย่างน้อยด้วยข้อมูลที่เกี่ยวข้องแล้วเข้าถึง ข้อมูลนั้นเพื่อตรวจสอบ / แก้ไข ฉันกำลังคิดที่จะทำสิ่งนี้ใน Python ดังนั้นโค้ด / คลาสอาจมีลักษณะเช่นนี้: http://pastebin.com/uUi1BMzr

บางทีนี่อาจเป็นคำถามการเขียนโปรแกรมสำหรับ StackOverflow แต่ฉันคิดว่ามันเจาะจงพอที่จะไปที่นี่ ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมากแม้ว่าคุณเพิ่งจะชี้ให้เห็นว่าฉันได้ทำผิดพลาดทางความคิด ขอบคุณล่วงหน้า.


1
นอกจากนี้สำหรับทุกคนที่พยายามทำสิ่งที่คล้ายกันฉันเพิ่งพบแพ็คเกจโอเพ่นซอร์สที่ดีที่ช่วยฉันด้วยแนวคิดบางอย่างที่เรียกว่า MMTK สำหรับชุดเครื่องมือกลศาสตร์โมเลกุล
เนท

1
คุณดู OpenBabel แล้วหรือยัง ควรมีทุกสิ่งที่คุณต้องการ
Deathbreath

คำตอบ:


5

ซอฟต์แวร์การเขียนเป็นกระบวนการวนซ้ำ - เขียนรหัส -> ดูว่าคุณจะไปได้ไกลแค่ไหนจากนั้นวางแผนขั้นตอนต่อไป -> เขียนรหัส -> ทำซ้ำ ในขั้นตอนนี้ในการเรียนรู้ศิลปะฉันขอแนะนำให้คุณกระโดดเข้ามาเพื่อทดสอบน่านน้ำในไม่ช้า ไม่จำเป็นต้องวางแผนระบบทั้งหมดล่วงหน้า ใช่หลามจะเป็นภาษาแรกที่ดี สำหรับการสร้างภาพลอง MatPlotLib, NumPy และ SciPy ก็มีประโยชน์เช่นกัน ซอฟต์แวร์ระดับอุตสาหกรรมต้องอาศัยการดึงในไลบรารีที่สร้างไว้ล่วงหน้าแทนที่จะเขียนทุกอย่างด้วยตัวเอง แต่โซลูชันที่เรียบง่ายสามารถและควรเขียนด้วยตัวเองโดยเฉพาะเมื่อเรียนรู้ที่จะเขียนโปรแกรม เค้าโครง OO ของคุณดูเหมือนว่าใช้ได้ เมื่อ / หากความสัมพันธ์เชิงวัตถุของคุณจำเป็นต้องเปลี่ยนในภายหลังการกระทำของการคำนวณแฟคตอริ่งของคุณอีกครั้งนั้นเป็นประสบการณ์ที่มีค่าควรแก่การฝึกฝน ยินดีต้อนรับบนเรือ!


ขอบคุณสำหรับการป้อนข้อมูล ฉันจะเก็บมันไว้ ฉันยังได้เรียนรู้เกี่ยวกับการผ่านและการกลายพันธุ์แอตทริบิวต์ / ตัวแปรของวัตถุ เป็นเรื่องที่น่าสนใจมากที่จะนำบางสิ่งบางอย่างจากโลกแห่งความเป็นจริงและลองนำเสนอในรหัสคอมพิวเตอร์
เนท

9

เป้าหมายของคุณมีความท้าทายมากมาย ฉันจะแยกมันออกเป็นส่วน ๆ

รอยยิ้มไม่ใช่ภาษาที่ใช้ในการแยกวิเคราะห์และกฎของการรับรู้กลิ่นไม่ชัดเจน นิยามไวยากรณ์โดยละเอียดจากโครงการ OpenSMILES น่าจะช่วยได้บ้าง

SMILES กำหนดโทโพโลยี แต่ไม่ให้ข้อมูล 2D หรือ 3D ทำให้ทั้งสองเป็นเรื่องยาก (นั่นคือถ้าคุณต้องการให้มันดูดี)

จริงๆคุณควรมองไปที่ชุดเครื่องมือ cheminformatics RDKit (หรือ OpenBabel แต่ฉันชอบ RDKit) มันมีตัวแยกวิเคราะห์ SMILES ในตัวเช่นเดียวกับรูปแบบ 2D และฉันเชื่อว่าการสร้างโครงสร้าง 3 มิติ OpenBabel ก็ทำได้เช่นกัน

จากนั้นเพื่อแสดงคุณจะต้องคิดออกระบบ GUI อันที่จริงที่นี่ชุดเครื่องมือ cheminformatics ของ CDK ใน Java นั้นเป็นเครื่องมือขั้นสูงที่สุด

แต่คุณอยู่ในพื้นฐานของวิธีการแสดงโมเลกุล มีความแตกต่างระหว่างแบบจำลองข้อมูลขนาดเล็กโมเลกุลและโมเลกุลขนาดใหญ่ (โปรตีน DNA) แต่เนื่องจากคุณสนใจ SMILES นั่นหมายความว่าคุณเป็นโมเลกุลขนาดเล็กที่มุ่งเน้น

คุณสามารถดูเอกสาร API สำหรับ RDKit, OpenBabel, CDK, OEChem และ Indigo และอื่น ๆ อีกมากมาย นั่นจะทำให้คุณทราบถึงวิธีการที่หลากหลายที่ผู้คนพัฒนา API ของคลาส ของเหล่านี้ฉันชอบ OEChem มากที่สุดตามด้วย RDKit แม้ว่า OEChem เป็นโอเพ่นซอร์ส แต่ API นั้นออนไลน์และสามารถอ่านได้อย่างอิสระพร้อมกับตัวอย่างการใช้งาน

กล่าวโดยสรุปมีคลาส Molecule พร้อมรายการ Atom และ Bond "mol.AddAtom (หมายเลของค์ประกอบ)" สร้างอะตอมใหม่โดยไม่มีพันธะ "mol.AddBond (atom1, atom2, bond_type)" ทำการเชื่อมต่อพันธะ แต่ละพันธะจำเป็นต้องรู้อะตอมที่เกี่ยวข้องและแต่ละอะตอมต้องการรายชื่อของพันธะ สิ่งนี้นำไปสู่วงจรจำนวนมากในโครงสร้างข้อมูล แต่จำเป็นเพื่อให้อัลกอริทึมต่าง ๆ เช่นการค้นหาการเชื่อมต่อสามารถทำได้ในเวลาเชิงเส้น

อย่าใช้เมทริกซ์ 2D ในขณะที่เป็นไปได้สำหรับโมเลกุลขนาดเล็กมันไม่ได้ปรับขนาดได้ดีและไม่จำเป็นต้องใช้มัน อัลกอริธึมไม่กี่ต้องการเมทริกซ์การเชื่อมต่อและมันสร้างขึ้นได้ง่ายถ้า / เมื่อจำเป็น

ไม่มี "FunctionalGroup" มันพิเศษเกินไป ใช้บางอย่างเช่น "เซตย่อย" หรือ "แฟรกเมนต์" ซึ่งมีรายการของอะตอมและพันธบัตรที่คุณสนใจวิธีนี้คุณสามารถจัดการกับสิ่งต่าง ๆ เช่น "อะตอมที่เลือก" และ "โครงสร้างย่อยวงแหวน" และ "โครงสร้างนั่งร้าน" โดยอ้างถึง เซตย่อยเฉพาะ

ฉันมองไปที่ 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
   ..

และ parser สำหรับเชนเชิงเส้นอย่างง่ายเช่น "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 ก็เป็นที่ที่ควรไปเช่นกันหากคุณตัดสินใจใช้หนึ่งในชุดเครื่องมือเหล่านั้น นอกจากนี้ยังมีเว็บไซต์ถามตอบ "Blue Obelisk" ซึ่งจัดทำโดย Shapado


1

อีกวิธีในการเริ่มต้นอาจดูรหัสบางอย่างที่เกี่ยวข้องกับปัญหาของคุณอยู่แล้ว ในกรณีนี้การออกกำลังกายของคุณอาจจบลงด้วยโปรแกรมอื่นและนั่นก็จะดีใช่มั้ย

โปรแกรมที่คุณอาจสนใจ

  • ชุดการจำลอง MD และการสร้างแบบจำลองโมเลกุลระดับMMTK (ตามที่แนะนำโดยเนทข้างบน)

  • แพคเกจการสร้างภาพPyMol


1

การเรียนรู้รายละเอียดของระบบวัตถุโมเลกุลเป็นวิธีที่ยอดเยี่ยมสำหรับนักเคมีในการเรียนรู้การเขียนโปรแกรมเชิงวัตถุ คุณจะพบว่าการใช้งานระบบดังกล่าวจะช่วยปรับระดับโมเลกุลของคุณ คุณควรคิดอย่างหนักเกี่ยวกับอะตอมโมเลกุลและบางทีอาจรวมถึงโมเลกุลในแง่ของคุณลักษณะและวิธีการ

นี่คือบางส่วนของไพ ธ อนที่เก่าแก่กว่าซึ่งอาจช่วยได้: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

สำหรับการตรวจสอบงานของคุณ: นอกเหนือจาก openbabel (ซึ่งมีการเชื่อมโยง python!) และ MMTK นั่นก็คือ ELBOW ในฟีนิกซ์

สำหรับคนที่พูดได้หลายภาษาในคุณยังมี PerlMol (Perlmol.org) PerlMol เขียนด้วยภาษาเชิงวัตถุและสามารถดาวน์โหลดได้จาก CPAN

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.