24 float mean=0., std=0.;
31 std+=pow(rrs[
i]-
mean,2);
32 std=sqrt(std/(nwave-1));
41 static int firstcall=1;
43 static float32 *pca_table;
44 static double *pro_coef, *syn_coef, *apeuk_coef;
45 static int nwave_pca, npc,npc_used;
50 float *
Rrs=l2rec->Rrs;
51 static float *interp_rrs;
53 static float *pcc_all;
57 nbands=l2rec->l1rec->l1file->nbands;
58 wave=l2rec->l1rec->l1file->fwave;
59 npix=l2rec->l1rec->npix;
65 if ((filedir = getenv(
"OCDATAROOT")) ==
NULL) {
66 printf(
"-E- %s: OCDATAROOT env variable undefined.\n", __FILE__);
72 strcat(
filename,
"pca_picophyto.h5");
74 printf(
"Reading pca table for picophyto from: %s\n",
filename);
76 hid_t file_id,set_id, space_id;
77 hsize_t dims[2], maxdims[2];
80 hsize_t
start[2]= {(hsize_t) 0, (hsize_t) 0};
81 hsize_t stride[2]={(hsize_t) 1, (hsize_t) 1};
82 hsize_t
count[2] ={(hsize_t) 1, (hsize_t) 1};
85 if( (file_id=H5Fopen(
filename,H5F_ACC_RDONLY, H5P_DEFAULT))==-1){
86 printf(
"error in opening -%s-\n",
filename);
90 set_id=H5Dopen(file_id,
"component", H5P_DEFAULT);
91 space_id=H5Dget_space(set_id);
92 H5Sget_simple_extent_dims(space_id, dims, maxdims);
97 pca_table=(float32 *)malloc(nwave_pca*npc*
sizeof(float32));
98 pc=(
double *)malloc(npc*
sizeof(
double));
99 wave_pca=(
int *)malloc(nwave_pca*
sizeof(
int));
100 bindx=(
int *)malloc(nwave_pca*
sizeof(
int));
101 pcc_all=(
float *)malloc(3*
npix*
sizeof(
float));
106 mem_space_id=H5Screate_simple(2,
count,
NULL);
107 H5Sselect_hyperslab(space_id, H5S_SELECT_SET,
start, stride,
count,
NULL);
108 H5Dread(set_id,H5T_NATIVE_FLOAT, mem_space_id, space_id, H5P_DEFAULT, (
void *)pca_table);
113 set_id=H5Dopen(file_id,
"wavelength", H5P_DEFAULT);
114 space_id=H5Dget_space(set_id);
115 mem_space_id=H5Screate_simple(1,
count,
NULL);
116 H5Sselect_hyperslab(space_id, H5S_SELECT_SET,
start, stride,
count,
NULL);
117 H5Dread(set_id,H5T_NATIVE_INT, mem_space_id, space_id, H5P_DEFAULT, (
void *)wave_pca);
124 for(
i=0;
i<nwave_pca;
i++)
138 printf(
"the file %s not exist\n",
filename);
142 wv=json_object_get(json,
"npc");
143 line=json_string_value(wv);
146 pro_coef=(
double *)malloc((npc+2)*
sizeof(
double));
147 syn_coef=(
double *)malloc((npc+1)*
sizeof(
double));
148 apeuk_coef=(
double *)malloc((npc+1)*
sizeof(
double));
149 interp_rrs=(
float *)malloc(nwave_pca*
sizeof(
float));
151 wv=json_object_get(json,
"pro_coef");
152 line=json_string_value(wv);
155 pro_coef[
i++]=atof(
line);
161 wv=json_object_get(json,
"syn_coef");
162 line=json_string_value(wv);
165 syn_coef[
i++]=atof(
line);
171 wv=json_object_get(json,
"apeuk_coef");
172 line=json_string_value(wv);
175 apeuk_coef[
i++]=atof(
line);
186 sst=l2rec->l1rec->sstref;
188 for(ip=0;ip<
npix;ip++){
197 for(
i=0;
i<nwave_pca;
i++){
199 if(wave_pca[
i]< wave[
j])
209 interp_rrs[
i]=
Rrs[ipb+
j-1]+(
Rrs[ipb+
j]-
Rrs[ipb+
j-1])*(wave_pca[
i]-wave[
j-1])/(wave[
j]-wave[
j-1]);
216 for(
j=0;
j<nwave_pca;
j++){
217 pc[
i]+=pca_table[
j*npc+
i]*interp_rrs[
j];
221 pcc_all[ip*3]=pro_coef[0]+pro_coef[1]*log10(sst[ip]);
222 pcc_all[ip*3+1]=syn_coef[0];
223 pcc_all[ip*3+2]=apeuk_coef[0];
224 for(
i=0;
i<npc_used;
i++){
225 pcc_all[ip*3]+=pro_coef[
i+2]*pc[
i];
226 pcc_all[ip*3+1]+=syn_coef[
i+1]*pc[
i];
227 pcc_all[ip*3+2]+=apeuk_coef[
i+1]*pc[
i];
229 pcc_all[ip*3+1]=pow(10.,pcc_all[ip*3+1]);
230 pcc_all[ip*3+2]=pow(10.,pcc_all[ip*3+2]);
231 if(pcc_all[ip*3+1]<0.)
233 if(pcc_all[ip*3+2]<0.)
236 if(pcc_all[ip*3]<0 && pcc_all[ip*3+1]>0. && pcc_all[ip*3+2]>0.)
241 cell_abundance[ip]=pcc_all[ip*3];
244 cell_abundance[ip]=pcc_all[ip*3+1];
247 cell_abundance[ip]=pcc_all[ip*3+2];