25 #include <muse_instrument.h> 26 #include "muse_data_format_z.h" 81 #define PRINT_USAGE(rc) \ 82 fprintf(stderr, "Usage: %s [ -i INTABLE ] [ -r REFIMAGE [ -n extname ] ] " \ 83 "[ -t ] ASCIIFILE IFUNUM OUTTABLE\n", argv[0]); \ 84 cpl_end(); return (rc); 86 int main(
int argc,
char **argv)
88 cpl_init(CPL_INIT_DEFAULT);
95 if (getenv(
"ESOREX_MSG_LEVEL") && !strncmp(getenv(
"ESOREX_MSG_LEVEL"),
97 cpl_msg_set_level(CPL_MSG_DEBUG);
105 unsigned char nifu = 0;
106 cpl_boolean trimmedcoords = CPL_FALSE;
110 for (i = 1; i < argc; i++) {
111 if (strncmp(argv[i],
"-i", 3) == 0) {
119 }
else if (strncmp(argv[i],
"-r", 3) == 0) {
127 }
else if (strncmp(argv[i],
"-n", 3) == 0) {
135 }
else if (strncmp(argv[i],
"-t", 3) == 0) {
137 trimmedcoords = CPL_TRUE;
138 }
else if (strncmp(argv[i],
"-", 1) == 0) {
141 if (fname && toname) {
146 }
else if (nifu == 0) {
147 int ifunum = atoi(argv[i]);
148 if (ifunum < 1 || ifunum > kMuseNumIFUs) {
159 FILE *fp = fopen(fname,
"r");
167 printf(
"Converting coordinates from trimmed to raw data dimensions\n");
169 #define START_SIZE 10000 171 cpl_size irow = 0, nrow = cpl_table_get_nrow(table);
173 while (fscanf(fp,
"%d %d %d", &ix, &iy, &idq) == 3) {
175 cpl_table_set_size(table, nrow + START_SIZE);
176 nrow = cpl_table_get_nrow(table);
183 if (ix < 1 || ix > (kMuseOutputXRight + 4*kMusePreOverscanSize) ||
184 iy < 1 || iy > (kMuseOutputYTop + 4*kMusePreOverscanSize)) {
185 fprintf(stderr,
"Excluding bad pixel at given %d,%d %s coordinates, as " 186 "it would be outside the MUSE CCD!\n", iorig, jorig,
187 trimmedcoords ?
"trimmed" :
"raw");
190 cpl_table_set_int(table, MUSE_BADPIX_X, irow, ix);
191 cpl_table_set_int(table, MUSE_BADPIX_Y, irow, iy);
192 cpl_table_set_int(table, MUSE_BADPIX_DQ, irow++, idq);
194 cpl_table_set_size(table, irow);
195 printf(
"%"CPL_SIZE_FORMAT
" bad pixel%s read from \"%s\"\n", irow,
196 irow != 1 ?
"s" :
"", fname);
198 if (cpl_msg_get_level() == CPL_MSG_DEBUG) {
199 printf(
"first 10 entries of the new table, as converted from ASCII:\n");
200 cpl_table_dump(table, 0, 10, stdout);
207 cpl_propertylist *htest = cpl_propertylist_load(tiname, 0);
209 cpl_propertylist_delete(htest);
211 printf(
"WARNING: could not open input table \"%s\"!\n", tiname);
217 char *chan = cpl_sprintf(
"CHAN%02hhu", nifu);
218 cpl_table *intable = NULL;
221 cpl_errorstate state = cpl_errorstate_get();
224 cpl_errorstate_set(state);
231 cpl_boolean savedsomething = rc == CPL_ERROR_NONE;
234 inext = cpl_fits_find_extension(toname, chan);
236 cpl_propertylist *pheader = NULL,
239 printf(
"WARNING: no pre-existing data, creating minimal header from " 241 pheader = cpl_propertylist_new();
242 cpl_propertylist_append_string(pheader,
"TELESCOP",
"ESO-VLT-U4");
243 cpl_propertylist_append_string(pheader,
"INSTRUME",
"MUSE");
244 cpl_propertylist_append_string(pheader,
"OBJECT",
245 "Bad pixel table for MUSE (BADPIX_TABLE)");
246 header = cpl_propertylist_new();
247 cpl_propertylist_append_string(header,
"EXTNAME", chan);
248 cpl_propertylist_append_string(header,
"ESO DET CHIP NAME", chan);
250 printf(
"Using primary header from \"%s\" as starting point\n", riname);
251 pheader = cpl_propertylist_load_regexp(riname, 0,
"TELESCOP|INSTRUME|" 255 cpl_propertylist_erase_regexp(pheader,
"ESO DET DEV[0-9] (SHUT |EXP )|" 256 "ESO DET (EXP |[DU]IT|NDIT|DKTM)", 0);
257 cpl_propertylist_erase_regexp(pheader,
"ESO DET (CHIP |OUT[1-4])", 0);
258 cpl_propertylist_update_string(pheader,
"OBJECT",
259 "Bad pixel table for MUSE (BADPIX_TABLE)");
260 int refext = cpl_fits_find_extension(riname, extname);
262 printf(
"Using extension header from \"%s[%s]\" (%d)\n", riname, extname,
264 header = cpl_propertylist_load_regexp(riname, refext,
265 "^EXT|ESO DET (CHIP |OUT[1-4])", 0);
267 printf(
"WARNING: no pre-existing extension found, creating minimal " 268 "extension header from scratch!\n");
269 header = cpl_propertylist_new();
270 cpl_propertylist_append_string(header,
"EXTNAME", chan);
271 cpl_propertylist_append_string(header,
"ESO DET CHIP NAME", chan);
274 if (savedsomething) {
276 rc = cpl_table_save(table, NULL, header, toname, CPL_IO_EXTEND);
279 cpl_propertylist_update_string(pheader,
"PIPEFILE", toname);
280 cpl_propertylist_set_comment(pheader,
"PIPEFILE",
281 "pretend to be a pipeline output file");
282 cpl_propertylist_update_string(pheader,
"ESO PRO CATG", MUSE_TAG_BADPIX_TABLE);
283 cpl_propertylist_set_comment(pheader,
"ESO PRO CATG",
284 "MUSE bad pixel table");
285 rc = cpl_table_save(table, pheader, header, toname, CPL_IO_CREATE);
287 if (rc != CPL_ERROR_NONE) {
288 fprintf(stderr,
"Saving to \"%s\" failed (rc=%d): %s\n", toname, rc,
289 cpl_error_get_message());
291 printf(
"Saved to \"%s\" (%s)\n", toname,
292 savedsomething ?
"new extension" :
"new file");
294 cpl_propertylist_delete(pheader);
295 cpl_propertylist_delete(header);
298 cpl_table_delete(table);
300 if (cpl_msg_get_level() == CPL_MSG_DEBUG) {
301 printf(
"Output file \"%s\" has primary header and %"CPL_SIZE_FORMAT
302 " extensions\n", toname, cpl_fits_count_extensions(toname));
303 cpl_errorstate_dump(0, CPL_FALSE, NULL);
cpl_error_code muse_quality_copy_badpix_table(const char *aInFile, const char *aOutFile, int aExtension, const cpl_table *aTable)
Copy bad pixel table on disk, replacing the table in one extension.
cpl_table * muse_quality_merge_badpix_from_file(const cpl_table *aTable, const char *aInFile, const char *aExtname, int *aExt)
Merge bad pixel table in memory with table from file on disk.
cpl_table * muse_cpltable_new(const muse_cpltable_def *aDef, cpl_size aLength)
Create an empty table according to the specified definition.
cpl_error_code muse_quadrants_coords_to_raw(cpl_propertylist *aHeader, int *aX, int *aY)
Convert coordinates of a trimmed image to raw-image coordinates.
void muse_processing_recipeinfo(cpl_plugin *)
Output main pipeline configuration, inputs, and parameters.