Py4CAtS --- Python for Computational ATmospheric Spectroscopy

What's new? (2015-2022)

March 21 --- Summer21 --- Fall 21 --- Winter 21/22 --- Summer 22

July 2015
The 'main' scripts (e.g. lbl2od) can now be used as functions inside the (I)Python interpreter.
October 2015
Sources thoroughly checked with Pep8, PyFlakes, and PyChecker
Script od2ri with function dod2ri added to compute radiation intensity
March 2016
A new function cgs in module cgsUnits.py for easier conversions of physical quantities
Improved ac2wf.py and od2ri functions/modules.
July 2016
Further source code checks with Pylint
Absorption coefficients and optical depths are now stored in subclassed numpy arrays acArray and odArray (similar to xsArray before)
September 2016
Atmospheric data: corrected "CH3CL" -> "CH3Cl"
Functions atlas (in module lines.py), acPlot (in module absCo.py), and odPlot (in module oDepth.py) rewritten (to exploit recursive calls)
October 2016
xs2ac corrected to allow single level atmosphere and cross sections
November 2016
od2ri corrected to allow atmospheric data starting at ToA
Some further checks of 'important' function arguments implemented
srf.py: wavenumber shift implemented in fts function
Atmospheric data sets: trace gas profiles saved in separate file
December 2016
Setup script py4cats.py 'generalized' for Windows (pathname construction!)
Line mixing added (first order, Voigt and Lorentz, "brute force" only)
read_line_file in the lines.py script now works recursively
atlas now also allows to plot voigtLines
misc.py: new function triSpec for convolution with triangular
moreFun.py: new function erfcx for exponentially scaled complementary error function
May 2017
Function atmPlot now can plot volume mixing ratios (instead of densities), too.
radiance2radiance clean-up
November 2017
New subclassed numpy array for radiance/intensity (i.e. the radiance array along with its attributes): single return variable of function dod2ri.
New function riPlot and updated/adjusted function riSave to plot and save radiance.
New function truncate in module misc.py
January 2018
atmos1D.py:
New function readVMR to read (trace) gas concentration data (i.e. without pressure and temperature);
Function merge_atmos1D can use pure VMR data as second input.
Atmospheric data sets clean-up, reorganized, ...
March 2018
py4cats.py:
Identification / location of path to source files reorganized
wgtFct.py:
(Unix/Linux/...) shell interface adjusted to acArray implementation
lbl2xs.py (and extract.py, hitran.py, geisa.py):
Pressure-induced line shift implemented
June 2018
lines.py --- function atlas: recoded to ensure common wavenumber axis for splitted plots
atmos1D.py: functions merge_atmos1D and regrid updated

Summer 2018
Code ported to Python 3 (the Python 2 code is frozen now!)

October 2018
lbl2xs.py --- a new option cpT to specify the pressure and temperature columns in the pT file
xs2ac.py, ac2od.py, xs2od.py --- new executable scripts to do these steps from the command line (i.e. "wrappers" for the corresponding functions to be called from the command line / (unix) terminal)
extract.py renamed to higstract.py consistent with the main function of this module
December 2018
radInt.py --- new module defining a subclassed array riArray for radiation-intensity, including functions for read, save, and plot
February 2019
Failed matplotlib imports: raise SystemExit errors replaced by print warnings
Module planck.py: new function dPlanck_Wavenumber_dT
Module higstract.py: new method strong for subclassed numpy array lineArray
Module radInt.py: info on spectral response added to legend produced by riPlot
Module wgtFct.py: new method convolve for subclassed numpy array wfArray
March 2019
Module radInt.py: inconsistencies of header comment lines between riSave and riRead removed
Python 2 sources (in directory src2) removed from tarball
April 2019
Broken/incorrect links from bin directory to ../src directory repaired (incorrectly to ../src3)
Module srf.py: function Triangle corrected
Demo file corrected: mls=atmos1D(...) ---> mls=atmRead(...)

