def getParticleContrastFromMrc(mrcfile): apDisplay.printMsg("Particle contrast determination is experimental") if not os.path.isfile(mrcfile): apDisplay.printWarning( "Could not determine particle contrast, mrc file not found") return None rawimage = mrc.read(mrcfile) boxSize = min(rawimage.shape) - 1 innerNoise = boxSize / 2 / 20 #one-twentieth the box radius particleRadius = boxSize / 2 / 3 + 1 #one-third the box radius outerLimit = boxSize / 2 * 0.9 # 90% of the box radius radialData, densityData = ctftools.rotationalAverage(rawimage, full=True) # find indices for radial values innerNoiseIndex = numpy.searchsorted(radialData, innerNoise) partRadIndex = numpy.searchsorted(radialData, particleRadius) outerLimitIndex = numpy.searchsorted(radialData, outerLimit) maxDiam = radialData[-1] innerVal = numpy.median(densityData[innerNoiseIndex:partRadIndex]) outerVal = numpy.median(densityData[outerLimitIndex:]) #print innerMean, outerMean, mrcfile if debug is True: print "%d:%d and %d:%d" % (innerNoiseIndex, partRadIndex, outerLimitIndex, densityData.shape[0]) print "inner density %.1f <> outer density %.1f" % (innerVal, outerVal) from matplotlib import pyplot pyplot.plot(radialData, densityData, 'ko-') pyplot.xlabel('Pixel Radius') pyplot.ylabel('Density') xmin, xmax, ymin, ymax = pyplot.axis() pyplot.axhline(y=innerVal, xmin=innerNoise / xmax, xmax=particleRadius / xmax, linewidth=2, color="blue", linestyle='-') #pyplot.axhline(y=innerVal, xmax=particleRadius, linewidth=2, color="cyan", linestyle='-') #print innerVal, radialData[1], particleRadius pyplot.axhline(y=outerVal, xmin=outerLimit / xmax, xmax=maxDiam / xmax, linewidth=2, color="orange", linestyle='-') #pyplot.axhline(y=outerVal, xmax=maxDiam, linewidth=2, color="orange", linestyle='-') #print outerVal, outerLimit, maxDiam pyplot.grid(True) pyplot.show() if innerVal > outerVal: apDisplay.printMsg( "Contrast determined as WHITE particles on black background") return "whiteOnBlack" else: apDisplay.printMsg( "Contrast determined as BLACK particles on white background") print "BLACK on white", mrcfile return "blackOnWhite"
def from2Dinto1D(self, fftarray): if self.params['astig'] is False and self.ellipseParams is None: ### simple case: do a rotational average pixelrdata, PSDarray = ctftools.rotationalAverage(fftarray, self.params['ringwidth'], full=False) return self.removeBlackCenter(pixelrdata*self.freq, PSDarray) if self.ellipseParams is None: ### hard case: find ellipse and do a elliptical average blurArray = copy.deepcopy(fftarray) for blurIter in range(2): ### each time the image is blurred more blurArray = self.rotationBlur(blurArray, angle=1, numIter=3) self.findEllipseEdge(blurArray) if self.ellipseParams is None: apDisplay.printWarning("Failed to find ellipse, continuing with no astig") pixelrdata, PSDarray = ctftools.rotationalAverage(fftarray, self.params['ringwidth'], full=False) return self.removeBlackCenter(pixelrdata*self.freq, PSDarray) ellipratio = self.ellipseParams['a']/self.ellipseParams['b'] ellipangle = math.degrees(self.ellipseParams['alpha']) pixelrdata, PSDarray = ctftools.ellipticalAverage(fftarray, ellipratio, ellipangle, self.params['ringwidth'], full=False) return self.removeBlackCenter(pixelrdata*self.freq, PSDarray)
def getParticleContrastFromMrc(mrcfile): apDisplay.printMsg("Particle contrast determination is experimental") if not os.path.isfile(mrcfile): apDisplay.printWarning("Could not determine particle contrast, mrc file not found") return None rawimage = mrc.read(mrcfile) boxSize = min(rawimage.shape)-1 innerNoise = boxSize/2/20 #one-twentieth the box radius particleRadius = boxSize/2/3 + 1 #one-third the box radius outerLimit = boxSize/2 * 0.9 # 90% of the box radius radialData, densityData = ctftools.rotationalAverage(rawimage, full=True) # find indices for radial values innerNoiseIndex = numpy.searchsorted(radialData, innerNoise) partRadIndex = numpy.searchsorted(radialData, particleRadius) outerLimitIndex = numpy.searchsorted(radialData, outerLimit) maxDiam = radialData[-1] innerVal = numpy.median(densityData[innerNoiseIndex:partRadIndex]) outerVal = numpy.median(densityData[outerLimitIndex:]) #print innerMean, outerMean, mrcfile if debug is True: print "%d:%d and %d:%d"%(innerNoiseIndex, partRadIndex, outerLimitIndex, densityData.shape[0]) print "inner density %.1f <> outer density %.1f"%(innerVal, outerVal) from matplotlib import pyplot pyplot.plot(radialData, densityData, 'ko-') pyplot.xlabel('Pixel Radius') pyplot.ylabel('Density') xmin, xmax, ymin, ymax = pyplot.axis() pyplot.axhline(y=innerVal, xmin=innerNoise/xmax, xmax=particleRadius/xmax, linewidth=2, color="blue", linestyle='-') #pyplot.axhline(y=innerVal, xmax=particleRadius, linewidth=2, color="cyan", linestyle='-') #print innerVal, radialData[1], particleRadius pyplot.axhline(y=outerVal, xmin=outerLimit/xmax, xmax=maxDiam/xmax, linewidth=2, color="orange", linestyle='-') #pyplot.axhline(y=outerVal, xmax=maxDiam, linewidth=2, color="orange", linestyle='-') #print outerVal, outerLimit, maxDiam pyplot.grid(True) pyplot.show() if innerVal > outerVal: apDisplay.printMsg("Contrast determined as WHITE particles on black background") return "whiteOnBlack" else: apDisplay.printMsg("Contrast determined as BLACK particles on white background") print "BLACK on white", mrcfile return "blackOnWhite"