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
00184 int update;
00185 XSH_MODE mode;
00186 XSH_ARM arm;
00187 XSH_LAMP lamp;
00188 XSH_INSTRCONFIG* config;
00189 const char* pipeline_id;
00190 const char *dictionary;
00191 const char * recipe_id ;
00192 } xsh_instrument;
00193
00194
00195 #define XSH_NAME_LAMP_MODE_ARM( name, id, ext, instr) \
00196 XSH_NAME_PREFIX_LAMP_MODE_ARM( name, "", id, ext, instr)
00197
00198 #define XSH_NAME_PREFIX_LAMP_MODE_ARM( name, prefix, id, ext, instr)\
00199 XSH_FREE( name);\
00200 XSH_ASSURE_NOT_NULL( prefix);\
00201 if ( xsh_instrument_get_mode( instr) != XSH_MODE_UNDEFINED){\
00202 if (xsh_instrument_get_lamp( instr) != XSH_LAMP_UNDEFINED){\
00203 name = xsh_stringcat_any( prefix, id, "_", \
00204 xsh_instrument_lamp_tostring( instr)\
00205 , "_", xsh_instrument_mode_tostring( instr),"_", \
00206 xsh_instrument_arm_tostring( instr), ext, "");\
00207 }\
00208 else{\
00209 name = xsh_stringcat_any( prefix, id, "_",\
00210 xsh_instrument_mode_tostring( instr),"_", \
00211 xsh_instrument_arm_tostring( instr), ext, "");\
00212 }\
00213 }\
00214 else{\
00215 name = xsh_stringcat_any( prefix, id, "_",\
00216 xsh_instrument_arm_tostring( instr), ext, "");\
00217 }\
00218 XSH_ASSURE_NOT_NULL( name)
00219
00220
00221
00222
00223
00224 xsh_instrument* xsh_instrument_new(void);
00225 void xsh_instrument_free(xsh_instrument** );
00226 xsh_instrument * xsh_instrument_duplicate( xsh_instrument * instrument ) ;
00227
00228 void xsh_instrument_set_mode(xsh_instrument* i,XSH_MODE mode);
00229 void xsh_instrument_set_arm(xsh_instrument* i,XSH_ARM arm);
00230 void xsh_instrument_set_lamp(xsh_instrument* i,XSH_LAMP lamp);
00231 void xsh_instrument_set_recipe_id(xsh_instrument* i, const char *recipe_id);
00232
00233 void xsh_instrument_update_lamp(xsh_instrument* i, XSH_LAMP lamp);
00234 void xsh_instrument_update_from_spectralformat(xsh_instrument* i,
00235 cpl_frame* spectralformat_frame);
00236
00237 XSH_MODE xsh_instrument_get_mode(xsh_instrument* i);
00238 XSH_ARM xsh_instrument_get_arm(xsh_instrument* i);
00239 XSH_LAMP xsh_instrument_get_lamp(xsh_instrument* i);
00240 XSH_INSTRCONFIG* xsh_instrument_get_config(xsh_instrument* i);
00241
00242 int xsh_instrument_get_binx( xsh_instrument * instrument ) ;
00243 int xsh_instrument_get_biny( xsh_instrument * instrument ) ;
00244
00245 XSH_ARM xsh_arm_get(const char* tag);
00246 XSH_MODE xsh_mode_get(const char* tag);
00247 XSH_LAMP xsh_lamp_get(const char* tag);
00248
00249 double xsh_arcsec_get( xsh_instrument * instrument ) ;
00250 double xsh_resolution_get( xsh_instrument * instrument, double slit);
00251
00252
00253 void xsh_instrument_parse_tag(xsh_instrument* inst,const char* tag);
00254
00255
00256 const char* xsh_instrument_mode_tostring(xsh_instrument* i);
00257 const char* xsh_instrument_arm_tostring(xsh_instrument* i);
00258 const char* xsh_instrument_lamp_tostring(xsh_instrument* i);
00259
00260 const char* xsh_mode_tostring(XSH_MODE mode);
00261 const char* xsh_arm_tostring(XSH_ARM arm);
00262 const char* xsh_lamp_tostring(XSH_LAMP lamp);
00263 void xsh_instrument_set_binx( xsh_instrument * instrument, const int binx );
00264 void xsh_instrument_set_biny( xsh_instrument * instrument, const int biny );
00265 void xsh_mode_set(xsh_instrument* instrument, XSH_MODE mode);
00266
00267 #endif