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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 #ifdef HAVE_CONFIG_H
00242 # include <config.h>
00243 #endif
00244
00245
00249
00250
00251
00252
00253
00254
00255
00256 #include <uves_physmod_body.h>
00257
00258
00259 #include <uves_physmod_plotmod.h>
00260 #include <uves_physmod_create_table.h>
00261
00262 #include <uves_physmod_qc1pmtbl.h>
00263 #include <uves_physmod_calmap.h>
00264 #include <uves_physmod_msrawxy.h>
00265 #include <uves_physmod_chop_otab.h>
00266 #include <uves_physmod_stability_check.h>
00267
00268
00269 #include <uves_utils.h>
00270 #include <uves_utils_polynomial.h>
00271 #include <uves_utils_wrappers.h>
00272 #include <uves_pfits.h>
00273 #include <uves_dfs.h>
00274 #include <uves_parameters.h>
00275 #include <uves_qclog.h>
00276 #include <uves_recipe.h>
00277 #include <uves_error.h>
00278 #include <uves_msg.h>
00279
00280
00281 #include <irplib_access.h>
00282 #include <cpl.h>
00283 #include <math.h>
00284 #include <stdbool.h>
00285
00286
00287
00288
00289
00290
00291
00292
00293 static int uves_physmod_qclog(cpl_table* line_table,
00294 cpl_table* order_table,
00295 cpl_table* qclog,
00296 const uves_propertylist *raw_header,
00297 enum uves_chip chip,
00298 bool flames,
00299 const int iter,
00300 const int plate_no);
00301
00302 static int uves_physmod_qclog_sc(const double med_dx,
00303 const double med_dy,
00304 const double avg_dx,
00305 const double avg_dy,
00306 const uves_propertylist *raw_header,
00307 const uves_propertylist *ref_header,
00308 enum uves_chip chip,
00309 cpl_table* qclog);
00310
00311
00312
00313
00314
00315 const char * const uves_physmod_desc_short = "Implements the UVES physical model";
00316 const char * const uves_physmod_desc =
00317 "This recipe implements the UVES physical model\n"
00318 "Input files are BLUE or RED arm formatcheck frames identified by the tag\n"
00319 "ARC_LAMP_FORM_xxxx, xxxx=BLUE or RED and a ThAr line reference table\n"
00320 "identified by the tag LINE_REFER_TABLE\n"
00321 "The recipe extracts from the input files FITS header data indicating the\n"
00322 "instrument setting and ambiental atmospheric conditions, then using the\n"
00323 "model predicts X,Y position of the lines listed in the LINE_REFER_TABLE\n"
00324 "table which are imaging on the detector and stores this information in an\n"
00325 "guess order and a guess line table.\n"
00326 "Output are a guess order table and a guess line table per chip.\n"
00327 "If the user provides in input also master format checks having tag\n"
00328 "MASTER_FORM_xxxx, xxxx=BLUE or REDL and REDU the recipe performs also a\n"
00329 "stability check\n";
00330
00332
00333
00334
00335
00336
00342
00343 int
00344 uves_physmod_define_parameters_body(cpl_parameterlist *parameters,
00345 const char *recipe_id)
00346 {
00347 const char *subcontext = NULL;
00348
00349
00350
00351
00352
00353 if (uves_define_global_parameters(parameters) != CPL_ERROR_NONE)
00354 {
00355 return -1;
00356 }
00357
00358 uves_par_new_range("mbox_x",
00359 CPL_TYPE_INT,
00360 "Match box X size",
00361 40,1,100);
00362
00363 uves_par_new_range("mbox_y",
00364 CPL_TYPE_INT,
00365 "Match box Y size",
00366 40,1,100);
00367
00368 uves_par_new_value("trans_x",
00369 CPL_TYPE_DOUBLE,
00370 "Detector translation along X",
00371 0.);
00372
00373 uves_par_new_value("trans_y",
00374 CPL_TYPE_DOUBLE,
00375 "Detector translation along Y",
00376 0.);
00377
00378 uves_par_new_value("ech_angle_off",
00379 CPL_TYPE_DOUBLE,
00380 "Offset on echelle angle",
00381 0.);
00382
00383 uves_par_new_value("cd_angle_off",
00384 CPL_TYPE_DOUBLE,
00385 "Offset on cross disperser angle",
00386 0.);
00387
00388 uves_par_new_value("ccd_rot_angle_off",
00389 CPL_TYPE_DOUBLE,
00390 "Offset on CCD rotation angle",
00391 0.);
00392
00393 uves_par_new_value("compute_regression_sw",
00394 CPL_TYPE_BOOL,
00395 "Compute regression?",
00396 true);
00397
00398 uves_par_new_value("x_axis_scale",
00399 CPL_TYPE_DOUBLE,
00400 "Scale X axis",
00401 0.);
00402
00403 uves_par_new_value("y_axis_scale",
00404 CPL_TYPE_DOUBLE,
00405 "Scale Y axis",
00406 0.);
00407
00408 uves_par_new_value("def_pol1",
00409 CPL_TYPE_INT,
00410 "Polynomial X deg",
00411 4);
00412
00413 uves_par_new_value("def_pol2",
00414 CPL_TYPE_INT,
00415 "Polynomial Y deg",
00416 5);
00417
00418 uves_par_new_value("kappa",
00419 CPL_TYPE_DOUBLE,
00420 "Kappa value in kappa sigma clipping "
00421 "on RESIDUAL between YFIT and Y columns",
00422 4.5);
00423
00424 uves_par_new_value("tol",
00425 CPL_TYPE_DOUBLE,
00426 "Tolerance in kappa sigma clipping "
00427 "on RESIDUAL between YFIT and Y columns",
00428 2.0);
00429
00430 return (int) cpl_error_get_code();
00431 }
00432
00460
00461
00462 static cpl_table *
00463 uves_physmod_process_chip(const cpl_image *raw_image,
00464 const uves_propertylist *raw_header,
00465 const char *raw_filename,
00466 enum uves_chip chip,
00467 const char *recipe_id,
00468 const int DEBUG,
00469 const cpl_parameterlist* parameters,
00470 cpl_table* line_refer,
00471 const double physmod_shift_x,
00472 const double physmod_shift_y,
00473 cpl_table** tmp_mod_tbl,
00474 cpl_table** lin_tbl,
00475 cpl_table** ord_tbl,
00476 cpl_table** mline_tbl,
00477 int* abs_ord_min,
00478 int* abs_ord_max,
00479 polynomial** absolute_order_poly2d,
00480 const int stability_sw)
00481 {
00482
00483 cpl_table *tmp_fsr_tbl = NULL;
00484 cpl_table *tmp_m_tbl = NULL;
00485 cpl_table *tmp_p_tbl = NULL;
00486 cpl_table *tmp_w_tbl = NULL;
00487 cpl_table *tmp_s_tbl = NULL;
00488 cpl_table *tmp_rline_tbl = NULL;
00489 cpl_table *tmp_npline_tbl = NULL;
00490
00491
00492 cpl_table * result=NULL;
00493
00494
00495 if(stability_sw != 1) {
00496 check( uves_physmod_create_table(raw_header, chip,
00497 recipe_id,
00498 parameters,
00499 line_refer,
00500 physmod_shift_x,
00501 physmod_shift_y,
00502 tmp_mod_tbl,&tmp_fsr_tbl),
00503 "Could not run UVES physical model on the raw image %s",
00504 raw_filename);
00505 }
00506
00507 uves_free_table(&tmp_rline_tbl);
00508 check( uves_physmod_msrawxy(raw_image,
00509 raw_header,
00510 recipe_id,
00511 parameters,
00512 *tmp_mod_tbl,
00513 lin_tbl,
00514 &tmp_m_tbl,
00515 &tmp_p_tbl,
00516 &tmp_rline_tbl,
00517 mline_tbl,
00518 &tmp_npline_tbl),
00519 "Could not run uves_msrawxy on raw image %s",
00520 raw_filename);
00521
00522
00523 check(uves_physmod_plotmod(tmp_rline_tbl,raw_header,recipe_id,
00524 parameters,chip),
00525 "Could not run uves_physmod_plotmod");
00526
00527 if(stability_sw != 1) {
00528 uves_free_table(&tmp_w_tbl);
00529 uves_free_table(&tmp_s_tbl);
00530 check(uves_physmod_calmap(raw_header,
00531 chip,
00532 recipe_id,
00533 parameters,
00534 tmp_npline_tbl,
00535 ord_tbl,
00536 lin_tbl,
00537 &tmp_w_tbl,
00538 &tmp_s_tbl,
00539 abs_ord_min,
00540 abs_ord_max,
00541 absolute_order_poly2d),
00542 "Could not run uves_calmap on raw image %s", raw_filename);
00543
00544 check(uves_physmod_qc1pmtbl(&tmp_rline_tbl,lin_tbl),
00545 "Could not run uves_qc1pmtbl on raw image %s", raw_filename);
00546
00547
00548 check(uves_physmod_chop_otab(raw_header,chip,ord_tbl,"ORDER",
00549 abs_ord_min,abs_ord_max),
00550 "Could not run uves_physmod_chop_otab on raw image %s",
00551 raw_filename);
00552 }
00553
00554 if (DEBUG) {
00555 const char *product_filename = NULL;
00556
00557
00558
00559 product_filename = "arclampform";
00560 check( uves_save_image_local("Physical model table",
00561 product_filename, raw_image, chip, -1, -1, raw_header),
00562 "Error saving arc lamp form image");
00563
00564 product_filename = "pline";
00565 check( uves_save_table_local("Physical model table",
00566 product_filename, *tmp_mod_tbl, chip, -1, -1, NULL, NULL),
00567 "Error saving physical model table");
00568
00569
00570 if(stability_sw != 1) {
00571 product_filename = "free_spectral_range";
00572 check( uves_save_table_local("FSR table",
00573 product_filename, tmp_fsr_tbl,
00574 chip, -1, -1, NULL, NULL),
00575 "Error saving free spectral range table");
00576
00577 }
00578
00579 product_filename = "midduml";
00580 check( uves_save_table_local("midduml table",
00581 product_filename, *lin_tbl, chip, -1, -1, NULL, NULL),
00582 "Error saving midduml table");
00583
00584
00585
00586 product_filename = "middumm";
00587 check( uves_save_table_local("middumm table",
00588 product_filename, tmp_m_tbl, chip, -1, -1, NULL, NULL),
00589 "Error saving middumm table");
00590
00591
00592
00593 product_filename = "middumrline";
00594 check( uves_save_table_local("middumrline table",
00595 product_filename, tmp_rline_tbl, chip, -1, -1, NULL, NULL),
00596 "Error saving middumrline table");
00597
00598
00599 product_filename = "middummline";
00600 check( uves_save_table_local("middummline table",
00601 product_filename, *mline_tbl, chip, -1, -1, NULL, NULL),
00602 "Error saving middummline table");
00603
00604
00605 product_filename = "middump";
00606 check( uves_save_table_local("middump table",
00607 product_filename, tmp_p_tbl, chip, -1, -1, NULL, NULL),
00608 "Error saving middump table");
00609
00610
00611 product_filename = "middumnpline";
00612 check( uves_save_table_local("middumnpline table",
00613 product_filename, tmp_npline_tbl, chip, -1, -1, NULL, NULL),
00614 "Error saving middumnpline table");
00615
00616
00617
00618 if(stability_sw != 1) {
00619 product_filename = "middumw";
00620 check( uves_save_table_local("middumw table",
00621 product_filename, tmp_w_tbl,
00622 chip, -1, -1, NULL, NULL),
00623 "Error saving middumw table");
00624
00625 product_filename = "middums";
00626 check( uves_save_table_local("middums table",
00627 product_filename, tmp_s_tbl,
00628 chip, -1, -1, NULL, NULL),
00629 "Error saving middums table");
00630
00631
00632 product_filename = "order";
00633 check( uves_save_table_local("order table",
00634 product_filename, *ord_tbl,
00635 chip, -1, -1, NULL, NULL),
00636 "Error saving order table");
00637 uves_msg("Order table saved to file %s",
00638 product_filename);
00639
00640 }
00641 product_filename = "line";
00642 check( uves_save_table_local("line table",
00643 product_filename, *lin_tbl, chip, -1, -1, NULL, NULL),
00644 "Error saving uves_line table");
00645 uves_msg("Line table saved to file %s",
00646 product_filename);
00647
00648
00649
00650 }
00651
00652 cleanup:
00653 uves_free_table(&tmp_fsr_tbl);
00654 uves_free_table(&tmp_m_tbl);
00655 uves_free_table(&tmp_p_tbl);
00656 uves_free_table(&tmp_w_tbl);
00657 uves_free_table(&tmp_s_tbl);
00658 uves_free_table(&tmp_rline_tbl);
00659 uves_free_table(&tmp_npline_tbl);
00660
00661 uves_msg_debug("end %s",__func__);
00662 return result;
00663 }
00664
00665
00674
00675 void
00676 uves_physmod_exe_body(cpl_frameset *frames,
00677 bool flames,
00678 const char *recipe_id,
00679 const cpl_parameterlist *parameters,
00680 const char *starttime)
00681 {
00682
00683 cpl_image *raw_image[2] = {NULL, NULL};
00684 uves_propertylist *raw_header[2] = {NULL, NULL};
00685 uves_propertylist *rotated_header[2] = {NULL, NULL};
00686 uves_propertylist *master_formatcheck_header[2] = {NULL, NULL};
00687
00688
00689 cpl_table *line_table = NULL;
00690 cpl_table *order_table = NULL;
00691 cpl_table *mline_table = NULL;
00692 cpl_table *m_mline_table = NULL;
00693 cpl_table *model_table = NULL;
00694
00695 cpl_table *r_mline_table = NULL;
00696 cpl_table *mst_line_table = NULL;
00697 cpl_table *mst_mline_table = NULL;
00698 cpl_table *mst_order_table = NULL;
00699
00700
00701 uves_propertylist *product_header = NULL;
00702 uves_propertylist *table_header = NULL;
00703 cpl_table *line_refer = NULL;
00704 polynomial *absolute_order_poly2d=NULL;
00705 polynomial *mst_absolute_order_poly2d=NULL;
00706
00707
00708
00709 int DEBUG=0;
00710 int abs_ord_min=0;
00711 int abs_ord_max=0;
00712 int mst_abs_ord_min=0;
00713 int mst_abs_ord_max=0;
00714 double avg_dx=0;
00715 double avg_dy=0;
00716
00717
00718 cpl_table* qclog[3] = {NULL, NULL, NULL};
00719
00720 const char *raw_filename = "";
00721 char *product_filename = NULL;
00722
00723 bool blue = false;
00724 enum uves_chip chip;
00725 const char *line_refer_filename = "";
00726 const char *master_formatcheck_filename = "";
00727 cpl_image *master_formatcheck = NULL;
00728 int nordpred=0;
00729 int plate_no=0;
00730 int iter=1;
00731 int iter_max=1;
00732 double physmod_shift_x=0;
00733 double physmod_shift_y=0;
00734 const double max_shift_x=0.4;
00735 const double max_shift_y=0.2;
00736 double med_dx=2*max_shift_x;
00737 double med_dy=2*max_shift_y;
00738
00739 if(flames) {
00740 iter_max=5;
00741 }
00742 check( uves_get_parameter(parameters, NULL, "uves", "debug",
00743 CPL_TYPE_BOOL, &DEBUG),
00744 "Could not read parameter");
00745
00746
00747 check( uves_load_formatcheck(frames, flames, &raw_filename, raw_image,
00748 raw_header, rotated_header, &blue),
00749 "Error loading raw frame");
00750
00751
00752 check( uves_load_linerefertable(frames, &line_refer_filename,
00753 &line_refer, NULL), "Could not load line reference table");
00754 uves_msg("Using line reference table in '%s'", line_refer_filename);
00755
00756
00757
00758 for (chip = uves_chip_get_first(blue);
00759 chip != UVES_CHIP_INVALID;
00760 chip = uves_chip_get_next(chip))
00761 {
00762 const char *chip_name = "";
00763 int raw_index = uves_chip_get_index(chip);
00764
00765 uves_msg("Processing %s chip in '%s'",
00766 uves_chip_tostring_upper(chip), raw_filename);
00767
00768 check_nomsg( chip_name = uves_pfits_get_chipid(raw_header[raw_index], chip));
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778 uves_qclog_delete(&qclog[0]);
00779 qclog[0] = uves_qclog_init(raw_header[raw_index], chip);
00780
00781
00782
00783 if (irplib_frameset_find(frames, UVES_MASTER_ARC_FORM(chip)) != NULL)
00784 {
00785 uves_qclog_delete(&qclog[1]);
00786 qclog[1] = uves_qclog_init(raw_header[raw_index], chip);
00787 }
00788 uves_msg("iter_max=%d",iter_max);
00789 for(iter=1; (iter <= iter_max) &&
00790 (fabs(med_dx) > max_shift_x ||
00791 fabs(med_dy) > max_shift_y ); iter++ ) {
00792
00793
00794 uves_msg("iter=%d",iter);
00795 uves_free_table(&model_table);
00796 uves_free_table(&line_table);
00797 uves_free_table(&order_table);
00798 uves_free_table(&mline_table);
00799 uves_polynomial_delete(&absolute_order_poly2d);
00800 check( uves_physmod_process_chip(raw_image[raw_index],
00801 raw_header[raw_index],
00802 raw_filename,
00803 chip,
00804 recipe_id,
00805 DEBUG,
00806 parameters,
00807 line_refer,
00808 physmod_shift_x,
00809 physmod_shift_y,
00810 &model_table,
00811 &line_table,
00812 &order_table,
00813 &mline_table,
00814 &abs_ord_min,
00815 &abs_ord_max,
00816 &absolute_order_poly2d,0),
00817 "Error processing chip");
00818
00819 nordpred=abs_ord_max-abs_ord_min+1;
00820 uves_msg("No of predicted orders %d",nordpred);
00821
00822 if(flames) {
00823 check( plate_no = uves_flames_pfits_get_plateid(raw_header[raw_index]),
00824 "Error reading plate id");
00825 }
00826
00827
00828 ck0(uves_physmod_qclog(line_table,order_table,qclog[0],
00829 raw_header[raw_index], chip,
00830 flames,iter,plate_no),"qc-log dump");
00831
00832
00833
00834
00835 uves_free_image(&master_formatcheck);
00836
00837 if (irplib_frameset_find(frames, UVES_MASTER_ARC_FORM(chip)) != NULL)
00838 {
00839
00840 uves_msg("Stability check");
00841 uves_free_propertylist(&master_formatcheck_header[raw_index]);
00842 check( uves_load_master_formatcheck(frames,
00843 chip_name,
00844 &master_formatcheck_filename,
00845 &master_formatcheck,
00846 &master_formatcheck_header[raw_index],
00847 chip),
00848 "Could not load master formatcheck frm");
00849
00850 uves_msg("Using master format check frm '%s'", master_formatcheck_filename);
00851
00852
00853
00854
00855 uves_free_table(&mst_line_table);
00856 uves_free_table(&mst_order_table);
00857 uves_free_table(&mst_mline_table);
00858 uves_polynomial_delete(&mst_absolute_order_poly2d);
00859 check(uves_physmod_process_chip(master_formatcheck,
00860 master_formatcheck_header[raw_index],
00861 master_formatcheck_filename,
00862 chip,
00863 recipe_id,
00864 DEBUG,
00865 parameters,
00866 line_refer,
00867 physmod_shift_x,
00868 physmod_shift_y,
00869 &model_table,
00870 &mst_line_table,
00871 &mst_order_table,
00872 &mst_mline_table,
00873 &mst_abs_ord_min,
00874 &mst_abs_ord_max,
00875 &mst_absolute_order_poly2d,
00876 1),
00877 "Error processing chip");
00878
00879 check_nomsg( uves_physmod_stability_check(
00880 mline_table,mst_mline_table,
00881 &med_dx,&med_dy,&avg_dx,&avg_dy) );
00882
00883
00884
00885 uves_physmod_qclog_sc(med_dx,med_dy,avg_dx,avg_dy,
00886 raw_header[raw_index],
00887 master_formatcheck_header[raw_index],
00888 chip,
00889 qclog[1]);
00890 uves_msg("iter=%d med_dx=%g med_dy=%g max_shift_x=%g max_shift_y=%g",iter,fabs(med_dx),fabs(med_dy),max_shift_x,max_shift_y);
00891
00892 physmod_shift_x+=med_dx;
00893 physmod_shift_y+=med_dy;
00894
00895
00896
00897
00898 }
00899 else
00900 {
00901 uves_msg_low("No master format check frm in SOF. Stability check not done");
00902 }
00903
00904 }
00905
00906
00907
00908
00909
00910 cknull_nomsg(line_table);
00911 cknull_nomsg(order_table);
00912 cknull_nomsg(qclog[0]);
00913
00914 uves_msg("Saving products...");
00915 {
00916
00917
00918
00919
00920
00921 uves_free_propertylist(&product_header);
00922 uves_free_propertylist(&table_header);
00923 product_header = uves_propertylist_new();
00924 table_header = uves_propertylist_new();
00925 check( uves_pfits_set_traceid ( table_header, 0),
00926 "Error writing trace ID to product header");
00927 check( uves_pfits_set_windownumber( table_header, 2),
00928 "Error window number to product header");
00929
00930 check( uves_pfits_set_firstabsorder(table_header, abs_ord_min),
00931 "Error window number to product header");
00932
00933 check( uves_pfits_set_lastabsorder(table_header, abs_ord_max),
00934 "Error window number to product header");
00935
00936 check_nomsg(uves_pfits_set_ordpred(product_header,nordpred));
00937
00938 uves_check_rec_status(0);
00939
00940 if (flames) {
00941
00942 check_nomsg(uves_flames_pfits_set_newplateid(product_header, plate_no));
00943 }
00944
00945
00946
00947
00948
00949 cpl_free(product_filename);
00950
00951 check(( product_filename = uves_guess_line_table_filename(chip),
00952 uves_frameset_insert(frames,
00953 line_table,
00954 CPL_FRAME_GROUP_PRODUCT,
00955 CPL_FRAME_TYPE_TABLE,
00956 CPL_FRAME_LEVEL_INTERMEDIATE,
00957 product_filename,
00958 UVES_GUESS_LINE_TABLE(flames, chip),
00959 raw_header[raw_index],
00960 product_header,
00961 table_header,
00962 parameters,
00963 recipe_id,
00964 PACKAGE "/" PACKAGE_VERSION,qclog,
00965 starttime, true,
00966 0)),
00967 "Could not add line guess table %s to frameset",
00968 product_filename);
00969 uves_qclog_delete(&qclog[0]);
00970
00971
00972
00973 check( uves_save_polynomial(absolute_order_poly2d,
00974 product_filename, table_header),
00975 "Could not write polynomial to file '%s'", product_filename);
00976
00977
00978 check( uves_save_polynomial(absolute_order_poly2d,
00979 product_filename, table_header),
00980 "Could not write polynomial to file '%s'", product_filename);
00981
00982
00983
00984 uves_msg("Line table %s added to frameset", product_filename);
00985
00986
00987
00988 cpl_free(product_filename);
00989 check(( product_filename = uves_guess_order_table_filename(chip),
00990 uves_frameset_insert(frames,
00991 order_table,
00992 CPL_FRAME_GROUP_PRODUCT,
00993 CPL_FRAME_TYPE_TABLE,
00994 CPL_FRAME_LEVEL_INTERMEDIATE,
00995 product_filename,
00996 UVES_GUESS_ORDER_TABLE(flames, chip),
00997 raw_header[raw_index],
00998 product_header,
00999 NULL,
01000 parameters,
01001 recipe_id,
01002 PACKAGE "/" PACKAGE_VERSION,NULL,
01003 starttime, false, 0)),
01004 "Could not add order guess table %s to frameset",
01005 product_filename);
01006
01007 uves_msg("Order guess table %s added to frameset",
01008 product_filename);
01009 }
01010
01011 }
01012
01013 cleanup:
01014 uves_qclog_delete(&qclog[0]);
01015 uves_qclog_delete(&qclog[1]);
01016 uves_free_image (&raw_image[0]);
01017 uves_free_image (&raw_image[1]);
01018 uves_free_image (&master_formatcheck);
01019 uves_free_propertylist(&raw_header[0]);
01020 uves_free_propertylist(&raw_header[1]);
01021 uves_free_propertylist(&rotated_header[0]);
01022 uves_free_propertylist(&rotated_header[1]);
01023 uves_free_propertylist(&master_formatcheck_header[0]);
01024 uves_free_propertylist(&master_formatcheck_header[1]);
01025
01026 uves_free_table(&model_table);
01027 uves_free_table(&line_table);
01028 uves_free_table(&mst_line_table);
01029 uves_free_table(&order_table);
01030 uves_free_table(&mst_order_table);
01031 uves_free_table(&line_refer);
01032
01033 uves_free_table(&mline_table);
01034 uves_free_table(&m_mline_table);
01035 uves_free_table(&r_mline_table);
01036 uves_free_table(&mst_mline_table);
01037
01038 uves_free_propertylist(&product_header);
01039 uves_free_propertylist(&table_header);
01040 uves_polynomial_delete(&absolute_order_poly2d);
01041 uves_polynomial_delete(&mst_absolute_order_poly2d);
01042 cpl_free(product_filename);
01043
01044 uves_msg_debug("end %s",__func__);
01045 return;
01046 }
01047
01048
01058 static int
01059 uves_physmod_qclog(cpl_table* line_table,
01060 cpl_table* order_table,
01061 cpl_table* qclog,
01062 const uves_propertylist *raw_header,
01063 enum uves_chip chip,
01064 bool flames,
01065 const int iter,
01066 const int plate_no)
01067 {
01068 int nlinsel=0;
01069 cpl_table *xline_table=NULL;
01070 char key_value[25];
01071
01072
01073 check_nomsg( uves_qclog_add_common_wave(raw_header,
01074 chip, qclog) );
01075
01076
01077 if(flames) {
01078 ck0_nomsg(uves_qclog_add_string(qclog,
01079 "QC TEST1 ID",
01080 "Fibre-Physical-Model-Prediction-Results",
01081 "Name of QC test",
01082 "%s"));
01083 } else {
01084 ck0_nomsg(uves_qclog_add_string(qclog,
01085 "QC TEST1 ID",
01086 "Physical-Model-Prediction-Results",
01087 "Name of QC test",
01088 "%s"));
01089 }
01090 ck0_nomsg(uves_qclog_add_string(qclog,
01091 "QC MODEL ID",
01092 "UVES_phys_mod/1.1.0",
01093 "Physmod Model Id",
01094 "%s"));
01095
01096 ck0_nomsg(uves_qclog_add_string(qclog,
01097 "QC MODEL DATE",
01098 "2000:03:18T00:00:00.000",
01099 "Physmod Model Parameters Last Change",
01100 "%s"));
01101
01102
01103 if(flames) {
01104
01105 sprintf(key_value,"%s%d","QC MODEL ITER",iter);
01106 ck0_nomsg(uves_qclog_add_int(qclog,
01107 key_value,
01108 iter,
01109 "Model iteration",
01110 "%d"));
01111
01112 ck0_nomsg(uves_qclog_add_int(qclog,
01113 "QC MODEL ORDMIN",
01114 cpl_table_get_column_min(line_table,"Order"),
01115 "minimum predicted order value",
01116 "%d"));
01117
01118 ck0_nomsg(uves_qclog_add_int(qclog,
01119 "QC MODEL ORDMAX",
01120 cpl_table_get_column_max(line_table,"Order"),
01121 "maximum predicted order value",
01122 "%d"));
01123
01124
01125 ck0_nomsg(uves_qclog_add_int(qclog,
01126 "QC MODEL WLENMIN",
01127 cpl_table_get_column_min(line_table,"WAVEC")/10.,
01128 "minimum predicted order value",
01129 "%f"));
01130
01131
01132 ck0_nomsg(uves_qclog_add_int(qclog,
01133 "QC MODEL WLENMAX",
01134 cpl_table_get_column_max(line_table,"WAVEC")/10.,
01135 "maximum predicted order value",
01136 "%f"));
01137
01138 }
01139
01140
01141 ck0_nomsg(uves_qclog_add_int(qclog,
01142 "QC MODEL NLINALL",
01143 cpl_table_get_nrow(line_table),
01144 "Number of predicted lines",
01145 "%d"));
01146
01147 check_nomsg(nlinsel=cpl_table_and_selected_int(line_table,"SELPLOT",
01148 CPL_EQUAL_TO,1));
01149 check_nomsg(xline_table=cpl_table_extract_selected(line_table));
01150
01151 ck0_nomsg(uves_qclog_add_int(qclog,
01152 "QC MODEL NLINSEL",
01153 nlinsel,
01154 "Number of lines selected",
01155 "%d"));
01156
01157
01158 uves_msg_debug("flames=%d iter=%d",flames,iter);
01159
01160
01161 ck0_nomsg(uves_qclog_add_double(qclog,
01162 "QC MODEL DIFFXRMS",
01163 cpl_table_get_column_stdev(xline_table,"XDIF"),
01164 "Std dev of X difference to physical model",
01165 "%8.4f"));
01166
01167 ck0_nomsg(uves_qclog_add_double(qclog,
01168 "QC MODEL DIFFXAVG",
01169 cpl_table_get_column_mean(xline_table,"XDIF"),
01170 "Average of X difference to physical model",
01171 "%8.4f"));
01172
01173 ck0_nomsg(uves_qclog_add_double(qclog,"QC MODEL DIFFXMED",
01174 cpl_table_get_column_median(xline_table,"XDIF"),
01175 "Median of X difference to physical model",
01176 "%8.4f"));
01177
01178 ck0_nomsg(uves_qclog_add_double(qclog,
01179 "QC MODEL DIFFYRMS",
01180 cpl_table_get_column_stdev(xline_table,"YDIF"),
01181 "Std dev of Y difference to physical model",
01182 "%8.4f"));
01183
01184 ck0_nomsg(uves_qclog_add_double(qclog,
01185 "QC MODEL DIFFYAVG",
01186 cpl_table_get_column_mean(xline_table,"YDIF"),
01187 "Average of Y difference to physical model",
01188 "%8.4f"));
01189
01190 ck0_nomsg(uves_qclog_add_double(qclog,"QC MODEL DIFFYMED",
01191 cpl_table_get_column_median(xline_table,"YDIF"),
01192 "Median of Y difference to physical model",
01193 "%8.4f"));
01194
01195
01196 if ( flames == 1 ) {
01197
01198
01199 sprintf(key_value,"%s%d","QC MODEL RESXRMS",iter);
01200 ck0_nomsg(uves_qclog_add_double(qclog,
01201 key_value,
01202 cpl_table_get_column_stdev(xline_table,"XDIF"),
01203 "Std dev of X difference to physical model",
01204 "%8.4f"));
01205
01206
01207 sprintf(key_value,"%s%d","QC MODEL RESXAVG",iter);
01208 ck0_nomsg(uves_qclog_add_double(qclog,
01209 key_value,
01210 cpl_table_get_column_mean(xline_table,"XDIF"),
01211 "Average of X difference to physical model",
01212 "%8.4f"));
01213
01214 sprintf(key_value,"%s%d","QC MODEL RESXMED",iter);
01215 ck0_nomsg(uves_qclog_add_double(qclog,
01216 key_value,
01217 cpl_table_get_column_median(xline_table,"XDIF"),
01218 "Median of X difference to physical model",
01219 "%8.4f"));
01220
01221
01222
01223 sprintf(key_value,"%s%d","QC MODEL RESYRMS",iter);
01224 ck0_nomsg(uves_qclog_add_double(qclog,
01225 key_value,
01226 cpl_table_get_column_stdev(xline_table,"YDIF"),
01227 "Std dev of Y difference to physical model",
01228 "%8.4f"));
01229
01230
01231 sprintf(key_value,"%s%d","QC MODEL RESYAVG",iter);
01232 ck0_nomsg(uves_qclog_add_double(qclog,
01233 key_value,
01234 cpl_table_get_column_mean(xline_table,"YDIF"),
01235 "Average of Y difference to physical model",
01236 "%8.4f"));
01237
01238 sprintf(key_value,"%s%d","QC MODEL RESYMED",iter);
01239 ck0_nomsg(uves_qclog_add_double(qclog,
01240 key_value,
01241 cpl_table_get_column_median(xline_table,"YDIF"),
01242 "Median of Y difference to physical model",
01243 "%8.4f"));
01244
01245
01246 }
01247
01248
01249
01250
01251
01252 cpl_table_unselect_all(line_table);
01253
01254
01255
01256 ck0_nomsg(uves_qclog_add_double(qclog,
01257 "QC MODEL WLENMIN",
01258 cpl_table_get_column_min(xline_table,"WAVEC")/10.,
01259 "minimum predicted wavelength value",
01260 "%8.4f"));
01261
01262
01263 ck0_nomsg(uves_qclog_add_double(qclog,
01264 "QC MODEL WLENMAX",
01265 cpl_table_get_column_max(xline_table,"WAVEC")/10.,
01266 "maximum predicted wavelength value",
01267 "%8.4f"));
01268
01269
01270 ck0_nomsg(uves_qclog_add_int(qclog,
01271 "QC MODEL ORDMIN",
01272 (int)cpl_table_get_column_min(xline_table,"Order"),
01273 "minimum predicted order value",
01274 "%d"));
01275
01276 ck0_nomsg(uves_qclog_add_int(qclog,
01277 "QC MODEL ORDMAX",
01278 (int)cpl_table_get_column_max(xline_table,"Order"),
01279 "maximum predicted order value",
01280 "%d"));
01281
01282
01283
01284
01285
01286 ck0_nomsg(uves_qclog_add_double(qclog,
01287 "QC WLENMIN",
01288 cpl_table_get_column_min(line_table,"WAVEC")/10.,
01289 "minimum wavelength",
01290 "%8.4f"));
01291
01292 ck0_nomsg(uves_qclog_add_double(qclog,
01293 "QC WLENMAX",
01294 cpl_table_get_column_max(line_table,"WAVEC")/10.,
01295 "maximum wavelength",
01296 "%8.4f"));
01297
01298 ck0_nomsg(uves_qclog_add_int(qclog,
01299 "QC ORDMIN",
01300 cpl_table_get_column_min(order_table,"ORDER"),
01301 "minimum order number",
01302 "%d"));
01303
01304 ck0_nomsg(uves_qclog_add_int(qclog,
01305 "QC ORDMAX",
01306 cpl_table_get_column_max(order_table,"ORDER"),
01307 "maximum order number",
01308 "%d"));
01309
01310
01311 if (flames) {
01312
01313
01314
01315
01316
01317
01318
01319 ck0_nomsg(uves_qclog_add_int(qclog,
01320 "QC FIB1 ABSTRANS",
01321 cpl_table_get_column_max(order_table,"ORDER"),
01322 "abs. trans. countrate",
01323 "%f"));
01324
01325
01326
01327
01328
01329
01330 ck0_nomsg(uves_qclog_add_int(qclog,
01331 "QC NHOTPIX",
01332 cpl_table_get_column_max(order_table,"ORDER"),
01333 "no. of hot pixels",
01334 "%d"));
01335
01336
01337 ck0_nomsg(uves_qclog_add_int(qclog,
01338 "QC PLATENO",
01339 plate_no,
01340 "Plate Id.",
01341 "%d"));
01342 }
01343
01344
01345
01346
01347
01348
01349 cleanup:
01350 uves_free_table(&xline_table);
01351
01352 if (cpl_error_get_code() != CPL_ERROR_NONE) {
01353 return -1;
01354 } else {
01355 return 0;
01356 }
01357
01358
01359
01360 }
01361
01362
01363
01364
01374 static int uves_physmod_qclog_sc(const double med_dx,
01375 const double med_dy,
01376 const double avg_dx,
01377 const double avg_dy,
01378 const uves_propertylist *raw_header,
01379 const uves_propertylist *ref_header,
01380 enum uves_chip chip,
01381 cpl_table* qclog)
01382 {
01383 ck0_nomsg(uves_qclog_add_string(qclog,
01384 "QC TEST2 ID",
01385 "Stability-Check-Results",
01386 "Name of QC test",
01387 "%s"));
01388
01389 ck0_nomsg(uves_qclog_add_string(qclog,
01390 "QC MODEL ID",
01391 "UVES_phys_mod/1.1.0",
01392 "Physmod Model Id",
01393 "%s"));
01394
01395 ck0_nomsg(uves_qclog_add_string(qclog,
01396 "QC MODEL DATE",
01397 "2000:03:18T00:00:00.000",
01398 "Physmod Model Parameters Last Change",
01399 "%s"));
01400
01401 check_nomsg( uves_qclog_add_common_wave(raw_header,
01402 chip, qclog) );
01403
01404
01405 ck0_nomsg(uves_qclog_add_string(qclog,
01406 "QC REF PNAME",
01407 uves_pfits_get_arcfile(ref_header),
01408 "Reference file name",
01409 "%s"));
01410
01411 ck0_nomsg(uves_qclog_add_double(qclog,
01412 "QC AMBI PRES",
01413 uves_pfits_get_ambipress(raw_header),
01414 "Ambient pressure [mm] Hg.",
01415 "%8.4f"));
01416
01417 ck0_nomsg(uves_qclog_add_double(qclog,
01418 "QC SHFTXAVG",
01419 avg_dx,
01420 "mean shift in x",
01421 "%8.4f"));
01422
01423 ck0_nomsg(uves_qclog_add_double(qclog,
01424 "QC SHFTXMED",
01425 med_dx,
01426 "median shift in x",
01427 "%8.4f"));
01428
01429 ck0_nomsg(uves_qclog_add_double(qclog,
01430 "QC SHFTYAVG",
01431 avg_dy,
01432 "mean shift in y",
01433 "%8.4f"));
01434
01435 ck0_nomsg(uves_qclog_add_double(qclog,
01436 "QC SHFTYMED",
01437 med_dy,
01438 "median shift in y",
01439 "%8.4f"));
01440 cleanup:
01441
01442 if (cpl_error_get_code() != CPL_ERROR_NONE) {
01443 return -1;
01444 } else {
01445 return 0;
01446 }
01447 }
01448
01449