Source code for schrodinger.application.jaguar.gui.tabs.output_tab

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