def correctGain(self, movieFn, outputFn, gainFn=None, darkFn=None):
        """correct a movie with both gain and dark images"""
        ih = ImageHandler()
        _, _, z, n = ih.getDimensions(movieFn)
        numberOfFrames = max(z, n) # in case of wrong mrc stacks as volumes

        def _readImgFloat(fn):
            img = None
            if fn:
                img = ih.read(fn)
                img.convert2DataType(ih.DT_FLOAT)
            return img

        gainImg = _readImgFloat(gainFn)
        darkImg = _readImgFloat(darkFn)

        img = ih.createImage()

        for i in range(1, numberOfFrames + 1):
            img.read((i, movieFn))
            img.convert2DataType(ih.DT_FLOAT)

            if darkImg:
                img.inplaceSubtract(darkImg)
            if gainImg:
                img.inplaceMultiply(gainImg)

            img.write((i, outputFn))
    def _processMovie(self, movie):
        allFramesSum = self._getPath('all_frames_sum.mrc')
        ih = ImageHandler()
        sumImg = ih.createImage()
        img = ih.createImage()

        n = movie.getNumberOfFrames()
        fn = movie.getFileName()

        sumImg.read((1, fn))

        for frame in range(2, n + 1):
            img.read((frame, fn))
            sumImg.inplaceAdd(img)

        if os.path.exists(allFramesSum):
            img.read(allFramesSum)
            sumImg.inplaceAdd(img)

        sumImg.write(allFramesSum)
Esempio n. 3
0
class CustomMaskDialog(ImagePreviewDialog):
        
    def _beforePreview(self):
        imgLocation = self.protocolParent.inputImage.get().getLocation()
        self.dim = ImageHandler().getDimensions(imgLocation)[0]
        self.lastObj = None
        self.rightPreviewLabel = "Final mask"
        self.message = "Generating mask..."
        self.ih = ImageHandler()
        self.rightImage = self.ih.createImage()
        
    def _createPreview(self, frame):
        """ Should be implemented by subclasses to 
        create the items preview. 
        """
        self._previews = []
        for i, label in enumerate(MASKRESULT_LABELS):
            self.previewLabel = label
            previewFrame = tk.Frame(frame)
            ImagePreviewDialog._createPreview(self, previewFrame)
            self._previews.append(self.preview) # store all previews created
            previewFrame.grid(row=i/4, column=i%4)
            
    def _itemSelected(self, obj):
        self.lastObj = obj
        dialog.FlashMessage(self, self.message, func=self._computeRightPreview)
           
    def _createVarWidgets(self, parent, varName, varLabel, row, col):
        var = tk.StringVar()
        self._vars[varName] = var
        var.set(self.protocolParent.getAttributeValue(varName))
        varLabel = tk.Label(parent, text=varLabel)
        varLabel.grid(row=row, column=col*2, padx=5, pady=5)
        varEntry = tk.Entry(parent, width=10, textvariable=var)
        varEntry.grid(row=row, column=col*2+1, padx=5, pady=5)
    
    def _createControls(self, frame):
        self._vars = {}
        inputFrame = tk.Frame(frame)
        inputFrame.grid(row=0, column=0)
        
        for i, varName in enumerate(CUSTOMMASK_VARS):
            self._createVarWidgets(inputFrame, varName, CUSTOMMASK_VARS[varName], i%2, i/2)
            
        previewBtn = HotButton(frame, text='Preview', command=self._computeRightPreview)
        previewBtn.grid(row=1, column=1, padx=5, pady=5)
            
    def getVarValue(self, varName):
        return self._vars[varName].get()
    
    def _computeRightPreview(self, e=None):
        """ This function should compute the right preview
        using the self.lastObj that was selected
        """
        prot = self.protocolParent # short notation
        tmp = prot.getProject().getTmpPath()
        ext = prot.getExt()
        # Convert input image to spider
        imgPrefix = 'inputImage'
        imgName = '%s.%s' % (imgPrefix, ext)
        imgFn = os.path.join(tmp, imgName)
        self.ih.convert(self.lastObj, (1, imgFn))
        
        runCustomMaskScript(self.getVarValue('filterRadius1'), 
                            self.getVarValue('sdFactor'), 
                            self.getVarValue('filterRadius2'), 
                            self.getVarValue('maskThreshold'), 
                            workingDir=tmp, ext=ext,
                            inputImage=imgPrefix+'@1')
        
        for i, preview in enumerate(self._previews):
            if i == 0:
                self.rightImage.read(imgFn)
            else:
                self.rightImage.read('%d@%s/stkmask.%s' % (i, tmp, ext))
            preview.updateData(self.rightImage.getData())
