aboutsummaryrefslogtreecommitdiff
path: root/include/calfuse.h
blob: a1ab6e9a7761ba302f49cb78ea533aac1dc7ad8c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
/*****************************************************************************
 *              Johns Hopkins University
 *              Center For Astrophysical Sciences
 *              FUSE
 *****************************************************************************
 *
 * Synopsis:    #include "calfuse.h"
 *
 * Description: Master include file for FUSE calibration pipeline processing
 *		system. Global shared variables and structures are defined
 *              here, as well as symbols and default values of parameters.
 *
 * Arguments:   none
 *
 * Returns:     none
 *
 * History:     11/01/02   1.1   peb    Begin work
 *		12/10/02   1.3   wvd    Continue work
 *		12/20/02   1.4   wvd    Change flags to unsigned char in 
 *					screening routines.
 *		01/14/03   1.5   wvd    Change cf_fpa_pos to cf_read_fpa_pos
 *		01/17/03   1.6   wvd    Added new calibration files
 *					 DIGI_CAL and SPEC_CAL
 *					Added cf_check_digitizer and DIGI_COR
 *		02/05/03   1.7   wvd    Added spectral extraction routines
 *					Interpolate between FLUX_CAL files.
 *					Define HC
 *		02/12/03   1.8   wvd    Added convert_to_ergs
 *					Replace FLUX_CAL with AEFF_CAL
 *		02/14/03   1.9   wvd    Added FLAT, WGTS and WORM calibration
 *					file keywords.
 *		02/24/03   1.10  wvd    Added subroutines of cf_extract
 *					and char *cf_hist_file(char *);
 *              02/28/03   1.12  peb    Added function definitions for 
 *                                      cf_rebin_and_flux_calibrate_backround,
 *                                      cf_standard_or_optimal_extraction,
 *                                      cf_optimal_extraction, and
 *                                      cf_write_extracted_spectrum.
 *              03/04/03   1.13  peb    Added astig_read_file,
 *                                      astig_check_input_image,
 *                                      astig_target_aperture
 *              03/05/03   1.14  wvd    Added cf_target_count_rate
 *              03/07/03   1.15  peb    Changed cf_error_init, added
 *                                      cf_verbose, and made pha, timeflgs, and
 *                                      loc_flgs function type consistent.
 *              03/11/03   1.16  wvd    Changed channel from unsigned char to
 *					char in a few subroutines.
 *              03/18/03   1.17  wvd    variable argument list for cf_verbose 
 *              03/25/03   1.18  peb    variable argument list for cf_if_error
 *                                      and cf_if_warning
 *		03/21/03   1.19  wvd	Add flag for photon in pot hole
 *		04/01/03   1.21  wvd	Delete cf_errmsg; obsolete
 *		04/08/03   1.22  wvd	Change definition of cf_apply_filters
 *		04/09/03   1.23  wvd	Add bad-pixel maps to calibration files.
 *		04/17/03   1.25  wvd	Add final_call to cf_identify_channel
 *					Add final_call and weight to
 *					cf_calculate_y_centroid
 *		04/18/03   1.26  wvd	Add cf_find_spectra
 *		04/21/03   1.27  wvd	Modify cf_grating_motion, 
 *					cf_mirror_motion, and
 *					cf_satellite_jitter.
 *					Define FRAME_TOLERANCE.
 *              04/28/03  v1.28  wvd    Modified cf_fuv_init not to extrapolate
 *                                      the last two calibration files forward.
 *              05/10/03  v1.29  wvd    Pass locflag to cf_set_photon_flags
 *              05/16/03  v1.30  wvd    Add cf_make_mask.
 *					Set PERFORM keywords for HIST data.
 *              05/28/03  v1.31  rdr    Modified def of cf_optimal_extraction
 *                                      and cf_write_extracted_spectrum
 *              05/30/03  v1.34  wvd    Pass WEIGHTS to cf_set_photon_flags
 *              06/09/03  v1.35  rdr    Change definition of cf_apply_filters
 *              06/11/03  v1.36  wvd	Change HV array to type short.
 *              06/11/03  v1.37  wvd	Pass datatype to cf_read_col and
 *					cf_write_col.
 *              07/16/03  v1.38  wvd	Move initialization routines to libcf
 *              07/23/03  v1.39  wvd	Add HSKP_CAL to list of cal files
 *					Increment OPUS_VERSION to 2.7
 *              08/01/03  v1.40  wvd	Add cf_apply_dead_time to pipeline,
 *					modify arguments of dead-time routines.
 *              08/04/03  v1.41  wvd	Convert count-rate arrays to shorts.
 *              08/06/03  v1.42  wvd	Delete GTI's from cf_satellite_jitter
 *              08/21/03  v1.43  wvd	Change channel array to unsigned char
 *					in subroutines of cf_remove_motion
 *              08/22/03  v1.44  wvd	Add cf_get_extraction_limits.
 *              08/22/03  v1.45  wvd	Change limits of extraction window
 *					from type int to type short.
 *              08/25/03  v1.46  wvd	Add cf_nint, change coltype in 
 *					cf_idf_io routines from string to int
 *              08/28/03  v1.47  wvd	Modify structure saareg
 *              09/10/03  v1.48  wvd	Define cf_set_user_gtis
 *					Modify args of cf_screen_burst
 *              09/15/03  v1.49  wvd	Add structure top_level_routines
 *					Delete astig_read_file and
 *					astig_target_aperture.
 *					Modify args of cf_identify_channel
 *              10/02/03  v1.50  wvd	Exchange PHA and GTI flags.
 *					Change version number to 3.0.2.
 *              10/08/03  v1.51  wvd	Change counts_out to type long
 *              10/26/03  v1.52  wvd	Change arguments of cf_find_spectra
 *					and cf_calculate_y_centroid.
 *              10/31/03  v1.53  wvd	Change channel to unsigned char
 *					throughout.
 *              11/26/03  v1.54  wvd	Change aic_rate and fec_rate to float
 *					throughout.
 *              12/21/03  v1.55  wvd	Remove underscore from idf and bpm
 *					filenames.
 *                                      Change version number to 3.0.3.
 *              02/09/04  v1.56  wvd	Employ new scheme for dead-time 
 *					correction.  Add cf_nlong() and
 *					cf_screen_fifo_overflow.
 *                                      Change version number to 3.0.4.
 *              02/27/04  v1.57  rdr    Change def of cf_thermal_distortion
 *              03/02/04  v1.58  wvd	Implement WPC array in extraction
 *					routine.
 *					Add cf_x2lambda.
 *					Change version number to 3.0.5.
 *              03/16/04  v1.59  wvd	Delete WPC array.
 *					Smooth HIST data in X.
 *					Comment out cf_astig_farf.
 *					Change version number to 3.0.6.
 *              04/05/04  v1.60  wvd	Modify cf_geometric_distort to 
 *					rescale SPECBINY only for HIST data.
 *              04/09/04  v1.61  wvd	Fix bugs in cf_optimal_extraction.
 *					Change version number to 3.0.7.
 *              04/09/04  v1.62  bjg    Define FILL_DATA and LOCATION_FILL 
 *              04/26/04  v1.63  wvd    Replace cf_rebin_and_flux_
 *					calibrate_background with
 *					cf_rebin_background.
 *					Modify args to cf_optimal_extraction
 *					and cf_find_spectra.
 *              06/02/04  v1.64  wvd    Add cf_modify_hist_times.
 *					Populate the header keywords
 *					TIME_COR, COMB_COR, and QUIK_COR
 *					Modify args to cf_calculate_y_centroid,
 *					cf_find_spectra, cf_satellite_jitter,
 *					cf_apply_filters, and
 *					cf_write_extracted_spectrum.
 *					Modify order of CALIBRATION_STEP_KEYS.
 *              08/19/04  v1.65  wvd    Add FES definitions and subroutines.
 *              10/12/04  v1.66  wvd    Change version number to 3.0.8
 *              02/01/05  v1.67  wvd    Change version number to 3.1.0
 *					Modify args to cf_screen_burst
 *              03/02/05  v1.68  wvd    Add cf_modify_hist_pha and PHAH_COR.
 *					Walk correct HIST data.
 *					Change cf_ttag_bkgd to cf_scale_bkgd
 *					and pass weights array to it.
 *					Change cf_get_extraction_limits to
 *					cf_extraction_limits; it now returns
 *					X limits of extraction window.
 *					Add cf_screen_airglow.
 *              03/22/05  v1.69  wvd    Change TIME_SUNRISE and TIME_SUNSET
 *					from floats to shorts.
 *              04/19/05  v1.70  wvd    Change version number to 3.1.1
 *              06/15/05  v1.71  wvd    BUG FIX: cf_extract_spectra always
 *					read the point-source probability
 *					array from WGTS_CAL file.  Now uses
 *					variable "extended" to determine
 *					which HDU to read.  Modify args to 
 *					cf_rebin_probability_array
 *					Change version number to 3.1.2
 *					Delete QUIK_COR from structure
 *					CALIBRATION_STEP_KEYS.
 *              08/30/05  v1.72  wvd    Define MAX_EXPTIME = 55000
 *					Delete cf_read_fpa_pos
 *					Change version number to 3.1.3
 *              09/19/05  v1.73  wvd    Reinstall cf_read_fpa_pos, as it is
 *					needed by ttag_combine.
 *              09/30/05  v1.74  wvd    Change version number to 3.1.4
 *					Pass photon array to
 *					cf_screen_fifo_overflow.
 *              11/22/05  v1.75  wvd    Add cf_screen_bad_pixels, 
 *					cf_screen_jitter, and
 *					cf_get_potholes
 *					Change version number to 3.1.5
 *              01/24/06  v1.76  wvd    Change version number to 3.1.6
 *              02/03/06  v1.77  wvd    Change version number to 3.1.7
 *              05/15/06  v1.78  wvd    Divide cf_astigmatism_and_dispersion
 *					into two separate routines.  Incorporate
 *					cf_x2lambda into cf_dispersion.
 *					Change version number to 3.1.8
 *					Delete cf_astig_farf.
 *              06/12/06  v1.79  wvd    Add pole_ang.c
 *					Change version number to 3.1.9
 *					Add -a to cf_remove_motions
 *              11/02/06  v1.80  wvd    Add cf_time_xy_distort.c
 *					Change version number to 3.2.0
 *					Add APER_COR to list of cal steps.
 *					Change cf_screen_fifo_overflow to
 *					cf_fifo_deadtime.  Modify args to
 *					it, cf_apply_dead_time, and
 *					cf_target_count_rate.  Run
 *					cf_target_count_rate on HIST data.
 *              03/07/07  v1.81  wvd    Modify arguments to space_vel.
 *              05/18/07  v1.82  wvd    Change version number to 3.2.1.
 *              09/15/07  v1.83  bot    Change version number to 3.2.2.
 *              10/16/07  v1.84  bot    Added brackets in 
 *					FES_CALIBRATION_STEP_KEYS
 *					and in CALIBRATION_FILE_KEYS.
 *              08/22/08  v1.85  wvd    Change version number to 3.2.3.
 *					Many changes to better handle
 *					bright-earth observations & 
 *					900-level airglow exposures.
 *
 ****************************************************************************/

