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 xsh_image_3d * flux_3d = NULL, * errs_3d = NULL, * qual_3d = NULL ;
00158 xsh_pre * pre_down = NULL, * pre_cen = NULL, * pre_up = NULL ;
00159 cpl_frame * frame_down = NULL, * frame_cen = NULL, * frame_up = NULL ;
00160 int nslitlet = 3, nslit, nlambda ;
00161 int nslit_up, nslit_lo, nslit_cen;
00162 char tag[80];
00163 char pcatg[80];
00164 xsh_pre_3d * pre_3d = NULL ;
00165 double lambda_min, lambda_max, lambda_step ;
00166 double crval2 = 0.0, cdelt2=0.0;
00167
00168
00169 XSH_ASSURE_NOT_NULL( spectrum_frame_set ) ;
00170 XSH_ASSURE_NOT_NULL( result_name ) ;
00171 XSH_ASSURE_NOT_NULL( instrument ) ;
00172
00173 check( frame_down = cpl_frameset_get_frame( spectrum_frame_set, 0));
00174 check( pre_down = xsh_pre_load( frame_down, instrument));
00175 check( frame_cen = cpl_frameset_get_frame( spectrum_frame_set, 1));
00176 check( pre_cen = xsh_pre_load( frame_cen, instrument));
00177 check( frame_up = cpl_frameset_get_frame( spectrum_frame_set, 2));
00178 check( pre_up = xsh_pre_load( frame_up, instrument));
00179
00180
00181
00182 check(lambda_min=xsh_pfits_get_rectify_lambda_min( pre_down->data_header));
00183 check(lambda_max=xsh_pfits_get_rectify_lambda_max( pre_down->data_header));
00184 check(lambda_step=xsh_pfits_get_rectify_bin_lambda( pre_down->data_header));
00185 xsh_msg( "Rect Lambda min, max, bin: %lf, %lf, %lf", lambda_min, lambda_max,
00186 lambda_step) ;
00187
00188 nslit_lo = xsh_pre_get_ny( pre_down);
00189 nslit_up = xsh_pre_get_ny( pre_up);
00190 nslit_cen = xsh_pre_get_ny( pre_cen);
00191
00192 nslit = nslit_cen;
00193 check( crval2 = xsh_pfits_get_crval2(pre_cen->data_header));
00194 check( cdelt2 = xsh_pfits_get_cdelt2(pre_cen->data_header));
00195
00196 if (nslit_up > nslit_cen){
00197 nslit += nslit_up-nslit_cen;
00198 crval2 -= (nslit_up-nslit_cen)*cdelt2;
00199 }
00200 if (nslit_lo > nslit_cen){
00201 nslit += nslit_lo-nslit_cen;
00202 }
00203
00204 nlambda = xsh_pre_get_nx( pre_down);
00205
00206 xsh_msg("nslit : lo %d cen %d up %d",nslit_lo,nslit_cen,nslit_up);
00207
00208 check( pre_3d = xsh_pre_3d_new( nslitlet, nslit, nlambda));
00209 xsh_msg( "Pre_3d created: %dx%dx%d", nslitlet, nslit, nlambda);
00210
00211 check( flux_3d = xsh_pre_3d_get_data( pre_3d));
00212 check( errs_3d = xsh_pre_3d_get_errs( pre_3d));
00213 check( qual_3d = xsh_pre_3d_get_qual( pre_3d));
00214
00215
00216 check( xsh_pre_flip( pre_down, 0));
00217 check( xsh_pre_flip( pre_up, 0));
00218
00219 make_data_cube( pre_3d, pre_down, pre_cen, pre_up);
00220
00221
00222 check( cpl_propertylist_append( pre_3d->data_header,
00223 pre_cen->data_header));
00224 check( cpl_propertylist_append( pre_3d->errs_header,
00225 pre_cen->errs_header));
00226 check( cpl_propertylist_append( pre_3d->qual_header,
00227 pre_cen->qual_header));
00228
00229 sprintf(pcatg,"%s_%s",rec_prefix,
00230 XSH_GET_TAG_FROM_ARM( XSH_MERGE3D_IFU, instrument));
00231
00232 xsh_msg( " Setting PRO.CATG '%s'", pcatg ) ;
00233 check( xsh_pfits_set_pcatg( pre_3d->data_header, pcatg));
00234 check( xsh_pfits_set_pcatg( pre_3d->errs_header, pcatg));
00235 check( xsh_pfits_set_pcatg( pre_3d->qual_header, pcatg));
00236
00237
00238
00239
00240 check( xsh_pfits_set_crpix1( pre_3d->data_header, 1.0));
00241 check( xsh_pfits_set_crpix1( pre_3d->errs_header, 1.0));
00242 check( xsh_pfits_set_crpix1( pre_3d->qual_header, 1.0));
00243
00244 check( xsh_pfits_set_crval1( pre_3d->data_header, -0.6));
00245 check( xsh_pfits_set_crval1( pre_3d->errs_header, -0.6));
00246 check( xsh_pfits_set_crval1( pre_3d->qual_header, -0.6));
00247
00248 check( xsh_pfits_set_cdelt1( pre_3d->data_header, 0.6));
00249 check( xsh_pfits_set_cdelt1( pre_3d->errs_header, 0.6));
00250 check( xsh_pfits_set_cdelt1( pre_3d->qual_header, 0.6));
00251
00252
00253 check( xsh_pfits_set_crval2( pre_3d->data_header, crval2));
00254 check( xsh_pfits_set_crval2( pre_3d->errs_header, crval2));
00255 check( xsh_pfits_set_crval2( pre_3d->qual_header, crval2));
00256
00257 check( xsh_pfits_set_crpix3( pre_3d->data_header, 0.5));
00258 check( xsh_pfits_set_crpix3( pre_3d->errs_header, 0.5));
00259 check( xsh_pfits_set_crpix3( pre_3d->qual_header, 0.5));
00260
00261 check( xsh_pfits_set_crval3( pre_3d->data_header, lambda_min));
00262 check( xsh_pfits_set_crval3( pre_3d->errs_header, lambda_min));
00263 check( xsh_pfits_set_crval3( pre_3d->qual_header, lambda_min));
00264
00265
00266 check( xsh_pfits_set_cdelt3( pre_3d->data_header, lambda_step));
00267 check( xsh_pfits_set_cdelt3( pre_3d->errs_header, lambda_step));
00268 check( xsh_pfits_set_cdelt3( pre_3d->qual_header, lambda_step));
00269
00270 check( xsh_pfits_set_ctype3( pre_3d->data_header, "LINEAR"));
00271 check( xsh_pfits_set_ctype3( pre_3d->errs_header, "LINEAR"));
00272 check( xsh_pfits_set_ctype3( pre_3d->qual_header, "LINEAR"));
00273
00274
00275 check(xsh_set_cd_matrix3d(pre_3d->data_header));
00276 check(xsh_set_cd_matrix3d(pre_3d->errs_header));
00277 check(xsh_set_cd_matrix3d(pre_3d->qual_header));
00278
00279 xsh_msg( "Saving %s", result_name) ;
00280
00281 check( result = xsh_pre_3d_save( pre_3d, result_name, 0));
00282
00283 sprintf(tag,"%s_%s",rec_prefix,
00284 XSH_GET_TAG_FROM_ARM( XSH_MERGE3D_IFU, instrument));
00285
00286 xsh_msg( " Setting TAG '%s'", tag);
00287 check( cpl_frame_set_tag( result, tag));
00288 check( cpl_frame_set_group( result, CPL_FRAME_GROUP_PRODUCT));
00289 check( cpl_frame_set_level( result, CPL_FRAME_LEVEL_FINAL));
00290 check(cpl_frame_set_type( result, CPL_FRAME_TYPE_IMAGE));
00291
00292 cleanup:
00293 xsh_pre_free( &pre_down);
00294 xsh_pre_free( &pre_cen);
00295 xsh_pre_free( &pre_up);
00296 xsh_pre_3d_free( &pre_3d);
00297 return result;
00298 }
00299
00300
00301
00308
00309 static int* create_sky_mask( cpl_frame *sky_line_frame, int size,
00310 double lambda_min, double lambda_step,
00311 xsh_instrument *instrument)
00312 {
00313 int *sky_mask = NULL;
00314 const char* skymask_name = NULL;
00315 cpl_table *skymask_table = NULL;
00316 float *skymask_data = NULL;
00317 int irow, nrow;
00318 double fwhm =0.0, sky_min, sky_max;
00319 int isky_min, isky_max, imask;
00320 double resolution;
00321
00322 XSH_CALLOC( sky_mask, int, size);
00323
00324 xsh_msg("%s %s", xsh_instrument_arm_tostring( instrument), xsh_instrument_mode_tostring( instrument));
00325 if ( sky_line_frame != NULL){
00326 resolution = xsh_resolution_get( instrument, 0);
00327 check( skymask_name = cpl_frame_get_filename( sky_line_frame));
00328 XSH_TABLE_LOAD( skymask_table, skymask_name);
00329
00330 check( xsh_sort_table_1( skymask_table, "WAVELENGTH", CPL_FALSE));
00331 check( skymask_data = cpl_table_get_data_float( skymask_table,
00332 "WAVELENGTH"));
00333 check( nrow = cpl_table_get_nrow( skymask_table));
00334
00335 xsh_msg_dbg_low("lambda min %f, step %f", lambda_min, lambda_step);
00336
00337 for( irow=0; irow < nrow; irow++){
00338 fwhm = skymask_data[irow]/resolution;
00339 sky_min = skymask_data[irow]-fwhm;
00340 sky_max = skymask_data[irow]+fwhm;
00341 isky_min = (int)xsh_round_double((sky_min-lambda_min)/lambda_step);
00342 isky_max = (int)xsh_round_double((sky_max-lambda_min)/lambda_step);
00343 for( imask=isky_min; imask <=isky_max; imask++){
00344 sky_mask[imask] = 1;
00345 }
00346 }
00347 }
00348 cleanup:
00349 if ( cpl_error_get_code() != CPL_ERROR_NONE){
00350 XSH_FREE( sky_mask);
00351 }
00352 XSH_TABLE_FREE( skymask_table);
00353 return sky_mask;
00354 }
00355
00356
00357
00364
00365 void xsh_center_cube( cpl_frame *cube_frame, cpl_frame *sky_line_frame,
00366 int chunk_size, xsh_instrument *instrument)
00367 {
00368 xsh_pre_3d *cube = NULL;
00369 xsh_image_3d *cube_data_img = NULL;
00370 int cube_x, cube_y, cube_z;
00371 float *cube_data = NULL;
00372 cpl_propertylist *header = NULL;
00373 double crval1, crval2, crval3;
00374 double crpix1, crpix2, crpix3;
00375 double cdelt1, cdelt2, cdelt3;
00376 double *median = NULL;
00377 int y, z, zmed;
00378 cpl_vector *coadd_vect = NULL;
00379 cpl_vector *positions = NULL;
00380 double x0= 0.0,sigma =0.0, area=0.0, offset=0.0;
00381 int median_size, bad_fit, sky_line;
00382 cpl_vector *med_vect = NULL;
00383 double shift_z;
00384 int *sky_mask = NULL;
00385
00386 XSH_ASSURE_NOT_NULL( cube_frame);
00387 XSH_ASSURE_NOT_NULL( instrument);
00388
00389 check( cube = xsh_pre_3d_load( cube_frame));
00390 header = cube->data_header;
00391
00392 check( cube_data_img = xsh_pre_3d_get_data( cube));
00393 check( cube_x = xsh_image_3d_get_size_x( cube_data_img));
00394 check( cube_y = xsh_image_3d_get_size_y( cube_data_img));
00395 check( cube_z = xsh_image_3d_get_size_z( cube_data_img));
00396
00397 check( crpix1 = xsh_pfits_get_crpix1( header));
00398 check( crval1 = xsh_pfits_get_crval1( header));
00399 check( cdelt1 = xsh_pfits_get_cdelt1( header));
00400
00401 check( crpix2 = xsh_pfits_get_crpix2( header));
00402 check( crval2 = xsh_pfits_get_crval2( header));
00403 check( cdelt2 = xsh_pfits_get_cdelt2( header));
00404
00405 check( crpix3 = xsh_pfits_get_crpix3( header));
00406 check( crval3 = xsh_pfits_get_crval3( header));
00407 check( cdelt3 = xsh_pfits_get_cdelt3( header));
00408
00409 check( cube_data = (float*)xsh_image_3d_get_data( cube_data_img));
00410
00411
00412
00413 check( sky_mask = create_sky_mask( sky_line_frame, cube_z, crval3, cdelt3,
00414 instrument));
00415
00416 XSH_MALLOC( median, double, cube_z);
00417 median_size = 0;
00418 bad_fit = 0;
00419 sky_line = 0;
00420 check( coadd_vect = cpl_vector_new( cube_y));
00421 check( positions = cpl_vector_new( cube_y));
00422
00423 for( y=0; y<cube_y; y++){
00424 cpl_vector_set( positions, y, y);
00425 }
00426
00427 for(z=0; z< (cube_z-chunk_size); z+=chunk_size){
00428 for( y=0; y<cube_y; y++){
00429 cpl_vector_set( coadd_vect, y, 0);
00430 }
00431 for( zmed=z; zmed< (z+chunk_size); zmed++){
00432 if (sky_mask[zmed] == 0){
00433 for( y=0; y<cube_y; y++){
00434 double y_val;
00435
00436 y_val = cpl_vector_get( coadd_vect, y);
00437 y_val += cube_data[cube_x*cube_y*zmed+cube_x*y+1];
00438 cpl_vector_set( coadd_vect, y, y_val);
00439 }
00440 }
00441 else{
00442 sky_line++;
00443 }
00444 }
00445 cpl_vector_fit_gaussian( positions, NULL, coadd_vect, NULL,CPL_FIT_ALL,
00446 &x0,&sigma,&area,&offset,NULL,NULL,NULL);
00447
00448 if (cpl_error_get_code() != CPL_ERROR_NONE){
00449 xsh_error_reset();
00450 bad_fit++;
00451 }
00452 else{
00453 double slit_cen_fit;
00454
00455 slit_cen_fit = crval2+x0*cdelt2;
00456 median[median_size] = slit_cen_fit;
00457 median_size++;
00458 }
00459 }
00460 xsh_msg(" Statistics of gaussian fit bad %d lines, good %d lines, sky lines %d",
00461 bad_fit, median_size, sky_line);
00462 check( med_vect = cpl_vector_wrap( median_size, median));
00463 shift_z = cpl_vector_get_median( med_vect);
00464 xsh_msg(" Measured object shift from gaussian fit: %f arcsec\n", shift_z);
00465
00466
00467 crval2 += shift_z;
00468
00469 cleanup:
00470 xsh_pre_3d_free( &cube);
00471 XSH_FREE( sky_mask);
00472 XSH_FREE( median);
00473 xsh_free_vector( &positions);
00474 xsh_free_vector( &coadd_vect);
00475 xsh_unwrap_vector( &med_vect);
00476 return;
00477 }
00478
00479
00480
00481
00489
00490 cpl_frame* xsh_cube( cpl_frameset *merge2d_frameset,
00491 xsh_instrument * instrument,
00492 const char* rec_prefix)
00493 {
00494
00495 cpl_frame *down_frame = NULL, *cen_frame = NULL, *up_frame = NULL;
00496 cpl_frame *result = NULL;
00497 xsh_pre *pre_down = NULL, *pre_cen = NULL, *pre_up = NULL;
00498 int nslitlet = 3, nslit, nlambda;
00499 xsh_pre_3d * pre_3d = NULL;
00500 double crpix2=0.0, crval2=0.0, cdelt2=0.0;
00501 double crpix3=0.0, crval3=0.0, cdelt3=0.0;
00502 char pcatg[80];
00503 char result_name[80];
00504 double waveref, sref_down, sref_up, sref_cen;
00505
00506 XSH_ASSURE_NOT_NULL( merge2d_frameset);
00507 XSH_ASSURE_NOT_NULL( instrument);
00508 XSH_ASSURE_NOT_NULL( rec_prefix);
00509
00510 check( down_frame = cpl_frameset_get_frame( merge2d_frameset, 0));
00511 check( pre_down = xsh_pre_load( down_frame, instrument));
00512 check( cen_frame = cpl_frameset_get_frame( merge2d_frameset, 1));
00513 check( pre_cen = xsh_pre_load( cen_frame, instrument));
00514 check( up_frame = cpl_frameset_get_frame( merge2d_frameset, 2));
00515 check( pre_up = xsh_pre_load( up_frame, instrument));
00516
00517
00518 check( xsh_pre_flip( pre_down, 0));
00519 check( xsh_pre_flip( pre_up, 0));
00520
00521
00522
00523 check( crpix3 = xsh_pfits_get_crpix1( pre_cen->data_header));
00524 check( crval3 = xsh_pfits_get_crval1( pre_cen->data_header));
00525 check( cdelt3 = xsh_pfits_get_cdelt1( pre_cen->data_header));
00526
00527 check( nlambda = xsh_pre_get_nx( pre_down));
00528 check( nslit = xsh_pre_get_ny( pre_down));
00529
00530 check( pre_3d = xsh_pre_3d_new( nslitlet, nslit, nlambda));
00531 make_data_cube( pre_3d, pre_down, pre_cen, pre_up);
00532
00533
00534 check( cpl_propertylist_append( pre_3d->data_header,
00535 pre_cen->data_header));
00536 check( cpl_propertylist_append( pre_3d->errs_header,
00537 pre_cen->errs_header));
00538 check( cpl_propertylist_append( pre_3d->qual_header,
00539 pre_cen->qual_header));
00540
00541 sprintf(pcatg, "%s_%s",rec_prefix,
00542 XSH_GET_TAG_FROM_ARM( XSH_MERGE3D_IFU, instrument));
00543
00544 check( xsh_pfits_set_pcatg( pre_3d->data_header, pcatg));
00545 check( xsh_pfits_set_pcatg( pre_3d->errs_header, pcatg));
00546 check( xsh_pfits_set_pcatg( pre_3d->qual_header, pcatg));
00547
00548
00549 check( xsh_pfits_set_crpix1( pre_3d->data_header, 1.0));
00550 check( xsh_pfits_set_crpix1( pre_3d->errs_header, 1.0));
00551 check( xsh_pfits_set_crpix1( pre_3d->qual_header, 1.0));
00552
00553 check( xsh_pfits_set_crval1( pre_3d->data_header, -0.6));
00554 check( xsh_pfits_set_crval1( pre_3d->errs_header, -0.6));
00555 check( xsh_pfits_set_crval1( pre_3d->qual_header, -0.6));
00556
00557 check( xsh_pfits_set_cdelt1( pre_3d->data_header, 0.6));
00558 check( xsh_pfits_set_cdelt1( pre_3d->errs_header, 0.6));
00559 check( xsh_pfits_set_cdelt1( pre_3d->qual_header, 0.6));
00560
00561 check( xsh_pfits_set_cunit1( pre_3d->data_header, "arcsec"));
00562 check( xsh_pfits_set_cunit1( pre_3d->errs_header, "arcsec"));
00563 check( xsh_pfits_set_cunit1( pre_3d->qual_header, "arcsec"));
00564
00565
00566 check( crpix2 = xsh_pfits_get_crpix2(pre_cen->data_header));
00567 check( crval2 = xsh_pfits_get_crval2(pre_cen->data_header));
00568 check( cdelt2 = xsh_pfits_get_cdelt2(pre_cen->data_header));
00569
00570 check( xsh_pfits_set_crpix2( pre_3d->data_header, crpix2));
00571 check( xsh_pfits_set_crpix2( pre_3d->errs_header, crpix2));
00572 check( xsh_pfits_set_crpix2( pre_3d->qual_header, crpix2));
00573
00574 check( xsh_pfits_set_crval2( pre_3d->data_header, crval2));
00575 check( xsh_pfits_set_crval2( pre_3d->errs_header, crval2));
00576 check( xsh_pfits_set_crval2( pre_3d->qual_header, crval2));
00577
00578 check( xsh_pfits_set_cdelt2( pre_3d->data_header, cdelt2));
00579 check( xsh_pfits_set_cdelt2( pre_3d->errs_header, cdelt2));
00580 check( xsh_pfits_set_cdelt2( pre_3d->qual_header, cdelt2));
00581
00582
00583 check( xsh_pfits_set_cunit2( pre_3d->data_header, "arcsec"));
00584 check( xsh_pfits_set_cunit2( pre_3d->errs_header, "arcsec"));
00585 check( xsh_pfits_set_cunit2( pre_3d->qual_header, "arcsec"));
00586
00587
00588 check( crpix3 = xsh_pfits_get_crpix1( pre_cen->data_header));
00589
00590 check( xsh_pfits_set_crpix3( pre_3d->data_header, crpix3));
00591 check( xsh_pfits_set_crpix3( pre_3d->errs_header, crpix3));
00592 check( xsh_pfits_set_crpix3( pre_3d->qual_header, crpix3));
00593
00594 check( xsh_pfits_set_crval3( pre_3d->data_header, crval3));
00595 check( xsh_pfits_set_crval3( pre_3d->errs_header, crval3));
00596 check( xsh_pfits_set_crval3( pre_3d->qual_header, crval3));
00597
00598
00599 check( xsh_pfits_set_cdelt3( pre_3d->data_header, cdelt3));
00600 check( xsh_pfits_set_cdelt3( pre_3d->errs_header, cdelt3));
00601 check( xsh_pfits_set_cdelt3( pre_3d->qual_header, cdelt3));
00602
00603 check( xsh_pfits_set_ctype3( pre_3d->data_header, "LINEAR"));
00604 check( xsh_pfits_set_ctype3( pre_3d->errs_header, "LINEAR"));
00605 check( xsh_pfits_set_ctype3( pre_3d->qual_header, "LINEAR"));
00606
00607 check( xsh_pfits_set_cunit3( pre_3d->data_header, "nm"));
00608 check( xsh_pfits_set_cunit3( pre_3d->errs_header, "nm"));
00609 check( xsh_pfits_set_cunit3( pre_3d->qual_header, "nm"));
00610
00611
00612 check( xsh_set_cd_matrix3d( pre_3d->data_header));
00613 check( xsh_set_cd_matrix3d( pre_3d->errs_header));
00614 check( xsh_set_cd_matrix3d( pre_3d->qual_header));
00615
00616
00617
00618 waveref = xsh_pfits_get_shiftifu_lambdaref( pre_down->data_header);
00619 sref_down = xsh_pfits_get_shiftifu_slitref( pre_down->data_header);
00620 sref_cen = xsh_pfits_get_shiftifu_slitref( pre_cen->data_header);
00621 sref_up = xsh_pfits_get_shiftifu_slitref( pre_up->data_header);
00622
00623 if ( cpl_error_get_code() == CPL_ERROR_NONE){
00624 check( xsh_pfits_set_shiftifu_lambdaref( pre_3d->data_header, waveref));
00625 check( xsh_pfits_set_shiftifu_slitdownref( pre_3d->data_header, sref_down));
00626 check( xsh_pfits_set_shiftifu_slitcenref( pre_3d->data_header, sref_cen));
00627 check( xsh_pfits_set_shiftifu_slitupref( pre_3d->data_header, sref_up));
00628 }
00629 xsh_error_reset();
00630
00631 sprintf( result_name, "%s.fits", pcatg);
00632
00633 check( result = xsh_pre_3d_save( pre_3d, result_name, 1));
00634
00635 check( cpl_frame_set_tag( result, pcatg));
00636 check( cpl_frame_set_group( result, CPL_FRAME_GROUP_PRODUCT));
00637 check( cpl_frame_set_level( result, CPL_FRAME_LEVEL_FINAL));
00638 check(cpl_frame_set_type( result, CPL_FRAME_TYPE_IMAGE));
00639
00640 cleanup:
00641 if ( cpl_error_get_code() != CPL_ERROR_NONE){
00642 xsh_free_frame( &result);
00643 }
00644 xsh_pre_free( &pre_down);
00645 xsh_pre_free( &pre_cen);
00646 xsh_pre_free( &pre_up);
00647 xsh_pre_3d_free( &pre_3d);
00648 return result;
00649 }
00650
00651