62 ERRMSG(
"Missing or invalid command-line arguments.\n\n"
63 "Usage: filter <ctl> <filter> [KEY VALUE ...]\n\n"
64 "Use -h for full help.");
68 const int type = (int)
scan_ctl(argc, argv,
"FILTER_TYPE", -1,
"1", NULL);
69 const double opd =
scan_ctl(argc, argv,
"FILTER_OPD", -1,
"10.0", NULL);
70 const double fwhm =
scan_ctl(argc, argv,
"FILTER_FWHM", -1,
"1.0", NULL);
72 scan_ctl(argc, argv,
"FILTER_CENTER", -1,
"1000.0", NULL);
73 const double width =
scan_ctl(argc, argv,
"FILTER_WIDTH", -1,
"2.1", NULL);
74 const double samp =
scan_ctl(argc, argv,
"FILTER_SAMP", -1,
"0.0005", NULL);
77 for (
double nu = center - 0.5 * width;
78 nu <= center + 0.5 * width; nu += samp) {
85 ff[fn] = (fabs(nu - center) <= 0.5 * fwhm ? 1.0 : 0.0);
89 ff[fn] = 1.0 - fabs(nu - center) / fwhm;
90 ff[fn] =
MAX(ff[fn], 0.0);
95 double sigma = fwhm / 2.355;
96 ff[fn] = exp(-0.5 *
POW2((nu - center) / sigma));
101 ff[fn] =
ails(0, opd, nu - center);
105 ff[fn] =
ails(1, opd, nu - center);
109 ERRMSG(
"Filter function type unknown!");
113 ERRMSG(
"Too many filter function data points!");
117 for (
int i = 0; i < fn; i++)
119 for (
int i = 0; i < fn; i++)
120 ff[i] /= (fsum * samp);
125 return (EXIT_SUCCESS);
132 printf(
"\nJURASSIC filter generator.\n\n");
133 printf(
"Create a radiometric filter function from the filter settings\n");
134 printf(
"in the control file and write it to disk.\n\n");
136 printf(
" filter <ctl> <filter> [KEY VALUE ...]\n\n");
137 printf(
"Arguments:\n");
138 printf(
" <ctl> Control file.\n");
139 printf(
" <filter> Output filter-function file.\n");
140 printf(
" [KEY VALUE] Optional control parameters.\n\n");
141 printf(
"Tool-specific control parameters:\n");
142 printf(
" FILTER_TYPE Filter shape identifier.\n");
144 (
" FILTER_OPD Optical path difference for sinc-based filters.\n");
145 printf(
" FILTER_FWHM Full width at half maximum.\n");
146 printf(
" FILTER_CENTER Center wavenumber.\n");
147 printf(
" FILTER_WIDTH Total spectral width.\n");
148 printf(
" FILTER_SAMP Spectral sampling interval.\n\n");
149 printf(
"Further information:\n");
150 printf(
" Manual: https://slcs-jsc.github.io/jurassic/\n");
161 const double a = 2 * M_PI * dnu * opl;
162 const double a2 = a * a;
163 const double a4 = a2 * a2;
164 const double a6 = a4 * a2;
165 const double a8 = a4 * a4;
170 return 1 - a2 / 6 + a4 / 120 - a6 / 5040 + a8 / 362880;
179 q0 = 1 - a2 / 6 + a4 / 120 - a6 / 5040 + a8 / 362880;
180 q2 = 1 - a2 / 14 + a4 / 504 - a6 / 33264 + a8 / 3459456;
181 q4 = 1 - a2 / 22 + a4 / 1144 - a6 / 102960 + a8 / 14002560;
183 const double sinca = sin(a) / a;
184 const double cosa = cos(a);
186 q2 = -15 / a2 * ((1 - 3 / a2) * sinca + (3 / a2) * cosa);
188 945 / a4 * ((1 - 45 / a2 + 105 / a4) * sinca +
189 5 / a2 * (2 - 21 / a2) * cosa);
191 return 0.045335 * q0 + 0.554883 * q2 * 8. / 15. +
192 0.399782 * q4 * 384. / 945.;
197 ERRMSG(
"Unknown apodization!");
int main(int argc, char *argv[])
double ails(int apo, double opl, double dnu)
Compute apodized instrument line shape.
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read model control parameters from command-line and configuration input.
double scan_ctl(int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
Scan control file or command-line arguments for a configuration variable.
void write_shape(const char *filename, const double *x, const double *y, const int n)
Write tabulated shape function data to a text file.
JURASSIC library declarations.
#define POW2(x)
Compute the square of a value.
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
#define USAGE
Print usage information on -h or --help.
#define NSHAPE
Maximum number of shape function grid points.
#define MAX(a, b)
Determine the maximum of two values.