21 Dust dust(1.0, 1e10, 0.0);
23 PACS pacs70(70, extend), pacs100(100, extend), pacs160(160, extend);
28 fputs(
"\n**** Blackbody color corrections ****\n", f);
29 fputs(
"Temp(K) 70u 100u 160u\n", f);
30 for (
auto T: {1e4, 1e3, 1e2, 5e1, 1e1, 5e0}) {
31 fprintf(f,
"%5gK %7.3f %7.3f %7.3f\n", T,
32 pacs70.ccf(gray, T), pacs100.ccf(gray, T), pacs160.
ccf(gray, T));
35 fputs(
"\n**** Graybody color corrections ****\n", f);
36 fputs(
"\(beta, T) 70u 100u 160u\n", f);
37 for (
double beta=1.0; beta <= 2.0; beta++) {
39 for (
auto T: {1e2, 1e1}) {
40 fprintf(f,
"(%g, %3gK) = %.3f %.3f %.3f\n", beta, T,
41 pacs70.ccf(gray, T), pacs100.ccf(gray, T), pacs160.
ccf(gray, T));
45 double T = 15.0, Sigma = 1.0, sr = 3.62e-9;
47 fprintf(f,
"\nExample flux = %.2e erg/cm^2/s, Fnu = %.2f Jy, 1/CCF = %.3f\n",
48 gray.
F(T, Sigma, &pacs100, sr),
49 gray.
Inu(pacs100.freqBand(), T, Sigma)*sr/1e-23,
50 1.0/pacs100.ccf(gray, T, Sigma));
52 fputs(
"\n**** Derivative test ****\n", f);
53 fprintf(f,
"dF/dT: %.4e calc, %.4e true\n",
54 (gray.
F(T+1e-3, Sigma, &pacs100, sr)-
55 gray.
F(T-1e-3, Sigma, &pacs100, sr))/2e-3,
56 gray.
dF_dT(T, Sigma, &pacs100, sr));
57 fprintf(f,
"dF/dS: %.4e calc, %.4e true\n",
58 (gray.
F(T, Sigma+1e-3, &pacs100, sr)-
59 gray.
F(T, Sigma-1e-3, &pacs100, sr))/2e-3,
60 gray.
dF_dS(T, Sigma, &pacs100, sr));
76 std::vector<double> x, y;
77 for (
auto &xy: table) {
78 x.push_back(xy.first), y.push_back(ln ? log(xy.second) : xy.second);
80 auto spline = gsl_spline_alloc(gsl_interp_cspline, table.size());
81 gsl_spline_init(spline, &x[0], &y[0], x.size());
91 else { what =
"built", when = std::string(__DATE__) +
" " + __TIME__; }
99 int main(
int argc,
char *argv[])
103 std::vector<mu::CommandLine::Option> opts{
104 {
'A',
"accuracy",
"RELERR",
"",
"",
"",
105 "Maximum relative error for least-squares fit (default: 1e-2)."},
107 {
'B',
"no-band-output",
"",
"",
"",
"",
108 "Do not append input band data to output FITS file."},
110 {
'c',
"check",
"",
"",
"",
"",
111 "Generate comparative PACS color correction tables and exit."},
113 {
'd',
"dust-model",
"NAME",
"",
"",
"",
114 "Dust opacity model (default: OH5)."},
116 {
'e',
"error-map",
"FILE",
"",
"",
"",
117 "Input FITS error map (BAND and TELESCOP keys must match parent image)."},
119 {
'E',
"error-pct",
"PCT",
"",
"",
"",
120 "Percent flux error when error map unavailable (default: 3.0)."},
122 {
'F',
"force",
"",
"",
"",
"",
123 "Force overwrite of existing files."},
125 {
'g',
"gas-to-dust",
"RATIO",
"",
"",
"",
126 "Gas-to-dust ratio (default: 100.0)."},
128 {
'h',
"help",
"",
"",
"",
"",
129 "Display command line help summary and exit."},
131 {
'l',
"log-file",
"FILE",
"",
"",
"",
132 "Redirect log output to FILE (default is stderr)."},
134 {
'M',
"max-iterations",
"NMAX",
"",
"",
"",
135 "Maximum least-squares iterations per pixel (default: 25)."},
137 {
'n',
"num-bands",
"NMIN",
"",
"",
"",
138 "Minimum number of bands required for least-squares fit (default: 3)."},
140 {
'o',
"output-file",
"FILE",
"",
"",
"",
141 "Output result to FITS file FILE (default: mtcore.fits)."},
143 {
'p',
"point-source",
"",
"",
"",
"",
144 "Use point source detector response (default is extended sources)."},
146 {
'q',
"quiet",
"",
"",
"",
"",
147 "Quiet mode; decrement logging level (opposite of -v).\n" 148 "(Specify multiple times for added effect.)"},
150 {
't',
"threads",
"NTHREADS",
"",
"",
"",
151 "Use NTHREADS threads for processing (default: 1)."},
153 {
'v',
"verbose",
"",
"",
"",
"",
154 "Verbose mode; increment logging level (opposite of -q).\n" 155 "(Specify multiple times for added effect.)"},
157 {
'V',
"version",
"",
"",
"",
"",
158 "Display program version and exit."},
162 cli.
init(argc, argv, &opts);
168 CCfits::FITS::setVerboseMode(verb > 0);
200 }
catch (std::exception &ex) {
void process(const mutils::CommandLine &cli)
Processes multi-wavelength maps into temperature/column density maps.
static FILE * stream
Message log file stream.
double dF_dT(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Graybody integrated flux T-derivative (erg/cm^2/s/K).
unsigned getOption(const Option &option, Arguments *values=nullptr, unsigned nMax=-1) const
Retrieves all copies of a command line option.
static constexpr int WARN
Warning condition.
gsl_spline * initSpline(const tableType &table, bool ln)
Initializes cubic spline interpolator.
Command line options and arguments.
std::string getString(char shortName, const std::string &defValue) const
Retrieves unique string option.
void setModel(const std::string &model, double rho=100.0)
Set dust properties model (table-based).
void printModels(std::vector< mu::CommandLine::Option > &opts, char name)
Add available dust model names to options summary.
double dF_dS(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Graybody integrated flux Sigma-derivative (erg/s/g).
virtual double ccf(const Graybody &gray, double T, double Sigma=1.0) const
Color correction factor.
static int level
Message logging level for output to stream.
static int setStream(const std::string &fname, bool append=true)
Sets the logging stream.
void printVersion()
Prints version information to the log.
constexpr const char *const version
Version string.
virtual void init()
Initializes detector characteristics.
constexpr const char *const reldate
Release date (if any).
double F(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Graybody integrated flux (erg/cm^2/s).
std::vector< std::pair< double, double > > tableType
Basic table data.
void init(int argc, char *argv[], const std::vector< Option > *opts)
Initializes new command line input.
double Inu(double nu, double T, double Sigma) const
Graybody specific intensity (erg/cm^2/s/Hz/sr).
void usage(FILE *f, const std::vector< Option > &opts, const char *args="", bool quiet=false, bool basename=true) const
Summarizes command line usage (including options).
int main(int argc, char *argv[])
void printException(std::exception &ex)
Prints exception message.