DPUSER - The Next Generation: History
Author: Thomas Ott

# Revision history

Version 4.2 | Version 4.1 | Version 4.0 |  |  |
Version 3.3 | Version 3.2 | Version 3.0 | Version 2.0 |  |
Version 1.2 | Version 1.1 | Version 1.0 |  |  |
Version 0.99 | Version 0.96 | Version 0.95 | Version 0.9 | Version 0.8 | Version 0.7

## Version 4.2

### Released September 2024

This release fixed many bugs and features many enhancements in the GUI of QFitsView. Support for reading FITS compressed extensions, and usage of the PCi_j world coordinates when available, was added.

### New functions:

- exec is now also available as a function

## Version 4.1

### Released March 2021

This version adds support for reading FITS ascii tables, and two new functions were added. For the moment, the GDL bridge is deactivated in the binary distribution.
Work on QFitsView includes:

- The user interface is independent of the DPI setting of the screen
- logarithmic wavelength axes are supported
- a basic interface for calling galfit, supporting a subset of its features

### New functions:

- worldpos Calculate celestial coordinates from pixel positions
- pixpos ...and the reverse
- replaceis now also available as a function

## Version 4.0

### Released May 2019

Most of the work for this major release was happening on QFitsView. For DPUSER, this release brings some new functions and procedures, a new parser and bug fixes.

- The parser has been rewritten from scratch
- add central obscuration to airy function
- add opening angle to longslit function
- include mpfit
- significantly improved the speed of the median function
- add ability to handle 64 bit integers
- python and GDL bridges

### New functions:

- mpfit Perform fitting using the MPFIT library
- evalmpfit Evaluate a function at specified x values
- gausspos Return fit positions using 2D gaussians
- question Query a Yes/No answer
- nparams Return the number of parameters passed to a user defined function or procedure
- double Return a value cast to double
- pyvar Copy a PYTHON variable to DPUSER
- mjd Returns the Modified Julian Date

### New procedures:

- watchdir Watch a directory
- message Print a message
- python Either enter PYTHON mode or execute PYTHON script
- deletefitskey Delete a FITS key

## Version 3.3

### Released July 2016

This version fixes some bugs that slipped the 3.2 release.

## Version 3.2

### Released June 2016

This version adds support for reading FITS binary tables. A new data type list has been added which can act as a container for FITS or String Array. The dependency on the external files grfont.dat and rgb.txt has been removed.

### New functions:

- straightlinefit Fit a straight line to data.
- sersic2dsmoothfit Fit a smoothed 2-dim sersic.
- sersic2dsmoothsimplefit same with a best-guess prior.
- readfitsbintable read a FITS binary table.
- listfitsextensions List FITS extensions by name.
- listtablecolumns List FITS bineary table columns by name.
- list create a variable of type list.

### New procedures:

- setfitstype set the FITS header type (binary table or image).

## Version 3.0

### Released July 2011

### New functions:

- getbitpix Get the pixel type.
- isnan tests for not-a-number.
- isinf tests for infinity.
- polyfit2d performs a 2D N-th order polynomial fit.
- polyfit2derr performs a 2D N-th order polynomial fit with errors.
- interpolate returns the interpolated value of a given 2D position.
- radialprofile returns a radial profile centered on a 2D position.
- ellipticalprofile returns an elliptical profile centered on a 2D position.
- multigaussfit fits multiple gaussians to a vector.
- evalgaussfit evaluates a gaussfit along a vector of x values.
- polyroots return the roots of a polynomial.
- xmin returns the x coordinate of the minimum value in a 2D array.
- ymin returns the x coordinate of the minimum value in a 2D array.
- readfitsall reads a FITS file and all its extensions.
- cubequantile does a quantile of all images in a cube.
- quantile computes a quantile.

### New procedures:

- copyheader copies the FITS header from one matrix to another.
- swapaxes swaps axes of a 3D array.

## Version 2.0

### Released July 2008

This is a major release after 2.5 years of silence.