#include "calfitsio.h"

#define CALFUSE_VERSION "3.2.3"

#define LARGEMJD        9999999999.0
#define OPUS_VERSION    2.7      /* Oldest compatible version of OPUS */
#define PI 3.1415926535897932384626433832795028841971693993751
#define RADIAN 0.017453292519943295769236907684886127134428718885417
#define C 299792.458
#define HC 1.98644746104e-8	/* erg A */
#define MU 3.986005E5		/* km^3 s^-2 */
#define RE 6371.00		/* km */
#define RS 6.960E5
#define AU 1.495978707E8
#define FRAME_TOLERANCE 0.004

#define FESPIX          266256          /* This is 516*516 */
#define FILL_DATA       21865
#define NXMAX           16384
#define NYMAX           1024

#define TEMPORAL_DAY      (0x01<<0)
#define TEMPORAL_LIMB     (0x01<<1)
#define TEMPORAL_SAA      (0x01<<2)
#define TEMPORAL_HV       (0x01<<3)
#define TEMPORAL_BRST     (0x01<<4)
#define TEMPORAL_OPUS     (0x01<<5)
#define TEMPORAL_JITR     (0x01<<6)
#define TEMPORAL_USER     (0x01<<7)

#define LOCATION_SHLD     (0x01<<0)
#define LOCATION_AIR      (0x01<<1)
#define LOCATION_STIML    (0x01<<2)
#define LOCATION_STIMR    (0x01<<3)
#define LOCATION_PHA      (0x01<<4)
#define LOCATION_BADPX    (0x01<<5)
#define LOCATION_FILL     (0x01<<6)

