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 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00033
00034
00035
00036 #include "crires_recipe.h"
00037
00038 #include "crires_extract.h"
00039
00040
00041
00042
00043
00044 #define RECIPE_STRING "crires_util_extract"
00045
00046
00047
00048
00049
00050 static int crires_util_extract_save(const cpl_table **, const cpl_imagelist *,
00051 const cpl_imagelist *, const cpl_parameterlist *, cpl_frameset *) ;
00052
00053 static char crires_util_extract_description[] =
00054 "This recipe accepts 1 parameter (optionally a 2nd one):\n"
00055 "First parameter: the combined image.\n"
00056 " (PRO TYPE = "CRIRES_PROTYPE_COMBINED")\n"
00057 "Second parameter (optional): the contribution map.\n"
00058 " (PRO TYPE = "CRIRES_PROTYPE_CONTRIB")\n"
00059 "\n"
00060 "This recipe produces 3 files:\n"
00061 "First product: the image of the profile of the spectrum\n"
00062 " (PRO TYPE = "CRIRES_PROTYPE_PROFILE")\n"
00063 "Second product: the table of the extracted spectrum in pixels\n"
00064 " (PRO TYPE = "CRIRES_PROTYPE_SPEC_PIX")\n"
00065 "Third product: the maps of the background\n"
00066 " (PRO TYPE = "CRIRES_PROTYPE_BGD_MAP")\n" ;
00067
00068 CRIRES_RECIPE_DEFINE(crires_util_extract,
00069 CRIRES_PARAM_DISPLAY |
00070 CRIRES_PARAM_EXTR_MODE |
00071 CRIRES_PARAM_HOR_SIZE |
00072 CRIRES_PARAM_SPEC_HSIZE |
00073 CRIRES_PARAM_KAPPA |
00074 CRIRES_PARAM_CLOSING_HSIZE |
00075 CRIRES_PARAM_CLEAN_RATE |
00076 CRIRES_PARAM_TOT_NDIT |
00077 CRIRES_PARAM_WL_STARTY |
00078 CRIRES_PARAM_WL_STOPY |
00079 CRIRES_PARAM_SPEC_ZONE |
00080 CRIRES_PARAM_REJECT,
00081 "Spectrum extraction routine",
00082 crires_util_extract_description) ;
00083
00084
00085
00086
00087
00088 static struct {
00089
00090
00091 int mode ;
00092 double kappa ;
00093 int closing_hs ;
00094 double clean_rate ;
00095 double tot_ndit ;
00096 int box_hor_size ;
00097 int spec_hsize ;
00098 int extr_spec_starty ;
00099 int extr_spec_stopy ;
00100 int starty ;
00101 int stopy ;
00102 int rej_right ;
00103 int rej_left ;
00104 int display ;
00105
00106 crires_illum_period period ;
00107 int qc_specpos[CRIRES_NB_DETECTORS] ;
00108 int qc_specwrec[CRIRES_NB_DETECTORS] ;
00109 int qc_specwopt[CRIRES_NB_DETECTORS] ;
00110 double qc_specoptmed[CRIRES_NB_DETECTORS] ;
00111 double qc_s2nmed[CRIRES_NB_DETECTORS] ;
00112 double qc_fwhm_comb_pix[CRIRES_NB_DETECTORS] ;
00113 double qc_fwhm_comb_as[CRIRES_NB_DETECTORS] ;
00114 double qc_fwhm_prof_pix[CRIRES_NB_DETECTORS] ;
00115 double qc_fwhm_prof_as[CRIRES_NB_DETECTORS] ;
00116 double qc_fwhm_diff[CRIRES_NB_DETECTORS] ;
00117 } crires_util_extract_config ;
00118
00119
00120
00121
00122
00123
00130
00131 static int crires_util_extract(
00132 cpl_frameset * frameset,
00133 const cpl_parameterlist * parlist)
00134 {
00135 const char * sval ;
00136 cpl_imagelist * imlist ;
00137 cpl_propertylist * plist ;
00138 cpl_imagelist * contrib ;
00139 cpl_image * contribution_map ;
00140 cpl_frame * fr ;
00141 cpl_imagelist * profile ;
00142 cpl_image * prof[CRIRES_NB_DETECTORS] ;
00143 cpl_imagelist * bgmaps ;
00144 cpl_image * bgmap[CRIRES_NB_DETECTORS] ;
00145 cpl_table * ext[CRIRES_NB_DETECTORS] ;
00146 cpl_vector * ext_vec ;
00147 int ly, nexp ;
00148 int i, j ;
00149
00150
00151 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00152 crires_util_extract_config.qc_specpos[i] = -1 ;
00153 crires_util_extract_config.qc_specwrec[i] = -1 ;
00154 crires_util_extract_config.qc_specwopt[i] = -1 ;
00155 crires_util_extract_config.qc_specoptmed[i] = -1.0 ;
00156 crires_util_extract_config.qc_s2nmed[i] = -1.0 ;
00157 crires_util_extract_config.qc_fwhm_comb_pix[i] = -1.0 ;
00158 crires_util_extract_config.qc_fwhm_comb_as[i] = -1.0 ;
00159 crires_util_extract_config.qc_fwhm_prof_pix[i] = -1.0 ;
00160 crires_util_extract_config.qc_fwhm_prof_as[i] = -1.0 ;
00161 crires_util_extract_config.qc_fwhm_diff[i] = -1.0 ;
00162 prof[i] = NULL ;
00163 bgmap[i] = NULL ;
00164 }
00165 ly = -1 ;
00166
00167
00168 crires_util_extract_config.display = crires_parameterlist_get_int(parlist,
00169 RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
00170 crires_util_extract_config.mode = crires_parameterlist_get_int(parlist,
00171 RECIPE_STRING, CRIRES_PARAM_EXTR_MODE) ;
00172 crires_util_extract_config.box_hor_size = crires_parameterlist_get_int(
00173 parlist, RECIPE_STRING, CRIRES_PARAM_HOR_SIZE) ;
00174 crires_util_extract_config.spec_hsize = crires_parameterlist_get_int(
00175 parlist, RECIPE_STRING, CRIRES_PARAM_SPEC_HSIZE) ;
00176 crires_util_extract_config.kappa = crires_parameterlist_get_double(
00177 parlist, RECIPE_STRING, CRIRES_PARAM_KAPPA) ;
00178 crires_util_extract_config.closing_hs = crires_parameterlist_get_int(
00179 parlist, RECIPE_STRING, CRIRES_PARAM_CLOSING_HSIZE) ;
00180 crires_util_extract_config.clean_rate = crires_parameterlist_get_double(
00181 parlist, RECIPE_STRING, CRIRES_PARAM_CLEAN_RATE) ;
00182 crires_util_extract_config.tot_ndit = crires_parameterlist_get_double(
00183 parlist, RECIPE_STRING, CRIRES_PARAM_TOT_NDIT) ;
00184 crires_util_extract_config.starty = crires_parameterlist_get_int(
00185 parlist, RECIPE_STRING, CRIRES_PARAM_WL_STARTY) ;
00186 crires_util_extract_config.stopy = crires_parameterlist_get_int(
00187 parlist, RECIPE_STRING, CRIRES_PARAM_WL_STOPY) ;
00188 sval = crires_parameterlist_get_string(parlist, RECIPE_STRING,
00189 CRIRES_PARAM_SPEC_ZONE) ;
00190 if (sscanf(sval, "%d,%d",
00191 &crires_util_extract_config.extr_spec_starty,
00192 &crires_util_extract_config.extr_spec_stopy)!=2) {
00193 return -1 ;
00194 }
00195 sval = crires_parameterlist_get_string(parlist, RECIPE_STRING,
00196 CRIRES_PARAM_REJECT) ;
00197 if (sscanf(sval, "%d,%d",
00198 &crires_util_extract_config.rej_left,
00199 &crires_util_extract_config.rej_right)!=2) {
00200 return -1 ;
00201 }
00202
00203
00204 if (crires_dfs_set_groups(frameset, NULL)) {
00205 cpl_msg_error(__func__, "Cannot identify RAW and CALIB frames") ;
00206 return -1 ;
00207 }
00208
00209
00210 fr = cpl_frameset_get_frame(frameset, 0);
00211 crires_util_extract_config.period =
00212 crires_get_detector_illum_period(cpl_frame_get_filename(fr)) ;
00213 if (crires_util_extract_config.period == CRIRES_ILLUM_UNKNOWN) {
00214 cpl_msg_error(__func__,
00215 "Cannot determine the detector illumination period") ;
00216 return -1 ;
00217 } else {
00218 crires_display_detector_illum(crires_util_extract_config.period) ;
00219 }
00220
00221
00222 cpl_msg_info(__func__, "Input image loading") ;
00223 imlist = crires_load_file(cpl_frame_get_filename(fr),
00224 crires_util_extract_config.period, CPL_TYPE_FLOAT) ;
00225
00226
00227 if (cpl_frameset_get_size(frameset) >= 2) {
00228 fr = cpl_frameset_get_frame(frameset, 1);
00229 cpl_msg_info(__func__, "Contribution map specified: %s",
00230 cpl_frame_get_filename(fr)) ;
00231 contrib = crires_load_file(cpl_frame_get_filename(fr),
00232 crires_util_extract_config.period, CPL_TYPE_INT) ;
00233 } else contrib = NULL ;
00234
00235 if (crires_util_extract_config.mode == 1) {
00236
00237 fr = cpl_frameset_get_frame(frameset, 0);
00238 if (crires_util_extract_config.tot_ndit < 0) {
00239 crires_util_extract_config.tot_ndit =
00240 crires_get_totndit(cpl_frame_get_filename(fr)) ;
00241 if (crires_util_extract_config.tot_ndit < 0) {
00242 cpl_msg_error(__func__, "Cannot get the total number of NDIT*DIT") ;
00243 cpl_imagelist_delete(imlist) ;
00244 if (contrib != NULL) cpl_imagelist_delete(contrib) ;
00245 return -1 ;
00246 }
00247 }
00248
00249 plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0) ;
00250 nexp = crires_pfits_get_datancom(plist) ;
00251 cpl_propertylist_delete(plist) ;
00252 if (cpl_error_get_code() != CPL_ERROR_NONE) {
00253 cpl_msg_error(__func__, "No PRO DATANCOM information in the header");
00254 cpl_imagelist_delete(imlist) ;
00255 if (contrib != NULL) cpl_imagelist_delete(contrib) ;
00256 return -1 ;
00257 }
00258 crires_util_extract_config.tot_ndit *= nexp ;
00259 }
00260
00261
00262 cpl_msg_info(__func__, "Spectrum extraction") ;
00263 cpl_msg_indent_more() ;
00264 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00265 cpl_msg_info(__func__, "Spectrum extraction from chip number %d", i+1) ;
00266 cpl_msg_indent_more() ;
00267 if (crires_util_extract_config.mode == 1) {
00268
00269 if (contrib != NULL)
00270 contribution_map = cpl_imagelist_get(contrib, i) ;
00271 else
00272 contribution_map = NULL ;
00273 ext[i] = crires_extract_spectrum(cpl_imagelist_get(imlist, i),
00274 contribution_map,
00275 crires_util_extract_config.box_hor_size,
00276 crires_util_extract_config.spec_hsize,
00277 crires_util_extract_config.kappa,
00278 crires_util_extract_config.closing_hs,
00279 crires_util_extract_config.clean_rate,
00280 crires_util_extract_config.rej_left,
00281 crires_util_extract_config.rej_right,
00282 crires_util_extract_config.extr_spec_starty,
00283 crires_util_extract_config.extr_spec_stopy,
00284 i+1,
00285 crires_util_extract_config.tot_ndit,
00286 crires_util_extract_config.period,
00287 &(crires_util_extract_config.qc_specpos[i]),
00288 &(crires_util_extract_config.qc_specwrec[i]),
00289 &(crires_util_extract_config.qc_specwopt[i]),
00290 &(crires_util_extract_config.qc_specoptmed[i]),
00291 &(crires_util_extract_config.qc_s2nmed[i]),
00292 &(prof[i]),
00293 &(bgmap[i])) ;
00294 cpl_msg_info(__func__, "Chip number %d FWHM Computation", i+1) ;
00295 if (crires_extract_qc_fwhm(cpl_imagelist_get(imlist, i),
00296 prof[i],
00297 &(crires_util_extract_config.qc_fwhm_comb_pix[i]),
00298 &(crires_util_extract_config.qc_fwhm_comb_as[i]),
00299 &(crires_util_extract_config.qc_fwhm_prof_pix[i]),
00300 &(crires_util_extract_config.qc_fwhm_prof_as[i]),
00301 &(crires_util_extract_config.qc_fwhm_diff[i])) == -1) {
00302 cpl_msg_warning(__func__, "Failed for FWHM computation") ;
00303 crires_util_extract_config.qc_fwhm_comb_pix[i] = -1.0 ;
00304 crires_util_extract_config.qc_fwhm_comb_as[i] = -1.0 ;
00305 crires_util_extract_config.qc_fwhm_prof_pix[i] = -1.0 ;
00306 crires_util_extract_config.qc_fwhm_prof_as[i] = -1.0 ;
00307 crires_util_extract_config.qc_fwhm_diff[i] = -1.0 ;
00308 }
00309 } else if (crires_util_extract_config.mode == 2) {
00310
00311 ext_vec=crires_extract_lines_spectrum(cpl_imagelist_get(imlist, i),
00312 crires_util_extract_config.period,
00313 i+1,
00314 crires_util_extract_config.box_hor_size,
00315 crires_util_extract_config.spec_hsize,
00316 crires_util_extract_config.rej_left,
00317 crires_util_extract_config.rej_right,
00318 crires_util_extract_config.extr_spec_starty,
00319 crires_util_extract_config.extr_spec_stopy) ;
00320 if (ext_vec != NULL) {
00321 ext[i] = crires_extract_gen_tab(ext_vec, NULL, NULL, NULL,
00322 NULL, NULL, NULL) ;
00323 cpl_vector_delete(ext_vec) ;
00324 } else ext[i] = NULL ;
00325 } else if (crires_util_extract_config.mode == 3) {
00326
00327
00328 if (i+1 == 1)
00329 ly = crires_get_detector_ly1(crires_util_extract_config.period);
00330 if (i+1 == 2)
00331 ly = crires_get_detector_ly2(crires_util_extract_config.period);
00332 if (i+1 == 3)
00333 ly = crires_get_detector_ly3(crires_util_extract_config.period);
00334 if (i+1 == 4)
00335 ly = crires_get_detector_ly4(crires_util_extract_config.period);
00336
00337
00338 ext_vec = crires_extract_lines(cpl_imagelist_get(imlist, i),
00339 crires_util_extract_config.starty-ly,
00340 crires_util_extract_config.stopy-ly,
00341 crires_util_extract_config.rej_left,
00342 crires_util_extract_config.rej_right) ;
00343 if (ext_vec != NULL) {
00344 ext[i] = crires_extract_gen_tab(ext_vec, NULL, NULL, NULL,
00345 NULL, NULL, NULL) ;
00346 cpl_vector_delete(ext_vec) ;
00347 } else ext[i] = NULL ;
00348 } else {
00349 cpl_msg_error(__func__, "Unsuported mode") ;
00350 ext[i] = NULL ;
00351 }
00352 if (ext[i] != NULL) {
00353
00354 if (crires_util_extract_config.display == i+1) {
00355 ext_vec = cpl_vector_wrap(cpl_table_get_nrow(ext[i]),
00356 cpl_table_get_data_double(ext[i], CRIRES_COL_EXTRACT_INT_RECT));
00357 irplib_vector_plot(
00358 "set grid;set xlabel 'Position (pixels)';set ylabel 'Intensity RECT (ADU/sec)';",
00359 "t 'Extracted Spectrum RECT' w lines", "", ext_vec) ;
00360 cpl_vector_unwrap(ext_vec) ;
00361
00362 ext_vec = cpl_vector_wrap(cpl_table_get_nrow(ext[i]),
00363 cpl_table_get_data_double(ext[i], CRIRES_COL_EXTRACT_INT_OPT)) ;
00364 irplib_vector_plot(
00365 "set grid;set xlabel 'Position (pixels)';set ylabel 'Intensity OPT (ADU/sec)';",
00366 "t 'Extracted Spectrum OPT' w lines", "", ext_vec) ;
00367 cpl_vector_unwrap(ext_vec) ;
00368 }
00369 } else {
00370 cpl_msg_warning(__func__,
00371 "Cannot extract spectrum from chip number %d", i+1) ;
00372 }
00373 cpl_msg_indent_less() ;
00374 }
00375 cpl_imagelist_delete(imlist) ;
00376 if (contrib != NULL) cpl_imagelist_delete(contrib) ;
00377 cpl_msg_indent_less() ;
00378
00379
00380 for (i=1 ; i<CRIRES_NB_DETECTORS ; i++) {
00381 if (crires_util_extract_config.qc_specpos[i-1] > 0 &&
00382 crires_util_extract_config.qc_specpos[i] > 0 &&
00383 fabs(crires_util_extract_config.qc_specpos[i-1] -
00384 crires_util_extract_config.qc_specpos[i]) >
00385 CRIRES_SPEC_POS_TOLERANCE) {
00386 cpl_msg_warning(__func__,
00387 "The spectrum positions in chip %d and chip %d are too different: %d -> %d",
00388 i, i+1, crires_util_extract_config.qc_specpos[i-1],
00389 crires_util_extract_config.qc_specpos[i]) ;
00390 }
00391 }
00392
00393
00394 profile = cpl_imagelist_new() ;
00395 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00396 if (prof[i] != NULL) cpl_imagelist_set(profile, prof[i], i) ;
00397 else {
00398 cpl_imagelist_delete(profile) ;
00399 profile = NULL ;
00400 for (j=i+1 ; j<CRIRES_NB_DETECTORS ; j++)
00401 if (prof[j] != NULL) cpl_image_delete(prof[j]) ;
00402 break ;
00403 }
00404 }
00405
00406
00407 bgmaps = cpl_imagelist_new() ;
00408 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00409 if (bgmap[i] != NULL) cpl_imagelist_set(bgmaps, bgmap[i], i) ;
00410 else {
00411 cpl_imagelist_delete(bgmaps) ;
00412 bgmaps = NULL ;
00413 for (j=i+1 ; j<CRIRES_NB_DETECTORS ; j++)
00414 if (bgmap[j] != NULL) cpl_image_delete(bgmap[j]) ;
00415 break ;
00416 }
00417 }
00418
00419
00420 cpl_msg_info(__func__, "Save the products") ;
00421 cpl_msg_indent_more() ;
00422 if (crires_util_extract_save((const cpl_table **)ext, profile, bgmaps,
00423 parlist, frameset) == -1) {
00424 cpl_msg_error(__func__, "Cannot save products") ;
00425 cpl_msg_indent_less() ;
00426 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00427 if (ext[i] != NULL) cpl_table_delete(ext[i]) ;
00428 }
00429 if (profile != NULL) cpl_imagelist_delete(profile) ;
00430 if (bgmaps != NULL) cpl_imagelist_delete(bgmaps) ;
00431 return -1 ;
00432 }
00433 cpl_msg_indent_less() ;
00434
00435
00436 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00437 if (ext[i] != NULL) cpl_table_delete(ext[i]) ;
00438 }
00439 if (profile != NULL) cpl_imagelist_delete(profile) ;
00440 if (bgmaps != NULL) cpl_imagelist_delete(bgmaps) ;
00441
00442
00443 if (cpl_error_get_code()) return -1 ;
00444 else return 0 ;
00445 }
00446
00447
00457
00458 static int crires_util_extract_save(
00459 const cpl_table ** ext,
00460 const cpl_imagelist * profile,
00461 const cpl_imagelist * bgmaps,
00462 const cpl_parameterlist * parlist,
00463 cpl_frameset * set)
00464 {
00465 cpl_propertylist ** qclists ;
00466 const cpl_frame * ref_frame ;
00467 cpl_propertylist * inputlist ;
00468 const char * recipe_name = "crires_util_extract" ;
00469 int i ;
00470
00471
00472 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
00473
00474
00475 qclists = cpl_malloc(CRIRES_NB_DETECTORS * sizeof(cpl_propertylist*)) ;
00476 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00477 qclists[i] = cpl_propertylist_new() ;
00478 cpl_propertylist_append_int(qclists[i], "ESO QC SPECPOS",
00479 crires_util_extract_config.qc_specpos[i]) ;
00480 cpl_propertylist_append_int(qclists[i], "ESO QC SPECWREC",
00481 crires_util_extract_config.qc_specwrec[i]) ;
00482 cpl_propertylist_append_int(qclists[i], "ESO QC SPECWOPT",
00483 crires_util_extract_config.qc_specwopt[i]) ;
00484 cpl_propertylist_append_double(qclists[i], "ESO QC SIGNAL MED",
00485 crires_util_extract_config.qc_specoptmed[i]) ;
00486 cpl_propertylist_append_double(qclists[i], "ESO QC S2NMED",
00487 crires_util_extract_config.qc_s2nmed[i]) ;
00488 cpl_propertylist_append_double(qclists[i], "ESO QC FWHMPIX COMBINED",
00489 crires_util_extract_config.qc_fwhm_comb_pix[i]) ;
00490 cpl_propertylist_append_double(qclists[i], "ESO QC FWHMARC COMBINED",
00491 crires_util_extract_config.qc_fwhm_comb_as[i]) ;
00492 cpl_propertylist_append_double(qclists[i], "ESO QC FWHMPIX PROFILE",
00493 crires_util_extract_config.qc_fwhm_prof_pix[i]) ;
00494 cpl_propertylist_append_double(qclists[i], "ESO QC FWHMARC PROFILE",
00495 crires_util_extract_config.qc_fwhm_prof_as[i]) ;
00496 cpl_propertylist_append_double(qclists[i], "ESO QC FWHM DIFF",
00497 crires_util_extract_config.qc_fwhm_diff[i]) ;
00498
00499
00500 inputlist = cpl_propertylist_load_regexp(
00501 cpl_frame_get_filename(ref_frame), i+1,
00502 CRIRES_HEADER_EXT_FORWARD, 0) ;
00503 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
00504 CRIRES_HEADER_EXT_FORWARD, 0) ;
00505 cpl_propertylist_delete(inputlist) ;
00506 }
00507
00508 if (profile != NULL) {
00509
00510 crires_image_save(set,
00511 parlist,
00512 set,
00513 profile,
00514 recipe_name,
00515 CRIRES_OBS_EXTRACT_PROFILE_IMA,
00516 CRIRES_PROTYPE_PROFILE,
00517 crires_util_extract_config.period,
00518 NULL,
00519 (const cpl_propertylist**)qclists,
00520 PACKAGE "/" PACKAGE_VERSION,
00521 "crires_util_extract_profile.fits") ;
00522 }
00523
00524 if (bgmaps!= NULL) {
00525
00526 crires_image_save(set,
00527 parlist,
00528 set,
00529 bgmaps,
00530 recipe_name,
00531 CRIRES_OBS_EXTRACT_BGMAP_IMA,
00532 CRIRES_PROTYPE_BGD_MAP,
00533 crires_util_extract_config.period,
00534 NULL,
00535 (const cpl_propertylist**)qclists,
00536 PACKAGE "/" PACKAGE_VERSION,
00537 "crires_util_extract_bgmap.fits") ;
00538 }
00539
00540
00541 crires_table_save(set,
00542 parlist,
00543 set,
00544 ext,
00545 recipe_name,
00546 CRIRES_EXTRACT_PIX_TAB,
00547 CRIRES_PROTYPE_SPEC_PIX,
00548 NULL,
00549 (const cpl_propertylist**)qclists,
00550 PACKAGE "/" PACKAGE_VERSION,
00551 "crires_util_extract_extracted.fits") ;
00552
00553
00554 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00555 cpl_propertylist_delete(qclists[i]) ;
00556 }
00557 cpl_free(qclists) ;
00558 return 0;
00559 }
00560