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 #ifndef XSH_DATA_INSTRUMENT_H
00027 #define XSH_DATA_INSTRUMENT_H
00028
00029
00030
00031
00032 #include <cpl.h>
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #define XSH_ORDERS_NIR 16
00043 #define XSH_ORDER_MIN_NIR 11
00044 #define XSH_ORDER_MAX_NIR 26
00045
00046 #define XSH_ORDERS_UVB 12
00047 #define XSH_ORDERS_UVB_QTH 8
00048 #define XSH_ORDERS_UVB_D2 4
00049
00050 #define XSH_ORDER_MIN_UVB 13
00051 #define XSH_ORDER_MAX_UVB 24
00052 #define XSH_ORDER_MIN_UVB_D2 21
00053 #define XSH_ORDER_MAX_UVB_D2 XSH_ORDER_MAX_UVB
00054 #define XSH_ORDER_MIN_UVB_QTH XSH_ORDER_MIN_UVB
00055 #define XSH_ORDER_MAX_UVB_QTH XSH_ORDER_MIN_UVB_D2 -1
00056
00057 #define XSH_ORDERS_VIS 15
00058 #define XSH_ORDER_MIN_VIS 16
00059 #define XSH_ORDER_MAX_VIS 30
00060
00061 #define XSH_ORDERS_UNDEFINED 0
00062
00063 #define XSH_NB_PINHOLE 9
00064
00065
00066 #define XSH_ARCSEC_NIR 0.2
00067 #define XSH_ARCSEC_UVB 0.14
00068 #define XSH_ARCSEC_VIS 0.135
00069
00070
00071 #if 0
00072 #define MIN_SLIT -5.5
00073 #define MAX_SLIT 5.5
00074 #else
00075 #define MIN_SLIT -5.3
00076 #define MAX_SLIT 5.7
00077 #endif
00078 #define LENGTH_SLIT 11.
00079 #define BASE_MIN_SLIT -5.5
00080 #define BASE_MAX_SLIT 5.5
00081
00082
00083 #define MIN_SLIT_IFU -6.0
00084 #define MAX_SLIT_IFU 6.0
00085 #define LENGTH_SLIT_IFU 12
00086 #define WIDTH_SLIT_IFU 0.6
00087
00088 #define CHECK_POS_IN_SLIT( pos)\
00089 if ( (pos < MIN_SLIT_IFU) || (pos > MAX_SLIT_IFU)){\
00090 xsh_error_msg( "Invalid slit position %f : not in [%f,%f]"\
00091 ,pos, MIN_SLIT_IFU, MAX_SLIT_IFU);\
00092 }
00093
00094
00095 #define IFU_SCALE 0.03925
00096 #define IFU_MAP_LEFT_C0X (-0.6*IFU_SCALE)//-10.10
00097 #define IFU_MAP_LEFT_C1X -1.0//-58.81
00098 #define IFU_MAP_LEFT_C2X 0.0//-85.17
00099 #define IFU_MAP_CEN_C0X 0.0//0.0
00100 #define IFU_MAP_CEN_C1X 1.0//0.98
00101 #define IFU_MAP_CEN_C2X 0.0//7.01
00102 #define IFU_MAP_RIGHT_C0X (0.6*IFU_SCALE)//7.4
00103 #define IFU_MAP_RIGHT_C1X -1.0//-41.25
00104 #define IFU_MAP_RIGHT_C2X 0.0//57.55
00105
00106 #define IFU_MAP_LEFT_C0Y (4.0*IFU_SCALE)//2.13
00107 #define IFU_MAP_LEFT_C1Y -1.0
00108 #define IFU_MAP_LEFT_C2Y 0.0
00109 #define IFU_MAP_CEN_C0Y 0.0
00110 #define IFU_MAP_CEN_C1Y 1.0
00111 #define IFU_MAP_CEN_C2Y 0.0
00112 #define IFU_MAP_RIGHT_C0Y (-4.0*IFU_SCALE)//-2.09
00113 #define IFU_MAP_RIGHT_C1Y -1.0
00114 #define IFU_MAP_RIGHT_C2Y 0.0
00115
00116
00117 #define IFU_LOW -2.0 //=-0.5*(11.4/3)
00118 #define IFU_HI 2.0 //=+0.5*(11.4/3)
00119 #define IFU_LEFT_MIN -0.9 //=-1.5*0.6
00120 #define IFU_LEFT_MAX -0.3 //=-0.5*0.6
00121 #define IFU_CEN_MIN -0.3 //=-0.5*0.6
00122 #define IFU_CEN_MAX 0.3 //=+0.5*0.6
00123 #define IFU_RIGHT_MIN 0.3 //=+0.5*0.6
00124 #define IFU_RIGHT_MAX 0.9 //=+1.5*0.6
00125
00126 typedef enum {
00127 XSH_MODE_IFU,
00128 XSH_MODE_SLIT,
00129 XSH_MODE_UNDEFINED
00130 } XSH_MODE;
00131
00132
00133 typedef enum {
00134 XSH_ARM_UVB,
00135 XSH_ARM_VIS,
00136 XSH_ARM_NIR,
00137 XSH_ARM_UNDEFINED
00138 } XSH_ARM;
00139
00140 typedef enum {
00141 XSH_LAMP_QTH,
00142 XSH_LAMP_D2,
00143 XSH_LAMP_THAR,
00144 XSH_LAMP_QTH_D2,
00145 XSH_LAMP_UNDEFINED
00146 } XSH_LAMP;
00147
00148 typedef struct {
00149 int bitpix;
00150 int naxis;
00151 int naxis1;
00152 int naxis2;
00153 int nx;
00154 int ny;
00155 int prscx;
00156 int prscy;
00157 int ovscx;
00158 int ovscy;
00159 double pszx;
00160 double pszy;
00161 double ron;
00162 double conad;
00163 double pxspace ;
00164 int orders ;
00165 int order_min ;
00166 int order_max ;
00167 } XSH_INSTRCONFIG;
00168
00169 typedef struct {
00170 int uvb_orders_nb;
00171 int uvb_orders_qth_nb;
00172 int uvb_orders_d2_nb;
00173 int uvb_orders_min;
00174 int uvb_orders_max;
00175 int vis_orders_nb;
00176 int vis_orders_min;
00177 int vis_orders_max;
00178 int nir_orders_nb;
00179 int nir_orders_min;
00180 int nir_orders_max;
00181 int binx;
00182 int biny;
00183 int decode_bp;
00184
00185 int update;
00186 XSH_MODE mode;
00187 XSH_ARM arm;
00188 XSH_LAMP lamp;
00189 XSH_INSTRCONFIG* config;
00190 const char* pipeline_id;
00191 const char *dictionary;
00192 const char * recipe_id ;
00193 } xsh_instrument;
00194
00195
00196 #define XSH_NAME_LAMP_MODE_ARM( name, id, ext, instr) \
00197 XSH_NAME_PREFIX_LAMP_MODE_ARM( name, "", id, ext, instr)
00198
00199 #define XSH_NAME_PREFIX_LAMP_MODE_ARM( name, prefix, id, ext, instr)\
00200 XSH_FREE( name);\
00201 XSH_ASSURE_NOT_NULL( prefix);\
00202 if ( xsh_instrument_get_mode( instr) != XSH_MODE_UNDEFINED){\
00203 if (xsh_instrument_get_lamp( instr) != XSH_LAMP_UNDEFINED){\
00204 name = xsh_stringcat_any( prefix, id, "_", \
00205 xsh_instrument_lamp_tostring( instr)\
00206 , "_", xsh_instrument_mode_tostring( instr),"_", \
00207 xsh_instrument_arm_tostring( instr), ext, "");\
00208 }\
00209 else{\
00210 name = xsh_stringcat_any( prefix, id, "_",\
00211 xsh_instrument_mode_tostring( instr),"_", \
00212 xsh_instrument_arm_tostring( instr), ext, "");\
00213 }\
00214 }\
00215 else{\
00216 name = xsh_stringcat_any( prefix, id, "_",\
00217 xsh_instrument_arm_tostring( instr), ext, "");\
00218 }\
00219 XSH_ASSURE_NOT_NULL( name)
00220
00221
00222
00223
00224
00225 xsh_instrument* xsh_instrument_new(void);
00226 void xsh_instrument_free(xsh_instrument** );
00227 xsh_instrument * xsh_instrument_duplicate( xsh_instrument * instrument ) ;
00228
00229 void xsh_instrument_set_mode(xsh_instrument* i,XSH_MODE mode);
00230 void xsh_instrument_set_decode_bp(xsh_instrument* i,const int decode_bp);
00231 void xsh_instrument_set_arm(xsh_instrument* i,XSH_ARM arm);
00232 void xsh_instrument_set_lamp(xsh_instrument* i,XSH_LAMP lamp);
00233 void xsh_instrument_set_recipe_id(xsh_instrument* i, const char *recipe_id);
00234
00235 void xsh_instrument_update_lamp(xsh_instrument* i, XSH_LAMP lamp);
00236 void xsh_instrument_update_from_spectralformat(xsh_instrument* i,
00237 cpl_frame* spectralformat_frame);
00238
00239 XSH_MODE xsh_instrument_get_mode(xsh_instrument* i);
00240 XSH_ARM xsh_instrument_get_arm(xsh_instrument* i);
00241 XSH_LAMP xsh_instrument_get_lamp(xsh_instrument* i);
00242 XSH_INSTRCONFIG* xsh_instrument_get_config(xsh_instrument* i);
00243
00244 int xsh_instrument_get_binx( xsh_instrument * instrument ) ;
00245 int xsh_instrument_get_biny( xsh_instrument * instrument ) ;
00246
00247 XSH_ARM xsh_arm_get(const char* tag);
00248 XSH_MODE xsh_mode_get(const char* tag);
00249 XSH_LAMP xsh_lamp_get(const char* tag);
00250
00251 double xsh_arcsec_get( xsh_instrument * instrument ) ;
00252 double xsh_resolution_get( xsh_instrument * instrument, double slit);
00253
00254
00255 void xsh_instrument_parse_tag(xsh_instrument* inst,const char* tag);
00256
00257
00258 const char* xsh_instrument_mode_tostring(xsh_instrument* i);
00259 const char* xsh_instrument_arm_tostring(xsh_instrument* i);
00260 const char* xsh_instrument_lamp_tostring(xsh_instrument* i);
00261
00262 const char* xsh_mode_tostring(XSH_MODE mode);
00263 const char* xsh_arm_tostring(XSH_ARM arm);
00264 const char* xsh_lamp_tostring(XSH_LAMP lamp);
00265 void xsh_instrument_set_binx( xsh_instrument * instrument, const int binx );
00266 void xsh_instrument_set_biny( xsh_instrument * instrument, const int biny );
00267 void xsh_mode_set(xsh_instrument* instrument, XSH_MODE mode);
00268 cpl_error_code
00269 xsh_instrument_nir_corr_if_JH(cpl_frameset* raws, xsh_instrument* instr);
00270 int
00271 xsh_instrument_nir_is_JH(cpl_frame* frm, xsh_instrument* instr);
00272
00273 cpl_error_code
00274 xsh_instrument_nir_corr_if_spectral_format_is_JH(cpl_frameset* calib, xsh_instrument* instr);
00275 #endif