Esempio n. 4
0
class CustomMaskDialog(ImagePreviewDialog):
    def _beforePreview(self):
        imgLocation = self.protocolParent.inputImage.get().getLocation()
        self.dim = ImageHandler().getDimensions(imgLocation)[0]
        self.lastObj = None
        self.rightPreviewLabel = "Final mask"
        self.message = "Generating mask..."
        self.ih = ImageHandler()
        self.rightImage = self.ih.createImage()

    def _createPreview(self, frame):
        """ Should be implemented by subclasses to 
        create the items preview. 
        """
        self._previews = []
        for i, label in enumerate(MASKRESULT_LABELS):
            self.previewLabel = label
            previewFrame = tk.Frame(frame)
            ImagePreviewDialog._createPreview(self, previewFrame)
            self._previews.append(self.preview)  # store all previews created
            previewFrame.grid(row=i / 4, column=i % 4)

    def _itemSelected(self, obj):
        self.lastObj = obj
        dialog.FlashMessage(self, self.message, func=self._computeRightPreview)

    def _createVarWidgets(self, parent, varName, varLabel, row, col):
        var = tk.StringVar()
        self._vars[varName] = var
        var.set(self.protocolParent.getAttributeValue(varName))
        varLabel = tk.Label(parent, text=varLabel)
        varLabel.grid(row=row, column=col * 2, padx=5, pady=5)
        varEntry = tk.Entry(parent, width=10, textvariable=var)
        varEntry.grid(row=row, column=col * 2 + 1, padx=5, pady=5)

    def _createControls(self, frame):
        self._vars = {}
        inputFrame = tk.Frame(frame)
        inputFrame.grid(row=0, column=0)

        for i, varName in enumerate(CUSTOMMASK_VARS):
            self._createVarWidgets(inputFrame, varName,
                                   CUSTOMMASK_VARS[varName], i % 2, i / 2)

        previewBtn = HotButton(frame,
                               text='Preview',
                               command=self._computeRightPreview)
        previewBtn.grid(row=1, column=1, padx=5, pady=5)

    def getVarValue(self, varName):
        return self._vars[varName].get()

    def _computeRightPreview(self, e=None):
        """ This function should compute the right preview
        using the self.lastObj that was selected
        """
        prot = self.protocolParent  # short notation
        tmp = prot.getProject().getTmpPath()
        ext = prot.getExt()
        # Convert input image to spider
        imgPrefix = 'inputImage'
        imgName = '%s.%s' % (imgPrefix, ext)
        imgFn = os.path.join(tmp, imgName)
        self.ih.convert(self.lastObj, (1, imgFn))

        runCustomMaskScript(self.getVarValue('filterRadius1'),
                            self.getVarValue('sdFactor'),
                            self.getVarValue('filterRadius2'),
                            self.getVarValue('maskThreshold'),
                            workingDir=tmp,
                            ext=ext,
                            inputImage=imgPrefix + '@1')

        for i, preview in enumerate(self._previews):
            if i == 0:
                self.rightImage.read(imgFn)
            else:
                self.rightImage.read('%d@%s/stkmask.%s' % (i, tmp, ext))
            preview.updateData(self.rightImage.getData())
    def createOutputStep(self):

        ih = ImageHandler()
        outputStack = self._getPath('particles.mrcs')
        outputImg = ih.createImage()

        inputParticles = self.inputParticles.get()
        inputCoords = self.inputCoordinates.get()
        outputSet = self._createSetOfParticles()
        outputSet.copyInfo(inputParticles)

        boxSize = self.boxSize.get()
        b2 = int(round(boxSize / 2))
        center = np.zeros((boxSize, boxSize))

        ih = ImageHandler()

        i = 0
        outliers = 0
        partIdExcluded = []
        lastPartId = None

        for coord in inputCoords.iterItems(
                orderBy=['_subparticle._micId', '_micId', 'id']):
            # The original particle id is stored in the sub-particle as micId
            partId = coord._micId.get()

            # Load the particle if it has changed from the last sub-particle
            if partId != lastPartId:
                particle = inputParticles[partId]

                if particle is None:
                    partIdExcluded.append(partId)
                    self.info("WARNING: Missing particle with id %s from "
                              "input particles set" % partId)
                else:
                    # Now load the particle image to extract later sub-particles
                    img = ih.read(particle)
                    x, y, _, _ = img.getDimensions()
                    data = img.getData()

                lastPartId = partId

            # If particle is not in inputParticles, subparticles will not be
            # generated. Now, subtract from a subset of original particles is
            # supported.
            if not partId in partIdExcluded:
                xpos = coord.getX()
                ypos = coord.getY()

                # Check that the sub-particle will not lay out of the particle
                if (ypos - b2 < 0 or ypos + b2 > y or xpos - b2 < 0
                        or xpos + b2 > x):
                    outliers += 1
                    continue

                # Crop the sub-particle data from the whole particle image
                center[:, :] = data[ypos - b2:ypos + b2, xpos - b2:xpos + b2]
                outputImg.setData(center)
                i += 1
                outputImg.write((i, outputStack))
                subpart = coord._subparticle
                subpart.setLocation(
                    (i, outputStack))  # Change path to new stack
                subpart.setObjId(None)  # Force to insert as a new item
                outputSet.append(subpart)

        if outliers:
            self.info(
                "WARNING: Discarded %s particles because laid out of the "
                "particle (for a box size of %d" % (outliers, boxSize))

        self._defineOutputs(outputParticles=outputSet)
        self._defineSourceRelation(self.inputParticles, outputSet)