예제 #1
0
파일: cappi_v2.py 프로젝트: scollis/bom_mds
def get_ray_s(ray, s, badval=1.31072000e+05):
	sar=sqrt(ray['xar']**2 + ray['yar']**2)
	ht=ray['zar']
	elements=list(mathematics.where_fits(s, sar))
	point={}
	if elements[0] ==len(sar)-1:
		point.update(dict([(var, badval) for var in set([ 'i_comp', 'j_comp', 'k_comp', 'VE','VR', 'CZ', 'RH', 'PH', 'ZD', 'SW'])& set(ray.keys())]))
		#point.update(dict([(var, badval) for var in set([ 'VE',])& set(ray.keys())]))
	else:
		#print elements
		if sar[elements[1]]-sar[elements[0]]!=0:
			w=1.0-abs((sar[elements]-s)/(sar[elements[1]]-sar[elements[0]]))
		else:
			w=[0.5,0.5]
		#print w
		my_ht=(ht[elements]*w).sum()
		if not(badval in ray['VE'][elements]):
			point.update(dict([(var,(ray[var][elements]*w).sum()) for var in [ 'i_comp', 'j_comp', 'k_comp', 'VE']]))
			#point.update(dict([(var,(ray[var][elements]*w).sum()) for var in [ 'VE']]))
		else:
			point.update(dict([(var,badval) for var in [ 'i_comp', 'j_comp', 'k_comp', 'VE']]))
			#point.update(dict([(var,badval) for var in [ 'VE']]))
		for var in set(['VR', 'CZ', 'RH', 'PH', 'ZD', 'SW'])& set(ray.keys()):
			if not(badval in ray[var][elements]):
				point.update({var:(ray[var][elements]*w).sum()})
			else:
				point.update({var:badval})
	return point, my_ht
예제 #2
0
def unit_vector(x,y,h,debug=False, **kwargs):
	"""
	Calculate the unit vector of the ray through a layer
	"""
	max_range=kwargs.get('max_range', 250.0*1000.0)
	d_range=kwargs.get('d_range', 200.0)
	s=sqrt(x**2+y**2)
	ele_ang=elev_of_scan(s,h)
	s_ray, h_ray=ray(linspace(0.0, max_range, int(max_range/d_range)), ele_ang)
	#This catch could be replaced by a try for better speed
	if s_ray.max() < s: s_ray, h_ray=ray(linspace(0.0, 1.5*max_range, int(1.5*max_range/d_range)), ele_ang)
	lh,rh=where_fits(s, s_ray)
	ds=s_ray[rh]-s_ray[lh]
	dh=h_ray[rh]-h_ray[lh]
	angle=arctan(dh/ds)
	k_comp=sin(angle)
	r_comp=cos(angle)
	i_comp=r_comp*x/sqrt(x**2+y**2)
	j_comp=r_comp*y/sqrt(x**2+y**2)
	return i_comp, j_comp, k_comp
예제 #3
0
def dhds(x,y,h,debug=False, **kwargs):
	"""
	Given an x and y displacement from the radar in Metres and and height above the earth return the gradient of the beam through that layer
	"""
	max_range=kwargs.get('max_range', 150.0*1000.0)
	d_range=kwargs.get('d_range', 500.0)
	s=sqrt(x**2+y**2)
	ele_ang=elev_of_scan(s,h)
	s_ray, h_ray=ray(linspace(0.0, max_range, int(max_range/d_range)), ele_ang)
	#This catch could be replaced by a try for better speed
	if s_ray.max() < s: s_ray, h_ray=ray(linspace(0.0, 1.5*max_range, int(1.5*max_range/d_range)), ele_ang)
	lh,rh=where_fits(s, s_ray)
	ds=s_ray[rh]-s_ray[lh]
	dh=h_ray[rh]-h_ray[lh]
	if debug: 
		print "elevation angle of scan=", ele_ang
		print ds
		print dh
		print rh
		print lh 
	return dh/ds
