97 check( result->
flux = cpl_image_new( result->
size, 1, CPL_TYPE_DOUBLE));
98 check( result->
errs = cpl_image_new( result->
size, 1, CPL_TYPE_DOUBLE));
99 check( result->
qual = cpl_image_new( result->
size, 1, CPL_TYPE_INT));
102 if (cpl_error_get_code() != CPL_ERROR_NONE) {
123 const char *s1dname = NULL;
130 check( s1dname = cpl_frame_get_filename( s1d_frame));
144 check( result->
flux = cpl_image_load( s1dname, CPL_TYPE_DOUBLE, 0, 0));
145 check( result->
errs = cpl_image_load( s1dname, CPL_TYPE_DOUBLE, 0, 1));
146 check( result->
qual = cpl_image_load( s1dname, CPL_TYPE_INT, 0, 2));
149 if (cpl_error_get_code() != CPL_ERROR_NONE) {
232 res =
s->lambda_step;
254 check( res = cpl_image_get_data_double(
s->flux));
276 check( res = cpl_image_get_data_double(
s->errs));
298 check( res = cpl_image_get_data_int(
s->qual));
336 cpl_frame *product_frame = NULL;
344 s->flux_header, CPL_IO_DEFAULT),
345 "Could not save data to %s extension 0", filename);
347 s->errs_header, CPL_IO_EXTEND),
348 "Could not save errs to %s extension 1", filename);
350 s->qual_header, CPL_IO_EXTEND),
351 "Could not save qual to %s extension 2", filename);
356 CPL_FRAME_TYPE_IMAGE,
357 CPL_FRAME_GROUP_PRODUCT,
358 CPL_FRAME_LEVEL_FINAL));
361 if (cpl_error_get_code () != CPL_ERROR_NONE) {
363 product_frame = NULL;
365 return product_frame;
387 xstart=((ws -
s->lambda_min)/
s->lambda_step+0.5);
388 xend= ((we -
s->lambda_min)/
s->lambda_step-0.5);
395 xstart=(xstart <
s->size) ? xstart:
s->size;
396 xend=(xend < s->
size) ? xend:
s->size;
397 xstart=(xstart < xend) ? xstart: xend-1;
399 check(flux=cpl_image_get_mean_window(
s->flux,xstart,1,xend,1));
405 sprintf(comment,
"Flux in %4.0f-%4.0f nm",ws,we);
409 " Will force it to -1.0 instead.", qc_key);
412 check(cpl_propertylist_append_double(
s->flux_header,qc_key,flux));
413 check(cpl_propertylist_set_comment(
s->flux_header,qc_key,comment));
415 check(err=cpl_image_get_mean_window(
s->errs,xstart,1,xend,1));
421 sprintf(comment,
"Error Flux in %4.0f-%4.0f nm",ws,we);
425 " Will force it to -1.0 instead.", qc_key);
428 cpl_propertylist_append_double(
s->flux_header,qc_key,err);
429 cpl_propertylist_set_comment(
s->flux_header,qc_key,comment);
435 sprintf(comment,
"SNR in %4.0f-%4.0f nm",ws,we);
440 double flux2=flux*flux;
443 if( (flux2 >= 1.e-80) && (err2 >=1.e-80) ) {
444 snr=cpl_image_duplicate(
s->flux);
445 cpl_image_divide(snr,
s->errs);
448 sn=cpl_image_get_mean_window(snr,xstart,1,xend,1);
455 " Will force it to -1.0 instead.", qc_key);
458 cpl_propertylist_append_double(
s->flux_header,qc_key,sn);
459 cpl_propertylist_set_comment(
s->flux_header,qc_key,comment);
464 return cpl_error_get_code();
474 const char* s1dname=NULL;
475 const char *tag = NULL;
476 cpl_frame *product = NULL;
478 check( s1dname=cpl_frame_get_filename(in_frm));
480 check( tag = cpl_frame_get_tag(in_frm));
509 return cpl_error_get_code();
516 const char* s1dname=NULL;
517 const char *tag = NULL;
518 cpl_frame *product = NULL;
520 check( s1dname=cpl_frame_get_filename(in_frm));
522 check( tag = cpl_frame_get_tag(in_frm));
526 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START1",450.0));
527 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END1",470.0));
528 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START2",510.0));
529 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END2",530.0));
530 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START3",0.0));
534 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START1",672.0));
535 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END1",680.0));
536 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START2",745.0));
537 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END2",756.0));
538 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START3",992.0));
539 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END3",999.0));
542 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START1",1514.0));
543 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END1",1548.0));
544 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START2",2214.0));
545 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC END2",2243.0));
546 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC START3",0.0));
552 if(cpl_propertylist_has(s1d->
flux_header,
"ESO OBS TARG NAME")){
553 char* val = cpl_strdup(cpl_propertylist_get_string(s1d->
flux_header,
"ESO OBS TARG NAME"));
555 for (
int i=0;i<strlen(val);i++){
560 check(cpl_propertylist_update_string(s1d->
flux_header,
"ESO QC OBS TARG NAME",val));
563 if(cpl_propertylist_has(s1d->
flux_header,
"ESO QC EFF MED ORD 9") &&
564 cpl_propertylist_has(s1d->
flux_header,
"ESO QC EFF MED ORD 1")){
565 double den = cpl_propertylist_get_double(s1d->
flux_header,
"ESO QC EFF MED ORD 1");
567 double ratio = cpl_propertylist_get_double(s1d->
flux_header,
"ESO QC EFF MED ORD 9") / den;
568 check(cpl_propertylist_update_double(s1d->
flux_header,
"ESO QC CHROMATIC EFF",ratio));
571 if(cpl_propertylist_has(s1d->
flux_header,
"ESO TPL ID")){
572 char* val = cpl_strdup(cpl_propertylist_get_string(s1d->
flux_header,
"ESO TPL ID"));
573 char* nstr = cpl_strdup(
"");
576 for (
int i=0;i<strlen(val);i++){
579 nstr = cpl_sprintf(
"%s%c",nstr,val[i]);
584 check(cpl_propertylist_update_string(s1d->
flux_header,
"ESO QC TPL ID",nstr));
597 return cpl_error_get_code();
static xsh_instrument * instrument
double xsh_spectrum1D_get_lambda_min(xsh_spectrum1D *s)
Get minimum lambda of spectrum.
double xsh_spectrum1D_get_lambda_max(xsh_spectrum1D *s)
Get maximum lambda of spectrum.
cpl_error_code xsh_monitor_spectrum1D_extra_qc(cpl_frame *in_frm, xsh_instrument *instrument, cpl_propertylist *qclist)
double xsh_spectrum1D_get_lambda_step(xsh_spectrum1D *s)
Get bin in lambda of spectrum.
xsh_spectrum1D * xsh_spectrum1D_create(double lambda_min, double lambda_max, double lambda_step)
Create a 1D spectrum structure.
int xsh_spectrum1D_get_size(xsh_spectrum1D *s)
Get size of spectrum.
cpl_frame * xsh_spectrum1D_save(xsh_spectrum1D *s, const char *filename)
save a 1D spectrum
double * xsh_spectrum1D_get_errs(xsh_spectrum1D *s)
Get errs of spectrum.
static cpl_error_code xsh_monitor_spectrum1D_flux_qc(xsh_spectrum *s, const double wave_s, const double wave_e, const int index)
xsh_spectrum1D * xsh_spectrum1D_load(cpl_frame *s1d_frame, xsh_instrument *instr)
Load a 1D spectrum structure.
void xsh_spectrum1D_free(xsh_spectrum1D **s)
free memory associated to an 1D spectrum
double * xsh_spectrum1D_get_flux(xsh_spectrum1D *s)
Get flux of spectrum.
cpl_error_code xsh_monitor_spectrum1D_flux(cpl_frame *in_frm, xsh_instrument *instrument)
int * xsh_spectrum1D_get_qual(xsh_spectrum1D *s)
Get qual of spectrum.
xsh_spectrum * xsh_spectrum_load(cpl_frame *s1d_frame)
Load a 1D spectrum structure.
cpl_frame * xsh_spectrum_save(xsh_spectrum *s, const char *filename, const char *tag)
save a spectrum
void xsh_spectrum_free(xsh_spectrum **s)
free memory associated to an 1D spectrum
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define check_msg(COMMAND,...)
#define XSH_ASSURE_NOT_NULL(pointer)
int xsh_instrument_nir_is_JH(cpl_frame *frame, xsh_instrument *instr)
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm on instrument structure.
#define xsh_msg_warning(...)
Print an warning message.
void xsh_pfits_set_extname(cpl_propertylist *plist, const char *value)
Write the EXTNAME value.
cpl_error_code xsh_pfits_set_wcs1(cpl_propertylist *header, const double crpix1, const double crval1, const double cdelt1)
double xsh_pfits_get_cdelt1(const cpl_propertylist *plist)
find out the cdelt1
int xsh_pfits_get_naxis1(const cpl_propertylist *plist)
find out the NAXIS1 value
double xsh_pfits_get_crval1(const cpl_propertylist *plist)
find out the crval1
void xsh_pfits_set_qc_slit_width(cpl_propertylist *source_list, cpl_propertylist *set_list, xsh_instrument *instrument)
void xsh_free_image(cpl_image **i)
Deallocate an image and set the pointer to NULL.
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
void xsh_free_propertylist(cpl_propertylist **p)
Deallocate a property list and set the pointer to NULL.
cpl_propertylist * errs_header
cpl_propertylist * flux_header
cpl_propertylist * qual_header
cpl_propertylist * flux_header
#define XSH_SPECTRUM1D_ERRS_BPP
#define XSH_SPECTRUM1D_DATA_BPP
#define XSH_SPECTRUM1D_QUAL_BPP
cpl_frame * xsh_frame_product(const char *fname, const char *tag, cpl_frame_type type, cpl_frame_group group, cpl_frame_level level)
Creates a frame with given characteristics.
#define XSH_NEW_PROPERTYLIST(POINTER)
#define XSH_FREE(POINTER)
#define XSH_CALLOC(POINTER, TYPE, SIZE)