ARTS  2.3.1285(git:92a29ea9-dirty)
sensor.cc File Reference

Functions related to sensor modelling. More...

#include "sensor.h"
#include <cmath>
#include <list>
#include <stdexcept>
#include "arts.h"
#include "logic.h"
#include "matpackI.h"
#include "matpackII.h"
#include "messages.h"
#include "sorting.h"

Go to the source code of this file.

Functions

void antenna1d_matrix (Sparse &H, const Index &antenna_dim, ConstVectorView antenna_dza, const GriddedField4 &antenna_response, ConstVectorView za_grid, ConstVectorView f_grid, const Index n_pol, const Index do_norm)
 antenna1d_matrix More...
 
void antenna2d_gridded_dlos (Sparse &H, const Index &antenna_dim, ConstMatrixView antenna_dlos, const GriddedField4 &antenna_response, ConstMatrixView mblock_dlos, ConstVectorView f_grid, const Index n_pol)
 antenna2d_interp_gridded_dlos More...
 
void antenna2d_interp_response (Sparse &H, const Index &antenna_dim, ConstMatrixView antenna_dlos, const GriddedField4 &antenna_response, ConstMatrixView mblock_dlos, ConstVectorView f_grid, const Index n_pol)
 antenna2d_interp_response More...
 
void gaussian_response_autogrid (Vector &x, Vector &y, const Numeric &x0, const Numeric &fwhm, const Numeric &xwidth_si, const Numeric &dx_si)
 gaussian_response_autogrid More...
 
void gaussian_response (Vector &y, const Vector &x, const Numeric &x0, const Numeric &fwhm)
 gaussian_response More...
 
void mixer_matrix (Sparse &H, Vector &f_mixer, const Numeric &lo, const GriddedField1 &filter, ConstVectorView f_grid, const Index &n_pol, const Index &n_sp, const Index &do_norm)
 mixer_matrix More...
 
void mueller_rotation (Sparse &H, const Index &stokes_dim, const Numeric &rotangle)
 mueller_rotation More...
 
void met_mm_polarisation_hmatrix (Sparse &H, const ArrayOfString &mm_pol, const Numeric dza, const Index stokes_dim, const String &iy_unit)
 Calculate polarisation H-matrix. More...
 
void sensor_aux_vectors (Vector &sensor_response_f, ArrayOfIndex &sensor_response_pol, Matrix &sensor_response_dlos, ConstVectorView sensor_response_f_grid, const ArrayOfIndex &sensor_response_pol_grid, ConstMatrixView sensor_response_dlos_grid)
 sensor_aux_vectors More...
 
void spectrometer_matrix (Sparse &H, ConstVectorView ch_f, const ArrayOfGriddedField1 &ch_response, ConstVectorView sensor_f, const Index &n_pol, const Index &n_sp, const Index &do_norm)
 spectrometer_matrix More...
 
void stokes2pol (VectorView w, const Index &stokes_dim, const Index &ipol_1based, const Numeric nv)
 stokes2pol More...
 
bool test_and_merge_two_channels (Vector &fmin, Vector &fmax, Index i, Index j)
 Test if two instrument channels overlap, and if so, merge them. More...
 
void find_effective_channel_boundaries (Vector &fmin, Vector &fmax, const Vector &f_backend, const ArrayOfGriddedField1 &backend_channel_response, const Numeric &delta, const Verbosity &verbosity)
 Calculate channel boundaries from instrument response functions. More...
 
void integration_func_by_vecmult (VectorView h, ConstVectorView f, ConstVectorView x_f_in, ConstVectorView x_g_in)
 integration_func_by_vecmult More...
 
void integration_bin_by_vecmult (VectorView h, ConstVectorView x_g_in, const Numeric &limit1, const Numeric &limit2)
 integration_bin_by_vecmult More...
 
void summation_by_vecmult (VectorView h, ConstVectorView f, ConstVectorView x_f, ConstVectorView x_g, const Numeric x1, const Numeric x2)
 summation_by_vecmult More...
 

Variables

const Numeric PI
 
const Numeric NAT_LOG_2
 
const Numeric DEG2RAD
 
const Index GFIELD1_F_GRID
 
