एक आणविक संपादक / विज़ुअलाइज़र बनाना: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, डेटा स्ट्रक्चर्स और अणु


12

मैं प्रोग्रामिंग में नया हूं और अपनी पहली बड़ी समस्या को हल करने और अपना पहला बड़ा कार्यक्रम लिखने की कोशिश कर रहा हूं। मैंने सीखने के लिए कोड के ओपन सोर्स उदाहरणों की तलाश की है, लेकिन अभी तक मैंने केवल उन भाषाओं में कोड पाया है जिन्हें मैं पूरी तरह से नहीं समझता या जो मेरे लिए वास्तव में सीखने के लिए संबंधित लेकिन फिर भी बहुत दूर की चीजें हैं। मुझे यहां कुछ वैचारिक कदम उठाने में परेशानी हो रही है।

मैं निर्माण करने, संशोधित करने और बाद में छोटे कार्बनिक अणुओं का प्रतिनिधित्व करने के लिए सॉफ्टवेयर का एक सरल टुकड़ा बनाना चाहता हूं। यह मुख्य रूप से सीखने का अभ्यास है। एक उपयोगकर्ता SMILES स्ट्रिंग देगा या स्टार्टर अणुओं के एक मूल सेट से चुन सकता है, और फिर उस अणु पर या तो रेखांकन या पाठ इनपुट सिंटैक्स के माध्यम से बना सकता है। हालाँकि, मैं जटिलता के उस बिंदु पर भी नहीं हूँ। मैं पूरी तरह से समझ भी नहीं सकता कि अणुओं को संग्रहीत करने के लिए कक्षाएं / वस्तु कैसे बनाऊं। इसलिए, मेरा प्रश्न पूरी तरह से: मैं जानकारी के सभी स्तरों को बनाए रखते हुए अणुओं का निर्माण करने के लिए कक्षाओं / वस्तुओं का उपयोग कैसे करूं, और मुझे किन वस्तुओं के लिए डेटा संरचनाओं का उपयोग करना चाहिए? और, क्या वस्तुएं अन्य वस्तुओं के लिए विशेषता हो सकती हैं?

यहाँ मेरी अब तक की विचारधारा है: मैं एक "अणु" वर्ग, फिर एक "परमाणु" वर्ग / उपवर्ग और एक "बॉन्ड" उपवर्ग, और शायद एक "कार्यात्मक समूह" उपवर्ग भी सोच रहा था। यह शुरू करने के लिए एक अच्छी जगह की तरह लगता है, लेकिन शायद मैं OOP को गलत समझ रहा हूं और यह बुरा है। लेकिन तब मेरी समस्या वास्तव में भ्रमित हो जाती है (मेरे लिए)। भले ही मेरे पास इन सभी अवधारणाओं / विचारों / वर्गों हैं, मैं पूरी तरह से समझ नहीं पाता कि अणु का प्रतिनिधित्व करने के लिए डेटास्ट्रक्चर क्या आवश्यक है। परमाणुओं की एक सूची एक अच्छी बात होगी। क्या वह सूची एटम वस्तुओं की सूची हो सकती है? मुझे कनेक्टिविटी को स्टोर करने का एक तरीका भी होना चाहिए। एक 2 डी मैट्रिक्स एक अच्छा विचार की तरह लगता है, मैट्रिक्स पदों में पूर्णांक के रूप में बांड क्रम के साथ।

इस बिंदु पर मैं कार्य से अभिभूत होने लगा हूं। क्या मैं अब तक जो कुछ भी कर रहा हूं उससे सब समझ में आता है? इसके शीर्ष पर एक डिस्प्ले / ड्राइंग पहलू को संलग्न करने का मतलब यह हो सकता है कि मुझे इन चीजों को फिर से लिखने / फिर से तैयार करने की आवश्यकता है, लेकिन मैं सिर्फ एक बिंदु पर पहुंचने की कोशिश कर रहा हूं जहां मैं प्रासंगिक डेटा के साथ कम से कम अणुओं को स्टोर कर सकता हूं और फिर पहुंच सकता हूं उस डेटा को जांच / संशोधित करने के लिए। मैं पायथन में ऐसा करने के बारे में सोच रहा था, इसलिए कोड / कक्षाएं शायद कुछ इस तरह दिखेंगी : http://pastebin.com/uUi1BMzr

