class StructureSimilarityBuilderTest(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        # Set up test db, etc.
        self.test_site_descriptors = MemoryStore("site_descr")
        self.test_site_descriptors.connect()
        site_fp_docs = loadfn(test_site_fp_stats, cls=None)
        self.test_site_descriptors.update(site_fp_docs)

    def test_get_items(self):
        test_structure_similarity = MemoryStore("struct_sim")
        test_structure_similarity.connect()
        sim_builder = StructureSimilarityBuilder(self.test_site_descriptors,
                                                 test_structure_similarity,
                                                 fp_type='opsf')

        items = list(sim_builder.get_items())
        self.assertEqual(len(items), 3)
        for i in items:
            d1 = i[0]
            d2 = i[1]
            self.assertIn("statistics", d1)
            self.assertIn("statistics", d2)

            self.assertIn("task_id", d1)
            self.assertIn("task_id", d2)

            processed = sim_builder.process_item(i)
            if processed:
                pass
            else:
                import nose
                nose.tools.set_trace()

    def test_get_all_site_descriptors(self):
        test_structure_similarity = MemoryStore("struct_sim")
        test_structure_similarity.connect()
        sim_builder = StructureSimilarityBuilder(self.test_site_descriptors,
                                                 test_structure_similarity,
                                                 fp_type='opsf')
        for d in self.test_site_descriptors.query():
            dsim = sim_builder.get_similarities(d, d)
            self.assertAlmostEqual(dsim['cos'], 1)
            self.assertAlmostEqual(dsim['dist'], 0)

        C = self.test_site_descriptors.query_one(criteria={"task_id": "mp-66"})
        NaCl = self.test_site_descriptors.query_one(criteria={"task_id": "mp-22862"})
        Fe = self.test_site_descriptors.query_one(criteria={"task_id": "mp-13"})

        d = sim_builder.get_similarities(C, NaCl)
        self.assertAlmostEqual(d['cos'], 0.0013649)
        self.assertAlmostEqual(d['dist'], 2.6866749)
        d = sim_builder.get_similarities(C, Fe)
        self.assertAlmostEqual(d['cos'], 0.0013069)
        self.assertAlmostEqual(d['dist'], 2.6293889)
        d = sim_builder.get_similarities(NaCl, Fe)
        self.assertAlmostEqual(d['cos'], 0.0012729)
        self.assertAlmostEqual(d['dist'], 2.7235044)
class TaskTaggerTest(unittest.TestCase):
    def setUp(self):
        coords = list()
        coords.append([0, 0, 0])
        coords.append([0.75, 0.5, 0.75])
        lattice = [
            [3.8401979337, 0.00, 0.00],
            [1.9200989668, 3.3257101909, 0.00],
            [0.00, -2.2171384943, 3.1355090603],
        ]

        structure = Structure(lattice, ["Si", "Si"], coords)

        input_sets = {
            "GGA Structure Optimization": MPRelaxSet(structure),
            "GGA Static": MPStaticSet(structure),
            "GGA NSCF Line": MPNonSCFSet(structure, mode="line"),
            "GGA NSCF Uniform": MPNonSCFSet(structure, mode="uniform"),
        }

        tasks = []
        t_id = 1
        for task_type, input_set in input_sets.items():
            doc = {
                "true_task_type": task_type,
                "last_updated": datetime.now(),
                "task_id": t_id,
                "state": "successful",
                "orig_inputs": {
                    "incar": input_set.incar.as_dict(),
                    "kpoints": input_set.kpoints.as_dict(),
                },
                "output": {
                    "structure": structure.as_dict()
                },
            }
            t_id += 1
            tasks.append(doc)

        self.test_tasks = MemoryStore("tasks")
        self.task_types = MemoryStore("task_types")
        self.test_tasks.connect()
        self.task_types.connect()

        self.test_tasks.update(tasks)

    def test_mp_defs(self):
        task_tagger = TaskTagger(tasks=self.test_tasks,
                                 task_types=self.task_types)

        for t in task_tagger.get_items():

            processed = task_tagger.calc(t)
            true_type = self.test_tasks.query_one(
                criteria={"task_id": t["task_id"]},
                properties=["true_task_type"])["true_task_type"]

            self.assertEqual(processed["task_type"], true_type)
示例#3
0
class BuilderTest(unittest.TestCase):
    def setUp(self):
        self.materials = MemoryStore()
        self.materials.connect()
        materials = loadfn(os.path.join(TEST_DIR, "test_materials.json"))
        materials = jsanitize(materials, strict=True, allow_bson=True)
        self.materials.update(materials)
        self.propstore = MemoryStore()
        self.propstore.connect()

    def test_serial_runner(self):
        builder = PropnetBuilder(self.materials, self.propstore)
        runner = Runner([builder])
        runner.run()

    def test_multiproc_runner(self):
        builder = PropnetBuilder(self.materials, self.propstore)
        runner = Runner([builder])
        runner.run()

    def test_process_item(self):
        item = self.materials.query_one(criteria={"pretty_formula": "Cs"})
        builder = PropnetBuilder(self.materials, self.propstore)
        processed = builder.process_item(item)
        self.assertIsNotNone(processed)
        # Ensure vickers hardness gets populated
        self.assertIn("vickers_hardness", processed)

    # @unittest.skipIf(not os.path.isfile("runner.json"), "No runner file")
    # def test_runner_pipeline(self):
    #     from monty.serialization import loadfn
    #     runner = loadfn("runner.json")
    #     runner.builders[0].connect()
    #     items = list(runner.builders[0].get_items())
    #     processed = runner.builders[0].process_item(items[0])
    #     runner.run()

    # Just here for reference, in case anyone wants to create a new set
    # of test materials -jhm
    @unittest.skipIf(True, "Skipping test materials creation")
    def create_test_docs(self):
        formulas = ["BaNiO3", "Si", "Fe2O3", "Cs"]
        from maggma.advanced_stores import MongograntStore
        from monty.serialization import dumpfn
        mgstore = MongograntStore("ro:matgen2.lbl.gov/mp_prod", "materials")
        builder = PropnetBuilder(mgstore,
                                 self.propstore,
                                 criteria={
                                     "pretty_formula": {
                                         "$in": formulas
                                     },
                                     "e_above_hull": 0
                                 })
        builder.connect()
        dumpfn(list(builder.get_items()), "test_materials.json")
示例#4
0
class TestBondBuilder(unittest.TestCase):
    def setUp(self):

        self.materials = JSONStore(test_mats)
        self.bonding = MemoryStore("bonding")

    def test_build(self):

        builder = BondBuilder(self.materials, self.bonding)
        runner = Runner([builder])
        runner.run()

        doc = self.bonding.query_one(
            criteria={'task_id': 'mp-779001'})["bonding"]["CrystalNN"]
        sg = StructureGraph.from_dict(doc['graph'])
        self.assertIsInstance(sg, StructureGraph)
        self.assertIn('Hf-O(6)', doc['summary']['coordination_envs'])
示例#5
0
class SiteDescriptorsBuilderTest(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        # Set up test db, etc.
        self.test_materials = MemoryStore("mat_site_fingerprint")

        self.test_materials.connect()
        struct_docs = loadfn(test_structs, cls=None)
        self.test_materials.update(struct_docs)

    def test_builder(self):
        test_site_descriptors = MemoryStore("test_site_descriptors")
        sd_builder = SiteDescriptorsBuilder(self.test_materials,
                                            test_site_descriptors)
        sd_builder.connect()
        for t in sd_builder.get_items():
            processed = sd_builder.process_item(t)
            if processed:
                sd_builder.update_targets([processed])
            else:
                import nose
                nose.tools.set_trace()
        self.assertEqual(len([t for t in sd_builder.get_items()]), 0)

        # Remove one data piece in diamond entry and test partial update.
        test_site_descriptors.collection.find_one_and_update(
            {'task_id': 'mp-66'}, {'$unset': {
                'site_descriptors': 1
            }})
        items = [e for e in list(sd_builder.get_items())]
        self.assertEqual(len(items), 1)

    def test_get_all_site_descriptors(self):
        test_site_descriptors = MemoryStore("test_site_descriptors")
        sd_builder = SiteDescriptorsBuilder(self.test_materials,
                                            test_site_descriptors)

        C = self.test_materials.query_one(criteria={"task_id": "mp-66"})
        NaCl = self.test_materials.query_one(criteria={"task_id": "mp-22862"})
        Fe = self.test_materials.query_one(criteria={"task_id": "mp-13"})

        # Diamond.
        d = sd_builder.get_site_descriptors_from_struct(
            Structure.from_dict(C["structure"]))
        for di in d.values():
            self.assertEqual(len(di), 2)
        self.assertEqual(d['cn_VoronoiNN'][0]['CN_VoronoiNN'], 20)
        self.assertAlmostEqual(d['cn_wt_VoronoiNN'][0]['CN_VoronoiNN'],
                               4.5381162)
        self.assertEqual(d['cn_JMolNN'][0]['CN_JMolNN'], 4)
        self.assertAlmostEqual(d['cn_wt_JMolNN'][0]['CN_JMolNN'], 4.9617398)
        self.assertEqual(d['cn_MinimumDistanceNN'][0]['CN_MinimumDistanceNN'],
                         4)
        self.assertAlmostEqual(
            d['cn_wt_MinimumDistanceNN'][0]['CN_MinimumDistanceNN'], 4)
        self.assertEqual(d['cn_MinimumOKeeffeNN'][0]['CN_MinimumOKeeffeNN'], 4)
        self.assertAlmostEqual(
            d['cn_wt_MinimumOKeeffeNN'][0]['CN_MinimumOKeeffeNN'], 4)
        self.assertEqual(d['cn_MinimumVIRENN'][0]['CN_MinimumVIRENN'], 4)
        self.assertAlmostEqual(d['cn_wt_MinimumVIRENN'][0]['CN_MinimumVIRENN'],
                               4)
        self.assertEqual(
            d['cn_BrunnerNN_reciprocal'][0]['CN_BrunnerNN_reciprocal'], 4)
        self.assertAlmostEqual(
            d['cn_wt_BrunnerNN_reciprocal'][0]['CN_BrunnerNN_reciprocal'], 4)
        self.assertAlmostEqual(d['opsf'][0]['tetrahedral CN_4'], 0.9995)
        #self.assertAlmostEqual(d['csf'][0]['tetrahedral CN_4'], 0.9886777)
        ds = sd_builder.get_statistics(d)
        self.assertTrue('opsf' in list(ds.keys()))
        self.assertTrue('csf' in list(ds.keys()))
        for k, dsk in ds.items():
            for di in dsk:
                self.assertEqual(len(list(di.keys())), 5)

        def get_index(li, optype):
            for i, di in enumerate(li):
                if di['name'] == optype:
                    return i
            raise RuntimeError('did not find optype {}'.format(optype))

        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'tetrahedral CN_4')]['max'],
            0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'tetrahedral CN_4')]['min'],
            0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'tetrahedral CN_4')]['mean'],
            0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'tetrahedral CN_4')]['std'], 0)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'octahedral CN_6')]['mean'],
            0.0005)

        # NaCl.
        d = sd_builder.get_site_descriptors_from_struct(
            Structure.from_dict(NaCl["structure"]))
        self.assertAlmostEqual(d['opsf'][0]['octahedral CN_6'], 0.9995)
        #self.assertAlmostEqual(d['csf'][0]['octahedral CN_6'], 1)
        ds = sd_builder.get_statistics(d)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'octahedral CN_6')]['max'],
            0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'octahedral CN_6')]['min'],
            0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'octahedral CN_6')]['mean'],
            0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'], 'octahedral CN_6')]['std'], 0)

        # Iron.
        d = sd_builder.get_site_descriptors_from_struct(
            Structure.from_dict(Fe["structure"]))
        self.assertAlmostEqual(d['opsf'][0]['body-centered cubic CN_8'],
                               0.9995)
        #self.assertAlmostEqual(d['csf'][0]['body-centered cubic CN_8'], 0.755096)
        ds = sd_builder.get_statistics(d)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'],
                                 'body-centered cubic CN_8')]['max'], 0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'],
                                 'body-centered cubic CN_8')]['min'], 0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'],
                                 'body-centered cubic CN_8')]['mean'], 0.9995)
        self.assertAlmostEqual(
            ds['opsf'][get_index(ds['opsf'],
                                 'body-centered cubic CN_8')]['std'], 0)
