pro transform_velocity, vel,theta,phi,deltav, $
VX=vx,VY=vy,VZ=vz,sx=sx,sy=sy,sz=sz
c = cos(!dpi/180.*theta)
sx = c * cos(!dpi/180.*phi)
sy = c * sin(!dpi/180.*phi)
sz = sin(!dpi/180.*theta)
vx = (vel*sx) - deltav(0)
vy = (vel*sy) - deltav(1)
vz = (vel*sz) - deltav(2)
vxxyy = vx*vx + vy*vy
vel = sqrt(vxxyy + vz*vz)
phi = 180./!dpi*atan(vy,vx)
phi = phi + 360.d*(phi lt 0)
theta = 180./!dpi*atan(vz/sqrt(vxxyy))
return
end
function convert_vframe,tdata,vframe $
,EVALUES = evalues $
,e_shift = e_shift $
,sc_pot = sc_pot $
,INTERPOLATE = interpolate,EXTRAPOLATE = extrapolate $
,ethresh=ethresh,dfdv=dfdv,bins=bins
if tdata.valid eq 0 then begin
dprint, 'Invalid Data'
return,tdata
endif
if not keyword_set(e_shift) then e_shift = 0.
str_element,tdata,'e_shift',e_shift
data = tdata
data.energy =data.energy+e_shift
if ndimen(evalues) ne 1 then $
evalues = average(tdata.energy,2)
data = conv_units(data,'df')
o_data= data.data
o_energy = data.energy
if n_params() lt 2 then vframe = data.vsw
if not keyword_set(sc_pot) then sc_pot = 0.
str_element,data,'sc_pot', sc_pot
energy = data.energy - sc_pot
bad = where(data.energy lt sc_pot*1.3,nbad)
if nbad ne 0 then data.data[bad] = !values.f_nan
vel = velocity(energy,data.mass)
theta = data.theta
phi = data.phi
if keyword_set(ethresh) and keyword_set(dfdv) eq 0 then begin
if keyword_set(bins) then ind = where(bins) else ind = indgen(data.nbins)
dfavg = total(o_data(*,ind),2,/nan)/total(finite(o_data(*,ind)),2)
vavg = total(vel(*,ind),2,/nan)/total(finite(vel(*,ind)),2)
dfdv = deriv(vavg,alog(dfavg))
endif
transform_velocity,vel,theta,phi,vframe,sx=sx,sy=sy,sz=sz
data.energy = velocity(/inverse,vel,data.mass)
data.theta = theta
data.phi = phi
if keyword_set(interpolate) then begin
for i=0,data.nbins-1 do begin
df_temp = data.data[*,i]
th_temp = data.theta[*,i]
ph_temp = data.phi[*,i]
nrg = data.energy[*,i]
w = where(finite(df_temp) eq 0,count)
if count ne 0 then df_temp[w] = 0
ind = where(df_temp gt 0,count)
if count gt 1 then begin
df_temp = interp(alog(df_temp[ind]),nrg[ind],evalues)
th_temp = interp(th_temp[ind],nrg[ind],evalues)
ph_temp = interp(ph_temp[ind],nrg[ind],evalues)
endif
if not keyword_set(extrapolate) then begin
w = where(evalues lt min(nrg),count)
if count ne 0 then df_temp[w] = !values.f_nan
endif
data.data[*,i] = exp(df_temp)
data.theta[*,i] = th_temp
data.phi[*,i] = ph_temp
endfor
data.energy = evalues # replicate(1.,data.nbins)
if keyword_set(Ethresh) then begin
ind = where(tdata.energy gt ethresh,nind)
if nind gt 0 then begin
bdfdv = dfdv # replicate(1.,data.nbins)
o_data = o_data*(1.+(sx*vframe(0)+sy*vframe(1)+sz*vframe(2))*bdfdv )
data.data(ind) = o_data(ind)
endif
endif
endif
return,data
end