;+ ; Change the size of an existing data container. ; ;
If new channels are added to the end of an existing data ; container, they are filled with the blanked value (not a number, ; NAN) unless the /zero flag is set (in which case they are replaced ; with zeros). If /beginning is set then the extra channels are added ; to the beginning of the data and reference_channel value is adjust ; accordingly. ; ;
This only works for spectrum data containers where the x-axis is ; linear in frequency and so the x-axis values are always ; well-determined when extending a spectrum data container. ; ; @param dc {in}{out}{required}{type=data container} The data ; container to resize. ; @param newsize {in}{required}{type=integer} The new number of ; channels. This must be > 0. ; @keyword zero {in}{optional}{type=boolean} If set, any new channels ; are filled with zero instead of NAN. ; ; @examples ;
; ; double the size of dc, new channels are filled with NAN ; nels = data_valid(dc) ; dcresize,dc,nels*2 ; ; back to its original size ; dcresize,dc,nels ; ; add 100 channels, fill with 0.0 ; dcresize,dc,(nels+100),/zero ; ; to use this, or any toolbox function, on a DC in the !g ; ; structure, do this ; dc = !g.s[0] ; nels = data_valid(dc) ; dcresizse,dc,nels+200 ; @version $Id$ ;- pro dcresize,dc,newsize,zero=zero,beginning=beginning compile_opt idl2 if n_params() ne 2 then begin usage,'dcresize' return endif nels = data_valid(dc,name=name) if name ne "SPECTRUM_STRUCT" then begin message,"resize only works with spectrum data containers",/info return endif if nels le 0 then begin message,'dc is empty or invalid, can not continue',/info return endif thisNewsize = round(newsize) if thisNewsize le 0 then begin message,'newsize must be > 0',/info return endif if thisNewsize eq nels then return if thisNewsize lt nels then begin *dc.data_ptr = (*dc.data_ptr)[0:(thisNewsize-1)] endif else begin newvalue = !values.f_nan if keyword_set(zero) then newvalue = 0.0 newchans = make_array(thisNewsize - nels, /float, value=newvalue) if keyword_set(beginning) then begin *dc.data_ptr = [newchans, *dc.data_ptr] dc.reference_channel = dc.reference_channel + n_elements(newchans) endif else begin *dc.data_ptr = [*dc.data_ptr, newchans] endelse endelse return end