May 2019
Py4CAtS paper published in Atmosphere 10(5), pp. 262, 2019

May-July 2019
Modules absCo.py, oDepth.py, xSection: old regrid methods removed
Module ac2wf.py: FoV loop in function ac2wf corrected to wfArray
Module atmos1D.py: function cmr with new (second) optional argument what; misc changes in functions atmRead, atmPlot
Module lbl2xs.py: function lbl2xs terminates with non-positive pressure or temperature
Module misc.py: function show_lambda more wavenumbers in NIR added
Module pairTypes.py: class Interval division corrected Python 2 __(r)div__ to Python 3 __(r)truediv__
Module radInt.py: new special method kelvin in class riArray to return equ. brightness temperature
Module wgtFct.py: function wfPlot: contour levels can be set explicitely, axis labels can be suppressed
Cosmetic changes in module ac2wf.py, aeiou.py, srf.py
September 2019 -- January 2020
Module aeiou.py: function loadxyy with new optional argument xLimits
Module cgsUnits: lengthsUnits: ly, pc added; functions lambda2nu, nu2lambda: first argument (wavelengths or wavenumbers) are variable list arguments
Module lineshapes.py: function Rautian now calling hum2wei32 (old: hum1wei24)
Module misc.py: function show_lambda with new arguments frmt, yShift, nanometer
Module py4cats.py: import show_lambda added;
Module oDepth.py: functions oDepth_altitudes, oDepth_pressures optionally return altitudes or pressures in km, mb, ....
Module xSection.py: function xsSave: third and fourth arguments swapped (interpolate <--> commentChar)
function xsRead: now can be called recursively
July 2020
Module convolution.py: functions convolveBox, convolveTriangle, convolveGauss: the number of grid points for the new wGrid is now evaluated as int()
Module myMatPlotLib.py: new module with some extra settings
Module py4cats.py: last section with matplotlib settings removed (now in new file myMatPlotLib.py)

March 2021
Source code now reorganized as a package
Source files are now distributed over three subdirectories
  • lbl: modules related to lbl computations incl. Hitran/Geisa database access, Voigt routines etc.;
  • art: modules related to atmospheric radiative transfer;
  • aux: auxiliary modules that should/could be useful in any context, e.g. input/output routines.
The setup module py4cats.py is not required anymore, import of the Py4CAtS modules is now organized by the __init__.py files, in the (I)Python shell simply say
from py4cats import *

Spring - Summer 2021
  Plot functions
