pro thm_sst_convert_units,data,units,scale=scale ;so scale gets passed back even if units = data.units_name scale = 1.d if n_params() eq 0 then return if strupcase(units) eq strupcase(data.units_name) then return ;Previous version only checks least significant bit, doesn't clearly handle ambiguous cases. ;atten = data.atten ? 1/64. : 1. ; ;New version checks all bits, accounts for issues due to stuck attenuator on THD atten = thm_sst_atten_scale(data.atten,dimen(data.data)) denergy = data.denergy energy = data.energy ; in eV (ne,nbins) n_e = data.nenergy ; number of energies nbins=data.nbins ; number of bins gf = data.geom_factor * atten * data.gf * denergy ;*data.eff dt = data.integ_t ;dt_arr=data.dt_arr ; #dt*#anodes per bin for rate and dead time corrections mass = data.mass ;dead = data.dead ; dead time, (sec) A111 case strupcase(data.units_name) of 'COMPRESSED' : scale = 1. 'COUNTS' : scale = 1. ;'RATE' : scale = dt ;*dt_arr ;'EFLUX' : scale = gf ;'FLUX' : scale = gf * energy ;'DF' : scale = gf * energy^2 * 2./mass/mass*1e5 else: begin dprint,'Unknown starting units: ',data.units_name return end endcase ; convert to COUNTS tmp=data.data if strupcase(data.units_name) eq 'COMPRESSED' then tmp=cc3d(byte(tmp)) tmp = scale * tmp ; take out dead time correction ;if strupcase(data.units_name) ne 'COUNTS' and strupcase(data.units_name) ne 'RATE' and strupcase(data.units_name) ne 'COMPRESSED' then $ ; tmp = round(dt*tmp/(1.+tmp*dead/dt_arr)) de_e = denergy/energy scale = 0 case strupcase(units) of 'COMPRESSED' : scale = 1. 'COUNTS' : scale = 1. 'RATE' : scale = 1./dt 'EFLUX' : scale = 1./dt / gf * energy 'FLUX' : scale = 1./dt / gf 'DF' : scale = 1./dt / gf / (energy * 2./mass/mass*1e5 ) else: begin message,'Undefined units: '+units return end endcase ;; dead time correct data if not counts or rate ;if strupcase(units) ne 'COUNTS' and strupcase(units) ne 'RATE' and strupcase(units) ne 'COMPRESSED' then begin ; denom = 1.- dead/dt_arr*tmp/dt ;; print,min(denom) ; void = where(denom lt .1,count) ; if count gt 0 then begin ; print,min(denom,ind) ; denom = denom>.1 ; print,' Error: convert_peace_units dead time error.' ; print,' Dead time correction limited to x10 for ',count,' bins' ; print,' Time= ',time_to_str(data.time,/msec) ; endif ; tmp2 = tmp/denom ;endif else tmp2 = tmp ; scale to new units data.units_name = units if find_str_element(data,'ddata') ge 0 then data.ddata = scale * tmp2^.5 ;if strupcase(units) eq 'COMPRESSED' then begin ; ind=where(tmp2 ge 0.,npts) ; ntmp=n_elements(tmp2) ; if npts gt 0 then begin ; for i=0,npts do begin ; minval=min(abs(cc3d-tmp2(ind(i))),jj) ; tmp2(ind(i))=jj ; endfor ; endif ; if npts ne ntmp then begin ; tmp3=intarr(ntmp) ; if npts gt 0 then tmp3(ind)=1 ; ind2=where(tmp3 eq 0) ; tmp2(ind2)=255 ; endif ;endif data.data = scale * tmp ;2 return end