Program Listing for File source.h

Return to documentation for file (include/source.h)

#ifndef SOURCE_H
#define SOURCE_H

#include <vector>
#include <map>

class Source {
public:
    /* Constructor */
    Source();

    /* Destructor - it's important that this is virtual ! */
    virtual ~Source();

    virtual std::vector<double> get_interpolated_spectral_density(std::vector<double> wavelength);

    void set_doppler_shift(double shift);

    void set_integration_steps(int n);

    virtual std::vector<double> get_photon_flux(std::vector<double> wavelength);

    virtual std::vector<double> get_wavelength() {};

    bool is_list_like() { return list_like; };

    bool is_stellar_source() { return stellar_source; };

    std::string get_source_name() { return name; };

protected:
    virtual double get_spectral_density(double wavelength) {};

    bool list_like;
    bool stellar_source;
    std::string name;
    double shift;
    double s_val = 1.0;

    double integral_s(double a, double b, int n);

    int integration_steps;
};

class CalibrationSource : public Source {
public:
    CalibrationSource();
};

class StellarSource : public Source {
public:
    StellarSource(double magnitude, double telescope_area);

    // std::vector<double> get_interpolated_spectral_density(std::vector<double> wavelength);

protected:
    double mag;
    double telescope_area;
    double v_zp = 3.68E-02;

    double min_w = 0;
    double max_w = 10.;

    void calc_flux_scale();
};

class Constant : public CalibrationSource {
public:
    /* Default Constructor */
    Constant();

    Constant(double value);

    double get_spectral_density(double wavelength);

private:
    /* Constant spectral density value */
    double value;
};

class IdealEtalon : public CalibrationSource {
public:
    IdealEtalon(double d, double n, double theta, double R, double I);

    static double coefficient_of_finesse(double R);

    static double T(double wl, double theta, double d, double n, double cF);

protected:
    double get_spectral_density(double wavelength);

private:
    double get_local_efficiency(double wavelength);

    double d;
    double n;
    double theta;
    double R;
    double cF;
    double I;
};

class Blackbody : public StellarSource {
public:
    Blackbody(double T, double magnitude, double telescope_area);

    double planck(const double &T, const double &wavelength);

    double get_spectral_density(double wavelength);

private:
    double T;
};

class PhoenixSpectrum : public StellarSource {
public:
    PhoenixSpectrum(std::string spectrum_file, std::string wavelength_file, double magnitude,
                    double telescope_area);

    double get_spectral_density(double wavelength);

private:
    void read_spectrum(std::string spectrum_file, std::string wavelength_file);

    // contains wavelength, spectrum data
    std::map<double, double> data;
};

class CoehloSpectrum : public StellarSource {
public:
    CoehloSpectrum(std::string spectrum_file, double magnitude, double telescope_area);

    void read_spectrum(std::string spectrum_file);

    double get_spectral_density(double wavelength);

private:

    std::map<double, double> data;

};

class CustomSpectrum : public StellarSource {
public:
    CustomSpectrum(double magnitude, double telescope_area, const std::string spectrum_file,
                   std::string wave_file);

    void read_spectrum(const std::string spectrum_file, std::string wave_file);

    double get_spectral_density(double wavelength);

private:

    std::map<double, double> data;

};

class LineList : public CalibrationSource {
public:
    LineList(const std::string linelist_file);

    void read_spectrum(std::string linelist_file);

    double get_spectral_density(double wavelength);

    std::vector<double> get_interpolated_spectral_density(std::vector<double> wavelength);

    std::vector<double> get_wavelength();

    std::vector<double> event;
    std::vector<double> intensity;


private:
    std::map<double, double> data;
};

#endif // SOURCE_H