int main( int argc, char *argv[] )
{
     register unsigned short np = 0;

     unsigned short orbit;
     float orbitPhase;

     bool fnd_24, fnd_30;

     float ao_24[CHANNEL_SIZE], lc_24[CHANNEL_SIZE], 
	  ao_err_24[CHANNEL_SIZE], lc_err_24[CHANNEL_SIZE];
     float ao_30[CHANNEL_SIZE], lc_30[CHANNEL_SIZE], 
	  ao_err_30[CHANNEL_SIZE], lc_err_30[CHANNEL_SIZE];
/*
 * initialization of command-line parameters
 */
     if ( argc <= 2 || (argc > 1 && strncmp( argv[1], "-h", 2 ) == 0) ) {
	  (void) fprintf( stderr, "Usage: %s orbit orbitPhase\n", argv[0] );
          exit( EXIT_FAILURE );
     }
     orbit = (unsigned short) atoi( argv[1] );
     orbitPhase = (float) atof( argv[2] );
     
     fnd_24 = SDMF_get_OrbitalDark_24( orbit, orbitPhase, ao_24, lc_24,
				       ao_err_24, lc_err_24 );
     if ( IS_ERR_STAT_FATAL )
          NADC_GOTO_ERROR(NADC_ERR_FATAL, "SDMF_get_OrbitalDark_24");

     fnd_30 = SDMF_get_OrbitalDark_30( orbit, orbitPhase, ao_30, lc_30,
				       ao_err_30, lc_err_30 );
     if ( IS_ERR_STAT_FATAL )
          NADC_GOTO_ERROR(NADC_ERR_FATAL, "SDMF_get_OrbitalDark_30");
/*
 * 
 */
     if ( ! (fnd_24 || fnd_30) ) goto done;
     do {
	  (void) printf( "%5hu", np );
	  if ( fnd_24 ) {
	       (void) printf( " %12.6g %12.6g %12.6g %12.6g", 
			      ao_24[np], lc_24[np], ao_err_24[np], 
			      lc_err_24[np] );
	  }
	  if ( fnd_30 ) {
	       (void) printf( " %12.6g %12.6g %12.6g %12.6g", 
			      ao_30[np], lc_30[np], ao_err_30[np], 
			      lc_err_30[np] );
	  }
	  (void) printf( "\n" );
     } while( ++np < CHANNEL_SIZE );
done:
     NADC_Err_Trace( stderr );
     if ( IS_ERR_STAT_FATAL )
          exit( EXIT_FAILURE );
     else
          exit( EXIT_SUCCESS );
}
示例#2
0
/*+++++++++++++++++++++++++
.IDENTifer   SDMF_get_PPG_24
.PURPOSE     Read Pixel-to-Pixel Gain factors from Monitoring database (v2.4)
.INPUT/OUTPUT
  call as    SDMF_get_PPG_24( absOrbit, channel, pixelGain );
     input:
           unsigned short absOrbit  :  absolute orbitnumber
           unsigned short channel   :  channel ID or zero for all channels
    output:
           float *pixelGain         :  Pixel-to-Pixel Gain factors

.RETURNS     flag: FALSE (no mask found) or TRUE
             error status passed by global variable ``nadc_stat''
.COMMENTS    none
-------------------------*/
bool SDMF_get_PPG_24( unsigned short absOrbit, unsigned short channel, 
		      float *pixelGain )
{
     register unsigned np = 0;

     char ppg_fl[MAX_STRING_LENGTH];

     FILE  *db_fp;

     const size_t disk_sz_ppg_rec = 32816;
     struct ppg_rec {
          int    Orbit;
          int    MagicNumber;
          int    Saa;
          float  Tobm;
          float  Tdet[SCIENCE_CHANNELS];
          float  PixelGain[SCIENCE_PIXELS];
     } mrec;
/*
 * initialise output arrays
 */
     if ( channel == 0 ) {
	  do { pixelGain[np] = 1.f; } while ( ++np < SCIENCE_PIXELS );
     } else {
	  do { pixelGain[np] = 1.f; } while ( ++np < CHANNEL_SIZE );
     }
/*
 * find file with Pixel-to-Pixel Gains, requirements:
 *  - orbit number within a range MAX_DiffOrbitNumber
 */
     if ( ! SDMF_get_fileEntry( SDMF24_PPG, (int) absOrbit, ppg_fl ) ) 
          return FALSE;
/*
 * read Pixel-to-Pixel Gain values
 */
     if ( (db_fp = fopen( ppg_fl, "r" )) == NULL )
          NADC_GOTO_ERROR( NADC_ERR_FILE, ppg_fl );
     if ( fread( &mrec, disk_sz_ppg_rec, 1, db_fp ) != 1 )
          NADC_GOTO_ERROR( NADC_ERR_FILE_RD, "mrec" );
     (void) fclose( db_fp );

     if ( channel == 0 ) {
          (void) memcpy( pixelGain, mrec.PixelGain,
                         SCIENCE_PIXELS * sizeof(float) );
     } else {
          const size_t offs = (channel-1) * CHANNEL_SIZE;

          (void) memcpy( pixelGain, mrec.PixelGain+offs,
                         CHANNEL_SIZE * sizeof(float) );
     }
     return TRUE;
 done:
     return FALSE;
}
示例#3
0
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
int IDL_STDCALL _SDMF_RD_PT_CLUSTER( int argc, void *argv[] )
{
     register size_t nr;

     IDL_STRING     *dbName;
     unsigned short clus_id, state_id;
     unsigned int   numIndx, *metaIndx;
     float          *pixel_val;
     struct mtbl_pt_rec *mtbl;

     char   grpName[9];
     size_t C_numIndx, *C_metaIndx;
     hid_t  fid = -1, gid = -1;
/*
 * check number of parameters
 */
     if ( argc != 7 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     dbName   = (IDL_STRING *) argv[0];
     state_id = *(unsigned short *) argv[1];
     clus_id  = *(unsigned short *) argv[2];
     numIndx  = *(unsigned int *) argv[3];
     metaIndx = (unsigned int *) argv[4];
     mtbl      = (struct mtbl_pt_rec *) argv[5];
     pixel_val = (float *) argv[6];

     if ( numIndx == 0 ) return 0;

     fid = H5Fopen( dbName->s, H5F_ACC_RDONLY, H5P_DEFAULT );
     if ( fid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, dbName->s );

     (void) snprintf( grpName, 9, "State_%02hu", state_id );
     gid = H5Gopen( fid, grpName, H5P_DEFAULT );
     if ( gid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, grpName );

     C_numIndx  = (size_t) numIndx;
     C_metaIndx = (size_t *) malloc( C_numIndx * sizeof( size_t ));
     for ( nr = 0; nr < C_numIndx; nr++ )
	  C_metaIndx[nr] = (size_t) metaIndx[nr];

     SDMF_rd_pt_metaTable( gid, &C_numIndx, C_metaIndx, &mtbl );
     SDMF_rd_pt_cluster( gid, clus_id, &C_numIndx, C_metaIndx, pixel_val );

     free( C_metaIndx );

     (void) H5Gclose( gid );
     (void) H5Fclose( fid );
     return 1;
 done:
     H5E_BEGIN_TRY {
	  (void) H5Gclose( gid );
	  (void) H5Fclose( fid );
     } H5E_END_TRY;
     return -1;
}
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
void SCIA_WR_SQL_CH4_META( PGconn *conn, const struct imap_hdr *hdr )
{
     PGresult *res;

     char  *pntr, sql_query[SQL_STR_SIZE];

     int   nrow, numChar, meta_id;
/*
 * check if product is already in database
 */
     (void) snprintf( sql_query, SQL_STR_SIZE, 
		      "SELECT * FROM %s WHERE name=\'%s\'", 
		      META_TBL_NAME, hdr->product );
     res = PQexec( conn, sql_query );
     if ( PQresultStatus( res ) != PGRES_TUPLES_OK ) {
          NADC_GOTO_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
     }
     if ( (nrow = PQntuples( res )) != 0 ) {
          NADC_GOTO_ERROR( NADC_ERR_SQL_TWICE, hdr->product );
     }
     PQclear( res );
/* 
 * obtain next value for serial pk_meta
 */
     res = PQexec( conn,
                   "SELECT nextval(\'meta_imap_ch4_pk_meta_seq\')" );
     if ( PQresultStatus( res ) != PGRES_TUPLES_OK )
          NADC_GOTO_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
     pntr = PQgetvalue( res, 0, 0 );
     meta_id = (int) strtol( pntr, (char **) NULL, 10 );
     PQclear( res );
/*
 * no error and not yet stored, then proceed
 */
     numChar = snprintf( sql_query, SQL_STR_SIZE, SQL_INSERT_META, 
			 META_TBL_NAME, meta_id,
			 hdr->product, hdr->l1b_product, hdr->file_size, 
			 hdr->receive_date, hdr->creation_date,
			 hdr->validity_start, hdr->validity_stop,
			 hdr->software_version, hdr->orbit[0], 
			 hdr->numRec );
/*      (void) fprintf( stderr, "%s [%-d]\n", sql_query, numChar ); */
     if ( numChar >= SQL_STR_SIZE )
	  NADC_RETURN_ERROR( NADC_ERR_STRLEN, "sql_query" );
/*
 * do the actual insert
 */
     res = PQexec( conn, sql_query );
     if ( PQresultStatus( res ) != PGRES_COMMAND_OK )
          NADC_GOTO_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
 done:
     PQclear( res );
}
示例#5
0
int IDL_STDCALL _ENVI_RD_MPH( int argc, void *argv[] )
{
     struct mph_envi *mph;

     if ( argc != 1 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     if ( ! File_Is_Open ) 
	  NADC_GOTO_ERROR( NADC_ERR_FILE, "No open stream" );

     mph = (struct mph_envi *) argv[0];
     ENVI_RD_MPH( fd_nadc, mph );
     if ( IS_ERR_STAT_FATAL ) return -1;

     return 1;
 done:
     return -1;
}
示例#6
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
unsigned int SCIA_RD_H5_LADS( struct param_record param, 
			      struct lads_scia *lads )
     /*@globals lads_size, lads_offs@*/
{
     hid_t   ads_id;
     hsize_t nfields, num_lads;

     const size_t lads_sizes[NFIELDS] = {
          sizeof( lads->mjd ),
          sizeof( lads->flag_mds ),
          sizeof( lads->corner )
     };
/*
 * create/open group /ADS/LADS
 */
     ads_id = NADC_OPEN_HDF5_Group( param.hdf_file_id, "/ADS" );
     if ( ads_id < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_GRP, "/ADS" );
/*
 * read info_h5 records
 */
     (void) H5TBget_table_info( ads_id, TBL_NAME, &nfields, &num_lads );
     (void) H5TBread_table( ads_id, TBL_NAME, lads_size, lads_offs, 
                            lads_sizes, lads );
     (void) H5Gclose( ads_id );

     return (unsigned int) num_lads;
 done:
     return 0u;
}
示例#7
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
short NADC_USRINDX( const char str_range[], int max_indx, short *indices )
{
     register int nr;

     char    *cpntr, cbuff[MAX_STRING_LENGTH];
     int     num;
     size_t  nchar;

     if ( (cpntr = strchr( str_range, '*' )) == NULL ) {
	  (void) NADC_USRINP( INT16_T, str_range, max_indx, indices, &num );
     } else {
	  nchar = cpntr - str_range;
	  (void) nadc_strlcpy( cbuff, str_range, nchar );
	  (void) sprintf( cbuff, "%s%-d%s", cbuff, max_indx-1, cpntr+1 );
	  (void) NADC_USRINP( INT16_T, cbuff, max_indx, indices, &num );

     }
     for ( nr = 0; nr < num; nr++ ) {
	  if ( indices[nr] < 0 ) indices[nr] += (short) max_indx;
	  if ( indices[nr] < 0 || indices[nr] >= (short) max_indx ) {
	       num = nr;
	       NADC_GOTO_ERROR( NADC_ERR_PARAM, "indices" );
	  }
     }
 done:
     return ((short) num);
}
示例#8
0
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
int IDL_STDCALL _SDMF_GET_PT_ORBITINDEX( int argc, void *argv[] )
{
     register size_t nr;

     IDL_STRING     *dbName;
     int            orbit;
     unsigned short state_id;
     unsigned int   *numIndx, *metaIndx;

     char   grpName[9];
     size_t C_numIndx, *C_metaIndx;
     hid_t  fid = -1, gid = -1;
/*
 * check number of parameters
 */
     if ( argc != 5 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     dbName   = (IDL_STRING *) argv[0];
     state_id = *(unsigned short *) argv[1];
     orbit    = *(int *) argv[2];
     numIndx  = (unsigned int *) argv[3];
     metaIndx = (unsigned int *) argv[4];

     fid = H5Fopen( dbName->s, H5F_ACC_RDONLY, H5P_DEFAULT );
     if ( fid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, dbName->s );

     (void) snprintf( grpName, 9, "State_%02hu", state_id );
     gid = H5Gopen( fid, grpName, H5P_DEFAULT );
     if ( gid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, grpName );

     C_numIndx  = (size_t) (*numIndx);
     C_metaIndx = (size_t *) malloc( C_numIndx * sizeof( size_t ));
     SDMF_get_pt_orbitIndex( gid, orbit, &C_numIndx, C_metaIndx );
     *numIndx = (unsigned int) C_numIndx;
     for ( nr = 0; nr < C_numIndx; nr++ )
	  metaIndx[nr] = (unsigned int) C_metaIndx[nr];
     free( C_metaIndx );

     (void) H5Gclose( gid );
     (void) H5Fclose( fid );
     return 1;
 done:
     H5E_BEGIN_TRY {
	  (void) H5Gclose( gid );
	  (void) H5Fclose( fid );
     } H5E_END_TRY;
     return -1;
}
int main( int argc, char *argv[] )
{
     register unsigned short np = 0;

     bool           wlsFlag = FALSE;
     unsigned short orbit;
     unsigned short channel = 0;

     bool  fnd_24, fnd_30;
     float trans_24[SCIENCE_PIXELS], trans_30[SCIENCE_PIXELS];
/*
 * initialization of command-line parameters
 */
     if ( argc == 1 || (argc > 1 && strncmp( argv[1], "-h", 2 ) == 0) ) {
          (void) fprintf(stderr, "Usage: %s orbit [channel] [wls]\n", argv[0]);
          exit( EXIT_FAILURE );
     }
     orbit = (unsigned short) atoi( argv[1] );
     if ( argc >= 3 ) channel = (unsigned short) atoi( argv[2] );
     if ( argc == 4 ) wlsFlag = TRUE;

     fnd_24 = SDMF_get_Transmission_24( wlsFlag, orbit, channel, trans_24 );
     if ( IS_ERR_STAT_FATAL )
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, "SDMF_get_Transmission_24" );
     if ( ! fnd_24 ) (void) fprintf( stderr, "# no solution for SDMF v2.4\n" );
     fnd_30 = SDMF_get_Transmission_30( wlsFlag, orbit, channel, trans_30 );
     if ( IS_ERR_STAT_FATAL )
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, "SDMF_get_Transmission_30" );
     if ( ! fnd_30 ) (void) fprintf( stderr, "# no solution for SDMF v3.0\n" );

     if ( ! (fnd_24 || fnd_30) ) goto done;
     do {
	  (void) printf( "%5hu", np );
	  if ( fnd_24 )
	       (void) printf( " %12.6g", trans_24[np] );
	  if ( fnd_30 )
	       (void) printf( " %12.6g", trans_30[np] );
	  (void) printf( "\n" );
     } while( ++np < ((channel == 0) ? SCIENCE_PIXELS : CHANNEL_SIZE) );
done:
     NADC_Err_Trace( stderr );
     if ( IS_ERR_STAT_FATAL )
          exit( EXIT_FAILURE );
     else
          exit( EXIT_SUCCESS );
}
示例#10
0
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
int IDL_STDCALL _SDMF_RD_PT_CLUS_ATTR( int argc, void *argv[] )
{
     IDL_STRING      *dbName;
     unsigned char   *coaddf;
     unsigned short  state_id, clus_id;
     unsigned short  *num_pixels, *num_obs;
     float           *pet;

     char    grpName[9], clusName[11];
     hid_t   fid = -1, gid = -1;
/*
 * check number of parameters
 */
     if ( argc != 7 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     dbName   = (IDL_STRING *) argv[0];
     state_id = *(unsigned short *) argv[1];
     clus_id  = *(unsigned short *) argv[2];
     coaddf   = (unsigned char *) argv[3];
     num_pixels = (unsigned short *) argv[4];
     num_obs  = (unsigned short *) argv[5];
     pet      = (float *) argv[6];

     fid = H5Fopen( dbName->s, H5F_ACC_RDONLY, H5P_DEFAULT );
     if ( fid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, dbName->s );

     (void) snprintf( grpName, 9, "State_%02hu", state_id );
     gid = H5Gopen( fid, grpName, H5P_DEFAULT );
     if ( gid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, grpName );

     (void) snprintf( clusName, 11, "cluster_%02hu", clus_id );
     (void) H5LTget_attribute_uchar( gid, clusName, "coaddf", coaddf );
     (void) H5LTget_attribute_ushort( gid, clusName, "numObs", num_obs );
     (void) H5LTget_attribute_ushort( gid, clusName,"numPixels", num_pixels );
     if ( H5LTget_attribute_float( gid, clusName, "PET", pet ) < 0 )
	  NADC_GOTO_ERROR( NADC_ERR_HDF_ATTR, "PET" );

     (void) H5Gclose( gid );
     (void) H5Fclose( fid );
     return 1;
 done:
     H5E_BEGIN_TRY {
	  (void) H5Gclose( gid );
	  (void) H5Fclose( fid );
     } H5E_END_TRY;
     return -1;
}
示例#11
0
/*+++++++++++++++++++++++++ Main Program or Functions +++++++++++++++*/
int IDL_STDCALL OpenFile( int argc, void *argv[] )
{
     IDL_STRING *str_descr;

     if ( argc != 1 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     str_descr = (IDL_STRING *) argv[0];

     if ( File_Is_Open ) (void) fclose( fd_nadc );

     if ((fd_nadc = fopen( str_descr[0].s, "r" )) == NULL ) {
	  NADC_GOTO_ERROR( NADC_ERR_FILE, strerror( errno ) );
     } else
	  File_Is_Open = TRUE;

     return 0;
 done:
     return -1;
}
示例#12
0
/*+++++++++++++++++++++++++
.IDENTifer   CAT_ASCII_FILE
.PURPOSE     Open file for writing in append mode (create if non-existing)
.INPUT/OUTPUT
  call as   outfile = CAT_ASCII_File( fl_name, extension );

     input:  
            char fl_name[]   :  name of output file (no extension!!!)
	    char extension[] :  extension to be concatenated (without ".")

.RETURNS     (open) stream pointer
.COMMENTS    none
-------------------------*/
FILE *CAT_ASCII_File( const char filebase[], const char ext[] )
{
     char   flname[MAX_STRING_LENGTH];
     FILE   *outfl = NULL;
/*
 * check size of output filename
 */
     if ( (strlen( filebase) + strlen( ext )) > MAX_STRING_LENGTH ) {
          (void) snprintf( flname, MAX_STRING_LENGTH,
			   "Filename too long (max: %d)\n", 
			   (int) MAX_STRING_LENGTH );
	  NADC_GOTO_ERROR( NADC_ERR_FILE, flname );
     }
     (void) snprintf( flname, MAX_STRING_LENGTH, "%s.%s", filebase, ext );
     if ( (outfl = fopen( flname, "a")) == NULL )
	  NADC_GOTO_ERROR( NADC_ERR_FILE_CRE, flname);
 done:
     return outfl;
}
示例#13
0
int IDL_STDCALL _ENVI_RD_DSD( int argc, void *argv[] )
{
     int nr_dsd = 0;

     struct mph_envi  mph;
     struct dsd_envi  *dsd;

     if ( argc != 2 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     if ( ! File_Is_Open ) 
	  NADC_GOTO_ERROR( NADC_ERR_FILE, "No open stream" );

     mph = *(struct mph_envi *) argv[0];
     dsd = (struct dsd_envi *) argv[1];

     nr_dsd = (int) ENVI_RD_DSD( fd_nadc, mph, dsd );
     if ( IS_ERR_STAT_FATAL ) return -1;

     return nr_dsd;
 done:
     return -1;
}
示例#14
0
unsigned short IDL_STDCALL _GET_SCIA_QUALITY( int argc, void *argv[] )
{
     int orbit, *range;

     if ( argc != 2 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     orbit  = *(int *) argv[0];
     range  = (int *) argv[1];

     return GET_SCIA_QUALITY( orbit, range );
done:
     return 0xFFFFU;
}
示例#15
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
int IDL_STDCALL _SDMF_RD_PT_CLUSDEF( int argc, void *argv[] )
{
     IDL_STRING         *dbName;
     struct clusdef_rec *ClusDef;

     hid_t  fid = -1;
     hid_t  data_id = -1;
     hid_t  type_id = -1;
/*
 * check number of parameters
 */
     if ( argc != 2 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     dbName   = (IDL_STRING *) argv[0];
     ClusDef  = (struct clusdef_rec *) argv[1];

     fid = H5Fopen( dbName->s, H5F_ACC_RDONLY, H5P_DEFAULT );
     if ( fid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, dbName->s );
     
     if ( (data_id = H5Dopen( fid, "ClusDef", H5P_DEFAULT )) < 0 )
	  NADC_GOTO_ERROR( NADC_ERR_HDF_DATA, "ClusDef" );

     if ( (type_id = H5Dget_type( data_id )) < 0 )
	  NADC_GOTO_ERROR( NADC_ERR_HDF_DTYPE, "ClusDef" );

     if ( H5LTread_dataset( fid, "ClusDef", type_id, ClusDef ) < 0 )
	  NADC_GOTO_ERROR( NADC_ERR_HDF_RD, "ClusDef" );

     (void) H5Tclose( type_id );
     (void) H5Dclose( data_id );
     (void) H5Fclose( fid );
     return 1;
 done:
     H5E_BEGIN_TRY {
	  (void) H5Tclose( type_id );
	  (void) H5Dclose( data_id );
	  (void) H5Fclose( fid );
     } H5E_END_TRY;
     return -1;
}
示例#16
0
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
int IDL_STDCALL _SDMF_RD_PT_GEO_ATTR( int argc, void *argv[] )
{
     IDL_STRING      *dbName;
     unsigned short  state_id;
     unsigned short  *num_obs;

     char    grpName[9];
     hid_t   fid = -1, gid = -1;
/*
 * check number of parameters
 */
     if ( argc != 3 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     dbName   = (IDL_STRING *) argv[0];
     state_id = *(unsigned short *) argv[1];
     num_obs  = (unsigned short *) argv[2];

     fid = H5Fopen( dbName->s, H5F_ACC_RDONLY, H5P_DEFAULT );
     if ( fid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, dbName->s );

     (void) snprintf( grpName, 9, "State_%02hu", state_id );
     gid = H5Gopen( fid, grpName, H5P_DEFAULT );
     if ( gid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, grpName );

     if ( H5LTget_attribute_ushort( gid, "pointing", "numObs", num_obs ) < 0 )
	  NADC_GOTO_ERROR( NADC_ERR_HDF_ATTR, "numObs" );

     (void) H5Gclose( gid );
     (void) H5Fclose( fid );
     return 1;
 done:
     H5E_BEGIN_TRY {
	  (void) H5Gclose( gid );
	  (void) H5Fclose( fid );
     } H5E_END_TRY;
     return -1;
}
示例#17
0
int IDL_STDCALL _SCIA_RD_LADS( int argc, void *argv[] )
{
     int nr_lads;

     unsigned int num_dsd;

     struct dsd_envi  *dsd;
     struct lads_scia *lads;

     if ( argc != 3 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     if ( ! File_Is_Open ) 
	  NADC_GOTO_ERROR( NADC_ERR_FILE, "No open stream" );

     num_dsd = *(unsigned int *) argv[0];
     dsd  = (struct dsd_envi *) argv[1];
     lads = (struct lads_scia *) argv[2];

     nr_lads = (int) SCIA_RD_LADS( fd_nadc, num_dsd, dsd, &lads );
     if ( IS_ERR_STAT_FATAL ) return -1;

     return nr_lads;
 done:
     return -1;
}
示例#18
0
unsigned int IDL_STDCALL _SCIA_SET_CALIB( int argc, void *argv[] )
{
     IDL_STRING *calib_str;
     unsigned int calib_mask;

     if ( argc != 1 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     calib_str = (IDL_STRING *) argv[0];

     if ( calib_str[0].slen == 0 ) return 0u;

     SCIA_SET_CALIB( calib_str[0].s, &calib_mask );
     return calib_mask;
 done:
     return 0u;
}
示例#19
0
/*+++++++++++++++++++++++++
.IDENTifer   SDMF_get_pt_jdayIndex
.PURPOSE     obtain indices to last-limb/Sun records for julianDay interval
.INPUT/OUTPUT
  call as    SDMF_get_pt_jdayIndex( locID, jdayRange, &numIndx, metaIndx );
     input:
           hid_t  locID        :  HDF5 identifier of group
	   double jdayRange[2] :  range in julianDay (min,max)
 in/output:
	   size_t *numIndx     :  [input]  dimension of metaIndx
                                  [output] number of indices found
    output:
	   size_t *metaIndx    :  array with requested indices

.RETURNS     nothing, error status passed by global variable ``nadc_stat''
.COMMENTS    static function
-------------------------*/
void SDMF_get_pt_jdayIndex( hid_t locID, const double jdayRange[],
			    size_t *numIndx, size_t *metaIndx )
{
     const size_t dimArray = *numIndx;

     register size_t nr;

     hid_t    ptable;
     hsize_t  nrecords;

     double   *jdayList;
/*
 * initialize return values
 */
     *numIndx = 0;
     *metaIndx = 0;
/*
 * check if jdayList exists
 */
     if ( (ptable = H5PTopen( locID, "jdayList" )) == H5I_BADID )
          NADC_RETURN_ERROR( NADC_ERR_HDF_DATA, "jdayList" );

     (void) H5PTget_num_packets( ptable, &nrecords );
     if ( nrecords == 0 ) {
          (void) H5PTclose( ptable );
          return;
     }
/*
 * read list of orbits stored sofar
 */
     jdayList = (double *) malloc( (size_t) nrecords * sizeof(double) );
     if ( jdayList == NULL )
          NADC_GOTO_ERROR( NADC_ERR_ALLOC, "jdayList" );
     (void) H5PTread_packets( ptable, 0, (size_t) nrecords, jdayList );
/*
 * find all matches
 */
     for ( nr = 0; nr < (size_t) nrecords; nr++ ) {
          if ( jdayList[nr] >= jdayRange[0] && jdayList[nr] <= jdayRange[1] ) {
	       metaIndx[*numIndx] = nr;
	       if ( ++(*numIndx) == dimArray ) break;
	  }
     }
     free( jdayList );
done:
     (void) H5PTclose( ptable );
}
示例#20
0
/*+++++++++++++++++++++++++
.IDENTifer   SDMF_get_pt_orbitIndex
.PURPOSE     obtain indices to last-limb/Sun records for given orbit number
.INPUT/OUTPUT
  call as    SDMF_get_pt_orbitIndex( locID, absOrbit, &numIndx, metaIndx );
     input:
           hid_t  locID        :  HDF5 identifier of group
	   int    absOrbit     :  orbit number
 in/output:
	   size_t *numIndx     :  [input]  dimension of metaIndx
                                  [output] number of indices found
    output:
	   size_t *metaIndx    :  array with requested indices

.RETURNS     nothing, error status passed by global variable ``nadc_stat''
.COMMENTS    static function
-------------------------*/
void SDMF_get_pt_orbitIndex( hid_t locID, int absOrbit, 
			     size_t *numIndx, size_t *metaIndx )
{
     const size_t dimArray = *numIndx;

     register size_t nr;

     hid_t    ptable;
     hsize_t  nrecords;

     int      *orbitList;
/*
 * initialize return values
 */
     *numIndx = 0;
     *metaIndx = 0;
/*
 * check if orbitList exists
 */
     if ( (ptable = H5PTopen( locID, "orbitList" )) == H5I_BADID )
          NADC_RETURN_ERROR( NADC_ERR_HDF_DATA, "orbitList" );

     (void) H5PTget_num_packets( ptable, &nrecords );
     if ( nrecords == 0 ) {
          (void) H5PTclose( ptable );
          return;
     }
/*
 * read list of orbits stored sofar
 */
     orbitList = (int *) malloc( (size_t) nrecords * sizeof(int) );
     if ( orbitList == NULL )
          NADC_GOTO_ERROR( NADC_ERR_ALLOC, "orbitList" );
     (void) H5PTread_packets( ptable, 0, (size_t) nrecords, orbitList );
/*
 * find all matches
 */
     for ( nr = 0; nr < (size_t) nrecords; nr++ ) {
          if ( orbitList[nr] == absOrbit ) {
	       metaIndx[*numIndx] = nr;
	       if ( ++(*numIndx) == dimArray ) break;
	  }
     }
     free( orbitList );
done:
     (void) H5PTclose( ptable );
}
示例#21
0
int IDL_STDCALL Err_Trace( int argc, void *argv[] )
{
     FILE *fd_log;

     IDL_STRING *log_name;

     if ( argc != 1 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     log_name = (IDL_STRING *) argv[0];
/*
 * create temporary file
 */
     fd_log = fopen( log_name[0].s, "a" );
     NADC_Err_Trace( fd_log );
     (void) fclose( fd_log );

     NADC_Err_Clear();
     return 0;
 done:
     return -1;
}
示例#22
0
int IDL_STDCALL _GET_SCIA_ROE_INFO( int argc, void *argv[] )
{
     bool   eclipseMode;
     double julianDay;

     bool   *saaFlag;
     int    *absOrbit;
     float  *orbitPhase;

     if ( argc != 5 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     
     eclipseMode = *(bool *) argv[0];
     julianDay   = *(double *) argv[1];
     absOrbit    = (int *) argv[2];
     saaFlag     = (bool *) argv[3];
     orbitPhase  = (float *) argv[4];

     GET_SCIA_ROE_INFO( eclipseMode, julianDay,
			absOrbit, saaFlag, orbitPhase );
     return 0;
done:
     return -1;
}
示例#23
0
int IDL_STDCALL _GET_SCIA_ROE_ORBITPHASE( int argc, void *argv[] )
{
     register int nm;

     bool   eclipseMode, saaFlag;
     int    num, orbit;
     float  *orbitPhase;
     double *julianDay;

     if ( argc != 4 ) NADC_GOTO_ERROR( NADC_ERR_PARAM, err_msg );
     
     eclipseMode = *(bool *) argv[0];
     num         = *(int *) argv[1];
     julianDay   = (double *) argv[2];
     orbitPhase  = (float *) argv[3];

     for ( nm = 0; nm < num; nm++ )
	  GET_SCIA_ROE_INFO( eclipseMode, julianDay[nm],
			     &orbit, &saaFlag, orbitPhase+nm );

     return 0;
done:
     return -1;
}
示例#24
0
//
// Perform selections on complete states, applied criteria are:
//    1) MJD selection 
//    2) state_id selection
//    3) reject incomplete states
//    4) CRC selection
//    5) Reject states with corrupted DSR records
// 
//
size_t SCIA_LV0_SELECT_MDS( const struct param_record param,
			    size_t num_states, const struct mds0_states *states,
			    struct mds0_states **states_out )
{
     register size_t ni;
     register size_t nr_indx = num_states;

     size_t *indx_states = NULL;
/*
 * initialize output array
 */
     *states_out = NULL;
     if ( num_states == 0 ) return 0;
/*
 * first check type of selected MDS
 */
     if ( param.write_aux == PARAM_UNSET
	  && param.write_det == PARAM_UNSET
	  && param.write_pmd == PARAM_UNSET )
	  return 0u;
/*
 * allocate memory to store indices to selected MDS records
 */
     indx_states = (size_t *) malloc( num_states * sizeof(size_t) );
     if ( indx_states == NULL ) 
	  NADC_GOTO_ERROR( NADC_ERR_ALLOC, "indx_states" );
     for ( ni = 0; ni < num_states; ni++ ) indx_states[ni] = ni;
/*
 * apply date-time criterium
 */
     if ( param.flag_period != PARAM_UNSET ) {
	  nr_indx = SCIA_LV0_SELECT_MDS_PERIOD( &param, states,
						nr_indx, indx_states );
     }
     if ( nr_indx == 0 ) goto done;
/*
 * apply State ID criterium
 */
     if ( param.stateID_nr != PARAM_UNSET ) {
	  nr_indx = SCIA_LV0_SELECT_MDS_STATE( &param, states,
					       nr_indx, indx_states );
     }
     if ( nr_indx == 0 ) goto done;
/*
 * reject incomplete states
 */
     if ( param.qcheck == PARAM_SET ) {
	  nr_indx = SCIA_LV0_SELECT_MDS_COMPLETE( &param, states,
						  nr_indx, indx_states );
     }
     if ( nr_indx == 0 ) goto done;
/*
 * apply CRC criterium 
 */
     if ( param.qcheck == PARAM_SET ) {
	  nr_indx = SCIA_LV0_SELECT_MDS_CRC( &param, states,
					     nr_indx, indx_states );
     }
     if ( nr_indx == 0 ) goto done;
/*
 * copy selected state-records to output array
 */
     *states_out = (struct mds0_states *) 
	  malloc( nr_indx * sizeof( struct mds0_states ));
     if ( *states_out == NULL ) 
	  NADC_GOTO_ERROR( NADC_ERR_ALLOC, "mds0_states" );

     for ( ni = 0; ni < nr_indx; ni++ ) {
	  (void) memcpy( &(*states_out)[ni].mjd, &states[indx_states[ni]].mjd,
			 sizeof(struct mjd_envi) );
	  (*states_out)[ni].category = states[indx_states[ni]].category;
	  (*states_out)[ni].state_id = states[indx_states[ni]].state_id;
	  (*states_out)[ni].q_aux.value = states[indx_states[ni]].q_aux.value ;
	  (*states_out)[ni].q_det.value = states[indx_states[ni]].q_det.value ;
	  (*states_out)[ni].q_pmd.value = states[indx_states[ni]].q_pmd.value ;
	  (*states_out)[ni].num_aux = states[indx_states[ni]].num_aux;
	  (*states_out)[ni].num_det = states[indx_states[ni]].num_det;
	  (*states_out)[ni].num_pmd = states[indx_states[ni]].num_pmd;
	  (*states_out)[ni].on_board_time =
	       states[indx_states[ni]].on_board_time;
	  (*states_out)[ni].offset = states[indx_states[ni]].offset;

	  if ( param.write_aux == PARAM_UNSET ) {
	       (*states_out)[ni].num_aux = 0;
	       (*states_out)[ni].info_aux = NULL;
	  } else if ( (*states_out)[ni].num_aux > 0 ) {
	       size_t num_aux = (*states_out)[ni].num_aux;
	       
	       (*states_out)[ni].info_aux = (struct mds0_info *)
		    malloc( num_aux * sizeof(struct mds0_info));
	       (void) memcpy( (*states_out)[ni].info_aux,
			      states[indx_states[ni]].info_aux,
			      num_aux * sizeof(struct mds0_info) );
	  }
	  if ( param.write_det == PARAM_UNSET ) {
	       (*states_out)[ni].num_det = 0;
	       (*states_out)[ni].info_det = NULL;
	  } else if ( (*states_out)[ni].num_det > 0 ) {
	       size_t num_det = (*states_out)[ni].num_det;
	       
	       (*states_out)[ni].info_det = (struct mds0_info *)
		    malloc( num_det * sizeof(struct mds0_info));
	       (void) memcpy( (*states_out)[ni].info_det,
			      states[indx_states[ni]].info_det,
			      num_det * sizeof(struct mds0_info) );
	  }
	  if ( param.write_pmd == PARAM_UNSET ) {
	       (*states_out)[ni].num_pmd = 0;
	       (*states_out)[ni].info_pmd = NULL;
	  } else if ( (*states_out)[ni].num_pmd > 0 ) {
	       size_t num_pmd = (*states_out)[ni].num_pmd;
	       
	       (*states_out)[ni].info_pmd = (struct mds0_info *)
		    malloc( num_pmd * sizeof(struct mds0_info));
	       (void) memcpy( (*states_out)[ni].info_pmd,
			      states[indx_states[ni]].info_pmd,
			      num_pmd * sizeof(struct mds0_info) );
	  }
     }
done:
     if ( indx_states != NULL ) free( indx_states );
     return nr_indx;
}
示例#25
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
int main( int argc, char *argv[] )
{
     bool flag_remove  = FALSE;
     bool flag_replace = FALSE;

     char flname[MAX_STRING_LENGTH];
     char *cpntr, ctemp[SHORT_STRING_LENGTH];

     int ncid;
     int retval;

     struct imap_hdr hdr;
     struct imap_rec *rec = NULL;

#ifdef _WITH_SQL
     PGconn *conn = NULL;
#endif
/*
 * check command-line parameters
 */
     if ( argc > 2 ) {
	  register int nr = 1;
	  do {
	       if ( strncmp( argv[nr], "-remove", 7 ) == 0 )
		    flag_remove = TRUE;
	       else if ( strncmp( argv[nr], "-replace", 8 ) == 0 )
		    flag_replace = TRUE;
	       else
		    NADC_GOTO_ERROR( NADC_ERR_PARAM, NADC_PARAMS );
	  } while( ++nr < (argc-1) );
	  (void) nadc_strlcpy( flname, argv[argc-1], MAX_STRING_LENGTH );
     } else if ( argc == 2 ) {
	  (void) nadc_strlcpy( flname, argv[1], MAX_STRING_LENGTH );
     } else
	  NADC_GOTO_ERROR( NADC_ERR_PARAM, NADC_PARAMS );
/*
 * strip path of file-name
 */
     if ( (cpntr = strrchr( flname, '/' )) != NULL ) {
          (void) nadc_strlcpy( ctemp, ++cpntr, SHORT_STRING_LENGTH );
     } else {
          (void) nadc_strlcpy( ctemp, flname, SHORT_STRING_LENGTH );
     }
/*
 * read the IMAP CH4 product
 */
     if ( (retval = nc_open( flname, NC_NOWRITE, &ncid )) != NC_NOERR )
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, nc_strerror(retval) );
     SCIA_RD_NC_CH4_META( ncid, &hdr );
     if ( hdr.numProd > 1 ) 
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, 
			   "no more than one orbit per ingest" );
     (void) nadc_strlcpy( hdr.product, ctemp, SHORT_STRING_LENGTH );
     NADC_RECEIVEDATE( flname, hdr.receive_date );
     hdr.file_size = nadc_file_size( flname );
     hdr.numRec = SCIA_RD_NC_CH4_REC( ncid, &rec );
     if ( (retval = nc_close( ncid )) != NC_NOERR )
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, nc_strerror(retval) );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_FILE_RD, flname );
/*
 * connect to PostgreSQL database
 */
#ifdef _WITH_SQL
     CONNECT_NADC_DB( &conn, "scia" );
     if ( IS_ERR_STAT_FATAL ) {
	  NADC_ERROR( NADC_ERR_SQL, "IMAP (connect)" );
	  NADC_Err_Trace( stderr );
	  return NADC_ERR_FATAL;
     }
     if ( flag_remove || flag_replace ) {
	  SCIA_DEL_ENTRY_IMAP_CH4( conn, hdr.product );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "IMAP (remove)" );
     }
/*
 * write meta-information to database
 */
     if ( ! flag_remove ) {
	  SCIA_WR_SQL_CH4_META( conn, &hdr );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_ERROR( NADC_ERR_SQL, "IMAP (header)" );
	  } else {
	       SCIA_WR_SQL_CH4_TILE( conn, hdr.product, hdr.numRec, rec );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_ERROR( NADC_ERR_SQL, "IMAP (records)" );
	  }
     }
#endif
 done:
/*
 * close connection to PostgreSQL database
 */
#ifdef _WITH_SQL
     if ( conn != NULL ) PQfinish( conn );
#endif
/*
 * free allocated memory
 */
     if ( rec != NULL ) free( rec );
/*
 * display error messages
 */
     NADC_Err_Trace( stderr );
     if ( IS_ERR_STAT_FATAL )
          return NADC_ERR_FATAL;
     else
          return NADC_ERR_NONE;
}
示例#26
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
unsigned 
int SCIA_LV2_RD_BIAS( FILE *fd, const char bias_name[],
		      unsigned int num_dsd, const struct dsd_envi *dsd, 
		      struct bias_scia **bias_out )
{
     char         *bias_pntr, *bias_char = NULL;
     size_t       dsd_size, nr_byte;
     unsigned int indx_dsd;
     unsigned int n_cross;

     unsigned int nr_dsr = 0;
     struct bias_scia *bias;
/*
 * get index to data set descriptor
 */
     indx_dsd = ENVI_GET_DSD_INDEX( num_dsd, dsd, bias_name );
     if ( IS_ERR_STAT_FATAL )
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, bias_name );
     if ( dsd[indx_dsd].size == 0u ) return 0;
     if ( ! Use_Extern_Alloc ) {
	  bias_out[0] = (struct bias_scia *) 
	       malloc( dsd[indx_dsd].num_dsr * sizeof(struct bias_scia));
     }
     if ( (bias = bias_out[0]) == NULL ) 
	  NADC_GOTO_ERROR( NADC_ERR_ALLOC, "bias" );
/*
 * allocate memory to temporary store data for output structure
 */
     dsd_size = (size_t) dsd[indx_dsd].size;
     if ( (bias_char = (char *) malloc( dsd_size )) == NULL ) 
	  NADC_GOTO_ERROR( NADC_ERR_ALLOC, "bias_char" );
/*
 * rewind/read input data file
 */
     (void) fseek( fd, (long) dsd[indx_dsd].offset, SEEK_SET );
     if ( fread( bias_char, dsd_size, 1, fd ) != 1 )
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "" );
/*
 * read data buffer to BIAS structure
 */
     bias_pntr = bias_char;
     do {
	  (void) memcpy( &bias->mjd.days, bias_pntr, ENVI_INT );
	  bias_pntr += ENVI_INT;
	  (void) memcpy( &bias->mjd.secnd, bias_pntr, ENVI_UINT );
	  bias_pntr += ENVI_UINT;
	  (void) memcpy( &bias->mjd.musec, bias_pntr, ENVI_UINT );
	  bias_pntr += ENVI_UINT;
	  (void) memcpy( &bias->dsrlen, bias_pntr, ENVI_UINT );
	  bias_pntr += ENVI_UINT;
	  (void) memcpy( &bias->quality, bias_pntr, ENVI_CHAR );
	  bias_pntr += ENVI_CHAR;
	  (void) memcpy( &bias->intg_time, bias_pntr, ENVI_USHRT );
	  bias_pntr += ENVI_USHRT;
	  (void) memcpy( &bias->numfitp, bias_pntr, ENVI_USHRT );
	  bias_pntr += ENVI_USHRT;
#ifdef _SWAP_TO_LITTLE_ENDIAN
	  bias->numfitp = byte_swap_u16( bias->numfitp );
#endif
	  (void) memcpy( &bias->numsegm, bias_pntr, ENVI_USHRT );
	  bias_pntr += ENVI_USHRT;
	  (void) memcpy( &bias->hght, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->errhght, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->hghtflag, bias_pntr, ENVI_USHRT );
	  bias_pntr += ENVI_USHRT;
	  (void) memcpy( &bias->vcd, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->errvcd, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->closure, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->errclosure, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->rms, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->chi2, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->goodness, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->cutoff, bias_pntr, ENVI_FLOAT );
	  bias_pntr += ENVI_FLOAT;
	  (void) memcpy( &bias->numiter, bias_pntr, ENVI_USHRT );
	  bias_pntr += ENVI_USHRT;
	  n_cross = (bias->numfitp * (bias->numfitp - 1u)) / 2u;
	  nr_byte = (size_t) n_cross * sizeof( float );
	  bias->corrpar = (float *) malloc( nr_byte );
	  if ( bias->corrpar == NULL ) 
	       NADC_GOTO_ERROR( NADC_ERR_ALLOC, "corrpar" );
	  (void) memcpy( bias->corrpar, bias_pntr, nr_byte ); 
	  bias_pntr += nr_byte;
	  (void) memcpy( &bias->vcdflag, bias_pntr, ENVI_USHRT );
	  bias_pntr += ENVI_USHRT;

#ifdef _SWAP_TO_LITTLE_ENDIAN
	  Sun2Intel_BIAS( bias );
#endif
	  bias++;
     } while ( ++nr_dsr < dsd[indx_dsd].num_dsr );
/*
 * check if we read the whole DSR
 */
     if ( (unsigned int)(bias_pntr - bias_char) != dsd[indx_dsd].size )
	  NADC_GOTO_ERROR( NADC_ERR_PDS_SIZE, bias_name );
     bias_pntr = NULL;
/*
 * set return values
 */
 done:
     if ( bias_char != NULL ) free( bias_char );

     return nr_dsr;
}
示例#27
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
void SCIA_OL2_WR_SQL_META( PGconn *conn, bool be_verbose, const char *sciafl,
			   const char *l1b_product,
			   const struct mph_envi *mph,
			   const struct sph_sci_ol *sph )
{
     PGresult *res;

     char *pntr;
     char str_quality[6];
     char ctemp[SHORT_STRING_LENGTH];
     char sql_query[SQL_STR_SIZE], cbuff[SQL_STR_SIZE];

     bool          first;
     int           nrow, numChar, meta_id;
/*
 * check if product is already in database
 */
     (void) snprintf( sql_query, MAX_STRING_LENGTH, "%s\'%s\'",
		      "SELECT * FROM meta__2P WHERE name=", mph->product );
     res = PQexec( conn, sql_query );
     if ( PQresultStatus( res ) != PGRES_TUPLES_OK ) {
          PQclear( res );
          NADC_RETURN_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
     }
     if ( (nrow = PQntuples( res )) != 0 ) {
          PQclear( res );
          NADC_RETURN_ERROR( NADC_ERR_SQL_TWICE, mph->product );
     }
     PQclear( res );
/*
 * obtain next value for serial pk_meta
 */
     res = PQexec( conn,
                   "SELECT nextval(\'meta__2p_pk_meta_seq\')" );
     if ( PQresultStatus( res ) != PGRES_TUPLES_OK )
          NADC_GOTO_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
     pntr = PQgetvalue( res, 0, 0 );
     meta_id = (int) strtol( pntr, (char **) NULL, 10 );
     PQclear( res );
/*
 * no error and not yet stored, then proceed
 */     
/* pk_meta */
     (void) snprintf( sql_query, SQL_STR_SIZE, 
		      "INSERT INTO meta__2P VALUES (%d,", meta_id );
/* name */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), mph->product );
/* l1b_product */
     (void) nadc_strlcpy( ctemp, l1b_product, ENVI_FILENAME_SIZE );
     SCIA_CHECK_SQL_LV1B_NAME( conn, ctemp );
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), ctemp );
/* fileSize */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%u,",
		      strcpy(cbuff,sql_query), mph->tot_size );
