27 #include <cxmessages.h>
28 #include <cxstrutils.h>
31 #include <cpl_parameterlist.h>
32 #include <cpl_propertylist.h>
33 #include <cpl_image.h>
37 #include "gimessages.h"
38 #include "gifiberutils.h"
39 #include "gigrating.h"
40 #include "giwlsolution.h"
41 #include "giextraction.h"
42 #include "girebinning.h"
43 #include "gitransmission.h"
55 _giraffe_transmission_apply(cpl_image *spectra, cpl_table *fibers)
63 cxdouble *pixels = NULL;
66 cx_assert(spectra != NULL);
67 cx_assert(fibers != NULL);
69 nx = cpl_image_get_size_x(spectra);
70 ny = cpl_image_get_size_y(spectra);
72 pixels = cpl_image_get_data(spectra);
84 for (i = 0; i < cpl_table_get_nrow(fibers); i++) {
88 register cxdouble tc = cpl_table_get_double(fibers,
"TRANSMISSION",
92 for (j = 0; j < ny; j++) {
93 pixels[j * nx + i] /= tc;
104 giraffe_transmission_compute(GiExtraction *extraction, GiTable *fibers,
105 GiLocalization *localization,
106 GiTable *wcalcoeff, GiTable *grating,
107 GiTable *slitgeometry)
110 const cxchar *idx = NULL;
117 cxdouble *flux = NULL;
118 cxdouble *error = NULL;
120 cpl_image *tflux = NULL;
121 cpl_image *tvariance = NULL;
122 cpl_image *variance = NULL;
124 cpl_table *_fibers = NULL;
126 GiImage *spectra = NULL;
128 GiTable *_wcalcoeff = NULL;
132 GiRebinConfig rebin_config = {
133 GIREBIN_METHOD_LINEAR,
136 GIREBIN_SCALE_LINEAR,
142 if (extraction == NULL) {
146 if (extraction->spectra == NULL || extraction->error == NULL) {
150 spectra = extraction->spectra;
159 if (wcalcoeff == NULL) {
163 cxdouble pixsize = 0.;
171 GiWlSolution *solution = NULL;
174 if (!cpl_propertylist_has(properties, GIALIAS_PIXSIZX)) {
182 pixsize = cpl_propertylist_get_double(properties,
188 nx = cpl_image_get_size_y(_spectra);
199 solution = giraffe_wlsolution_new(
"xoptmod2", 1, nx, pixsize, setup);
201 if (solution == NULL) {
210 _wcalcoeff = giraffe_wlsolution_create_table(solution);
212 if (_wcalcoeff == NULL) {
214 giraffe_wlsolution_delete(solution);
224 giraffe_wlsolution_delete(solution);
227 rebin_config.xresiduals = FALSE;
229 wcalcoeff = _wcalcoeff;
235 localization, grating, slitgeometry,
236 wcalcoeff, &rebin_config);
240 if (_wcalcoeff != NULL) {
252 if (_wcalcoeff != NULL) {
275 if (variance == NULL) {
276 cpl_image_delete(tflux);
285 tvariance = cpl_image_collapse_create(variance, 0);
287 if (tvariance == NULL) {
288 cpl_image_delete(variance);
291 cpl_image_delete(tflux);
301 cpl_image_delete(variance);
307 flux = cpl_image_get_data(tflux);
309 for (i = 0; i < cpl_table_get_nrow(_fibers); i++) {
311 register cxint rp = cpl_table_get_int(_fibers,
"RP", i, NULL);
315 register cxint j = cpl_table_get_int(_fibers, idx, i , NULL) - 1;
317 if (flux[j] > peak) {
326 giraffe_error_push();
328 cpl_table_new_column(_fibers,
"TRANSMISSION", CPL_TYPE_DOUBLE);
329 cpl_table_new_column(_fibers,
"DTRANSMISSION", CPL_TYPE_DOUBLE);
331 if (cpl_error_get_code() != CPL_ERROR_NONE) {
333 cpl_image_delete(tflux);
336 cpl_image_delete(tvariance);
348 error = cpl_image_get_data(tvariance);
350 for (i = 0; i < cpl_table_get_nrow(_fibers); i++) {
352 cxint rp = cpl_table_get_int(_fibers,
"RP", i, NULL);
354 if (rp == -1 || i == pos) {
355 cpl_table_set_double(_fibers,
"TRANSMISSION", i, 1.);
356 cpl_table_set_double(_fibers,
"DTRANSMISSION", i, 0.);
360 cxint j = cpl_table_get_int(_fibers, idx, i , NULL) - 1;
362 cpl_table_set_double(_fibers,
"TRANSMISSION", i, flux[j] / peak);
363 cpl_table_set_double(_fibers,
"DTRANSMISSION", i,
364 sqrt(error[j]) / peak);
370 cpl_image_delete(tflux);
371 cpl_image_delete(tvariance);
381 giraffe_transmission_setup(GiTable *fibers, GiTable *reference)
386 cpl_table *_fibers = NULL;
387 cpl_table *_reference = NULL;
390 if (fibers == NULL) {
394 if (reference == NULL) {
401 if (_fibers == NULL || cpl_table_has_column(_fibers,
"FPS") == 0) {
405 if (_reference == NULL) {
409 if (cpl_table_has_column(_reference,
"FPS") == 0 ||
410 cpl_table_has_column(_reference,
"TRANSMISSION") == 0) {
414 if (cpl_table_has_column(_fibers,
"TRANSMISSION") == 0) {
416 cxint status = cpl_table_new_column(_fibers,
"TRANSMISSION",
425 for (i = 0; i < cpl_table_get_nrow(_fibers); i++) {
428 cxint nrows = cpl_table_get_nrow(_reference);
429 cxint fps = cpl_table_get_int(_fibers,
"FPS", i, NULL);
434 for (j = 0; j < nrows; j++) {
436 cxint _fps = cpl_table_get_int(_reference,
"FPS", j, NULL);
439 t = cpl_table_get_double(_reference,
"TRANSMISSION", j, NULL);
445 cpl_table_erase_column(_fibers,
"TRANSMISSION");
450 cxint status = cpl_table_set_double(_fibers,
"TRANSMISSION",
467 giraffe_transmission_apply(GiExtraction *extraction, GiTable *fibers)
472 cpl_image *_spectra = NULL;
474 cpl_table *_fibers = NULL;
478 if (extraction == NULL) {
482 if (fibers == NULL) {
487 if (extraction->spectra == NULL) {
493 if (_fibers == NULL) {
498 if (cpl_table_has_column(_fibers,
"TRANSMISSION") == 0) {
504 status = _giraffe_transmission_apply(_spectra, _fibers);
510 if (extraction->error != NULL) {
513 status = _giraffe_transmission_apply(_spectra, _fibers);
548 const cxchar*
const _id =
"giraffe_transmission_attach";
552 GiTable* _fibers = NULL;
555 if ((fibers == NULL) || (filename == NULL)) {
562 if (fibers == NULL) {
563 cpl_error_set(_id, CPL_ERROR_ILLEGAL_INPUT);
568 status = giraffe_transmission_setup(fibers, _fibers);
574 cpl_error_set(_id, CPL_ERROR_DATA_NOT_FOUND);
579 cpl_error_set(_id, CPL_ERROR_INCOMPATIBLE_INPUT);
600 GiTransmissionConfig *
604 GiTransmissionConfig *config = NULL;
611 config = cx_calloc(1,
sizeof *config);
GiTable * giraffe_fiberlist_load(const cxchar *filename, cxint dataset, const cxchar *tag)
Load a fiber table from a file.
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_grating_delete(GiGrating *self)
Destroys an GiGrating object.
GiGrating * giraffe_grating_create(const GiImage *spectra, const GiTable *grating)
Create a GiGrating from a reference image.
cpl_propertylist * giraffe_image_get_properties(const GiImage *self)
Get the properties of an image.
cpl_image * giraffe_image_get(const GiImage *self)
Gets the image data.
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_rebinning_delete(GiRebinning *rebinning)
Destroys a rebinning results container.
void giraffe_rebinning_destroy(GiRebinning *rebinning)
Destroys a rebinning results container and its contents.
GiRebinning * giraffe_rebinning_new(void)
Create an empty rebinning results container.
void giraffe_table_delete(GiTable *self)
Destroys a Giraffe table.
cpl_table * giraffe_table_get(const GiTable *self)
Get the table data from a Giraffe table.
GiTransmissionConfig * giraffe_transmission_config_create(cpl_parameterlist *list)
Creates a setup structure for the relative transmission computation.
void giraffe_transmission_config_add(cpl_parameterlist *list)
Adds parameters for the transmission correction computation.
void giraffe_transmission_config_destroy(GiTransmissionConfig *config)
Destroys a transmission field setup structure.
cxint giraffe_transmission_attach(GiTable *fibers, const cxchar *filename)
Load relative fiber transmission data from a file and add it to a fiber table.
Structure to handle Grating Information.