From 6e9148064763f7f67859cbdd014aed05a9ecf7fc Mon Sep 17 00:00:00 2001 From: caes Date: Tue, 8 Aug 2017 06:36:00 -0400 Subject: [PATCH] sampling SED --- src/generate_spline_sed.cpp | 12 +----- src/sed.hpp | 85 ++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/src/generate_spline_sed.cpp b/src/generate_spline_sed.cpp index 61309d7..cc8a709 100644 --- a/src/generate_spline_sed.cpp +++ b/src/generate_spline_sed.cpp @@ -14,7 +14,6 @@ int main(int argc, char const *argv[]) int n = 1000; agn::sed_table SED; agn::sed_table samples; - agn::sed_spline agnsource; const char* sample_filename = argv[1]; const char* output_filename = argv[2]; @@ -38,14 +37,12 @@ int main(int argc, char const *argv[]) // Read in sampling table and construct a spline model. samples = agn::read_sed_table(sample_table); - agnsource = agn::sed_spline(samples); + agn::sed_spline agnsource(samples); - if(agn::debug) debug_file { - std::cout + if(agn::debug) debug_file << "Read samples:\n" << format_sed_table(samples); - } if(agn::verbose) std::cout << "Evaluating relative spectral intensity for " @@ -61,11 +58,6 @@ int main(int argc, char const *argv[]) output_table << agn::format_sed_table(SED); - if(agn::verbose) std::cout - << "Printing CLOUDY interpolate command syntax to file " - << cloudyscript_filename - << "\n"; - if(agn::verbose) std::cout << "Closing files. Goodbye.\n"; diff --git a/src/sed.hpp b/src/sed.hpp index a6c606b..0e2763c 100644 --- a/src/sed.hpp +++ b/src/sed.hpp @@ -36,23 +36,27 @@ const double IN_EV_2500A=12398.41929/2500; // SEDs are represented by 2d histogram tables. struct sed_table { std::string header; - table_1d value; + table1d value; }; class sed { +public: // Continuum output functions // Returns histogram with n bins evenly space in log space sed_table histogram_table(int n); // Argument is photon energy in eV - virtual double sed(double hnu); -} + virtual double value(double hnu) {}; -class sed_spline : sed { + sed() {}; +}; + +class sed_spline : public sed { private: - Spline _spline; + Spline _spline; public: + double value(double hnu); sed_spline(agn::sed_table& samples); // These parameters might still be useful for rolling off various quantities, but aren't used in the strict-spline case. @@ -75,8 +79,9 @@ public: double _xray_coefficient; }; -class sed_pow_law : sed { +class sed_pow_law : public sed { public: + double value(double hnu); // Argument is photon energy in eV double eval_uv(double hnu); double eval_xray(double hnu); @@ -117,18 +122,39 @@ public: ); }; +// Returns coord in eV for given relative coord. +double hnu_at(int i,int n); + +// Takes an SED table as input and returns a string with format: +// '\t\n' for each energy-flux pair +std::string format_sed_table(sed_table table); + +// Read continuum from file with '\t\n' formatting. +// Will ignore up to 1 header. +sed_table read_sed_table(std::ifstream& table_file); + +// Does the same but converts hnu from rydberg to eV. +sed_table read_and_convert_sed_table(std::ifstream& table_file); + +// Cloudy takes the SED density as input. This function outputs +// the corresponding SED table's SED density function in the form +// of a cloudy input script "interpolate" command. +std::string cloudy_interpolate_str(sed_table SED); + +} // end namespace agn + // Constructors agn::sed_spline::sed_spline(agn::sed_table& samples) { std::vector x; std::vector y; - iterator2d table_it = samples.begin(); - while(table_it != samples.end()) { - x.push(table_it->first); - y.push(table_it->second); + iterator1d table_it = samples.value.begin(); + while(table_it != samples.value.end()) { + x.push_back(table_it->first); + y.push_back(table_it->second); } - Spline newspline(x,y); + Spline newspline(x,y); _spline = newspline; } @@ -167,18 +193,18 @@ agn::sed_table agn::sed::histogram_table(int n){ double max=0,min=1,hnu; for(int i=0; ised(hnu); + output.value[hnu] = this->value(hnu); if (output.value[hnu] > max) max = output.value[hnu]; if (output.value[hnu] < min) min = output.value[hnu]; } // Add a final point at 100 KeV hnu = 1e5; - output.value[hnu] = this->sed(hnu); + output.value[hnu] = this->value(hnu); return output; } // sed_spline evaluation -double agn::sed_spline::sed(double hnu) { +double agn::sed_spline::value(double hnu) { double magnitude=0.0; magnitude += this->_spline[hnu]; if (magnitude < agn::CONT_MIN_VAL) return agn::CONT_MIN_VAL; @@ -186,7 +212,7 @@ double agn::sed_spline::sed(double hnu) { } // sed_pow_law evaluations -double agn::sed_pow_law::sed(double hnu) { +double agn::sed_pow_law::value(double hnu) { double magnitude=0.0; magnitude += this->eval_uv(hnu); magnitude += this->eval_xray(hnu); @@ -220,29 +246,12 @@ double agn::sed_pow_law::SED_at_2KeV() { + + + + // Utilities -// Returns coord in eV for given relative coord. -double hnu_at(int i,int n); - -// Takes an SED table as input and returns a string with format: -// '\t\n' for each energy-flux pair -std::string format_sed_table(sed_table table); - -// Read continuum from file with '\t\n' formatting. -// Will ignore up to 1 header. -sed_table read_sed_table(std::ifstream& table_file); - -// Does the same but converts hnu from rydberg to eV. -sed_table read_and_convert_sed_table(std::ifstream& table_file); - -// Cloudy takes the SED density as input. This function outputs -// the corresponding SED table's SED density function in the form -// of a cloudy input script "interpolate" command. -std::string cloudy_interpolate_str(sed_table SED); - -} // end namespace agn - agn::sed_table agn::read_sed_table(std::ifstream& table_file) { sed_table resultant; std::string scratch; @@ -284,7 +293,7 @@ std::string agn::format_sed_table(agn::sed_table table) { std::stringstream output; if (!table.header.empty()) output << table.header; output << std::setprecision(5); - agn::table2d::iterator table_iterator; + agn::table1d::iterator table_iterator; table_iterator=table.value.begin(); while(table_iterator != table.value.end()) { output @@ -301,7 +310,7 @@ std::string agn::format_sed_table(agn::sed_table table) { std::string agn::cloudy_interpolate_str(agn::sed_table table) { std::stringstream output; - agn::table2d::iterator table_iterator = table.value.begin(); + agn::table1d::iterator table_iterator = table.value.begin(); // Lead in to uv bump at slope=2 in log(energy [rydberg]) space double energy_in_rydbergs = table_iterator->first / agn::RYDBERG_UNIT_EV;