ocssw  1.0
/disk01/web/ocssw/build/src/l1agen_czcs/l1czcs.h (r8096/r4879)
Go to the documentation of this file.
00001 #ifndef __CZCS_DEFINED
00002 #define __CZCS_DEFINED 1
00003 /*
00004 Name: l1czcs.h
00005 
00006 This file contains structures and typedef's for czcs lever 1 data.
00007 Also, function prototypes are defined 
00008 
00009 The typedefs:
00010 
00011      HEADER2_TYPE  :  typedef for a czcs level 1 tape
00012                       document record;
00013      DATA_REC_TYPE :  typdef for a czcs level 1 data record.
00014 
00015 JPB 20 Jun 95
00016 
00017 W. Robinson, SAIC, 5 Mar 2004   adapt for use in l1czcs program, to 
00018                                 update for Watson Gregg's Algorithm
00019                                 Improvement
00020 
00021 */
00022 
00023 #define NCZCS_PIX 1968
00024 /*
00025  *   definition of document record:
00026  */
00027 #include "hdf.h"
00028 #include "mfhdf.h"
00029 
00030 struct bit_field_1 /* a bit field used in document record */ {  
00031 #ifdef __DEC_MACHINE        
00032   unsigned p_rec_num : 12;
00033   unsigned sp1 : 4;
00034   unsigned rec_id : 6;
00035   unsigned file :2; 
00036   unsigned valid_data_flg : 8;
00037 #else
00038   unsigned p_rec_num : 12;
00039   unsigned sp1 : 4;
00040   unsigned file :2;
00041   unsigned rec_id : 6;
00042   unsigned valid_data_flg : 8;
00043 #endif
00044 };
00045 
00046 typedef struct bit_field_1 BIT_FLD_1_TYPE;
00047 
00048 struct line_long {
00049  int slope;
00050  int intercept;
00051 };
00052 
00053 typedef struct line_long LINE_TYPE_LONG;
00054 
00055 struct line_short {
00056   short slope;
00057   short intercept;
00058 };
00059 
00060 typedef struct line_short LINE_TYPE_SHORT;
00061 struct hdr2 {
00062   BIT_FLD_1_TYPE file_info;
00063 
00064   unsigned char target_area_code[3];
00065   unsigned char file_no;
00066 
00067   int tape_seq_no;
00068   int film_frame_no;
00069   short starting_yr;
00070 
00071   short starting_day;
00072 
00073   int start_msec;
00074   int inc_in_msec; 
00075   short orbit;
00076   short no_of_scans;
00077   short lat_cntr;
00078   short long_cntr;
00079   short lat_crnr_fitl;
00080   short long_crnr_fitl;
00081   short lat_crnr_fitr;
00082   short long_crnr_fitr;
00083   short lat_crnr_litl;
00084   short long_crnr_litl;
00085   short lat_crnr_litr;
00086   short long_crnr_litr;
00087   unsigned char ilt_flags;
00088   unsigned char parameter_presence;
00089   short no_of_missing_scans_all;
00090   short no_of_missing_scans[6]; 
00091   unsigned char alg_id_chan[6];
00092   unsigned char alg_id_location;
00093   char spare2;
00094   int decom_run_no;   
00095   int decom_reel_no;
00096   short no_of_hdt_sync_losses;
00097   short no_of_hdt_parity_errs;
00098   short no_of_wbvt_sync_losses;
00099   short no_of_wbvt_bit_slips;
00100   short ave_subcomputed_data[32];
00101   char spare3;
00102   unsigned char bp_flag;
00103   short baseplate_temp;
00104   int spare4[134];
00105   unsigned char gain;
00106   unsigned char threshold;
00107   short tilt;
00108   short scene_cntr_yr;
00109   short scene_cntr_doy;
00110   int scene_cntr_msec;
00111   short solar_el_cntr;
00112   short solar_az_cntr;
00113   short cntr_roll;
00114   short cntr_pitch;
00115   short cntr_yaw;
00116   unsigned char top_bot_tick_label_flag;
00117   unsigned char lft_rgt_tick_label_flag;
00118   short top_lft_tick_label;
00119   short top_rgt_tick_label;
00120   short bot_lft_tick_label;
00121   short bot_rgt_tick_label;
00122   short lft_top_tick_label;
00123   short lft_bot_tick_label;
00124   short rgt_top_tick_label;
00125   short rgt_bot_tick_label;
00126   unsigned char top_tick_inc;
00127   unsigned char bot_tick_inc;
00128   unsigned char lft_tick_inc;
00129   unsigned char rgt_tick_inc;
00130   short top_tick_loc[27];
00131   short bot_tick_loc[27];
00132   short lft_tick_loc[27];
00133   short rgt_tick_loc[27];
00134   LINE_TYPE_LONG chan_line[6];
00135   short conversion_tab_chan6[256];
00136   LINE_TYPE_SHORT enhancement_eqs[6];
00137   int spare5[2];
00138   int czcs_1lt[945];  
00139   unsigned char dummy[304]; /* rounded out record to 512 blk boundary */
00140 } ;
00141 
00142  typedef struct hdr2 HEADER2_TYPE;
00143  
00144 
00145 
00146 
00147 /*
00148  *      definition of data record:
00149  */
00150 
00151 
00152  
00153 struct bit_field_2 {           /* bit field used in data record */
00154 #ifdef __DEC_MACHINE
00155   unsigned p_rec_num : 12;
00156   unsigned sp1 : 4;
00157   unsigned rec_id : 6;
00158   unsigned file :2;
00159   unsigned undefined : 3;
00160   unsigned volt_outside_range : 1;
00161   unsigned cal_outside_range : 1;
00162   unsigned channel_not_present : 1;
00163   unsigned qstnble_attitude : 1;
00164   unsigned qstnble_ephemeris : 1;
00165 #else
00166   unsigned p_rec_num : 12;
00167   unsigned sp1 : 4;
00168   unsigned file :2;
00169   unsigned rec_id : 6;
00170   unsigned qstnble_ephemeris : 1;
00171   unsigned qstnble_attitude : 1;
00172   unsigned channel_not_present : 1;
00173   unsigned cal_outside_range : 1;
00174   unsigned volt_outside_range : 1;
00175   unsigned undefined : 3;
00176 #endif
00177 };
00178 
00179 typedef struct bit_field_2  BIT_FLD_2_TYPE;
00180 
00181 
00182 
00183 struct voltage_step {     /*  a component of voltage staircase */
00184   unsigned char whole;
00185   unsigned char fraction;
00186 }  ;
00187  
00188 typedef struct voltage_step VOLTAGE_STEP;
00189 
00190 
00191 
00192 struct data_record_struct {
00193   BIT_FLD_2_TYPE info;
00194   short seq_no;
00195   unsigned char spare1;
00196   unsigned char time_update_flag;
00197   short year;
00198   short doy;
00199   int msec_of_day;
00200   short subcommuted_data_val_cnt;
00201   unsigned char subcom_id;
00202   unsigned char spare2;
00203   VOLTAGE_STEP volt_stair[6][16]; /* one 16 step staircase per channel */ 
00204   short cal_lamp_rad[6];
00205   short blk_bdy_tmp_cnt;
00206   short wbvt_bit_slips_summary;
00207   short hdt_sync_losses;
00208   short hdt_parity_errs;
00209   short wbvt_bit_slips;
00210   int lat_anchr_pts[77];
00211   int long_anchr_pts[77];
00212   unsigned short pxl_no_nadir;
00213   unsigned char cal_qual[6];  /* one per channel */
00214   unsigned char radiance_cnts[6][1968];  /* 1968 counts per channel */
00215   int spare3[28];
00216   unsigned char dummy[20]; /* round out record to 512 block boundary */
00217 };
00218 
00219 typedef struct data_record_struct DATA_REC_TYPE;
00220 
00221 
00222 /*
00223  * Definition of VAX header rec :
00224  */
00225 
00226 struct VAX_header_struct {
00227   unsigned short magic1;
00228   unsigned short magic2;
00229   unsigned short data_rec_len;
00230   unsigned short num_of_doc_recs;
00231   unsigned short offset_1st_data_rec;
00232   unsigned short type_code;
00233   unsigned short num_of_data_recs;
00234   unsigned short orbit;
00235   unsigned short year;
00236   unsigned short header_rec_offset;
00237   unsigned short header_rec_len;
00238   unsigned short doc_rec_len;
00239   unsigned short dummy1;
00240   unsigned short dummy2;
00241   unsigned short dummy3;
00242   unsigned short scanner_tilt;
00243   char text[480];
00244 } ;
00245 
00246 typedef struct VAX_header_struct HEADER1_TYPE;
00247 
00248 /*
00249  *  structure to contain l1 and lat, lon anchor point data
00250  */
00251 
00252 struct l1_data_struc_def {
00253   unsigned char *counts[6]; /* counts for 6 bands in form pix x line x band */
00254                          /* with pixels running fastest  */
00255   int *msec;
00256   float *ctl_pt_lat;
00257   float *ctl_pt_lon;
00258   int *ctl_pt_cols;  /* control pint columns and rows, evenly spaced   */
00259   int *ctl_pt_rows;  /* and lastpoint on the line   */
00260   float *tilt;  /* tilt / line */
00261   float *slat;  /* start, center, end lat, lon per line */
00262   float *slon;
00263   float *clat;
00264   float *clon;
00265   float *elat;
00266   float *elon;
00267   unsigned char *cal_sum;  /* calibration quality summary and */
00268   unsigned char *cal_scan; /* quality per scan */
00269   float *orb_vec;
00270   float *att_ang;
00271   float *pos_err;
00272   float *slope;
00273   float *intercept;
00274   short *gain;
00275 #ifdef GEOM_CAL
00276   float *sen_zen;  /* geometry and calibrated radiances for test */
00277   float *sen_az;
00278   float *sol_zen;
00279   float *sol_az;
00280   float *all_lat;
00281   float *all_lon;
00282   float *Lt_443;
00283   float *Lt_520;
00284   float *Lt_550;
00285   float *Lt_670;
00286   float *Lt_750;
00287   float *Lt_11500;
00288 #endif
00289   };
00290 
00291 typedef struct l1_data_struc_def l1_data_struc;
00292 
00293 /*
00294  *  Global attributes for output to the hdf file
00295  */
00296 
00297 struct gattr_struc_def {
00298   char prod_name[40];          /* Product Name */
00299   char f_title[40];           /* Title */
00300   char  datatype[16];         /* Data Type */
00301   char  datacenter[256];      /* Data Center */
00302   char  stn_name[256];        /* Station Name */
00303   float stn_lat;              /* Station Latitude */
00304   float stn_lon;              /* Station Longitude */
00305   char mission[40];           /* Mission */
00306   char mission_char[256];     /* Mission Characteristics */
00307   char sensor[40];            /* Sensor */
00308   char sensor_char[256];      /* Sensor Characteristics */
00309   char repl_flg[40];          /* Replacement Flag */
00310   char  soft_id[128];         /* Software ID */
00311   char  process_time[17];     /* Processing Time */
00312   char  input_files[1280];     /* Input Files */
00313   char proc_ctl[1024];        /* Processing Controls */
00314   char  start_time[17];       /* Start Time */
00315   char  end_time[17];         /* End Time */
00316   char  center_time[17];      /* Scene Center Time */
00317   short start_year;           /* Start Year */
00318   short start_day;            /* Start Day */
00319   int   start_msec;           /* Start Milisec */
00320   short end_year;             /* End Year */
00321   short end_day;              /* End Day */
00322   int   end_msec;             /* End Milisec */
00323   char start_node[11];        /* Start Node */
00324   char end_node[11];          /* End Node */
00325   int   orbit;                /* Orbit Number */
00326   int   gain;                 /* Scene Gain */
00327   int   thresh;               /* Thresh */
00328   float   tilt;               /* Sensor Tilt */
00329   char lat_unit[15];          /* Latitude Units */
00330   char lon_unit[15];          /* Longitude Units */
00331   float center_lat;           /* Scene Center Latitude */
00332   float center_lon;           /* Scene Center Longitude */
00333   float cntr_sol_zen;         /* Scene Center Solar Zenith */
00334   float up_lft_lat;           /* Upper Left Latitude */
00335   float up_lft_lon;           /* Upper Left Longitude */
00336   float lo_lft_lat;           /* Lower Left Latitude */
00337   float lo_lft_lon;           /* Lower Left Longitude */
00338   float up_rgt_lat;           /* Upper Right Latitude */
00339   float up_rgt_lon;           /* Upper Right Longitude */
00340   float lo_rgt_lat;           /* Lower Right Latitude */
00341   float lo_rgt_lon;           /* Lower Right Longitude */
00342   float start_cntr_lat;       /* Start Center Latitude */
00343   float start_cntr_lon;       /* Start Center Longitude */
00344   float end_cntr_lat;         /* End Center Latitude */
00345   float end_cntr_lon;         /* End Center Longitude */
00346   int   pix_per_scan;         /* Pixels per Scan Line */
00347   int   scan_lines;           /* Number of Scan Lines */
00348   int   lac_pixl_start_no;    /* LAC Pixel Start Number */
00349   int   lac_pixl_subsample;   /* LAC Pixel Subsampling */
00350   int cntr_scn_line;          /* Scene Center Scan Line */
00351   int filled_lines;           /* Filled Scan Lines */
00352   float limits[4];           /* Northernmost Latitude, Southernmost 
00353                     Latitude, Westernmost Longitude, Easternmost Longitude */
00354   float slope[6];   /* calibration slope and intercept from 2nd */
00355   float intercept[6];  /* header = derived from voltage staircase */
00356             /* Calibration Slope and Calibration Intercept */
00357   float roll;  /* Center Roll S/C roll, pitch and yaw at scene center */
00358   float pitch;                /* Center Pitch */
00359   float yaw;                  /* Center Yaw */
00360   int ctl_pt_incr;
00361   int n_ctl_pt;               /* Number of Pixel Control Points */
00362   int n_ctl_lin;              /* Number of Scan Control Points */
00363   unsigned char ilt_flags;    /* ILT Flags */
00364   unsigned char parm_presence;   /* Parameter Presence Code */
00365   short n_miss_scans;         /* Number of Missing Scan Lines */
00366   short n_scan_mis_chan[6];  /* Number of Scans with Missing Channels */
00367   short n_hdt_sync_loss;      /* Number of HDT Sync Losses */
00368   short n_hdt_parity_err;     /* Number of HDT Parity Errors */
00369   short n_wbvt_sync_loss;     /* Number of WBVT Sync Losses */
00370   short n_wbvt_slips;         /* Number of WBVT Slip Occurrences */
00371   };
00372 
00373 typedef struct gattr_struc_def gattr_struc;
00374 
00375 struct timqual_struc_d
00376   {
00377   int nscan;      /* # scan lines */
00378   int n_ctl_pt;   /* # pixel ctl points - needed to set up out file */
00379   int *qual;      /* quality - 0 good, 1 bad */
00380   int32_t *msec;     /* msec from the file */
00381   };
00382 
00383 typedef struct timqual_struc_d timqual_struc;
00384 
00385 struct mstr_struc_d
00386   {
00387   int32_t *msec;  /* time tag */
00388   short *exist;  /* does this scan exist? 1 = yes */
00389   short *qual;  /* quality 0 = good, 1 bad */
00390   short *ds_num;  /* dataset # in file list to take scan from */
00391   int32_t *out_scan; /* output scan line to place the data */
00392   short *scan;   /* scan # to use */
00393   int32_t *in_msec;  /* the in_ values are for new candidate scans */
00394   short *in_exist;
00395   short *in_qual;
00396   short *in_scan;
00397   };
00398 
00399 typedef struct mstr_struc_d mstr_struc;
00400 
00401 #endif
00402 
00403 /*
00404  *  the function prototypes
00405  */
00406 int main( int, char *[] );
00407 int read_crtt( char *, gattr_struc *, l1_data_struc * );
00408 void get_record_info( HEADER1_TYPE, short *, short *, short *, short *, 
00409   short * );
00410 short reverse_short_int( short );
00411 int32_t reverse_long_int( int32_t );
00412 void hdr_2_gattr( HEADER2_TYPE, gattr_struc * );
00413 float fixed_pt_2_floating_pt( int, int );
00414 int czcs_l1_write( char *, l1_data_struc, gattr_struc );
00415 int create_global_attribute( char *, int, gattr_struc );
00416 int create_band_sds( int, int, unsigned char *[], int, int );
00417 void czcs_ctl_pt( DATA_REC_TYPE, gattr_struc *, int, l1_data_struc * );
00418 void lonlat_( float[], float[], float[], float[] );
00419 void lladjust_( float *, float *, float *, float *, float[], float[], float[] );
00420 void satang_( double *, double *, float *, float *, float *, float *, float *,
00421   float *, float *, float * );
00422 void sunangs_( int *, int *, float *, float *, float *, float *, float * );
00423 int time_str( short, short, int, char * );
00424 void cz_ll_upd( l1_data_struc *, gattr_struc * );
00425 int wrt_czcs_sla( int32, int32, int, l1_data_struc );
00426 int wrt_czcs_qual( int32, int32, int, l1_data_struc );
00427 int32 set_czcs_ctl_data( int32, int32, gattr_struc, l1_data_struc );
00428 int cz_clean( gattr_struc *, l1_data_struc * );
00429 /* new for the merge program */
00430 int read_file_list (char *, char **, int );
00431 void usage( char * );
00432 void olap_resolve( mstr_struc *, int, int, int, int );
00433 void fill_mstr( int *, mstr_struc *, timqual_struc *, int, int, int );
00434 int cztimqual( char *, timqual_struc *, int * );
00435 int cz_l1_read( char *, int, gattr_struc *, l1_data_struc * );
00436 int cz_dat_alloc( int, int, int, l1_data_struc * );
00437 void cz_dat_free( l1_data_struc *, int );
00438 int cz_mov_scn( int, int, char *, mstr_struc *, int, int, gattr_struc *, 
00439   l1_data_struc * );
00440 void cz_meta_adj( l1_data_struc *, gattr_struc * );
00441 void cz_sd_set( l1_data_struc *, gattr_struc * );
00442 int fill_orb_dat( l1_data_struc *l1_data, gattr_struc *gattr );
00443 #ifdef __DEC_MACHINE
00444 void convert_data_rec_to_dec( DATA_REC_TYPE * );
00445 void convert_header_rec_to_dec( HEADER2_TYPE * );
00446 #endif