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
00032
00035
00036
00037
00038
00039 #include <math.h>
00040 #include <xsh_drl.h>
00041
00042 #include <xsh_utils_table.h>
00043 #include <xsh_badpixelmap.h>
00044 #include <xsh_data_pre.h>
00045 #include <xsh_dfs.h>
00046 #include <xsh_pfits.h>
00047 #include <xsh_error.h>
00048 #include <xsh_msg.h>
00049 #include <xsh_fit.h>
00050 #include <xsh_data_instrument.h>
00051 #include <xsh_data_localization.h>
00052 #include <xsh_data_rec.h>
00053 #include <xsh_ifu_defs.h>
00054 #include <xsh_data_image_3d.h>
00055 #include <xsh_data_pre_3d.h>
00056
00057 #include <cpl.h>
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 static void fill_img( cpl_image * img, int ilambda, cpl_image * down,
00068 cpl_image * cen, cpl_image * up, int up_shift, int cen_shift)
00069 {
00070 int nx, ny, j ;
00071
00072
00073 check(nx = cpl_image_get_size_x( down ));
00074 check(ny = cpl_image_get_size_y( down));
00075 xsh_msg_dbg_high( "fill image at %d (%d x %d )", ilambda, nx, ny ) ;
00076
00077 for( j = 1 ; j <= ny ; j++ ) {
00078 int rej ;
00079 double flux ;
00080
00081 check(flux = cpl_image_get( down, ilambda+1, j, &rej )) ;
00082 check(cpl_image_set( img, 1, j+cen_shift, flux )) ;
00083 }
00084
00085 check(nx = cpl_image_get_size_x( cen));
00086 check(ny = cpl_image_get_size_y( cen));
00087
00088 for( j = 1 ; j <= ny ; j++ ) {
00089 int rej ;
00090 double flux ;
00091
00092 check(flux = cpl_image_get( cen, ilambda+1, j, &rej )) ;
00093 check(cpl_image_set( img, 2, j+cen_shift, flux ) );
00094 }
00095
00096 check(nx = cpl_image_get_size_x( up ));
00097 check(ny = cpl_image_get_size_y( up));
00098 for( j = 1 ; j <= ny ; j++ ) {
00099 int rej ;
00100 double flux ;
00101
00102 check(flux = cpl_image_get( up, ilambda+1, j, &rej )) ;
00103 check(cpl_image_set( img, 3, j+up_shift, flux ) );
00104 }
00105
00106 cleanup:
00107 return ;
00108 }
00109
00110 static void make_data_cube( xsh_pre_3d * pre_3d, xsh_pre * pre_down,
00111 xsh_pre * pre_cen, xsh_pre * pre_up )
00112 {
00113 int nx, ny, nz, i ;
00114 cpl_image * cur_img = NULL ;
00115 int up_shift=0;
00116 int cen_shift =0;
00117
00118 nx = xsh_pre_3d_get_nx( pre_3d ) ;
00119 ny = xsh_pre_3d_get_ny( pre_3d ) ;
00120 nz = xsh_pre_3d_get_nz( pre_3d ) ;
00121
00122 xsh_msg( "Build data cube: %d x %d x %d", nx, ny, nz);
00123
00124 for( i = 0 ; i<nz ; i++ ) {
00125
00126
00127 check( cur_img = cpl_image_new( nx, ny, CPL_TYPE_FLOAT ) ) ;
00128 check(fill_img( cur_img, i, pre_down->data, pre_cen->data, pre_up->data,
00129 up_shift,cen_shift)) ;
00130 check( xsh_image_3d_insert( pre_3d->data, cur_img, i ) ) ;
00131 xsh_free_image( &cur_img ) ;
00132
00133 check( cur_img = cpl_image_new( nx, ny, CPL_TYPE_FLOAT ) ) ;
00134 check(fill_img( cur_img, i, pre_down->errs, pre_cen->errs, pre_up->errs,
00135 up_shift,cen_shift)) ;
00136 check( xsh_image_3d_insert( pre_3d->errs, cur_img, i ) ) ;
00137 xsh_free_image( &cur_img ) ;
00138
00139 check( cur_img = cpl_image_new( nx, ny, CPL_TYPE_INT ) ) ;
00140 check(fill_img( cur_img, i, pre_down->qual, pre_cen->qual, pre_up->qual,
00141 up_shift,cen_shift)) ;
00142 check( xsh_image_3d_insert( pre_3d->qual, cur_img, i ) ) ;
00143 xsh_free_image( &cur_img ) ;
00144 }
00145
00146 cleanup:
00147 xsh_free_image( &cur_img ) ;
00148 return ;
00149 }
00150
00151
00152 cpl_frame* xsh_format( cpl_frameset *spectrum_frame_set,
00153 const char *result_name, xsh_instrument * instrument,
00154 const char* rec_prefix)
00155 {
00156 cpl_frame * result = NULL ;
00157
00158
00159
00160 xsh_pre * pre_down = NULL, * pre_cen = NULL, * pre_up = NULL ;
00161 cpl_frame * frame_down = NULL, * frame_cen = NULL, * frame_up = NULL ;
00162 int nslitlet = 3, nslit, nlambda ;
00163 int nslit_up, nslit_lo, nslit_cen;
00164 char tag[256];
00165 char pcatg[256];
00166 xsh_pre_3d * pre_3d = NULL ;
00167 double lambda_min, lambda_max, lambda_step ;
00168 double crval2 = 0.0, cdelt2=0.0;
00169
00170
00171 XSH_ASSURE_NOT_NULL( spectrum_frame_set ) ;
00172 XSH_ASSURE_NOT_NULL( result_name ) ;
00173 XSH_ASSURE_NOT_NULL( instrument ) ;
00174
00175 check( frame_down = cpl_frameset_get_frame( spectrum_frame_set, 0));
00176 check( pre_down = xsh_pre_load( frame_down, instrument));
00177 check( frame_cen = cpl_frameset_get_frame( spectrum_frame_set, 1));
00178 check( pre_cen = xsh_pre_load( frame_cen, instrument));
00179 check( frame_up = cpl_frameset_get_frame( spectrum_frame_set, 2));
00180 check( pre_up = xsh_pre_load( frame_up, instrument));
00181
00182
00183
00184 check(lambda_min=xsh_pfits_get_rectify_lambda_min( pre_down->data_header));
00185 check(lambda_max=xsh_pfits_get_rectify_lambda_max( pre_down->data_header));
00186 check(lambda_step=xsh_pfits_get_rectify_bin_lambda( pre_down->data_header));
00187 xsh_msg( "Rect Lambda min, max, bin: %lf, %lf, %lf", lambda_min, lambda_max,
00188 lambda_step) ;
00189
00190 nslit_lo = xsh_pre_get_ny( pre_down);
00191 nslit_up = xsh_pre_get_ny( pre_up);
00192 nslit_cen = xsh_pre_get_ny( pre_cen);
00193
00194 nslit = nslit_cen;
00195 check( crval2 = xsh_pfits_get_crval2(pre_cen->data_header));
00196 check( cdelt2 = xsh_pfits_get_cdelt2(pre_cen->data_header));
00197
00198 if (nslit_up > nslit_cen){
00199 nslit += nslit_up-nslit_cen;
00200 crval2 -= (nslit_up-nslit_cen)*cdelt2;
00201 }
00202 if (nslit_lo > nslit_cen){
00203 nslit += nslit_lo-nslit_cen;
00204 }
00205
00206 nlambda = xsh_pre_get_nx( pre_down);
00207
00208 xsh_msg("nslit : lo %d cen %d up %d",nslit_lo,nslit_cen,nslit_up);
00209
00210 check( pre_3d = xsh_pre_3d_new( nslitlet, nslit, nlambda));
00211 xsh_msg( "Pre_3d created: %dx%dx%d", nslitlet, nslit, nlambda);
00212
00213
00214
00215
00216
00217
00218 check( xsh_pre_flip( pre_down, 0));
00219 check( xsh_pre_flip( pre_up, 0));
00220
00221 make_data_cube( pre_3d, pre_down, pre_cen, pre_up);
00222
00223
00224 check( cpl_propertylist_append( pre_3d->data_header,
00225 pre_cen->data_header));
00226 check( cpl_propertylist_append( pre_3d->errs_header,
00227 pre_cen->errs_header));
00228 check( cpl_propertylist_append( pre_3d->qual_header,
00229 pre_cen->qual_header));
00230
00231 sprintf(pcatg,"%s_%s",rec_prefix,
00232 XSH_GET_TAG_FROM_ARM( XSH_MERGE3D_IFU, instrument));
00233
00234 xsh_msg( " Setting PRO.CATG '%s'", pcatg ) ;
00235 check( xsh_pfits_set_pcatg( pre_3d->data_header, pcatg));
00236 check( xsh_pfits_set_pcatg( pre_3d->errs_header, pcatg));
00237 check( xsh_pfits_set_pcatg( pre_3d->qual_header, pcatg));
00238
00239
00240
00241
00242 check( xsh_pfits_set_crpix1( pre_3d->data_header, 1.0));
00243 check( xsh_pfits_set_crpix1( pre_3d->errs_header, 1.0));
00244 check( xsh_pfits_set_crpix1( pre_3d->qual_header, 1.0));
00245
00246 check( xsh_pfits_set_crval1( pre_3d->data_header, -0.6));
00247 check( xsh_pfits_set_crval1( pre_3d->errs_header, -0.6));
00248 check( xsh_pfits_set_crval1( pre_3d->qual_header, -0.6));
00249
00250 check( xsh_pfits_set_cdelt1( pre_3d->data_header, 0.6));
00251 check( xsh_pfits_set_cdelt1( pre_3d->errs_header, 0.6));
00252 check( xsh_pfits_set_cdelt1( pre_3d->qual_header, 0.6));
00253
00254
00255 check( xsh_pfits_set_crval2( pre_3d->data_header, crval2));
00256 check( xsh_pfits_set_crval2( pre_3d->errs_header, crval2));
00257 check( xsh_pfits_set_crval2( pre_3d->qual_header, crval2));
00258
00259 check( xsh_pfits_set_crpix3( pre_3d->data_header, 0.5));
00260 check( xsh_pfits_set_crpix3( pre_3d->errs_header, 0.5));
00261 check( xsh_pfits_set_crpix3( pre_3d->qual_header, 0.5));
00262
00263 check( xsh_pfits_set_crval3( pre_3d->data_header, lambda_min));
00264 check( xsh_pfits_set_crval3( pre_3d->errs_header, lambda_min));
00265 check( xsh_pfits_set_crval3( pre_3d->qual_header, lambda_min));
00266
00267
00268 check( xsh_pfits_set_cdelt3( pre_3d->data_header, lambda_step));
00269 check( xsh_pfits_set_cdelt3( pre_3d->errs_header, lambda_step));
00270 check( xsh_pfits_set_cdelt3( pre_3d->qual_header, lambda_step));
00271
00272 check( xsh_pfits_set_ctype3( pre_3d->data_header, "LINEAR"));
00273 check( xsh_pfits_set_ctype3( pre_3d->errs_header, "LINEAR"));
00274 check( xsh_pfits_set_ctype3( pre_3d->qual_header, "LINEAR"));
00275
00276
00277 check(xsh_set_cd_matrix3d(pre_3d->data_header));
00278 check(xsh_set_cd_matrix3d(pre_3d->errs_header));
00279 check(xsh_set_cd_matrix3d(pre_3d->qual_header));
00280
00281 xsh_msg( "Saving %s", result_name) ;
00282
00283 check( result = xsh_pre_3d_save( pre_3d, result_name, 0));
00284
00285 sprintf(tag,"%s_%s",rec_prefix,
00286 XSH_GET_TAG_FROM_ARM( XSH_MERGE3D_IFU, instrument));
00287
00288 xsh_msg( " Setting TAG '%s'", tag);
00289 check( cpl_frame_set_tag( result, tag));
00290 check( cpl_frame_set_group( result, CPL_FRAME_GROUP_PRODUCT));
00291 check( cpl_frame_set_level( result, CPL_FRAME_LEVEL_FINAL));
00292 check(cpl_frame_set_type( result, CPL_FRAME_TYPE_IMAGE));
00293
00294 cleanup:
00295 xsh_pre_free( &pre_down);
00296 xsh_pre_free( &pre_cen);
00297 xsh_pre_free( &pre_up);
00298 xsh_pre_3d_free( &pre_3d);
00299 return result;
00300 }
00301
00302
00303
00310
00311 static int* create_sky_mask( cpl_frame *sky_line_frame, int size,
00312 double lambda_min, double lambda_step,
00313 xsh_instrument *instrument)
00314 {
00315 int *sky_mask = NULL;
00316 const char* skymask_name = NULL;
00317 cpl_table *skymask_table = NULL;
00318 float *skymask_data = NULL;
00319 int irow, nrow;
00320 double fwhm =0.0, sky_min, sky_max;
00321 int isky_min, isky_max, imask;
00322 double resolution;
00323
00324 XSH_CALLOC( sky_mask, int, size);
00325
00326 xsh_msg("%s %s", xsh_instrument_arm_tostring( instrument), xsh_instrument_mode_tostring( instrument));
00327 if ( sky_line_frame != NULL){
00328 resolution = xsh_resolution_get( instrument, 0);
00329 check( skymask_name = cpl_frame_get_filename( sky_line_frame));
00330 XSH_TABLE_LOAD( skymask_table, skymask_name);
00331
00332 check( xsh_sort_table_1( skymask_table, "WAVELENGTH", CPL_FALSE));
00333 check( skymask_data = cpl_table_get_data_float( skymask_table,
00334 "WAVELENGTH"));
00335 check( nrow = cpl_table_get_nrow( skymask_table));
00336
00337 xsh_msg_dbg_low("lambda min %f, step %f", lambda_min, lambda_step);
00338
00339 for( irow=0; irow < nrow; irow++){
00340 fwhm = skymask_data[irow]/resolution;
00341 sky_min = skymask_data[irow]-fwhm;
00342 sky_max = skymask_data[irow]+fwhm;
00343 isky_min = (int)xsh_round_double((sky_min-lambda_min)/lambda_step);
00344 isky_max = (int)xsh_round_double((sky_max-lambda_min)/lambda_step);
00345 for( imask=isky_min; imask <=isky_max; imask++){
00346 sky_mask[imask] = 1;
00347 }
00348 }
00349 }
00350 cleanup:
00351 if ( cpl_error_get_code() != CPL_ERROR_NONE){
00352 XSH_FREE( sky_mask);
00353 }
00354 XSH_TABLE_FREE( skymask_table);
00355 return sky_mask;
00356 }
00357
00358
00359
00366
00367 void xsh_center_cube( cpl_frame *cube_frame, cpl_frame *sky_line_frame,
00368 int chunk_size, xsh_instrument *instrument)
00369 {
00370 xsh_pre_3d *cube = NULL;
00371 xsh_image_3d *cube_data_img = NULL;
00372 int cube_x, cube_y, cube_z;
00373 float *cube_data = NULL;
00374 cpl_propertylist *header = NULL;
00375
00376 double crval2, crval3;
00377
00378
00379
00380
00381 double cdelt2, cdelt3;
00382 double *median = NULL;
00383 int y, z, zmed;
00384 cpl_vector *coadd_vect = NULL;
00385 cpl_vector *positions = NULL;
00386 double x0= 0.0,sigma =0.0, area=0.0, offset=0.0;
00387 int median_size, bad_fit, sky_line;
00388 cpl_vector *med_vect = NULL;
00389 double shift_z;
00390 int *sky_mask = NULL;
00391
00392 XSH_ASSURE_NOT_NULL( cube_frame);
00393 XSH_ASSURE_NOT_NULL( instrument);
00394
00395 check( cube = xsh_pre_3d_load( cube_frame));
00396 header = cube->data_header;
00397
00398 check( cube_data_img = xsh_pre_3d_get_data( cube));
00399 check( cube_x = xsh_image_3d_get_size_x( cube_data_img));
00400 check( cube_y = xsh_image_3d_get_size_y( cube_data_img));
00401 check( cube_z = xsh_image_3d_get_size_z( cube_data_img));
00402
00403
00404
00405
00406
00407
00408 check( crval2 = xsh_pfits_get_crval2( header));
00409 check( cdelt2 = xsh_pfits_get_cdelt2( header));
00410
00411
00412 check( crval3 = xsh_pfits_get_crval3( header));
00413 check( cdelt3 = xsh_pfits_get_cdelt3( header));
00414
00415 check( cube_data = (float*)xsh_image_3d_get_data( cube_data_img));
00416
00417
00418
00419 check( sky_mask = create_sky_mask( sky_line_frame, cube_z, crval3, cdelt3,
00420 instrument));
00421
00422 XSH_MALLOC( median, double, cube_z);
00423 median_size = 0;
00424 bad_fit = 0;
00425 sky_line = 0;
00426 check( coadd_vect = cpl_vector_new( cube_y));
00427 check( positions = cpl_vector_new( cube_y));
00428
00429 for( y=0; y<cube_y; y++){
00430 cpl_vector_set( positions, y, y);
00431 }
00432
00433 for(z=0; z< (cube_z-chunk_size); z+=chunk_size){
00434 for( y=0; y<cube_y; y++){
00435 cpl_vector_set( coadd_vect, y, 0);
00436 }
00437 for( zmed=z; zmed< (z+chunk_size); zmed++){
00438 if (sky_mask[zmed] == 0){
00439 for( y=0; y<cube_y; y++){
00440 double y_val;
00441
00442 y_val = cpl_vector_get( coadd_vect, y);
00443 y_val += cube_data[cube_x*cube_y*zmed+cube_x*y+1];
00444 cpl_vector_set( coadd_vect, y, y_val);
00445 }
00446 }
00447 else{
00448 sky_line++;
00449 }
00450 }
00451 cpl_vector_fit_gaussian( positions, NULL, coadd_vect, NULL,CPL_FIT_ALL,
00452 &x0,&sigma,&area,&offset,NULL,NULL,NULL);
00453
00454 if (cpl_error_get_code() != CPL_ERROR_NONE){
00455 xsh_error_reset();
00456 bad_fit++;
00457 }
00458 else{
00459 double slit_cen_fit;
00460
00461 slit_cen_fit = crval2+x0*cdelt2;
00462 median[median_size] = slit_cen_fit;
00463 median_size++;
00464 }
00465 }
00466 xsh_msg(" Statistics of gaussian fit bad %d lines, good %d lines, sky lines %d",
00467 bad_fit, median_size, sky_line);
00468 check( med_vect = cpl_vector_wrap( median_size, median));
00469 shift_z = cpl_vector_get_median( med_vect);
00470 xsh_msg(" Measured object shift from gaussian fit: %f arcsec\n", shift_z);
00471
00472
00473 crval2 += shift_z;
00474
00475 cleanup:
00476 xsh_pre_3d_free( &cube);
00477 XSH_FREE( sky_mask);
00478 XSH_FREE( median);
00479 xsh_free_vector( &positions);
00480 xsh_free_vector( &coadd_vect);
00481 xsh_unwrap_vector( &med_vect);
00482 return;
00483 }
00484
00485
00486
00487
00495
00496 cpl_frame* xsh_cube( cpl_frameset *merge2d_frameset,
00497 xsh_instrument * instrument,
00498 const char* rec_prefix)
00499 {
00500
00501 cpl_frame *down_frame = NULL, *cen_frame = NULL, *up_frame = NULL;
00502 cpl_frame *result = NULL;
00503 xsh_pre *pre_down = NULL, *pre_cen = NULL, *pre_up = NULL;
00504 int nslitlet = 3, nslit, nlambda;
00505 xsh_pre_3d * pre_3d = NULL;
00506 double crpix2=0.0, crval2=0.0, cdelt2=0.0;
00507 double crpix3=0.0, crval3=0.0, cdelt3=0.0;
00508 char pcatg[256];
00509 char result_name[256];
00510 double waveref, sref_down, sref_up, sref_cen;
00511
00512 XSH_ASSURE_NOT_NULL( merge2d_frameset);
00513 XSH_ASSURE_NOT_NULL( instrument);
00514 XSH_ASSURE_NOT_NULL( rec_prefix);
00515
00516 check( down_frame = cpl_frameset_get_frame( merge2d_frameset, 0));
00517 check( pre_down = xsh_pre_load( down_frame, instrument));
00518 check( cen_frame = cpl_frameset_get_frame( merge2d_frameset, 1));
00519 check( pre_cen = xsh_pre_load( cen_frame, instrument));
00520 check( up_frame = cpl_frameset_get_frame( merge2d_frameset, 2));
00521 check( pre_up = xsh_pre_load( up_frame, instrument));
00522
00523
00524 check( xsh_pre_flip( pre_down, 0));
00525 check( xsh_pre_flip( pre_up, 0));
00526
00527
00528
00529 check( crpix3 = xsh_pfits_get_crpix1( pre_cen->data_header));
00530 check( crval3 = xsh_pfits_get_crval1( pre_cen->data_header));
00531 check( cdelt3 = xsh_pfits_get_cdelt1( pre_cen->data_header));
00532
00533 check( nlambda = xsh_pre_get_nx( pre_down));
00534 check( nslit = xsh_pre_get_ny( pre_down));
00535
00536 check( pre_3d = xsh_pre_3d_new( nslitlet, nslit, nlambda));
00537 make_data_cube( pre_3d, pre_down, pre_cen, pre_up);
00538
00539
00540 check( cpl_propertylist_append( pre_3d->data_header,
00541 pre_cen->data_header));
00542 check( cpl_propertylist_append( pre_3d->errs_header,
00543 pre_cen->errs_header));
00544 check( cpl_propertylist_append( pre_3d->qual_header,
00545 pre_cen->qual_header));
00546
00547 sprintf(pcatg, "%s_%s",rec_prefix,
00548 XSH_GET_TAG_FROM_ARM( XSH_MERGE3D_IFU, instrument));
00549
00550 check( xsh_pfits_set_pcatg( pre_3d->data_header, pcatg));
00551 check( xsh_pfits_set_pcatg( pre_3d->errs_header, pcatg));
00552 check( xsh_pfits_set_pcatg( pre_3d->qual_header, pcatg));
00553
00554
00555 check( xsh_pfits_set_crpix1( pre_3d->data_header, 1.0));
00556 check( xsh_pfits_set_crpix1( pre_3d->errs_header, 1.0));
00557 check( xsh_pfits_set_crpix1( pre_3d->qual_header, 1.0));
00558
00559 check( xsh_pfits_set_crval1( pre_3d->data_header, -0.6));
00560 check( xsh_pfits_set_crval1( pre_3d->errs_header, -0.6));
00561 check( xsh_pfits_set_crval1( pre_3d->qual_header, -0.6));
00562
00563 check( xsh_pfits_set_cdelt1( pre_3d->data_header, 0.6));
00564 check( xsh_pfits_set_cdelt1( pre_3d->errs_header, 0.6));
00565 check( xsh_pfits_set_cdelt1( pre_3d->qual_header, 0.6));
00566
00567 check( xsh_pfits_set_cunit1( pre_3d->data_header, "arcsec"));
00568 check( xsh_pfits_set_cunit1( pre_3d->errs_header, "arcsec"));
00569 check( xsh_pfits_set_cunit1( pre_3d->qual_header, "arcsec"));
00570
00571
00572 check( crpix2 = xsh_pfits_get_crpix2(pre_cen->data_header));
00573 check( crval2 = xsh_pfits_get_crval2(pre_cen->data_header));
00574 check( cdelt2 = xsh_pfits_get_cdelt2(pre_cen->data_header));
00575
00576 check( xsh_pfits_set_crpix2( pre_3d->data_header, crpix2));
00577 check( xsh_pfits_set_crpix2( pre_3d->errs_header, crpix2));
00578 check( xsh_pfits_set_crpix2( pre_3d->qual_header, crpix2));
00579
00580 check( xsh_pfits_set_crval2( pre_3d->data_header, crval2));
00581 check( xsh_pfits_set_crval2( pre_3d->errs_header, crval2));
00582 check( xsh_pfits_set_crval2( pre_3d->qual_header, crval2));
00583
00584 check( xsh_pfits_set_cdelt2( pre_3d->data_header, cdelt2));
00585 check( xsh_pfits_set_cdelt2( pre_3d->errs_header, cdelt2));
00586 check( xsh_pfits_set_cdelt2( pre_3d->qual_header, cdelt2));
00587
00588
00589 check( xsh_pfits_set_cunit2( pre_3d->data_header, "arcsec"));
00590 check( xsh_pfits_set_cunit2( pre_3d->errs_header, "arcsec"));
00591 check( xsh_pfits_set_cunit2( pre_3d->qual_header, "arcsec"));
00592
00593
00594 check( crpix3 = xsh_pfits_get_crpix1( pre_cen->data_header));
00595
00596 check( xsh_pfits_set_crpix3( pre_3d->data_header, crpix3));
00597 check( xsh_pfits_set_crpix3( pre_3d->errs_header, crpix3));
00598 check( xsh_pfits_set_crpix3( pre_3d->qual_header, crpix3));
00599
00600 check( xsh_pfits_set_crval3( pre_3d->data_header, crval3));
00601 check( xsh_pfits_set_crval3( pre_3d->errs_header, crval3));
00602 check( xsh_pfits_set_crval3( pre_3d->qual_header, crval3));
00603
00604
00605 check( xsh_pfits_set_cdelt3( pre_3d->data_header, cdelt3));
00606 check( xsh_pfits_set_cdelt3( pre_3d->errs_header, cdelt3));
00607 check( xsh_pfits_set_cdelt3( pre_3d->qual_header, cdelt3));
00608
00609 check( xsh_pfits_set_ctype3( pre_3d->data_header, "LINEAR"));
00610 check( xsh_pfits_set_ctype3( pre_3d->errs_header, "LINEAR"));
00611 check( xsh_pfits_set_ctype3( pre_3d->qual_header, "LINEAR"));
00612
00613 check( xsh_pfits_set_cunit3( pre_3d->data_header, "nm"));
00614 check( xsh_pfits_set_cunit3( pre_3d->errs_header, "nm"));
00615 check( xsh_pfits_set_cunit3( pre_3d->qual_header, "nm"));
00616
00617
00618 check( xsh_set_cd_matrix3d( pre_3d->data_header));
00619 check( xsh_set_cd_matrix3d( pre_3d->errs_header));
00620 check( xsh_set_cd_matrix3d( pre_3d->qual_header));
00621
00622
00623
00624 waveref = xsh_pfits_get_shiftifu_lambdaref( pre_down->data_header);
00625 sref_down = xsh_pfits_get_shiftifu_slitref( pre_down->data_header);
00626 sref_cen = xsh_pfits_get_shiftifu_slitref( pre_cen->data_header);
00627 sref_up = xsh_pfits_get_shiftifu_slitref( pre_up->data_header);
00628
00629 if ( cpl_error_get_code() == CPL_ERROR_NONE){
00630 check( xsh_pfits_set_shiftifu_lambdaref( pre_3d->data_header, waveref));
00631 check( xsh_pfits_set_shiftifu_slitdownref( pre_3d->data_header, sref_down));
00632 check( xsh_pfits_set_shiftifu_slitcenref( pre_3d->data_header, sref_cen));
00633 check( xsh_pfits_set_shiftifu_slitupref( pre_3d->data_header, sref_up));
00634 }
00635 xsh_error_reset();
00636
00637 sprintf( result_name, "%s.fits", pcatg);
00638
00639 check( result = xsh_pre_3d_save( pre_3d, result_name, 1));
00640
00641 check( cpl_frame_set_tag( result, pcatg));
00642 check( cpl_frame_set_group( result, CPL_FRAME_GROUP_PRODUCT));
00643 check( cpl_frame_set_level( result, CPL_FRAME_LEVEL_FINAL));
00644 check(cpl_frame_set_type( result, CPL_FRAME_TYPE_IMAGE));
00645
00646 cleanup:
00647 if ( cpl_error_get_code() != CPL_ERROR_NONE){
00648 xsh_free_frame( &result);
00649 }
00650 xsh_pre_free( &pre_down);
00651 xsh_pre_free( &pre_cen);
00652 xsh_pre_free( &pre_up);
00653 xsh_pre_3d_free( &pre_3d);
00654 return result;
00655 }
00656
00657