# **************************************************************************
# *
# * Authors: J.M. De la Rosa Trevin (delarosatrevin@scilifelab.se) [1]
# * Federico P. de Isidro Gomez (fp.deisidro@cnb.csic.es) [2]
# *
# * [1] SciLifeLab, Stockholm University
# * [2] Centro Nacional de Biotecnologia, CSIC, Spain
# *
# * 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 2 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'
# *
# **************************************************************************
import os
import pwem
from pyworkflow.gui import FileTreeProvider
from .constants import IMOD_HOME, ETOMO_CMD, DEFAULT_VERSION
from distutils.spawn import find_executable
from pyworkflow.gui.project.utils import OS
__version__ = '3.0.10'
_logo = ""
_references = ['Kremer1996', 'Mastronarde2017']
[docs]class Plugin(pwem.Plugin):
_homeVar = IMOD_HOME
_validationMsg = None
@classmethod
def _defineVariables(cls):
cls._defineEmVar(IMOD_HOME, cls._getIMODFolder(DEFAULT_VERSION))
@classmethod
def _getEMFolder(cls, version, *paths):
return os.path.join("imod-%s" % version, *paths)
@classmethod
def _getIMODFolder(cls, version, *paths):
return os.path.join(cls._getEMFolder(version, "IMOD"), *paths)
@classmethod
def _getProgram(cls, program):
""" Returns the same program if config missing
or the path to the program based on the config file."""
# Compose path based on config
progFromConfig = cls.getHome("bin", program)
# Check if IMOD from config exists
if os.path.exists(progFromConfig):
return progFromConfig
else:
return program
[docs] @classmethod
def getEnviron(cls):
env=pwem.pwutils.Environ(os.environ)
if 'IMOD_DIR' in env:
del env['IMOD_DIR']
if 'IMOD_PATH' in env:
del env['IMOD_PATH']
return env
[docs] @classmethod
def validateInstallation(cls):
"""
Check if imod is in the path
"""
if not cls._validationMsg:
etomo = cls._getProgram(ETOMO_CMD)
cls._validationMsg = [
"imod's %s command not found in path, please install it." % etomo] if not find_executable(
ETOMO_CMD) and not os.path.exists(etomo) else []
return cls._validationMsg
[docs] @classmethod
def getDependencies(cls):
neededPrograms = ['java', 'python']
return neededPrograms
[docs] @classmethod
def defineBinaries(cls, env):
IMOD_INSTALLED = 'imod_%s_installed' % DEFAULT_VERSION
if 'linux' in OS.getPlatform().lower():
# Add jpg lib
jpeg = env.addLibrary(
'jpeg',
tar='libjpeg-turbo-1.3.1.tgz',
flags=['--without-simd'],
default=False)
# Download .sh
# https://bio3d.colorado.edu/imod/AMD64-RHEL5/imod_4.11.7_RHEL7-64_CUDA10.1.sh
installationCmd = 'wget --continue http://bio3d.colorado.edu/imod/AMD64-RHEL5/' \
'imod_%s_RHEL7-64_CUDA10.1.sh --no-check-certificate && ' % DEFAULT_VERSION
# Run .sh skipping copying startup scripts (avoid sudo permissions to write to /etc/profile.d)
installationCmd += 'sh imod_%s_RHEL7-64_CUDA10.1.sh -dir . -yes -skip && ' % DEFAULT_VERSION
# Create installation finished flag file
installationCmd += 'touch %s' % IMOD_INSTALLED
env.addPackage('imod',
deps=[jpeg],
version=DEFAULT_VERSION,
tar='void.tgz',
createBuildDir=True,
buildDir=cls._getEMFolder(DEFAULT_VERSION),
neededProgs=cls.getDependencies(),
libChecks="libjpeg62",
commands=[(installationCmd, IMOD_INSTALLED)],
default=True)
[docs] @classmethod
def runImod(cls, protocol, program, args, cwd=None):
""" Run IMOD command from a given protocol. """
# Get the command
cmd = cls.getImodCmd(program)
# Run the protocol with that command
protocol.runJob(cmd, args, env=cls.getEnviron(), cwd=cwd)
[docs] @classmethod
def getImodCmd(cls, program):
""" Composes an IMOD command for a given program. """
# Program to run
program = cls._getProgram(program)
# Command to run
cmd = ""
# If absolute ... (then it is based on the config)
if os.path.isabs(program):
cmd += ". " + cls.getHome("IMOD-linux.sh") + " && "
cmd += program
return cmd
# register file handlers to preview info in the Filebrowser....
# Here register happens very early. Earlier than done in pwem therefore this filehandler will be the default one.
# We can add .mrc and .mrcs but don't want to overlap with pwem ones.
from .file_handlers import *
register = FileTreeProvider.registerFileHandler
register(ImodHandler(), '.ali', '.st', '.rec')