const Index GFIELD4_FIELD_NAMES
 
const Index GFIELD4_F_GRID
 
const Index GFIELD4_ZA_GRID
 
const Index GFIELD4_AA_GRID
 

Detailed Description

Functions related to sensor modelling.

Author
Mattias Ekstr�m ekstr.nosp@m.om@r.nosp@m.ss.ch.nosp@m.alme.nosp@m.rs.se
Date
2003-02-27

Functions to model sensor behaviour and integration calculated as vector multiplication.

Definition in file sensor.cc.

Function Documentation

◆ antenna1d_matrix()

void antenna1d_matrix ( Sparse H,
const Index antenna_dim,
ConstVectorView  antenna_dza,
const GriddedField4 antenna_response,
ConstVectorView  za_grid,
ConstVectorView  f_grid,
const Index  n_pol,
const Index  do_norm 
)

antenna1d_matrix

Core function for setting up the response matrix for 1D antenna cases.

Main task is to extract correct antenna pattern, including frequency interpolation. Actual weights are calculated in integration_func_by_vectmult.

Parameters
HThe antenna transfer matrix
antenna_dimAs the WSV with the same name
antenna_dzaThe zenith angle column of antenna_dlos.
antenna_responseAs the WSV with the same name
za_gridZenith angle grid for pencil beam calculations
f_gridFrequency grid for monochromatic calculations
n_polNumber of polarisation states
do_normFlag whether response should be normalised
Author
Mattias Ekstr�m / Patrick Eriksson
Date
2003-05-27 / 2008-06-17

Definition at line 58 of file sensor.cc.

References GriddedField4::data, DEBUG_ONLY, GriddedField::get_numeric_grid(), GriddedField::get_string_grid(), GFIELD4_AA_GRID, GFIELD4_F_GRID, GFIELD4_FIELD_NAMES, GFIELD4_ZA_GRID, gridpos(), Sparse::insert_row(), integration_func_by_vecmult(), interp(), interpweights(), joker, Sparse::ncols(), Array< base >::nelem(), ConstVectorView::nelem(), Sparse::resize(), and ConstVectorView::sum().

Referenced by sensor_responseAntenna().

◆ antenna2d_gridded_dlos()

void antenna2d_gridded_dlos ( Sparse H,
const Index antenna_dim,
ConstMatrixView  antenna_dlos,
const GriddedField4 antenna_response,
ConstMatrixView  mblock_dlos,
ConstVectorView  f_grid,
const Index  n_pol 
)

antenna2d_interp_gridded_dlos

The radiances are treated as a bi-linear function, but the antenna response is treated as step-wise constant function (in contrast to 1D). See also built-in doc.

Parameters
HThe antenna transfer matrix
antenna_dimAs the WSV with the same name
antenna_dzaThe zenith angle column of antenna_dlos.
antenna_responseAs the WSV with the same name
za_gridZenith angle grid for pencil beam calculations
f_gridFrequency grid for monochromatic calculations
n_polNumber of polarisation states
do_normFlag whether response should be normalised
Author
Patrick Eriksson
Date
2020-09-01

Definition at line 199 of file sensor.cc.

References abs, i, ConstMatrixView::ncols(), ConstVectorView::nelem(), and ConstMatrixView::nrows().

Referenced by sensor_responseAntenna().

◆ antenna2d_interp_response()

void antenna2d_interp_response ( Sparse H,
const Index antenna_dim,
ConstMatrixView  antenna_dlos,
const GriddedField4 antenna_response,
ConstMatrixView  mblock_dlos,
ConstVectorView  f_grid,
const Index  n_pol 
)

antenna2d_interp_response

For this option, each direction defined by mblock_dlos_grid is considered to represent the same size in terms of solid beam angle, and the antenna pattern is interpolated to these directions. See also built-in doc.

Parameters
HThe antenna transfer matrix
antenna_dimAs the WSV with the same name
antenna_dzaThe zenith angle column of antenna_dlos.
antenna_responseAs the WSV with the same name
za_gridZenith angle grid for pencil beam calculations
f_gridFrequency grid for monochromatic calculations
n_polNumber of polarisation states
do_normFlag whether response should be normalised
Author
Patrick Eriksson
Date
2018-09-12

