Source code for pwem.protocols.protocol_import.dataimport

# **************************************************************************
# *
# * Authors:     J.M. De la Rosa Trevin (jmdelarosa@cnb.csic.es)
# *
# * 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 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 os.path import join, basename, exists
from collections import OrderedDict

from pyworkflow.utils import findRootFrom

import pwem.objects as emobj
import pwem.constants as emcts


[docs]class ScipionImport: """ Import """ def __init__(self, protocol, sqliteFile): self.protocol = protocol self._sqliteFile = sqliteFile self.copyOrLink = protocol.getCopyOrLink()
[docs] def importMicrographs(self): """ Import a SetOfMicrographs from a given sqlite file. """ inputSet = emobj.SetOfMicrographs(filename=self._sqliteFile) self._findImagesPath(inputSet) micSet = self.protocol._createSetOfMicrographs() micSet.setObjComment('Micrographs imported from sqlite file:\n%s' % self._sqliteFile) # Update both samplingRate and acquisition with parameters # selected in the protocol form. # Acquisition should be updated before, just to ensure that # scannedPixedSize will be computed properly when calling # setSamplingRate self.protocol.fillAcquisition(micSet.getAcquisition()) self.protocol.setSamplingRate(micSet) micSet.setIsPhaseFlipped(self.protocol.haveDataBeenPhaseFlipped.get()) # Read the micrographs from the 'self._sqliteFile' metadata # but fixing the filenames with new ones (linked or copy to extraDir) micSet.copyItems(inputSet, updateItemCallback=self._updateParticle) self.protocol._defineOutputs(outputMicrographs=micSet)
[docs] def importCoordinates(self, inputMics): """ Import a SetOfCoordinates from a given sqlite file. """ inputSet = emobj.SetOfCoordinates(filename=self._sqliteFile) # self._findImagesPath(inputSet) coorSet = emobj.SetOfCoordinates.create(self.protocol.getPath()) coorSet.copyInfo(inputSet) coorSet.setMicrographs(inputMics) coorSet.setObjComment('Coordinates imported from sqlite file:\n%s' % self._sqliteFile) # Update both samplingRate and acquisition with parameters # selected in the protocol form. # Acquisition should be updated before, just to ensure that # scannedPixedSize will be computed properly when calling # setSamplingRate coorSet.setBoxSize(self.protocol.boxSize.get()) # Read the micrographs from the 'self._sqliteFile' metadata # but fixing the filenames with new ones (linked or copy to extraDir) coorSet.copyItems(inputSet) self.protocol._defineOutputs(outputCoordinates=coorSet) self.protocol._defineSourceRelation(inputMics, coorSet)
[docs] def importParticles(self): """ Import particles from a metadata 'images.xmd' """ inputSet = emobj.SetOfParticles(filename=self._sqliteFile) inputSet.loadProperty('_alignment', emcts.ALIGN_NONE) inputSet.loadProperty('_hasCtf', False) self._findImagesPath(inputSet) partSet = self.protocol._createSetOfParticles() partSet.copyInfo(inputSet) partSet.setObjComment('Particles imported from Scipion sqlite file:\n%s' % self._sqliteFile) partSet.copyItems(inputSet, updateItemCallback=self._updateParticle) # Update both samplingRate and acquisition with parameters # selected in the protocol form self.protocol.setSamplingRate(partSet) self.protocol.fillAcquisition(partSet.getAcquisition()) partSet.setIsPhaseFlipped(self.protocol.haveDataBeenPhaseFlipped.get()) self.protocol._defineOutputs(outputParticles=partSet)
def _findImagesPath(self, inputSet): """ Find the relative path from which the images exists revative to the sqlite location. """ # Store which images stack have been linked/copied and the new path self._imgDict = {} img = inputSet.getFirstItem() self._imgPath = findRootFrom(self._sqliteFile, img.getFileName()) if self._imgPath is None: self.protocol.warning("Binary data was not found from sqlite: %s" % self._sqliteFile)
[docs] def validate(self): """ Try to find errors on import. """ errors = [] return errors
[docs] def validateMicrographs(self): return self.validate()
[docs] def validateParticles(self): return self.validate()
def _updateParticle(self, particle, partRow): if self._imgPath: # Create a link or copy files to extraPath # and update the Row properly fn = particle.getFileName() imgBase = basename(fn) imgDst = self.protocol._getExtraPath(imgBase) if not exists(imgDst): self.copyOrLink(join(self._imgPath, fn), imgDst) particle.setFileName(imgDst)
[docs] def loadAcquisitionInfo(self): """ Return a dictionary with acquisition values and the sampling rate information. In the case of Scipion, these values will be read from the 'Properties' table of the particles.sqlite file. """ acq = OrderedDict() inputSet = emobj.SetOfParticles(filename=self._sqliteFile) def _get(key): return inputSet.getProperty(key) acq['samplingRate'] = _get('_samplingRate') acq['voltage'] = _get('_acquisition._voltage') acq['amplitudeContrast'] = _get('_acquisition._amplitudeContrast') acq['sphericalAberration'] = float(_get('_acquisition._sphericalAberration')) return acq
[docs] def getMicCTF(self, mic): """ Retrieve the CTF associated to this micrograph. """ # The first time this function is called, the set of micrographs # will be loaded from the given sqlite file if not hasattr(self, 'ctfSet'): self.ctfSet = emobj.SetOfCTF(filename=self._sqliteFile) return self.ctfSet[mic.getObjId()]