119 double mindit, casu_tfits *chantab,
120 int norder, cpl_table **lchantab,
121 double **lindata,
int *status) {
123 const char *fctid =
"vircam_genlincur";
124 int retval,i,j,nbad,oldnorder,k,ii,nullval;
126 double *meds,sigfit,**aco,c0,lin_nom,*temp,*polyco,pt,*work,kfac;
127 double sum,t10000,*kfacs;
130 cpl_array *exparray,*medsarray,*polyfitco,*workarray;
135 if (*status != CASU_OK)
140 if (nimages < norder+1) {
142 "Not enought images (%" CPL_SIZE_FORMAT
") for fit order (%" CPL_SIZE_FORMAT
")",
143 (cpl_size)nimages,(cpl_size)norder);
153 if (retval != CASU_OK) {
162 lc = cpl_table_duplicate(ctab);
163 oldnorder = cpl_table_get_int(lc,
"norder",0,&nullval);
164 if (oldnorder > norder) {
165 for (i = norder+1; i <= oldnorder; i++) {
166 char * colname = cpl_sprintf(
"coeff_%d", i);
168 cpl_table_erase_column(lc,colname);
171 }
else if (oldnorder < norder) {
172 for (i = oldnorder+1; i <= norder; i++) {
173 char * colname = cpl_sprintf(
"coeff_%d", i);
175 if (cpl_table_has_column(lc,colname)) {
179 cpl_table_new_column(lc,colname,CPL_TYPE_DOUBLE);
186 exparray = cpl_array_wrap_double(exps,nimages);
187 medsarray = cpl_array_new((cpl_size)nimages,CPL_TYPE_DOUBLE);
188 meds = cpl_array_get_data_double(medsarray);
189 aco = cpl_malloc(norder*
sizeof(
double *));
190 for (i = 0; i < norder; i++)
191 aco[i] = cpl_malloc(norder*
sizeof(
double));
192 temp = cpl_malloc(norder*
sizeof(
double));
193 kfacs = cpl_malloc(norder*
sizeof(
double));
197 *lindata = cpl_malloc(nimages*np*
sizeof(
double));
202 for (i = 0; i < np; i++) {
206 for (j = 0; j < nimages; j++)
207 meds[j] = fdata[j][i];
211 if (
vircam_polyfit(exparray,medsarray,norder,1,2,2.0,2.0,&polyfitco,
212 &sigfit) != CASU_OK) {
214 cpl_table_set_int(lc,
"norder",(cpl_size)i,norder);
215 cpl_table_set_double(lc,
"coeff_1",(cpl_size)i,1.0);
216 for (k = 1; k < norder; k++) {
217 char * colname = cpl_sprintf(
"coeff_%d",k+1);
219 cpl_table_set_double(lc,colname,(cpl_size)i,0.0);
222 freearray(polyfitco);
225 polyco = cpl_array_get_data_double(polyfitco);
229 for (j = 0; j < nimages; j++)
230 if (meds[j] > nom_val)
235 cpl_table_set_int(lc,
"norder",(cpl_size)i,norder);
236 cpl_table_set_double(lc,
"coeff_1",(cpl_size)i,1.0);
237 for (k = 1; k < norder; k++) {
238 char * colname = cpl_sprintf(
"coeff_%d",k+1);
240 cpl_table_set_double(lc,colname,(cpl_size)i,0.0);
243 freearray(polyfitco);
247 t10000 = exps[j-1] + (nom_val - meds[j-1])/(meds[j] - meds[j-1]);
249 for (j = 0; j < norder; j++)
250 sum += (
double)(j+1)*polyco[j]*pow(t10000,(
double)j);
251 lin_nom = 100.0*fabs(sum - polyco[0])/polyco[0];
255 for (j = 0; j < norder; j++) {
256 getco(temp,norder,j+1);
257 for (k = 0; k < norder; k++) {
258 pt = pow(mindit,(
double)(j-k));
259 aco[j][k] = pt*temp[k];
267 cpl_table_set_int(lc,
"norder",(cpl_size)i,norder);
268 cpl_table_set_double(lc,
"coeff_1",(cpl_size)i,1.0);
269 for (k = 1; k < norder; k++) {
270 char * colname = cpl_sprintf(
"coeff_%d",k+1);
272 cpl_table_set_double(lc,colname,(cpl_size)i,0.0);
275 freearray(polyfitco);
282 for (j = 0; j < norder; j++) {
283 polyco[j] /= pow(c0,(
double)(j+1));
284 char * colname = cpl_sprintf(
"coeff_%d",j+1);
286 cpl_table_set_double(lc,colname,(cpl_size)i,polyco[j]);
289 cpl_table_set_int(lc,
"norder",(cpl_size)i,norder);
295 workarray = cpl_array_new((cpl_size)nimages,CPL_TYPE_DOUBLE);
296 work = cpl_array_get_data_double(workarray);
297 for (j = 0; j < nimages; j++) {
298 kfac = mindit/exps[j];
300 for (ii = 1; ii < norder; ii++)
301 kfacs[ii] = pow((kfac+1.0),(
double)(ii+1)) -
302 pow(kfac,(
double)(ii+1));
303 work[j] = linval(meds[j],kfacs,0.5,10,polyco,norder);
304 (*lindata)[j*np+i] = work[j];
306 freearray(polyfitco);
309 polyco = cpl_array_get_data_double(polyfitco);
310 sigfit *= 100.0/nom_val;
311 freearray(workarray);
312 freearray(polyfitco);
316 cpl_table_set_double(lc,
"lin_10000_err",(cpl_size)i,sigfit);
317 cpl_table_set_double(lc,
"lin_10000",(cpl_size)i,lin_nom);
322 *lchantab = cpl_table_duplicate(lc);
323 cpl_array_unwrap(exparray);
324 freearray(medsarray);
325 freespace2(aco,norder);
330 cpl_msg_warning(fctid,
331 "%" CPL_SIZE_FORMAT
" channels have a failed solution",
382extern int vircam_lincor(casu_fits *infile, casu_tfits *lchantab,
int kconst,
383 int ndit,
int *status) {
384 int retval,i,norder,ii;
385 long naxis[2],j,rind,aind,ncpts,np;
386 float *data,texp,reset_time,read_time,delay_time;
387 double kfac_nom,lkfac,inval,outval,*lbb,dnd,*kfacs;
388 const char *fctid =
"vircam_lincor";
390 cpl_propertylist *plist;
396 if (*status != CASU_OK)
408 if (retval != CASU_OK)
416 cpl_msg_error(fctid,
"Error mapping data in input image");
427 cpl_msg_error(fctid,
"No exposure time in %s",
433 cpl_msg_error(fctid,
"No mindit time in %s",
437 read_time = reset_time;
440 cpl_msg_error(fctid,
"No dit delay time in %s",
447 kfac_nom = (double)(read_time/texp);
455 for (i = 0; i < np; i++) {
457 ncpts = (pp->delta_i)*(pp->delta_j);
470 kfacs = cpl_malloc(norder*
sizeof(
double));
473 for (ii = 1; ii < norder; ii++)
474 kfacs[ii] = pow((kfac_nom+1.0),(
double)(ii+1)) -
475 pow(kfac_nom,(
double)(ii+1));
480 for (j = 0; j < ncpts; j++) {
487 lkfac = getkfac(j,ncpts,reset_time,read_time,delay_time,texp);
489 for (ii = 1; ii < norder; ii++)
490 kfacs[ii] = pow((lkfac+1.0),(
double)(ii+1)) -
491 pow(lkfac,(
double)(ii+1));
496 inval = ((double)data[aind])/dnd;
497 outval = linval(inval,kfacs,0.5,10,lbb,norder);
498 data[aind] = (float)(dnd*outval);