#define MAX_EXPTIME	55000

struct fes_keyword_tab
{
       char  name[9];
       char  value[8];
       char  proc[18];
};

#define NUM_FES_PROC_STEPS 6

#define FES_CALIBRATION_STEP_KEYS { \
  {"INIT_FES\0","PERFORM\0","cf_fes_init\0"},\
  {"MASK_FES\0","PERFORM\0","cf_fes_mask\0"},\
  {"BIAS_FES\0","PERFORM\0","cf_fes_bias\0"},\
  {"FLAT_FES\0","PERFORM\0","cf_fes_flat\0"},\
  {"UNDS_FES\0","PERFORM\0","cf_fes_undistort\0"},\
  {"FLUX_FES\0","PERFORM\0","cf_fes_flux\0"},\
}

#define NUM_FES_CAL_KEYS 5

#define FES_CALIBRATION_FILE_KEYS { \
      "MASK",1,"FCL","\0","\0","\0",0.0,0.0,LARGEMJD,0,0,0,\
      "BIAS",2,"FCL","\0","\0","\0",0.0,0.0,LARGEMJD,0,0,0,\
      "FFLT",2,"FCL","\0","\0","\0",0.0,0.0,LARGEMJD,0,0,0,\
      "FGEO",1,"FCL","\0","\0","\0",0.0,0.0,LARGEMJD,0,0,0,\
      "FFLX",2,"FCL","\0","\0","\0",0.0,0.0,LARGEMJD,0,0,0\
    }

