Program Listing for File NuMagSANSlib_SpectralDataTable.h#

↰ Return to documentation for file (src/OutputData/SpectralData/NuMagSANSlib_SpectralDataTable.h)

#pragma once

#include <string>
#include <vector>

#include "NuMagSANSlib_SpectralDataStruct.h"

struct SpectralComponent {
    std::string name;
    const float* data;

    SpectralComponent(const std::string& n, const float* d) : name(n), data(d) {}
};

struct SpectralColumn {
    std::string name;
    const float* data;

    SpectralColumn(const std::string& n, const float* d) : name(n), data(d) {}
};

inline std::vector<SpectralComponent> build_spectral_intensities(SpectralData* SpecData) {
    return {{"I_Nuc_unpolarized", SpecData->I_Nuc_unpolarized},
            {"I_Mag_unpolarized", SpecData->I_Mag_unpolarized},
            {"I_Mag_polarized", SpecData->I_Mag_polarized},
            {"I_NucMag", SpecData->I_NucMag},
            {"I_Mag_chiral", SpecData->I_Mag_chiral},
            {"I_Mag_spin_flip", SpecData->I_Mag_spin_flip},
            {"I_Mag_spin_flip_pm", SpecData->I_Mag_spin_flip_pm},
            {"I_Mag_spin_flip_mp", SpecData->I_Mag_spin_flip_mp},
            {"I_Mag_non_spin_flip_pp", SpecData->I_Mag_non_spin_flip_pp},
            {"I_Mag_non_spin_flip_mm", SpecData->I_Mag_non_spin_flip_mm},
            {"I_Mag_sanspol_p", SpecData->I_Mag_sanspol_p},
            {"I_Mag_sanspol_m", SpecData->I_Mag_sanspol_m}};
}

inline std::vector<SpectralComponent> build_spectral_amplitudes(SpectralData* SpecData) {
    return {{"A_Nuc_unpolarized", SpecData->A_Nuc_unpolarized},
            {"A_Mag_unpolarized", SpecData->A_Mag_unpolarized},
            {"A_Mag_polarized", SpecData->A_Mag_polarized},
            {"A_NucMag", SpecData->A_NucMag},
            {"A_Mag_chiral", SpecData->A_Mag_chiral},
            {"A_Mag_spin_flip", SpecData->A_Mag_spin_flip},
            {"A_Mag_spin_flip_pm", SpecData->A_Mag_spin_flip_pm},
            {"A_Mag_spin_flip_mp", SpecData->A_Mag_spin_flip_mp},
            {"A_Mag_non_spin_flip_pp", SpecData->A_Mag_non_spin_flip_pp},
            {"A_Mag_non_spin_flip_mm", SpecData->A_Mag_non_spin_flip_mm},
            {"A_Mag_sanspol_p", SpecData->A_Mag_sanspol_p},
            {"A_Mag_sanspol_m", SpecData->A_Mag_sanspol_m}};
}

inline std::vector<SpectralColumn> build_spectral_intensity_columns(SpectralData* SpecData,
                                                                    const SpectralComponent& comp) {
    unsigned int Nq = *SpecData->Nq;
    unsigned int k_max = *SpecData->k_max;
    unsigned int L = k_max + 1;
    unsigned int offset_cos = 0;
    unsigned int offset_sin = Nq * L;

    std::vector<SpectralColumn> columns;
    columns.emplace_back("q", SpecData->q);

    for (unsigned int k = 0; k <= k_max; ++k) {
        columns.emplace_back("Ic_" + std::to_string(k), comp.data + offset_cos + k * Nq);
    }

    for (unsigned int k = 0; k <= k_max; ++k) {
        columns.emplace_back("Is_" + std::to_string(k), comp.data + offset_sin + k * Nq);
    }

    return columns;
}

inline std::vector<SpectralColumn>
build_spectral_amplitude_columns(SpectralData* SpecData, const SpectralComponent& comp, std::vector<float>& k_values) {
    unsigned int k_max = *SpecData->k_max;
    unsigned int L = k_max + 1;

    k_values.resize(L);
    for (unsigned int k = 0; k <= k_max; ++k) {
        k_values[k] = static_cast<float>(k);
    }

    std::vector<SpectralColumn> columns;
    columns.emplace_back("k", k_values.data());
    columns.emplace_back("A_cos", comp.data);
    columns.emplace_back("A_sin", comp.data + L);

    return columns;
}