- The CDL (Client Display Library) used to communicate with saoimage has been replaced by XPA (X Public Access).
- The dependence of the QT library is removed
- Numerous bugs have been fixed.

### New functions:

- gauss2dsimplefit fits a two-dimensional gauss function to data (without initial guess).
- transpoly calculates the transformation matrix between two coordinate systems (with errors).
- strtrim trims a string.
- right returns the right part of a string.
- ten converts a sexigesimal number to decimal.
- primes calculates prime numbers.
- twodcut creates a longslit spectrum from a datacube.
- simplifywhitespace simplifies white spaces in a string.
- strsplit splits a string to a string array.
- interpol interpolates a vector.
- sersic2dfit fits a two-dimensional sersic function to data.
- sersic2dsimplefit fits a two-dimensional sersic function to data (without initial guess).
- sersicfit fits a one-dimensional sersic function to data.
- sersic2d creates a two-dimensional sersic function.
- randomg random number generation.
- poly creates a polynomial.

### New procedures:

- userDialog supply a user defined dialog box for QFitsView.
- compile compile code at runtime.
- cirrange reduce a number to circular range.
- debug enable debugging messages.

## Version 1.2

### Released September 2005

- A bug when using naxis1=... and similar inside user defined functions and procedures has been fixed.

### New functions:

- sinfit fits a sine function to data.
- sincfit fits a sinc finction to data.
- rebin1d rebins one-dimensional data.
- velmap creates a velocity map from a datacube.
- fxcor cross-correlates two spectra and fits a sinc.
- correlmap cross-correlates a datacube with a spectrum.
- longslit creates a longslit spectrum from a datacube.
- evalvelmap evaluates the result from velmap.
- voronoi computes the voronoi tesselation of an image.
- indexbase returns the index base for array subscripting.

### New procedures:

- setindexbase sets the index base for array subscripting.
- cnotation sets the index base for array subscripting to 0.
- fortrannotation sets the index base for array subscripting to 1.

## Version 1.1

### Never really released

This is a maintenance release.

- The readfits function can now also read in only a part of a fits file.
- The maxentropy function finally works.
- A bug in the string function when the argument was a complex number has been fixed.

### New functions:

- readfitsextension reads in a FITS extension.
- moffat creates a Moffat function.
- multigauss2dfit fits several circular gaussians to an image.

## Version 1.0

### Released August 12, 2004

This version adds a few new functions and procedures. Mostly, existing functions have been expanded, namely the ability to handle FITS file extensions. Also, the documentation has been extended. The main change is that DPUSER - The Next Generation now is fully integrated into the QFitsView program also written by me, and DPUSER now uses free code only (notably the GNU Scientific Library).

- The header, naxis, naxis1, naxis2, and naxis3 functions can now also handle FITS extensions.
- The readfits function can now also read in bitmap files.
- The getfitskey function has a new switch /text and handles non-existing FITS keys.
- The handling of user defined functions and procedures has been improved. Also, a bug when using nested functions/procedures was fixed.
- The parser can now handle code like this:
  `print = 10
  print print`

### New functions:

- meandev(X, a) calculates mean deviation.
- version() returns the current version string.

### New procedures:

- precess coordinates from one epoch to another.
- pwd prints the current working directory.
- dir prints a directory listing.

## Version 0.99

This is the last version of the 0.9x series. It is mainly a bug fix release. If you have any knowledge of bugs or inconsistent features, please let me know ASAP - I'll try to fix them before the release of version 1.0.

- An immediate core dump when setting a string element ≤ 0 or when setting a substring to anything else but a string has been fixed.

- The size of the command history is now limited to 500 entries. This prevents the file "dpuser.history" to grow indefinitely.

- Several pgplot routines could cause a core dump when called with inconsistent arguments. For those, the arguments supplied are checked.

- The functions total, min, max, avg handle infinite and undefined values by ignoring them. Also, an optional value which should be ignored can be specified.

- The handling of absolute file names under Microsoft Windows has been improved.

