00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifdef HAVE_CONFIG_H
00031 #include <config.h>
00032 #endif
00033
00034 #include <stdio.h>
00035 #include <cpl.h>
00036
00037 #include "vircam_utils.h"
00038 #include "vircam_dfs.h"
00039 #include "vircam_fits.h"
00040 #include "vircam_mods.h"
00041 #include "vircam_paf.h"
00042
00043
00044
00045 static int vircam_matchxy_create(cpl_plugin *);
00046 static int vircam_matchxy_exec(cpl_plugin *);
00047 static int vircam_matchxy_destroy(cpl_plugin *);
00048 static int vircam_matchxy_test(cpl_parameterlist *, cpl_frameset *);
00049 static int vircam_matchxy_save(void);
00050 static void vircam_matchxy_init(void);
00051 static void vircam_matchxy_tidy(void);
00052
00053 static struct {
00054
00055
00056
00057 int extenum;
00058
00059
00060
00061 float xoff;
00062 float yoff;
00063 int nm;
00064
00065 } vircam_matchxy_config;
00066
00067
00068 static struct {
00069 int *labels;
00070 cpl_frameset *catlist;
00071 cpl_frame *cat1;
00072 cpl_frame *cat2;
00073 vir_tfits *cat1f;
00074 vir_tfits *cat2f;
00075 } ps;
00076
00077
00078 static char vircam_matchxy_description[] =
00079 "vircam_matchxy -- VIRCAM recipe to test vircam_matchxy.\n\n"
00080 "Match a catalogue with another to get x,y offsets\n\n"
00081 "The program accepts the following files in the SOF:\n\n"
00082 " Tag Description\n"
00083 " -----------------------------------------------------------------------\n"
00084 " %-21s Input catalogues of objects extracted from an image\n"
00085 "\n";
00086
00125
00126
00127
00135
00136
00137 int cpl_plugin_get_info(cpl_pluginlist *list) {
00138 cpl_recipe *recipe = cpl_calloc(1,sizeof(*recipe));
00139 cpl_plugin *plugin = &recipe->interface;
00140 char alldesc[SZ_ALLDESC];
00141 (void)snprintf(alldesc,SZ_ALLDESC,vircam_matchxy_description,
00142 VIRCAM_CAL_OBJCAT);
00143
00144 cpl_plugin_init(plugin,
00145 CPL_PLUGIN_API,
00146 VIRCAM_BINARY_VERSION,
00147 CPL_PLUGIN_TYPE_RECIPE,
00148 "vircam_matchxy",
00149 "VIRCAM catalogue matching test recipe [test]",
00150 alldesc,
00151 "Jim Lewis",
00152 "jrl@ast.cam.ac.uk",
00153 vircam_get_license(),
00154 vircam_matchxy_create,
00155 vircam_matchxy_exec,
00156 vircam_matchxy_destroy);
00157
00158 cpl_pluginlist_append(list,plugin);
00159
00160 return(0);
00161 }
00162
00163
00172
00173
00174 static int vircam_matchxy_create(cpl_plugin *plugin) {
00175 cpl_recipe *recipe;
00176 cpl_parameter *p;
00177
00178
00179
00180 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00181 recipe = (cpl_recipe *)plugin;
00182 else
00183 return(-1);
00184
00185
00186
00187 recipe->parameters = cpl_parameterlist_new();
00188
00189
00190
00191 p = cpl_parameter_new_range("vircam.vircam_matchxy.extenum",
00192 CPL_TYPE_INT,
00193 "Extension number to be done, 0 == all",
00194 "vircam.vircam_matchxy",1,0,16);
00195 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,"ext");
00196 cpl_parameterlist_append(recipe->parameters,p);
00197
00198
00199
00200 return(0);
00201 }
00202
00203
00209
00210
00211 static int vircam_matchxy_exec(cpl_plugin *plugin) {
00212 cpl_recipe *recipe;
00213
00214
00215
00216 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00217 recipe = (cpl_recipe *)plugin;
00218 else
00219 return(-1);
00220
00221 return(vircam_matchxy_test(recipe->parameters,recipe->frames));
00222 }
00223
00224
00230
00231
00232 static int vircam_matchxy_destroy(cpl_plugin *plugin) {
00233 cpl_recipe *recipe ;
00234
00235
00236
00237 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
00238 recipe = (cpl_recipe *)plugin;
00239 else
00240 return(-1);
00241
00242 cpl_parameterlist_delete(recipe->parameters);
00243 return(0);
00244 }
00245
00246
00253
00254
00255 static int vircam_matchxy_test(cpl_parameterlist *parlist,
00256 cpl_frameset *framelist) {
00257 const char *fctid="vircam_matchxy";
00258 cpl_parameter *p;
00259 int nlab,jst,jfn,status,j;
00260 cpl_table *out;
00261
00262
00263
00264 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
00265 cpl_msg_error(fctid,"Input framelist NULL or has no input data\n");
00266 return(-1);
00267 }
00268
00269
00270
00271 vircam_matchxy_init();
00272
00273
00274
00275 p = cpl_parameterlist_find(parlist,"vircam.vircam_matchxy.extenum");
00276 vircam_matchxy_config.extenum = cpl_parameter_get_int(p);
00277
00278
00279
00280 if (vircam_dfs_set_groups(framelist) != VIR_OK) {
00281 cpl_msg_error(fctid,"Cannot identify RAW and CALIB frames");
00282 vircam_matchxy_tidy();
00283 return(-1);
00284 }
00285
00286
00287
00288 if ((ps.labels = cpl_frameset_labelise(framelist,vircam_compare_tags,
00289 &nlab)) == NULL) {
00290 cpl_msg_error(fctid,"Cannot labelise the input frames");
00291 vircam_matchxy_tidy();
00292 return(-1);
00293 }
00294 if ((ps.catlist = vircam_frameset_subgroup(framelist,ps.labels,nlab,
00295 VIRCAM_CAL_OBJCAT)) == NULL) {
00296 cpl_msg_error(fctid,"No object catalogues found -- cannot continue");
00297 vircam_matchxy_tidy();
00298 return(-1);
00299 }
00300 ps.cat1 = cpl_frameset_get_frame(ps.catlist,0);
00301 ps.cat2 = cpl_frameset_get_frame(ps.catlist,1);
00302 if (ps.cat1 == NULL || ps.cat2 == NULL) {
00303 cpl_msg_error(fctid,"List does not contain two object catalogues");
00304 vircam_matchxy_tidy();
00305 return(-1);
00306 }
00307
00308
00309
00310
00311
00312 vircam_exten_range(vircam_matchxy_config.extenum,
00313 (const cpl_frame *)ps.cat1,&jst,&jfn);
00314 if (jst == -1 || jfn == -1) {
00315 cpl_msg_error(fctid,"Unable to continue");
00316 vircam_matchxy_tidy();
00317 return(-1);
00318 }
00319
00320
00321
00322 status = VIR_OK;
00323 for (j = jst; j <= jfn; j++) {
00324
00325
00326
00327 ps.cat1f = vircam_tfits_load(ps.cat1,j);
00328 ps.cat2f = vircam_tfits_load(ps.cat2,j);
00329 if (ps.cat1f == NULL || ps.cat2f == NULL) {
00330 cpl_msg_warning(fctid,"No matching done\n");
00331 continue;
00332 }
00333
00334
00335
00336 cpl_msg_info(fctid,"Doing the matching for extension %d",j);
00337 (void)vircam_matchxy(vircam_tfits_get_table(ps.cat1f),
00338 vircam_tfits_get_table(ps.cat2f),200.0,
00339 &(vircam_matchxy_config.xoff),
00340 &(vircam_matchxy_config.yoff),
00341 &(vircam_matchxy_config.nm),&out,&status);
00342 freetable(out);
00343 if (status != VIR_OK) {
00344 cpl_msg_warning(fctid,"No matching results done\n");
00345 status = VIR_OK;
00346 }
00347
00348
00349
00350 cpl_msg_info(fctid,"Saving results for extension %d",j);
00351 if (vircam_matchxy_save() != 0)
00352 cpl_msg_warning(fctid,"No matching results saved\n");
00353
00354
00355
00356 freetfits(ps.cat1f);
00357 freetfits(ps.cat2f);
00358 }
00359 vircam_matchxy_tidy();
00360 return(0);
00361 }
00362
00363
00368
00369
00370 static int vircam_matchxy_save(void) {
00371 const char *fctid = "vircam_matchxy_save";
00372 const char *outfile = "matchxy";
00373 cpl_propertylist *p,*p2,*p3;
00374
00375
00376
00377 p = vircam_tfits_get_ehu(ps.cat1f);
00378
00379
00380
00381
00382 cpl_propertylist_update_string(p,"DATE-OBS","ABC");
00383
00384
00385
00386 p2 = vircam_paf_req_items(p);
00387 p3 = vircam_paf_phu_items(vircam_tfits_get_phu(ps.cat1f));
00388 vircam_merge_propertylists(p2,p3);
00389 freepropertylist(p3);
00390
00391
00392
00393 cpl_propertylist_update_float(p2,"ESO QC XOFF",vircam_matchxy_config.xoff);
00394 cpl_propertylist_set_comment(p2,"ESO QC XOFF",
00395 "Calculated X offset (pixels)");
00396 cpl_propertylist_update_float(p2,"ESO QC YOFF",vircam_matchxy_config.yoff);
00397 cpl_propertylist_set_comment(p2,"ESO QC YOFF",
00398 "Calculated Y offset (pixels)");
00399 cpl_propertylist_update_int(p2,"ESO QC NUMMATCH",
00400 vircam_matchxy_config.nm);
00401 cpl_propertylist_set_comment(p2,"ESO QC NUMMATCH",
00402 "Number of matching objects");
00403
00404
00405
00406 if (vircam_paf_print((char *)outfile,"VIRCAM/vircam_matchxy",
00407 "Test output file",p2) != VIR_OK) {
00408 cpl_msg_error(fctid,"Unable to write PAF");
00409 cpl_propertylist_delete(p2);
00410 return(-1);
00411 }
00412 cpl_propertylist_delete(p2);
00413 return(0);
00414 }
00415
00416
00417
00418
00422
00423
00424 static void vircam_matchxy_init(void) {
00425 ps.labels = NULL;
00426 ps.cat1 = NULL;
00427 ps.cat2 = NULL;
00428 ps.cat1f = NULL;
00429 ps.cat2f = NULL;
00430 ps.catlist = NULL;
00431 }
00432
00433
00434
00438
00439
00440 static void vircam_matchxy_tidy(void) {
00441 freespace(ps.labels);
00442 freetfits(ps.cat1f);
00443 freetfits(ps.cat2f);
00444 freeframeset(ps.catlist);
00445 }
00446
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494