function euler_rot_matrix,ev,rot_angle=rot_angle,set_angle=sa,parameters=par
if arg_present(par) and size(/type,par) ne 8 then $
par = {func:'euler_rot_matrix',eulpar:[1d,0,0,0]}
if keyword_set(par) then ev=par.eulpar
rot = dblarr(3,3)
e=double(ev)
if n_elements(ev) eq 3 then begin
if n_elements(sa) eq 1 then begin
length = sqrt(total(e^2))
if length gt 0 then e= e / length
e = e * sind(sa/2d)
endif
e0 = sqrt( 1 - total(e^2) )
e1 = e[0]
e2 = e[1]
e3 = e[2]
endif else begin
ev /= sqrt(total(ev^2))
e0 = ev[0]
e1 = ev[1]
e2 = ev[2]
e3 = ev[3]
endelse
rot[0,0] = e0^2+e1^2-e2^2-e3^2
rot[0,1] = 2*(e1*e2 + e0*e3)
rot[0,2] = 2*(e1*e3 - e0*e2)
rot[1,0] = 2*(e1*e2 - e0*e3)
rot[1,1] = e0^2-e1^2+e2^2-e3^2
rot[1,2] = 2*(e2*e3 + e0*e1)
rot[2,0] = 2*(e1*e3 + e0*e2)
rot[2,1] = 2*(e2*e3 - e0*e1)
rot[2,2] = e0^2-e1^2-e2^2+e3^2
rot_angle = acos(e0^2-e1^2-e2^2-e3^2)*180/!dpi * sign(total(e*ev))
return,set_zeros(rot,3e-16)
end