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 #ifdef HAVE_CONFIG_H
00027 #include <config.h>
00028 #endif
00029
00030
00035
00036
00039
00040
00041
00042
00043 #include <xsh_data_image_3d.h>
00044 #include <xsh_data_pre_3d.h>
00045 #include <xsh_dump.h>
00046 #include <xsh_utils.h>
00047 #include <xsh_error.h>
00048 #include <xsh_msg.h>
00049 #include <xsh_pfits.h>
00050 #include <xsh_dfs.h>
00051 #include <math.h>
00052 #include <time.h>
00053 #include <cpl.h>
00054
00055
00056
00057
00066
00067 static void xsh_pre_3d_init(xsh_pre_3d * pre, cpl_propertylist * header)
00068 {
00069
00070
00071 XSH_ASSURE_NOT_NULL(pre);
00072 XSH_ASSURE_NOT_NULL(header);
00073
00074
00075 pre->data_header = header;
00076
00077
00078 check( pre->naxis1 = xsh_pfits_get_naxis1(pre->data_header));
00079 check( pre->naxis2 = xsh_pfits_get_naxis2(pre->data_header));
00080 check( pre->naxis3 = xsh_pfits_get_naxis3(pre->data_header));
00081
00082 cleanup:
00083 return;
00084 }
00085
00086
00087 void xsh_pre_3d_free( xsh_pre_3d ** pre_3d)
00088 {
00089 xsh_image_3d *img = NULL;
00090 cpl_propertylist *pl = NULL;
00091
00092 if ( pre_3d != NULL && *pre_3d != NULL) {
00093 img = (*pre_3d)->data;
00094 xsh_image_3d_free( &img);
00095 img = (*pre_3d)->errs;
00096 xsh_image_3d_free( &img);
00097 img = (*pre_3d)->qual;
00098 xsh_image_3d_free( &img);
00099
00100 pl = (*pre_3d)->data_header;
00101 xsh_free_propertylist( &pl);
00102 pl = (*pre_3d)->errs_header;
00103 xsh_free_propertylist( &pl);
00104 pl = (*pre_3d)->qual_header;
00105 xsh_free_propertylist( &pl);
00106
00107 XSH_FREE( *pre_3d);
00108 *pre_3d = NULL;
00109 }
00110 }
00111
00112
00128
00129 xsh_pre_3d * xsh_pre_3d_new (int nx, int ny, int nz)
00130 {
00131 xsh_pre_3d *result = NULL;
00132
00133 assure (nx > 0 && ny > 0 && nz > 0, CPL_ERROR_ILLEGAL_INPUT,
00134 "Illegal image size: %dx%dx%d", nx, ny, nz );
00135
00136 XSH_CALLOC( result, xsh_pre_3d, 1);
00137
00138 result->nx = nx;
00139 result->ny = ny;
00140 result->nz = nz;
00141
00142 check( result->data = xsh_image_3d_new (nx, ny, nz, XSH_PRE_DATA_TYPE));
00143 check( result->errs = xsh_image_3d_new (nx, ny, nz, XSH_PRE_ERRS_TYPE));
00144 check( result->qual = xsh_image_3d_new (nx, ny, nz, XSH_PRE_QUAL_TYPE));
00145 check( result->data_header = cpl_propertylist_new());
00146 check( result->errs_header = cpl_propertylist_new());
00147 check( result->qual_header = cpl_propertylist_new());
00148
00149 cleanup:
00150 if (cpl_error_get_code () != CPL_ERROR_NONE) {
00151 xsh_pre_3d_free ( &result);
00152 result = NULL;
00153 }
00154 return result;
00155 }
00156
00157
00165
00166 xsh_pre_3d * xsh_pre_3d_load( cpl_frame * frame)
00167 {
00168
00169 xsh_pre_3d * result = NULL;
00170
00171 const char *filename = NULL;
00172 int extension = 0;
00173 cpl_propertylist * data_header = NULL;
00174
00175
00176 XSH_ASSURE_NOT_NULL( frame);
00177 XSH_ASSURE_NOT_NULL( cpl_frame_get_tag (frame));
00178
00179 check ( filename = cpl_frame_get_filename (frame));
00180
00181
00182 XSH_CALLOC( result, xsh_pre_3d, 1);
00183
00184
00185 check(result->group = cpl_frame_get_group(frame));
00186
00187
00188 XSH_ASSURE_NOT_ILLEGAL(cpl_frame_get_nextensions(frame) == 2);
00189
00190
00191 extension = 0;
00192 check_msg (data_header = cpl_propertylist_load (filename, extension),
00193 "Cannot read the FITS header from '%s' extension %d",
00194 filename, extension);
00195 check(xsh_pre_3d_init( result, data_header));
00196
00197 result->nx = result->naxis1;
00198 result->ny = result->naxis2;
00199 result->nz = result->naxis3;
00200
00201 xsh_msg( "Pre_3d_load: %d x %d x %d", result->nx, result->ny, result->nz) ;
00202
00203 check_msg (result->data = xsh_image_3d_load (filename, XSH_PRE_DATA_TYPE, 0 ),
00204 "Error loading image from %s extension 0", filename);
00205
00206
00207 check_msg (result->errs_header = cpl_propertylist_load (filename,1),
00208 "Cannot read the FITS header from '%s' extension 1",filename);
00209
00210
00211 check_msg (result->errs = xsh_image_3d_load (filename, XSH_PRE_ERRS_TYPE, 1 ),
00212 "Error loading image from %s extension 1", filename);
00213
00214 check_msg (result->qual_header = cpl_propertylist_load (filename,2),
00215 "Cannot read the FITS header from '%s' extension 2",filename);
00216
00217
00218 check_msg (result->qual = xsh_image_3d_load (filename, XSH_PRE_QUAL_TYPE, 2 ),
00219 "Error loading image from %s extension 2", filename);
00220
00221 cleanup:
00222 if (cpl_error_get_code () != CPL_ERROR_NONE) {
00223 xsh_error_msg("can't load frame %s",cpl_frame_get_filename(frame));
00224 xsh_pre_3d_free( &result);
00225 }
00226 return result;
00227 }
00228
00229
00235
00236 int xsh_pre_3d_get_nx( const xsh_pre_3d * pre)
00237 {
00238 int result = 0;
00239
00240 XSH_ASSURE_NOT_NULL( pre );
00241 result = pre->nx;
00242
00243 cleanup:
00244 return result;
00245 }
00246
00247
00253
00254 int xsh_pre_3d_get_ny( const xsh_pre_3d * pre)
00255 {
00256 int result = 0;
00257
00258 XSH_ASSURE_NOT_NULL( pre );
00259 result = pre->ny;
00260
00261 cleanup:
00262 return result;
00263 }
00264
00265
00271
00272 int xsh_pre_3d_get_nz( const xsh_pre_3d * pre)
00273 {
00274 int result = 0 ;
00275
00276 XSH_ASSURE_NOT_NULL( pre );
00277 result = pre->nz ;
00278
00279 cleanup:
00280 return result;
00281 }
00282
00283
00289
00290 xsh_image_3d * xsh_pre_3d_get_data( xsh_pre_3d * pre_3d )
00291 {
00292 xsh_image_3d *data = NULL;
00293
00294 XSH_ASSURE_NOT_NULL(pre_3d);
00295 data = pre_3d->data;
00296
00297 cleanup:
00298 return data;
00299 }
00300
00306
00307 xsh_image_3d * xsh_pre_3d_get_errs( xsh_pre_3d * pre_3d )
00308 {
00309 xsh_image_3d *data = NULL;
00310
00311 XSH_ASSURE_NOT_NULL(pre_3d);
00312 data = pre_3d->errs;
00313
00314 cleanup:
00315 return data;
00316 }
00317
00323
00324 xsh_image_3d * xsh_pre_3d_get_qual( xsh_pre_3d * pre_3d )
00325 {
00326 xsh_image_3d *data = NULL;
00327
00328 XSH_ASSURE_NOT_NULL(pre_3d);
00329 data = pre_3d->qual;
00330
00331 cleanup:
00332 return data;
00333 }
00334
00335
00336
00344
00345 cpl_frame * xsh_pre_3d_save (const xsh_pre_3d * pre, const char *filename,
00346 int temp )
00347 {
00348 cpl_frame * product_frame = NULL;
00349
00350 XSH_ASSURE_NOT_NULL(pre);
00351 XSH_ASSURE_NOT_NULL(filename);
00352
00353
00354 check_msg(xsh_image_3d_save( pre->data, filename,
00355 pre->data_header, CPL_IO_DEFAULT),
00356 "Could not save data to %s extension 0", filename);
00357 check_msg (xsh_image_3d_save( pre->errs, filename,
00358 pre->errs_header, CPL_IO_EXTEND),
00359 "Could not save errs to %s extension 1", filename);
00360 check_msg (xsh_image_3d_save( pre->qual, filename,
00361 pre->qual_header, CPL_IO_EXTEND),
00362 "Could not save qual to %s extension 2", filename);
00363
00364 product_frame = cpl_frame_new ();
00365 XSH_ASSURE_NOT_NULL( product_frame);
00366
00367 check( cpl_frame_set_filename (product_frame, filename) ) ;
00368 check( cpl_frame_set_type (product_frame, CPL_FRAME_TYPE_IMAGE) ) ;
00369 if ( temp != 0 ) {
00370 check( cpl_frame_set_level( product_frame,
00371 CPL_FRAME_LEVEL_TEMPORARY));
00372 xsh_add_temporary_file( filename ) ;
00373 }
00374
00375 cleanup:
00376 if (cpl_error_get_code () != CPL_ERROR_NONE) {
00377 xsh_free_frame(&product_frame);
00378 product_frame = NULL;
00379 }
00380 return product_frame;
00381 }