예제 #4
0
파일: cappi_v2.py 프로젝트: scollis/bom_mds
def make_stack_all(bundle,baz, bele, ele_array,s,az, ht_array, max_elev, badval=1.31072000e+05, order=0.5):
	abele=array(bele)
	#print len(ht_array)
	data_dict=dict([(var,[]) for var in get_ray_ht(bundle[0], ht_array[0])[0].keys()])
	cbaz=zeros([len(baz)], dtype=float)
	for i in range(len(baz)): #deal with the 360 degree problem
		poss=array([baz[i], (baz[i]+360.0), (baz[i]-360.0)])
		cbaz[i]=poss[where(abs(poss-az) ==abs(poss-az).min())[0]] 
	for i in range(len(ht_array)):
		if ((ele_array[i] > abele.min()) and (ele_array[i] < abele.max())):
			uniq_eles=unique(bele)
			my_ele=uniq_eles[list(mathematics.where_fits(ele_array[i], uniq_eles))]
			az1=cbaz[where(bele==my_ele[0])[0]][list(mathematics.where_fits(az, cbaz[where(bele==my_ele[0])[0]]))]
			az2=cbaz[where(bele==my_ele[1])[0]][list(mathematics.where_fits(az, cbaz[where(bele==my_ele[1])[0]]))]
			rays=[]
			rays.append(where(cbaz==az1[0])[0][where(abele[where(cbaz==az1[0])[0]]==my_ele[0])[0]][0])
			rays.append(where(cbaz==az1[1])[0][where(abele[where(cbaz==az1[1])[0]]==my_ele[0])[0]][0])
			rays.append(where(cbaz==az2[0])[0][where(abele[where(cbaz==az2[0])[0]]==my_ele[1])[0]][0])
			rays.append(where(cbaz==az2[1])[0][where(abele[where(cbaz==az2[1])[0]]==my_ele[1])[0]][0])
			small_bundle=array(bundle)[rays]
			small_az=cbaz[rays]
			small_ele=abele[rays]
			small_z=[]
			small_s=[]
			dat=[]
			vdat=[]
			for spray in small_bundle:
				ht_v, my_s=get_ray_ht(spray, ht_array[i])
				s_v, my_ht=get_ray_s(spray, s)
				dat.append(ht_v)
				small_s.append(my_s)
				vdat.append(s_v)
				small_z.append(my_ht)
			dat=array(dat)
			vdat=array(vdat)
			small_s=array(small_s)
			small_z=array(small_z)
			#print rays
			#print small_ele
			#print small_az
			#print dat
			if small_az[1]-small_az[0] !=0.0:
				wdown=1.0-abs((small_az[[0,1]]-az)/(small_az[1]-small_az[0]))
			else:
				wdown=[0.5,0.5]
			if small_az[3]-small_az[2] != 0.0:
				wup=1.0-abs((small_az[[2,3]]-az)/(small_az[3]-small_az[2]))
			else:
				wup=[0.5,0.5]
			if small_s[2]-small_s[0]!=0.0:
				w=1.0-abs((small_s[[0,2]]-s)/(small_s[2]-small_s[0]))
			else:
				w=[0.5,0.5]
			if small_z[2]-small_z[0]!=0.0:
				wz=1.0-abs((small_z[[0,2]]-ht_array[i])/(small_z[2]-small_z[0]))
			else:
				wz=[0.5,0.5]
			hwt=h_wts(ele_array[i], max_elev, order)
			#print hwt
			for var in dat[0].keys():
					#print 'here', [
				if not(badval in [dat[0][var], dat[1][var]]):
					#data_dict[var].append((wdown*dat[0:1][var]).sum())
					vdown=(wdown*array([dat[0][var], dat[1][var]])).sum()
				else:
					vdown=badval
				if not(badval in [dat[2][var], dat[3][var]]):
					#data_dict[var].append((wdown*dat[0:1][var]).sum())
					vup=(wdown*array([dat[2][var], dat[3][var]])).sum()
				else:
					vup=badval
				if not(badval in [vdown, vup]):
					horiz_int=(w*array([vdown,vup])).sum()
					#print "good val",p
					#p=p+1
				else:
					horiz_int=badval
					#print 'badval', p
					#p=p+1
				#VERTICAL
				if not(badval in [vdat[0][var], vdat[1][var]]):
					#data_dict[var].append((wdown*dat[0:1][var]).sum())
					vdown=(wdown*array([vdat[0][var], vdat[1][var]])).sum()
				else:
					vdown=badval
				if not(badval in [vdat[2][var], vdat[3][var]]):
					#data_dict[var].append((wdown*dat[0:1][var]).sum())
					vup=(wdown*array([vdat[2][var], vdat[3][var]])).sum()
				else:
					vup=badval
				if not(badval in [vdown, vup]):
					vert_int=(wz*array([vdown,vup])).sum()
					#print "good val",p
					#p=p+1
				else:
					vert_int=badval
					#print 'badval', p
					#p=p+1
				#data_dict[var].append(horiz_int)
				hbad=horiz_int==badval
				vbad=vert_int==badval
				if not(hbad) and not(vbad):
					data_dict[var].append(hwt*horiz_int+(1.0-hwt)*vert_int)
				elif hbad and not(vbad):
					data_dict[var].append(vert_int)
				elif vbad and not(hbad):
					data_dict[var].append(horiz_int)
				else:
					data_dict[var].append(badval)
		else:
			for var in data_dict.keys():
				data_dict[var].append(badval)
				#print "out of range", p
				#p=p+1
	#print data_dict['VE']
	return data_dict