/* receiveDate */
     NADC_RECEIVEDATE( sciafl, ctemp );
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), ctemp );
/* procStage  */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), mph->proc_stage );
/* procCenter */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), mph->proc_center );
/* softVersion */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), mph->soft_version );
/* fittingErrSum */
     nadc_rstrip( str_quality, sph->errorsum );
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s\'%s\',",
		      strcpy(cbuff,sql_query), str_quality );
/* dateTimeStart */
     (void) snprintf( sql_query, SQL_STR_SIZE, 
		      "%sdate_trunc('second', TIMESTAMP \'%s\'),",
		      strcpy(cbuff,sql_query), sph->start_time );
/* muSecStart */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s,",
		      strcpy(cbuff,sql_query), sph->start_time+21 );
/* dateTimeStop */
     (void) snprintf( sql_query, SQL_STR_SIZE, 
		      "%sdate_trunc('second', TIMESTAMP \'%s\'),",
		      strcpy(cbuff,sql_query), sph->stop_time );
/* muSecStop */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s,",
		      strcpy(cbuff,sql_query), sph->stop_time+21 );
/* absOrbit */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%d,",
		      strcpy(cbuff,sql_query), mph->abs_orbit );
/* relOrbit */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%d,",
		      strcpy(cbuff,sql_query), mph->rel_orbit );