atmPlot, acPlot, odPlot, riPlot, xsPlot functions have an additional argument **kwArgs (passed thru to MatPlotLib's functions)
acPlot, odPlot, xsPlot with an additional argument xUnit (instead of flag mue or nm)
  Module art/ac2od.py:
column density now saved as an additional entry in the odArray instance
  Module aux/aerosol.py
new module for aerosol optical depth using simple power law (Angstrom coefficient)
  Module lbl/higstract.py
improved/extended support of "beyond Voigt" line parameters in SEOM database
  Module aux/ir.ry
added radiusEarth, radiusSun, radiusJupiter, massEarth, massSun, massJupiter
  Module lbl/lbl.py
functions lbl_2grids, lbl_3grids: defaults changed to gridRatio=8, lagrange=2;
function lbl_brute: handling/selection of "beyond Voigt" line shapes changed;
function lbl2xs: initial check of `lineshape` modified;
new function init_xSection: setup wavenumber grid (old,original function wavenumber2xs) and zero xs array
  Module lbl/lines.py
lineArray class info with better support of "beyond Voigt" parameters;
function xVoigt_parameters with support for "beyond Voigt" parameters (extended version of old `voigt_parameters`);
new function llInfo
  Module lbl/lineshapes.py
function argument `S` replaced by `strength`;
function Voigt: call hum1wei32 for tiny y (otherwise hum1wei24);
function Rautian: call hum1wei32 (original hum1wei24);
speed-dependent profiles: now calling sdv and sdr functions (in new module sdr)
  Module art/limb.py:
new module for limb (occultation) transmission and effective height
  Module lbl/molecules.py
new molecules (hitran20, geisa19/20) added
  Module art/oDepth.py
class odArray with new attribute column density;
convolve method with default Gauss;
new function odConvolve (calls class method for a list/dictionary of optical depths);
function odSave with new flag transmission to optionally save exp(-od);
functions oDepth_altitudes, oDepth_pressures can return data in non-cgs units (e.g. km or mb)
  Module art/od2ri.py
completely rewritten with added support for surface reflection etc
  Module aux/racef.py
new function hum1wei24w;
NOTE: all function except for zpf16p use two real arguments (x,y); zpf16p(z) is used by the sdr module/functions only!
  Module art/rayleigh.py
new module for Rayleigh extinction
  Module art/radInt.py
class riArray with new method noise;
convolve method with default Gauss;
new function riConvolve (calls class method for a list/dictionary of radiances);
function riRead now returns a dictionary of riArray's if all entries of the pickle file have a `key`;
function riSave: if called with a dictionary of riArray's, save each as dictionary with an extra `key`
  Module lbl/sdr.py
new module for speed-dependent Voigt and Rautian functions
  Module aux/srf.py
function HyperGauss: bug fix of sqrtLn2**3 ---> sqrtLn2**(1/3); function UltraGauss added
  Module aux/struc_array.py
new functions strucArrayChangeName and strucArrayUpdate
  Module art/wgtFct.py
function wfPeakHeight now returns altitudes in cm

Fall 2021

  Modules art/absCo.py and art/xs2ac.py
acArray attribute molec now saves a dictionary of molecules vs. number densities (old: only (absorbing) molecule names);
this dictionary is set by the xs2ac function and the densities are required by the cia(.py) module/function.
  Module lbl/lbl2od.py
three new options for function lbl2od to add cia, Rayleigh, and aerosol extinction to absorption coefficient(s) and optical depth(s)
  Module art/cia.py
new module for collision-induced absorption

Winter 2021/22

  Module art/atmos1D.py
The function atmPlot can plot all molecular profiles simultaneously with a call atmPlot(atmosData, what='*')
Function _atmosData2cgs: mass density is now removed from atmospheric data.
  Module art/oDepth.py
new class method dict for odArray
function _odSave_pickled: redundant code cleaned up by call of odArray.dict class method
function odInfo: now also accepting dictionary of odArrays
  Module art/radInt.py
new class methods dict and append for riArray
function _riSave_pickled: redundant code cleaned up by call of riArray.dict class method
function _riRead_pickled: redundant code cleaned up using call to new function dict2riArray
function riConvolve and class method convolve: new wavenumber grid can be set
new function riConcatenate (calling class method riArray.append repeatedly)
  Modules lbl/lbl2ac.py and lbl/lbl2od.py
In the corresponding functions a consistency test of atmospheric vs line data has been implemented: stop if line data are given, but no corresponding concentrations
  Module aux/misc.py
new function dict_items2groups
  Module aux/struc_array.py
new function strucArrayDef
  Module aux/pairTypes.py
new class method dict for the three pair classes
Interval initialization more flexible: now also accepts lists, dictionaries (with two elements), and pairs
  Numerous modules:
raise SystemExit replaced by more specific raise ValueError etc.
  html documentation updated

Spring/Summer 2022

  Module art/oDepth.py
new function odSum: alternative implementation of dod2tod
WARNING: slightly different total optical depth (see source file for discussion)
  Module aux/convolution.py
convolveBox, convolveTriangle with new option wGrid
convolveGauss with arguments rearranged
  Module aux/srf.py
new response function gaussBox
  Module aux/euGrid.py
new function gridStep
  Module aux/misc.py
new function dict_items2groups
  html documentation updated
subdirectories art, aux, lbl corresponding to the package structure