Документ взят из кэша поисковой машины. Адрес оригинального документа : http://hea-www.harvard.edu/PINTofALE/pro/linespec_em.pro
Дата изменения: Fri Jan 26 01:46:41 2001
Дата индексирования: Tue Oct 2 01:31:06 2012
Кодировка:
function linespec_em,atom,wmin=wmin,wmax=wmax,nbin=nbin,wlog=wlog,ww=ww,$
ikev=ikev,fstr=fstr,tlog=tlog,EM=EM, _extra=e
;+
;function linespec_em
; returns a spectrum of atomic lines for a 1-T EM. output will be in
; units of [erg,ph]/s/cm^2/[keV,Ang]
;
; if IKEV is set, WMIN,WMAX,WW must be input in [keV] and the
; output will have units .../keV
;
; if NOPH is set, output will have units of erg/...
;
; if EFFAR and WVLAR are not set, output will have units of .../cm^2
;
;syntax
; spec=linespec_em(atom,wmin=wmin,wmax=wmax,nbin=nbin,/wlog,ww=ww,/ikev,$
; tlog=tlog,EM=EM,fstr=fstr,pres=pres,logP=logP,n_e=n_e,desig=desig,$
; econf=econf,/allah,dbdir=dbdir,abund=abund,effar=effar,wvlar=wvlar,
; /noph,chifil=chifil,chidir=chidir,eqfile=eqfile,verbose=verbose)
;
;parameters
; atom [INPUT; default: all] element(s) whose line intensities are
; to be read.
; * can specify ionic state (e.g., 'FeXX')
; * may be an array (e.g., ['He', 'c 5', 'N V', 's_8'])
;
;keywords
; wmin [I/O] minimum value of wavelength range
; * default on input is 1.23985A (10 keV)
; wmax [I/O] maximum value of wavelength range
; * default on input is 900A
; nbin [I/O] number of bins in spectrum
; * default on input is 100
; wlog [I/O] if set, binning will be logarithmic
; ww [I/O] if set as an array on input, assumed to be the
; bin boundaries --
; * NBIN will be set to n_elements(WW)-1 on output
; * WMIN will be set to min([WW(0),WW(nbin)]) on output
; * WMAX will be set to max([WW(0),WW(nbin)]) on output
; ikev [INPUT] if set, WMIN,WMAX,WW are all assumed to be in keV
; * it is also caught at this stage and is not passed down to
; LINEFLX
; fstr [I/O] if defined on input, will return all the spectral
; lines info LINE_INT,LOGT,WVL,Z,ION,DESIG,ECONF in that order
; in a structure.
; * ion balance is included in LINE_INT, but abundances
; are not.
; * if defined as a structure on input, RD_LINE and FOLD_IONEQ
; will not be called, so use with caution!
; tlog [INPUT] log10(T [K]) at which EM is defined
; EM [INPUT] Emission Measure [cm^-5; if not, output units
; must be suitably mangled]
; _extra [INPUT] allows specifying defined keywords to subroutines
; called by this program
; * RD_LINE: PRES, LOGP, N_E, DESIG, ECONF, ALLAH, DBDIR
; * FOLD_IONEQ: CHIFIL
; * RD_IONEQ: CHIDIR, EQFILE
; * LINEFLX: DEM, ABUND, EFFAR, WVLAR, NOPH
;
;subroutines
; RD_LINE [KILROY, SYMB2ZION [LAT2ARAB]]
; FOLD_IONEQ [WHEE, GETLOCMAX, RD_IONEQ [READ_IONEQ (CHIANTI)]]
; LINEFLX [WHEE]
; HASTOGRAM [KILROY]
;
;history
; vinay kashyap (Apr97; modified from LINESPEC.PRO)
; speeded up spectrum accumulation by adding call to HASTOGRAM;
; speeded up cycling thru lines by modifying DEM (VK;Jan98)
; modified ion balance calcs (VK; 99May)
; changed keyword KEV to IKEV; DESIG and ECONF must be explicitly set
; to 0 to avoid reading them in in RD_LINE; streamlined IKEV behavior
; (VK; JanMMI)
;-

