Source code for pwem.convert.utils

# **************************************************************************
# *
# * Authors:     J.M. De la Rosa Trevin (delarosatrevin@scilifelab.se) [1]
# *
# * [1] SciLifeLab, Stockholm University
# *
# * 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'
# *
# **************************************************************************

import os
import sys


[docs]def getSubsetByDefocus(inputCTFs, inputMics, nMics): """ Return a subset of inputMics that covers the whole range of defocus from the inputCtfs set. This function can be used from picking wizards that wants to optimize the parameters for micrographs with different defocus values. Params: nMics is the number of micrographs that will be in the subset. """ sortedMicIds = [] # Sort CTFs by defocus and select only those that match with inputMics for ctf in inputCTFs.iterItems(orderBy='_defocusU'): ctfId = ctf.getObjId() if ctfId in inputMics: sortedMicIds.append(ctfId) # Take an equally spaced subset of micrographs space = len(sortedMicIds) // (nMics - 1) micIds = [sortedMicIds[0], sortedMicIds[-1]] pos = 0 while len(micIds) < nMics: # just add first and last pos += space micIds.insert(1, sortedMicIds[pos]) # Return the list with selected micrographs return [inputMics[micId].clone() for micId in micIds]
# TODO: use biopython
[docs]def downloadPdb(pdbId, pdbFile, log=None): print("""use AtomicStructHandler() aSH = AtomicStructHandler() pdbFileName = aSH.readFromPDBDatabase(pdbId, type='mmCif', dir=os.getcwd()) """) pdbGz = pdbFile + ".gz" result = (__downloadPdb(pdbId, pdbGz, log) and __unzipPdb(pdbGz, pdbFile, log)) return result
# TODO: use biopython def __downloadPdb(pdbId, pdbGz, log): import ftplib """Download a pdb file given its id. """ if log: log.info("File to download and unzip: %s" % pdbGz) pdborgHostname = "ftp.wwpdb.org" pdborgDirectory = "/pub/pdb/data/structures/all/mmCIF/" prefix = "" # use pdb for PDB and null for mmcif suffix = ".cif.gz" success = True # Log into serverhttp://www.rcsb.org/pdb/files/2MP1.pdb.gz ftp = ftplib.FTP() try: ftp.connect(pdborgHostname) ftp.login() except ftplib.error_temp: if log: log.error("ERROR! Timeout reached!") success = False if success: # Download file _fileIn = "%s/%s%s%s" % (pdborgDirectory, prefix, pdbId.lower(), suffix) _fileOut = pdbGz try: ftp.retrbinary("RETR %s" % _fileIn, open(_fileOut, "wb").write) except ftplib.error_perm: os.remove(_fileOut) if log: log.error("ERROR! %s could not be retrieved!" % _fileIn) success = False # Log out ftp.quit() return success def __unzipPdb(pdbGz, pdbFile, log, cleanFile=True): """ Unzip a pdb file. Params: pdbGz: zipped pdb file. pdbFile: output pdb file. cleanFile: remove the zipped file. """ import gzip success = True try: f = gzip.open(pdbGz, 'r') g = open(pdbFile, 'wb') g.writelines(f.readlines()) f.close() g.close() except Exception as ex: e = sys.exc_info()[0] if log: log.error('ERROR opening gzipped file %s: %s' % (pdbGz, e)) success = False try: if success: os.remove(pdbGz) except Exception as ex: e = sys.exc_info()[0] if log: log.error('ERROR deleting gzipped file: %s' % e) success = False return success