Source code for xmipp3.protocols.protocol_resolution_bfactor

# -*- coding: utf-8 -*-
# **************************************************************************
# *
# * Authors:     Jose Luis Vilas (
# *
# * Unidad de  Bioinformatica of Centro Nacional de Biotecnologia , CSIC
# *
# * 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
# * 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 ''
# *
# **************************************************************************

import numpy as np

from pwem.emlib.image import ImageHandler
from pwem.objects import FSC
from pwem.protocols import ProtAnalysis3D
from pyworkflow import VERSION_2_0
from pyworkflow.protocol.constants import STEPS_PARALLEL
import pyworkflow.protocol.params as params
import pwem.emlib.metadata as md

from xmipp3.convert import locationToXmipp, writeSetOfParticles

from pyworkflow.protocol.params import (PointerParam, BooleanParam, FloatParam,
from pyworkflow.object import Float
from pyworkflow.utils import getExt
from pwem.objects import Volume, SetOfParticles

FN_METADATA_BFACTOR_RESOLUTION = 'bfactor_resolution.xmd'

[docs]class XmippProtbfactorResolution(ProtAnalysis3D): """ Given a local resolution map and an atomic model, this protocols provides the matching between the local resolution with the local bfactor per residue. """ _label = 'local resolution/local bfactor' _lastUpdateVersion = VERSION_2_0 def __init__(self, **args): self.vol = '' ProtAnalysis3D.__init__(self, **args) # --------------------------- DEFINE param functions ---------------------- def _defineParams(self, form): form.addSection(label='Input') form.addParam('pdbfile', PointerParam, pointerClass='AtomStruct', label="Atomic model", important=True, help='Select an atomic model. The atom positions will be taken' ' to estimate the local resolution around them and then, the ' ' local resolution associated to each residue.') form.addParam('normalizeResolution', BooleanParam, default=True, label="Normalize Resolution", help='The normalizedlocal resolution map is defined as ' '(LR - FSC)/FSC, where LR is the local resolution of a ' 'given voxel, and FSC is the FSC resolution in A. This ' 'map provides information about whether the local resolution is ' 'greater or lesser than the FSC. The local resolution ' 'normalized map is used to carry out the matching with the local ' 'bfactor per residue. Yes means that the local resolution will be ' 'normalized by the algorithm. No means that the input local ' 'resolution map is already a normalized local resolution map.') form.addParam('localResolutionMap', PointerParam, pointerClass='Volume', label="Local Resolution Map", important=True, condition='normalizeResolution', help='Select a local resolution map. Alternatively, the input.' ' can be a normalized local resolution map, in this case' ' set the Normalize resolution to No') form.addParam('normalizedMap', PointerParam, pointerClass='Volume', label="Normalized Local Resolution Map", important=True, condition='not normalizeResolution', help='Select a normalized local resolution map. The local' ' resolution normalized map is defined as ' '(LR - FSC)/FSC, where LR is the local resolution of a' ' given voxel, and FSC is the FSC resolution in A') form.addParam('fscResolution', FloatParam, condition = 'normalizeResolution', label="FSC resolution (A)", help='The global resolution of the map in A') form.addParam('medianEstimation', BooleanParam, default=True, label="Use median", help='The local resolution per residue can be estimated using ' 'the mean (by default - No) or the median (yes)') form.addParam('centered', BooleanParam, default=True, label="is the atomic centered", help='True if the atomic model centered in midle of' ' the local resolution map') form.addParallelSection(threads=4, mpi=0) # --------------------------- INSERT steps functions -------------------------------------------- def _insertAllSteps(self): # 1 Check the input and convert to mrc if it is the case self._insertFunctionStep('convertInputStep') # 2 Carry out the matching betweent the local resolution per residue and bfactor self._insertFunctionStep('matchingBfactorLocalResolution')
[docs] def mrc_convert(self, fileName, outputFileName): """Check if the extension is .mrc, if not then uses xmipp to convert it """ ext = getExt(fileName) if ((ext != '.mrc') and (ext != '.map')): params = ' -i %s' % fileName params += ' -o %s' % outputFileName self.runJob('xmipp_image_convert', params) return outputFileName else: return fileName
[docs] def convertInputStep(self): """ Read the input volume and check the file extension to convert to mrc is it is the case. """ if self.normalizeResolution.get(): self.inputMap = self.localResolutionMap else: self.inputMap = self.normalizedMap self.vol = self.mrc_convert(self.inputMap.get().getFileName(), self._getTmpPath('localResolutionMap.mrc'))
[docs] def matchingBfactorLocalResolution(self): """ The local resolution map and the pdb are taken and analyzed to match the local resolution and bfactor per residue. The output will be a pdb file with the bfactor column substituted by the normalized local resolution. This is the (local resolution - fscResolution)/fscResolution. """ params = ' --atmodel "%s"' % self.pdbfile.get().getFileName() params += ' --vol %s' % self.vol if self.normalizeResolution.get(): params += ' --fscResolution %s' % self.fscResolution.get() params += ' --sampling %f' % self.inputMap.get().getSamplingRate() if self.medianEstimation.get(): params += ' --useMedian ' if self.centered.get(): params += ' --centered ' params += ' -o %s' % self._getExtraPath() self.runJob('xmipp_resolution_pdb_bfactor', params)