; usage
if n_params(0) eq 0 then begin
print,'Usage: spec=linespec_em(atom,wmin=wmin,wmax=wmax,nbin=nbin,/wlog,$'
print,' ww=ww,/ikev,fstr=fstr,tlog=tlog,EM=EM)'
print,' returns a spectrum generated from atomic lines. also accepts'
print,' keywords PRES,LOGP,N_E,DESIG,ECONF,ALLAH,DBDIR,VERBOSE (RD_LINE);'
print,' DEM,ABUND,EFFAR,WVLAR,NOPH (LINEFLX); CHIDIR,CHIFIL (FOLD_IONEQ);'
print,' EQFILE (RD_IONEQ)'
endif

; check keywords
nww=n_elements(ww)
if nww gt 1 then begin
nbin=nww-1 & wmin=min([ww(0),ww(nbin)],max=wmax) ;reset
endif else begin
if not keyword_set(wmin) then wmin=1.23985 ;if wmin not set
if not keyword_set(wmax) then wmax=900. ;if wmax not set
if not keyword_set(nbin) then nbin=100L ;if nbin not set
if wmin le 0 then wmin=1.23985 ;something wrong?
if wmax le 0 then wmax=900. ;something wrong?
if wmin gt wmax then begin
; exchange WMIN & WMAX
wmin=wmin-wmax & wmax=wmin+wmax & wmin=wmax-wmin
; not doing X=WMIN & WMIN=WMAX & WMIN=X because WMAX will not be
; so much larger than WMIN that I don't expect floating point errors
; will be significant.
endif
if not keyword_set(wlog) then begin
dw=float((wmax-wmin))/float(nbin)
ww=findgen(nbin+1)*dw+wmin ;linear binning
endif else begin
w0=alog10(wmin) & w1=alog10(wmax) & dw=(w1-w0)/nbin
ww=findgen(nbin+1)*dw+w0 & ww=10.^(ww) ;log binning
endelse
endelse
w0=wmin & w1=wmax
if keyword_set(ikev) then begin
w0=12.3985/wmax & w1=12.3985/wmin
endif
;
if not keyword_set(tlog) then tlog=6.0
if not keyword_set(EM) then EM=1d19

; initialize
spec=fltarr(nbin)

; read in the lines
szf=size(fstr)
if szf(n_elements(szf)-2) ne 8 then begin ;FSTR not structure
; read in database
ff=rd_line(atom,wrange=[w0,w1],wvl=wvl,logT=logT,Z=Z,ion=ion,jon=jon,$
fstr=fstr,/desig,/econf, _extra=e)
; include ion balance
ff=fold_ioneq(ff,z,jon,logt=logt, _extra=e)
if n_tags(fstr) gt 0 then fstr.(0)=ff
endif else begin ;FSTR be structure
ff=fstr.(0) & logt=fstr.(1) & wvl=fstr.(2) & z=fstr.(3) & ion=fstr.(4)
endelse
if z(0) eq 0 then return,spec ;no lines found?
wvl=abs(wvl)
nw=n_elements(wvl)

; find nearest index in LOGT to TLOG
tmp=min(abs(logt-tlog),imn) & ftmp=reform(ff(imn,*))
dlogT=median(logT(1:*)-logT)

; compute line fluxes (comes out as [ph/s/cm^2] or [ph/s])
f=fltarr(nw)
;dem=0*logt & dem(imn)=EM(0)/alog(10.)/dlogT
;f=lineflx(ff,logt,wvl,z,dem=dem, _extra=e)
for iw=0L,nw-1L do f(iw)=lineflx(ftmp(iw),tlog,wvl(iw),z(iw),dem=EM, _extra=e)

; add to spectrum
if keyword_set(ikev) then begin
wave=12.3985/wvl
;also make sure outputs go back in correct order
ww=12.3985/ww & ow=sort(ww) & ww=ww(ow)
wmin=12.3985/wmin & wmax=12.3985/wmax
endif else wave=wvl
dw=ww(1:*)-ww
spec=hastogram(wave,ww,wts=f)/dw ;[ph/s/cm^2/(AA|keV)]

return,spec
end