Program Listing for File matrixsimulator.h

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

#ifndef MATRIXSIMULATOR_H
#define MATRIXSIMULATOR_H

#include <memory>
#include "helper.h"
#include "spline.h"
#include "efficiency.h"
#include "source.h"
#include "PSF.h"
#include "CCD.h"
#include "telescope.h"
#include <array>

struct raw_transformation {
    int order;
    double wavelength;
    std::array<double, 6> transformation_matrix;
    std::vector<double> decomposed_matrix;
};

struct spectrograph_information {
    double alpha;
    double gpmm;
};

typedef struct raw_transformation raw_transformation;

class MatrixSimulator {
public:
    MatrixSimulator(const std::string path, int fiber_number, bool keep_ccd);

    void set_wavelength(int N);

    void set_wavelength(std::vector<double> wavelength);

    void add_efficiency(Efficiency *eff);

    void set_telescope(Telescope *telescope);

    void set_source(Source *src);

    void save_to_hdf(const std::string filename, bool bleed = true, bool overwrite = false);

    void save_to_fits(const std::string filename, bool bleed = true, bool overwrite = false);

    void save_1d_to_fits(const std::string filename);

    double get_alpha();

    double get_gpmm();

    int get_fiber_number();

    void simulate(double t, unsigned long seed);

    double get_minimum_wavelength();

    double get_maximum_wavelength();

    void add_background(double bias, double noise, unsigned long seed);

private:
    void load_spectrograph_model(const std::string path, int fiber_number, bool keep_ccd = false);

    void calc_splines();

    std::array<double, 6> get_transformation_matrix(int order, double wavelength);

    inline std::array<double, 6> get_transformation_matrix_lookup(int o, double wavelength);

    void set_efficiencies(std::vector<Efficiency *> &efficiencies);

//    void set_ccd(CCD *ccd);

//    void set_slit(Slit *slit);

//    void set_psfs(PSF *psfs);

    void prepare_source(Source *source);

    void prepare_psfs(int N);

    void prepare_matrix_lookup(int N);

    std::vector<int> orders;
    int fiber_number;
    int n_orders;
    int min_order;
    // highest order number
    int max_order;
    double wavelength_limit_max = 0.; // will be overwritten by load_spectrograph model
    double wavelength_limit_min = 100.; // will be overwritten by load_spectrograph model
    std::map<int, std::vector<raw_transformation> > raw_transformations;
    std::vector<Efficiency *> efficiencies;
    Source *source;
    Telescope telescope;
    CCD *ccd;
    PSF *psfs;

    std::vector<std::vector<double>> sim_wavelength;
    std::vector<std::vector<double>> sim_efficiencies;
    std::vector<std::vector<double>> sim_flux;
    std::vector<std::vector<double>> flux_times_efficiency;
    std::vector<double> sim_total_efficiency_per_order;
    std::vector<std::vector<Matrix>> sim_psfs;
    std::vector<std::vector<double>> sim_psfs_wavelength;
    std::vector<double> sim_psfs_dwavelength;
    std::vector<std::vector<int>> sim_1d;


    std::vector<std::vector<double>> sim_p;
    std::vector<std::vector<double>> sim_q;
    std::vector<std::vector<double>> sim_r;
    std::vector<std::vector<double>> sim_phi;
    std::vector<std::vector<double>> sim_tx;
    std::vector<std::vector<double>> sim_ty;

    std::vector<std::vector<double>> sim_m00;
    std::vector<std::vector<double>> sim_m01;
    std::vector<std::vector<double>> sim_m10;
    std::vector<std::vector<double>> sim_m11;

    std::vector<std::vector<double>> sim_matrix_wavelength;
    std::vector<double> sim_matrix_dwavelength;

    std::vector<tk::spline> tr_p;
    std::vector<tk::spline> tr_r;
    std::vector<tk::spline> tr_q;
    std::vector<tk::spline> tr_phi;
    std::vector<tk::spline> tr_tx;
    std::vector<tk::spline> tr_ty;

    spectrograph_information spec_info;
};

#endif // MATRIXSIMULATOR_H