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
00139
00140
00141 #ifdef HAVE_CONFIG_H
00142 # include <config.h>
00143 #endif
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 #include <uves_physmod_utils.h>
00184
00185 #include <uves_utils.h>
00186 #include <uves_utils_wrappers.h>
00187 #include <uves_error.h>
00188 #include <uves_msg.h>
00189
00190 #include <cpl.h>
00191
00192 #include <stdio.h>
00193 #include <math.h>
00194
00195
00196
00197
00198 static void
00199 beta2lamb(double uves_beta_ech, double uves_beta_cd, double* plambda, int m);
00200
00201 static double
00202 cameraFocal(double lm);
00203
00204 static void
00205 uves_physmod_find_alpha_beta(double lm,
00206 int m,
00207 double k,
00208 double theta,
00209 double *alpha,
00210 double *beta);
00211
00212 static double
00213 uves_physmod_find_lambda(double k, double alpha, double beta);
00214
00215 static double
00216 uves_physmod_find_order_lambda(double k, double alpha, double beta);
00217
00218
00219
00220
00221
00222
00223
00224
00225 static void
00226 uves_physmod_lambda_order_beta(double* plambda,
00227 int* pm,
00228 double x,
00229 double y,
00230 double* puves_beta_ech,
00231 double* puves_beta_cd);
00232
00233 static void
00234 uves_physmod_lambda_order_focus_model(double* plambda,
00235 double* pdm,
00236 double fc,
00237 double x,
00238 double y);
00239
00240 static double uves_physmod_wave_bin(double l, int m);
00241
00242 static void uves_physmod_xy2beta(double* puves_beta_ech,
00243 double* puves_beta_cd,
00244 double fc,
00245 double x,
00246 double y);
00247
00248 static void uves_physmod_set_binning(float binx, float biny);
00249
00250 static double dsqrarg;
00251
00252
00253
00254
00255
00256 #define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg)
00257
00258 #define PROID "physmod.c"
00259
00260
00261
00262
00263 enum uves_arm_ident {UVES_ARM_UNDEF,UVES_ARM_BLUE,UVES_ARM_RED};
00264 enum uves_arm_ident uves_arm_ident = UVES_ARM_UNDEF;
00265
00266
00267
00268
00269
00270
00271
00272 float uves_bin[2] = {1, 1};
00273 static double uves_physmod_pix_size[2] = {15e-6, 15e-6};
00274 static double delta[2] = {75.04, 76.0};
00275
00276 static double cdgroov[4] = {1000.0e-6, 660.0e-6, 600.0e-6, 312.5e-6};
00277 static double uves_ech_groov[2] = {31.6e-6, 41.59e-6};
00278
00279
00280 static double uves_ech_blaze[2] = {74.57, 75.9};
00281
00282
00283
00284 static double cdbeam[2] = {45.336, 46.0};
00285
00286
00287
00288 double uves_ccd_rot[2] = {0.3, -0.55};
00289
00290
00291 static int imsize[2] = {4096, 3000};
00292 static int uves_physmod_row_size[2] = {2048, 2048};
00293
00294
00295
00296
00297
00298
00299
00300
00301 double uves_physmod_offsetx[6]={1391.0,1385.0,1852.0,1835.0,1852.0,1834.0};
00302 double uves_physmod_offsety[6]={1030.0,1025.0,2098.0,2104.0,-52.0,-49.0};
00303
00304
00305
00306
00307
00308 static double flipx = 1.;
00309 static double flipy = -1.;
00310 double uves_airt = 25;
00311 double uves_airp = 760;
00312 double uves_airw = 3;
00313
00314 int uves_cfg_indx = 0;
00315 int uves_x_disp_id = 0;
00316 static int uves_ech_id = 0;
00317 double uves_alpha0_cd, uves_beta0_cd;
00318 char uves_arm_id = 'x';
00319
00320 static double uves_deg2rad = M_PI/180.;
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00368 void
00369 uves_physmod_set_incidence(double echred,
00370 double echblue,
00371 double xred,
00372 double xblue)
00373 {
00374 uves_ech_blaze[0] += echred;
00375 uves_ech_blaze[1] += echblue;
00376 cdbeam[0] += xred;
00377 cdbeam[1] += xblue;
00378 uves_msg_debug("uves_ech_blaze=%f,%f ccdbeam=%f,%f",
00379 uves_ech_blaze[0],uves_ech_blaze[1],cdbeam[0],cdbeam[1]);
00380 }
00381
00388 void
00389 uves_set_ccd_rot(double* ccdrot,
00390 double uves_ccd_rot_off_red,
00391 double uves_ccd_rot_off_blue)
00392 {
00393 uves_ccd_rot[0] =ccdrot[0];
00394 uves_ccd_rot[1] =ccdrot[1];
00395
00396 uves_ccd_rot[0] += uves_ccd_rot_off_red;
00397 uves_ccd_rot[1] += uves_ccd_rot_off_blue;
00398
00399 uves_msg_debug("uves_ccd_rot[0,1]=%f,%f uves_ccd_rot_off: red,blue=%f,%f",
00400 uves_ccd_rot[0],uves_ccd_rot[1],uves_ccd_rot_off_red,uves_ccd_rot_off_blue);
00401
00402 }
00403
00413 void
00414 uves_physmod_set_offset(double offset_x,
00415 double offset_y,
00416 double uves_physmod_x_off,
00417 double yoff)
00418 {
00419 uves_physmod_offsetx[uves_cfg_indx-1]=offset_x;
00420 uves_physmod_offsety[uves_cfg_indx-1]=offset_y;
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 uves_physmod_offsetx[uves_cfg_indx-1] += uves_physmod_x_off;
00433 uves_physmod_offsety[uves_cfg_indx-1] += yoff;
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 }
00445
00446
00453 void uves_physmod_set_binning(float binx, float biny)
00454 {
00455 uves_bin[0] = binx;
00456 uves_bin[1] = biny;
00457 }
00458
00459
00470 void uves_air_config(double p, double t, double w)
00471 {
00472 uves_airt = t;
00473 uves_airp = p;
00474 uves_airw = w;
00475 uves_msg_debug("uves_airt=%f uves_airp=%f uves_airw=%f",
00476 uves_airt,uves_airp,uves_airw);
00477 }
00478
00483 double uves_air_index(double lambda)
00484 {
00485
00486 double t1, t2, t3, airdx;
00487
00488 t1 = 1.0e-6/lambda/lambda;
00489
00490 t2 = (64.328+29498.1/(146.0-t1)+255.4/(41.0-t1))*uves_airp*
00491 (1.0+1.0e-6*(1.049-0.0157*uves_airt)*uves_airp)/
00492 (720.883*(1.0+0.003661*uves_airt));
00493
00494 t3 = t2 - uves_airw*(0.0624 - 0.000680*t1)/(1+0.003661*uves_airt);
00495
00496 airdx = 1.0+ t3*1.0e-6;
00497
00498
00499
00500
00501
00502
00503
00504 return(airdx);
00505 }
00506
00507
00517 void
00518 uves_physmod_find_alpha_beta(double lm,
00519 int m,
00520 double k,
00521 double theta,
00522 double *alpha,
00523 double *beta)
00524 {
00525
00526
00527 uves_msg_debug("lm, m, k, theta : %f %d %f %f",lm,m,k,theta);
00528
00529 lm /= uves_air_index(lm);
00530
00531 *alpha = 0.5* ( 2*asin( m*k*lm/2/cos(theta*uves_deg2rad/2) ) +
00532 theta*uves_deg2rad );
00533 *beta = 0.5* ( 2*asin( m*k*lm/2/cos(theta*uves_deg2rad/2) ) -
00534 theta*uves_deg2rad );
00535 *alpha /= uves_deg2rad;
00536 *beta /= uves_deg2rad;
00537 }
00538
00554 int
00555 uves_config(char uves_arm,
00556 char uves_ccd_id,
00557 int disp,
00558 double waveCent,
00559 float binx,
00560 float biny)
00561 {
00562
00563 int cfg = 0;
00564 uves_ech_id = 2;
00565 uves_x_disp_id = disp;
00566 uves_arm_id = uves_arm;
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578 uves_msg("Cfg: Arm %c CCD %c Xdisp %d Wave %f",
00579 uves_arm,uves_ccd_id,disp,waveCent);
00580
00581 if (uves_arm == 'b' && disp == 1) cfg = 1;
00582 if (uves_arm == 'b' && disp == 2) cfg = 2;
00583
00584 if (uves_arm == 'r' && disp == 3) {
00585 uves_ech_id = 1;
00586 if (uves_ccd_id == 'e') cfg = 3;
00587 if (uves_ccd_id == 'm') cfg = 5;
00588 }
00589 if (uves_arm == 'r' && disp == 4) {
00590 uves_ech_id = 1;
00591 if (uves_ccd_id == 'e') cfg = 4;
00592 if (uves_ccd_id == 'm') cfg = 6;
00593 }
00594
00595 if (cfg == 0) {
00596 cpl_msg_error(__func__,"Wrong configuration!");
00597 return -1;
00598 }
00599
00600 uves_cfg_indx = cfg;
00601
00602 (void) uves_physmod_set_binning(binx, biny);
00603 (void) uves_physmod_find_alpha_beta(waveCent, 1, cdgroov[uves_x_disp_id-1],
00604 cdbeam[uves_ech_id-1], &uves_alpha0_cd, &uves_beta0_cd);
00605
00606
00607 uves_msg("alpha, beta for Xdisp: %f %f\nin config %d and CCD-ID %c",
00608 uves_alpha0_cd, uves_beta0_cd,cfg, uves_ccd_id);
00609
00610 return(cfg);
00611
00612 }
00622 int
00623 uves_config_cpl_new(int uves_arm,
00624 int upper,
00625 int disp,
00626 double waveCent,
00627 float binx,
00628 float biny)
00629 {
00630 int cfg = 0;
00631 uves_ech_id = 2;
00632 uves_x_disp_id = disp;
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 uves_msg("New Cfg: Arm [b/r] %d CCD eev/mit %d Xdisp %d Wave %f",
00645 uves_arm,upper,disp,waveCent);
00646
00647 if (uves_arm == ARM_BLUE && disp == 1) cfg = 1;
00648 if (uves_arm == ARM_BLUE && disp == 2) cfg = 2;
00649
00650 if (uves_arm == ARM_RED && disp == 3) {
00651 uves_ech_id = 1;
00652 if (upper == 0) cfg = 3;
00653 if (upper == 1) cfg = 5;
00654 }
00655 if (uves_arm == ARM_RED && disp == 4) {
00656 uves_ech_id = 1;
00657 if (upper == 0) cfg = 4;
00658 if (upper == 1) cfg = 6;
00659 }
00660
00661 if (cfg == 0) {
00662 cpl_msg_error(__func__,"Wrong configuration!");
00663 return -1;
00664 }
00665
00666 uves_cfg_indx = cfg;
00667
00668 (void) uves_physmod_set_binning(binx, biny);
00669 (void) uves_physmod_find_alpha_beta(waveCent, 1, cdgroov[uves_x_disp_id-1],
00670 cdbeam[uves_ech_id-1], &uves_alpha0_cd, &uves_beta0_cd);
00671
00672
00673 uves_msg("alpha, beta for Xdisp: %f %f\nin config %d and CCD-ID %c",
00674 uves_alpha0_cd, uves_beta0_cd,cfg, upper == 0 ? 'e' : 'm');
00675
00676 return(cfg);
00677
00678 }
00679
00698 int
00699 uves_config_cpl(int blue,
00700 int upper,
00701 int disp,
00702 double waveCent,
00703 float binx,
00704 float biny)
00705 {
00706
00707
00708 int cfg = 0;
00709 uves_ech_id = 2;
00710 uves_x_disp_id = disp;
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722 uves_msg("Cfg cpl: Arm [b/r] %d CCD eev/mit %d Xdisp %d Wave %f",
00723 blue,upper,disp,waveCent);
00724
00725 if (blue == 1 && disp == 1) cfg = 1;
00726 if (blue == 1 && disp == 2) cfg = 2;
00727
00728 if (blue == 0 && disp == 3) {
00729 uves_ech_id = 1;
00730 if (upper == 0) cfg = 3;
00731 if (upper == 1) cfg = 5;
00732 }
00733 if (blue == 0 && disp == 4) {
00734 uves_ech_id = 1;
00735 if (upper == 0) cfg = 4;
00736 if (upper == 1) cfg = 6;
00737 }
00738
00739 if (cfg == 0) {
00740 uves_msg_error("Wrong configuration!");
00741 return -1;
00742 }
00743
00744 uves_cfg_indx = cfg;
00745
00746 (void) uves_physmod_set_binning(binx, biny);
00747 (void) uves_physmod_find_alpha_beta(waveCent, 1, cdgroov[uves_x_disp_id-1],
00748 cdbeam[uves_ech_id-1], &uves_alpha0_cd, &uves_beta0_cd);
00749
00750
00751 uves_msg("alpha, beta for Xdisp: %f %f\nin config %d and CCD-ID %c",
00752 uves_alpha0_cd, uves_beta0_cd,cfg, upper == 0 ? 'e': 'u');
00753
00754 return(cfg);
00755
00756 }
00757
00777 double cameraFocal(double lm)
00778
00779 {
00780 double nfk=0.;
00781
00782
00783
00784 lm /= uves_air_index(lm);
00785
00786 if (uves_arm_id == 'b' ) {
00787
00788 nfk=5.3961886e-7*lm*lm*lm-0.00079597882*lm*lm+0.41122805*lm+287.89644;
00789 }
00790
00791 if (uves_arm_id == 'r' ) {
00792
00793 nfk=6.0172051e-13*lm*lm*lm*lm*lm-2.5623231e-9*lm*lm*lm*lm+
00794 4.3585543e-6*lm*lm*lm -0.0037286381*lm*lm+
00795 1.6289971*lm + 210.06767;
00796
00797 }
00798
00799
00800
00801 return(nfk/1000.);
00802
00803 }
00804
00805
00811 int uves_physmod_find_order(double lm)
00812 {
00813 int order;
00814 double k, alpha, beta;
00815
00816 lm /= uves_air_index(lm);
00817
00818 k = uves_ech_groov[uves_ech_id-1];
00819 alpha = uves_ech_blaze[uves_ech_id-1];
00820 beta = uves_ech_blaze[uves_ech_id-1];
00821 order = (int)((sin(alpha*uves_deg2rad) + sin(beta*uves_deg2rad))/k/lm + 0.5);
00822
00823
00824
00825
00826 return order;
00827 }
00828
00836 double uves_physmod_find_order_lambda(double k, double alpha, double beta)
00837 {
00838 double ML;
00839 ML = ( ( sin(alpha*uves_deg2rad) + sin(beta*uves_deg2rad) )/k);
00840 ML *= uves_air_index(ML);
00841 return(ML);
00842 }
00843
00844
00851 double uves_physmod_find_lambda(double k, double alpha, double beta)
00852 {
00853 double L;
00854 L = (sin(alpha*uves_deg2rad) + sin(beta*uves_deg2rad) )/k ;
00855 L *= uves_air_index(L);
00856 return(L);
00857 }
00858
00866 double uves_physmod_find_beta(int m, double k, double l, double alpha)
00867 {
00868
00869
00870 l /= uves_air_index(l);
00871
00872
00873
00874
00875
00876
00877
00878
00879 if ( (m*k*l - sin(alpha*uves_deg2rad)) <=1.0 )
00880 {
00881 return( (asin(m*k*l - sin(alpha*uves_deg2rad)))/uves_deg2rad );
00882 }
00883 else
00884 {
00885 return( (asin(0.999))/uves_deg2rad );
00886 }
00887 }
00888
00897 void
00898 uves_physmod_lambda_order2beta(double lambda,
00899 int m,
00900 double* puves_beta_ech,
00901 double* puves_beta_cd,
00902 double* pfc)
00903 {
00904
00905
00906
00907
00908 *pfc = cameraFocal(lambda);
00909
00910
00911
00912 *puves_beta_ech = uves_physmod_find_beta(m, uves_ech_groov[uves_ech_id-1],
00913 lambda, uves_ech_blaze[uves_ech_id-1]);
00914
00915 *puves_beta_cd = uves_physmod_find_beta(1, cdgroov[uves_x_disp_id-1],
00916 lambda, uves_alpha0_cd);
00917
00918
00919
00920 }
00921
00930 void
00931 uves_beta2xy(double uves_beta_cd,
00932 double uves_beta_ech,
00933 double fc,
00934 double* px,
00935 double* py)
00936 {
00937 double xd, yd, xr, yr, angle;
00938
00939 xd = fc*tan( (uves_beta_ech - uves_ech_blaze[uves_ech_id-1])*
00940 uves_deg2rad )/
00941 uves_physmod_pix_size[0]/uves_bin[0];
00942 yd = fc*tan( (uves_alpha0_cd - uves_beta_cd -
00943 cdbeam[uves_ech_id-1])*uves_deg2rad )/
00944 uves_physmod_pix_size[1]/uves_bin[1];
00945
00946
00947 uves_msg_debug("beta(CD), yorg: %f %f", uves_beta_cd, yd);
00948
00949 xd = xd*flipx;
00950 yd = yd*flipy;
00951 uves_msg_debug ("Positions after flip: %f %f",xd,yd);
00952
00953 angle = uves_ccd_rot[uves_ech_id-1]*uves_deg2rad;
00954 xr = xd*cos(angle) + yd*sin(angle);
00955 yr = -xd*sin(angle) + yd*cos(angle);
00956
00957 uves_msg_debug ("Rotated positions %f %f",xr,yr);
00958
00959 *px = uves_physmod_offsetx[uves_cfg_indx-1] / uves_bin[0] + xr;
00960 *py = uves_physmod_offsety[uves_cfg_indx-1] / uves_bin[1] + yr;
00961
00962
00963 }
00964
00975 void
00976 uves_physmod_photo_beta(double lambda,
00977 double uves_beta_ech,
00978 double uves_beta_cd,
00979 double* puves_physmod_rech,
00980 double* puves_physmod_rcd,
00981 double* pblz)
00982 {
00983 double gam;
00984
00985
00986
00987
00988
00989
00990 *puves_physmod_rech = cos(uves_ech_blaze[uves_ech_id-1]*uves_deg2rad)/
00991 cos(uves_beta_ech*uves_deg2rad);
00992
00993 *puves_physmod_rcd = cos(uves_alpha0_cd*uves_deg2rad)/
00994 cos(uves_beta_cd*uves_deg2rad);
00995
00996
00997
00998
00999
01000 gam = M_PI / uves_ech_groov[uves_ech_id-1] *
01001 cos(delta[uves_ech_id-1]*uves_deg2rad) *
01002 (sin((uves_beta_ech-delta[uves_ech_id-1])*uves_deg2rad)-
01003 sin((uves_ech_blaze[uves_ech_id-1]-delta[uves_ech_id-1])*
01004 uves_deg2rad))
01005 / lambda/ uves_air_index(lambda);
01006 *pblz = DSQR(sin(gam)/gam);
01007
01008
01009
01010 }
01011
01035 void uves_physmod_pixscl(
01036 double wave,
01037 int order,
01038 double uves_physmod_rech,
01039 double uves_physmod_rcd,
01040 float binx,
01041 float biny,
01042 double fc,
01043 double slitwidth,
01044 double slitlength,
01045 double* pbinsize,
01046 double* ppixscale,
01047 double* ppixscalCD,
01048 double* plinewidpx,
01049 double* plinelenpx,
01050 double* plinewidth,
01051 double* presol)
01052 {
01053 double binsize, pixscale, pixscalCD, linewidpx, linelenpx, linewidth, resol;
01054 static double scale;
01055
01056 if (!(scale)) scale = (206265.0*15.0*0.015*200*1e-3*binx)/120000;
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077 binsize = uves_physmod_wave_bin(wave, order) * 1e4;
01078 pixscale = scale/(fc*uves_physmod_rech);
01079 pixscalCD = pixscale *(biny/binx) *uves_physmod_rech/uves_physmod_rcd;
01080 linewidpx = slitwidth / pixscale;
01081 linelenpx = slitlength /pixscalCD;
01082 linewidth = binsize * linewidpx * 1e-3;
01083 resol = wave * 10.0 / linewidth;
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093 *pbinsize = binsize;
01094 *ppixscale = pixscale;
01095 *ppixscalCD = pixscalCD;
01096 *plinewidpx = linewidpx;
01097 *plinelenpx = linelenpx;
01098 *plinewidth = linewidth;
01099 *presol = resol;
01100
01101 }
01102
01110 void
01111 uves_physmod_xy_model(double lambda, int m, double* px, double* py)
01112 {
01113 double fc, uves_beta_ech, uves_beta_cd;
01114
01115 uves_physmod_lambda_order2beta(lambda, m, &uves_beta_ech, &uves_beta_cd, &fc);
01116 uves_msg_debug("lambda=%f m=%d uves_beta_ech=%f,uves_beta_cd=%f,fc=%f",
01117 lambda,m,uves_beta_ech,uves_beta_cd,fc);
01118
01119 uves_beta2xy(uves_beta_cd, uves_beta_ech, fc, px, py);
01120 uves_msg_debug("px=%f py=%f",*px,*py);
01121
01122
01123
01124
01125
01126
01127 }
01128
01137 void
01138 uves_physmod_xy2beta(double* puves_beta_ech,
01139 double* puves_beta_cd,
01140 double fc,
01141 double x,
01142 double y)
01143 {
01144 double xr, yr, xd, yd, angle;
01145
01146 angle = uves_ccd_rot[uves_ech_id-1]*uves_deg2rad;
01147
01148 xr = (x - uves_physmod_offsetx[uves_cfg_indx-1]/uves_bin[0]);
01149 yr = (y - uves_physmod_offsety[uves_cfg_indx-1]/uves_bin[1]);
01150
01151 xd = xr*cos(angle) - yr*sin(angle);
01152 yd = xr*sin(angle) + yr*cos(angle);
01153
01154 xd /= flipx;
01155 yd /= flipy;
01156
01157 *puves_beta_ech = atan(xd*uves_physmod_pix_size[0]*uves_bin[0]/fc)/
01158 uves_deg2rad + uves_ech_blaze[uves_ech_id-1];
01159 *puves_beta_cd = uves_alpha0_cd - cdbeam[uves_ech_id-1] -
01160 atan(yd*uves_physmod_pix_size[1]*uves_bin[1]/fc)/
01161 uves_deg2rad;
01162
01163 }
01164
01173 static void
01174 beta2lamb(double uves_beta_ech,
01175 double uves_beta_cd,
01176 double* plambda,
01177 int m)
01178 {
01179 uves_beta_cd=uves_beta_cd;
01180 *plambda = uves_physmod_find_lambda(m*uves_ech_groov[uves_ech_id-1],
01181 uves_ech_blaze[uves_ech_id-1], uves_beta_ech);
01182
01183 }
01184
01197 void
01198 uves_physmod_lambda_order_focus_model(double* plambda,
01199 double* pdm,
01200 double fc,
01201 double x,
01202 double y)
01203 {
01204
01205 double uves_beta_ech, uves_beta_cd;
01206
01207 uves_physmod_xy2beta(&uves_beta_ech, &uves_beta_cd, fc, x, y);
01208
01209 *plambda = uves_physmod_find_order_lambda(cdgroov[uves_x_disp_id-1],
01210 uves_alpha0_cd, uves_beta_cd);
01211 *pdm = uves_physmod_find_order_lambda(uves_ech_groov[uves_ech_id-1],
01212 uves_ech_blaze[uves_ech_id-1], uves_beta_ech)/(*plambda);
01213
01214
01215
01216
01217 }
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01257 void
01258 uves_physmod_lambda_order_beta(double* plambda,
01259 int* pm,
01260 double x,
01261 double y,
01262 double* puves_beta_ech,
01263 double* puves_beta_cd)
01264 {
01265
01266 double fcguess=0., wave=0., mdbl=0., xe=0., ye=0., xd=0., yd=0.;
01267 int i=0;
01268
01269 if (uves_arm_id == 'b') fcguess = 0.360;
01270 if (uves_arm_id == 'r') fcguess = 0.500;
01271
01272 uves_physmod_lambda_order_focus_model(&wave,&mdbl,fcguess,x,y);
01273
01274
01275
01276
01277
01278
01279 do {
01280
01281 fcguess = cameraFocal(wave);
01282
01283
01284
01285
01286
01287 if (*pm <= 0) *pm = (int)(mdbl+0.5);
01288
01289 uves_physmod_xy2beta(puves_beta_ech, puves_beta_cd, fcguess, x, y);
01290 beta2lamb(*puves_beta_ech, *puves_beta_cd, &wave, *pm);
01291
01292
01293
01294
01295
01296
01297
01298 uves_physmod_xy_model(wave,(int)(mdbl+0.5), &xe, &ye);
01299
01300
01301
01302
01303
01304
01305
01306 i++;
01307
01308 xd = fabs(x-xe);
01309 yd = fabs(y-ye);
01310
01311 } while (!((xd < 1.) && (yd < 1.)) && (i <= 4));
01312
01313 *plambda = wave;
01314
01315
01316
01317
01318
01319
01320
01321
01322 }
01323
01337 void
01338 uves_physmod_lambda_order_model(double* plambda, int* pm, double x, double y)
01339 {
01340
01341 double uves_beta_ech, uves_beta_cd;
01342
01343 uves_physmod_lambda_order_beta(plambda, pm, x, y,
01344 &uves_beta_ech, &uves_beta_cd);
01345
01346
01347
01348
01349
01350
01351
01352
01353 }
01354
01363 void
01364 uves_physmod_find_FSR(int m, double* lambdaC, double* fsrStart, double* fsrEnd)
01365 {
01366
01367 double tmp_delta;
01368
01369 *lambdaC = 2*sin(uves_ech_blaze[uves_ech_id-1]*uves_deg2rad)/
01370 m/uves_ech_groov[uves_ech_id-1];
01371
01372 tmp_delta = *lambdaC/m;
01373
01374 *fsrStart = *lambdaC - tmp_delta/2.;
01375 *fsrEnd = *lambdaC + tmp_delta/2.;
01376
01377 }
01378
01384 double uves_physmod_wave_bin(double l, int m)
01385 {
01386
01387 double dl, x0,y_0,x1,y_1;
01388
01389 dl = 20e-4;
01390
01391 uves_physmod_xy_model( l, m,&x0,&y_0);
01392 uves_physmod_xy_model((l+dl),m,&x1,&y_1);
01393
01394 return( dl/(x1-x0) );
01395 }
01396
01402 void uves_ccd_size(int* nx, int* ny)
01403 {
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413 *nx = imsize[uves_ech_id-1] / uves_bin[0];
01414 *ny = uves_physmod_row_size[uves_ech_id-1] / uves_bin[1];
01415 }
01416
01427 void uves_physmod_xy_regres(double x,double y,double* px,double* py)
01428 {
01429 double xdiff=0;
01430 double ydiff=0;
01431 int xnpix=0;
01432 int ynpix=0;
01433
01434 goto simplified;
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459 simplified: {
01460 uves_ccd_size(&xnpix, &ynpix);
01461
01462 xdiff = (-7.)*(x-(double)xnpix/2.)/((double)xnpix/2.);
01463
01464 ydiff = (5.)*DSQR((x-(double)xnpix/2.)/((double)xnpix/2.));
01465
01466 *px = x + xdiff;
01467 *py = y + ydiff;
01468 }
01469 }
01470