- The functions min and max have been expanded in their functionality.

- A few examples of the usage of DPUSER are provided in the examples/ subdirectory.

### New functions:

Version 0.99 introduces no new functions or procedures.

## Version 0.96

- I have introduced a modulus operator ("%") applicable to integer arguments.

- For the Win32 version of DPUSER, I was able to dig out a native port of rxvt for Windows. This offers many more features than the windpuser.exe program distributed with ealier versions. I slightly modified rxvt by adding a DPUSER icon.

- The linux binary distribution is now statically linked against QT (as advertised in the Install section). This prevents an immediate core dump on RedHat linux.

- Some memory leaks have been removed.

- The median function now returns the single element value if applied to a matrix with only one element (instead of zero).

- The nelements function now returns a value of one if not applied to a matrix but a number (either integer, double precision or complex).

- Several bugs in reading huge FITS cubes (>256 MB) have been fixed. Now files up to a size of 2 GB can be read.

- The rotate function used to multiply the total counts in an image by a factor of 4. This has been fixed.

- The reass function had a bug when applied to matrices with an uneven axes length. This also affects the smooth function. Fixed.

- The shift function has some new features.

### New functions:

- convolve(X,Y) convolves X and Y.
- gammp(a,x) returns the incomplete gamma function.
- reform(X,n1,n2,n3) changes the axes lengths of an array.
- find(image, hmin, fwhm) from IDL's astrolib.

## Version 0.95

- In this version, some matrix arithmetics functions were added. This includes the "#" operator which does matrix multiplication.

- Beginning with this version, it is possible to write user defined procedures and functions. Some examples are provided in the dpuserlib/ directory.
  !!!Feedback on this new feature is extremely welcome!!!

- If a file named "startup.dpuser" is located either in your home directory or in a directory pointed to by the DPUSER environment variable, it will be executed during startup of DPUSER. An example is provided in the dpuserlib/ directory.

- Some minor bugs (especially concerning arithmetics including double and single precision numbers) have been fixed.

### New functions:

- invert(X) inverts a matrix.
- transpose(X) transposes a matrix.
- isvariable(S) to determine whether S is a named variable.
- pi() returns the number pi.

### New procedures:

- break stops any script or loop.
- run executes a script.
- echo turns on/off echo mode.

## Version 0.9

- The functions naxis, naxis1, naxis2, and naxis3 read in the values much faster when applied to FITS files (used to read in the complete file).

- The ssa function is now a lot quicker when using the /resize switch.

- A bug in the cubemedian function when applied to FITS files with NAXIS2 not a integer power of 2 has been fixed.

- Subtracting a matrix from a real number resulted in wrong results. This also applies to complex numbers and FITS files. Along with this, a `print -'hhh'` didn't to the correct thing. This has been fixed.

### New functions:

- quickgauss(x, y, fwhm, speed)
- getenv(environment_variable)
- cblank(value) is now also available as a function
- now()
- polar(ampl, arg)
- The PGPLOT modules pgband, pgbeg (pgbegin), pgcurs (pgcurse), pgopen, and pgrnd are now also implemented as functions (with the exception of pgrnd, they have always been implemented as procedures).
- transmatrix(ref1, ref2 [, chix, chiy])
- transform(coords, trans)

### New procedures:

- setenv environment_variable, value

## Version 0.8

- Switch to cross-platform library QT. This affects strings, string arrays, as well as the dir and findfile functions. The interface doesn't change. This removed a memory leak in string arrays and fixes problems with findfile which would not list all files. The SFL library now is no longer needed to build DPUSER.

- A new integer global variable "tmpmem" which gives the number of bytes which can be used for temporary storage. At the moment, this only affects the function cubemedian. The interface doesn't change.

- A bug has been fixed in cubemerge which sometimes would not update the FITS header correctly.

- Extended documentation.

### New functions:

- pwd()

## Version 0.7

- The procedure sao accepts lower and upper limits; added /zscale and /log switch