00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <string.h>
00023 #include <muse.h>
00024
00025
00049
00050
00053 #define PRINT_USAGE(rc) \
00054 fprintf(stderr, "Usage: %s [ -s ] [ -d ] FILENAMES\n", argv[0]); \
00055 cpl_end(); return (rc);
00056
00057 int main(int argc, char **argv)
00058 {
00059 cpl_init(CPL_INIT_DEFAULT);
00060 muse_processing_recipeinfo(NULL);
00061
00062 if (argc <= 3) {
00063
00064 PRINT_USAGE(1);
00065 }
00066
00067
00068 cpl_boolean dodelete = CPL_FALSE,
00069 dosign = CPL_FALSE;
00070 cpl_array *inames = cpl_array_new(0, CPL_TYPE_STRING);
00071 int nin = cpl_array_get_size(inames);
00072 int i;
00073 for (i = 1; i < argc; i++) {
00074 if (strncmp(argv[i], "-s", 3) == 0) {
00075 dosign = CPL_TRUE;
00076 } else if (strncmp(argv[i], "-d", 3) == 0) {
00077 dodelete = CPL_TRUE;
00078 } else if (strncmp(argv[i], "-", 1) == 0) {
00079 PRINT_USAGE(9);
00080 } else {
00081 cpl_array_set_size(inames, ++nin);
00082 cpl_array_set_string(inames, nin - 1, argv[i]);
00083 }
00084 }
00085
00086 cpl_errorstate state = cpl_errorstate_get();
00087
00088
00089 printf("Separate input product%s:\n", nin == 0 ? "" : "s");
00090 cpl_frameset *fset = cpl_frameset_new();
00091 for (i = 0; i < nin; i++) {
00092 cpl_frame *frame = cpl_frame_new();
00093 const char *fn = cpl_array_get_string(inames, i);
00094 cpl_frame_set_filename(frame, fn);
00095
00096 cpl_propertylist *header = cpl_propertylist_load(fn, 0);
00097 const char *tag = muse_pfits_get_pro_catg(header);
00098
00099 if (tag && !strncmp(tag, "PIXTABLE_", 9)) {
00100 fprintf(stderr, "\tWARNING: \"%s\" (PRO.CATG %s), cannot merge this type!\n", fn, tag);
00101 cpl_frame_delete(frame);
00102 cpl_propertylist_delete(header);
00103 continue;
00104 }
00105 cpl_frame_set_tag(frame, tag);
00106 cpl_frame_set_group(frame, CPL_FRAME_GROUP_NONE);
00107
00108 cpl_frame_set_type(frame, CPL_FRAME_TYPE_NONE);
00109 cpl_frame_set_level(frame, CPL_FRAME_LEVEL_NONE);
00110 printf("\t\"%s\" (PRO.CATG %s).\n", fn, tag);
00111 cpl_propertylist_delete(header);
00112 #if 0
00113 printf("frame!\n");
00114 cpl_frame_dump(frame, stdout);
00115 fflush(stdout);
00116 #endif
00117 cpl_frameset_insert(fset, frame);
00118 }
00119 cpl_array_delete(inames);
00120
00121
00122 nin = cpl_frameset_get_size(fset);
00123 if (nin <= 1) {
00124 cpl_frameset_delete(fset);
00125 PRINT_USAGE(10);
00126 }
00127
00128 printf("Merging %d products, %s the input files...\n", nin,
00129 dodelete ? "deleting" : "keeping");
00130 muse_utils_frameset_merge_frames(fset, dodelete);
00131 #if 0
00132 printf("merged frameset:\n");
00133 cpl_frameset_dump(fset, stdout);
00134 fflush(stdout);
00135 #endif
00136
00137 int nout = cpl_frameset_get_size(fset),
00138 nmerged = nout - (dodelete ? 0 : nin);
00139 if (dosign) {
00140 printf("Signing %d output product%s...\n", nmerged, nmerged == 0 ? "" : "s");
00141 cpl_dfs_sign_products(fset, CPL_DFS_SIGNATURE_DATAMD5 | CPL_DFS_SIGNATURE_CHECKSUM);
00142 }
00143
00144 printf("Merged output product%s:\n", nout == 0 ? "" : "s");
00145 for (i = 0; i < nout; i++) {
00146 const cpl_frame *frame = cpl_frameset_get_position_const(fset, i);
00147 if (cpl_frame_get_group(frame) != CPL_FRAME_GROUP_PRODUCT) {
00148 continue;
00149 }
00150 const char *fn = cpl_frame_get_filename(frame);
00151 cpl_propertylist *header = cpl_propertylist_load(fn, 0);
00152 const char *tag = muse_pfits_get_pro_catg(header);
00153 int next = cpl_fits_count_extensions(fn);
00154 printf("\t\"%s\" (PRO.CATG %s, %d FITS extensions)\n", fn, tag, next);
00155 cpl_propertylist_delete(header);
00156 }
00157 cpl_frameset_delete(fset);
00158
00159 int rc = 0;
00160 if (!cpl_errorstate_is_equal(state)) {
00161 cpl_errorstate_dump(state, CPL_FALSE, muse_cplerrorstate_dump_some);
00162 rc = 50;
00163 }
00164 cpl_memory_dump();
00165 cpl_end();
00166 return rc;
00167 }
00168