def plot(png): path = os.path.join(tmpdir, png) if not os.path.isfile(path): name, id = png[:-4].split('-') dct = db[int(id)].data dct2plot(dct, name, path, show=False) return send_from_directory(tmpdir, png)
def main(args): verbosity = 1 - args.quiet + args.verbose query = ','.join(args.query) if args.sort.endswith('-'): # Allow using "key-" instead of "-key" for reverse sorting args.sort = '-' + args.sort[:-1] if query.isdigit(): query = int(query) add_key_value_pairs = {} if args.add_key_value_pairs: for pair in args.add_key_value_pairs.split(','): key, value = pair.split('=') add_key_value_pairs[key] = convert_str_to_int_float_or_str(value) if args.delete_keys: delete_keys = args.delete_keys.split(',') else: delete_keys = [] db = connect(args.database, use_lock_file=not args.no_lock_file) def out(*args): if verbosity > 0: print(*args) if args.analyse: db.analyse() return if args.show_keys: keys = defaultdict(int) for row in db.select(query): for key in row._keys: keys[key] += 1 n = max(len(key) for key in keys) + 1 for key, number in keys.items(): print('{:{}} {}'.format(key + ':', n, number)) return if args.show_values: keys = args.show_values.split(',') values = {key: defaultdict(int) for key in keys} numbers = set() for row in db.select(query): kvp = row.key_value_pairs for key in keys: value = kvp.get(key) if value is not None: values[key][value] += 1 if not isinstance(value, str): numbers.add(key) n = max(len(key) for key in keys) + 1 for key in keys: vals = values[key] if key in numbers: print('{:{}} [{}..{}]'.format(key + ':', n, min(vals), max(vals))) else: print('{:{}} {}'.format( key + ':', n, ', '.join('{}({})'.format(v, n) for v, n in vals.items()))) return if args.add_from_file: filename = args.add_from_file configs = ase.io.read(filename) if not isinstance(configs, list): configs = [configs] for atoms in configs: db.write(atoms, key_value_pairs=add_key_value_pairs) out('Added ' + plural(len(configs), 'row')) return if args.count: n = db.count(query) print('%s' % plural(n, 'row')) return if args.explain: for row in db.select(query, explain=True, verbosity=verbosity, limit=args.limit, offset=args.offset): print(row['explain']) return if args.show_metadata: print(json.dumps(db.metadata, sort_keys=True, indent=4)) return if args.set_metadata: with open(args.set_metadata) as fd: db.metadata = json.load(fd) return if args.insert_into: nkvp = 0 nrows = 0 with connect(args.insert_into, use_lock_file=not args.no_lock_file) as db2: for row in db.select(query, sort=args.sort): kvp = row.get('key_value_pairs', {}) nkvp -= len(kvp) kvp.update(add_key_value_pairs) nkvp += len(kvp) if args.unique: row['unique_id'] = '%x' % randint(16**31, 16**32 - 1) if args.strip_data: db2.write(row.toatoms(), **kvp) else: db2.write(row, data=row.get('data'), **kvp) nrows += 1 out('Added %s (%s updated)' % (plural(nkvp, 'key-value pair'), plural(len(add_key_value_pairs) * nrows - nkvp, 'pair'))) out('Inserted %s' % plural(nrows, 'row')) return if add_key_value_pairs or delete_keys: ids = [row['id'] for row in db.select(query)] M = 0 N = 0 with db: for id in ids: m, n = db.update(id, delete_keys=delete_keys, **add_key_value_pairs) M += m N += n out('Added %s (%s updated)' % (plural(M, 'key-value pair'), plural(len(add_key_value_pairs) * len(ids) - M, 'pair'))) out('Removed', plural(N, 'key-value pair')) return if args.delete: ids = [row['id'] for row in db.select(query)] if ids and not args.yes: msg = 'Delete %s? (yes/No): ' % plural(len(ids), 'row') if input(msg).lower() != 'yes': return db.delete(ids) out('Deleted %s' % plural(len(ids), 'row')) return if args.plot_data: from ase.db.plot import dct2plot dct2plot(db.get(query).data, args.plot_data) return if args.plot: if ':' in args.plot: tags, keys = args.plot.split(':') tags = tags.split(',') else: tags = [] keys = args.plot keys = keys.split(',') plots = defaultdict(list) X = {} labels = [] for row in db.select(query, sort=args.sort, include_data=False): name = ','.join(str(row[tag]) for tag in tags) x = row.get(keys[0]) if x is not None: if isinstance(x, basestring): if x not in X: X[x] = len(X) labels.append(x) x = X[x] plots[name].append([x] + [row.get(key) for key in keys[1:]]) import matplotlib.pyplot as plt for name, plot in plots.items(): xyy = zip(*plot) x = xyy[0] for y, key in zip(xyy[1:], keys[1:]): plt.plot(x, y, label=name + ':' + key) if X: plt.xticks(range(len(labels)), labels, rotation=90) plt.legend() plt.show() return if args.json: row = db.get(query) db2 = connect(sys.stdout, 'json', use_lock_file=False) kvp = row.get('key_value_pairs', {}) db2.write(row, data=row.get('data'), **kvp) return db.python = args.metadata_from_python_script if args.long: db.meta = process_metadata(db, html=args.open_web_browser) row = db.get(query) summary = Summary(row, db.meta) summary.write() return if args.open_web_browser: try: import ase.db.app as app except ImportError: print('Please install Flask: pip install flask') return app.databases['default'] = db app.initialize_databases() app.app.run(host='0.0.0.0', debug=True) return if args.write_summary_files: prefix = args.write_summary_files db.meta = process_metadata(db, html=args.open_web_browser) ukey = db.meta.get('unique_key', 'id') for row in db.select(query): uid = row.get(ukey) summary = Summary(row, db.meta, prefix='{}-{}-'.format(prefix, uid)) return columns = list(all_columns) c = args.columns if c and c.startswith('++'): keys = set() for row in db.select(query, limit=args.limit, offset=args.offset, include_data=False): keys.update(row._keys) columns.extend(keys) if c[2:3] == ',': c = c[3:] else: c = '' if c: if c[0] == '+': c = c[1:] elif c[0] != '-': columns = [] for col in c.split(','): if col[0] == '-': columns.remove(col[1:]) else: columns.append(col.lstrip('+')) table = Table(db, verbosity=verbosity, cut=args.cut) table.select(query, columns, args.sort, args.limit, args.offset) if args.csv: table.write_csv() else: table.write(query)
def run(opts, args, verbosity): filename = args.pop(0) query = ','.join(args) if query.isdigit(): query = int(query) add_key_value_pairs = {} if opts.add_key_value_pairs: for pair in opts.add_key_value_pairs.split(','): key, value = pair.split('=') add_key_value_pairs[key] = convert_str_to_int_float_or_str(value) if opts.delete_keys: delete_keys = opts.delete_keys.split(',') else: delete_keys = [] con = connect(filename, use_lock_file=not opts.no_lock_file) def out(*args): if verbosity > 0: print(*args) if opts.analyse: con.analyse() return if opts.add_from_file: filename = opts.add_from_file if ':' in filename: calculator_name, filename = filename.split(':') atoms = get_calculator(calculator_name)(filename).get_atoms() else: atoms = ase.io.read(filename) con.write(atoms, key_value_pairs=add_key_value_pairs) out('Added {0} from {1}'.format(atoms.get_chemical_formula(), filename)) return if opts.count: n = con.count(query) print('%s' % plural(n, 'row')) return if opts.explain: for row in con.select(query, explain=True, verbosity=verbosity, limit=opts.limit, offset=opts.offset): print(row['explain']) return if opts.insert_into: nkvp = 0 nrows = 0 with connect(opts.insert_into, use_lock_file=not opts.no_lock_file) as con2: for row in con.select(query): kvp = row.get('key_value_pairs', {}) nkvp -= len(kvp) kvp.update(add_key_value_pairs) nkvp += len(kvp) if opts.unique: row['unique_id'] = '%x' % randint(16**31, 16**32 - 1) con2.write(row, data=row.get('data'), **kvp) nrows += 1 out('Added %s (%s updated)' % (plural(nkvp, 'key-value pair'), plural(len(add_key_value_pairs) * nrows - nkvp, 'pair'))) out('Inserted %s' % plural(nrows, 'row')) return if add_key_value_pairs or delete_keys: ids = [row['id'] for row in con.select(query)] m, n = con.update(ids, delete_keys, **add_key_value_pairs) out('Added %s (%s updated)' % (plural(m, 'key-value pair'), plural(len(add_key_value_pairs) * len(ids) - m, 'pair'))) out('Removed', plural(n, 'key-value pair')) return if opts.delete: ids = [row['id'] for row in con.select(query)] if ids and not opts.yes: msg = 'Delete %s? (yes/No): ' % plural(len(ids), 'row') if input(msg).lower() != 'yes': return con.delete(ids) out('Deleted %s' % plural(len(ids), 'row')) return if opts.plot_data: from ase.db.plot import dct2plot dct2plot(con.get(query).data, opts.plot_data) return if opts.plot: if ':' in opts.plot: tags, keys = opts.plot.split(':') tags = tags.split(',') else: tags = [] keys = opts.plot keys = keys.split(',') plots = collections.defaultdict(list) X = {} labels = [] for row in con.select(query, sort=opts.sort): name = ','.join(str(row[tag]) for tag in tags) x = row.get(keys[0]) if x is not None: if isinstance(x, basestring): if x not in X: X[x] = len(X) labels.append(x) x = X[x] plots[name].append([x] + [row.get(key) for key in keys[1:]]) import matplotlib.pyplot as plt for name, plot in plots.items(): xyy = zip(*plot) x = xyy[0] for y, key in zip(xyy[1:], keys[1:]): plt.plot(x, y, label=name + ':' + key) if X: plt.xticks(range(len(labels)), labels, rotation=90) plt.legend() plt.show() return if opts.long: row = con.get(query) summary = Summary(row) summary.write() elif opts.json: row = con.get(query) con2 = connect(sys.stdout, 'json', use_lock_file=False) kvp = row.get('key_value_pairs', {}) con2.write(row, data=row.get('data'), **kvp) else: if opts.open_web_browser: import ase.db.app as app app.db = con app.app.run(host='0.0.0.0', debug=True) else: columns = list(all_columns) c = opts.columns if c and c.startswith('++'): keys = set() for row in con.select(query, limit=opts.limit, offset=opts.offset): keys.update(row._keys) columns.extend(keys) if c[2:3] == ',': c = c[3:] else: c = '' if c: if c[0] == '+': c = c[1:] elif c[0] != '-': columns = [] for col in c.split(','): if col[0] == '-': columns.remove(col[1:]) else: columns.append(col.lstrip('+')) table = Table(con, verbosity, opts.cut) table.select(query, columns, opts.sort, opts.limit, opts.offset) if opts.csv: table.write_csv() else: table.write(query)
def run(opts, args, verbosity): filename = args.pop(0) query = ','.join(args) if query.isdigit(): query = int(query) add_key_value_pairs = {} if opts.add_key_value_pairs: for pair in opts.add_key_value_pairs.split(','): key, value = pair.split('=') add_key_value_pairs[key] = convert_str_to_float_or_str(value) if opts.delete_keys: delete_keys = opts.delete_keys.split(',') else: delete_keys = [] con = connect(filename, use_lock_file=not opts.no_lock_file) def out(*args): if verbosity > 0: print(*args) if opts.analyse: con.analyse() return if opts.add_from_file: filename = opts.add_from_file if ':' in filename: calculator_name, filename = filename.split(':') atoms = get_calculator(calculator_name)(filename).get_atoms() else: atoms = ase.io.read(filename) con.write(atoms, key_value_pairs=add_key_value_pairs) out('Added {0} from {1}'.format(atoms.get_chemical_formula(), filename)) return if opts.count: n = con.count(query) print('%s' % plural(n, 'row')) return if opts.explain: for dct in con.select(query, explain=True, verbosity=verbosity, limit=opts.limit, offset=opts.offset): print(dct['explain']) return if opts.insert_into: nkvp = 0 nrows = 0 with connect(opts.insert_into, use_lock_file=not opts.no_lock_file) as con2: for dct in con.select(query): kvp = dct.get('key_value_pairs', {}) nkvp -= len(kvp) kvp.update(add_key_value_pairs) nkvp += len(kvp) if opts.unique: dct['unique_id'] = '%x' % randint(16**31, 16**32 - 1) con2.write(dct, data=dct.get('data'), **kvp) nrows += 1 out('Added %s (%s updated)' % (plural(nkvp, 'key-value pair'), plural(len(add_key_value_pairs) * nrows - nkvp, 'pair'))) out('Inserted %s' % plural(nrows, 'row')) return if add_key_value_pairs or delete_keys: ids = [dct['id'] for dct in con.select(query)] m, n = con.update(ids, delete_keys, **add_key_value_pairs) out('Added %s (%s updated)' % (plural(m, 'key-value pair'), plural(len(add_key_value_pairs) * len(ids) - m, 'pair'))) out('Removed', plural(n, 'key-value pair')) return if opts.delete: ids = [dct['id'] for dct in con.select(query)] if ids and not opts.yes: msg = 'Delete %s? (yes/No): ' % plural(len(ids), 'row') if input(msg).lower() != 'yes': return con.delete(ids) out('Deleted %s' % plural(len(ids), 'row')) return if opts.plot_data: from ase.db.plot import dct2plot dct2plot(con.get(query).data, opts.plot_data) return if opts.plot: if ':' in opts.plot: tags, keys = opts.plot.split(':') tags = tags.split(',') else: tags = [] keys = opts.plot keys = keys.split(',') plots = collections.defaultdict(list) X = {} labels = [] for row in con.select(query, sort=opts.sort): name = ','.join(str(row[tag]) for tag in tags) x = row.get(keys[0]) if x is not None: if isinstance(x, basestring): if x not in X: X[x] = len(X) labels.append(x) x = X[x] plots[name].append([x] + [row.get(key) for key in keys[1:]]) import matplotlib.pyplot as plt for name, plot in plots.items(): xyy = zip(*plot) x = xyy[0] for y, key in zip(xyy[1:], keys[1:]): plt.plot(x, y, label=name + ':' + key) if X: plt.xticks(range(len(labels)), labels, rotation=90) plt.legend() plt.show() return if opts.long: dct = con.get(query) summary = Summary(dct) summary.write() elif opts.json: dct = con.get(query) con2 = connect(sys.stdout, 'json', use_lock_file=False) kvp = dct.get('key_value_pairs', {}) con2.write(dct, data=dct.get('data'), **kvp) else: if opts.open_web_browser: import ase.db.app as app app.db = con app.app.run(host='0.0.0.0', debug=True) else: columns = list(all_columns) c = opts.columns if c and c.startswith('++'): keys = set() for row in con.select(query, limit=opts.limit, offset=opts.offset): keys.update(row._keys) columns.extend(keys) if c[2:3] == ',': c = c[3:] else: c = '' if c: if c[0] == '+': c = c[1:] elif c[0] != '-': columns = [] for col in c.split(','): if col[0] == '-': columns.remove(col[1:]) else: columns.append(col.lstrip('+')) table = Table(con, verbosity, opts.cut) table.select(query, columns, opts.sort, opts.limit, opts.offset) if opts.csv: table.write_csv() else: table.write(query)
def main(args): verbosity = 1 - args.quiet + args.verbose query = ','.join(args.query) if args.sort.endswith('-'): args.sort = '-' + args.sort[:-1] if query.isdigit(): query = int(query) add_key_value_pairs = {} if args.add_key_value_pairs: for pair in args.add_key_value_pairs.split(','): key, value = pair.split('=') add_key_value_pairs[key] = convert_str_to_int_float_or_str(value) if args.delete_keys: delete_keys = args.delete_keys.split(',') else: delete_keys = [] db = connect(args.database, use_lock_file=not args.no_lock_file) def out(*args): if verbosity > 0: print(*args) if args.analyse: db.analyse() return if args.add_from_file: filename = args.add_from_file if ':' in filename: calculator_name, filename = filename.split(':') atoms = get_calculator(calculator_name)(filename).get_atoms() else: atoms = ase.io.read(filename) db.write(atoms, key_value_pairs=add_key_value_pairs) out('Added {0} from {1}'.format(atoms.get_chemical_formula(), filename)) return if args.count: n = db.count(query) print('%s' % plural(n, 'row')) return if args.explain: for row in db.select(query, explain=True, verbosity=verbosity, limit=args.limit, offset=args.offset): print(row['explain']) return if args.show_metadata: print(json.dumps(db.metadata, sort_keys=True, indent=4)) return if args.set_metadata: with open(args.set_metadata) as fd: db.metadata = json.load(fd) return if args.insert_into: nkvp = 0 nrows = 0 with connect(args.insert_into, use_lock_file=not args.no_lock_file) as db2: for row in db.select(query, sort=args.sort): kvp = row.get('key_value_pairs', {}) nkvp -= len(kvp) kvp.update(add_key_value_pairs) nkvp += len(kvp) if args.unique: row['unique_id'] = '%x' % randint(16**31, 16**32 - 1) db2.write(row, data=row.get('data'), **kvp) nrows += 1 out('Added %s (%s updated)' % (plural(nkvp, 'key-value pair'), plural(len(add_key_value_pairs) * nrows - nkvp, 'pair'))) out('Inserted %s' % plural(nrows, 'row')) return if add_key_value_pairs or delete_keys: ids = [row['id'] for row in db.select(query)] m, n = db.update(ids, delete_keys, **add_key_value_pairs) out('Added %s (%s updated)' % (plural(m, 'key-value pair'), plural(len(add_key_value_pairs) * len(ids) - m, 'pair'))) out('Removed', plural(n, 'key-value pair')) return if args.delete: ids = [row['id'] for row in db.select(query)] if ids and not args.yes: msg = 'Delete %s? (yes/No): ' % plural(len(ids), 'row') if input(msg).lower() != 'yes': return db.delete(ids) out('Deleted %s' % plural(len(ids), 'row')) return if args.plot_data: from ase.db.plot import dct2plot dct2plot(db.get(query).data, args.plot_data) return if args.plot: if ':' in args.plot: tags, keys = args.plot.split(':') tags = tags.split(',') else: tags = [] keys = args.plot keys = keys.split(',') plots = collections.defaultdict(list) X = {} labels = [] for row in db.select(query, sort=args.sort, include_data=False): name = ','.join(str(row[tag]) for tag in tags) x = row.get(keys[0]) if x is not None: if isinstance(x, basestring): if x not in X: X[x] = len(X) labels.append(x) x = X[x] plots[name].append([x] + [row.get(key) for key in keys[1:]]) import matplotlib.pyplot as plt for name, plot in plots.items(): xyy = zip(*plot) x = xyy[0] for y, key in zip(xyy[1:], keys[1:]): plt.plot(x, y, label=name + ':' + key) if X: plt.xticks(range(len(labels)), labels, rotation=90) plt.legend() plt.show() return if args.json: row = db.get(query) db2 = connect(sys.stdout, 'json', use_lock_file=False) kvp = row.get('key_value_pairs', {}) db2.write(row, data=row.get('data'), **kvp) return db.python = args.metadata_from_python_script db.meta = process_metadata(db, html=args.open_web_browser) if args.long: # Remove .png files so that new ones will be created. for func, filenames in db.meta.get('functions', []): for filename in filenames: try: os.remove(filename) except OSError: # Python 3 only: FileNotFoundError pass row = db.get(query) summary = Summary(row, db.meta) summary.write() else: if args.open_web_browser: import ase.db.app as app app.databases['default'] = db app.app.run(host='0.0.0.0', debug=True) else: columns = list(all_columns) c = args.columns if c and c.startswith('++'): keys = set() for row in db.select(query, limit=args.limit, offset=args.offset, include_data=False): keys.update(row._keys) columns.extend(keys) if c[2:3] == ',': c = c[3:] else: c = '' if c: if c[0] == '+': c = c[1:] elif c[0] != '-': columns = [] for col in c.split(','): if col[0] == '-': columns.remove(col[1:]) else: columns.append(col.lstrip('+')) table = Table(db, verbosity, args.cut) table.select(query, columns, args.sort, args.limit, args.offset) if args.csv: table.write_csv() else: table.write(query)