AIRS Code Collection
optimize_btd.c
Go to the documentation of this file.
1/*
2 This file is part of the AIRS Code Collection.
3
4 the AIRS Code Collections is free software: you can redistribute it
5 and/or modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation, either version 3 of
7 the License, or (at your option) any later version.
8
9 The AIRS Code Collection is distributed in the hope that it will be
10 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
11 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with the AIRS Code Collection. If not, see
16 <http://www.gnu.org/licenses/>.
17
18 Copyright (C) 2019-2025 Forschungszentrum Juelich GmbH
19*/
20
26#include "libairs.h"
27
28/* ------------------------------------------------------------
29 Main...
30 ------------------------------------------------------------ */
31
32int main(
33 int argc,
34 char *argv[]) {
35
36 static airs_rad_gran_t airs_rad_gran;
37
38 static FILE *out;
39
40 static double bt[AIRS_RAD_CHANNEL],
41 mean[AIRS_RAD_CHANNEL][AIRS_RAD_CHANNEL],
42 max[AIRS_RAD_CHANNEL][AIRS_RAD_CHANNEL],
43 var[AIRS_RAD_CHANNEL][AIRS_RAD_CHANNEL];
44
45 static int n[AIRS_RAD_CHANNEL][AIRS_RAD_CHANNEL];
46
47 /* Check arguments... */
48 if (argc < 12)
49 ERRMSG("Give parameters: <opt.tab> <sig_chan0> <sig_chan1>"
50 " <bg_chan0> <bg_chan1> <lon0> <lon1> <lat0> <lat1> <navg>"
51 " <l1b_file1> [<l1b_file2> ...]");
52
53 /* Get parameters... */
54 const int sig_chan0 =
55 GSL_MIN(GSL_MAX(atoi(argv[2]), 0), AIRS_RAD_CHANNEL - 1);
56 const int sig_chan1 =
57 GSL_MIN(GSL_MAX(atoi(argv[3]), 0), AIRS_RAD_CHANNEL - 1);
58 const int bg_chan0 =
59 GSL_MIN(GSL_MAX(atoi(argv[4]), 0), AIRS_RAD_CHANNEL - 1);
60 const int bg_chan1 =
61 GSL_MIN(GSL_MAX(atoi(argv[5]), 0), AIRS_RAD_CHANNEL - 1);
62 const double lon0 = atof(argv[6]);
63 const double lon1 = atof(argv[7]);
64 const double lat0 = atof(argv[8]);
65 const double lat1 = atof(argv[9]);
66 const int navg = atoi(argv[10]);
67
68 /* Loop over HDF files... */
69 for (int iarg = 11; iarg < argc; iarg++) {
70
71 /* Read AIRS data... */
72 printf("Read AIRS Level-1B data file: %s\n", argv[iarg]);
73 airs_rad_rdr(argv[iarg], &airs_rad_gran);
74
75 /* Loop over footprints... */
76 for (int track = 0; track < AIRS_RAD_GEOTRACK; track++)
77 for (int xtrack = 0; xtrack < AIRS_RAD_GEOXTRACK; xtrack++)
78 if (airs_rad_gran.Longitude[track][xtrack] >= lon0 &&
79 airs_rad_gran.Longitude[track][xtrack] <= lon1 &&
80 airs_rad_gran.Latitude[track][xtrack] >= lat0 &&
81 airs_rad_gran.Latitude[track][xtrack] <= lat1) {
82
83 /* Get brightness temperature... */
84 for (int ichan = 0; ichan < AIRS_RAD_CHANNEL; ichan++)
85 if ((airs_rad_gran.state[track][xtrack] != 0)
86 || (airs_rad_gran.ExcludedChans[ichan] > 2)
87 || (airs_rad_gran.CalChanSummary[ichan] & 8)
88 || (airs_rad_gran.CalChanSummary[ichan] & (32 + 64))
89 || (airs_rad_gran.CalFlag[track][ichan] & 16))
90 bt[ichan] = GSL_NAN;
91 else
92 bt[ichan]
93 = BRIGHT(airs_rad_gran.radiances[track][xtrack][ichan]
94 * 0.001, airs_rad_gran.nominal_freq[ichan]);
95
96 /* Average channels... */
97 for (int ichan = 0; ichan < AIRS_RAD_CHANNEL - navg; ichan++) {
98 double bt2 = 0;
99 for (int iavg = 0; iavg < navg; iavg++)
100 bt2 += bt[ichan + iavg];
101 bt[ichan] = bt2 / navg;
102 }
103
104 /* Get statistics... */
105 for (int ichan = sig_chan0; ichan <= sig_chan1; ichan++)
106 for (int ichan2 = bg_chan0; ichan2 <= bg_chan1; ichan2++)
107 if (gsl_finite(bt[ichan]) && gsl_finite(bt[ichan2])) {
108
109 /* Get brightness temperature difference... */
110 const double dbt = (bt[ichan2] - bt[ichan]);
111 if (fabs(dbt) > 100)
112 continue;
113
114 /* Check filter... */
115 if (n[ichan][ichan2] <= 0)
116 max[ichan][ichan2] = dbt;
117 else
118 max[ichan][ichan2] = GSL_MAX(max[ichan][ichan2], dbt);
119 mean[ichan][ichan2] += dbt;
120 var[ichan][ichan2] += gsl_pow_2(dbt);
121 n[ichan][ichan2]++;
122 }
123 }
124 }
125
126 /* Normalize... */
127 for (int ichan = sig_chan0; ichan <= sig_chan1; ichan++)
128 for (int ichan2 = bg_chan0; ichan2 <= bg_chan1; ichan2++) {
129 if (n[ichan][ichan2] > 0) {
130 mean[ichan][ichan2] /= n[ichan][ichan2];
131 var[ichan][ichan2] = sqrt(var[ichan][ichan2] / n[ichan][ichan2]
132 - gsl_pow_2(mean[ichan][ichan2]));
133 } else
134 mean[ichan][ichan2] = var[ichan][ichan2] = max[ichan][ichan2] =
135 GSL_NAN;
136 }
137
138 /* Write info... */
139 printf("Write optimization data: %s\n", argv[1]);
140
141 /* Create file... */
142 if (!(out = fopen(argv[1], "w")))
143 ERRMSG("Cannot create file!");
144
145 /* Write header... */
146 fprintf(out,
147 "# $1 = signal channel\n"
148 "# $2 = signal wavenumber [cm^-1]\n"
149 "# $3 = background channel\n"
150 "# $4 = background wavenumber [cm^-1]\n"
151 "# $5 = BTD(bg-sig) mean [K]\n"
152 "# $6 = BTD(bg-sig) standard deviation [K]\n"
153 "# $7 = BTD(bg-sig) maximum [K]\n"
154 "# $8 = effective SNR (= max/RMS)\n"
155 "# $9 = number of footprints\n");
156
157 /* Write info... */
158 for (int ichan = sig_chan0; ichan <= sig_chan1; ichan++) {
159 fprintf(out, "\n");
160 for (int ichan2 = bg_chan0; ichan2 <= bg_chan1; ichan2++)
161 fprintf(out, "%d %.3f %d %.3f %g %g %g %g %d\n",
162 ichan, airs_rad_gran.nominal_freq[ichan],
163 ichan2, airs_rad_gran.nominal_freq[ichan2],
164 mean[ichan][ichan2], var[ichan][ichan2], max[ichan][ichan2],
165 max[ichan][ichan2] / sqrt(gsl_pow_2(var[ichan][ichan2])
166 + gsl_pow_2(mean[ichan][ichan2])),
167 n[ichan][ichan2]);
168 }
169
170 /* Close file... */
171 fclose(out);
172
173 return EXIT_SUCCESS;
174}
#define BRIGHT(rad, nu)
Compute brightness temperature.
Definition: jurassic.h:126
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
AIRS Code Collection library declarations.
int main(int argc, char *argv[])
Definition: optimize_btd.c:32