def get_global_hierarchical_data(self, keys): projection = {'_id': 1, 'mp_cat_id': 1} for key in keys: projection['content.' + key] = 1 docs = self.query_contributions(projection=projection, limit=1) if not docs: raise Exception('No contributions found!') from mpcontribs.io.core.mpfile import MPFileCore mpfile = MPFileCore.from_contribution(docs[0]) identifier = mpfile.ids[0] return mpfile.hdata[identifier]
if level_reduction: del scope[level:] # append scope if value is None: scope.append("".join([replacements.get(c, c) for c in key])) # correct scope to omit internal 'general' section scope_corr = scope if scope[0] == mp_level01_titles[0]: scope_corr = scope[1:] # insert scope line if (value is None and scope_corr) or (value is not None and level_reduction): lines.append("\n{" + ".".join(scope_corr) + "}") # insert key-value line if value is not None: val = str(value) value_lines = ([val] if val.startswith("http") else textwrap.wrap(val)) if len(value_lines) > 1: value_lines = [""] + value_lines + [":end"] lines.append( make_pair( "".join([replacements.get(c, c) for c in key]), "\n".join(value_lines), )) return "\n".join(lines) + "\n" MPFileCore.register(MPFile)
def build(self, contributor_email, cid, api_key=None, endpoint=None): """update materials/compositions collections with contributed data""" cid_short, cid_str = get_short_object_id(cid), str(cid) contrib = self.find_contribution(cid) if not contrib: raise Exception('Contribution {} not found!'.format(cid)) if contributor_email not in contrib['collaborators']: raise ValueError( "Build stopped: building contribution {} not " "allowed due to insufficient permissions of {}! Ask " "someone of {} to make you a collaborator on {}.".format( cid_short, contributor_email, contrib['collaborators'], cid_short)) from pymatgen.util.provenance import Author mpfile = MPFileCore.from_contribution(contrib) mp_cat_id = mpfile.ids[0] is_mp_id = mp_id_pattern.match(mp_cat_id) self.curr_coll = self.materials if is_mp_id else self.compositions author = Author.parse_author(contributor_email) project = str(author.name).translate(None, '.') \ if 'project' not in contrib else contrib['project'] nb = nbf.new_notebook() if isinstance(self.db, dict): contrib.pop('_id') if 'cid' in contrib['content']: contrib['content'].pop('cid') nb['cells'].append( nbf.new_code_cell( "from mpcontribs.io.core.mpfile import MPFileCore\n" "from mpcontribs.io.core.recdict import RecursiveDict\n" "mpfile = MPFileCore.from_contribution({})\n" "identifier = '{}'".format(contrib, mp_cat_id))) else: nb['cells'].append( nbf.new_code_cell( "from mpcontribs.rest.rester import MPContribsRester")) os.environ['PMG_MAPI_KEY'] = api_key os.environ['PMG_MAPI_ENDPOINT'] = endpoint nb['cells'].append( nbf.new_code_cell( "with MPContribsRester() as mpr:\n" " mpfile = mpr.find_contribution('{}')\n" " identifier = mpfile.ids[0]".format(cid))) nb['cells'].append( nbf.new_markdown_cell("## Contribution #{} for {}".format( cid_short, mp_cat_id))) nb['cells'].append(nbf.new_markdown_cell("### Hierarchical Data")) nb['cells'].append(nbf.new_code_cell("mpfile.hdata[identifier]")) if mpfile.tdata[mp_cat_id]: nb['cells'].append(nbf.new_markdown_cell("### Tabular Data")) for table_name, table in mpfile.tdata[mp_cat_id].iteritems(): nb['cells'].append( nbf.new_markdown_cell("#### {}".format(table_name))) nb['cells'].append( nbf.new_code_cell( "mpfile.tdata[identifier]['{}']".format(table_name))) if mpfile.gdata[mp_cat_id]: nb['cells'].append(nbf.new_markdown_cell("### Graphical Data")) for plot_name, plot in mpfile.gdata[mp_cat_id].iteritems(): nb['cells'].append( nbf.new_markdown_cell("#### {}".format(plot_name))) nb['cells'].append( nbf.new_code_cell( "mpfile.gdata[identifier]['{}']".format(plot_name))) if mpfile.sdata[mp_cat_id]: nb['cells'].append(nbf.new_markdown_cell("### Structural Data")) for structure_name, structure in mpfile.sdata[mp_cat_id].iteritems(): nb['cells'].append( nbf.new_markdown_cell("#### {}".format(structure_name))) nb['cells'].append( nbf.new_code_cell( "mpfile.sdata[identifier]['{}']".format(structure_name))) self.ep.preprocess(nb, {'metadata': {'path': self.nbdir}}) if isinstance(self.db, dict): return [mp_cat_id, project, cid_short, export_notebook(nb, cid)] else: build_doc = RecursiveDict() build_doc['mp_cat_id'] = mp_cat_id build_doc['project'] = project build_doc['nb'] = nb self.curr_coll.update({'_id': cid}, {'$set': build_doc}, upsert=True) return '{}/{}'.format( # return URL for contribution page ('materials' if is_mp_id else 'compositions'), cid_str)