शायद यह वास्तव में स्टैकऑवरफ्लो के लिए एक प्रोग्रामिंग प्रश्न है, लेकिन मैंने सोचा कि यह यहां जाने के लिए पर्याप्त विशिष्ट था। किसी भी सहायता की बहुत सराहना की जाएगी, भले ही आप सिर्फ यह इंगित करें कि मैंने कहां वैचारिक ब्लंडर किया है। अग्रिम में धन्यवाद।


1
इसके अलावा, किसी के साथ भी कुछ ऐसा ही करने का प्रयास करने के लिए, मुझे सिर्फ एक अच्छा खुला स्रोत अजगर पैकेज मिला है, जिसने आणविक यांत्रिकी उपकरण किट के लिए एमएमटीके नामक कुछ अवधारणाओं के साथ मेरी मदद की है।
नैट

1
क्या आपने ओपनबेल को देखा है? वह सब कुछ आपके हाथ में होना चाहिए।
मृत्युंजय

जवाबों:


5

लेखन सॉफ्टवेयर एक पुनरावृत्ति प्रक्रिया है - कोड लिखें -> देखें कि आप कितनी दूर मिल सकते हैं फिर अगले चरणों की योजना बनाएं -> कोड लिखें -> दोहराएं। कला सीखने के इस चरण में मैं आपको सुझाव दूंगा कि आप जल्द ही पानी का परीक्षण करें। पूरे सिस्टम को आगे बढ़ाने की योजना बनाने की जरूरत नहीं है। हाँ अजगर एक अच्छी पहली भाषा होगी। विज़ुअलाइज़ेशन के लिए MatPlotLib को आज़माएं, NumPy और SciPy भी आसान हैं। औद्योगिक पैमाने का सॉफ़्टवेयर हमेशा पूर्व-निर्मित पुस्तकालयों में खींचने पर निर्भर करता है, बजाय खुद को सब कुछ लिखने के, फिर भी सरल समाधान खुद को लिखा जा सकता है, खासकर जब कार्यक्रम सीखना। आपका OO लेआउट अभी के लिए ठीक लगता है। जब / यदि आपके ऑब्जेक्ट संबंधों को बाद में बदलने की आवश्यकता होती है, तो आपके कोड को फिर से फैक्ट करने का कार्य मास्टर के लिए एक योग्य अनुभव है। नाव पर स्वागत है !


इनपुट के लिए धन्यवाद। मैं बस इसे रखने जा रहा हूं। मैं ऑब्जेक्ट विशेषताओं / चर को पास और म्यूट करने के बारे में भी थोड़ा सीख रहा हूं। वास्तविक दुनिया से कुछ लेना और कंप्यूटर कोड में इसका प्रतिनिधित्व करने का प्रयास करना वास्तव में आकर्षक है।
नैट

9

आपके लक्ष्य में बहुत सारी चुनौतियाँ हैं। मैं उन्हें भागों में तोड़ दूँगा।

SMILES पार्स करने के लिए एक तुच्छ भाषा नहीं है, और खुशबूदार धारणा के नियमों को अच्छी तरह से परिभाषित नहीं किया गया है। OpenSMILES परियोजना से विस्तृत व्याकरण परिभाषा कुछ मदद करनी चाहिए।

SMILES टोपोलॉजी को परिभाषित करता है, लेकिन 2D या 3D जानकारी नहीं देता है। या तो बनाना कठिन है। (यह है, यदि आप चाहते हैं कि यह अच्छा दिखे।)

वास्तव में, आपको RDKit cheminformatics toolkit (या OpenBabel) पर देखना चाहिए, लेकिन मुझे RDKit पसंद है)। इसमें एक SMILES पार्सर बनाया गया है, साथ ही 2D लेआउट भी है, और मेरा मानना ​​है कि 3D निर्माण पीढ़ी। ओपनबेल भी करती है।

फिर प्रदर्शन के लिए आपको GUI सिस्टम का पता लगाना होगा। दरअसल, यहां जावा में सीडीके केमिनफॉर्मेटिक्स टूलकिट सबसे उन्नत है।

लेकिन आप मूल बातों में हैं कि किसी अणु का प्रतिनिधित्व कैसे करें। छोटे-अणु और बड़े-अणु (प्रोटीन, डीएनए) डेटा मॉडल के बीच अंतर हैं, लेकिन जब से आप SMILES में रुचि रखते हैं इसका मतलब है कि आप छोटे-अणु उन्मुख हैं।

