This file contains a log-book for major changes between releases.

v23.2.1
=======
- Add access operator support for core.dataset.DatasetCollection.

    - Individual datasets of a dataset collection (``dsc``) can now be accessed
      via ``dsc[name]`` or ``dsc[name1, name2, ...]``.

- Allow the definition of an origin of a dataset via the
  core.dataset.DatasetOrigin class and download the dataset automatically from
  the origin to the local host. The following transfer methods are provided:

    - wget
    - rsync

  Unit tests for these transfer methods are added.

- The iminuit package is an optional tool now.

- Introduce class core.random.RandomChoice to replace numpy.random.choice with a
  faster implementation avoiding the recalculation of the cumulative
  distribution function (CDF) when called several times (trials) for the same
  probabilities (dataset). This new class is used in background and signal
  event generation from MC, resulting in a great performance increase when
  generating many trials with many events.

- The core.pdf.MultiDimGridPDF class has been adapted to the new Python
  interface of photospline that supports numpy arrays. The determination of the
  spline table's basis function indices has been separated from the spline table
  evaluation which provides an accelerated PDF evaluation.

- The core.dataset.Dataset.get_aux_data method got the new optional argument
  "default" to specify a default return value if the auxiliary data is not
  defined for that dataset.

- The core.signal_generator.MCMultiDatasetSignalGenerator get the new optional
  constructor argument "valid_event_field_ranges_dict_list=None" to specify
  valid event field ranges, e.g. for the declination. If generated signal events
  do not match these valid event field ranges, those signal events will be
  redrawn.

- The i3.signal_generation.PointLikeSourceI3SignalGenerationMethod class uses
  the new rotation function core.utils.coords.rotate_signal_events_on_sphere
  to preserve the position angle and great circle distance between the event's
  true and reco directions.

- Corrected the calculation of the number of signal events to be generated for
  each individual dataset in the
  core.signal_generator.MultiDatasetSignalGenerator class.

- Operations for "unstable" events in the
  core.llhratio.ZeroSigH0SingleDatasetTCLLHRatio.calculate_log_lambda_and_grads
  method are only performed if there are actually such events.

- Added argument "iprint" to the constructor of the
  core.minimizer.LBFGSMinimizerImpl class to be able to print out more minimizer
  internal statistics.

- Added keyword argument "minimizer_rss" to method
  core.analysis.Analysis.do_trial and subsequent methods, like
  core.analysis.Analysis.do_trial_with_given_pseudo_data.

  It is now possible to specify a separate RandomStateService (RSS) for the
  minimizer. This will make sure that trial pseudo data generation is not
  influenced by the minimizer when generating new initial fit parameter values
  after the minimizer failed.

- Changed keyword argument name "rss" of method core.analysis.Analysis.unblind
  to "minimizer_rss" to be consistent with the new "minimizer_rss" keyword
  argument of core.analysis.Analysis.do_trial.

- Added background generation method class
  core.background_generation.CompositeMCDataSamplingBkgGenMethod.

  This new background generation method samples background events from a
  monte-carlo sample and has the ability to calculate different background
  component rates for each trial after the monte-carlo events were already
  scrambled. This is useful in cases where a background component is
  non-isotropic, i.e. depends on the position in the sky. An example would be a
  background component from the galactic plane.

v23.2.0
=======
- Complete overhaul of SkyLLH for more generic handling of parameters
  (fixed & fit parameters) and their mapping to sources.

    - Single class core.parameters.Parameter for fixed and fit parameters.
    - New class core.parameters.ParameterModelMapper to map global parameters
      to local model (e.g. source) parameters.
    - Class method core.pdf.PDF.get_pd takes structured numpy.ndarray as
      argument, holding local parameter names and values for each source.

- Intrinsic support for multiple sources.

    - New class property core.trialdata.TrialDataManager.src_evt_idxs with
      source and event indices mapping selected events to the sources.

- Simplification of the class hierarchy & source code structure.

    - The source_model and flux_model modules of the skyllh.physics module have
      been moved to the skyllh.core module.

- Local configuration for an analysis.

    - The global configuration dictionary skyllh.core.config.CFG has been
      replaced by a local skyllh.core.config.Config instance, which is passed to
      an Analysis instance and all other class instances that need access to the
      configuration. Classes derived from skyllh.core.config.HasConfig provide
      the cfg property and require the cfg argument in their constructor.

- Data field specification via stages for data file loading

    - Which data fields of a data file are required by the data preparation or
      the analysis is now specified via data field stages through the
      configuration. Data field stages are defined through class members of the
      skyllh.core.datafields.DataFieldStages class.

- Split the background generator into DatasetBackgroundGenerator and
  MultiDatasetBackgroundGenerator to allow different background generators for
  different datasets / detectors.

  - This removes the background generation method argument of the Analysis
    class. The BackgroundGenerationMethod instance is now passed to the
    DatasetBackgroundGenerator constructor.

- New generic flux model function concept.
- New generic PDF class for time PDFs.
- Support for Parquet data files via optional pyarrow Python package.
- Introduce factory concept for detector signal yield construction.

    DetSigYieldBuilder classes can provide a factory function to construct
    DetSigYield instances efficiently for multiple flux models.

- Speed improvements for analysis creation and trial generation.

    - i3.detsigyield.SingleParamFluxPointLikeSourceI3DetSigYieldBuilder:

        MC events are sorted in sin(true_dec) before histograms are made for
        each parameter value. Thus, numpy.histogram works faster.

    - core.event_selection.SpatialBoxEventSelectionMethod:

        Improved calculation of right-ascension difference. Thus, speed-up in
        trial generation when using this event selection method.

- core.scrambling.DataScrambler.scramble_data method also takes Dataset instance
  as argument
- Usage of the tqdm Python package for progress bars.
- More unit tests.
- Improved documentation.
- Following PEP8 coding style standard.

v23.1.1
=======
- bugfix of core.pdf.MultiDimGridPDFSet
- bugfix of core.pdf.MappedMultiDimGridPDFSet
- removal of deprecated property core.pdf.PDFSet.pdf_axes

v23.1.0
=======
