pro grid_data_2d,opt,data,x,y,dmin,dmax,nmin,x1,x2,dx,y1,y2,dy,$ xg,yg,data_av,data_sd,data_sdm,num_obs,num_good,freq ;------------------------------------------------------------------------------------------- ; Routine generates a uniform 2-D gridding (e.g., a tim-height cross section, or ; a lat-lon map) from the input data. ; ; Input: ; opt......1 = data is a matrix, fltarr(x,y), where data(i,j) corresponds to the location x(i) & y(j) ; 2 = data is a vector, fltarr(n), where data(i) corresponds to the location x(i) & y(i) ; ; data.....the data values, fltarr(x,y) or fltarr(n) ; x........the x-axis values dorresponding to data (e.g., longitude or time) ; y........the y-axis values (e.g., latitude or height) ; dmin.....minimum data value to use ; dmax.....maximum data value to use ; nmin.....minimum number of data points in a cell to generate results ; ; x1.......start value for x grid ; x2.......end value ; dx.......interval for x grid ; y1.......start value for y grid ; y2.......end value ; dy.......interval for y grid ; ; Output: ; xg..........the x-axis grid values ; yg..........the y-axis grid values ; data_av.....the data averages on the uniform grid, fltarr(xg,yg) (data units) ; data_sd.....the data standard deviationson the uniform grid, fltarr(xg,yg) (data units) ; data_sdm....the data standard deviation of the mean on the uniform grid, fltarr(xg,yg) (data units) ; num_obs.....number of observations in each cell, fltarr(xg,yg) ; num_good....number of observations with dmin < data < dmin in each cell, fltarr(xg,yg) ; freq........frequency of observations with dmin < data < dmin, fltarr(xg,yg) (%) ; ; Source: Mark Hervig, GATS Inc. ;------------------------------------------------------------------------------------------- ;- Define the x & y grids, and output variables dx2 = dx*0.5 nxg = round( (x2 - x1) / float(dx) ) + 1 xg = findgen(nxg) * dx + x1 dy2 = dy*0.5 nyg = round( (y2 - y1) / float(dy) ) + 1 yg = findgen(nyg) * dy + y1 data_av = fltarr(nxg,nyg) data_sd = fltarr(nxg,nyg) data_sdm = fltarr(nxg,nyg) num_obs = fltarr(nxg,nyg) num_good = fltarr(nxg,nyg) ;- Loop over the grid in X & Y ; Data is a uniform matrix if (opt eq 1) then begin for i = 0,nxg-1 do begin kx = where(x gt xg(i)-dx2 and x le xg(i)+dx2,nkx) for j = 0,nyg-1 do begin ky = where(y gt yg(j)-dy2 and y le yg(j)+dy2,nky) if (nkx gt 0 and nky gt 0) then begin tmp1 = data(kx,*) tmp = tmp1(*,ky) num_obs(i,j) = nkx*nky kg = where(tmp ge dmin and tmp le dmax,nkg) num_good(i,j) = nkg if (nkg ge nmin) then begin data_av( i,j) = mean(tmp(kg)) if (nkg gt 1) then $ data_sd( i,j) = stddev(tmp(kg)) data_sdm(i,j) = data_sd(i,j) / sqrt(nkg) endif endif endfor endfor endif ; Data is a vector if (opt eq 2) then begin for i = 0,nxg-1 do begin for j = 0,nyg-1 do begin k = where(x gt xg(i)-dx2 and x le xg(i)+dx2 and $ y gt yg(j)-dy2 and y le yg(j)+dy2,nk) num_obs(i,j) = nk if (nk gt 0) then begin tmp = data(k) kg = where(tmp ge dmin and tmp le dmax,nkg) num_good(i,j) = nkg if (nkg ge nmin) then begin data_av( i,j) = mean(tmp(kg)) if (nkg gt 1) then $ data_sd( i,j) = stddev(tmp(kg)) data_sdm(i,j) = data_sd(i,j) / sqrt(nkg) endif endif endfor endfor endif ;- Frequency of observations with dmin < data < dmax freq = 100 * num_good / num_obs k = where(num_obs le 0,nk) if (nk gt 0) then freq(k) = 0. ;- done return end