typedef struct {
    double ra_ap;
    double dec_ap;
    double limb;
} orbital;

typedef struct {
    long   n_points;
    float *lat;
    float *lon;
} saareg;

typedef struct {
    long ntimes;        /*  The number of intervals  */
    double *start;      /*  An array of starting times (in seconds)  */
    double *stop;       /*  An array of stoping times (in seconds)  */
} GTI;                  /*  Good Time Intervals  */

struct keyword_tab
{
    char  name[9];
    char  hist_value[8];
    char  hist_proc[32];
    char  ttag_value[8];
    char  ttag_proc[32];
};

#define NTOP_LEVEL_ROUTINES 11

#define TOP_LEVEL_ROUTINES { \
    "cf_ttag_init", \
    "cf_hist_init", \
    "cf_convert_to_farf", \
    "cf_ttag_countmap", \
    "cf_ttag_gainmap", \
    "cf_remove_motions", \
    "cf_assign_wavelength", \
    "cf_screen_photons", \
    "cf_flux_calibrate", \
    "cf_bad_pixels", \
    "cf_extract_spectra" \
}

#define NUM_PROC_STEPS 40

#define CALIBRATION_STEP_KEYS { \
    {"INIT_COR", "PERFORM", "cf_hist_init", "PERFORM", "cf_ttag_init"}, \
    {"DIGI_COR", "PERFORM", "cf_check_digitizer", "PERFORM", "cf_check_digitizer"}, \
    {"IDS__COR", "PERFORM", "cf_ids_dead_time", "PERFORM", "cf_ids_dead_time"}, \
    {"ELEC_COR", "PERFORM", "cf_electronics_dead_time", "PERFORM", "cf_electronics_dead_time"}, \
    {"FIFO_COR", "OMIT", "cf_fifo_dead_time", "PERFORM", "cf_fifo_dead_time"}, \
    {"DEAD_COR", "PERFORM", "cf_apply_dead_time", "PERFORM", "cf_apply_dead_time"}, \
    {"THRM_COR", "PERFORM", "cf_thermal_distort", "PERFORM", "cf_thermal_distort"}, \
    {"RATE_COR", "PERFORM", "cf_count_rate_y_distort", "PERFORM", "cf_count_rate_y_distort"}, \
    {"TMXY_COR", "PERFORM", "cf_time_xy_distort", "PERFORM", "cf_time_xy_distort"}, \
    {"GEOM_COR", "PERFORM", "cf_geometric_distort", "PERFORM", "cf_geometric_distort"}, \
    {"PHAH_COR", "PERFORM", "cf_modify_hist_pha", "OMIT", "cf_modify_hist_pha"}, \
    {"PHAX_COR", "PERFORM", "cf_pha_x_distort", "PERFORM", "cf_pha_x_distort"}, \
    {"ACTV_COR", "PERFORM", "cf_active_region", "PERFORM", "cf_active_region"}, \
    {"LIMB_COR", "PERFORM", "cf_screen_limb_angle", "PERFORM", "cf_screen_limb_angle"}, \
    {"SAA__COR", "PERFORM", "cf_screen_saa", "PERFORM", "cf_screen_saa"}, \
    {"VOLT_COR", "PERFORM", "cf_screen_high_voltage", "PERFORM", "cf_screen_high_voltage"}, \
    {"BRST_COR", "OMIT", "cf_screen_burst", "PERFORM", "cf_screen_burst"}, \
    {"APER_COR", "PERFORM", "cf_screen_jitter", "PERFORM", "cf_screen_jitter"}, \
    {"UGTI_COR", "OMIT", "cf_set_user_gtis", "PERFORM", "cf_set_user_gtis"}, \
    {"FLAG_COR", "PERFORM", "cf_set_photon_flags", "PERFORM", "cf_set_photon_flags"}, \
    {"GTI__COR", "PERFORM", "cf_set_good_time_intervals", "PERFORM", "cf_set_good_time_intervals"}, \
    {"TIME_COR", "PERFORM", "cf_modify_hist_times", "OMIT", "cf_modify_hist_times"}, \
    {"AIRG_COR", "PERFORM", "cf_screen_airglow", "PERFORM", "cf_screen_airglow"}, \
    {"BPIX_COR", "PERFORM", "cf_screen_bad_pixels", "PERFORM", "cf_screen_bad_pixels"}, \
    {"PHA__COR", "OMIT", "cf_screen_pulse_height", "PERFORM", "cf_screen_pulse_height"}, \
    {"FIND_COR", "PERFORM", "cf_find_spectra", "PERFORM", "cf_find_spectra"}, \
    {"YMOT_COR", "OMIT", "cf_calculate_ycent_motion", "PERFORM", "cf_calculate_ycent_motion"}, \
    {"GRAT_COR", "PERFORM", "cf_grating_motion", "PERFORM", "cf_grating_motion"}, \
    {"FPA__COR", "PERFORM", "cf_fpa_position", "PERFORM", "cf_fpa_position"}, \
    {"MIRR_COR", "PERFORM", "cf_mirror_motion", "PERFORM", "cf_mirror_motion"}, \
    {"JITR_COR", "OMIT", "cf_satellite_jitter", "PERFORM", "cf_satellite_jitter"}, \
    {"YCNT_COR", "PERFORM", "cf_calculate_y_centroid", "PERFORM", "cf_calculate_y_centroid"}, \
    {"CHID_COR", "PERFORM", "cf_identify_channel", "PERFORM", "cf_identify_channel"}, \
    {"TCRT_COR", "PERFORM", "cf_target_count_rate", "PERFORM", "cf_target_count_rate"}, \
    {"ASTG_COR", "PERFORM", "cf_astigmatism", "PERFORM", "cf_astigmatism"}, \
    {"WAVE_COR", "PERFORM", "cf_dispersion", "PERFORM", "cf_dispersion"}, \
    {"DOPP_COR", "PERFORM", "cf_doppler_and_heliocentric", "PERFORM", "cf_doppler_and_heliocentric"}, \
    {"FLAT_COR", "OMIT", "cf_flat_field", "OMIT", "cf_flat_field"}, \
    {"FLUX_COR", "PERFORM", "cf_convert_to_ergs", "PERFORM", "cf_convert_to_ergs"}, \
    {"COMB_COR", "PERFORM", "cf_coadd", "PERFORM", "cf_coadd"} \
}