Definition at line 442 of file sensor.cc.

References GriddedField4::data, GriddedField::get_numeric_grid(), GriddedField::get_string_grid(), GFIELD4_AA_GRID, GFIELD4_F_GRID, GFIELD4_FIELD_NAMES, GFIELD4_ZA_GRID, gridpos(), Sparse::insert_row(), interp(), interpweights(), joker, Sparse::ncols(), ConstMatrixView::ncols(), Array< base >::nelem(), ConstVectorView::nelem(), ConstMatrixView::nrows(), Sparse::resize(), and ConstVectorView::sum().

Referenced by sensor_responseAntenna().

◆ find_effective_channel_boundaries()

void find_effective_channel_boundaries ( Vector fmin,
Vector fmax,
const Vector f_backend,
const ArrayOfGriddedField1 backend_channel_response,
const Numeric delta,
const Verbosity verbosity 
)

Calculate channel boundaries from instrument response functions.

This function finds out the unique channel boundaries from f_backend and backend_channel_response. This is not a trivial task, since channels may overlap, or may be sorted in a strange way. The function tries to take care of all that. If channels overlap, they are combined to one continuous frequency region. therefore the number of elements in the output vectors fmin and fmax can be lower than the number of elements in f_backend and backend_channel_response.

The function also does consistency checking on the two input variables.

The output vectors fmin and fmax will be monotonically increasing.

Author
Stefan Buehler
Parameters
[out]fminVector of lower boundaries of instrument channels.
[out]fmaxVector of upper boundaries of instrument channels.
[in]f_backendNominal backend frequencies.
[in]backend_channel_responseChannel response, relative to nominal frequencies.
[in]deltaExtra margin on both sides of each band. Has a default value of 0.

delta;

Definition at line 1152 of file sensor.cc.

References CREATE_OUT2, get_sorted_indexes(), i, is_increasing(), last(), Array< base >::nelem(), ConstVectorView::nelem(), Vector::resize(), _CS_basic_sstream_base< _CS_cT, _CS_Tr, _CS_Al >::str(), and test_and_merge_two_channels().

Referenced by f_gridFromSensorAMSU(), f_gridFromSensorAMSUgeneric(), and f_gridFromSensorHIRS().

◆ gaussian_response()

void gaussian_response ( Vector y,
const Vector x,
const Numeric x0,
const Numeric fwhm 
)

gaussian_response

Returns a 1D gaussian response

y is the gaussian function on grid x, with max at x0 and width following fwhm.

Parameters
yCalculated response.
xGrid.
x0The x-position of response centre/max.
fwhmThe full width at half-maximum of the response
Author
Patrick Eriksson
Date
2009-09-20

Definition at line 629 of file sensor.cc.

References i, n, NAT_LOG_2, ConstVectorView::nelem(), PI, pow(), Vector::resize(), and sqrt().

Referenced by antenna_responseVaryingGaussian(), and gaussian_response_autogrid().

◆ gaussian_response_autogrid()

void gaussian_response_autogrid ( Vector x,
Vector y,
const Numeric x0,
const Numeric fwhm,
const Numeric xwidth_si,
const Numeric dx_si 
)

gaussian_response_autogrid

Returns a 1D gaussian response with a suitable grid

First a grid is generated. The grid is si*[-xwidth_si:dx:xwidth_si], where si is the "standard deviation" corresponding to the FWHM, and dx is biggest possible value < dx_si, to enusre an symmetric grid wth end points exactly at xwidth_si. That is, width and spacing of the grid is specified in terms of number of standard deviations. If xwidth_si is set to 2, the response will cover about 95% the complete response. For xwidth_si=3, about 99% is covered.

y is the gaussian function on grid x, with max at x0 and width following fwhm.

Parameters
xGrid generated.
yCalculated response.
x0The x-position of response centre/max.
fwhmThe full width at half-maximum of the response
xwidth_siThe one-sided width of x. See above.
dx_siThe grid step size of x. See above.
Author
Patrick Eriksson
Date
2009-09-20

Definition at line 606 of file sensor.cc.

