def createOutputStep(self): inputParticles = self.inputParticles.get() inputMics = self.inputMicrographs.get() outputCoords = self._createSetOfCoordinates(inputMics) scale = inputParticles.getSamplingRate() / inputMics.getSamplingRate() #FIXME: the 'correction' as a temporarly hack for fixing the # coordinates scale according to the particles pixel size if self.correction > 0: scale = scale * self.correction.get() print "Scaling coordinates by a factor *%0.2f*" % scale newCoord = Coordinate() firstCoord = inputParticles.getFirstItem().getCoordinate() hasMicName = firstCoord.getMicName() is not None # Create the micrographs dict using either micName or micId micDict = {} for mic in inputMics: micKey = mic.getMicName() if hasMicName else mic.getObjId() if micKey in micDict: print ">>> ERROR: micrograph key %s is duplicated!!!" % micKey print " Used in micrographs:" print " - %s" % micDict[micKey].getLocation() print " - %s" % mic.getLocation() raise Exception("Micrograph key %s is duplicated!!!" % micKey) micDict[micKey] = mic.clone() for particle in inputParticles: coord = particle.getCoordinate() micKey = coord.getMicName() if hasMicName else coord.getMicId() mic = micDict.get(micKey, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(particle) #FIXME: the 'correction' as a temporarly hack for fixing the # coordinates scale according to the particles pixel size x, y = coord.getPosition() newCoord.setPosition(x * scale, y * scale) newCoord.setMicrograph(mic) outputCoords.append(newCoord) boxSize = inputParticles.getXDim() * scale outputCoords.setBoxSize(boxSize) self._defineOutputs(outputCoordinates=outputCoords) self._defineSourceRelation(self.inputParticles, outputCoords) self._defineSourceRelation(self.inputMicrographs, outputCoords)
def createOutputStep(self): inputParticles = self.inputParticles.get() inputMics = self.inputMicrographs.get() outputCoords = self._createSetOfCoordinates(inputMics) scale = inputParticles.getSamplingRate() / inputMics.getSamplingRate() # FIXME: the 'correction' as a temporarly hack for fixing the # coordinates scale according to the particles pixel size if self.correction > 0: scale_corrected = scale * self.correction.get() print "Scaling coordinates by a factor *%0.2f*" % scale newCoord = Coordinate() firstCoord = inputParticles.getFirstItem().getCoordinate() hasMicName = firstCoord.getMicName() is not None # Create the micrographs dict using either micName or micId micDict = {} for mic in inputMics: micKey = mic.getMicName() if hasMicName else mic.getObjId() if micKey in micDict: print ">>> ERROR: micrograph key %s is duplicated!!!" % micKey print " Used in micrographs:" print " - %s" % micDict[micKey].getLocation() print " - %s" % mic.getLocation() raise Exception("Micrograph key %s is duplicated!!!" % micKey) micDict[micKey] = mic.clone() for particle in inputParticles: coord = particle.getCoordinate() micKey = coord.getMicName() if hasMicName else coord.getMicId() mic = micDict.get(micKey, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(particle) # FIXME: the 'correction' as a temporarly hack for fixing the # coordinates scale according to the particles pixel size x, y = coord.getPosition() newCoord.setPosition(x * scale_corrected, y * scale_corrected) newCoord.setMicrograph(mic) outputCoords.append(newCoord) boxSize = inputParticles.getXDim() * scale outputCoords.setBoxSize(boxSize) self._defineOutputs(outputCoordinates=outputCoords) self._defineSourceRelation(self.inputParticles, outputCoords) self._defineSourceRelation(self.inputMicrographs, outputCoords)
def createOutputStep(self): inputParticles = self.inputParticles.get() inputMics = self.inputMicrographs.get() outputCoords = self._createSetOfCoordinates(inputMics) alignType = inputParticles.getAlignment() scale = inputParticles.getSamplingRate() / inputMics.getSamplingRate() print "Scaling coordinates by a factor *%0.2f*" % scale newCoord = Coordinate() firstCoord = inputParticles.getFirstItem().getCoordinate() hasMicName = firstCoord.getMicName() is not None # Create the micrographs dict using either micName or micId micDict = {} for mic in inputMics: micKey = mic.getMicName() if hasMicName else mic.getObjId() if micKey in micDict: print ">>> ERROR: micrograph key %s is duplicated!!!" % micKey print " Used in micrographs:" print " - %s" % micDict[micKey].getLocation() print " - %s" % mic.getLocation() raise Exception("Micrograph key %s is duplicated!!!" % micKey) micDict[micKey] = mic.clone() for particle in inputParticles: coord = particle.getCoordinate() micKey = coord.getMicName() if hasMicName else coord.getMicId() mic = micDict.get(micKey, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(particle) x, y = coord.getPosition() if self.applyShifts: shifts = self.getShifts(particle.getTransform(), alignType) xCoor, yCoor = x - int(shifts[0]), y - int(shifts[1]) newCoord.setPosition(xCoor * scale, yCoor * scale) else: newCoord.setPosition(x * scale, y * scale) newCoord.setMicrograph(mic) outputCoords.append(newCoord) boxSize = inputParticles.getXDim() * scale outputCoords.setBoxSize(boxSize) self._defineOutputs(outputCoordinates=outputCoords) self._defineSourceRelation(self.inputParticles, outputCoords) self._defineSourceRelation(self.inputMicrographs, outputCoords)
def createOutputStep(self): inputParticles = self.inputParticles.get() inputMics = self.inputMicrographs.get() outputCoords = self._createSetOfCoordinates(inputMics) alignType = inputParticles.getAlignment() scale = inputParticles.getSamplingRate() / inputMics.getSamplingRate() print "Scaling coordinates by a factor *%0.2f*" % scale newCoord = Coordinate() firstCoord = inputParticles.getFirstItem().getCoordinate() hasMicName = firstCoord.getMicName() is not None # Create the micrographs dict using either micName or micId micDict = {} for mic in inputMics: micKey = mic.getMicName() if hasMicName else mic.getObjId() if micKey in micDict: print ">>> ERROR: micrograph key %s is duplicated!!!" % micKey print " Used in micrographs:" print " - %s" % micDict[micKey].getLocation() print " - %s" % mic.getLocation() raise Exception("Micrograph key %s is duplicated!!!" % micKey) micDict[micKey] = mic.clone() for particle in inputParticles: coord = particle.getCoordinate() micKey = coord.getMicName() if hasMicName else coord.getMicId() mic = micDict.get(micKey, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(particle) x, y = coord.getPosition() if self.applyShifts: shifts = self.getShifts(particle.getTransform(), alignType) xCoor, yCoor = x - int(shifts[0]), y - int(shifts[1]) newCoord.setPosition(xCoor*scale, yCoor*scale) else: newCoord.setPosition(x*scale, y*scale) newCoord.setMicrograph(mic) outputCoords.append(newCoord) boxSize = inputParticles.getXDim() * scale outputCoords.setBoxSize(boxSize) self._defineOutputs(outputCoordinates=outputCoords) self._defineSourceRelation(self.inputParticles, outputCoords) self._defineSourceRelation(self.inputMicrographs, outputCoords)
def _fillParticles(self, outputParticles, outputCoords, inputParticles): """ Create the SetOfParticles and SetOfCoordinates""" myParticles = md.MetaData(self._getExtraPath('final_images.xmd')) outputParticles.enableAppend() outputCoords.enableAppend() #Calculating the scale that relates the coordinates with the actual # position in the mic scale = inputParticles.getSamplingRate() / \ self.inputMics.get().getSamplingRate() #Dictionary with the name and id of the inpt mics micDictname = {} micDictId = {} for mic in self.inputMics.get(): micKey = mic.getMicName() micDictname[micKey] = mic.clone() micKey2 = mic.getObjId() micDictId[micKey2] = mic.clone() for row in md.iterRows(myParticles): #To create the new particle p = rowToParticle(row) outputParticles.append(p) #To create the new coordinate newCoord = Coordinate() coord = p.getCoordinate() if coord.getMicName() is not None: micKey = coord.getMicName() micDict = micDictname else: micKey = coord.getMicId() micDict = micDictId mic = micDict.get(micKey, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(p) x, y = coord.getPosition() newCoord.setPosition(x * scale, y * scale) newCoord.setMicrograph(mic) outputCoords.append(newCoord) boxSize = inputParticles.getXDim() * scale outputCoords.setBoxSize(boxSize)
def convertInputStep(self): inputParticles = self.inputParticles.get() firstCoord = inputParticles.getFirstItem().getCoordinate() self.hasMicName = firstCoord.getMicName() is not None inputMics = self._getMicrographs() self.alignType = inputParticles.getAlignment() self.downFactor = self.ctfDownFactor.get() # create a tmp set for matching mics self.matchingMics = self._createSetOfMicrographs(suffix='_tmp') self.matchingMics.copyInfo(inputMics) if self.downFactor != 1.: self.matchingMics.setDownsample(self.downFactor) # create a tmp set for coords coords = self._createSetOfCoordinates(inputMics, suffix='_tmp') newCoord = Coordinate() self.scale = inputParticles.getSamplingRate() / inputMics.getSamplingRate() if self.scale != 1.0: print "Scaling coordinates by a factor *%0.2f*" % self.scale # Create the micrograph dicts micDict = {} # dict with micName or micId micBaseDict = {} # dict with micName (just basename) micKey2 = None insertedMics = {} for mic in inputMics: if self.hasMicName: micKey = mic.getMicName() micKey2 = pwutils.removeBaseExt(micKey) else: micKey = mic.getObjId() if micKey in micDict: print ">>> ERROR: micrograph key %s is duplicated!" % micKey print " Used in micrographs:" print " - %s" % micDict[micKey].getLocation() print " - %s" % mic.getLocation() raise Exception("Micrograph key %s is duplicated!" % micKey) micDict[micKey] = mic.clone() if self.hasMicName: micBaseDict[micKey2] = mic.clone() # match the mic from coord with micDict for particle in inputParticles: coord = particle.getCoordinate() or None if coord is None: print "Skipping particle, coordinates not found" continue if self.hasMicName: micKey = coord.getMicName() micKey2 = pwutils.removeBaseExt(micKey) else: micKey = coord.getMicId() # find the mapping by micName (with or without ext) or micId mic = micDict.get(micKey, None) or micBaseDict.get(micKey2, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(particle) x, y = coord.getPosition() if self.applyShifts: shifts = getShifts(particle.getTransform(), self.alignType) xCoor, yCoor = x - int(shifts[0]), y - int(shifts[1]) newCoord.setPosition(xCoor * self.scale, yCoor * self.scale) else: newCoord.setPosition(x * self.scale, y * self.scale) newCoord.setMicrograph(mic) coords.append(newCoord) if mic.getObjId() not in insertedMics: insertedMics[mic.getObjId()] = mic self.matchingMics.append(mic) ih = em.ImageHandler() # We convert matching micrographs if they are not *.mrc for mic in self.matchingMics: # Create micrograph dir micName = mic.getFileName() micDir = self._getTmpPath(pwutils.removeBaseExt(micName)) pwutils.makePath(micDir) outMic = pwutils.join(micDir, pwutils.replaceBaseExt(micName, 'mrc')) if self.downFactor != 1.: ih.scaleFourier(micName, outMic, self.downFactor) sps = inputMics.getScannedPixelSize() * self.downFactor self._params['scannedPixelSize'] = sps else: if micName.endswith('.mrc'): pwutils.createLink(micName, outMic) else: ih.convert(micName, outMic) # Write out coordinate files and sets writeSetOfCoordinates(self._getTmpPath(), coords, self.matchingMics) coords.clear() pwutils.cleanPath(coords.getFileName()) self.matchingMics.write() self.matchingMics.close()
def convertInputStep(self): inputParticles = self.inputParticles.get() firstCoord = inputParticles.getFirstItem().getCoordinate() self.hasMicName = firstCoord.getMicName() is not None inputMics = self._getMicrographs() self.alignType = inputParticles.getAlignment() self.downFactor = self.ctfDownFactor.get() # create a tmp set for matching mics self.matchingMics = self._createSetOfMicrographs(suffix='_tmp') self.matchingMics.copyInfo(inputMics) if self.downFactor != 1.: self.matchingMics.setDownsample(self.downFactor) # create a tmp set for coords coords = self._createSetOfCoordinates(inputMics, suffix='_tmp') newCoord = Coordinate() self.scale = inputParticles.getSamplingRate( ) / inputMics.getSamplingRate() if self.scale != 1.0: print "Scaling coordinates by a factor *%0.2f*" % self.scale # Create the micrograph dicts micDict = {} # dict with micName or micId micBaseDict = {} # dict with micName (just basename) micKey2 = None insertedMics = {} for mic in inputMics: if self.hasMicName: micKey = mic.getMicName() micKey2 = pwutils.removeBaseExt(micKey) else: micKey = mic.getObjId() if micKey in micDict: print ">>> ERROR: micrograph key %s is duplicated!" % micKey print " Used in micrographs:" print " - %s" % micDict[micKey].getLocation() print " - %s" % mic.getLocation() raise Exception("Micrograph key %s is duplicated!" % micKey) micDict[micKey] = mic.clone() if self.hasMicName: micBaseDict[micKey2] = mic.clone() # match the mic from coord with micDict for particle in inputParticles: coord = particle.getCoordinate() or None if coord is None: print "Skipping particle, coordinates not found" continue if self.hasMicName: micKey = coord.getMicName() micKey2 = pwutils.removeBaseExt(micKey) else: micKey = coord.getMicId() # find the mapping by micName (with or without ext) or micId mic = micDict.get(micKey, None) or micBaseDict.get(micKey2, None) if mic is None: print "Skipping particle, key %s not found" % micKey else: newCoord.copyObjId(particle) x, y = coord.getPosition() if self.applyShifts: shifts = getShifts(particle.getTransform(), self.alignType) xCoor, yCoor = x - int(shifts[0]), y - int(shifts[1]) newCoord.setPosition(xCoor * self.scale, yCoor * self.scale) else: newCoord.setPosition(x * self.scale, y * self.scale) newCoord.setMicrograph(mic) coords.append(newCoord) if mic.getObjId() not in insertedMics: insertedMics[mic.getObjId()] = mic self.matchingMics.append(mic) ih = em.ImageHandler() # We convert matching micrographs if they are not *.mrc for mic in self.matchingMics: # Create micrograph dir micName = mic.getFileName() micDir = self._getTmpPath(pwutils.removeBaseExt(micName)) pwutils.makePath(micDir) outMic = pwutils.join(micDir, pwutils.replaceBaseExt(micName, 'mrc')) if self.downFactor != 1.: ih.scaleFourier(micName, outMic, self.downFactor) sps = inputMics.getScannedPixelSize() * self.downFactor self._params['scannedPixelSize'] = sps else: if micName.endswith('.mrc'): pwutils.createLink(micName, outMic) else: ih.convert(micName, outMic) # Write out coordinate files and sets writeSetOfCoordinates(self._getTmpPath(), coords, self.matchingMics) coords.clear() pwutils.cleanPath(coords.getFileName()) self.matchingMics.write() self.matchingMics.close()