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