Ejemplo n.º 1
0
def getFirstShellWater(TrajName, LDUpperCuts, FirstShellCut = 6.0, Prefix = 'LD_wm', target_dir = os.getcwd(),
					   frame_start = 0, frame_stop = 100, stepfreq = 100):
	'''
	Calculates the local densities and first shell waters
	for each monomer for several different cutoffs. 
	Also generates the monomer local density distribution.
	'''
	# Get un-mapped trajectory
	Trj = getPickle(TrajName)
	

	## Parse trajectory and make frame stepper
	init = Trj[0]
	BoxL = Trj.FrameData['BoxL']; BoxL = BoxL[0]
	FrameRange = range(frame_start, frame_stop, stepfreq)
	NFrames = len(FrameRange)
	AtomTypes = Trj.AtomTypes
	
	## Make Local density count array
	NCuts = len(LDUpperCuts)
	N_mon = len(np.where(AtomTypes == 3)[0])
	N_water = len(np.where(AtomTypes == 2)[0])
	LD_mon = np.zeros([N_mon*NFrames,NCuts], np.float64)
	FirstShellWaters = np.zeros(N_mon*NFrames, np.float64)
	
	
	## Precompute LD coefficients
	coeff = np.zeros([NCuts, 4], np.float64)
	for i, cut in enumerate(LDUpperCuts):
		coeff[i] = calcCoeff(cut)
			
	pb = sim.utility.ProgressBar(Text = 'Processing frame by frame...', Steps = NFrames)

	# Frame stepping
	count = 0
	for frame in FrameRange:
		Pos = Trj[frame]
		
		# Call fortran subroutine for per-frame computation
		fsw = np.zeros(N_mon, np.float64)
		ld = np.zeros([N_mon, NCuts], np.float64)
		(ld, fsw) = fortlib.find_firstshellwaters(ld = ld, fsw = fsw, pos = Pos, atomtypes = AtomTypes, n_water = N_water,
												 lduppercuts = LDUpperCuts, firstshellcut = FirstShellCut, 
												 coeff = coeff, boxl = BoxL, atomtypedefs = atomtypedefs)
		
		## Average 
		#LD_mon += ld
		#FirstShellWaters += fsw										 										 
		
		## Per-frame
		FirstShellWaters[count:count+N_mon] = fsw
		for j in range(NCuts):
			LD_mon[count:count+N_mon,j] = ld[:,j]
		count += N_mon
		
		pb.Update(frame/stepfreq)
		
	
	#LD_mon /= NFrames
	#FirstShellWaters /= NFrames
	
	# pickling data
	pickleName = os.path.join(target_dir, Prefix + '.pickle')
	pickle.dump((LDUpperCuts, LD_mon, FirstShellWaters), open(pickleName, 'w'))