예제 #5
0
파일: cappi_v2.py 프로젝트: scollis/bom_mds
def make_stack_horiz(bundle,baz, bele, ele_array,az, ht_array, badval=1.31072000e+05):
	abele=array(bele)
	p=0
	#print len(ht_array)
	data_dict=dict([(var,[]) for var in get_ray_ht(bundle[0], ht_array[0]).keys()])
	cbaz=zeros([len(baz)], dtype=float)
	for i in range(len(baz)): #deal with the 360 degree problem
		poss=array([baz[i], (baz[i]+360.0), (baz[i]-360.0)])
		cbaz[i]=poss[where(abs(poss-az) ==abs(poss-az).min())[0]] 
	for i in range(len(ht_array)):
		if ((ele_array[i] > abele.min()) and (ele_array[i] < abele.max())):
			uniq_eles=unique(bele)
			my_ele=uniq_eles[list(mathematics.where_fits(ele_array[i], uniq_eles))]
			az1=cbaz[where(bele==my_ele[0])[0]][list(mathematics.where_fits(az, cbaz[where(bele==my_ele[0])[0]]))]
			az2=cbaz[where(bele==my_ele[1])[0]][list(mathematics.where_fits(az, cbaz[where(bele==my_ele[1])[0]]))]
			rays=[]
			rays.append(where(cbaz==az1[0])[0][where(abele[where(cbaz==az1[0])[0]]==my_ele[0])[0]][0])
			rays.append(where(cbaz==az1[1])[0][where(abele[where(cbaz==az1[1])[0]]==my_ele[0])[0]][0])
			rays.append(where(cbaz==az2[0])[0][where(abele[where(cbaz==az2[0])[0]]==my_ele[1])[0]][0])
			rays.append(where(cbaz==az2[1])[0][where(abele[where(cbaz==az2[1])[0]]==my_ele[1])[0]][0])
			small_bundle=array(bundle)[rays]
			small_az=cbaz[rays]
			small_ele=abele[rays]
			dat=[]
			for spray in small_bundle:
				dat.append(get_ray_ht(spray, ht_array[i]))
			dat=array(dat)
			#print rays
			#print small_ele
			#print small_az
			#print dat
			if small_az[1]-small_az[0] !=0.0:
				wdown=1.0-abs((small_az[[0,1]]-az)/(small_az[1]-small_az[0]))
			else:
				wdown=[0.5,0.5]
			if small_az[3]-small_az[2] != 0.0:
				wup=1.0-abs((small_az[[2,3]]-az)/(small_az[3]-small_az[2]))
			else:
				wup=[0.5,0.5]
			if small_ele[2]-small_ele[0]!=0.0:
				w=1.0-abs((small_ele[[0,2]]-ele_array[i])/(small_ele[2]-small_ele[0]))
			else:
				w=[0.5,0.5]
			for var in dat[0].keys():
					#print 'here', [
				if not(badval in [dat[0][var], dat[1][var]]):
					#data_dict[var].append((wdown*dat[0:1][var]).sum())
					vdown=(wdown*array([dat[0][var], dat[1][var]])).sum()
				else:
					vdown=badval
				if not(badval in [dat[2][var], dat[3][var]]):
					#data_dict[var].append((wdown*dat[0:1][var]).sum())
					vup=(wdown*array([dat[2][var], dat[3][var]])).sum()
				else:
					vup=badval
				if not(badval in [vdown, vup]):
					data_dict[var].append((w*array([vdown,vup])).sum())
					#print "good val",p
					#p=p+1
				else:
					data_dict[var].append(badval)
					#print 'badval', p
					#p=p+1
		else:
			for var in data_dict.keys():
				data_dict[var].append(badval)
				#print "out of range", p
				#p=p+1
					
	#print data_dict['VE']
	return data_dict
