Program Listing for File SpecsynLibChained.hpp

↰ Return to documentation for file (src/specsyn/SpecsynLibChained.hpp)

#ifndef SPECSYNLIBCHAINED_HPP
#define SPECSYNLIBCHAINED_HPP

#include "../io/SimControls.hpp"
#include "Specsyn.hpp"
#include "SpecsynCommons.hpp"
#include <array>
#include <cstddef>
#include <memory>
#include <string>
#include <utility>
#include <vector>

namespace specsyn
{

    class SpecsynLibChained : public Specsyn
    {
    public:

        SpecsynLibChained(
            const std::vector<std::string>& spectraName,
            double fehMin,
            double fehMax,
            double afe,
            double cfe,
            const std::vector<double>& microTurb,
            double r,
            const std::string& registryName,
            double wlMin,
            double wlMax,
            std::size_t nWl,
            bool tClamp,
            const io::SimControls& controls);

        [[nodiscard]] auto spec(const StarData& props, double feh) const
        -> std::vector<double> override;

        [[nodiscard]] auto specForIntegration(const StarData& props, double feh) const
        -> std::vector<double> override;

        [[nodiscard]] static auto makeCommonWlGrid(
            const std::vector<std::vector<double>>& wlGrids) -> std::vector<double>;

        [[nodiscard]] auto wnlTeffRanges() const -> const std::array<std::pair<double, double>, 3>&
        {
            return wnlTeffRanges_;
        }

        [[nodiscard]] auto normalLogTeffMax() const -> double { return normalLogTeffMax_; }

    private:

        void propagateWNLTeffRanges();

        void updateFeHRanges();

        void updateLoggRanges();

        [[nodiscard]] auto clampFehForLibrary(
            double feh, double logg, GridType type, std::size_t libIdx) const -> std::pair<double, double>;

        [[nodiscard]] static auto propsWithClampedLogg(
            StarData props, double currentLogg, double clampedLogg) -> StarData;

        void warnIfFeHClamped(double fehMin, double fehMax) const;

        [[nodiscard]] auto chainFor(GridType type) const -> const std::vector<std::unique_ptr<Specsyn>>&;

        [[nodiscard]] auto clampNormalLogTeffFloor(StarData props, GridType type) const -> StarData;

        std::vector<std::unique_ptr<Specsyn>> wrLibs_;

        std::vector<std::unique_ptr<Specsyn>> wdLibs_;

        std::vector<std::unique_ptr<Specsyn>> normalLibs_;

        static constexpr std::size_t nGridType = static_cast<std::size_t>(GridType::nGridType);

        std::array<double, nGridType> logTeffMin_;
        std::array<double, nGridType> logTeffMax_;
        std::array<double, nGridType> loggMin_;
        std::array<double, nGridType> loggMax_;
        std::array<std::pair<double, double>, 3> wnlTeffRanges_;

        double normalLogTeffMax_;

        std::array<std::vector<double>, nGridType> fehMin_;
        std::array<std::vector<double>, nGridType> fehMax_;
        std::array<std::vector<double>, nGridType> loggLibMin_;
        std::array<std::vector<double>, nGridType> loggLibMax_;
        std::array<std::vector<std::string>, nGridType> libNames_;
    };

} // namespace specsyn

#endif // SPECSYNLIBCHAINED_HPP