Skip to content

Commit

Permalink
Sasa gui enhancement: issue #28
Browse files Browse the repository at this point in the history
- added plot export
- added results export
- gui fixes -> resizing
  • Loading branch information
rodenki committed Mar 13, 2017
1 parent d0ca48d commit ee7cd95
Show file tree
Hide file tree
Showing 8 changed files with 423 additions and 281 deletions.
3 changes: 3 additions & 0 deletions PyContact/core/ContactAnalyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ def getTrajectoryData(self):
self.type_array, self.segids, self.backbone, self.sel1text,
self.sel2text]

def getFilePaths(self):
return self.psf, self.dcd

# find a string in s between the strings first and last
@staticmethod
def find_between(s, first, last):
Expand Down
9 changes: 5 additions & 4 deletions PyContact/gui/Dialogues.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from PyQt5.QtGui import QDoubleValidator

from ..core.LoadConfiguration import Configuration
from PyContact.core.ContactAnalyzer import Analyzer
from HelpButton import HelpButton


Expand All @@ -25,15 +26,15 @@ def __init__(self, parent=None):

helpButton = HelpButton()

grid.addWidget(buttonPsf,0,0)
grid.addWidget(buttonDcd,0,1)
grid.addWidget(buttonPsf, 0, 0)
grid.addWidget(buttonDcd, 0, 1)
buttons = QDialogButtonBox(
QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
Qt.Horizontal, self)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
grid.addWidget(buttons,1,0)
grid.addWidget(helpButton,2,0)
grid.addWidget(buttons, 1, 0)
grid.addWidget(helpButton, 2, 0)

def pick_psf(self):
psfname = QFileDialog.getOpenFileNames(self, "Open topology")
Expand Down
2 changes: 2 additions & 0 deletions PyContact/gui/ErrorMessages.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ class ErrorMessages():
RESID_REQUIRED = "Please analyze the trajectory with the resid box checked for both atom selections!"

NOCONTACTS = "No data loaded or no filtered contacts available."

FILE_NOT_FOUND = "Attempt to load trajectory failed. File does not exist."
4 changes: 4 additions & 0 deletions PyContact/gui/MainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ def showVMDControlPanel(self):

def showContactAreaView(self):
self.sasaView.show()
if self.analysis:
self.sasaView.setFilePaths(self.analysis.getFilePaths())

def switchedToVisMode(self):
if self.visModeButton.isChecked():
Expand Down Expand Up @@ -161,6 +163,7 @@ def importSession(self):
self.analysis.contactResults = contactResults
self.analysis.setTrajectoryData(*trajArgs)
self.analysis.finalAccumulatedContacts = self.contacts
self.sasaView.setFilePaths(*self.analysis.getFilePaths())
self.updateSelectionLabels(arguments[5], arguments[6])
self.updateSettings()
self.updateFilters()
Expand All @@ -186,6 +189,7 @@ def loadDefault(self):
self.analysis.contactResults = contactResults
self.analysis.setTrajectoryData(*trajArgs)
self.analysis.finalAccumulatedContacts = self.contacts
self.sasaView.setFilePaths(*self.analysis.getFilePaths())
self.updateSelectionLabels(arguments[5], arguments[6])
self.updateSettings()
self.updateFilters()
Expand Down
3 changes: 3 additions & 0 deletions PyContact/gui/Plotters.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,3 +196,6 @@ def plot(self, x, y):
self.axes.set_xlabel("x")
self.axes.set_ylabel("f(x)")
self.axes.xaxis.set_label_position('top')

def saveFigure(self, path, outputFormat):
self.fig.savefig(path + "." + outputFormat, format=outputFormat)
53 changes: 46 additions & 7 deletions PyContact/gui/SasaWidgets.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from __future__ import print_function
import sip
import time
import os


from PyQt5.QtWidgets import QWidget, QProgressBar, QApplication
from PyQt5.QtWidgets import QWidget, QProgressBar, QApplication, QFileDialog
import MDAnalysis
import numpy as np