예제 #6
0
def get_value_at_xyz(scan_list, x,y,z, var, **kwargs):
	"""
	scan_list: a list of scans 
	x,y,z: position to find value (interpolation position) in metres
	var: parameter to interpolate (eg VR, DZ,...)
	"""
	#Generate a array of elevations for the scan list
	#We use the minus onth (last) element in the scan as the radar has settled by then
	elevs=array([scan['Elev'][-1]  for scan in scan_list])
	#pick the above and below elevations
	s=sqrt(x**2+y**2)
	az=mathematics.vector_direction(x,y)
	baddata=kwargs.get('baddata',1.31072000e+05)
	my_elevation=propigation.elev_of_scan(s,z)
	elev_numbers=mathematics.where_fits(my_elevation, elevs)
	#for each elevation pick the ray on either side of the point
	if not(elev_numbers[0] == elev_numbers[1]):
		#we are neither at the top or bottom
		top_scan=scan_list[elev_numbers[1]]
		bottom_scan=scan_list[elev_numbers[0]]
		#Scan above the point ----------TOP ELEVATION-----------
		#work out what gates to use (ie range in S direction)
		sar=sqrt(top_scan['xar'][0,:]**2 + top_scan['yar'][0,:]**2)
		gates=mathematics.where_fits(s, sar)
		ds=sar[gates[1]]-sar[gates[0]]
		if ds==0.0:
			top_gates_comp=[0.5,0.5]
		else:
			top_gates_comp=[ abs(s-sar[gates[1]])/ds, abs(s-sar[gates[0]])/ds] 
		scan_order=top_scan['Azmth'].argsort()
		fits_order=mathematics.where_fits(az, top_scan['Azmth'][scan_order])
		ray_numbers=[scan_order[fits_order[0]], scan_order[fits_order[1]]]
		d_angle=top_scan['Azmth'][ray_numbers[1]]-top_scan['Azmth'][ray_numbers[0]]
		top_ang_comp=[abs(az-top_scan['Azmth'][ray_numbers[1]])/d_angle, abs(az-top_scan['Azmth'][ray_numbers[0]])/d_angle]
		if fits_order[0] == fits_order[1]:
			#we are near 360
			azd=az
			ray_numbers=[scan_order[-1], scan_order[0]]
			d_angle=top_scan['Azmth'][ray_numbers[1]]-(top_scan['Azmth'][ray_numbers[0]]-360.0)
			if az > d_angle: azd=az-360.0
			top_ang_comp=[abs(azd-top_scan['Azmth'][ray_numbers[1]])/d_angle,abs(azd-(top_scan['Azmth'][ray_numbers[0]]-360.0))/d_angle ]
		tp1=cond_lin_int(top_scan[var][ray_numbers[0], gates[0]], top_scan[var][ray_numbers[0], gates[1]], top_gates_comp)
		tp2=cond_lin_int(top_scan[var][ray_numbers[1], gates[0]], top_scan[var][ray_numbers[1], gates[1]], top_gates_comp)
		top_point=cond_lin_int(tp1, tp2, top_ang_comp)
		top_z=(top_scan['zar'][ray_numbers[0], gates[0]]*top_gates_comp[0]+ top_scan['zar'][ray_numbers[0], gates[1]]*top_gates_comp[1])
		#BOTTTTTTTTOOMMMMMMMMMMMM!
		sar=sqrt(bottom_scan['xar'][0,:]**2 + bottom_scan['yar'][0,:]**2)
		gates=mathematics.where_fits(s, sar)
		ds=sar[gates[1]]-sar[gates[0]]
		if ds==0.:
			bottom_gates_comp=[0.5,0.5]
		else:
			bottom_gates_comp=[ abs(s-sar[gates[1]])/ds, abs(s-sar[gates[0]])/ds] 
		scan_order=bottom_scan['Azmth'].argsort()
		fits_order=mathematics.where_fits(az, bottom_scan['Azmth'][scan_order])
		ray_numbers=[scan_order[fits_order[0]], scan_order[fits_order[1]]]
		d_angle=bottom_scan['Azmth'][ray_numbers[1]]-bottom_scan['Azmth'][ray_numbers[0]]
		bottom_ang_comp=[abs(az-bottom_scan['Azmth'][ray_numbers[1]])/d_angle, abs(az-bottom_scan['Azmth'][ray_numbers[0]])/d_angle]
		if fits_order[0] == fits_order[1]:
			#we are near 360
			azd=az
			ray_numbers=[scan_order[-1], scan_order[0]]
			d_angle=bottom_scan['Azmth'][ray_numbers[1]]-(bottom_scan['Azmth'][ray_numbers[0]]-360.0)
			if az > d_angle: azd=az-360.0
			bottom_ang_comp=[abs(azd-bottom_scan['Azmth'][ray_numbers[1]])/d_angle,abs(azd-(bottom_scan['Azmth'][ray_numbers[0]]-360.0))/d_angle ]
		bp1=cond_lin_int(bottom_scan[var][ray_numbers[0], gates[0]], bottom_scan[var][ray_numbers[0], gates[1]], bottom_gates_comp)
		bp2=cond_lin_int(bottom_scan[var][ray_numbers[1], gates[0]], bottom_scan[var][ray_numbers[1], gates[1]], bottom_gates_comp)
		bottom_point=cond_lin_int(bp1, bp2, bottom_ang_comp)
		bottom_z=(bottom_scan['zar'][ray_numbers[0], gates[0]]*bottom_gates_comp[0]+ bottom_scan['zar'][ray_numbers[0], gates[1]]*bottom_gates_comp[1])
		#calculate components
		d_z=top_z-bottom_z
		#print d_z
		z_comps=[abs(z-top_z)/d_z, abs(z-bottom_z)/d_z]
		my_point=cond_lin_int(bottom_point, top_point, z_comps)
		#bottom_point*z_comps[0]+top_point*z_comps[1]
	else:
		my_point=0.0
	if "az_range" in kwargs.keys():
		a1=kwargs['az_range'][0]
		a2=kwargs['az_range'][0]
		if a1 > a2: #we go through 360
			if not((az >= a1) or (az <=a2)): 
				my_point=baddata
		else:
			if not((az >= a1) or (az <= a2)):
				my_point=baddata
	return my_point