/* numDataSets */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%u,",
		      strcpy(cbuff,sql_query), mph->num_data_sets );
/* naditFittingWindows */
     first = TRUE;
     (void) strcat( sql_query, "\'" );
     if ( strncmp( sph->nadir_win_uv0, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv0, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv1, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv1, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv2, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv2, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv3, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv3, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv4, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv4, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv5, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv5, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv6, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv6, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_uv7, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_uv7, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_ir0, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_ir0, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_ir1, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_ir1, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_ir2, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_ir2, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_ir3, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_ir3, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_ir4, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_ir4, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->nadir_win_ir5, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->nadir_win_ir5, ctemp );
	  if ( ! first ) strcat( sql_query, "," );
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     (void) strcat( sql_query, "\'," );
/* limbFittingWindows */
     first = TRUE;
     (void) strcat( sql_query, "\'" );
     if ( strncmp( sph->limb_win_pth, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_pth, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv0, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv0, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv1, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv1, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv2, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv2, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv3, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv3, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv4, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv4, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv5, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv5, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv6, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv6, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_uv7, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_uv7, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_ir0, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_ir0, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_ir1, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_ir1, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_ir2, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_ir2, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_ir3, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_ir3, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->limb_win_ir4, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->limb_win_ir4, ctemp );
	  if ( ! first ) strcat( sql_query, "," );
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     (void) strcat( sql_query, "\'," );
/* occultFittingWindows */
     first = TRUE;
     (void) strcat( sql_query, "\'" );
     if ( strncmp( sph->occl_win_pth, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_pth, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv0, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv0, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv1, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv1, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv2, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv2, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv3, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv3, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv4, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv4, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv5, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv5, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv6, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv6, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_uv7, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_uv7, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_ir0, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_ir0, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_ir1, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_ir1, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_ir2, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_ir2, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_ir3, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_ir3, ctemp );
	  if ( ! first ) strcat( sql_query, "," ); else first = FALSE;
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     if ( strncmp( sph->occl_win_ir4, "EMPTY", 5 ) != 0 ) {
	  NADC_STRIP( sph->occl_win_ir4, ctemp );
	  if ( ! first ) strcat( sql_query, "," );
	  (void) snprintf( sql_query, SQL_STR_SIZE, "%s%s",
			   strcpy(cbuff,sql_query), ctemp );
     }
     (void) strcat( sql_query, "\'," );
/* numNadirFW */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%hu,",
		      strcpy(cbuff,sql_query), sph->no_nadir_win );
/* numLimbFW */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%hu,",
		      strcpy(cbuff,sql_query), sph->no_limb_win );
/* numOccultFW */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%hu,",
		      strcpy(cbuff,sql_query), sph->no_occl_win );