示例#6
0
class BuilderTest(unittest.TestCase):
    def setUp(self):
        self.materials = MemoryStore()
        self.materials.connect()
        materials = loadfn(os.path.join(TEST_DIR, "test_materials.json"))
        materials = jsanitize(materials, strict=True, allow_bson=True)
        self.materials.update(materials)
        self.propstore = MemoryStore()
        self.propstore.connect()

    def test_serial_runner(self):
        builder = PropnetBuilder(self.materials, self.propstore)
        runner = Runner([builder])
        runner.run()

    def test_multiproc_runner(self):
        builder = PropnetBuilder(self.materials, self.propstore)
        runner = Runner([builder])
        runner.run()

    def test_process_item(self):
        item = self.materials.query_one(criteria={"pretty_formula": "Cs"})
        builder = PropnetBuilder(self.materials, self.propstore)
        processed = builder.process_item(item)
        self.assertIsNotNone(processed)
        # Ensure vickers hardness gets populated
        self.assertIn("vickers_hardness", processed)
        if 'created_at' in item.keys():
            date_value = item['created_at']
        else:
            date_value = ""

        # Check that provenance values propagate correctly
        current_quantity = processed['vickers_hardness']['quantities'][0]
        at_deepest_level = False
        while not at_deepest_level:
            current_provenance = current_quantity['provenance']
            if current_provenance['inputs'] is not None:
                self.assertEqual(current_provenance['source']['source'],
                                 "propnet")
                self.assertEqual(current_provenance['source']['source_key'],
                                 current_quantity['internal_id'])
                self.assertNotIn(current_provenance['source']['date_created'],
                                 ("", None))
                current_quantity = current_provenance['inputs'][0]
            else:
                self.assertEqual(current_provenance['source']['source'],
                                 "Materials Project")
                self.assertEqual(current_provenance['source']['source_key'],
                                 item['task_id'])
                self.assertEqual(current_provenance['source']['date_created'],
                                 date_value)
                at_deepest_level = True



    # @unittest.skipIf(not os.path.isfile("runner.json"), "No runner file")
    # def test_runner_pipeline(self):
    #     from monty.serialization import loadfn
    #     runner = loadfn("runner.json")
    #     runner.builders[0].connect()
    #     items = list(runner.builders[0].get_items())
    #     processed = runner.builders[0].process_item(items[0])
    #     runner.run()

    # Just here for reference, in case anyone wants to create a new set
    # of test materials -jhm
    @unittest.skipIf(True, "Skipping test materials creation")
    def create_test_docs(self):
        formulas = ["BaNiO3", "Si", "Fe2O3", "Cs"]
        from maggma.advanced_stores import MongograntStore
        from monty.serialization import dumpfn
        mgstore = MongograntStore("ro:matgen2.lbl.gov/mp_prod", "materials")
        builder = PropnetBuilder(
            mgstore, self.propstore, criteria={"pretty_formula": {"$in": formulas},
                                               "e_above_hull": 0})
        builder.connect()
        dumpfn(list(builder.get_items()), "test_materials.json")