Convert backgrounds to exposure and detector components.
Parameters
----------
bgMatrix : `np.ndarray`, (nDetectors, nExposures)
Input backgrounds indexed by exposure (axis=0) and
detector (axis=1).
bgCounts : `np.ndarray`, (nDetectors, nExposures), optional
Input pixel counts used to in measuring bgMatrix, indexed
identically.
iterations : `int`, optional
Number of iterations to use in decomposition.
Returns
-------
scaleResult : `lsst.pipe.base.Struct`
Result struct containing fields:
``vectorE``
Output E vector of exposure level scalings
(`np.array`, (nExposures)).
``vectorG``
Output G vector of detector level scalings
(`np.array`, (nExposures)).
``bgModel``
Expected model bgMatrix values, calculated from E and G
(`np.ndarray`, (nDetectors, nExposures)).
Notes
-----
The set of background measurements B[exposure, detector] of
flat frame data should be defined by a "Cartesian" product of
two vectors, E[exposure] and G[detector]. The E vector
represents the total flux incident on the focal plane. In a
perfect camera, this is simply the sum along the columns of B
(np.sum(B, axis=0)).
However, this simple model ignores differences in detector
gains, the vignetting of the detectors, and the illumination
pattern of the source lamp. The G vector describes these
detector dependent differences, which should be identical over
different exposures. For a perfect lamp of unit total
intensity, this is simply the sum along the rows of B
(np.sum(B, axis=1)). This algorithm divides G by the total
flux level, to provide the relative (not absolute) scales
between detectors.
The algorithm here, from pipe_drivers/constructCalibs.py and
from there from Eugene Magnier/PanSTARRS [1]_, attempts to
iteratively solve this decomposition from initial "perfect" E
and G vectors. The operation is performed in log space to
reduce the multiply and divides to linear additions and
subtractions.
References
----------
.. [1] https://svn.pan-starrs.ifa.hawaii.edu/trac/ipp/browser/trunk/psModules/src/detrend/pmFlatNormalize.c # noqa: E501
Definition at line 317 of file cpFlatNormTask.py.