Viewing contents of file '../idllib/astron/contrib/varosi/vlib/allpro/bandpass.pro'
;+
; NAME:
; bandpass
; PURPOSE:
; Compute flux thru bandpass filter of given transmission at wavelengths.
; Optionally, flux and/or transmission is integrated in Log-Log space
; (see keyword POWER_LAW), default is integration in Linear-Linear space.
; CALLING:
; Fobs = bandpass( Lambda, Flux, W=waveT, T=Trans )
; INPUTS:
; Lambda = wavelengths in microns.
; Flux = radiation spectrum at wavelengths of Lambda array.
; Units are assumed to be energy/Hertz.
; KEYWORDS:
; WAVELENGTH = wavelengths (microns) of bandpass filter transmission.
; TRANSMISSION = transmission coefficients at wavelengths.
; /MICRON : then assumes Flux is in units of energy/micron.
; /POWER_LAW_INT : use power law interp for flux, linear interp for
; transmission, and power law integral for flux * transmission.
; POWER_LAW_INT=2 : use power law interp/integral for flux & transmission.
; OUTPUTS:
; Returns the integral of the product of Flux times Transmission.
; EXTERNAL CALLS:
; function unique
; function finterpol
; function Trapow
; function Trapez
; PROCEDURE:
; Apply reform to inputs just in case they were passed as Flux(i,*) etc.
; Interpolate both flux and transmission to single merged wavelength grid
; and integrate the product. Optionally, flux and/or transmission
; is interpolated/integrated in Log-Log space (see keyword POWER_LAW),
; whereas default is interpolation/integration in Linear-Linear space.
; HISTORY:
; Written: Frank Varosi, HSTX @ NASA/GSFC, 1995.
; FV, 1998, mod to skip interp if wavelength grids match.
;-
function bandpass, Lambda, Flux, WAVELENGTH_BAND=waveT, TRANSMISSION=Trans, $
MICRON_UNITS=per_micron, POWER_LAW_INT=powint
Lambda = reform( Lambda )
Flux = reform( Flux )
waveT = reform( waveT )
Trans = reform( Trans )
minw = min( waveT, MAX=maxw )
w = where( (Lambda GE minw) AND (Lambda LE maxw), nw )
if nw EQ N_elements( waveT ) then begin
if min( waveT eq Lambda(w) ) then begin
wave = waveT
FT = Flux(w) * Trans
endif
endif
if N_elements( wave ) LE 0 then begin
wave = [ Lambda, waveT ]
wave = wave( sort( wave ) )
wave = wave( where( (wave GE minw) AND (wave LE maxw) ) )
wave = wave( unique( wave ) )
endif
if keyword_set( powint ) then begin
if N_elements( FT ) LE 0 then begin
wl = aLog( wave )
FT = exp( finterpol( aLog( Flux ), aLog( Lambda ), wl,/QUIET ) )
if powint GE 2 then begin
FT = FT * $
exp( finterpol( alog( Trans ), alog( waveT ), wl,/Q ) )
endif else FT = FT * finterpol( Trans, waveT, wave,/Q )
endif
if keyword_set( per_micron ) then $
return, Trapow( FT > 1e-37, wave ) $
else return, -3e14 * Trapow( FT > 1e-37, 1/wave )
endif else begin
if N_elements( FT ) LE 0 then $
FT = finterpol( Flux, Lambda, wave,/QUIET ) * $
finterpol( Trans, waveT, wave,/QUIET )
if keyword_set( per_micron ) then $
return, Trapez( FT, wave ) $
else return, -3e14 * Trapez( FT, 1/wave )
endelse
end