Repository: hackingmaterials/atomate (language: python)

Issue:
Q-Chem 6 + Misc Updates
## Summary

* A variety of additions and modifications for Q-Chem 6, including supporting new Q-Chem features and updating Pymatgen and Custodian functionality and default values. 
* Parsing raw gradient and Hessian files. Hessians are particularly important, because they are not printed in the output file, and saving them allows us to then print them out and use them as inputs to a subsequent optimization calculation.
* Some minor additions related to dipoles and HOMO/LUMO gap info.  



Discussion / hints:
@Zhuoying, what's up with all the failing VASP tests? I haven't changed any VASP code. Might be due to switching to a newer pymatgen version? Your help would be appreciated.
@naik-aakash Seems like lobster tests are failing here too
Some keys in the lobsterout class changed. We will fix it. Shouldn't take too long.
> @naik-aakash Seems like lobster tests are failing here too

@samblau , I will fix it tomorrow morning. Thanks for notifying. :-)

Fix patch:
diff --git a/requirements-ci.txt b/requirements-ci.txt
index d796864f5..b2c16266c 100644
--- a/requirements-ci.txt
+++ b/requirements-ci.txt
@@ -1,5 +1,8 @@
+pymatgen==2023.3.10
+custodian==2023.3.10
+boto3==1.17.97
 Flask==2.1.3
 coverage==5.5
 moto==3.1.18
 pytest-cov==2.12.1
-pytest==6.2.4
+pytest==6.2.4
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index d1d74a504..95cf37d50 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
-custodian==2022.5.26
+pymatgen==2023.3.10
+custodian==2023.3.10
 FireWorks==2.0.3
 maggma==0.48.1
 monty==2022.9.9
@@ -9,8 +10,7 @@ paramiko==2.11.0
 pydash==5.1.0
 pymatgen-analysis-diffusion==2022.7.21
 pymatgen-analysis-defects==2022.9.14
-pymatgen==2022.9.8
 pymongo==4.2.0
 ruamel.yaml==0.17.21
 scipy==1.9.1
-tqdm==4.64.1
+tqdm==4.64.1
\ No newline at end of file


Test patch:
diff --git a/atomate/vasp/firetasks/tests/test_lobster_tasks.py b/atomate/vasp/firetasks/tests/test_lobster_tasks.py
index 6fc00bb4f..bc6fec573 100644
--- a/atomate/vasp/firetasks/tests/test_lobster_tasks.py
+++ b/atomate/vasp/firetasks/tests/test_lobster_tasks.py
@@ -111,7 +111,7 @@ def test_jsonfile(self):
         with open("task_lobster.json") as f:
             load_dict = json.load(f)
         self.assertEqual(load_dict["formula_pretty"], "K2Sn2O3")
-        self.assertListEqual(load_dict["output"]["chargespilling"], [0.008, 0.008])
+        self.assertListEqual(load_dict["output"]["charge_spilling"], [0.008, 0.008])
 
     def test_mongodb(self):
         try:
@@ -128,7 +128,7 @@ def test_mongodb(self):
         coll = self.get_task_collection("lobster")
         load_dict = coll.find_one({"formula_pretty": "K2Sn2O3"})
         self.assertEqual(load_dict["formula_pretty"], "K2Sn2O3")
-        self.assertListEqual(load_dict["output"]["chargespilling"], [0.008, 0.008])
+        self.assertListEqual(load_dict["output"]["charge_spilling"], [0.008, 0.008])
         self.assertNotIn("lobster_icohplist", load_dict)
 
     def test_mongodb_more_files(self):
@@ -155,7 +155,7 @@ def test_mongodb_more_files(self):
         coll = self.get_task_collection("lobster")
         load_dict = coll.find_one({"formula_pretty": "K2Sn2O3"})
         self.assertEqual(load_dict["formula_pretty"], "K2Sn2O3")
-        self.assertListEqual(load_dict["output"]["chargespilling"], [0.008, 0.008])
+        self.assertListEqual(load_dict["output"]["charge_spilling"], [0.008, 0.008])
         db = self.get_task_database()
         gfs = gridfs.GridFS(db, "lobster_files")
         results = gfs.find({})
@@ -172,7 +172,7 @@ def test_jsonfile_si(self):
         with open("task_lobster.json") as f:
             load_dict = json.load(f)
         self.assertEqual(load_dict["formula_pretty"], "Si")
-        self.assertListEqual(load_dict["output"]["chargespilling"], [0.0147, 0.0147])
+        self.assertListEqual(load_dict["output"]["charge_spilling"], [0.0147, 0.0147])
 
 
 class TestRunLobster(AtomateTest):
diff --git a/atomate/vasp/workflows/tests/test_lobster_workflow.py b/atomate/vasp/workflows/tests/test_lobster_workflow.py
index 0fdd93fd5..049f31123 100644
--- a/atomate/vasp/workflows/tests/test_lobster_workflow.py
+++ b/atomate/vasp/workflows/tests/test_lobster_workflow.py
@@ -101,13 +101,13 @@ def _check_run(self, d, mode, database=True):
         self.assertEqual(d["state"], "successful")
 
         if mode in ["lobsternormal", "lobsternormal_delete_wavecars"]:
-            self.assertListEqual(d["output"]["chargespilling"], [0.0147, 0.0147])
+            self.assertListEqual(d["output"]["charge_spilling"], [0.0147, 0.0147])
             self.assertListEqual(d["output"]["elements"], ["Si"])
-            self.assertListEqual(d["output"]["basistype"], ["pbeVaspFit2015"])
+            self.assertListEqual(d["output"]["basis_type"], ["pbeVaspFit2015"])
             self.assertListEqual(
-                d["output"]["basisfunctions"], [["3s", "3p_y", "3p_z", "3p_x"]]
+                d["output"]["basis_functions"], [["3s", "3p_y", "3p_z", "3p_x"]]
             )
-            self.assertTrue(d["output"]["hasDOSCAR"])
+            self.assertTrue(d["output"]["has_doscar"])
             if database:
                 self.assertNotIn("cohpcar_id", d)
                 self.assertIn("icooplist_id", d)
@@ -252,13 +252,13 @@ def _check_run(self, d, mode):
         self.assertEqual(d["state"], "successful")
 
         if mode in ["lobsternormal"]:
-            self.assertListEqual(d["output"]["chargespilling"], [0.0027, 0.0027])
+            self.assertListEqual(d["output"]["charge_spilling"], [0.0027, 0.0027])
             self.assertListEqual(d["output"]["elements"], ["F", "Cd"])
             self.assertListEqual(
-                d["output"]["basistype"], ["pbeVaspFit2015", "pbeVaspFit2015"]
+                d["output"]["basis_type"], ["pbeVaspFit2015", "pbeVaspFit2015"]
             )
             self.assertListEqual(
-                d["output"]["basisfunctions"],
+                d["output"]["basis_functions"],
                 [
                     ["2s", "2p_y", "2p_z", "2p_x"],
                     [
@@ -274,7 +274,7 @@ def _check_run(self, d, mode):
                     ],
                 ],
             )
-            self.assertTrue(d["output"]["hasDOSCAR"])
+            self.assertTrue(d["output"]["has_doscar"])
 
     def _single_vasp_lobster(self, fake=True):
         # add the workflow