References gaussian_response(), n, NAT_LOG_2, nlinspace(), and sqrt().

Referenced by antenna_responseGaussian(), antenna_responseVaryingGaussian(), and backend_channel_responseGaussian().

◆ integration_bin_by_vecmult()

void integration_bin_by_vecmult ( VectorView  h,
ConstVectorView  x_g_in,
const Numeric limit1,
const Numeric limit2 
)

integration_bin_by_vecmult

Calculates the (row) vector that multiplied with an unknown (column) vector, g, approximates the integral between limit1 and limit2, where limit1 >= limit2.

This can be seen as a special case of what is handled by integration_func_by_vecmult*, where the function f is a boxcar function. Or expressed differently, the function g is "binned" between limit1 and limit2.

The limits must be inside the range the x_g.

Parameters
hThe multiplication (row) vector.
x_g_inThe grid points of function g(x). Can be increasing or decreasing. Must cover a wider range than the boxcar function (in both ends).
limit1The lower integration limit.
limit2The upper integration limit.
Author
Patrick Eriksson
Date
2017-06-02

Definition at line 1503 of file sensor.cc.

Referenced by yActive().

◆ integration_func_by_vecmult()

void integration_func_by_vecmult ( VectorView  h,
ConstVectorView  f,
ConstVectorView  x_f_in,
ConstVectorView  x_g_in 
)

integration_func_by_vecmult

Calculates the (row) vector that multiplied with an unknown (column) vector approximates the integral of the product between the functions represented by the two vectors: h*g = integral( f(x)*g(x) dx )

Basic principle follows Eriksson et al., Efficient forward modelling by matrix representation of sensor responses, Int. J. Remote Sensing, 27, 1793-1808, 2006. However, while in Eriksson et al. the product between f*g is assumed to vary linearly between the grid point, the expressions applied here are more advanced and are completly exact as long as f and g are piece-wise linear functions. The product f*g is then a quadratic funtion between the grid points.

Parameters
hThe multiplication (row) vector.
fThe values of function f(x).
x_f_inThe grid points of function f(x). Must be increasing.
x_g_inThe grid points of function g(x). Can be increasing or decreasing. Must cover a wider range than x_f (in both ends).
Author
Mattias Ekstr�m and Patrick Eriksson
Date
2003-02-13 / 2008-06-12

Definition at line 1361 of file sensor.cc.

Referenced by antenna1d_matrix(), and spectrometer_matrix().

◆ met_mm_polarisation_hmatrix()

void met_mm_polarisation_hmatrix ( Sparse H,
const ArrayOfString pol,
const Numeric  dza,
const Index  stokes_dim,
const String iy_unit 
)

Calculate polarisation H-matrix.

Takes into account instrument channel polarisation and zenith angle.

Parameters
[out]HPolarisation matrix
[in]mm_polInstrument channel polarisations
[in]dzaZenith angle, from reference direction
[in]stokes_dimWorkspace variable
[in]iy_unitWorkspace variable

Definition at line 775 of file sensor.cc.

References abs, i, Sparse::insert_row(), mueller_rotation(), mult(), Array< base >::nelem(), stokes2pol(), _CS_basic_sstream_base< _CS_cT, _CS_Tr, _CS_Al >::str(), and w().

Referenced by sensor_responseMetMM().

◆ mixer_matrix()

void mixer_matrix ( Sparse H,
Vector f_mixer,
const Numeric lo,
const GriddedField1 filter,
ConstVectorView  f_grid,
const Index n_pol,
const Index n_sp,
const Index do_norm 
)

mixer_matrix

Sets up the sparse matrix that models the response from sideband filtering and the mixer.

The size of the transfer matrix is changed in the function as follows: nrows = f_mixer.nelem() ncols = f_grid.nelem()

The returned frequencies are given in IF, so both primary and mirror band is converted down.

Parameters
HThe mixer/sideband filter transfer matrix
f_mixerThe frequency grid of the mixer
loThe local oscillator frequency
filterThe sideband filter data. See sideband_response for format and constraints.
f_gridThe original frequency grid of the spectrum
n_polThe number of polarisations to consider
n_spThe number of spectra (viewing directions)
do_normFlag whether rows should be normalised
Author
Mattias Ekstr�m / Patrick Eriksson
Date
2003-05-27 / 2008-06-17

