Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"berny": which_import("berny", return_bool=True),
"mdi": which_import("mdi", return_bool=True),
"molpro": is_program_new_enough("molpro", "2018.1"),
"mopac": is_program_new_enough("mopac", "2016"),
"mp2d": which("mp2d", return_bool=True),
"nwchem": which("nwchem", return_bool=True),
"psi4": is_program_new_enough("psi4", "1.2"),
"psi4_runqcsk": is_program_new_enough("psi4", "1.4a2.dev160"),
"qcdb": which_import("qcdb", return_bool=True),
"qchem": is_program_new_enough("qchem", "5.2"),
"rdkit": which_import("rdkit", return_bool=True),
"terachem": which("terachem", return_bool=True),
"torchani": is_program_new_enough("torchani", "0.9"),
"turbomole": which("define", return_bool=True),
}
_programs["openmm"] = _programs["rdkit"] and which_import(".openmm", package="simtk", return_bool=True)
def has_program(name):
if name in _programs:
return _programs[name]
else:
raise KeyError(f"Program {name} not registered with QCEngine testing.")
_using_cache = {}
def using(program):
if program not in _using_cache:
import_message = f"Not detecting module {program}. Install package if necessary to enable tests."
qcng.register_program(engine)
yield engine
qcng.unregister_program(engine.name)
# Figure out what is imported
_programs = {
"cfour": which("xcfour", return_bool=True),
"dftd3": which("dftd3", return_bool=True),
"dftd3_321": is_program_new_enough("dftd3", "3.2.1"),
"entos": is_program_new_enough("entos", "0.7.1"),
"gamess": which("rungms", return_bool=True),
"gcp": which("gcp", return_bool=True),
"geometric": which_import("geometric", return_bool=True),
"berny": which_import("berny", return_bool=True),
"mdi": which_import("mdi", return_bool=True),
"molpro": is_program_new_enough("molpro", "2018.1"),
"mopac": is_program_new_enough("mopac", "2016"),
"mp2d": which("mp2d", return_bool=True),
"nwchem": which("nwchem", return_bool=True),
"psi4": is_program_new_enough("psi4", "1.2"),
"psi4_runqcsk": is_program_new_enough("psi4", "1.4a2.dev160"),
"qcdb": which_import("qcdb", return_bool=True),
"qchem": is_program_new_enough("qchem", "5.2"),
"rdkit": which_import("rdkit", return_bool=True),
"terachem": which("terachem", return_bool=True),
"torchani": is_program_new_enough("torchani", "0.9"),
"turbomole": which("define", return_bool=True),
}
_programs["openmm"] = _programs["rdkit"] and which_import(".openmm", package="simtk", return_bool=True)
If raise_error is True and psi4 is missing, the error message is raised.
"""
psithon = which("psi4", return_bool=True)
psiapi = which_import("psi4", return_bool=True)
if psithon and not psiapi:
with popen([which("psi4"), "--module"]) as exc:
exc["proc"].wait(timeout=30)
if "module does not exist" in exc["stderr"]:
pass # --module argument only in Psi4 DDD branch
else:
sys.path.append(exc["stdout"].split()[-1])
if psiapi and not psithon:
psiimport = str(Path(which_import("psi4")).parent.parent)
env = os.environ.copy()
env["PYTHONPATH"] = psiimport
with popen(["python", "-c", "import psi4; print(psi4.executable[:-5])"], popen_kwargs={"env": env}) as exc:
exc["proc"].wait(timeout=30)
os.environ["PATH"] += os.pathsep + exc["stdout"].split()[-1]
if psithon or psiapi:
return True
return which(
"psi4",
return_bool=True,
raise_error=raise_error,
raise_msg="Please install via `conda install psi4 -c psi4`. Check it's in your PATH with `which psi4`.",
)
Parameters
----------
raise_error: bool
Passed on to control negative return between False and ModuleNotFoundError raised.
Returns
-------
bool
If psi4 (psithon or psiapi) is found, returns True.
If raise_error is False and psi4 is missing, returns False.
If raise_error is True and psi4 is missing, the error message is raised.
"""
psithon = which("psi4", return_bool=True)
psiapi = which_import("psi4", return_bool=True)
if psithon and not psiapi:
with popen([which("psi4"), "--module"]) as exc:
exc["proc"].wait(timeout=30)
if "module does not exist" in exc["stderr"]:
pass # --module argument only in Psi4 DDD branch
else:
sys.path.append(exc["stdout"].split()[-1])
if psiapi and not psithon:
psiimport = str(Path(which_import("psi4")).parent.parent)
env = os.environ.copy()
env["PYTHONPATH"] = psiimport
with popen(["python", "-c", "import psi4; print(psi4.executable[:-5])"], popen_kwargs={"env": env}) as exc:
exc["proc"].wait(timeout=30)
os.environ["PATH"] += os.pathsep + exc["stdout"].split()[-1]
_addons_ = {
"ambit": _CMake_to_Py_boolean("@ENABLE_ambit@"),
"chemps2": _CMake_to_Py_boolean("@ENABLE_CheMPS2@"),
"dkh": _CMake_to_Py_boolean("@ENABLE_dkh@"),
"libefp": which_import("pylibefp", return_bool=True),
"erd": _CMake_to_Py_boolean("@ENABLE_erd@"),
"gdma": _CMake_to_Py_boolean("@ENABLE_gdma@"),
"pcmsolver": _CMake_to_Py_boolean("@ENABLE_PCMSolver@"),
"cppe": _CMake_to_Py_boolean("@ENABLE_cppe@"),
"simint": _CMake_to_Py_boolean("@ENABLE_simint@"),
"dftd3": psi4_which("dftd3", return_bool=True),
"cfour": psi4_which("xcfour", return_bool=True),
"mrcc": psi4_which("dmrcc", return_bool=True),
"gcp": psi4_which("gcp", return_bool=True),
"v2rdm_casscf": which_import("v2rdm_casscf", return_bool=True),
"gpu_dfcc": which_import("gpu_dfcc", return_bool=True),
"forte": which_import("forte", return_bool=True),
"snsmp2": which_import("snsmp2", return_bool=True),
"resp": which_import("resp", return_bool=True),
}
def addons(request=None):
"""Returns boolean of whether Add-On *request* is available to Psi4,
either compiled in or searchable in $PSIPATH:$PATH, as relevant. If
*request* not passed, returns list of available Add-Ons.
"""
if request is None:
return sorted([k for k, v in _addons_.items() if v])
return _addons_[request.lower()]
def show(self, ngl_kwargs: Optional[Dict[str, Any]] = None) -> "nglview.NGLWidget": # type: ignore
"""Creates a 3D representation of a moleucle that can be manipulated in Jupyter Notebooks and exported as
images (`.png`).
Parameters
----------
ngl_kwargs : Optional[Dict[str, Any]], optional
Addition nglview NGLWidget kwargs
Returns
-------
nglview.NGLWidget
A nglview view of the molecule
"""
if not which_import("nglview", return_bool=True):
raise ModuleNotFoundError(
f"Python module nglwview not found. Solve by installing it: `conda install -c conda-forge nglview`"
) # pragma: no cover
import nglview as nv # type: ignore
if ngl_kwargs is None:
ngl_kwargs = {}
structure = nv.TextStructure(self.to_string("nglview-sdf"), ext="sdf")
widget = nv.NGLWidget(structure, **ngl_kwargs)
return widget
def found(self, raise_error: bool = False) -> bool:
return which_import(
"geometric",
return_bool=True,
raise_error=raise_error,
raise_msg="Please install via `conda install geometric -c conda-forge`.",
)
_addons_ = {
"ambit": _CMake_to_Py_boolean("@ENABLE_ambit@"),
"chemps2": _CMake_to_Py_boolean("@ENABLE_CheMPS2@"),
"dkh": _CMake_to_Py_boolean("@ENABLE_dkh@"),
"libefp": which_import("pylibefp", return_bool=True),
"erd": _CMake_to_Py_boolean("@ENABLE_erd@"),
"gdma": _CMake_to_Py_boolean("@ENABLE_gdma@"),
"pcmsolver": _CMake_to_Py_boolean("@ENABLE_PCMSolver@"),
"cppe": _CMake_to_Py_boolean("@ENABLE_cppe@"),
"simint": _CMake_to_Py_boolean("@ENABLE_simint@"),
"dftd3": psi4_which("dftd3", return_bool=True),
"cfour": psi4_which("xcfour", return_bool=True),
"mrcc": psi4_which("dmrcc", return_bool=True),
"gcp": psi4_which("gcp", return_bool=True),
"v2rdm_casscf": which_import("v2rdm_casscf", return_bool=True),
"gpu_dfcc": which_import("gpu_dfcc", return_bool=True),
"forte": which_import("forte", return_bool=True),
"snsmp2": which_import("snsmp2", return_bool=True),
"resp": which_import("resp", return_bool=True),
}
def addons(request=None):
"""Returns boolean of whether Add-On *request* is available to Psi4,
either compiled in or searchable in $PSIPATH:$PATH, as relevant. If
*request* not passed, returns list of available Add-Ons.
"""
if request is None:
return sorted([k for k, v in _addons_.items() if v])
return _addons_[request.lower()]
def found(raise_error: bool = False) -> bool:
return which_import(
"torchani",
return_bool=True,
raise_error=raise_error,
raise_msg="Please install via `pip install torchani`.",
)