/* noEntryDMOP */
     (void) snprintf( sql_query, SQL_STR_SIZE, "%s%d,",
		      strcpy(cbuff,sql_query), 0 );
/* delayedBy */
     numChar = snprintf( sql_query, SQL_STR_SIZE, "%s%s)",
			 strcpy( cbuff, sql_query ), "NULL" );
     if ( be_verbose )
	  (void) printf( "%s(): %s [%-d]\n", __func__, sql_query, numChar );
     if ( numChar >= SQL_STR_SIZE )
	  NADC_RETURN_ERROR( NADC_ERR_STRLEN, "sql_query" );
/*
 * do the actual insert
 */
     res = PQexec( conn, sql_query );
     if ( PQresultStatus( res ) != PGRES_COMMAND_OK )
          NADC_GOTO_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
 done:
     PQclear( res );
}
示例#28
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
unsigned 
int SCIA_OL2_RD_LFIT( FILE *fd, const char lfit_name[],
		      unsigned int num_dsd, const struct dsd_envi *dsd, 
		      struct lfit_scia **lfit_out )
{
     register unsigned short nl;

     char         *lfit_pntr, *lfit_char = NULL;
     size_t       dsd_size;
     unsigned int indx_dsd, n_rec;

     unsigned int nr_dsr = 0;

