Ejemplo n.º 1
0
    def _fillVolSetFromIter(self, volSet, rLev=None, it=None):
        it = self._lastIter() if it is None else it
        rLev = self._rLev if rLev is None else rLev
        volSet.setSamplingRate(self._getInputParticles().getSamplingRate())
        modelFn = self._getFileName('model', ruNum=rLev, iter=it)
        print('modelFn: ', modelFn)
        modelStar = md.MetaData('model_classes@' + modelFn)
        idList = []
        volFnList = []
        clsDistList = []
        accRotList = []
        accTransList = []
        resoList = []

        for row in md.iterRows(modelStar):
            accurracyRot = row.getValue('rlnAccuracyRotations')
            if accurracyRot <= 90:
                fn = row.getValue('rlnReferenceImage')
                print('Volume: ', fn)
                fnMrc = fn + ":mrc"
                itemId = self._getClassId(fn)
                classDistrib = row.getValue('rlnClassDistribution')
                accurracyTras = row.getValue('rlnAccuracyTranslations')
                resol = row.getValue('rlnEstimatedResolution')

                idList.append(itemId)
                volFnList.append(fnMrc)
                clsDistList.append(classDistrib)
                accRotList.append(accurracyRot)
                accTransList.append(accurracyTras)
                resoList.append(resol)
        std = self.std if hasattr(self, 'std') else None
        score = self._estimateScore(accRotList, clsDistList, None, std)
        threshold = 1 / float(self.numOfVols.get())
        print("score: ", score)

        for i, s in enumerate(score):
            vol = Volume()
            self._invertScaleVol(volFnList[i])
            vol.setFileName(self._getOutputVolFn(volFnList[i]))
            vol.setObjId(idList[i])
            if s <= threshold:
                vol._objEnabled = False
            vol._cmScore = pwObj.Float(s)
            vol._rlnClassDistribution = Float(clsDistList[i])
            vol._rlnAccuracyRotations = Float(accRotList[i])
            vol._rlnAccuracyTranslations = Float(accTransList[i])
            vol._rlnEstimatedResolution = Float(resoList[i])
            volSet.append(vol)
    def _fillVolSetFromIter(self, volSet, it):
        volSet.setSamplingRate(self._getInputParticles().getSamplingRate())
        modelStar = md.MetaData('model_classes@' +
                                self._getFileName('model', iter=it))
        for row in md.iterRows(modelStar):
            fn = row.getValue('rlnReferenceImage')
            fnMrc = fn + ":mrc"
            itemId = self._getClassId(fn)
            classDistrib = row.getValue('rlnClassDistribution')
            accurracyRot = row.getValue('rlnAccuracyRotations')
            accurracyTras = row.getValue('rlnAccuracyTranslations')
            resol = row.getValue('rlnEstimatedResolution')

            if classDistrib > 0:
                vol = Volume()
                self._invertScaleVol(fnMrc)
                vol.setFileName(self._getOutputVolFn(fnMrc))
                vol.setObjId(itemId)
                vol._rlnClassDistribution = Float(classDistrib)
                vol._rlnAccuracyRotations = Float(accurracyRot)
                vol._rlnAccuracyTranslations = Float(accurracyTras)
                vol._rlnEstimatedResolution = Float(resol)
                volSet.append(vol)
    def convertInputStep(self, classesFn):
        inputSet = self.inputSet.get()

        if isinstance(inputSet, SetOfClasses2D):
            writeSetOfClasses2D(inputSet, classesFn, writeParticles=False)
        else:
            writeSetOfParticles(inputSet, classesFn)

        # To re-sample input images
        fnDir = self._getExtraPath()
        fnNewParticles = join(fnDir, "input_classes.stk")
        TsOrig = self.inputSet.get().getSamplingRate()
        TsRefVol = -1
        if self.thereisRefVolume:
            TsRefVol = self.refVolume.get().getSamplingRate()
        if self.useMaxRes:
            self.TsCurrent = max([TsOrig, self.maxResolution.get(), TsRefVol])
            self.TsCurrent = self.TsCurrent / 3
            Xdim = self.inputSet.get().getDimensions()[0]
            self.newXdim = int(round(Xdim * TsOrig / self.TsCurrent))
            if self.newXdim < 40:
                self.newXdim = int(40)
                self.TsCurrent = float(TsOrig) * (float(Xdim) /
                                                  float(self.newXdim))
            if self.newXdim != Xdim:
                self.runJob("xmipp_image_resize",
                            "-i %s -o %s --fourier %d" %
                            (self.imgsFn, fnNewParticles, self.newXdim),
                            numberOfMpi=self.numberOfMpi.get() *
                            self.numberOfThreads.get())
            else:
                self.runJob("xmipp_image_convert",
                            "-i %s -o %s "
                            "--save_metadata_stack %s" %
                            (self.imgsFn, fnNewParticles,
                             join(fnDir, "input_classes.xmd")),
                            numberOfMpi=1)

        # To resample the refVolume if exists with the newXdim calculated
        # previously
        if self.thereisRefVolume:
            fnFilVol = self._getExtraPath('filteredVolume.vol')
            self.runJob("xmipp_image_convert",
                        "-i %s -o %s -t vol" %
                        (self.refVolume.get().getFileName(), fnFilVol),
                        numberOfMpi=1)
            # TsVol = self.refVolume.get().getSamplingRate()
            if self.useMaxRes:
                if self.newXdim != Xdim:
                    self.runJob('xmipp_image_resize',
                                "-i %s --fourier %d" %
                                (fnFilVol, self.newXdim),
                                numberOfMpi=1)
                    self.runJob('xmipp_transform_window',
                                "-i %s --size %d" % (fnFilVol, self.newXdim),
                                numberOfMpi=1)
                    args = "-i %s --fourier low_pass %f --sampling %f " % (
                        fnFilVol, self.maxResolution.get(), self.TsCurrent)
                    self.runJob("xmipp_transform_filter", args, numberOfMpi=1)

            if not self.useMaxRes:
                inputVolume = self.refVolume.get()
            else:
                inputVolume = Volume(fnFilVol)
                inputVolume.setSamplingRate(self.TsCurrent)
                inputVolume.setObjId(self.refVolume.get().getObjId())
            fnVolumes = self._getExtraPath('input_volumes.xmd')
            row = metadata.Row()
            volumeToRow(inputVolume, row, alignType=ALIGN_NONE)
            md = emlib.MetaData()
            row.writeToMd(md, md.addObject())
            md.write(fnVolumes)