22 static size_t start[] = {0,0},
count[] = {0,0}, fil_np;
23 static int firstCall = 1;
24 static int ncid, d_id, dim_id;
25 static signed char* msk_lcl;
26 static int lastScan = -1;
27 static int new_cl_msk_fmt;
32 char file [FILENAME_MAX] =
"";
35 printf(
"-E- %s line %d: no cloud flag file provided\n",
41 printf(
"Loading cloud mask flag file %s\n",
file);
44 if (nc_open(
file, 0, &ncid) != NC_NOERR) {
46 "-E- %s %d: file: %s is not netcdf, not acceptable cloud maskfile\n",
47 __FILE__, __LINE__,
file);
51 if (nc_inq_dimid(ncid,
"pixels_per_line", &dim_id ) != NC_NOERR) {
53 "-E- %s %d: file: %s Could not read the pixels_per_line id\n",
54 __FILE__, __LINE__,
file);
58 if (nc_inq_dimlen(ncid, dim_id, &fil_np ) != NC_NOERR) {
60 "-E- %s %d: file: %s Could not read the pixels_per_line\n",
61 __FILE__, __LINE__,
file);
66 if( nc_inq_grp_ncid( ncid,
"geophysical_data", &grp_id ) != NC_NOERR) {
69 "-I- %s %d: file: %s Cloud mask read switch to old format\n",
70 __FILE__, __LINE__,
file);
71 strcpy(sdsname,
"CF_CATEGORY");
72 if( nc_inq_varid(ncid, sdsname, &d_id ) != NC_NOERR) {
74 "-E- %s %d: file: %s Could not find SDS CF_CATEGORY\n",
75 __FILE__, __LINE__,
file);
83 strcpy(sdsname,
"cloud_flag");
84 }
else if(
l1_input->cloud_mask_opt == 1) {
85 strcpy(sdsname,
"cloud_flag_dilated");
88 "-E- %s:%d - cloud_mask_opt=%d Illegal option\n",
89 __FILE__, __LINE__,
l1_input->cloud_mask_opt);
92 if( nc_inq_varid(grp_id, sdsname, &d_id ) != NC_NOERR) {
94 "-E- %s %d: file: %s Could not find SDS CF_CATEGORY\n",
95 __FILE__, __LINE__,
file);
104 if( ( msk_lcl = (
signed char *)
105 malloc(
count[1] *
sizeof(
signed char *) ) ) ==
NULL ) {
107 "-E- %s %d: file: %s Could not allocate cloud mask storage\n",
108 __FILE__, __LINE__,
file);
115 if (lastScan !=
l1rec->iscan) {
117 if( nc_get_vara_schar( ncid, d_id,
start,
count, msk_lcl ) != NC_NOERR ) {
119 "-E- %s %d: Could not read the cloud mask file line\n",
123 lastScan =
l1rec->iscan;
126 if( new_cl_msk_fmt == 0 ) {
127 *cld_category = msk_lcl[ip];
131 else if( msk_lcl[ip] == 0 )
133 else *cld_category = 0;
138 else if (*cld_category < 2 )
147 static int ib443, ib490, ib560, ib620, ib665, ib681, ib709, ib754, ib865, ib885, firstCall = 1;
149 float *rhos =
l1rec->rhos, *cloud_albedo =
l1rec->cloud_albedo;
152 static productInfo_t* rhos_product_info;
154 if (firstCall == 1) {
166 if (ib443 < 0 || ib490 < 0 || ib560 < 0 || ib620 < 0 || ib665 < 0 || ib681 < 0 || ib709 < 0 || ib754 < 0 || ib865 < 0 || ib885 < 0) {
167 printf(
"get_habs_cldmask: incompatible sensor wavelengths for this algorithm\n");
171 if (rhos_product_info ==
NULL) {
179 ipb =
l1rec->l1file->nbands*ip;
181 if (rhos[ipb + ib443] >= 0.0 &&
182 rhos[ipb + ib560] >= 0.0 &&
183 rhos[ipb + ib620] >= 0.0 &&
184 rhos[ipb + ib665] >= 0.0 &&
185 rhos[ipb + ib681] >= 0.0 &&
186 rhos[ipb + ib709] >= 0.0 &&
187 rhos[ipb + ib754] >= 0.0) {
189 if ((rhos[ipb + ib443] <= rhos_product_info->validMax) &&
190 (rhos[ipb + ib665] <= rhos_product_info->validMax) &&
191 (rhos[ipb + ib620] <= rhos_product_info->validMax) &&
192 (rhos[ipb + ib681] <= rhos_product_info->validMax) &&
193 (rhos[ipb + ib754] <= rhos_product_info->validMax)) {
195 ftemp = (rhos[ipb + ib620] + rhos[ipb + ib665] + rhos[ipb + ib681]) - 3 * rhos[ipb + ib443] - \
196 (rhos[ipb + ib754] - rhos[ipb + ib443]) / (754 - 443)*(620 + 665 + 681 - 3 * 443);
201 if (cloud_albedo[ip] >= 0.0) {
202 cldtmp = cloud_albedo[ip];
204 cldtmp = rhos[ipb + ib865];
208 if (ftemp > 0) cldtmp = cldtmp - 3 * ftemp;
215 if ((rhos[ipb + ib754] <= rhos_product_info->validMax) &&
216 (rhos[ipb + ib709] <= rhos_product_info->validMax) &&
217 (rhos[ipb + ib681] <= rhos_product_info->validMax) &&
218 (rhos[ipb + ib560] <= rhos_product_info->validMax)) {
220 if ((rhos[ipb + ib443] <= rhos_product_info->validMax) &&
221 (rhos[ipb + ib490] <= rhos_product_info->validMax)) {
222 if ((rhos[ipb + ib754] + rhos[ipb + ib709]) > (rhos[ipb + ib443] + rhos[ipb + ib490]) && cldtmp < 0.1 && (rhos[ipb + ib560] > rhos[ipb + ib681])) flagcld = 0;
224 if (rhos[ipb + ib665] <= rhos_product_info->validMax) {
225 if (((rhos[ipb + ib754] + rhos[ipb + ib709]) - (rhos[ipb + ib665] + rhos[ipb + ib681])) > 0.01 && cldtmp < 0.15 && (rhos[ipb + ib560] > rhos[ipb + ib681])) flagcld = 0;
226 if ((((rhos[ipb + ib754] + rhos[ipb + ib709]) - (rhos[ipb + ib665] + rhos[ipb + ib681])) / cldtmp) > 0.1 && (rhos[ipb + ib560] > rhos[ipb + ib681])) flagcld = 0;
229 if (rhos[ipb + ib665] <= rhos_product_info->validMax) {
230 if ((rhos[ipb + ib665] > 0.1) && (cldtmp > 0.15)) {
234 if ((rhos[ipb + ib865] >= rhos_product_info->validMin) &&
235 (rhos[ipb + ib865] <= rhos_product_info->validMax)) {
237 if (rhos[ipb + ib865] - cloud_albedo[ip] > 0.25) {
254 static int firstCall = 1;
255 static int ib469, ib555, ib645, ib667, ib859, ib1240, ib2130;
257 float *rhos =
l1rec->rhos, *cloud_albedo =
l1rec->cloud_albedo;
258 float ftemp, ftemp2, ftemp3;
259 float cloudthr = 0.027;
262 if (firstCall == 1) {
270 if (ib469 < 0 || ib555 < 0 || ib645 < 0 || ib667 < 0 || ib859 < 0 || ib1240 < 0 || ib2130 < 0) {
271 printf(
"get_habs_cldmask: incompatible sensor wavelengths for this algorithm\n");
277 ipb =
l1rec->l1file->nbands*ip;
282 if (rhos[ipb + ib667] < 0.0) ftemp = 0.0;
283 ftemp2 = cloud_albedo[ip] - ftemp;
285 if (ftemp2 > 0.027) flagcld = 1;
290 if (rhos[ipb + ib1240] / rhos[ipb + ib859] > 0.5 && (rhos[ipb + ib1240] + rhos[ipb + ib2130]) > 0.10) flagcld = 1;
296 ftemp = rhos[ipb + ib645] - rhos[ipb + ib555] + (rhos[ipb + ib555] - rhos[ipb + ib859])*(645.0 - 555.0) / (859.0 - 555.0);
297 ftemp2 = cloud_albedo[ip] + ftemp;
298 if (ftemp2 < cloudthr) flagcld = 0;
299 if (rhos[ipb + ib859] / rhos[ipb + ib1240] > 4.0) flagcld = 0;
303 if ((rhos[ipb + ib859] - rhos[ipb + ib469]) > 0.01 && cloud_albedo[ip] < 0.30) flagcld = 0;
304 if ((rhos[ipb + ib859] - rhos[ipb + ib645]) > 0.01 && cloud_albedo[ip] < 0.15) flagcld = 0;
305 if (rhos[ipb + ib1240] < 0.2)
306 ftemp2 = ftemp2 - (rhos[ipb + ib859] - rhos[ipb + ib1240]) *
fabs(rhos[ipb + ib859] - rhos[ipb + ib1240]) / cloudthr;
309 if (ftemp2 < cloudthr * 2) {
310 if ((rhos[ipb + ib555] - rhos[ipb + ib1240]) > (rhos[ipb + ib469] - rhos[ipb + ib1240])) {
311 ftemp3 = ftemp2 - (rhos[ipb + ib555] - rhos[ipb + ib1240]);
313 ftemp3 = ftemp2 - (rhos[ipb + ib469] - rhos[ipb + ib1240]);
317 if (ftemp3 < cloudthr) flagcld = 0;
324 switch (
l1rec->l1file->sensorID) {
335 printf(
"HABS cldmsk not supported for this sensor (%s).\n",