struct cal_file_tab
{
    char  name[5];
    int   numfiles;
    char  extension[4];
    char  filenames[3][19];
    float aftermjd[3];
    int   interp[3];
};

#define NUMCALKEYS 28

#define CALIBRATION_FILE_KEYS { \
    {"AEFF", 2, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"AIRG", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"ASTG", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"BCHR", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"BKGD", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"CHID", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"DIGI", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"ELEC", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"FLAT", 2, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"GEOM", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"GRAT", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"HSKP", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"JITR", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"MIRR", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"PARM", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"PHAH", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"PHAX", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"QUAL", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"RATE", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"TMXY", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"SAAC", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"SCRN", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"SPEC", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"STIM", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"VOLT", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"WAVE", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"WGTS", 1, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}},\
    {"WORM", 2, "CAL", {"", "", ""}, {0.0, 0.0, LARGEMJD}, {0, 0, 0}} \
}

extern int verbose_level;

void   cf_error_init(const char *, const char *, FILE *);
void   cf_verbose(int, const char *, ...);
void   cf_if_fits_error(int);
void   cf_if_warning(char *, ...);
void   cf_if_error(char *, ...);
void  *cf_malloc(size_t);
void  *cf_calloc(size_t, size_t);

void   cf_timestamp(const char *, const char *, char *);
int    cf_proc_check(fitsfile *, char *);
int    cf_proc_update(fitsfile *, char *, char *);
int    cf_fuv_init(fitsfile *);

