64 #define PRINT_USAGE(rc) \
65 fprintf(stderr, "Usage: %s [ -v ] [ -c IFUNUM ] [ -l LAMBDA ] LSF_PROFILE\n",\
67 cpl_end(); return (rc);
69 int main(
int argc,
char **argv)
71 cpl_init(CPL_INIT_DEFAULT);
78 cpl_boolean verbose = CPL_FALSE;
80 unsigned char nifu = 0;
85 for (i = 1; i < argc; i++) {
86 if (strncmp(argv[i],
"-v", 3) == 0) {
88 }
else if (strncmp(argv[i],
"-c", 3) == 0) {
96 }
else if (strncmp(argv[i],
"-l", 3) == 0) {
100 lambda = atof(argv[i]);
104 }
else if (strncmp(argv[i],
"-", 1) == 0) {
119 #define SPEC_LENGTH 1000
120 #define SPEC_SAMPLING 0.01
121 #define LINE_FLUX 10000
123 printf(
"# FWHM computed from LSF profile function for several wavelengths "
124 "as mean +/- stdev median\n""# conversion to value in pixels and "
125 "spectral resolution R using %.3f Angstrom/pix\n",
126 kMuseSpectralSamplingA);
128 printf(
"%soutput of detailed parameters and results for each slice; "
129 "columns:\n%slambda: ifu.slice\tref_lambda slitwidth binwidth\t "
130 "specmean +/- specstdev (specmedian) specmin..specmax "
131 "(maxidx)\tleftvalue (lidx) rightvalue (ridx) ==> FWHM\n",
132 verbose ?
"# " :
"", verbose ?
"# " :
"");
135 double lpos[] = { 4650., 5000., 6000., 7000., 8000., 9000., 9300., -1. };
141 while (lpos[++ilpos] > 0) {
142 cpl_vector *vfwhm = cpl_vector_new(50);
144 for (nifu = 1; nifu <= kMuseNumIFUs; nifu++) {
146 for (nslice = 1; nslice <= kMuseSlicesPerCCD; nslice++) {
151 cpl_errorstate es = cpl_errorstate_get();
153 SPEC_SAMPLING, SPEC_LENGTH,
154 verbose ? stdout : NULL);
155 if (!cpl_errorstate_is_equal(es)) {
158 cpl_vector_set(vfwhm, ifwhm++, fwhm);
162 cpl_vector_set_size(vfwhm, ifwhm);
163 double mean = cpl_vector_get_mean(vfwhm),
164 stdev = cpl_vector_get_stdev(vfwhm),
165 median = cpl_vector_get_median(vfwhm);
166 printf(
"%sFWHM at %.3f Angstrom is %.3f +/- %.3f %.2f [Angstrom], ~%.3f "
167 "[pix], R is %.1f\n", verbose ?
"# " :
"", lpos[ilpos], mean, stdev,
168 median, mean / kMuseSpectralSamplingA, lpos[ilpos] / mean);
169 cpl_vector_delete(vfwhm);
muse_lsf_params * muse_lsf_params_get(muse_lsf_params **aParams, int aIFU, int aSlice)
Get the slice LSF parameters for one slice.
double muse_lsf_fwhm_lambda(const muse_lsf_params *aDP, double aLambda, double aFlux, double aSampling, unsigned int aLength, FILE *aOutstream)
Measure the FWHM of an LSF at a given wavelength.
muse_lsf_params ** muse_lsf_params_load(const char *aFile, muse_lsf_params **aParams, int aIFU)
Load slice LSF parameters from the extension "SLICE_PARAM".
Structure definition of detector (slice) parameters.
void muse_lsf_params_delete(muse_lsf_params **aParams)
Delete an allocated array of muse_lsf_params structure.