예제 #1
0
	def getParticlesPerCycle(self, stackfile):
		"""
		it more efficient to process X particles and write them to disk rather than
		  write each particle to disk each time.
		particles are read using a memory map (numpy.memmap), so we can pretend to
		  continuously read all into memory
		"""
		### amount of free memory on machine (converted to bytes)
		freememory = mem.free()*1024
		self.message("Free memory: %s"%(apDisplay.bytes(freememory)))
		### box size of particle
		self.boxsize = apFile.getBoxSize(stackfile)[0]
		self.message("Box size: %d"%(self.boxsize))
		### amount of memory used per particles (4 bytes per pixel)
		memperpart = self.boxsize**2 * 4.0
		self.message("Memory used per part: %s"%(apDisplay.bytes(memperpart)))
		### maximum number particles that fit into memory
		maxpartinmem = freememory/memperpart
		self.message("Max particles in memory: %d"%(maxpartinmem))
		### number particles to fit into memory
		partallowed = int(maxpartinmem/20.0)
		self.message("Particles allowed in memory: %d"%(partallowed))
		### number particles in stack
		numpart = self.params['last']
		if numpart > partallowed:
			numcycles = math.ceil(numpart/float(partallowed))
			stepsize = int(numpart/numcycles)
		else:
			numcycles = 1
			stepsize = numpart
		self.message("Particle loop num cycles: %d"%(numcycles))
		self.message("Particle loop step size: %d"%(stepsize))
		return stepsize
 def initValues(self, stackfile, numrequest=None):
         ### check for stack
         if not os.path.isfile(stackfile):
                 apDisplay.printError("stackfile does not exist: "+stackfile)
         ### amount of free memory on machine (converted to bytes)
         self.freememory = mem.free()*1024
         self.message("Free memory: %s"%(apDisplay.bytes(self.freememory)))
         ### box size of particle
         self.boxsize = apFile.getBoxSize(stackfile)[0]
         self.message("Box size: %d"%(self.boxsize))
         ### amount of memory used per particles (4 bytes per pixel)
         self.memperpart = self.boxsize**2 * 4.0
         self.message("Memory used per part: %s"%(apDisplay.bytes(self.memperpart)))
         ### maximum number particles that fit into memory
         self.maxpartinmem = self.freememory/self.memperpart
         self.message("Max particles in memory: %d"%(self.maxpartinmem))
         ### number particles to fit into memory
         self.partallowed = int(self.maxpartinmem/20.0)
         self.message("Particles allowed in memory: %d"%(self.partallowed))
         ### number particles in stack
         numpart = apFile.numImagesInStack(stackfile)
         if self.numpart is None or self.numpart > numpart:
                 self.numpart = numpart
         if numrequest is not None and self.numpart > numrequest:
                 self.numpart = numrequest
         self.message("Number of particles in stack: %d"%(self.numpart))
         if self.numpart > self.partallowed:
                 numchucks = math.ceil(self.numpart/float(self.partallowed))
                 self.stepsize = int(self.numpart/numchucks)
         else:
                 numchucks = 1
                 self.stepsize = self.numpart
         self.message("Particle loop num chunks: %d"%(numchucks))
         self.message("Particle loop step size: %d"%(self.stepsize))
예제 #3
0
def centerParticles(stack, mask=None, maxshift=None):
	apDisplay.printMsg("Centering stack: "+stack)

	stacksize = apFile.stackSize(stack)
	freemem = mem.free()*1024 #convert memory to bytes
	apDisplay.printMsg("file is %s, mem is %s"
		%(apDisplay.bytes(stacksize), apDisplay.bytes(freemem)))
	### from EMAN FAQ: need to have at least 3x as much ram as the size of the file
	memsize = freemem/3.0
	numfrac = int(math.ceil(stacksize/memsize))

	apDisplay.printMsg("file is %s, will be split into %d fractions"
		%(apDisplay.bytes(stacksize), numfrac))

	for i in range(numfrac):
		emancmd = "cenalignint "+stack
		if numfrac > 1:
			emancmd += " frac="+str(i)+"/"+str(numfrac)
		if mask is not None:
			emancmd += " mask="+str(mask)
		if maxshift is not None:
			emancmd += " maxshift="+str(maxshift)
		apEMAN.executeEmanCmd(emancmd, verbose=False, showcmd=True)

	return
        def _checkMemLeak(self):
                """
                unnecessary code for determining if the program is eating memory over time
                """
                ### Memory leak code:
                #self.stats['memlist'].append(mem.mySize()/1024)
                self.stats['memlist'].append(mem.active())
                memfree = mem.free()
                swapfree = mem.swapfree()
                minavailmem = 64*1024; # 64 MB, size of one image
                if(memfree < minavailmem):
                        apDisplay.printWarning("Memory is low ("+str(int(memfree/1024))+"MB): there is probably a memory leak")

                if(self.stats['count'] > 15):
                        memlist = self.stats['memlist'][-15:]
                        n       = len(memlist)
                        
                        gain    = (memlist[n-1] - memlist[0])/1024.0
                        sumx    = n*(n-1.0)/2.0
                        sumxsq  = n*(n-1.0)*(2.0*n-1.0)/6.0
                        sumy = 0.0; sumxy = 0.0; sumysq = 0.0
                        for i in range(n):
                                value  = float(memlist[i])/1024.0
                                sumxy  += float(i)*value
                                sumy   += value
                                sumysq += value**2
                        ###
                        stdx  = math.sqrt(n*sumxsq - sumx**2)
                        stdy  = math.sqrt(n*sumysq - sumy**2)
                        rho   = float(n*sumxy - sumx*sumy)/float(stdx*stdy+1e-6)
                        slope = float(n*sumxy - sumx*sumy)/float(n*sumxsq - sumx*sumx)
                        memleak = rho*slope
                        ###
                        if(self.stats['memleak'] > 3 and slope > 20 and memleak > 512 and gain > 2048):
                                apDisplay.printWarning("Memory leak of "+str(round(memleak,2))+"MB")
                        elif(memleak > 32):
                                self.stats['memleak'] += 1
                                apDisplay.printWarning("substantial memory leak "+str(round(memleak,2))+"MB")
                                print "(",str(n),round(slope,5),round(rho,5),round(gain,2),")"