char  *cf_cal_file(char *);
char  *cf_parm_file(char *);
int    eclipse(double *, double, double *);
double geod_mag(double, double);
double helio_vel(double, double, double);
double lsrd_vel(double, double);
double lsrk_vel(double, double);
void   month_day(int, int, int*,  int*);
void   read_tle(fitsfile *);
double pole_ang(double *, double *, double, double);
double solar_ang(double, double, double);
int    saa(saareg *, double, double);
double space_vel(double *, double, double);
void   state_geod(double *, double, double *, double *, double *);
double state_limb(double *, double, double, double, double *,int *);
void   cf_velang(fitsfile *, double);
int    astig_check_input_image(fitsfile *);

long   cf_read_col(fitsfile *, int, char *, void **);
int    cf_write_col(fitsfile *, int, char *, void *, long);
int    cf_nint (double);
long   cf_nlong (double);

int    cf_fes_proc_check(fitsfile *, char *);
int    cf_fes_proc_update(fitsfile *, char *, char *);

int    cf_add_header_keywords(fitsfile *);
long   cf_get_times(fitsfile *, double **);
int    cf_get_gti(fitsfile *, double **, double **);
int    cf_get_geocorona(fitsfile *, short **, short **, short **, short **);
int    cf_get_potholes(fitsfile *, float **, float **, float **, float **);
int    cf_timeline(fitsfile *);
int    cf_set_background_limits(fitsfile *);
long   cf_extraction_limits(fitsfile *, int, int, short **, short **,
				short*, short*);

int    cf_check_digitizer(fitsfile *);
int    cf_ids_dead_time(fitsfile *, long, float *, float *);
int    cf_electronics_dead_time(fitsfile *, long, float *, float *);
int    cf_fifo_dead_time(fitsfile *, long, float *, long, float *, float *,
			float *);
int    cf_apply_dead_time(fitsfile *, long, float *, float *,
				long, float *, float *, float *);
int    cf_thermal_distort(fitsfile *, long, float *, float *, float *,
                                unsigned char *);
int    cf_count_rate_y_distort(fitsfile *, long, float *, float *,
			       unsigned char *, long, float *, float *);
int    cf_time_xy_distort(fitsfile *, long, float *, float *, unsigned char *);
int    cf_geometric_distort(fitsfile *, long, float *, float *,
			    unsigned char *);
int    cf_modify_hist_pha(fitsfile *, long, unsigned char *, unsigned char *);
int    cf_pha_x_distort(fitsfile *, long, unsigned char *, float *,
			unsigned char *);