Expand Down Expand Up @@ -55,6 +56,8 @@ def __init__(self, parent=None):
self.state = True
self.name = None
self.psf, self. dcd = "", ""
self.allSasas = []
self.totalFramesToProcess = 0

sip.delete(self.sasaProgressBar)
self.sasaProgressBar = PbWidget(total=100)
Expand All @@ -64,16 +67,48 @@ def __init__(self, parent=None):
self.sasaProgressBar.setObjectName("sasaProgressBar")
self.previewPlot = SimplePlotter(None, width=5, height=2, dpi=60)
self.graphGridLayout.addWidget(self.previewPlot)
self.gridLayout.addWidget(self.sasaProgressBar, 7, 1, 1, 1)
self.gridLayout.addWidget(self.sasaProgressBar, 8, 1, 1, 2)
self.calcSasaButton.clicked.connect(self.calculateSasa)
self.loadDataButton.clicked.connect(self.loadData)
self.savePlotButton.clicked.connect(self.savePlot)
self.exportDataButton.clicked.connect(self.exportData)
self.topoloader = TopoTrajLoaderDialog()

def setFilePaths(self, *argv):
self.psf = argv[0][0]
self.dcd = argv[0][1]

def loadData(self):
loadedData = self.topoloader.getConfig()
self.psf = loadedData[0][0]
self.dcd = loadedData[0][1]

def savePlot(self):
fileName = QFileDialog.getSaveFileName(self, 'Export Path')
if len(fileName[0]) > 0:
path, file_extension = os.path.splitext(fileName[0])
if file_extension == "":
file_extension = ".png"
file_extension = file_extension[1:]
try:
self.previewPlot.saveFigure(path, file_extension)
except ValueError:
box = ErrorBox("File format " + file_extension + " is not supported.\nPlease choose from eps, pdf, pgf,"
" png, ps, raw, rgba, svg, svgz. ")
box.exec_()

def exportData(self):
fileName = QFileDialog.getSaveFileName(self, 'Export Path')
if len(fileName[0]) > 0:
path, file_extension = os.path.splitext(fileName[0])
if file_extension == "":
file_extension = ".dat"

f = open(path + file_extension, "w")
for i in range(self.totalFramesToProcess):
f.write(str(i) + "\t" + str(self.allSasas[i]) + "\n")
f.close()

def calculateSasa(self):
print("calculate SASA")

Expand All @@ -92,7 +127,12 @@ def calculateSasa(self):
e.exec_()
return

u = MDAnalysis.Universe(self.psf, self.dcd)
try:
u = MDAnalysis.Universe(self.psf, self.dcd)
except IOError:
e = ErrorBox(ErrorMessages.FILE_NOT_FOUND)
e.exec_()
return

probeRadius = 1.4

Expand Down Expand Up @@ -169,9 +209,8 @@ def calculateSasa(self):
pool.join()

self.state = False
all_sasas = []
for r in results:
all_sasas.extend(r.get())
self.allSasas.extend(r.get())

del radius

Expand Down Expand Up @@ -226,11 +265,11 @@ def calculateSasa(self):
diff_list = []
for sasa_value1, sasa_value2 in zip(all_sasas, all_sasas2):
diff_list.append(sasa_value1 - sasa_value2)
all_sasas = diff_list
self.allSasas = diff_list

sip.delete(self.previewPlot)
self.previewPlot = SimplePlotter(None, width=5, height=2, dpi=60)
self.previewPlot.plot(np.arange(0, trajLength, 1), all_sasas)
self.previewPlot.plot(np.arange(0, trajLength, 1), self.allSasas)
self.previewPlot.axes.set_xlabel("frame")
self.previewPlot.axes.set_ylabel(r'SASA [A$^\circ$^2]')
self.graphGridLayout.addWidget(self.previewPlot)
Expand Down
Loading

0 comments on commit ee7cd95

Please sign in to comment.