     struct lfit_scia *lfit;
/*
 * get index to data set descriptor
 */
     NADC_ERR_SAVE();
     indx_dsd = ENVI_GET_DSD_INDEX( num_dsd, dsd, lfit_name );
     if ( IS_ERR_STAT_FATAL || IS_ERR_STAT_ABSENT )
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, lfit_name );
     if ( IS_ERR_STAT_ABSENT || dsd[indx_dsd].num_dsr == 0 ) {
          NADC_ERR_RESTORE();
          lfit_out[0] = NULL;
          return 0u;
     }
     dsd_size = (size_t) dsd[indx_dsd].size;
/*
 * allocate memory to store output structures
 */
     if ( ! Use_Extern_Alloc ) {
	  lfit_out[0] = (struct lfit_scia *) 
	       malloc( dsd[indx_dsd].num_dsr * sizeof(struct lfit_scia));
     }
     if ( (lfit = lfit_out[0]) == NULL ) 
	  NADC_GOTO_ERROR( NADC_ERR_ALLOC, "lfit" );
/*
 * allocate memory to temporary store data for output structure
 */
     if ( (lfit_char = (char *) malloc( dsd_size )) == NULL ) 
	  NADC_GOTO_ERROR( NADC_ERR_ALLOC, "lfit_char" );