int    cf_active_region(fitsfile *, long, float *, float *, unsigned char *);

int    cf_find_spectra(fitsfile *, long, float *, float *, float *,
		unsigned char *, unsigned char *, unsigned char *, int);
int    cf_identify_channel(fitsfile *, long, float *, float *, unsigned char *,
			unsigned char *, int, int);
int    cf_calculate_ycent_motion(fitsfile*, long, float*, float*,
		unsigned char*, unsigned char*, long, float*, float*, float*);
int    cf_source_aper(fitsfile*, int*);
int    cf_grating_motion(fitsfile *, long, float *, float *, float *, 
			unsigned char *, long, float *, short *);
int    cf_fpa_position(fitsfile *, long, float *, unsigned char *);
int    cf_read_fpa_pos (fitsfile *, float *, float *);
int    cf_mirror_motion(fitsfile *, long, float *, float *, float *, 
			unsigned char *, long, float *, short *);
int    cf_satellite_jitter(fitsfile *, long, float *, float *, float *,
		unsigned char *, long, float *, unsigned char *);
int    cf_calculate_y_centroid(fitsfile*, long, float*, float*, float*,
			unsigned char*, unsigned char*, unsigned char*);
int    cf_target_count_rate(fitsfile *, long, float *, float *, unsigned char *,
			unsigned char *, long, float *, float *, float *);
int    cf_screen_limb_angle(fitsfile *, long, unsigned char *, float *);
int    cf_screen_saa(fitsfile *, long, unsigned char *, float *, float *);
int    cf_screen_airglow(fitsfile *, long, float *, float *, unsigned char *);
int    cf_screen_bad_pixels(fitsfile *, long, float *, float *, unsigned char *);
int    cf_screen_burst(fitsfile *, long, float *, float *, float *,
		unsigned char *, GTI *, long, float *, unsigned char *, float *,
		short *);
int    cf_screen_jitter(fitsfile *, long, float *, unsigned char *);
int    cf_set_user_gtis(fitsfile *, long, float *, unsigned char *);
int    cf_screen_high_voltage(fitsfile *, long, unsigned char *, short *);
int    cf_screen_pulse_height(fitsfile *, long, unsigned char *, unsigned char *);
int    cf_set_photon_flags(fitsfile *, long, float *, float *, unsigned char *,
			unsigned char *, long, float *, unsigned char *);
int    cf_set_good_time_intervals(fitsfile *, long, float *, unsigned char *,
			GTI *);
int    cf_modify_hist_times(fitsfile *, long, float *, GTI *);
int    cf_astigmatism(fitsfile *, long, float *, float *, unsigned char *);
int    cf_dispersion(fitsfile *, long , float *, unsigned char *, float *);
int    cf_doppler_and_heliocentric(fitsfile *, long, float *, unsigned char *,
		float *, long, float *, float *);
int    cf_convert_to_ergs(fitsfile *, long , float *, float *,
			unsigned char *, float *);
int    cf_apply_filters(fitsfile *, int, long, unsigned char *, unsigned char *,
			long, unsigned char *, long *, long *,	long *, long **);
int    cf_scale_bkgd(fitsfile *, long, float *, float *, float *, unsigned char *, 
        unsigned char *, unsigned char *, long,
	long *, long, long, int *, int *, int *, int *, int *, float **,
	int *, int *, int *, float **);
int    cf_make_mask(fitsfile *, int, long, float *, int, int, float **);
int    cf_make_wave_array(fitsfile *, int, long *, float **);
int    cf_rebin_probability_array(fitsfile *, int, int, long, float *, int *,
			float *, float **);
int    cf_rebin_background(fitsfile *, int, long, float *,
		int, int, int, int, float *, float **);
int    cf_standard_or_optimal_extraction(fitsfile *, int *);
int    cf_optimal_extraction(fitsfile *, int, int, float *, float *,
		unsigned char *, float *, long, long *, float *,
		float *, int, float, float *, long, float *, float **,
		float **, long **, float **, float **, short **);
int    cf_write_extracted_spectrum(fitsfile *, int, int, long, float *,
		float *, float *, long *, float *, float *, short *, char *);
char   *cf_hist_file(char *);