35 #include <cxmessages.h>
36 #include <cxstrutils.h>
39 #include <cpl_parameterlist.h>
40 #include <cpl_propertylist.h>
41 #include <cpl_image.h>
45 #include "gimessages.h"
46 #include "gifiberutils.h"
47 #include "gigrating.h"
48 #include "giwlsolution.h"
49 #include "giextraction.h"
50 #include "girebinning.h"
51 #include "gitransmission.h"
63 _giraffe_transmission_apply(cpl_image *spectra, cpl_table *fibers)
71 cxdouble *pixels = NULL;
74 cx_assert(spectra != NULL);
75 cx_assert(fibers != NULL);
77 nx = cpl_image_get_size_x(spectra);
78 ny = cpl_image_get_size_y(spectra);
80 pixels = cpl_image_get_data(spectra);
92 for (i = 0; i < cpl_table_get_nrow(fibers); i++) {
96 register cxdouble tc = cpl_table_get_double(fibers,
"TRANSMISSION",
100 for (j = 0; j < ny; j++) {
101 pixels[j * nx + i] /= tc;
112 giraffe_transmission_compute(GiExtraction *extraction, GiTable *fibers,
113 GiLocalization *localization,
114 GiTable *wcalcoeff, GiTable *grating,
115 GiTable *slitgeometry)
118 const cxchar *idx = NULL;
125 cxdouble *flux = NULL;
126 cxdouble *error = NULL;
128 cpl_image *tflux = NULL;
129 cpl_image *tvariance = NULL;
130 cpl_image *variance = NULL;
132 cpl_table *_fibers = NULL;
134 GiImage *spectra = NULL;
136 GiTable *_wcalcoeff = NULL;
140 GiRebinConfig rebin_config = {
141 GIREBIN_METHOD_LINEAR,
144 GIREBIN_SCALE_LINEAR,
150 if (extraction == NULL) {
154 if (extraction->spectra == NULL || extraction->error == NULL) {
158 spectra = extraction->spectra;
167 if (wcalcoeff == NULL) {
171 cxdouble pixsize = 0.;
179 GiWlSolution *solution = NULL;
182 if (!cpl_propertylist_has(properties, GIALIAS_PIXSIZX)) {
190 pixsize = cpl_propertylist_get_double(properties,
196 nx = cpl_image_get_size_y(_spectra);
207 solution = giraffe_wlsolution_new(
"xoptmod2", 1, nx, pixsize, setup);
209 if (solution == NULL) {
218 _wcalcoeff = giraffe_wlsolution_create_table(solution);
220 if (_wcalcoeff == NULL) {
222 giraffe_wlsolution_delete(solution);
232 giraffe_wlsolution_delete(solution);
235 rebin_config.xresiduals = FALSE;
237 wcalcoeff = _wcalcoeff;
243 localization, grating, slitgeometry,
244 wcalcoeff, &rebin_config);
248 if (_wcalcoeff != NULL) {
260 if (_wcalcoeff != NULL) {
283 if (variance == NULL) {
284 cpl_image_delete(tflux);
293 tvariance = cpl_image_collapse_create(variance, 0);
295 if (tvariance == NULL) {
296 cpl_image_delete(variance);
299 cpl_image_delete(tflux);
309 cpl_image_delete(variance);
315 flux = cpl_image_get_data(tflux);
317 for (i = 0; i < cpl_table_get_nrow(_fibers); i++) {
319 register cxint rp = cpl_table_get_int(_fibers,
"RP", i, NULL);
323 register cxint j = cpl_table_get_int(_fibers, idx, i , NULL) - 1;
325 if (flux[j] > peak) {
334 giraffe_error_push();
336 cpl_table_new_column(_fibers,
"TRANSMISSION", CPL_TYPE_DOUBLE);
337 cpl_table_new_column(_fibers,
"DTRANSMISSION", CPL_TYPE_DOUBLE);
339 if (cpl_error_get_code() != CPL_ERROR_NONE) {
341 cpl_image_delete(tflux);
344 cpl_image_delete(tvariance);
356 error = cpl_image_get_data(tvariance);
358 for (i = 0; i < cpl_table_get_nrow(_fibers); i++) {
360 cxint rp = cpl_table_get_int(_fibers,
"RP", i, NULL);
362 if (rp == -1 || i == pos) {
363 cpl_table_set_double(_fibers,
"TRANSMISSION", i, 1.);
364 cpl_table_set_double(_fibers,
"DTRANSMISSION", i, 0.);
368 cxint j = cpl_table_get_int(_fibers, idx, i , NULL) - 1;
370 cpl_table_set_double(_fibers,
"TRANSMISSION", i, flux[j] / peak);
371 cpl_table_set_double(_fibers,
"DTRANSMISSION", i,
372 sqrt(error[j]) / peak);
378 cpl_image_delete(tflux);
379 cpl_image_delete(tvariance);
389 giraffe_transmission_setup(GiTable *fibers, GiTable *reference)
394 cpl_table *_fibers = NULL;
395 cpl_table *_reference = NULL;
398 if (fibers == NULL) {
402 if (reference == NULL) {
409 if (_fibers == NULL || cpl_table_has_column(_fibers,
"FPS") == 0) {
413 if (_reference == NULL) {
417 if (cpl_table_has_column(_reference,
"FPS") == 0 ||
418 cpl_table_has_column(_reference,
"TRANSMISSION") == 0) {
422 if (cpl_table_has_column(_fibers,
"TRANSMISSION") == 0) {
424 cxint status = cpl_table_new_column(_fibers,
"TRANSMISSION",
433 for (i = 0; i < cpl_table_get_nrow(_fibers); i++) {
436 cxint nrows = cpl_table_get_nrow(_reference);
437 cxint fps = cpl_table_get_int(_fibers,
"FPS", i, NULL);
442 for (j = 0; j < nrows; j++) {
444 cxint _fps = cpl_table_get_int(_reference,
"FPS", j, NULL);
447 t = cpl_table_get_double(_reference,
"TRANSMISSION", j, NULL);
453 cpl_table_erase_column(_fibers,
"TRANSMISSION");
458 cxint status = cpl_table_set_double(_fibers,
"TRANSMISSION",
475 giraffe_transmission_apply(GiExtraction *extraction, GiTable *fibers)
480 cpl_image *_spectra = NULL;
482 cpl_table *_fibers = NULL;
486 if (extraction == NULL) {
490 if (fibers == NULL) {
495 if (extraction->spectra == NULL) {
501 if (_fibers == NULL) {
506 if (cpl_table_has_column(_fibers,
"TRANSMISSION") == 0) {
512 status = _giraffe_transmission_apply(_spectra, _fibers);
518 if (extraction->error != NULL) {
521 status = _giraffe_transmission_apply(_spectra, _fibers);
556 const cxchar*
const _id =
"giraffe_transmission_attach";
560 GiTable* _fibers = NULL;
563 if ((fibers == NULL) || (filename == NULL)) {
570 if (fibers == NULL) {
571 cpl_error_set(_id, CPL_ERROR_ILLEGAL_INPUT);
576 status = giraffe_transmission_setup(fibers, _fibers);
582 cpl_error_set(_id, CPL_ERROR_DATA_NOT_FOUND);
587 cpl_error_set(_id, CPL_ERROR_INCOMPATIBLE_INPUT);
608 GiTransmissionConfig *
612 GiTransmissionConfig *config = NULL;
619 config = cx_calloc(1,
sizeof *config);
GiGrating * giraffe_grating_create(const GiImage *spectra, const GiTable *grating)
Create a GiGrating from a reference image.
cpl_table * giraffe_table_get(const GiTable *self)
Get the table data from a Giraffe table.
void giraffe_transmission_config_add(cpl_parameterlist *list)
Adds parameters for the transmission correction computation.
cxint giraffe_rebin_spectra(GiRebinning *rebinning, const GiExtraction *extraction, const GiTable *fibers, const GiLocalization *localization, const GiTable *grating, const GiTable *slitgeo, const GiTable *solution, const GiRebinConfig *config)
Rebin an Extracted Spectra Frame and associated Errors Frame.
void giraffe_table_delete(GiTable *self)
Destroys a Giraffe table.
const cxchar * giraffe_fiberlist_query_index(const cpl_table *fibers)
Query a fiber list for the name of the fiber reference index column.
void giraffe_transmission_config_destroy(GiTransmissionConfig *config)
Destroys a transmission field setup structure.
void giraffe_rebinning_delete(GiRebinning *rebinning)
Destroys a rebinning results container.
Structure to handle Grating Information.
void giraffe_rebinning_destroy(GiRebinning *rebinning)
Destroys a rebinning results container and its contents.
void giraffe_grating_delete(GiGrating *self)
Destroys an GiGrating object.
cpl_image * giraffe_image_get(const GiImage *self)
Gets the image data.
GiRebinning * giraffe_rebinning_new(void)
Create an empty rebinning results container.
GiTransmissionConfig * giraffe_transmission_config_create(cpl_parameterlist *list)
Creates a setup structure for the relative transmission computation.
GiTable * giraffe_fiberlist_load(const cxchar *filename, cxint dataset, const cxchar *tag)
Load a fiber table from a file.
cpl_propertylist * giraffe_image_get_properties(const GiImage *self)
Get the properties of an image.
cxint giraffe_transmission_attach(GiTable *fibers, const cxchar *filename)
Load relative fiber transmission data from a file and add it to a fiber table.