37 #include <casu_utils.h>
38 #include <casu_mods.h>
40 #include "vircam_utils.h"
41 #include "vircam_dfs.h"
42 #include "vircam_mods.h"
43 #include "vircam_paf.h"
47 static int vircam_platesol_create(cpl_plugin *) ;
48 static int vircam_platesol_exec(cpl_plugin *) ;
49 static int vircam_platesol_destroy(cpl_plugin *) ;
50 static int vircam_platesol_test(cpl_parameterlist *, cpl_frameset *) ;
51 static int vircam_platesol_save(
void);
52 static void vircam_platesol_init(
void);
53 static void vircam_platesol_tidy(
void);
63 } vircam_platesol_config;
75 static char vircam_platesol_description[] =
76 "vircam_platesol -- VIRCAM plate solution fitting test recipe.\n\n"
77 "Fit a plate solution to a matched standards table and write the resulting\n"
78 "WCS to an input image header.\n\n"
79 "The program accepts the following files in the SOF:\n\n"
81 " -----------------------------------------------------------------------\n"
82 " %-21s A input uncorrected image\n"
83 " %-21s A matched standards table\n"
84 "The WCS values from the solution are written to a paf file. This is the\n"
85 "only product of this recipe\n"
152 int cpl_plugin_get_info(cpl_pluginlist *list) {
153 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
154 cpl_plugin *plugin = &recipe->interface;
155 char alldesc[SZ_ALLDESC];
156 (void)snprintf(alldesc,SZ_ALLDESC,vircam_platesol_description,
157 VIRCAM_TEST_SCIENCE_RAW,VIRCAM_CAL_MSTDTAB);
159 cpl_plugin_init(plugin,
161 VIRCAM_BINARY_VERSION,
162 CPL_PLUGIN_TYPE_RECIPE,
164 "VIRCAM plate solution test recipe [test]",
169 vircam_platesol_create,
170 vircam_platesol_exec,
171 vircam_platesol_destroy);
173 cpl_pluginlist_append(list,plugin);
189 static int vircam_platesol_create(cpl_plugin *plugin) {
195 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
196 recipe = (cpl_recipe *)plugin;
202 recipe->parameters = cpl_parameterlist_new();
206 p = cpl_parameter_new_enum(
"vircam.vircam_platesol.nconst",
208 "Number of plate constants",
209 "vircam.vircam_platesol",6,2,4,6);
210 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"nconst");
211 cpl_parameterlist_append(recipe->parameters,p);
215 p = cpl_parameter_new_value(
"vircam.vircam_platesol.shiftan",
217 "Shift position of tangent point",
218 "vircam.vircam_platesol",FALSE);
219 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"shiftan");
220 cpl_parameterlist_append(recipe->parameters,p);
224 p = cpl_parameter_new_range(
"vircam.vircam_platesol.extenum",
226 "Extension number to be done, 0 == all",
227 "vircam.vircam_platesol",1,0,16);
228 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
229 cpl_parameterlist_append(recipe->parameters,p);
244 static int vircam_platesol_exec(cpl_plugin *plugin) {
249 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
250 recipe = (cpl_recipe *)plugin;
254 return(vircam_platesol_test(recipe->parameters,recipe->frames));
265 static int vircam_platesol_destroy(cpl_plugin *plugin) {
270 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
271 recipe = (cpl_recipe *)plugin;
275 cpl_parameterlist_delete(recipe->parameters);
288 static int vircam_platesol_test(cpl_parameterlist *parlist,
289 cpl_frameset *framelist) {
290 const char *fctid=
"vircam_platesol";
292 int jst,jfn,status,j;
297 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
298 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
304 vircam_platesol_init();
308 p = cpl_parameterlist_find(parlist,
"vircam.vircam_platesol.nconst");
309 vircam_platesol_config.nconst = cpl_parameter_get_int(p);
310 p = cpl_parameterlist_find(parlist,
"vircam.vircam_platesol.shiftan");
311 vircam_platesol_config.shiftan = cpl_parameter_get_bool(p);
312 p = cpl_parameterlist_find(parlist,
"vircam.vircam_platesol.extenum");
313 vircam_platesol_config.extenum = cpl_parameter_get_int(p);
318 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
319 vircam_platesol_tidy();
327 cpl_msg_error(fctid,
"Cannot labelise the input frames");
328 vircam_platesol_tidy();
332 VIRCAM_CAL_MSTDTAB)) == NULL) {
333 cpl_msg_info(fctid,
"No matched standards table found -- cannot continue");
334 vircam_platesol_tidy();
338 VIRCAM_TEST_SCIENCE_RAW)) == NULL) {
339 cpl_msg_info(fctid,
"No raw image found -- cannot continue");
340 vircam_platesol_tidy();
350 if (jst == -1 || jfn == -1) {
351 cpl_msg_error(fctid,
"Unable to continue");
352 vircam_platesol_tidy();
359 for (j = jst; j <= jfn; j++) {
365 if (ps.img == NULL || ps.mstdsf == NULL) {
367 freetfits(ps.mstdsf);
368 cpl_msg_warning(fctid,
"Unable to load one of the inputs");
374 cpl_msg_info(fctid,
"Doing the plate solution for extension %" CPL_SIZE_FORMAT,
378 vircam_platesol_config.nconst,
379 vircam_platesol_config.shiftan,&status);
380 if (status != CASU_OK) {
381 cpl_msg_warning(fctid,
"Plate solution failed");
387 cpl_msg_info(fctid,
"Saving results for extension %" CPL_SIZE_FORMAT,
389 if (vircam_platesol_save() != 0)
390 cpl_msg_warning(fctid,
"Save routine failed");
395 freetfits(ps.mstdsf);
397 vircam_platesol_tidy();
408 static int vircam_platesol_save(
void) {
409 const char *fctid =
"vircam_platesol_save";
410 const char *outfile =
"platesol";
411 const char *keys[] = {
"CRVAL1",
"CRVAL2",
"CRPIX1",
"CRPIX2",
"CD1_1",
"CD1_2",
412 "CD2_1",
"CD2_2",
"PV2_3",
"ESO DRS NUMBRMS",
413 "ESO DRS STDCRMS",
"ESO DRS WCSRAOFF",
414 "ESO DRS WCSDECOFF"};
416 cpl_propertylist *plist,*p2,*p3;
424 if ((p2 = vircam_paf_req_items(plist)) == NULL) {
425 cpl_msg_error(fctid,
"Unable to find required items in header");
430 freepropertylist(p3);
434 for (i = 0; i < nkeys; i++) {
435 cpl_propertylist_copy_property(p2,plist,keys[i]);
436 if (cpl_error_get_code() != CPL_ERROR_NONE) {
437 cpl_msg_error(fctid,
"A header parameter %s is missing",keys[i]);
438 cpl_propertylist_delete(p2);
445 if (vircam_paf_print((
char *)outfile,
"VIRCAM/vircam_platesol",
446 "Test QC file",p2) != CASU_OK) {
447 cpl_msg_error(fctid,
"Error writing PAF");
448 cpl_propertylist_delete(p2);
454 cpl_propertylist_delete(p2);
465 static void vircam_platesol_init(
void) {
480 static void vircam_platesol_tidy(
void) {
481 freespace(ps.labels);
483 freetfits(ps.mstdsf);
casu_fits * casu_fits_load(cpl_frame *frame, cpl_type type, int nexten)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
int casu_platesol(cpl_propertylist *plist, cpl_propertylist *tlist, cpl_table *matchedstds, int nconst, int shiftan, int *status)
Work out a WCS for an image.
cpl_table * casu_tfits_get_table(casu_tfits *p)
casu_tfits * casu_tfits_load(cpl_frame *table, int nexten)
cpl_frame * casu_frameset_subgroup_1(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frame of a given label from a frameset.
int casu_compare_tags(const cpl_frame *frame1, const cpl_frame *frame2)
Compare input tags.
void casu_merge_propertylists(cpl_propertylist *p1, cpl_propertylist *p2)
Merge two propertylists.
int vircam_dfs_set_groups(cpl_frameset *set)
const char * vircam_get_license(void)
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)