Example #1
0
def check_dependencies():
    """Make sure pybel is availiable, as basically every tool uses it."""
    emsg = "MESS.DB requires Open Babel (and its python module, pybel) " "version >=2.3.0."
    try:
        import pybel

        decorate(pybel, UnicodeDecorator)
        version = pybel.ob.OBReleaseVersion()
        if LooseVersion(version) < LooseVersion("2.3.0"):
            sys.exit("%s Current version is %s." % (emsg, version))
    except (AttributeError, ImportError):
        sys.exit(emsg)
Example #2
0
 def check(self):
     inchikey_dir = get_inchikey_dir(self.inchikey)
     try:
         mol = pybel.readfile('xyz',
                              os.path.join(inchikey_dir,
                                           self.method_dir,
                                           '%s.xyz' % self.inchikey)).next()
     except IOError:
         return False
     decorate(mol, UnicodeDecorator)
     if not mol.write('inchikey').rstrip() == self.inchikey:
         self.log_console.warning('inconsistent 3D geometry in %s (%s)',
                                  self.inchikey, self.method_dir)
         return False
     return True
Example #3
0
 def execute(self, args):
     """Run import method for every molecule in source."""
     source = Source()
     source.setup(args.source)
     self.log_console.info('reading molecules')
     molecules = OrderedDict() # not required, but useful for debugging
                               # crashing imports
     threedee = False
     pybel.ob.obErrorLog.SetOutputLevel(-1)
     for source_file in source.files():
         for mol in pybel.readfile(source_file.split('.')[-1],
                                   os.path.join(source.source_dir,
                                                source_file)):
             if not threedee and mol.dim == 3:
                 threedee = True
             try:
                 decorate(mol, UnicodeDecorator)
             except IndexError:
                 self.log_console.error('Unexpected error importing %s.',
                                        mol.title)
                 continue
             inchikey = mol.write('inchikey').rstrip()
             if not is_inchikey(inchikey):
                 self.log_console.info(
                     ("'%s' is not an importable molecule."), mol.title)
                 continue
             molecules[inchikey] = (mol, source)
             if not args.skip_fragments:
                 cansmi = mol.write('can').split()[0]
                 if cansmi.count('.') > 0:
                     for fragment in cansmi.split('.'):
                         fragmol = pybel.readstring('can', fragment)
                         decorate(fragmol, UnicodeDecorator)
                         inchikey = fragmol.write('inchikey').rstrip()
                         if not is_inchikey(inchikey):
                             self.log_console.info(
                                 ("'%s' fragment in %s "
                                  "is not an importable molecule."),
                                 fragment, mol.title)
                         else:
                             fragmol.title = mol.title
                             molecules[inchikey] = (fragmol, source)
     import0d = Import0D()
     import0d.setup()
     if threedee:
         import3d = Import3D()
         import3d.shortdesc = source.dirname
         import3d.setup()
     self.log_console.info('setting up molecule dirs')
     queries = {}
     for inchikey, (mol, source) in molecules.iteritems():
         for query, values in import0d.map(mol, source):
             try:
                 queries[query].append(values)
             except KeyError:
                 queries[query] = [values]
         if mol.dim == 3:
             import3d.map(mol, source)
     self.log_console.info('loading simple properties')
     for query, values in queries.iteritems():
         import0d.reduce(query, values)