37 #include "vircam_utils.h"
38 #include "vircam_dfs.h"
39 #include "vircam_fits.h"
40 #include "vircam_mods.h"
41 #include "vircam_paf.h"
45 static int vircam_platesol_create(cpl_plugin *) ;
46 static int vircam_platesol_exec(cpl_plugin *) ;
47 static int vircam_platesol_destroy(cpl_plugin *) ;
48 static int vircam_platesol_test(cpl_parameterlist *, cpl_frameset *) ;
49 static int vircam_platesol_save(
void);
50 static void vircam_platesol_init(
void);
51 static void vircam_platesol_tidy(
void);
61 } vircam_platesol_config;
73 static char vircam_platesol_description[] =
74 "vircam_platesol -- VIRCAM plate solution fitting test recipe.\n\n"
75 "Fit a plate solution to a matched standards table and write the resulting\n"
76 "WCS to an input image header.\n\n"
77 "The program accepts the following files in the SOF:\n\n"
79 " -----------------------------------------------------------------------\n"
80 " %-21s A input uncorrected image\n"
81 " %-21s A matched standards table\n"
82 "The WCS values from the solution are written to a paf file. This is the\n"
83 "only product of this recipe\n"
150 int cpl_plugin_get_info(cpl_pluginlist *list) {
151 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
152 cpl_plugin *plugin = &recipe->interface;
153 char alldesc[SZ_ALLDESC];
154 (void)snprintf(alldesc,SZ_ALLDESC,vircam_platesol_description,
155 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_MSTDTAB);
157 cpl_plugin_init(plugin,
159 VIRCAM_BINARY_VERSION,
160 CPL_PLUGIN_TYPE_RECIPE,
162 "VIRCAM plate solution test recipe [test]",
167 vircam_platesol_create,
168 vircam_platesol_exec,
169 vircam_platesol_destroy);
171 cpl_pluginlist_append(list,plugin);
187 static int vircam_platesol_create(cpl_plugin *plugin) {
193 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
194 recipe = (cpl_recipe *)plugin;
200 recipe->parameters = cpl_parameterlist_new();
204 p = cpl_parameter_new_enum(
"vircam.vircam_platesol.nconst",
206 "Number of plate constants",
207 "vircam.vircam_platesol",6,2,4,6);
208 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"nconst");
209 cpl_parameterlist_append(recipe->parameters,p);
213 p = cpl_parameter_new_value(
"vircam.vircam_platesol.shiftan",
215 "Shift position of tangent point",
216 "vircam.vircam_platesol",FALSE);
217 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"shiftan");
218 cpl_parameterlist_append(recipe->parameters,p);
222 p = cpl_parameter_new_range(
"vircam.vircam_platesol.extenum",
224 "Extension number to be done, 0 == all",
225 "vircam.vircam_platesol",1,0,16);
226 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
227 cpl_parameterlist_append(recipe->parameters,p);
242 static int vircam_platesol_exec(cpl_plugin *plugin) {
247 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
248 recipe = (cpl_recipe *)plugin;
252 return(vircam_platesol_test(recipe->parameters,recipe->frames));
263 static int vircam_platesol_destroy(cpl_plugin *plugin) {
268 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
269 recipe = (cpl_recipe *)plugin;
273 cpl_parameterlist_delete(recipe->parameters);
286 static int vircam_platesol_test(cpl_parameterlist *parlist,
287 cpl_frameset *framelist) {
288 const char *fctid=
"vircam_platesol";
290 int jst,jfn,status,j;
295 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
296 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
302 vircam_platesol_init();
306 p = cpl_parameterlist_find(parlist,
"vircam.vircam_platesol.nconst");
307 vircam_platesol_config.nconst = cpl_parameter_get_int(p);
308 p = cpl_parameterlist_find(parlist,
"vircam.vircam_platesol.shiftan");
309 vircam_platesol_config.shiftan = cpl_parameter_get_bool(p);
310 p = cpl_parameterlist_find(parlist,
"vircam.vircam_platesol.extenum");
311 vircam_platesol_config.extenum = cpl_parameter_get_int(p);
316 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
317 vircam_platesol_tidy();
325 cpl_msg_error(fctid,
"Cannot labelise the input frames");
326 vircam_platesol_tidy();
330 VIRCAM_CAL_MSTDTAB)) == NULL) {
331 cpl_msg_info(fctid,
"No matched standards table found -- cannot continue");
332 vircam_platesol_tidy();
336 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
337 cpl_msg_info(fctid,
"No raw image found -- cannot continue");
338 vircam_platesol_tidy();
348 if (jst == -1 || jfn == -1) {
349 cpl_msg_error(fctid,
"Unable to continue");
350 vircam_platesol_tidy();
357 for (j = jst; j <= jfn; j++) {
363 if (ps.img == NULL || ps.mstdsf == NULL) {
365 freetfits(ps.mstdsf);
366 cpl_msg_warning(fctid,
"Unable to load one of the inputs");
372 cpl_msg_info(fctid,
"Doing the plate solution for extension %" CPL_SIZE_FORMAT,
376 vircam_platesol_config.nconst,
377 vircam_platesol_config.shiftan,&status);
378 if (status != VIR_OK) {
379 cpl_msg_warning(fctid,
"Plate solution failed");
385 cpl_msg_info(fctid,
"Saving results for extension %" CPL_SIZE_FORMAT,
387 if (vircam_platesol_save() != 0)
388 cpl_msg_warning(fctid,
"Save routine failed");
393 freetfits(ps.mstdsf);
395 vircam_platesol_tidy();
406 static int vircam_platesol_save(
void) {
407 const char *fctid =
"vircam_platesol_save";
408 const char *outfile =
"platesol";
409 const char *keys[] = {
"CRVAL1",
"CRVAL2",
"CRPIX1",
"CRPIX2",
"CD1_1",
"CD1_2",
410 "CD2_1",
"CD2_2",
"PV2_3",
"ESO DRS NUMBRMS",
411 "ESO DRS STDCRMS",
"ESO DRS WCSRAOFF",
412 "ESO DRS WCSDECOFF"};
414 cpl_propertylist *plist,*p2,*p3;
422 if ((p2 = vircam_paf_req_items(plist)) == NULL) {
423 cpl_msg_error(fctid,
"Unable to find required items in header");
428 freepropertylist(p3);
432 for (i = 0; i < nkeys; i++) {
433 cpl_propertylist_copy_property(p2,plist,keys[i]);
434 if (cpl_error_get_code() != CPL_ERROR_NONE) {
435 cpl_msg_error(fctid,
"A header parameter %s is missing",keys[i]);
436 cpl_propertylist_delete(p2);
443 if (vircam_paf_print((
char *)outfile,
"VIRCAM/vircam_platesol",
444 "Test QC file",p2) != VIR_OK) {
445 cpl_msg_error(fctid,
"Error writing PAF");
446 cpl_propertylist_delete(p2);
452 cpl_propertylist_delete(p2);
463 static void vircam_platesol_init(
void) {
478 static void vircam_platesol_tidy(
void) {
479 freespace(ps.labels);
481 freetfits(ps.mstdsf);