Skip to content

File filesmanager.h

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

Go to the documentation of this file

#ifndef COSMOINTERFACE_MEASUREMENTS_FILESMANAGER_H
#define COSMOINTERFACE_MEASUREMENTS_FILESMANAGER_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 <filesystem>

#include "TempLat/util/exception.h"
#include "TempLat/lattice/memory/memorytoolbox.h"
#include "TempLat/lattice/field/field.h"
#include "TempLat/lattice/IO/HDF5/helpers/hdf5group.h"
#include "TempLat/lattice/IO/HDF5/helpers/hdf5file.h"
#ifdef HAVE_HDF5
#include "TempLat/lattice/IO/HDF5/filesaverhdf5.h"
#endif

namespace TempLat
{
  MakeException(UseHDF5ButNotCompiled);
  MakeException(FileAlreadyExistsError);

  template <size_t NDim> class FilesManager
  {
  public:
    FilesManager(ParameterParser &parser, std::string fn, device::memory::host_ptr<MemoryToolBox<NDim>> toolbox,
                 bool pUseHDF5, bool pUseHDF5Spectra, bool pPrintHeaders, bool pAppendMode, bool pOverwriteMode,
                 std::string pTag = "", ptrdiff_t pFlushFreq = 1, ptrdiff_t pNMeas = 0, ptrdiff_t pNMeasInfreq = 0,
                 bool isUnbinned = false)
        : mToolbox(toolbox), mUseHDF5(pUseHDF5), mUseHDF5Spectra(pUseHDF5Spectra || isUnbinned), mPrintHeaders(pPrintHeaders),
          mAppendMode(pAppendMode), mOverwriteMode(pOverwriteMode),
          workingDir(fn), tag(pTag), flushFreq(pFlushFreq), nMeas(pNMeas), nMeasInfreq(pNMeasInfreq)
    {
#ifdef HAVE_HDF5
      auto ensureFreshOrAppend = [&](const std::string &h5fn, bool saveParser) {
        if (!prepareOutputFile(h5fn)) return;
        FileSaverHDF5 fs;
        fs.create(h5fn, Exclusive);
        if (saveParser) fs.save_attr(parser);
        fs.close();
      };
      if (mUseHDF5) ensureFreshOrAppend(getHDF5Fn(), true);
      if (mUseHDF5Spectra && !isUnbinned) ensureFreshOrAppend(getHDF5SpectraFn(), false);
      if (isUnbinned) ensureFreshOrAppend(getHDF5UnbinnedSpectraFn(), false);
#endif
    }

    bool prepareOutputFile(const std::string &fn) const
    {
      const bool exists = std::filesystem::exists(fn);
      if (mAppendMode) return !exists;
      if (exists && mToolbox->amIRoot()) {
        if (mOverwriteMode) std::filesystem::remove(fn);
        else throw(FileAlreadyExistsError(
            "Refusing to overwrite existing output file \"" + fn +
            "\". Set 'appendToFiles = true' to append, or 'overwriteFiles = true' to delete."));
      }
      return true;
    }

    void flush() {}

    bool getUseHDF5() const { return mUseHDF5; }
    bool getUseHDF5Spectra() const { return mUseHDF5Spectra; }
    bool getPrintHeaders() const { return mPrintHeaders; }
    bool getAppendMode() const { return mAppendMode; }
    bool getOverwriteMode() const { return mOverwriteMode; }

    auto getToolBox() const { return mToolbox; }

    std::string getWorkingDir() const { return workingDir; }
    std::string getTag() const { return tag; }
    std::string getHDF5Fn() const { return getWorkingDir() + getTag() + "average.h5"; }
    std::string getHDF5SpectraFn() const { return getWorkingDir() + getTag() + "spectra.h5"; }
    std::string getHDF5UnbinnedSpectraFn() const { return getWorkingDir() + getTag() + "unbinned_spectra.h5"; }

    template <typename T>
    std::string getCurredName(const Field<T, NDim> &fld, bool withDir, std::string nametag = "average_")
    {
      std::string name = fld.toString();
      name = name.erase(name.find("(", 3));
      name = withDir ? getWorkingDir() + nametag + name : nametag + name;
      return name;
    }

    template <typename T>
    std::string getSimpleName(const Field<T, NDim> &fld)
    {
      std::string name = fld.toString();
      name = name.erase(name.find("(", 3));
      return name;
    }

    auto getFlushFreq() const { return flushFreq; }
    auto getNMeas() const { return nMeas; }
    auto getNInfreqMeas() const { return nMeasInfreq; }

  private:
    device::memory::host_ptr<MemoryToolBox<NDim>> mToolbox;
    bool mUseHDF5, mUseHDF5Spectra, mUseHDF5UnbinnedSpectra;
    bool mPrintHeaders;
    bool mAppendMode;
    bool mOverwriteMode;
    std::string workingDir;
    std::string tag;
    ptrdiff_t flushFreq;
    ptrdiff_t nMeas;
    ptrdiff_t nMeasInfreq;
  };

} // namespace TempLat

#endif