import warnings
from schrodinger.infra import mm
from schrodinger.Qt import QtWidgets
from .. import ui
from ..utils import JaguarSettingWarning
from .base_tab import BaseTab
# Names for the "File" list
FILE_NAMES = [
"Gaussian input file (.gau)",
"GAMESS input file (.gamess)",
"Spartan archive file (.arc)",
#"Gaussian-92 basis set (.gbs)", # NOT USED
"XYZ file (.xyz)",
"Molden orbitals file (.molf)",
]
# Names for the "Format" option menu
FORMAT_NAMES = [
("large", "Large values (f5.2, labels, list)"),
("f10", "All values (f10.5, labels, table)"),
("f19", "All values (f19.15, list)"),
("f8", "All values (f8.5, list)"),
("e15", "All values (e15.6, table)"),
]
FORMAT_VALUE_TO_INDEX = {v: i for i, (v, n) in enumerate(FORMAT_NAMES)}
FORMAT_INDEX_TO_VALUE = {i: v for i, (v, n) in enumerate(FORMAT_NAMES)}
IP_OCCUPIED_VALUE_TO_FORMAT = {
mm.MMJAG_IP_ORBITALS_OCCUPIED_LARGE: "large",
mm.MMJAG_IP_ORBITALS_OCCUPIED_F10_5: "f10",
mm.MMJAG_IP_ORBITALS_OCCUPIED_F19_15: "f19",
mm.MMJAG_IP_ORBITALS_OCCUPIED_F8_5: "f8",
mm.MMJAG_IP_ORBITALS_OCCUPIED_E15_6: "e15",
}
IP_ALL_VALUE_TO_FORMAT = {
mm.MMJAG_IP_ORBITALS_ALL_LARGE: "large",
mm.MMJAG_IP_ORBITALS_ALL_F10_5: "f10",
mm.MMJAG_IP_ORBITALS_ALL_F19_15: "f19",
mm.MMJAG_IP_ORBITALS_ALL_F8_5: "f8",
mm.MMJAG_IP_ORBITALS_ALL_E15_6: "e15",
}
FORMAT_TO_OCCUPIED_VALUE = {
v: k for k, v in IP_OCCUPIED_VALUE_TO_FORMAT.items()
}
FORMAT_TO_ALL_VALUE = {v: k for k, v in IP_ALL_VALUE_TO_FORMAT.items()}
# Names for the "Orbitals" option menu
ORBITAL_NAMES = [
("none", "None"),
("occupied", "Occupied"),
("all", "All"),
]
ORBITAL_VALUE_TO_INDEX = {v: i for i, (v, n) in enumerate(ORBITAL_NAMES)}
ORBITAL_INDEX_TO_VALUE = {i: v for i, (v, n) in enumerate(ORBITAL_NAMES)}
# Names for the "Calculation stage" scrolling list
STAGE_DATA = [
(mm.MMJAG_IKEY_IP102, "At end of job"),
(mm.MMJAG_IKEY_IP105, "After HF initial guess"),
(mm.MMJAG_IKEY_IP104, "After SCF"),
(mm.MMJAG_IKEY_IP107, "After final localization"),
(mm.MMJAG_IKEY_IP101, "Each iteration (in CO space)"),
(mm.MMJAG_IKEY_IP103, "Each iteration (in AO space)"),
]
STAGE_INDEX_TO_VALUE = {i: v for i, (v, n) in enumerate(STAGE_DATA)}
STAGE_VALUE_TO_INDEX = {v: i for i, (v, n) in enumerate(STAGE_DATA)}
# Names for the "Standard" list
STANDARD_NAMES = [
"Echo input file and parameter list",
"Memory, disk and I/O information",
"Detailed timing information",
"Geometries in atomic units also",
"Multipole moments in atomic units also",
"Bond lengths and angles",
"Connectivity table",
"Geometry optimization details",
"Overlap matrix",
"One-electron Hamiltonian",
"Gaussian function list (basis set)",
"Gaussian function list (derivatives)",
]
[docs]class OutputTab(BaseTab):
"""
Output tab for the Jaguar panels.
"""
NAME = "Output"
HELP_TOPIC = "JAGUAR_TOPIC_OUTPUT_FOLDER"
UI_MODULES = (ui.output_tab_ui,)
[docs] def setup(self):
self.ui.input_format_list.addItems(FILE_NAMES)
self.ui.input_format_list.setSelectionMode(
QtWidgets.QAbstractItemView.ExtendedSelection)
self.ui.extra_detail_list.addItems(STANDARD_NAMES)
self.ui.extra_detail_list.setSelectionMode(
QtWidgets.QAbstractItemView.ExtendedSelection)
self.ui.calculation_stage_list.addItems([i[1] for i in STAGE_DATA])
self.ui.orbitals_combo.addItems([n for v, n in ORBITAL_NAMES])
self.ui.orbitals_combo.currentIndexChanged.connect(self.orbitalsChanged)
self.ui.format_combo.addItems([n for v, n in FORMAT_NAMES])
[docs] def orbitalsChanged(self, index):
"""
Called when a new item is selected in the "Orbitals" pull-down-menu.
"""
enable = (index > 0) # Not "None"
self.ui.format_combo.setEnabled(enable)
[docs] def loadSettings(self, keywords):
"""
Restore the tab from the input file JaguarInput object.
"""
def update_item_from_key(item, key, off_value, default_value=None):
"""
If the specified keyword is set to the "off_value", selects the
given item, otherwise de-selects it. If the keyword is set to
neither the "off_value" nor the "default_value", then a warning is
logged.
"""
value = keywords[key]
if value == off_value:
item.setSelected(False)
else:
item.setSelected(True)
if default_value is not None and value != default_value:
msg = 'Non-default "on" value specified for keyword: %s.' % key
msg += ' will use value %i instead of %i' % (default_value,
value)
warnings.warn(JaguarSettingWarning(msg))
# This keyword has mulitple "on" values, only 1 is supported by the GUI.
gaussian98 = self.ui.input_format_list.item(0)
update_item_from_key(gaussian98, mm.MMJAG_IKEY_IP160,
mm.MMJAG_IP160_OFF, mm.MMJAG_IP160_BOTH)
gamess = self.ui.input_format_list.item(1)
update_item_from_key(gamess, mm.MMJAG_IKEY_IP168, mm.MMJAG_IP168_OFF)
# This keyword has mulitple "on" values, only 1 is supported by the GUI.
spartan = self.ui.input_format_list.item(2)
update_item_from_key(spartan, mm.MMJAG_IKEY_IP165, mm.MMJAG_IP165_OFF,
mm.MMJAG_IP165_ON)
xyz = self.ui.input_format_list.item(3)
update_item_from_key(xyz, mm.MMJAG_IKEY_IP175, mm.MMJAG_IP175_OFF)
molden = self.ui.input_format_list.item(4)
update_item_from_key(molden, mm.MMJAG_IKEY_IP90, mm.MMJAG_IP90_OFF)
echoinput = self.ui.extra_detail_list.item(0)
update_item_from_key(echoinput, mm.MMJAG_IKEY_IP24, mm.MMJAG_IP24_OFF)
memorydisk = self.ui.extra_detail_list.item(1)
update_item_from_key(memorydisk, mm.MMJAG_IKEY_IP5, mm.MMJAG_IP5_OFF)
# This keyword has mulitple "on" values, only 1 is supported by the GUI.
timing = self.ui.extra_detail_list.item(2)
update_item_from_key(timing, mm.MMJAG_IKEY_IP6, mm.MMJAG_IP6_OFF,
mm.MMJAG_IP6_ON)
geomatomicunits = self.ui.extra_detail_list.item(3)
update_item_from_key(geomatomicunits, mm.MMJAG_IKEY_IP26,
mm.MMJAG_IP26_OFF)
multipoleatomicunits = self.ui.extra_detail_list.item(4)
update_item_from_key(multipoleatomicunits, mm.MMJAG_IKEY_IP25,
mm.MMJAG_IP25_OFF)
# This keyword has mulitple "on" values, only 1 is supported by the GUI.
bondlengths = self.ui.extra_detail_list.item(5)
update_item_from_key(bondlengths, mm.MMJAG_IKEY_IP11, mm.MMJAG_IP11_OFF,
mm.MMJAG_IP11_ON)
connectivity = self.ui.extra_detail_list.item(6)
update_item_from_key(connectivity, mm.MMJAG_IKEY_IP12,
mm.MMJAG_IP12_OFF)
optimizationdetails = self.ui.extra_detail_list.item(7)
update_item_from_key(optimizationdetails, mm.MMJAG_IKEY_IP192,
mm.MMJAG_IP192_OFF)
overlapmatrix = self.ui.extra_detail_list.item(8)
update_item_from_key(overlapmatrix, mm.MMJAG_IKEY_IP18,
mm.MMJAG_IP18_OFF)
hamiltonian = self.ui.extra_detail_list.item(9)
update_item_from_key(hamiltonian, mm.MMJAG_IKEY_IP19, mm.MMJAG_IP19_OFF)
basisset = self.ui.extra_detail_list.item(10)
update_item_from_key(basisset, mm.MMJAG_IKEY_IP1, mm.MMJAG_IP1_OFF)
derivatives = self.ui.extra_detail_list.item(11)
update_item_from_key(derivatives, mm.MMJAG_IKEY_IP8, mm.MMJAG_IP8_OFF)
ip_key = None
for key, name in STAGE_DATA:
if keywords[key] != keywords.getDefault(key):
if ip_key:
msg = 'More than one "Calculation stage" keyword is set'
warnings.warn(JaguarSettingWarning(msg))
return
ip_key = key
if not ip_key:
# Default
ip_key = mm.MMJAG_IKEY_IP102
self.ui.calculation_stage_list.setCurrentRow(
STAGE_VALUE_TO_INDEX[ip_key])
ip_value = keywords[ip_key]
if ip_value >= mm.MMJAG_IP_ORBITALS_OCCUPIED_LARGE \
and ip_value <= mm.MMJAG_IP_ORBITALS_OCCUPIED_E15_6:
what = "occupied"
how = IP_OCCUPIED_VALUE_TO_FORMAT[ip_value]
elif ip_value >= mm.MMJAG_IP_ORBITALS_ALL_LARGE \
and ip_value <= mm.MMJAG_IP_ORBITALS_ALL_E15_6:
what = "all"
how = IP_ALL_VALUE_TO_FORMAT[ip_value]
elif ip_value == mm.MMJAG_IP_ORBITALS_NONE:
what = "none"
how = "large"
else:
msg = "Unexpected value for the '%s' keyword: '%s'" % (ip_key,
ip_value)
warnings.warn(JaguarSettingWarning(msg))
return
self.ui.format_combo.setCurrentIndex(FORMAT_VALUE_TO_INDEX[how])
self.ui.orbitals_combo.setCurrentIndex(ORBITAL_VALUE_TO_INDEX[what])
[docs] def getValueFromItem(self, item, off_value, on_value):
"""
If the selected item is selected then return the "on_value", otherwise
return the "off_value".
"""
if item.isSelected():
return on_value
else:
return off_value
[docs] def getMmJagKeywords(self):
"""
Return a dictionary of mmjag keywords for the current state of the tab.
"""
keywords = {}
# Handle "Write input files in the selected formats:" list:
# gaussian98
item = self.ui.input_format_list.item(0)
# Several ip160 "on" values are allowed. Choose MMJAG_IP160_BOTH by default.
keywords[mm.MMJAG_IKEY_IP160] = self.getValueFromItem(
item, mm.MMJAG_IP160_OFF, mm.MMJAG_IP160_BOTH)
# gamess
item = self.ui.input_format_list.item(1)
keywords[mm.MMJAG_IKEY_IP168] = self.getValueFromItem(
item, mm.MMJAG_IP168_OFF, mm.MMJAG_IP168_ON)
# spartan
item = self.ui.input_format_list.item(2)
# The ip165 "on" value can be either MMJAG_IP165_ON
# or MMJAG_IP165_SCRATCH. Choose MMJAG_IP165_ON by default.
keywords[mm.MMJAG_IKEY_IP165] = self.getValueFromItem(
item, mm.MMJAG_IP165_OFF, mm.MMJAG_IP165_ON)
# xyz
item = self.ui.input_format_list.item(3)
keywords[mm.MMJAG_IKEY_IP175] = self.getValueFromItem(
item, mm.MMJAG_IP175_OFF, mm.MMJAG_IP175_ON)
# molden
item = self.ui.input_format_list.item(4)
keywords[mm.MMJAG_IKEY_IP90] = self.getValueFromItem(
item, mm.MMJAG_IP90_OFF, mm.MMJAG_IP90_ON)
# Standard names ("Extra detail to be written to output file:" list)
# echoinput
item = self.ui.extra_detail_list.item(0)
keywords[mm.MMJAG_IKEY_IP24] = self.getValueFromItem(
item, mm.MMJAG_IP24_OFF, mm.MMJAG_IP24_ON)
# memorydisk
item = self.ui.extra_detail_list.item(1)
keywords[mm.MMJAG_IKEY_IP5] = self.getValueFromItem(
item, mm.MMJAG_IP5_OFF, mm.MMJAG_IP5_ON)
# timing
item = self.ui.extra_detail_list.item(2)
# Several ip6 "on" values are allowed. Choose MMJAG_IP6_ON by default.
keywords[mm.MMJAG_IKEY_IP6] = self.getValueFromItem(
item, mm.MMJAG_IP6_OFF, mm.MMJAG_IP6_ON)
# geomatomicunits
item = self.ui.extra_detail_list.item(3)
keywords[mm.MMJAG_IKEY_IP26] = self.getValueFromItem(
item, mm.MMJAG_IP26_OFF, mm.MMJAG_IP26_ON)
# multipoleatomicunits
item = self.ui.extra_detail_list.item(4)
keywords[mm.MMJAG_IKEY_IP25] = self.getValueFromItem(
item, mm.MMJAG_IP25_OFF, mm.MMJAG_IP25_ON)
# bondlengths
item = self.ui.extra_detail_list.item(5)
# Several ip11 "on" values are allowed. Choose MMJAG_IP11_ON by default.
keywords[mm.MMJAG_IKEY_IP11] = self.getValueFromItem(
item, mm.MMJAG_IP11_OFF, mm.MMJAG_IP11_ON)
# connectivity
item = self.ui.extra_detail_list.item(6)
keywords[mm.MMJAG_IKEY_IP12] = self.getValueFromItem(
item, mm.MMJAG_IP12_OFF, mm.MMJAG_IP12_ON)
# optimizationdetails
item = self.ui.extra_detail_list.item(7)
# The ip192 value can be MMJAG_IP192_ON or MMJAG_IP192_DETAIL. Choose MMJAG_IP192_ON by default.
keywords[mm.MMJAG_IKEY_IP192] = self.getValueFromItem(
item, mm.MMJAG_IP192_OFF, mm.MMJAG_IP192_ON)
# overlapmatrix
item = self.ui.extra_detail_list.item(8)
keywords[mm.MMJAG_IKEY_IP18] = self.getValueFromItem(
item, mm.MMJAG_IP18_OFF, mm.MMJAG_IP18_ON)
# hamiltonian
item = self.ui.extra_detail_list.item(9)
keywords[mm.MMJAG_IKEY_IP19] = self.getValueFromItem(
item, mm.MMJAG_IP19_OFF, mm.MMJAG_IP19_ON)
# basisset
item = self.ui.extra_detail_list.item(10)
keywords[mm.MMJAG_IKEY_IP1] = self.getValueFromItem(
item, mm.MMJAG_IP1_OFF, mm.MMJAG_IP1_ON)
# derivatives
item = self.ui.extra_detail_list.item(11)
keywords[mm.MMJAG_IKEY_IP8] = self.getValueFromItem(
item, mm.MMJAG_IP8_OFF, mm.MMJAG_IP8_ON)
# Handle the "Calculation stage" list, orbitals, and format:
ip_key = STAGE_INDEX_TO_VALUE[
self.ui.calculation_stage_list.currentRow()]
what = ORBITAL_INDEX_TO_VALUE[self.ui.orbitals_combo.currentIndex()]
how = FORMAT_INDEX_TO_VALUE[self.ui.format_combo.currentIndex()]
if what == "occupied":
ip_value = FORMAT_TO_OCCUPIED_VALUE[how]
elif what == "all":
ip_value = FORMAT_TO_ALL_VALUE[how]
else:
ip_value = mm.MMJAG_IP_ORBITALS_NONE # OFF by default
keywords[ip_key] = ip_value
return keywords