Skip to content

File spectrumsaver.h

File List > code_source > cosmolattice > include > CosmoInterface > measurements > measurementsIO > spectrumsaver.h

Go to the documentation of this file

#ifndef COSMOINTERFACE_MEASUREMENTS_SPECTRUMSAVER_H
#define COSMOINTERFACE_MEASUREMENTS_SPECTRUMSAVER_H

/* This file is part of CosmoLattice, available at www.cosmolattice.net .
   Copyright Daniel G. Figueroa, Adrien Florio, Francisco Torrenti and Wessel Valkenburg.
   Released under the MIT license, see LICENSE.md. */

// File info: Main contributor(s): Daniel G. Figueroa, Adrien Florio, Francisco Torrenti,  Year: 2019

#include "CosmoInterface/measurements/measurementsIO/std/spectrumsaverstd.h"
#include "TempLat/lattice/measuringtools/projectionhelpers/unbinnedradialprojectionresult.h" //Added so that the code compiles without HDF5, even if not used here
#ifdef HAVE_HDF5
#include "CosmoInterface/measurements/measurementsIO/hdf5/spectrumsaverhdf5.h"
#include "CosmoInterface/measurements/measurementsIO/hdf5/unbinnedspectrumsaverhdf5.h"
#endif

namespace TempLat
{
  template <typename T> class SpectrumSaver
  {
  public:
    // Put public methods here. These should change very little over time.

    // @label:spectrumsaver_constructor
    template <size_t NDim>
    SpectrumSaver(FilesManager<NDim> &fm, std::string fn, bool amIRoot, bool appendMode, const RunParameters<T> &rPar,
                  bool dontCreate = false)
        : useHDF5(fm.getUseHDF5Spectra()), unbinnedSpectra(rPar.unbinnedSpectra)

    {
      if (!dontCreate) {
        if (unbinnedSpectra) {
#ifdef HAVE_HDF5
          unbinnedSaverHDF5 = std::make_shared<UnbinnedSpectrumSaverHDF5<T>>(fm, fn, amIRoot, appendMode, rPar);
#else
          throw(UseHDF5ButNotCompiled("Unbinned spectra needs HDF5, but compiled without HDF5 option."));
#endif
        } else if (useHDF5) {
#ifdef HAVE_HDF5
          saverHDF5 = std::make_shared<SpectrumSaverHDF5<T>>(fm, fn, amIRoot, appendMode, rPar);
#else
          throw(UseHDF5ButNotCompiled(
              "Call to use HDF5 for the measurementsIO output, but compiled without HDF5 option."));
#endif
        } else {
          saverStd = std::make_shared<SpectrumSaverStd<T>>(fm, fn, amIRoot, appendMode, rPar);
        }
      }
    }
    // @endlabel

    template <size_t NDim>
    SpectrumSaver(FilesManager<NDim> &fm, const Field<T, NDim> &fld, bool amIRoot, bool appendMode,
                  const RunParameters<T> &rPar, bool dontCreate = false)
        : useHDF5(fm.getUseHDF5Spectra()), unbinnedSpectra(rPar.unbinnedSpectra)
    {

      if (!dontCreate) {
        if (unbinnedSpectra) {
#ifdef HAVE_HDF5
          unbinnedSaverHDF5 = std::make_shared<UnbinnedSpectrumSaverHDF5<T>>(fm, fld, amIRoot, appendMode, rPar);
#else
          throw(UseHDF5ButNotCompiled("Unbinned spectra needs HDF5, but compiled without HDF5 option."));
#endif
        } else if (useHDF5) {
#ifdef HAVE_HDF5
          saverHDF5 = std::make_shared<SpectrumSaverHDF5<T>>(fm, fld, amIRoot, appendMode, rPar);
#else
          throw(UseHDF5ButNotCompiled(
              "Call to use HDF5 for the measurementsIO output, but compiled without HDF5 option."));
#endif
        } else {
          saverStd = std::make_shared<SpectrumSaverStd<T>>(fm, fld, amIRoot, appendMode, rPar);
        }
      }
    }

    template <template <typename> typename Spectrum, template <typename> typename... Spectra>
    void saveV(bool lastMeas, T &t, std::vector<std::shared_ptr<Spectrum<T>>> &v, Spectrum<T> spectrum1,
               Spectra<T>... spectra)
    {
      v.push_back(std::make_shared<Spectrum<T>>(spectrum1));
      saveV(lastMeas, t, v, spectra...);
    }

    template <template <typename> typename Spectrum>
    void saveV(bool lastMeas, T &t, std::vector<std::shared_ptr<Spectrum<T>>> &v)
    {
      saveSpectra(lastMeas, t, v);
    }

    template <template <typename> typename Spectrum, template <typename> typename... Spectra>
    void save(bool lastMeas, T &t, Spectrum<T> spectrum1, Spectra<T>... spectra)
    {
      std::vector<std::shared_ptr<Spectrum<T>>> v = {std::make_shared<Spectrum<T>>(spectrum1)};
      saveV(lastMeas, t, v, spectra...);
    }

    template <template <typename> typename Spectrum, template <typename> typename... Spectra>
    void save(T &t, Spectrum<T> spectrum1, Spectra<T>... spectra)
    {
      std::vector<std::shared_ptr<Spectrum<T>>> v = {std::make_shared<Spectrum<T>>(spectrum1)};
      saveV(false, t, v, spectra...);
    }

    template <template <typename> typename Spectrum> void save(bool lastMeas, T &t, Spectrum<T> spectrum1)
    {
      std::vector<std::shared_ptr<Spectrum<T>>> v = {std::make_shared<Spectrum<T>>(spectrum1)};
      saveSpectra(lastMeas, t, v);
    }

    template <template <typename> typename Spectrum> void save(T &t, Spectrum<T> spectrum1)
    {
      std::vector<std::shared_ptr<Spectrum<T>>> v = {std::make_shared<Spectrum<T>>(spectrum1)};
      saveSpectra(false, t, v);
    }

    void saveSpectra(bool lastMeas, T &t, std::vector<std::shared_ptr<UnbinnedRadialProjectionResult<T>>> spectra)
    {
#ifdef HAVE_HDF5
      unbinnedSaverHDF5->save(lastMeas, spectra, t);
#else
      throw(UseHDF5ButNotCompiled("Unbinned spectra needs HDF5, but compiled without HDF5 option."));
#endif
    }

    // @label:spectrumsaver_save
    void saveSpectra(bool lastMeas, T &t, std::vector<std::shared_ptr<RadialProjectionResult<T>>> spectra)
    {
      if (useHDF5) {
#ifdef HAVE_HDF5
        saverHDF5->save(lastMeas, spectra, t);
#else
        throw(
            UseHDF5ButNotCompiled("Call to use HDF5 for the measurementsIO output, but compiled without HDF5 option."));
#endif
      } else {
        saverStd->save(spectra, t);
      }
    }
    // @endlabel

  private:
    /* Put all member variables and private methods here. These may change arbitrarily. */

    bool useHDF5, unbinnedSpectra;
    ;
    std::shared_ptr<SpectrumSaverStd<T>> saverStd;
#ifdef HAVE_HDF5
    std::shared_ptr<SpectrumSaverHDF5<T>> saverHDF5;
    std::shared_ptr<UnbinnedSpectrumSaverHDF5<T>> unbinnedSaverHDF5;
#endif
  };

} // namespace TempLat

#endif