Source code for pwem.objects.data_flexhub

# **************************************************************************
# *
# * Authors:     David Herreros Calero (dherreros@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 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 numpy as np

from pwem.objects import (SetOfParticles, Particle, SetOfClasses, Volume, Transform, SetOfImages,
                          AtomStruct, EMSet, SetOfAtomStructs, EMObject, NO_INDEX)

from pyworkflow.object import String, CsvList, Float, Integer


[docs]class ParticleFlex(Particle): """Particle with flexibility information stored""" def __init__(self, progName="", **kwargs): Particle.__init__(self, **kwargs) self._flexInfo = FlexInfo(progName) self._zFlex = CsvList() self._zRed = CsvList() self._transform = Transform()
[docs] def getFlexInfo(self): return self._flexInfo
[docs] def setFlexInfo(self, flexInfo): self._flexInfo = flexInfo
[docs] def getZFlex(self): return np.fromstring(self._zFlex.get(), sep=",")
[docs] def setZFlex(self, zFlex): csvZFlex = CsvList() for c in zFlex: csvZFlex.append(c) self._zFlex = csvZFlex
[docs] def getZRed(self): return np.fromstring(self._zRed.get(), sep=",")
[docs] def setZRed(self, zRed): csvZRed = CsvList() for c in zRed: csvZRed.append(c) self._zRed = csvZRed
[docs] def copyInfo(self, other): self.copy(other, copyId=False)
[docs]class SetOfParticlesFlex(SetOfParticles): """SetOfParticles with flexibility information stored""" ITEM_TYPE = ParticleFlex def __init__(self, progName="", **kwargs): SetOfParticles.__init__(self, **kwargs) self._flexInfo = FlexInfo(progName)
[docs] def getFlexInfo(self): return self._flexInfo
[docs] def setFlexInfo(self, flexInfo): self._flexInfo = flexInfo
[docs] def copyInfo(self, other): super(SetOfParticles, self).copyInfo(other) if hasattr(other, "_flexInfo"): self._flexInfo.copyInfo(other._flexInfo)
[docs]class FlexInfo(EMObject): """ Object storing any information needed by other protocols/plugins to work properly such us neural network paths, basis degrees...""" def __init__(self, progName="", **kwargs): EMObject.__init__(self, **kwargs) self._progName = String(progName)
[docs] def copyInfo(self, other): self.copy(other, copyId=False)
[docs] def getProgName(self): return self._progName.get()
[docs] def setProgName(self, progName): self._progName = String(progName)
[docs] def setAttr(self, attrName, value): if isinstance(value, float): setattr(self, attrName, Float(value)) elif isinstance(value, int): setattr(self, attrName, Integer(value)) elif isinstance(value, str): setattr(self, attrName, String(value)) elif isinstance(value, list) or isinstance(value, np.ndarray): csv = CsvList() for c in value: csv.append(c) setattr(self, attrName, csv) else: setattr(self, attrName, value)
[docs] def getAttr(self, attrName): return getattr(self, attrName).get()
[docs]class VolumeFlex(Volume): """Volume with flexibility information stored""" def __init__(self, progName="", **kwargs): Volume.__init__(self, **kwargs) self._flexInfo = FlexInfo(progName=progName) self._zFlex = CsvList() self._zRed = CsvList()
[docs] def getFlexInfo(self): return self._flexInfo
[docs] def setFlexInfo(self, flexInfo): self._flexInfo = flexInfo
[docs] def getZFlex(self): return np.fromstring(self._zFlex.get(), sep=",")
[docs] def setZFlex(self, zFlex): csvZFlex = CsvList() for c in zFlex: csvZFlex.append(c) self._zFlex = csvZFlex
[docs] def getZRed(self): return np.fromstring(self._zRed.get(), sep=",")
[docs] def setZRed(self, zRed): csvZRed = CsvList() for c in zRed: csvZRed.append(c) self._zRed = csvZRed
[docs] def copyInfo(self, other): self.copy(other, copyId=False)
[docs]class SetOfVolumesFlex(SetOfImages): """Represents a set of Volumes with flexibility information stored""" ITEM_TYPE = VolumeFlex REP_TYPE = VolumeFlex # Hint to GUI components to expose internal items for direct selection EXPOSE_ITEMS = True def __init__(self, progName="", **kwargs): SetOfImages.__init__(self, **kwargs) self._flexInfo = FlexInfo(progName=progName)
[docs] def getFlexInfo(self): return self._flexInfo
[docs] def setFlexInfo(self, flexInfo): self._flexInfo = flexInfo
[docs]class ClassFlex(SetOfParticlesFlex): """Class3D with flexibility information stored""" REP_TYPE = VolumeFlex
[docs] def copyInfo(self, other): """ Copy basic information (id and other properties) but not _mapperPath or _size from other set of micrographs to current one. """ self.copy(other, copyId=False, ignoreAttrs=['_mapperPath', '_size'])
[docs] def clone(self): clone = self.getClass()() clone.copy(self, ignoreAttrs=['_mapperPath', '_size']) return clone
[docs] def close(self): # Do nothing on close, since the db will be closed by SetOfClasses pass
[docs]class SetOfClassesFlex(SetOfClasses): """ SetOfClasses3D with flexibility information stored""" ITEM_TYPE = ClassFlex REP_TYPE = VolumeFlex REP_SET_TYPE = SetOfVolumesFlex pass
[docs]class AtomStructFlex(AtomStruct): """ AtomStruct with flexibility information stored""" def __init__(self, progName="", **kwargs): AtomStruct.__init__(self, **kwargs) self._flexInfo = FlexInfo(progName) self._zFlex = CsvList() self._zRed = CsvList()
[docs] def getFlexInfo(self): return self._flexInfo
[docs] def setFlexInfo(self, flexInfo): self._flexInfo = flexInfo
[docs] def getZFlex(self): return np.fromstring(self._zFlex.get(), sep=",")
[docs] def setZFlex(self, zFlex): csvZFlex = CsvList() for c in zFlex: csvZFlex.append(c) self._zFlex = csvZFlex
[docs] def getZRed(self): return np.fromstring(self._zRed.get(), sep=",")
[docs] def setZRed(self, zRed): csvZRed = CsvList() for c in zRed: csvZRed.append(c) self._zRed = csvZRed
[docs] def copyInfo(self, other): self.copy(other, copyId=False)
[docs] def setLocation(self, *args): """ Set the image location, see getLocation. Params: First argument can be: 1. a tuple with (index, filename) 2. a index, this implies a second argument with filename 3. a filename, this implies index=NO_INDEX """ first = args[0] t = type(first) if t == tuple: _, filename = first elif t == int: _, filename = first, args[1] elif t == str: _, filename = NO_INDEX, first else: raise Exception('setLocation: unsupported type %s as input.' % t) self.setFileName(filename)
[docs] def getSamplingRate(self): # This is only a way to use the default way to generate subsets return None
[docs] def setSamplingRate(self, sr): # This is only a way to use the default way to generate subsets pass
[docs] def setAlignment(self, sr): # This is only a way to use the default way to generate subsets pass
[docs]class SetOfAtomStructFlex(SetOfAtomStructs): """ Set containing AtomStructFlex items. """ ITEM_TYPE = AtomStructFlex EXPOSE_ITEMS = True def __init__(self, progName="", **kwargs): EMSet.__init__(self, **kwargs) self._flexInfo = FlexInfo(progName)
[docs] def getFlexInfo(self): return self._flexInfo
[docs] def setFlexInfo(self, flexInfo): self._flexInfo = flexInfo
[docs] def copyInfo(self, other): super(SetOfAtomStructFlex, self).copyInfo(other) if hasattr(other, "_flexInfo"): self._flexInfo.copyInfo(other._flexInfo)
[docs] def getSamplingRate(self): # This is only a way to use the default way to generate subsets return None
[docs] def setSamplingRate(self, sr): # This is only a way to use the default way to generate subsets pass
[docs] def setAlignment(self, sr): # This is only a way to use the default way to generate subsets pass
[docs]class ClassStructFlex(SetOfParticlesFlex): """Class3D with flexibility information stored for structures""" REP_TYPE = AtomStructFlex
[docs] def copyInfo(self, other): """ Copy basic information (id and other properties) but not _mapperPath or _size from other set of micrographs to current one. """ self.copy(other, copyId=False, ignoreAttrs=['_mapperPath', '_size'])
[docs] def clone(self): clone = self.getClass()() clone.copy(self, ignoreAttrs=['_mapperPath', '_size']) return clone
[docs] def close(self): # Do nothing on close, since the db will be closed by SetOfClasses pass
[docs]class SetOfClassesStructFlex(SetOfClasses): """ SetOfClasses3D with flexibility information stored for structures""" ITEM_TYPE = ClassStructFlex REP_TYPE = AtomStructFlex REP_SET_TYPE = SetOfAtomStructFlex pass