Release Notes

Sherpa 4.8.2
============

This version of Sherpa is the first one to run under both Python 2.7
and Python 3.5. The python 3 conversion is considered a beta designed
to maintain backwards compatibility with python 2.7. As such, we
expect to have some iterations before the Python 3.5 support stabilizes.

The smoke test has been greatly simplified: rather that running all of
the unit and regression tests that do not require test data, the smoke
test now simply ensures that the basic installation works, i.e. that
basic commands can be run and that dependencies can be reached. This
allows the use of more advanced tools for actual unit and regression
tests without having to ship such tools to users.

Several bugs were fixed, some enhancements implemented, and some
deprecated calls to external API replaced. In particular:

  * more documentation was migrated and is not part of the code base
    as *docstrings*.
  * the `calc_stat` API has been generalized to make statistic
    functions more extensible.
  * `calc_stat_info` now properly takes background into account when
    `wstat` is selected.

Details
-------

Infrastructure and minor non-functional changes have been omitted.

#209: Fix docstrings for `group_snr()` and `group_adapt_snr()`. Docstrings
  used to say "Combine the data so that each bin has a signal-to-noise
  ratio of at least minimum" but the end of the groups are marked only
  if the SNR exceeds the given SNR.

#210: The smoke test has been greatly simplified and it now simply ensures
  that the basic installation works, i.e. that basic commands can be run
  and that dependencies can be reached. Previously, the smoke test would
  run all unit tests. Units and regression tests can now take advantage of
  `py.test` and `mock` packages (the latter is part of the standard
  library in Python3).

#211: Cleanup of documentation and code in `sherpa.astro.utils`. The
  `calc_kcorr` function is now exported by sherpa.astro.utils. Minor
  changes to the documentation in `sherpa.astro.utils` to conform to
  Sphinx standards.

#221: Integrate existing model documentation (from external sources and
  the CIAO ahelp documentation system) into the model classes.

#229: Code is both Python 2.7 and 3.5 compliant. This included updating
  the CIAO dependencies: region, group, and stack libraries, which were
  ported to Python 3 as well.

#242: Avoid use of `inspect.argspec`, which was deprecated in Python3.

#252: `plot_photon_flux` function was calling an internal function with
  the wrong number of arguments and thus raising an error. This has been
  fixed.

#253: `calc_stat_info` call failed when `wstat` was selected, as the
  background was not taken into account. This issue has now been fixed.

#256: Fix docstring in `set_quality`, which were listing the wrong values
  of the quality flag.

#257: Fix docstring for `levmar` tolerance, which was listing the wrong
  function defaults.


Caveats/Known Issues
--------------------

The following are known issues with the standalone 4.8.2 release

  **`show_all` does not work on Python3 with PHA**. E.g., the following
    code throws an exception:

``` python
from sherpa.astro.ui.utils import Session
from sherpa.astro.data import DataPHA
session = Session()
session.load_arrays(1, [1, 2, 3], [1, 2, 3], DataPHA)
session.show_all()
```

  **the `parallel_map` function throws an exception on Python 3** when
    only one core is available on the system running Sherpa. This impacts
    a number of functions taking advantage of tasks parallelization on
    multi-core systems. This functions include `calc_flux`, `sample_flux`,
    a number of functions for plotting parameter projections, and the
    `grid_search` optimization algorithm.

  **string representation of some (but not all) dataset classes is broken
    on Python 3**. For instance, the following code will result in an exception:

```python
from sherpa.astro.ui import *
load_pha('3c273.pi')
print(get_data())
```

  **`sample_flux` does not work on Python 3 when called with the `scales`
    argument**, e.g.:

```python
from sherpa.astro import ui

ui.load_pha('sherpa-test-data/sherpatest/3c273.pi')
ui.set_model('polynom1d.p1')
ui.fit()
ui.covar()
scal = ui.get_covar_results().parmaxes
ui.sample_flux(p1, 0.5, 1, num=5, correlated=False, scales=scal)
```



Sherpa 4.8.1
============