/*
 * rewind/read input data file
 */
     (void) fseek( fd, (long) dsd[indx_dsd].offset, SEEK_SET );
     if ( fread( lfit_char, dsd_size, 1, fd ) != 1 )
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "" );
/*
 * read data buffer to LFIT structure
 */
     lfit_pntr = lfit_char;
     do { 
	  (void) memcpy( &lfit->mjd.days, lfit_pntr, ENVI_INT );
	  lfit_pntr += ENVI_INT;
	  (void) memcpy( &lfit->mjd.secnd, lfit_pntr, ENVI_UINT );
	  lfit_pntr += ENVI_UINT;
	  (void) memcpy( &lfit->mjd.musec, lfit_pntr, ENVI_UINT );
	  lfit_pntr += ENVI_UINT;
	  (void) memcpy( &lfit->dsrlen, lfit_pntr, ENVI_UINT );
	  lfit_pntr += ENVI_UINT;
	  (void) memcpy( &lfit->quality, lfit_pntr, ENVI_CHAR );
	  lfit_pntr += ENVI_CHAR;
	  (void) memcpy( &lfit->intg_time, lfit_pntr, ENVI_USHRT );
	  lfit_pntr += ENVI_USHRT;
	  (void) memcpy( &lfit->method, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->refh, lfit_pntr, ENVI_FLOAT );
	  lfit_pntr += ENVI_FLOAT;
	  (void) memcpy( &lfit->refp, lfit_pntr, ENVI_FLOAT );
	  lfit_pntr += ENVI_FLOAT;
	  (void) memcpy( &lfit->refpsrc, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->num_rlevel, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->num_mlevel, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->num_species, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->num_closure, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->num_other, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->num_scale, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  if ( lfit->num_rlevel > 0u ) {
	       lfit->tangh = (float *) 
		    malloc( lfit->num_rlevel * sizeof(float) );
	       if ( lfit->tangh == NULL )
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "tangh" );
	       (void) memcpy( lfit->tangh, lfit_pntr, 
			      lfit->num_rlevel * ENVI_FLOAT );
	       lfit_pntr += lfit->num_rlevel * ENVI_FLOAT;
	       lfit->tangp = (float *) 
		    malloc( lfit->num_rlevel * sizeof(float) );
	       if ( lfit->tangp == NULL )
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "tangp" );
	       (void) memcpy( lfit->tangp, lfit_pntr, 
			      lfit->num_rlevel * ENVI_FLOAT );
	       lfit_pntr += lfit->num_rlevel * ENVI_FLOAT;
	       lfit->tangt = (float *) 
		    malloc( lfit->num_rlevel * sizeof(float) );
	       if ( lfit->tangt == NULL )
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "tangt" );
	       (void) memcpy( lfit->tangt, lfit_pntr, 
			      lfit->num_rlevel * ENVI_FLOAT );
	       lfit_pntr += lfit->num_rlevel * ENVI_FLOAT;
	  }
	  n_rec = lfit->num_rlevel * lfit->num_species;
	  if ( n_rec > 0u ) {
	       lfit->mainrec = (struct layer_rec *)
		    malloc( n_rec * sizeof( struct layer_rec ));
	       if ( lfit->mainrec == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "mainrec" );
	       (void) memcpy( lfit->mainrec, lfit_pntr, 
			      n_rec * sizeof(struct layer_rec) );
	       lfit_pntr += n_rec * sizeof(struct layer_rec);
	  }
	  n_rec = lfit->num_rlevel * lfit->num_scale;
	  if ( n_rec > 0u ) {
	       lfit->scaledrec = (struct layer_rec *)
		    malloc( n_rec * sizeof( struct layer_rec ));
	       if ( lfit->scaledrec == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "scaledrec" );
	       (void) memcpy( lfit->scaledrec, lfit_pntr, 
			      n_rec * sizeof(struct layer_rec) );
	       lfit_pntr += n_rec * sizeof(struct layer_rec);
	  }