आप RDKit, OpenBabel, CDK, OEChem, और Indigo जैसे कई अन्य लोगों के लिए एपीआई डॉक्स देख सकते हैं। इससे आपको उन विविध तरीकों का अंदाजा होगा, जिनसे लोग अपने वर्ग एपीआई का विकास करते हैं। इनमें से, मैं OEChem को सबसे अधिक पसंद करता हूं, उसके बाद RDKit। भले ही OEChem खुला स्रोत है, एपीआई ऑनलाइन और स्वतंत्र रूप से पठनीय है, उपयोग के उदाहरणों के साथ।

संक्षेप में, एक अणु और बंध उदाहरणों की सूची के साथ, एक अणु वर्ग है। "mol.AddAtom (तत्व संख्या)" एक नया परमाणु बनाता है, जिसमें कोई बंधन नहीं होता है, "mol.AddBond (atom1, atom2, bond_type)" एक बंधन संबंध बनाते हैं। प्रत्येक बॉन्ड को अपने से जुड़े परमाणुओं को जानना होता है, और प्रत्येक परमाणु को बॉन्ड की सूची की आवश्यकता होती है। यह डेटा संरचना में बहुत सारे चक्रों की ओर जाता है, लेकिन इसकी आवश्यकता है ताकि कनेक्टिविटी खोज जैसे विभिन्न एल्गोरिदम को रैखिक समय में किया जा सके।

2 डी मैट्रिक्स का उपयोग न करें। जबकि एक छोटे अणु के लिए संभव है, यह उस पैमाने को ठीक नहीं करता है, और इसकी कोई आवश्यकता नहीं है। कुछ एल्गोरिदम को कनेक्टिविटी मैट्रिक्स की आवश्यकता होती है, और यदि आवश्यक हो तो यह आसानी से उत्पन्न होता है।

एक "कार्यात्मक समूह" नहीं है। यह बहुत विशिष्ट है। "सबसेट" या "फ़्रैगमेंट" जैसी किसी चीज़ का उपयोग करें, जिसमें आपके द्वारा रुचि रखने वाले परमाणुओं और बांडों की सूची शामिल है। इस तरह से आप "चयनित परमाणु" और "रिंग सबस्ट्रक्चर" और "पाड़" जैसी चीजों को भी संदर्भित कर सकते हैं। विशिष्ट सबसेट।

मैंने तुम्हारे पास्टबिन को देखा। पार्सर को इस तरह से काम नहीं करना चाहिए। आपको अपने वास्तविक अणु संरचना से पार्सिंग को अलग करना चाहिए। कुछ इस तरह की कोशिश करो:

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 द्वारा होस्ट की गई "ब्लू ओबिलिस्क" Q & A साइट भी है।


1

आरंभ करने के लिए एक और दृष्टिकोण कुछ कोड पर एक नज़र रखना हो सकता है जो पहले से ही आपकी समस्या से संबंधित कुछ करता है। उस स्थिति में आपका व्यायाम किसी अन्य कार्यक्रम में भी समाप्त हो सकता है, और यह अच्छा होगा, है न?

आपके लिए रुचि रखने वाले कार्यक्रम हो सकते हैं

  • एमडी सिमुलेशन और आणविक मॉडलिंग पैकेज MMTK (जैसा कि पहले ही नैट द्वारा ऊपर सुझाव दिया गया है)

  • विज़ुअलाइज़ेशन पैकेज PyMol


1

आणविक वस्तु प्रणाली का विवरण सीखना रसायन विज्ञानियों के लिए वस्तु उन्मुख प्रोग्रामिंग सीखने का एक शानदार तरीका है। आप पाएंगे कि ऐसी प्रणाली के कार्यान्वयन से आपके आणविक अंतर्ज्ञान परिष्कृत हो जाएंगे। आपको विशेषताओं और विधियों के संदर्भ में परमाणुओं, अणुओं, और शायद अणुओं के संग्रह के बारे में कुछ कठिन सोच करनी चाहिए।

यहाँ कुछ अच्छे अजगर (थोड़े पुराने) स्लाइड हैं जो मदद कर सकते हैं: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

अपने काम की जाँच के लिए: ओपनबेल के अलावा (जिसमें पायथन बाइंडिंग है!) और एमएमटीके, फिनिक्स में ELBOW है।

आप में बहुभाषाविद के लिए, PerlMol (Perlmol.org) भी है। PerlMol को ऑब्जेक्ट ओरिएंटेड पर्ल में लिखा गया है और इसे CPAN से डाउनलोड किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.