Sherpa 4.8.1 is the standalone counterpart to the 4.8.0 release, which was
focused on supporting CIAO 4.8. In particular, this version introduces support
for newer versions of the dependency, along with some feature enhancements,
bug fixes and additional, more accurate tests.

The newly supported dependencies:

  - matplotlib v1.5
  - numpy 1.10 (with and without mkl support)
  - xspec v12.9.0i (when building from source)
  - astropy v1.1.2
  - region library v4.8 (from CIAO 4.8)

Mode details below (infrastructure changes are not shown):

#102: fix issues when writing out FITS files using the `save_pha` and
`save_table` commands when using the `astropy`/`pyfits` backend (bug #46).
Fix for when the notice2d_id, notice2d_image, and the ignore version functions
are called with an invalid identifier (i.e. an identifier that is not an integer
or string value). The error is now an ArgumentTypeErr with the message "'ids'
must be an identifier or list of identifiers". It was a NameError with the
message "global name '_argument_type_error' is not defined".

#107: Normalize plot labels. There are two main changes for plots of PHA data
sets (and related quantities, such as the source, model, and ARF):

- plots with matplotlib now use the LaTeX support - so that 'cm^2' is
  now displayed as a superscript; previously they were displayed
  directly. This does not change the display with the ChIPS backend.

- plots created with `plot_source` used a different format to other
  plots when analysis=wavelength, in that LaTeX symbols were used for
  Angstrom and lambda (in other plots the string 'Angstrom' is used
  instead). The source plots now match the other plots.

#109: fix #103 and #113 in order to support `matplotlib` v1.5.

#116: fix bug #27. The `astropy.io.fits`/`pyfits` interface used deprecated
functionality. The code was updated to use the replacement classes/methods when
available, falling back to the original code if not. The interfaces that were
changed were, when the new symbols are availble, to:

 - use `astropy.io.fits.BinTableHDU.from_columns` rather than
   `astropy.io.fits.new_table`

 - use `astropy.io.fits.Header` rather than `astropy.io.CardList`

#137: upgrade CIAO region library to v4.8

#138: improve and fix issues in `save_all` function.

 - added a new argument to `save_all`: if `outfile` is `None` then the `outfh`
   argument is used 
   to define the output handle (the argument can be any file-like argument, such
   as a file
   handle like `sys.stdout` or the output of `open`, or a `StringIO` object)
 - setting the `clobber` argument to `save_all` now means that the output file
   (the `outfile`
   argument, if not `None`) is deleted if it already exists; prior to this, the
   file would be
   appended to instead
 - the source expression is now saved correctly for most cases (e.g. when not
   using `set_full_model`); this is bug #97 but also affects non-PHA data sets
 - the background model expression was not always written out correctly when
   using PHA
   data sets
 - quality and grouping arrays of PHA data sets are now stored as 16-byte
   integers rather
   than a floating-point value (this has no affect on the results, but matches
   the OGIP standard)
 - fixed up saving the grouping and quality arrays of background PHA data sets
   (this would only
   be an issue if the background is being fit, rather than subtracted)
 - basic data sets created with the `load_arrays` function are now written out by
   `save_all`
   as part of the script; this is intended for small datasets and may have
   problems with
   precision if used with floating-point arrays
 - calls to `load_psf` are now correctly restored (they may not have been written
   out correctly
   if multiple data sets were loaded)
 - user models are now written out to disk; this consists of two parts:
 - writing out the function that defines the model, which may or may not be
   possible (if
   not, a place-holder function is added to the output and a warning
   displayed).
 - the necessary calls to `load_user_model` and `add_user_pars` are now
   included in the output
 - the Python code created by `save` all has undergone several minor changes:
 - it now explicitly imports the `sherpa.astro.ui` module, so that it can be
   run from the
   IPython prompt using the `%run <filename>` command, or directly as `python <filename>`
 - it uses the `create_model_component` function rather than `eval` to create
   model
   components (this is CXC bug 12146)
 - many optional arguments to functions are now given as `name=value` rather
   than
   being a positional argument, to make it clearer what the script is doing.
 - calls to `load_data` have been replaced by more-specific versions - e.g.
   `load_pha`
   and `load_image` - if appropriate
 - there have seen several minor syntactic clean ups to better follow the
   suggestions from PEP8 

When writing out code that defines a user-model, there is no attempt to make
sure that
modules used by the function are available. These will need to be added, either
directly
or imported, manually to the output.

#151: Ensure AstroPy and Crates behave the same with gzipped files. Change the
behaviour of the AstroPy back end so that it matches that of Crates when given a
file name which does not exist, but a compressed version, with the suffix `.gz`
does. The Crates behavior is to read the file. This extends to PHA files whose
ancillary files - e.g. those stored in the `BACKFILE`, `ANCRFILE`, and
`RESPFILE` keywords - are given as unzipped names, but only the gzipped names
exist on disk.

As an example: if `pha.fits.gz` exists but `pha.fits` does not, then

    load_pha('pha.fits')

will now load the file with either back end. If the response files are set to
`arf.fits` and `rmf.fits` (via the `ANCRFILE` and `RESPFILE` keywords), but only
the `.gz` versions exist, then they will now also be loaded by the AstroPy back
end.

#153: Make comparison test in `calc_chi2datavar_errors` less stringent, so to
include the case where `sqrt(x)=0`.

#155: The `get_draws` function now accepts a user-provided covariance matrix. If
no covariance matrix is provided, the covariance matrix computed by the default
implementation is used. Note that `covar()` must be invoked before invoking
`get_draws` if no covariance matrix is provided, otherwise `get_draws` will exit
with an error.

#158: Fix bug that prevented region ascii files to be read in standalone
Sherpa.

#165: Remove usage of deprecated numpy API.

#185: Fix the problem where if the working directory contained a file called
`x` or `y` then the `sherpa.astro.ui.image_data()` function would fail with the message

     DS9Err: Could not display image

#187: Fix #92: a more meaningful message is given to the user when
`sherpa.astro.io` is imported directly and no fits backends are available.

#188: Fix #93. The `sherpa_test` script now tries to install the test
dependencies before running the tests (but not the `sherpatest` package, which
should be installed by the user if necessary, due to its footprint). If this is
not possible, and the necessary dependencies (`pytest`) are not found, then a
meaningful message is given to the user with instructions on how to install the
dependencies. Also, the dependency on `pytest-cov` has been removed. Users can
enable coverage reports from the command line if necessary.

#190: Fix #22 - The datastack package can now be used even if there is no
available plotting backend. In this case, plotting functions will not be
available, but the rest of the datastack functionality will. 


Sherpa 4.8.0
============

This version of Sherpa  introduces 'wstat' statistics which is an extension
of 'cstat' with Poisson background data. It also provides the ability to include
background data with the 'user statistics'.

Many changes were aimed at improving the Xspec extension by making it more
robust, intuitive, and by fixing several bugs. Sherpa 4.8.0 supports Xspec 12.9.0d
and was also tested against versions 12.8.2e, 12.8.2l, and 12.8.2q.

Most of the codebase was reviewed and cleaned up, in particular to remove the
use of deprecated functionality and to comply with Python's PEP8 standard.
More tests were added to the test suite, and
a new testing infrastructure was put in place in order to simplify writing and
running tests, and to measure the test suite code coverage.

More details below (infrastructure changes are not shown):

#32: Fix segfault from CRATES update in 4.8b1. Since v4.8b1 CRATES returns
variable length arrays by default, rather than the zero-padded fixed length
ones it used to return. Sherpa manipulated the arrays so to remove the
zero-padding and obtaining variable length arrays. The change in the CRATES
API resulted in Sherpa segfaulting when trying to manipulate the data coming
from CRATES. In the patch, we use a new API offered by CRATES to get the
old-style fixed-length arrays instead of the new default ones. In the future,
we may want to update the Sherpa code to deal with the new arrays directly.

#44: `save_quality` now correctly outputs 'QUALITY' as the column name,
instead of 'GROUPS'.

#48: Fix up several issues seen in plot labels - titles and Y-axis labels -
for commands such as `sherpa.ui.plot_data`, `sherpa.ui.plot_fit_resid`, and
`sherpa.ui.plot_chisqr`.

#59: Fix bug #38 (grouping twice gives an IndexError exception). An un-handled
corner case in one of the Sherpa internal methods (`utils.create_expr`) was
triggering an `IndexError` when two `group_counts` operations were performed
back to back. The fix handles the case so that applying `group_counts` twice
does not result in an Exception.

#77: Replace `==` and `!=` comparisons to `None` with `is` and `is not`.

#78: OutOfBoundErr exceptions in some sherpa.utils
functions are properly caught. There were several places where screen output
used either `print` or `sys.stderr.write`.

#81: Ensure that XSPEC models which fail - for instance, because a data file
it needs is missing - return 0's for all bins, rather than random values. This
should make it more obvious that something has gone wrong (for instance if the
XSPEC chatter level is low enough not to show any error messages, as is the
case for the default setting used by Sherpa, namely 0).

#82: The XSpec "spectrum number" value is now set to 1 rather than 0, as this
value is 1-based in Xspec.

#83: Removed S-Lang scripts, files, and references in the code.

#84: Clarified error messages in Xspec extension. Also, changed the class of
the exception from `RuntimeError` to more appropriate exception types, in
particular `LookupError`, `ValueError`, `KeyError`. This is a
backwards-incompatible change, in that code that caught the `RuntimeError`
will not catch the new error.

#87: Some methods in `sherpa/fit.py` assigned mutable objects to default
arguments. This has now been fixed. More instances of this issue have been
identified (Bug #95) and will removed in the future.

#90: Added background data to the UserStat class.

#94: Implement wstat statistic as described at the following url:
https://heasarc.gsfc.nasa.gov/xanadu/xspec/manual/XSappendixStatistics.html

#96: Remove the unused myoptfct module.

#99: Correct the documentation for the `set_exposure` function.

#100 Fix bug #97, whereby the save_all function would not create the necessary
`set_source()` line. This does not fix all cases, but it does the simple PHA
case such as

~~~~
load_pha('src.pi')
set_source(xsphabs.gal * powlaw1d.pl)
save_all('test.out).
~~~~

It also ensures that files created by `save_all`
can be run using IPython's %run directive, by explicitly importing the
`sherpa.astro.ui` module.

#101: Fix handling of non-contiguous bins in Xspec - i.e. when a model is
called with both xlo and xhi arguments but the bins do not fully cover the
energy, or wavelenth, range. This fixes #62 (for XSPEC 12.8.2; switching to
XSPEC 12.9.0 should also fix it) and #56. It also fixes an (un-reported)
problem with handling of non-contiguous grids when using a table model, where
a crash was likely.  When an XSPEC model is called with both low and high
values for the grid - i.e. with two arguments - then the two arrays are
checked to have the same length, and a ValueError is raised if this condition
does not hold. This is a breaking change, but the results are not guaranteed
to be correct if the two arrays are not the same length.  The experimental
interface for XSPEC convolution models has changed, so that the function call
takes pars, fluxes, xlo, with optional xhi whereas before it was pars, xlo,
xhi, fluxes. This is a breaking change, but this is in the low-level API that
is not documented to users, and adds useful functionality (the ability to have
xhi be optional). The cpflux convolution model has been added. Note that these
models do not have Python classes associated with them as they are still an
experimental interface.  The test suite has been updated to test the new and
changed functionality in this PR. The choice of models is made so as to avoid
known problematic models (with a version check where relevant).  It is
believed that the changes in this PR fixes #42, although this is hard to prove
conclusively given the erratic nature of the bug.

#110: Update the sherpa.astro.datastack module documentation to include information from the
CIAO ahelp documentation and to match the style used by the sherpa.astro.ui module.

#111: Update the documentation to include more information about the pyBLoCXS code.
