;+ ;Procedure: ; thm_part_slice1d.pro ; ;Purpose: ; Produce line plots from 2D particle velocity slices along various orientations. ; ;Calling Sequence: ; thm_part_slice1d, slice, [,xcut=xcut | ,ycut=ycut | ,vcut=vcut | ,ecut=ecut ] ; [,angle=angle] [,/overplot] [,data=data] [,window=window] ; ;Input: ; slice: slice structure from thm_part_slice2d ; xcut: value at which to align a linear cut along the x axis (vertical slice) ; ycut: value at which to align a linear cut along the y axis (horizontal slice) ; (defaults to ycut=0 if xcut, ycut, vcut, and ecut not set) ; vcut: value at which to align a radial cut (km/s) ; ecut: value at which to align a radial cut (eV) ; angle: value (degrees) to rotate a cut by (clockwise) if using xcut or ycut ; overplot: flag to add trace to the previous plot ; window: index of plotting window to be used ; ; *IDL graphics keywords may also be used; see IDL documentation for usage. ; (e.g. color, psym, linestyle) ; ;Output: ; data: set this keyword to a named variable to return a structure ; containing the data for the specified 1D slice ; ;Notes: ; See also: thm_crib_part_slice1d.pro ; ; ;$LastChangedBy: aaflores $ ;$LastChangedDate: 2014-06-20 18:44:58 -0700 (Fri, 20 Jun 2014) $ ;$LastChangedRevision: 15400 $ ;$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/trunk/projects/themis/spacecraft/particles/slices/thm_part_slice1d.pro $ ; ;- pro thm_part_slice1d, slice, $ ; output type keywords xcut=x0, ycut=y0, angle=angle, $ vcut=v0, ecut=e0, $ ; plotting keywords xrange=xrange0, $ yrange=yrange0, $ overplot=overplot, $ window=window, $ ; other data=data, $ error=error, $ _extra=_extra compile_opt idl2, hidden error = 1b if ~is_struct(slice) then begin dprint, dlevel=1, 'Input must be slice structure from thm_part_slice2d' return endif ;Construct the set of points the data will be interpolated to. if ~undefined(v0) or ~undefined(e0) then begin ;Get values & labels for radial cuts thm_part_slice1d_r, slice, vin=v0, ein=e0, $ xout=x, yout=y, xaxis=xaxis, xtitle=xtitle, $ error=sub_error endif else begin if keyword_set(slice.rlog) then begin dprint, dlevel=1, 'Linear 1D slices not yet implemented for radial log plots' return endif ;Get values & labels for linear cuts thm_part_slice1d_xy, slice, xin=x0, yin=y0, angle=angle, $ xout=x, yout=y, xaxis=xaxis, xtitle=xtitle, $ error=sub_error endelse ;handle error from helper routine if keyword_set(sub_error) then return ;Get indices to the slice data corresponding to the points determined above n = n_elements(slice.xgrid) xi = interpol( findgen(n), slice.xgrid, x ) yi = interpol( findgen(n), slice.ygrid, y ) ;Ensure equal elements in x and y arrays ; -important for linear cuts, if n_elements(xi) eq 1 then xi = replicate(xi,n_elements(y)) if n_elements(yi) eq 1 then yi = replicate(yi,n_elements(x)) if n_elements(xi) ne n_elements(yi) then begin dprint, dlevel=0, 'Error generating coordinates for 1D slice.' return endif ;Remove indices outside the plot's range ; -primarily here to remove excess points for rotated linear cuts idx = where( xi ge 0 and xi le n and $ yi ge 0 and yi le n ,c ) if c gt 0 then begin xi = xi[idx] yi = yi[idx] xaxis = xaxis[idx] endif else begin dprint, dlevel=1, 'The requested 1D slice does not intersect the plot." return endelse ;Interpolate at the calculated set of indicies ; (this is the data that will be plotted) line = reform( interpolate(slice.data, xi, yi) ) ;Annotations for plotting title = 'th'+strlowcase(slice.probe)+' ' + $ strjoin(slice.dist,'/') + $ ' ('+strupcase(slice.rot)+') ' + $ time_string(slice.trange[0]) + $ ' -> '+strmid(time_string(slice.trange[1]),11,8) xtitle = xtitle ;determined above ytitle = units_string(strlowcase(slice.units)) xrange = keyword_set(xrange0) ? xrange0:minmax(xaxis) yrange = keyword_set(yrange0) ? yrange0:slice.zrange ;Plot ; -graphics keywords are passed through _extra ; keyword to plot/oplot ; -keywords passed through _extra will supercede ; keywords explicitly named in a call (IDL feature) thm_part_slice1d_plot, xaxis, line, $ overplot=overplot, $ title=title, $ xtitle=xtitle, $ ytitle=ytitle, $ xrange=xrange, $ yrange=yrange, $ window=window, $ _extra=_extra ;Return data if requested if arg_present(data) then begin data = {x:xaxis, $ y:line, $ xrange: xrange, $ yrange: yrange, $ xtitle: xtitle, $ ytitle: ytitle, $ title: title} endif error = 0b return end