54 #include "sinfo_new_nst.h"
55 #include "sinfo_pro_save.h"
56 #include "sinfo_pro_types.h"
57 #include "sinfo_functions.h"
58 #include "sinfo_ns_ini_by_cpl.h"
59 #include "sinfo_cube_construct.h"
60 #include "sinfo_utilities.h"
61 #include "sinfo_utils_wrappers.h"
62 #include "sinfo_error.h"
63 #include "sinfo_globals.h"
99 sinfo_new_nst(
const char* plugin_id,
100 cpl_parameterlist* config,
102 cpl_frameset* ref_set)
104 ns_config * cfg=NULL ;
105 cpl_imagelist * list_object=NULL ;
106 cpl_imagelist * list_off=NULL;
107 cpl_image * im_on=NULL;
108 cpl_image * im_on_sub=NULL ;
109 cpl_image * im_on_ind=NULL ;
110 cpl_image * im_on_gauss=NULL ;
111 cpl_image * im_mask=NULL ;
112 cpl_image * im_off=NULL ;
115 char tbl_name[MAX_NAME_SIZE];
122 float* distances=NULL;
123 cpl_table* tbl_dist=NULL;
125 cpl_vector* qc_dist=NULL;
128 double qc_dist_stdev=0;
129 cpl_frameset* raw=NULL;
131 cpl_table* qclog_tbl=NULL;
132 char key_value[MAX_NAME_SIZE];
133 char key_name[MAX_NAME_SIZE];
150 sinfo_msg(
"Parse cpl input");
151 check_nomsg(raw=cpl_frameset_new());
152 cknull(cfg = sinfo_parse_cpl_input_ns(config,sof,&raw),
153 "could not parse cpl input!") ;
155 if (cfg->maskInd == 1) {
156 if(sinfo_is_fits_file(cfg->mask) != 1) {
167 sinfo_msg(
"stack the frames in data cubes");
168 check(list_object = cpl_imagelist_new(),
169 "could not allocate memory");
171 if (cfg->noff > 0 ) {
172 check(list_off = cpl_imagelist_new(),
173 "could not allocate memory");
179 sinfo_msg(
"build different image lists for the different cases");
183 for (i=0; i< cfg->nframes; i++){
184 name = cfg->framelist[i];
185 if(sinfo_is_fits_file(name) != 1) {
189 typ = sinfo_new_intarray_get_value( cfg->frametype, i );
191 cpl_imagelist_set(list_object,
192 cpl_image_load(name,CPL_TYPE_FLOAT,0,0),nob);
195 cpl_imagelist_set(list_off,
196 cpl_image_load(name,CPL_TYPE_FLOAT,0,0),nof);
202 if (cfg->noff != nof || cfg->nobj != nob ){
204 "different types of frames");
211 sinfo_msg(
"take the average of the different cubes");
213 check_nomsg(no=cpl_imagelist_get_size(list_object));
214 lo_cut=(floor)(cfg->loReject*no+0.5);
215 hi_cut=(floor)(cfg->hiReject*no+0.5);
216 check(im_on=cpl_imagelist_collapse_minmax_create(list_object,lo_cut,hi_cut),
217 "sinfo_average_with_rejection failed" );
219 if (cfg->noff != 0) {
224 check_nomsg(no=cpl_imagelist_get_size(list_off));
225 lo_cut=(floor)(cfg->loReject*no+0.5);
226 hi_cut=(floor)(cfg->hiReject*no+0.5);
227 check(im_off=cpl_imagelist_collapse_minmax_create(list_off,lo_cut,hi_cut),
228 "sinfo_average_with_rejection failed" );
229 sinfo_free_imagelist(&list_off);
231 sinfo_free_imagelist(&list_object);
237 if (cfg->noff != 0) {
238 sinfo_msg(
"subtract off from on frames");
239 check(im_on_sub = cpl_image_subtract_create(im_on, im_off),
240 "sinfo_sub_image failed" );
242 sinfo_free_image(&im_on);
243 sinfo_free_image(&im_off);
245 check_nomsg(im_on_sub = cpl_image_duplicate(im_on));
246 sinfo_free_image(&im_on);
254 if (cfg->gaussInd == 1) {
255 sinfo_msg(
"convolution with Gaussian");
256 cknull(im_on_gauss = sinfo_new_convolve_ns_image_by_gauss(im_on_sub,
258 "could not carry out sinfo_convolveNSImageByGauss" );
260 sinfo_free_image(&im_on_sub);
261 check_nomsg(im_on_sub = cpl_image_duplicate(im_on_gauss));
262 sinfo_free_image(&im_on_gauss);
271 if (cfg->maskInd == 1) {
272 sinfo_msg(
"static bad pixel indication");
273 check(im_mask = cpl_image_load(cfg->mask,CPL_TYPE_FLOAT,0,0),
274 "could not load static bad pixel mask" );
275 cknull(im_on_ind = sinfo_new_mult_image_by_mask(im_on_sub, im_mask),
276 "could not carry out sinfo_multImageByMask" );
277 sinfo_free_image(&im_mask);
278 sinfo_free_image(&im_on_sub);
281 check_nomsg(im_on_ind = cpl_image_duplicate(im_on_sub));
282 sinfo_free_image(&im_on_sub);
285 if(pdensity > 1 && strcmp(plugin_id,
"sinfo_rec_distortion")!=0) {
286 ck0(sinfo_pro_save_ima(im_on_ind,ref_set,sof,cfg->fitsname,
287 PRO_MASTER_SLIT,NULL,plugin_id,config),
288 "cannot save ima %s", cfg->fitsname);
296 sinfo_msg(
"Do the north - south - test");
298 cknull(distances = sinfo_north_south_test(im_on_ind,
307 "North South Test distance determination failed");
308 sinfo_free_image(&im_on_ind);
312 check_nomsg(tbl_dist = cpl_table_new(cfg->nslits - 1));
313 check_nomsg(cpl_table_new_column(tbl_dist,
"slitlet_distance",
315 check_nomsg(cpl_table_copy_data_float(tbl_dist,
"slitlet_distance",
318 strcpy(tbl_name,cfg->outName);
320 check_nomsg(qclog_tbl = cpl_table_new(cfg->nslits + 1));
321 check_nomsg(cpl_table_new_column(qclog_tbl,
"key_name", CPL_TYPE_STRING));
322 check_nomsg(cpl_table_new_column(qclog_tbl,
"key_type", CPL_TYPE_STRING));
323 check_nomsg(cpl_table_new_column(qclog_tbl,
"key_value", CPL_TYPE_STRING));
324 check_nomsg(cpl_table_new_column(qclog_tbl,
"key_help", CPL_TYPE_STRING));
326 check_nomsg(qc_dist=cpl_vector_new(cfg->nslits - 1));
328 for(i=0;i<cfg->nslits - 1;i++) {
329 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%i",
"QC SL DIST",i);
330 cpl_table_set_string(qclog_tbl,
"key_name",i,key_name);
331 cpl_table_set_string(qclog_tbl,
"key_type",i,
"CPL_TYPE_DOUBLE");
332 snprintf(key_value,MAX_NAME_SIZE-1,
"%g",distances[i]);
333 cpl_table_set_string(qclog_tbl,
"key_value",i,key_value);
334 cpl_table_set_string(qclog_tbl,
"key_help",i,
"Slitlet distance");
336 cpl_vector_set(qc_dist,i,distances[i]);
339 check_nomsg(qc_dist_stdev=cpl_vector_get_stdev(qc_dist));
341 cpl_table_set_string(qclog_tbl,
"key_name",cfg->nslits-1,
"QC SL DISTAVG");
342 cpl_table_set_string(qclog_tbl,
"key_type",cfg->nslits-1,
"CPL_TYPE_DOUBLE");
343 snprintf(key_value,MAX_NAME_SIZE-1,
"%g",cpl_vector_get_mean(qc_dist));
344 cpl_table_set_string(qclog_tbl,
"key_value",cfg->nslits-1,key_value);
345 cpl_table_set_string(qclog_tbl,
"key_help",cfg->nslits-1,
346 "Average Slitlet distance");
348 cpl_table_set_string(qclog_tbl,
"key_name",cfg->nslits,
"QC SL DISTRMS");
349 cpl_table_set_string(qclog_tbl,
"key_type",cfg->nslits,
"CPL_TYPE_DOUBLE");
350 snprintf(key_value,MAX_NAME_SIZE-1,
"%g",qc_dist_stdev);
351 cpl_table_set_string(qclog_tbl,
"key_value",cfg->nslits,key_value);
352 cpl_table_set_string(qclog_tbl,
"key_help",cfg->nslits,
353 "RMS Slitlet distance");
355 ck0(sinfo_pro_save_tbl(tbl_dist,ref_set,sof,tbl_name,
356 PRO_SLITLETS_DISTANCE,qclog_tbl,plugin_id,config),
357 "cannot dump tbl %s", tbl_name);
359 sinfo_free_my_vector(&qc_dist);
360 sinfo_free_table(&tbl_dist);
361 sinfo_free_table(&qclog_tbl);
362 sinfo_free_float(&distances);
363 sinfo_ns_free (&cfg);
364 sinfo_free_frameset(&raw);
369 sinfo_free_my_vector(&qc_dist);
370 sinfo_free_table(&tbl_dist);
371 sinfo_free_table(&qclog_tbl);
372 sinfo_free_float(&distances);
373 sinfo_free_table(&tbl_dist);
374 sinfo_free_table(&qclog_tbl);
375 sinfo_free_imagelist(&list_object);
376 sinfo_free_imagelist(&list_off);
377 sinfo_free_image(&im_on);
378 sinfo_free_image(&im_mask);
379 sinfo_free_image(&im_on_gauss);
380 sinfo_free_image(&im_on_sub);
381 sinfo_free_image(&im_off);
382 sinfo_free_image(&im_on_ind);
383 sinfo_ns_free (&cfg);
384 sinfo_free_frameset(&raw);
#define sinfo_msg_error(...)
Print an error message.