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