Japan is under a state of emergency for the third time, which forced me to do self-quarantine. After all, my five days of GW holidays were spent developing the pygamess library.
This is an example of storing GAMESS calculation results into RDKit's Chem object. I will calculate the two molecules, ethane, and ethanol, to export as an SDF file later.
>>> from pygamess import Gamess
>>> from pygamess.utils import rdkit_optimize
>>> from rdkit import Chem
>>> ethane = rdkit_optimize("CC")
>>> ethanol = rdkit_optimize("CCO")
>>> g = Gamess()
>>> g.run_type("optimize")
>>> ethane_result = g.run(ethane)
>>> optimized_ethane = ethane_result.mol
>>> ethanol_result = g.run(ethanol)
>>> optimized_ethanol = ethanol_result.mol
Orbital energies and dipole moments including HOMO and LUMO energies are stored in the object. Each atom is also assigned a mulliken charge/lowdin charge.
>>> optimized_ethane.GetProp("HOMO")
'-0.46029999999999999'
>>> optimized_ethane.GetProp("LUMO")
'0.65559999999999996'
>>> optimized_ethane.GetProp("dipole_moment")
'1.9999999999999999e-06'
>>> optimized_ethane.GetProp("orbital_energies")
'-11.0355 -11.0352 -0.981 -0.8121 -0.572 -0.572 -0.4717 -0.4603 -0.4603 0.6556 0.6556 0.687 0.737 0.7814 0.7893 0.7893'
>>> for a in optimized_ethane.GetAtoms():
... print("{}:\t{:.4f}".format(a.GetSymbol(), float(a.GetProp("mulliken_charge"))))
...
C: -0.1748
C: -0.1748
H: 0.0583
H: 0.0583
H: 0.0583
H: 0.0583
H: 0.0583
H: 0.0583
Finally, I'll export the object to SDF.
>>> optimized_mols = [optimized_ethane, optimized_ethanol]
>>> w = Chem.SDWriter('test.sdf')
>>> for m in optimized_mols:
... w.write(m)
...
>>> w.close()
Looking at the exported SDF, we can see these results are persisted.
$ cat test.sdf
RDKit 3D
8 7 0 0 0 0 0 0 0 0999 V2000
-0.7687 0.0082 -0.0152 C 0 0 0 0 0 0 0 0 0 0 0 0
0.7687 -0.0082 0.0152 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.1742 -0.1016 0.9863 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.1352 0.9432 -0.4285 H 0 0 0 0 0 0 0 0 0 0 0 0
-1.1499 -0.8048 -0.6260 H 0 0 0 0 0 0 0 0 0 0 0 0
1.1499 0.8048 0.6260 H 0 0 0 0 0 0 0 0 0 0 0 0
1.1742 0.1016 -0.9863 H 0 0 0 0 0 0 0 0 0 0 0 0
1.1352 -0.9432 0.4285 H 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
1 3 1 0
1 4 1 0
1 5 1 0
2 6 1 0
2 7 1 0
2 8 1 0
M END
> <total_energy> (1)
-78.306179626800002
> <HOMO> (1)
-0.46029999999999999
> <LUMO> (1)
0.65559999999999996
> <nHOMO> (1)
-0.46029999999999999
> <nLUMO> (1)
0.65559999999999996
> <dipole_moment> (1)
1.9999999999999999e-06
> <dx> (1)
-0
> <dy> (1)
-1.9999999999999999e-06
> <dz> (1)
0
> <orbital_energies> (1)
-11.0355 -11.0352 -0.981 -0.8121 -0.572 -0.572 -0.4717 -0.4603 -0.4603 0.6556 0.6556 0.687 0.737 0.7814 0.7893 0.7893
> <atom.dprop.mulliken_charge> (1)
-0.174764 -0.174764 0.058255000000000001 0.058255000000000001 0.058254 0.058255000000000001 0.058255000000000001 0.058255000000000001
TODO: Add GAMESS calculation conditions as attributes, like "HF/6-31G**".