/*
 * note that meas_grid is not aligned
 */
	  if ( lfit->num_mlevel > 0u ) {
	       lfit->mgrid = (struct meas_grid *)
		    malloc( lfit->num_mlevel * sizeof( struct meas_grid ));
	       if ( lfit->mgrid == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "mgrid" );
	       nl = 0;
	       do {
		    (void) memcpy( &lfit->mgrid[nl].mjd.days, lfit_pntr, 
				   ENVI_INT );
		    lfit_pntr += ENVI_INT;
		    (void) memcpy( &lfit->mgrid[nl].mjd.secnd, lfit_pntr, 
				   ENVI_UINT );
		    lfit_pntr += ENVI_UINT;
		    (void) memcpy( &lfit->mgrid[nl].mjd.musec, lfit_pntr, 
				   ENVI_UINT );
		    lfit_pntr += ENVI_UINT;
		    (void) memcpy( &lfit->mgrid[nl].tangh, lfit_pntr, 
				   ENVI_FLOAT );
		    lfit_pntr += ENVI_FLOAT;
		    (void) memcpy( &lfit->mgrid[nl].tangp, lfit_pntr, 
				   ENVI_FLOAT );
		    lfit_pntr += ENVI_FLOAT;
		    (void) memcpy( &lfit->mgrid[nl].tangt, lfit_pntr, 
				   ENVI_FLOAT );
		    lfit_pntr += ENVI_FLOAT;
		    (void) memcpy( &lfit->mgrid[nl].num_win, lfit_pntr, 
				   ENVI_UCHAR );
		    lfit_pntr += ENVI_UCHAR;
		    (void) memcpy( lfit->mgrid[nl].win_limits, lfit_pntr, 
				   2 * ENVI_FLOAT );
		    lfit_pntr += 2 * ENVI_FLOAT;
	       } while ( ++nl < lfit->num_mlevel );
	  }
	  (void) memcpy( &lfit->stvec_size, lfit_pntr, ENVI_USHRT );
	  lfit_pntr += ENVI_USHRT;
#ifdef _SWAP_TO_LITTLE_ENDIAN
	  lfit->stvec_size = byte_swap_u16( lfit->stvec_size );
#endif
	  if ( lfit->stvec_size > 0u ) {
	       lfit->statevec = (struct state_vec *)
		    malloc( lfit->stvec_size * sizeof(struct state_vec) );
	       if ( lfit->statevec == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "statevec" );
	       (void) memcpy( lfit->statevec, lfit_pntr, 
			      lfit->stvec_size * sizeof( struct state_vec ));
	       lfit_pntr += lfit->stvec_size * sizeof( struct state_vec );
	  }
	  (void) memcpy( &lfit->cmatrixsize, lfit_pntr, ENVI_USHRT );
	  lfit_pntr += ENVI_USHRT;
#ifdef _SWAP_TO_LITTLE_ENDIAN
	  lfit->cmatrixsize = byte_swap_u16( lfit->cmatrixsize );
#endif
	  if ( lfit->cmatrixsize > 0u ) {
	       lfit->corrmatrix = (float *)
		    malloc((size_t) lfit->cmatrixsize * ENVI_FLOAT );
	       if ( lfit->corrmatrix == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "corrmatrix" );
	       (void) memcpy( lfit->corrmatrix, lfit_pntr, 
			      lfit->cmatrixsize * ENVI_FLOAT );
	       lfit_pntr += lfit->cmatrixsize * ENVI_FLOAT ;
	  }
	  (void) memcpy( &lfit->rms, lfit_pntr, ENVI_FLOAT );
	  lfit_pntr += ENVI_FLOAT;
	  (void) memcpy( &lfit->chi2, lfit_pntr, ENVI_FLOAT );
	  lfit_pntr += ENVI_FLOAT;
	  (void) memcpy( &lfit->goodness, lfit_pntr, ENVI_FLOAT );
	  lfit_pntr += ENVI_FLOAT;
	  (void) memcpy( &lfit->numiter, lfit_pntr, ENVI_USHRT );
	  lfit_pntr += ENVI_USHRT;
	  (void) memcpy( lfit->summary, lfit_pntr, 2 * ENVI_USHRT );
	  lfit_pntr += 2 * ENVI_USHRT;
	  (void) memcpy( &lfit->criteria, lfit_pntr, ENVI_UCHAR );
	  lfit_pntr += ENVI_UCHAR;
	  (void) memcpy( &lfit->ressize, lfit_pntr, ENVI_USHRT );
	  lfit_pntr += ENVI_USHRT;
#ifdef _SWAP_TO_LITTLE_ENDIAN
	  lfit->ressize = byte_swap_u16( lfit->ressize );
#endif
	  if ( lfit->ressize > 0u ) {
	       lfit->residuals = (float *)
		    malloc((size_t) lfit->ressize * ENVI_FLOAT );
	       if ( lfit->residuals == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "residuals" );
	       (void) memcpy( lfit->residuals, lfit_pntr, 
			      lfit->ressize * ENVI_FLOAT );
	       lfit_pntr += lfit->ressize * ENVI_FLOAT ;
	  }
	  (void) memcpy( &lfit->num_adddiag, lfit_pntr, ENVI_USHRT );
	  lfit_pntr += ENVI_USHRT;
#ifdef _SWAP_TO_LITTLE_ENDIAN
	  lfit->num_adddiag = byte_swap_u16( lfit->num_adddiag );
#endif
	  if ( lfit->num_adddiag > 0u ) {
	       lfit->adddiag = (float *)
		    malloc((size_t) lfit->num_adddiag * ENVI_FLOAT );
	       if ( lfit->adddiag == NULL ) 
		    NADC_GOTO_ERROR( NADC_ERR_ALLOC, "adddiag" );
	       (void) memcpy( lfit->adddiag, lfit_pntr, 
				lfit->num_adddiag * ENVI_FLOAT );
	       lfit_pntr += lfit->num_adddiag * ENVI_FLOAT ;
	  }
#ifdef _SWAP_TO_LITTLE_ENDIAN
	  Sun2Intel_LFIT( lfit );
#endif
	  lfit++;
     } while ( ++nr_dsr < dsd[indx_dsd].num_dsr );
/*
 * check if we read the whole DSR
 */
     if ( (unsigned int)(lfit_pntr - lfit_char) != dsd[indx_dsd].size )
	  NADC_GOTO_ERROR( NADC_ERR_PDS_SIZE, lfit_name );
     lfit_pntr = NULL;
