TLUSTY/gui/IDL/plotspec.pro
2026-07-21 22:25:14 +08:00

112 lines
4.4 KiB
Prolog

pro plotspec,ident,name,rv=rv,xrange=xr,lxrange=lxr,list_elem=elist,relative=relative,elem=ielem,_extra=pex,fwhm=fwhm,viewp=viewp,idsize=idsize
;
; made by Yeisson Osorio Feb 2020
;
if n_params() lt 2 then begin
print,"plotspec,ident,name,rv=rv,fwhm=fwhm,xrange=xr,elem=elem,idsize=idsize,_extra=pex"
print," ident = (real) if 0 just plot, if > 0 plot names of lines with weq >= iden (mAngs)"
print," name = (str) name of synspec output files (with no sufix)"
print," lxr = (real[2]) wavelength range to consider (default whole range)"
print," rv = (real) radial velocity shift"
print," elem = (str[]) name of the element(s) to plot (if empty plot all)"
print," list_elem = (output) list of visible elements"
return
endif
defsysv,'!gdl',exist=gdl ; 1 is GDL , 0 is IDL
if keyword_set(ielem) then elem=strtrim(ielem,2)+' '
if n_elements(xr) eq 0 then xr=[0,0]
if ident gt 0 and ~gdl then begin
if n_elements(viewp) eq 4 then vp=viewp else vp=[0.13,0.95,0.1,0.65]
set_viewport,vp[0],vp[1],vp[2],vp[3]
endif
if ident gt 0 and gdl then !p.position=[0.075,0.1,0.95,0.65]
if name eq 'fort' then begin
if keyword_set(relative) then rotin,'fort.7','fort.17','fort.10',/relative,wl,fl else readcol,'fort.7',wl,fl,format='(d,d)'
endif else begin
if keyword_set(relative) then readcol,name+'.10',wl,fl,format='(d,d)',/silent else readcol,name+'.7',wl,fl,format='(d,d)',/silent
endelse
wstart= xr[0] eq 0 ? min(wl) : xr[0]
wend = xr[1] eq 0 ? max(wl) : xr[1]
wl=reform(wl)
fl=reform(fl)
if n_elements(fwhm) eq 1 or n_elements(rv) eq 1 then fl=fconvol(wl,fl,wl,fwhm=fwhm,rv=rv)
plot,wl,fl,xr=xr,_extra=pex
if ident gt 0 then begin
if n_elements(extend) gt 0 then begin
if iplot ge 0 then begin
nln=n_elements(wl)
wla=fltarr(nln)
fla=wla
for i=0,nln-1 do begin wla(i)=wl(i) & fla(i)=fl(i) & endfor
endif
if n_elements(observ) eq 1 then begin
nobs=n_elements(wlobs)-1
if iplot ge 0 then beyond=wl(nln-1) lt wlobs(0) or wl(0) gt wlobs(nobs-1)
if iplot lt 0 then beyond=1
if extend lt 0 then begin
extend = -extend
beyond=1
endif
nln=n_elements(wlobs)
wla=fltarr(nln)
fla=wla
for i=0,nln-1 do begin wla(i)=wlobs(i) & fla(i)=flobs(i) & endfor
endif
endif
if keyword_set(lxr) then ra=lxr else ra=[wstart,wend]
ewl=ident
; the new version of synspec has fort.14 formatted the
; following way:
; 2 1 3721.935 H I -1.97 82259.250 1.06E-02 0.9 . 2 14
; and should be
; 3721.935 H I -1.97 82259.250 1.06E-02 0.9 . 2 14
;
if name eq 'fort' then begin
if file_test('fort.15') then begin
spawn,"sed 's/^\(.............\)\(....\) /\1 \2 ./g' fort.15 > f15"
spawn,'cat fort.12 f15 | sort -n -k 3,3 >| f12'
endif else spawn,"cp fort.12 f12"
endif else begin
if file_test(name+'.15') then begin
spawn,"sed 's/^\(.............\)\(....\) /\1 \2 ./g' "+name+".15 > f15"
spawn,'cat '+name+'.iden f15 | sort -n -k 3,3 >| f12'
endif else spawn,"cp "+name+".12 f12"
endelse
spawn,'rm tf12'
if n_elements(elem) ne 0 then begin
for ii=0, n_elements(elem)-1 do begin
kas=strsplit(elem[ii],' ',/extract)
if n_elements(kas) eq 1 then spawn,'grep "'+kas+'" f12 >> tf12' $
else spawn,'grep "'+kas[0]+'" f12 | grep "'+kas[1]+'" >> tf12'
endfor
spawn,'sort -n -k 3,3 tf12 > f12'
endif else begin
spc='" "'
spawn,"awk '{print $2"+spc+"$3}' f12 | sort -u > tf12"
readcol,'tf12',a,i,format='(a,a)',/silent
elist=a+' '+i
elist=strtrim(repstr(elist,'.',''),2)
endelse
line="awk '{if ($1 >= "+strtrim(min(ra),2)+" && $1 <= "+strtrim(max(ra),2)+") print $0 }' f12 > tf12"
spawn,line
if ident lt 1 then N=0 else N=2
lineid_select,'tf12',wli,lid,wst,st,ew,ewlim=ewl,range=ra,N=N
if n_elements(rv) eq 1 then $
wli=wli*(1.-rv/2.9977925e5)
if keyword_set(pex) then begin
dum=where(strpos(tag_names(pex),'CO') ne -1)
if dum ne -1 then dum=pex.(dum) else dum=!p.color
endif
lineid_annot,wla,fla,wli,ew,lid,wst,charsize=idsize,extend=extend,col=dum
if ~gdl then set_viewport
endif
end