Definition at line 645 of file sensor.cc.

References GriddedField1::data, DEBUG_ONLY, GriddedField::get_numeric_grid(), GFIELD1_F_GRID, i, last(), ConstVectorView::nelem(), and Vector::resize().

Referenced by sensor_responseMixer().

◆ mueller_rotation()

void mueller_rotation ( Sparse H,
const Index stokes_dim,
const Numeric rotangle 
)

mueller_rotation

Returns the Mueller matrix for a rotation of the coordinate system defining H and V directions.

The function follows Eq 9 in the sensor response article (Eriksson et al, Efficient forward modelling by matrix representation of sensor responses, IJRS, 2006).

The sparse matrix H is not sized by the function, in order to save time for repeated usage. Before first call of this function, size H as H.resize( stokes_dim, stokes_dim ); The H returned of this function can be used as input for later calls. That is, no need to repeat the resize command above.

Parameters
HMueller matrix
stokes_dimStokes dimensionality
rotangleRotation angle.
Author
Patrick Eriksson
Date
2014-09-23

Definition at line 745 of file sensor.cc.

References DEG2RAD, Sparse::ncols(), Sparse::nrows(), and Sparse::rw().

Referenced by met_mm_polarisation_hmatrix(), and sensor_responseStokesRotation().

◆ sensor_aux_vectors()

void sensor_aux_vectors ( Vector sensor_response_f,
ArrayOfIndex sensor_response_pol,
Matrix sensor_response_dlos,
ConstVectorView  sensor_response_f_grid,
const ArrayOfIndex sensor_response_pol_grid,
ConstMatrixView  sensor_response_dlos_grid 
)

sensor_aux_vectors

Sets up the the auxiliary vectors for sensor_response.

The function assumes that all grids are common, and the full vectors are just the grids repeated.

Parameters
sensor_response_fAs the WSV with same name
sensor_response_polAs the WSV with same name
sensor_response_zaAs the WSV with same name
sensor_response_aaAs the WSV with same name
sensor_response_f_gridAs the WSV with same name
sensor_response_pol_gridAs the WSV with same name
sensor_response_dlos_gridAs the WSV with same name
Author
Patrick Eriksson
Date
2008-06-09

Definition at line 938 of file sensor.cc.

References i, joker, n, ConstMatrixView::ncols(), Array< base >::nelem(), ConstVectorView::nelem(), ConstMatrixView::nrows(), Vector::resize(), and Matrix::resize().

Referenced by sensor_responseAntenna(), sensor_responseBackend(), sensor_responseBackendFrequencySwitching(), sensor_responseFrequencySwitching(), sensor_responseGenericAMSU(), sensor_responseInit(), sensor_responseMixer(), sensor_responseMixerBackendPrecalcWeights(), sensor_responsePolarisation(), and sensor_responseWMRF().

◆ spectrometer_matrix()

void spectrometer_matrix ( Sparse H,
ConstVectorView  ch_f,
const ArrayOfGriddedField1 ch_response,
ConstVectorView  sensor_f,
const Index n_pol,
const Index n_sp,
const Index do_norm 
)

spectrometer_matrix

Constructs the sparse matrix that multiplied with the spectral values gives the spectra from the spectrometer.

The input to the function corresponds mainly to WSVs. See f_backend and backend_channel_response for how the backend response is specified.

Parameters
HThe response matrix.
ch_fCorresponds directly to WSV f_backend.
ch_responseCorresponds directly to WSV backend_channel_response.
sensor_fCorresponds directly to WSV sensor_response_f_grid.
n_polThe number of polarisations.
n_spThe number of spectra (viewing directions).
do_normCorresponds directly to WSV sensor_norm.
Author
Mattias Ekstr�m and Patrick Eriksson
Date
2003-08-26 / 2008-06-10

Definition at line 975 of file sensor.cc.

References data, GFIELD1_F_GRID, Sparse::insert_row(), integration_func_by_vecmult(), Array< base >::nelem(), ConstVectorView::nelem(), Sparse::resize(), and ConstVectorView::sum().

