Source code for schrodinger.application.livedesign.summary
from schrodinger import structure
from schrodinger.models import mappers
from schrodinger.ui.qt import basewidgets
from schrodinger.ui.qt.mapperwidgets import plptable
from schrodinger.utils.scollections import IdSet
from . import export_models
from . import summary_ui
TEXT_3D_YES = 'Yes'
TEXT_3D_NO = 'No (properties only)'
PUBLISH_DATA_YES = 'Yes'
PUBLISH_DATA_NO = 'No'
[docs]class SummaryTableSpec(plptable.TableSpec):
"""
Table spec for the "LiveReport Columns" table.
"""
@plptable.PLPColumn(title='No.')
def number(self, all_prop_specs, prop_spec):
return all_prop_specs.index(prop_spec) + 1
@plptable.ParamColumn(title='Column Title')
def title(self, prop_spec):
return f'{prop_spec.ld_model} ({prop_spec.ld_endpoint})'
[docs]class LiveDesignExportSummaryPanel(mappers.MapperMixin, basewidgets.BaseWidget):
"""
Display to the user for final user approval before beginning the LiveDesign
export.
"""
model_class = export_models.SummaryModel
ui_module = summary_ui
SHOW_AS_WINDOW = True
[docs] def initSetOptions(self):
super().initSetOptions()
self.std_btn_specs = {
self.StdBtn.Ok: (None, 'Export to LiveDesign'),
self.StdBtn.Cancel: None
}
[docs] def initSetUp(self):
super().initSetUp()
table = self.ui.export_data_table
table.setSpec(SummaryTableSpec())
title_col_idx = 1
hheader = table.view.horizontalHeader()
hheader.setSectionResizeMode(title_col_idx, hheader.Stretch)
[docs] def defineMappings(self):
M = self.model_class
ui = self.ui
upload_3d_target = mappers.TargetSpec(setter=self._setUpload3DText)
publish_data_target = mappers.TargetSpec(
ui.publish_data_lbl,
setter=self._setPublishDataLabel,
datatype=bool)
match_data_target = mappers.TargetSpec(
ui.match_data_lbl,
setter=self._setMatchDataLabel,
datatype=export_models.MatchCompoundsBy)
return super().defineMappings() + [
(ui.project_data_lbl, M.ld_destination.proj_name),
(ui.lr_data_lbl, M.ld_destination.lr_name),
(upload_3d_target, M.three_d_export_items),
(ui.num_sts_data_lbl, M.input_summary),
(match_data_target, M.match_compounds_by),
(ui.export_data_table, M.export_specs),
(publish_data_target, M.publish_data),
] # yapf: disable
[docs] def getSignalsAndSlots(self, model):
return super().getSignalsAndSlots(model) + [
(model.three_d_export_itemsChanged, self._updateSpecTable),
(model.property_export_specsChanged, self._updateSpecTable),
(model.ffc_export_specsChanged, self._updateSpecTable)
] # yapf: disable
def _setUpload3DText(self, three_d_export_items):
"""
Set text in the "Upload 3D data" label based on the model state.
"""
text = TEXT_3D_YES if three_d_export_items else TEXT_3D_NO
self.ui.up_3d_data_lbl.setText(text)
def _getNumStructures(self):
"""
Calculate the number of structures to be exported.
:return: the number of structures to be exported
:rtype: int
"""
sts = set()
key_sts = set()
for item in self.model.three_d_export_items:
if item.ligand:
sts.add(item.ligand)
if item.receptor:
sts.add(item.receptor)
if isinstance(item.key, structure.Structure):
key_sts.add(item.key)
# Do not add 2D structures that key alternate 3D structures; this would
# mean double-counting nonstandard structures, as they both represent a
# single conceptual structure
for st in self.model.structures_for_2d_export:
if st not in key_sts:
sts.add(st)
return len(sts)
def _updateSpecTable(self):
"""
Gather all types of export specifications to keep the spec table up to
date.
Meant to be called when any spec data (property, 3D, or FFC) changes.
"""
model = self.model
specs_3d = IdSet()
# Find unique 3D specs. Note that we cannot use normal `set`s for this,
# as concrete parameters are not hashable
for item in model.three_d_export_items:
specs_3d.update(IdSet(item.three_d_specs))
model.export_specs = (list(specs_3d) + model.property_export_specs +
model.ffc_export_specs)
def _setPublishDataLabel(self, publish_data: bool):
is_published_text = PUBLISH_DATA_YES if publish_data else PUBLISH_DATA_NO
self.ui.publish_data_lbl.setText(is_published_text)
def _setMatchDataLabel(self,
match_compound_enum: export_models.MatchCompoundsBy):
if match_compound_enum is export_models.MatchCompoundsBy.structure:
text = 'Structure'
else:
text = str(match_compound_enum)
self.ui.match_data_lbl.setText(text)