Source code for relion.viewers.viewer_locres

# ******************************************************************************
# *
# * Authors:     Grigory Sharov     (gsharov@mrc-lmb.cam.ac.uk)
# *
# * MRC Laboratory of Molecular Biology, MRC-LMB
# *
# * This program is free software; you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
# * the Free Software Foundation; either version 3 of the License, or
# * (at your option) any later version.
# *
# * This program is distributed in the hope that it will be useful,
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# * GNU General Public License for more details.
# *
# * You should have received a copy of the GNU General Public License
# * along with this program; if not, write to the Free Software
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# * 02111-1307  USA
# *
# *  All comments concerning this program package may be sent to the
# *  e-mail address 'scipion@cnb.csic.es'
# *
# ******************************************************************************
from pwem.viewers import LocalResolutionViewer
from pwem.wizards import ColorScaleWizardBase

from .viewer_base import *
from ..protocols import ProtRelionLocalRes


[docs]class RelionLocalResViewer(LocalResolutionViewer): """ Visualization of Relion local resolution results. """ _environments = [DESKTOP_TKINTER, WEB_DJANGO] _targets = [ProtRelionLocalRes] _label = 'viewer localres' def __init__(self, **kwargs): LocalResolutionViewer.__init__(self, **kwargs) self.protocol._createFilenameTemplates() def _defineParams(self, form): form.addSection(label='Visualization') group = form.addGroup('Slices') group.addParam('sliceAxis', params.EnumParam, default=AX_Z, choices=['x', 'y', 'z'], display=params.EnumParam.DISPLAY_HLIST, label='Slice axis') group.addParam('doShowVolumeSlices', params.LabelParam, label="Show local resolution volume slices") groupColor = form.addGroup('Colored resolution') groupColor.addParam('volume', params.EnumParam, default=1, choices=['from 3D refinement', 'locally filtered'], display=params.EnumParam.DISPLAY_HLIST, label="Which volume to color?") _, minRes, maxRes, _ = self.getImgData(self.getResolutionVolumeFileName()) ColorScaleWizardBase.defineColorScaleParams(groupColor, defaultHighest=maxRes, defaultLowest=minRes) groupColor.addParam('doShowChimera', params.LabelParam, label="Show colored map in Chimera", default=True) def _getVisualizeDict(self): return { 'doShowVolumeSlices': self._showVolumeSlices, 'doShowChimera': self._showChimera, } # ============================================================================= # doShowVolumeSlices # ============================================================================= def _showVolumeSlices(self, param=None): imageFile = self.getResolutionVolumeFileName() imgData, _, _, _ = self.getImgData(imageFile) xplotter = RelionPlotter(x=2, y=2, mainTitle="Local Resolution Slices " "along %s-axis." % self._getAxis()) for i in range(4): slice = self._getSlice(i + 1, imgData) a = xplotter.createSubPlot("Slice %s" % slice, '', '') matrix = self._getSliceImage(imgData, i + 1, self._getAxis()) plot = xplotter.plotMatrix(a, matrix, self.lowest.get(), self.highest.get(), cmap=self._getColorName(), interpolation="nearest") xplotter.getColorBar(plot) return [xplotter]
[docs] def getResolutionVolumeFileName(self): return self.protocol._getFileName('resolMap')
# ============================================================================= # showChimera # ============================================================================= def _showChimera(self, param=None): fnResVol = self.getResolutionVolumeFileName() vol = self.protocol.protRefine.get().outputVolume sampRate = vol.getSamplingRate() if self.volume.get() == 1: fnMap = self.protocol._getFileName('outputVolume') else: fnMap = vol.getFileName() cmdFile = self.protocol._getExtraPath('chimera_resolution_map.py') self.createChimeraScript(cmdFile, fnResVol, fnMap, sampRate, numColors=self.intervals.get(), lowResLimit=self.highest.get(), highResLimit=self.lowest.get()) view = ChimeraView(cmdFile) return [view] # ============================================================================= # Utils Functions # ============================================================================= def _getAxis(self): return self.getEnumText('sliceAxis') def _getSlice(self, index, volumeData): return int((index + 3) * volumeData.shape[0] / 9) def _getSliceImage(self, volumeData, index, dataAxis): slice = self._getSlice(index, volumeData) if dataAxis == 'y': imgSlice = volumeData[:, slice, :] elif dataAxis == 'x': imgSlice = volumeData[:, :, slice] else: imgSlice = volumeData[slice, :, :] return imgSlice