Referenced by sensor_responseBackend().

◆ stokes2pol()

void stokes2pol ( VectorView  w,
const Index stokes_dim,
const Index ipol_1based,
const Numeric  nv = 1 
)

stokes2pol

Sets up a vector to convert the Stokes vector to different polarsiations.

The measured value is the sum of the element product of the conversion vector and the Stokes vector. Schematically:

y[iout] = sum( w.*iy(iin,joker)

Vectors for I, Q, U and V are always normalised to have unit length (one value is 1, the remaining ones zero). The first element of remaining vectors is set to nv (and other values normalised accordingly), to allow that calibartion and other normalisation effects can be incorporated.

Parameters
s2pArray of conversion vectors.
nvNorm value for polarisations beside I, Q, U and V.
Author
Patrick Eriksson
Date
2011-11-01 and 2018-03-16

Definition at line 1041 of file sensor.cc.

References Array< base >::nelem(), ConstVectorView::nelem(), and _CS_basic_sstream_base< _CS_cT, _CS_Tr, _CS_Al >::str().

Referenced by iy_transmitterMultiplePol(), iy_transmitterSinglePol(), met_mm_polarisation_hmatrix(), sensor_responsePolarisation(), and yActive().

◆ summation_by_vecmult()

void summation_by_vecmult ( VectorView  h,
ConstVectorView  f,
ConstVectorView  x_f,
ConstVectorView  x_g,
const Numeric  x1,
const Numeric  x2 
)

summation_by_vecmult

Calculates the (row) vector that multiplied with an unknown (column) vector approximates the sum of the product between the functions at two points.

E.g. h*g = f(x1)*g(x1) + f(x2)*g(x2)

The typical application is to set up the combined response matrix for mixer and sideband filter.

See Eriksson et al., Efficient forward modelling by matrix representation of sensor responses, Int. J. Remote Sensing, 27, 1793-1808, 2006, for details.

No normalisation of the response is made.

Parameters
hThe summation (row) vector.
fSideband response.
x_fThe grid points of function f(x).
x_gThe grid for spectral values (normally equal to f_grid)
x1Point 1
x2Point 2
Author
Mattias Ekstr�m / Patrick Eriksson
Date
2003-05-26 / 2008-06-17

Definition at line 1607 of file sensor.cc.

◆ test_and_merge_two_channels()

bool test_and_merge_two_channels ( Vector fmin,
Vector fmax,
Index  i,
Index  j 
)

Test if two instrument channels overlap, and if so, merge them.

The channels boundaries are specified in two separate vectors, fmin and fmax. These vectors are both input and output. If merging has happened, they will each be one element shorter.

The positions of the channels to compare is given by the input parameters i and j. It is assumed that the minimum frequency of i is lower than or equal to that of j.

Furthermore, it is assumed that i itself is lower than j.

The range of the first channel (i) will have been extended to accomodate the second channel (j). The second channel will have been removed.

The function also handles the updating of index j: If the two channels do not overlap, j is increased by one.

Function returns true if merging has happened.

Author
Stefan Buehler
Returns
True if channels were merged, otherwise false.
Return values
fminLower channel boundaries.
fmaxUpper channel boundaries.
Parameters
iIndex of first channel.
jIndex of second channel.

Definition at line 1110 of file sensor.cc.

References ConstVectorView::nelem(), and Vector::resize().

Referenced by find_effective_channel_boundaries().

Variable Documentation

◆ DEG2RAD

const Numeric DEG2RAD

Referenced by mueller_rotation().

◆ GFIELD1_F_GRID

const Index GFIELD1_F_GRID

◆ GFIELD4_AA_GRID

const Index GFIELD4_AA_GRID

◆ GFIELD4_F_GRID

const Index GFIELD4_F_GRID

◆ GFIELD4_FIELD_NAMES

const Index GFIELD4_FIELD_NAMES

◆ GFIELD4_ZA_GRID

const Index GFIELD4_ZA_GRID

◆ NAT_LOG_2

const Numeric NAT_LOG_2

◆ PI

const Numeric PI

Referenced by gaussian_response().