/*
 * set return values
 */
 done:
     if ( lfit_char != NULL ) free( lfit_char );

     return nr_dsr;
}
示例#29
0
/*+++++++++++++++++++++++++
.IDENTifer   SDMF_get_OrbitalDark_24
.PURPOSE     obtain dark correction parameters (SDMF v2.4.x)
.INPUT/OUTPUT
  call as    found = SDMF_get_OrbitalDark_24( orbit, orbitPhase
                                            analogOffs, darkCurrent, 
					    analogOffsError, darkCurrentError );
     input:
           unsigned short absOrbit   :  orbit number
	   float          orbitPhase :  orbit phase (ESA definition)
 in/output:
           float *analogOffs         :  analog offset (BU)
           float *darkCurrent        :  leakage current (BU/s)
           float *analogOffsError    :  analog offset error (BU)
           float *darkCurrentError   :  leakage current error (BU/s)

.RETURNS     solution found (True or False)
             error status passed by global variable ``nadc_stat''
.COMMENTS    none
-------------------------*/
bool SDMF_get_OrbitalDark_24( unsigned short absOrbit, float orbitPhase, 
			      float *analogOffs, float *darkCurrent, 
			      float *analogOffsError, float *darkCurrentError )
{
     const int  orbit = (int) absOrbit;
     const unsigned short numOrbitDark = 72;
     const long sz_chan_byte = CHANNEL_SIZE * ENVI_FLOAT;
     const long sz_ds_byte = numOrbitDark * sz_chan_byte;

     register unsigned short nd, np;

     bool   fnd, found = FALSE;

     char   dark_fl[MAX_STRING_LENGTH];
     FILE   *dark_fp;
     float  rbuff[CHANNEL_SIZE], orbitDark[numOrbitDark * CHANNEL_SIZE];

     unsigned short nd_low, nd_high;

     const float orbitPhaseDiff = SDMF_orbitPhaseDiff( orbit );
/*
 * read constant dark parameters from SDMF database
 */
     fnd = SDMF_get_FittedDark_24( 8, absOrbit, analogOffs, darkCurrent,
				   analogOffsError, darkCurrentError, NULL );
     if ( ! fnd ) 
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, 
			   "No dark entry found in SDMF (v2.4)" );
/*
 * convert orbit phase to SDMF definition:
 *        orbitPhase(ESA) = orbitPhaseDiff + orbitPhase(SDMF);
 */
     orbitPhase -= orbitPhaseDiff;
     if ( orbitPhase < 0.f ) orbitPhase += 1.f;
/*
 * find file with dark signals, requirements:
 *  - orbit number within a range MAX_DiffOrbitNumber
 */
     if ( ! SDMF_get_fileEntry( SDMF24_ORBITAL, orbit, dark_fl ) ) return FALSE;
/*
 * read dark parameters
 */
     if ( (dark_fp = fopen( dark_fl, "r" )) == NULL )
	  NADC_GOTO_ERROR( NADC_ERR_FILE, dark_fl );

     if ( fread( orbitDark, sz_ds_byte, 1, dark_fp ) != 1 )
	  NADC_GOTO_ERROR( NADC_ERR_FILE_RD, "orbitDark" );
     (void) fclose( dark_fp );
     found = TRUE;
/*
 * linear interpolate to get the variable fraction of the leakage current
 */
     for ( nd = 0; nd < numOrbitDark; nd++ )
          if ( orbitPhase <=  ((float) nd / numOrbitDark) ) break;
     nd_low = (nd > 0u) ? nd - 1u : 0u;
     nd_high = (nd < numOrbitDark) ? nd : nd - 1u;
     NADC_INTERPOL( orbitPhase, ((float) nd_low / numOrbitDark),
		    ((float) nd_high / numOrbitDark), CHANNEL_SIZE, 
                    &orbitDark[nd_low * CHANNEL_SIZE],
                    &orbitDark[nd_high * CHANNEL_SIZE], rbuff );
/*
 * add orbital dark correction to dark current
 */
     for ( np = 0; np < CHANNEL_SIZE; np++ ) {
     	  if ( isnormal( darkCurrent[np] ) && isnormal( rbuff[np] ) )
     	       darkCurrent[np] += rbuff[np];
     }
done:
     return found;
}
示例#30
0
/*+++++++++++++++++++++++++
.IDENTifer   SDMF_get_OrbitalDark_30
.PURPOSE     obtain dark correction parameters (SDMF v3.0)
.INPUT/OUTPUT
  call as    found = SDMF_get_OrbitalDark_30( orbit, orbitPhase
                                            analogOffs, darkCurrent, 
					    analogOffsError, darkCurrentError );
     input:
           unsigned short absOrbit   :  orbit number
	   float          orbitPhase : orbit phase
 in/output:
           float *analogOffs         :  analog offset (BU)
           float *darkCurrent        :  leakage current (BU/s)
           float *analogOffsError    :  analog offset error (BU)
           float *darkCurrentError   :  leakage current error (BU/s)

.RETURNS     solution found (True or False)
             error status passed by global variable ``nadc_stat''
.COMMENTS    none
-------------------------*/
bool SDMF_get_OrbitalDark_30( unsigned short absOrbit, float orbitPhase, 
			      float *analogOffs, float *darkCurrent, 
			      float *analogOffsError, float *darkCurrentError )
{
     register unsigned short np;

     hid_t  fid = -1;
     hid_t  gid = -1;

     bool   found = FALSE;
     int    numIndx, metaIndx;
     float  orbvar, orbsig;
     float  amp1[CHANNEL_SIZE], sig_amp1[CHANNEL_SIZE];

     char str_msg[MAX_STRING_LENGTH];
     char sdmf_db[MAX_STRING_LENGTH];

     struct mtbl_simudark_rec *mtbl = NULL;

     const int orbit        = (int) absOrbit;
     const int pixelRange[] = {0, CHANNEL_SIZE-1};
     const long sz_chan_byte = CHANNEL_SIZE * ENVI_FLOAT;
     const char msg_found[] =
          "\n\tapplied SDMF SimuDark (v3.0) of orbit: %-d";
/*
 * initialize returned values
 */
     (void) memset( analogOffs, 0, sz_chan_byte );
     (void) memset( darkCurrent, 0, sz_chan_byte );
     (void) memset( analogOffsError, 0, sz_chan_byte );
     (void) memset( darkCurrentError, 0, sz_chan_byte );
/*
 * open SDMF simu-dark database
 */
     (void) snprintf( sdmf_db, MAX_STRING_LENGTH, "%s/%s", 
                      SDMF_PATH("3.0"), "sdmf_simudark.h5" );
     H5E_BEGIN_TRY {
	  fid = H5Fopen( sdmf_db, H5F_ACC_RDONLY, H5P_DEFAULT );
     } H5E_END_TRY;
     if ( fid < 0 ) NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, sdmf_db );

     if ( (gid = H5Gopen( fid, "ch8", H5P_DEFAULT )) < 0 )
          NADC_GOTO_ERROR( NADC_ERR_HDF_GRP, "/ch8" );
/*
 * obtain indices relevant entries
 */
     numIndx = 1;
     metaIndx = -1;
     (void) SDMF_get_metaIndex( gid, orbit, &numIndx, &metaIndx );
     if ( numIndx == 0 ) goto done;
     found = TRUE;
/*
 * read simu-dark data
 */
     SDMF_rd_simudarkTable( gid, &numIndx, &metaIndx, &mtbl );
     SDMF_rd_float_Array( gid, "ao", 1, &metaIndx, pixelRange, analogOffs );
     SDMF_rd_float_Array( gid, "lc", 1, &metaIndx, pixelRange, darkCurrent );
     SDMF_rd_float_Array( gid, "sig_ao", 1, &metaIndx, pixelRange, 
			  analogOffsError );
     SDMF_rd_float_Array( gid, "sig_lc", 1, &metaIndx, pixelRange,
			  darkCurrentError );
     SDMF_rd_float_Array( gid, "amp1", 1, &metaIndx, pixelRange, amp1 );
     SDMF_rd_float_Array( gid, "sig_amp1", 1, &metaIndx, pixelRange, sig_amp1 );
/*
 * calculate orbital dark for requested orbit-phase
 */
     orbvar = (float) 
	  (cos(2 * PI * (mtbl->orbitPhase + orbitPhase))
	   + mtbl->amp2 * cos(4 * PI * (mtbl->phase2 + orbitPhase)));
     orbsig = (float) 
	  (cos(2 * PI * (mtbl->orbitPhase + orbitPhase))
	   + mtbl->sig_amp2 * cos(4 * PI * (mtbl->phase2 + orbitPhase)));
     for ( np = 0; np < CHANNEL_SIZE; np++ ) {
	   darkCurrent[np] += orbvar * amp1[np];
	   darkCurrentError[np] += orbsig * sig_amp1[np];
     }
     (void) snprintf( str_msg, SHORT_STRING_LENGTH, msg_found, mtbl->absOrbit );
     NADC_ERROR( NADC_ERR_NONE, str_msg );
done:
     if ( mtbl != NULL ) free( mtbl );
     if ( gid > 0 ) H5Gclose( gid );
     if ( fid > 0 ) H5Fclose( fid );
     return found;
}