Exemple #1
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;
}
Exemple #2
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
int main( int argc, char *argv[] )
     /*@globals  errno, stderr, nadc_stat, nadc_err_stack;@*/
     /*@modifies errno, stderr, nadc_stat, nadc_err_stack@*/
{
     unsigned int num_dsd;

     FILE  *fp = NULL;

     struct param_record param;
     struct mph_envi     mph;
     struct sph_meris    sph;
     struct dsd_envi     *dsd = NULL;
/*
 * initialization of command-line parameters
 */
     MERIS_SET_PARAM( argc, argv, MERIS_LEVEL_1, &param );
     if ( IS_ERR_STAT_FATAL ) 
          NADC_GOTO_ERROR( NADC_ERR_PARAM, "" );
/*
 * check if we have to display version and exit
 */
     if ( param.flag_version == PARAM_SET ) {
	  MERIS_SHOW_VERSION( stdout, "meris_fr1" );
	  exit( EXIT_SUCCESS );
     }
/*
 * dump command-line parameters
 */
     if ( param.flag_show == PARAM_SET ) {
          MERIS_SHOW_PARAM( MERIS_LEVEL_1, param );
          exit( EXIT_SUCCESS );
     }
/*
 * open input-file
 */
     if ( (fp = fopen( param.infile, "r" )) == NULL )
	  NADC_GOTO_ERROR( NADC_ERR_FILE, param.infile );
/*
 * create output file
 */
     if ( param.write_hdf5 == PARAM_SET ) {
          param.hdf_file_id = MERIS_CRE_H5_FILE( MERIS_LEVEL_1, &param );
          if ( IS_ERR_STAT_FATAL )
               NADC_GOTO_ERROR( NADC_ERR_HDF_CRE, "HDF5 base" );
          MERIS_WR_H5_VERSION( param.hdf_file_id );
     }
/*
 * -------------------------
 * read Main Product Header
 */
     ENVI_RD_MPH( fp, &mph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MPH" );
     if ( mph.tot_size != nadc_file_size( param.infile ) )
          NADC_GOTO_ERROR( NADC_ERR_FATAL, "file size check failed" );
     if ( param.write_ascii == PARAM_SET ) {
	  ENVI_WR_ASCII_MPH( param, &mph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MPH" );
     }
/*      if ( param.write_hdf5 == PARAM_SET ) { */
/* 	  SCIA_WR_H5_MPH( param, &mph ); */
/* 	  if ( IS_ERR_STAT_FATAL ) */
/* 	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "MPH" ); */
/*      } */
/*
 * -------------------------
 * read Specific Product Header
 */
     MERIS_RD_SPH( fp, mph, &sph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SPH" );
     if ( param.write_ascii == PARAM_SET ) {
	  MERIS_WR_ASCII_SPH( param, &sph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SPH" );
     }
/*      if ( param.write_hdf5 == PARAM_SET ) { */
/* 	  SCIA_OL2_WR_H5_SPH( param, &sph ); */
/* 	  if ( IS_ERR_STAT_FATAL ) */
/* 	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "SPH" ); */
/*      } */
/*
 * -------------------------
 * read Data Set Descriptor records
 */
     dsd = (struct dsd_envi *)
	  malloc( (mph.num_dsd-1) * sizeof( struct dsd_envi ) );
     if ( dsd == NULL ) NADC_GOTO_ERROR( NADC_ERR_ALLOC, "dsd" );
     num_dsd = ENVI_RD_DSD( fp, mph, dsd );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "DSD" );
     if ( param.write_ascii == PARAM_SET ) {
	  ENVI_WR_ASCII_DSD( param, num_dsd, dsd );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "DSD" );
     }
/*
 * when an error has occurred we jump to here:
 */
 done:
/*
 * close input file
 */
     if ( fp != NULL ) (void) fclose( fp );
/*
 * close HDF5 output file
 */
     if ( param.write_hdf5 == PARAM_SET ) {
	  if ( param.hdf_file_id >= 0 && H5Fclose( param.hdf_file_id ) < 0 )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, param.hdf5_name );
     }
/*
 * free allocated memory
 */
     if ( dsd != NULL ) free( dsd );
/*
 * display error messages?
 */
     if ( param.flag_silent == PARAM_UNSET ) NADC_Err_Trace( stderr );
     if ( IS_ERR_STAT_FATAL ) 
	  return NADC_ERR_FATAL;
     else
	  return NADC_ERR_NONE;
}
Exemple #3
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
int main( int argc, char *argv[] )
     /*@globals  errno, stderr, nadc_stat, nadc_err_stack;@*/
     /*@modifies errno, stderr, nadc_stat, nadc_err_stack@*/
{
     register unsigned short n_nfit, n_lfit, n_ofit;

     unsigned int nr_state, num_dsd, num_dsr, num_geo;

     FILE  *fp = NULL;
#ifdef _WITH_SQL
     PGconn *conn = NULL;
#endif
     struct param_record param;
     struct mph_envi     mph;
     struct sph_sci_ol   sph;
     struct dsd_envi     *dsd = NULL;
     struct sqads_sci_ol *sqads;
     struct lads_scia    *lads;
     struct state2_scia  *state;
     struct ngeo_scia    *ngeo = NULL;
     struct lgeo_scia    *lgeo;
     struct cld_sci_ol   *cld;
     struct nfit_scia    *nfit;
     struct lfit_scia    *lfit, *ofit;
     struct lcld_scia   *lcld;
/*
 * initialization of command-line parameters
 */
     SCIA_SET_PARAM( argc, argv, SCIA_LEVEL_2, &param );
     if ( IS_ERR_STAT_FATAL ) 
          NADC_GOTO_ERROR( NADC_ERR_PARAM, "" );
/*
 * check if we have to display version and exit
 */
     if ( param.flag_version == PARAM_SET ) {
	  SCIA_SHOW_VERSION( stdout, "scia_ol2" );
	  exit( EXIT_SUCCESS );
     }
/*
 * dump command-line parameters
 */
     if ( param.flag_show == PARAM_SET ) {
          SCIA_SHOW_PARAM( SCIA_LEVEL_2, param );
          exit( EXIT_SUCCESS );
     }
/*
 * connect to PostgreSQL database
 */
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET ) {
	  CONNECT_NADC_DB( &conn, "scia" );
	  if ( IS_ERR_STAT_FATAL ) 
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "PSQL" );
	  if ( param.flag_sql_remove == PARAM_SET 
	       || param.flag_sql_replace == PARAM_SET )
	       SCIA_OL2_DEL_ENTRY( conn, param.flag_verbose, param.infile );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "PSQL(remove)" );
	  if ( param.flag_sql_remove == PARAM_SET ) goto done;
     }
#endif
/*
 * open input-file
 */
     if ( (fp = fopen( param.infile, "r" )) == NULL )
	  NADC_GOTO_ERROR( NADC_ERR_FILE, param.infile );
/*
 * create output HDF5 file
 */
     if ( param.write_hdf5 == PARAM_SET ) {
	  param.hdf_file_id = SCIA_CRE_H5_FILE( SCIA_LEVEL_2, &param );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_CRE, "HDF5 base" );
	  SCIA_WR_H5_VERSION( param.hdf_file_id );
/*
 * create for data structures for SCIAMACHY level 1b data
 */
	  CRE_SCIA_OL2_H5_STRUCTS( param );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_CRE, "STRUCTS" );
     }
/*
 * -------------------------
 * read Main Product Header
 */
     ENVI_RD_MPH( fp, &mph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MPH" );
     if ( mph.tot_size != nadc_file_size( param.infile ) )
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, "file size check failed" );
     if ( param.write_ascii == PARAM_SET ) {
	  ENVI_WR_ASCII_MPH( param, &mph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MPH" );
     }
     if ( param.write_hdf5 == PARAM_SET ) {
	  SCIA_WR_H5_MPH( param, &mph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "MPH" );
     }
/*
 * -------------------------
 * read Specific Product Header
 */
     SCIA_OL2_RD_SPH( fp, mph, &sph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SPH" );
     if ( param.write_ascii == PARAM_SET ) {
	  SCIA_OL2_WR_ASCII_SPH( param, &sph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SPH" );
     }
     if ( param.write_hdf5 == PARAM_SET ) {
	  SCIA_OL2_WR_H5_SPH( param, &sph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "SPH" );
     }
/*
 * -------------------------
 * read Data Set Descriptor records
 */
     dsd = (struct dsd_envi *)
	  malloc( (mph.num_dsd-1) * sizeof( struct dsd_envi ) );
     if ( dsd == NULL ) NADC_GOTO_ERROR( NADC_ERR_ALLOC, "dsd" );
     num_dsd = ENVI_RD_DSD( fp, mph, dsd );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "DSD" );
     if ( param.write_ascii == PARAM_SET ) {
	  ENVI_WR_ASCII_DSD( param, num_dsd, dsd );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "DSD" );
     }
     if ( param.write_meta == PARAM_SET ) goto done;
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET ) {
	  const char dsd_name[] = "LEVEL_1B_PRODUCT";

	  unsigned int indx_dsd = ENVI_GET_DSD_INDEX( num_dsd, dsd, dsd_name );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_PDS_RD, dsd_name );
	  SCIA_OL2_WR_SQL_META( conn, param.flag_verbose, param.infile, 
				dsd[indx_dsd].flname, &mph, &sph );
	  if ( IS_ERR_STAT_WARN ) goto done;
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "SQL_META" );
     }
#endif
/*
 * -------------------------
 * read/write Summary of Quality Flags per State records
 */
     num_dsr = SCIA_OL2_RD_SQADS( fp, num_dsd, dsd, &sqads );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SQADS" );
     if ( num_dsr > 0 ) {
	  if ( param.write_ascii == PARAM_SET ) {
	       SCIA_OL2_WR_ASCII_SQADS( param, num_dsr, sqads );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SQADS" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_OL2_WR_H5_SQADS( param, num_dsr, sqads );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "SQADS" );
	  }
	  free( sqads );
     }
/*
 * -------------------------
 * read/write Geolocation of the States
 */
     num_dsr = SCIA_RD_LADS( fp, num_dsd, dsd, &lads );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "LADS" );
     if ( num_dsr > 0 ) {
	  if ( param.write_ascii == PARAM_SET ) {
	       SCIA_WR_ASCII_LADS( param, num_dsr, lads );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "LADS" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_WR_H5_LADS( param, num_dsr, lads );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "LADS" );
	  }
	  free( lads );
     }
/*
 * -------------------------
 * read/write Static Parameters
 */
/*
 * -------------------------
 * read/write States of the Product
 */
     nr_state = SCIA_LV2_RD_STATE( fp, num_dsd, dsd, &state );
     if ( IS_ERR_STAT_FATAL || nr_state  ==  0 )
          NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "STATE" );

     if ( param.write_ascii == PARAM_SET ) {
	  SCIA_LV2_WR_ASCII_STATE( param, nr_state, state );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "STATE" );
     }
     if ( param.write_hdf5 == PARAM_SET ) {
	  SCIA_LV2_WR_H5_STATE( param, nr_state, state );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "STATE" );
     }
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET ) {
	  SCIA_OL2_MATCH_STATE( conn, param.flag_verbose, 
				&mph, nr_state, state );
	  if ( IS_ERR_STAT_FATAL )
               NADC_GOTO_ERROR( NADC_ERR_SQL, "SQL_STATE" );
     }
#endif
     free( state );
/*
 * -------------------------
 * read/write Nadir Geolocation
 */
     num_geo = SCIA_OL2_RD_NGEO( fp, num_dsd, dsd, &ngeo );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "NGEO" );
     if ( num_geo > 0 ) {
	  if ( param.write_ascii == PARAM_SET ) {
	       SCIA_OL2_WR_ASCII_NGEO( param, num_geo, ngeo );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "NGEO" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_OL2_WR_H5_NGEO( param, num_geo, ngeo );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "NGEO" );
	  }
     }
/*
 * -------------------------
 * read/write Limb Geolocation
 */
     num_dsr = SCIA_OL2_RD_LGEO( fp, num_dsd, dsd, &lgeo );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "LGEO" );
     if ( num_dsr > 0 ) {
	  if ( param.write_ascii == PARAM_SET ) {
	       SCIA_OL2_WR_ASCII_LGEO( param, num_dsr, lgeo );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "LGEO" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_OL2_WR_H5_LGEO( param, num_dsr, lgeo );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "LGEO" );
	  }
	  free( lgeo );
     }
/*
 * -------------------------
 * read/write Clouds and Aerosol data
 */
     if ( param.write_cld == PARAM_SET ) {
	  num_dsr = SCIA_OL2_RD_CLD( fp, num_dsd, dsd, &cld );
	  if ( IS_ERR_STAT_FATAL ) 
	       NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "CLD" );
	  if ( num_dsr > 0 ) {
	       if ( param.write_ascii == PARAM_SET ) {
                    SCIA_OL2_WR_ASCII_CLD( param, num_dsr, cld );
                    if ( IS_ERR_STAT_FATAL )
                         NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "CLD" );
               }
               if ( param.write_hdf5 == PARAM_SET ) {
                    SCIA_OL2_WR_H5_CLD( param, num_dsr, cld );
                    if ( IS_ERR_STAT_FATAL )
                         NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "CLD" );
               }
#ifdef _WITH_SQL
	       if ( param.write_sql == PARAM_SET ) {
#ifdef _KNMI_SQL
		    SCIA_OL2_WR_SQL_CLD( conn, param.infile, num_dsr, cld );
#else
		    SCIA_OL2_WR_SQL_CLD( conn, param.flag_verbose, 
					 param.infile, 
					 num_dsr, ngeo, cld );
#endif
		    if ( IS_ERR_STAT_FATAL )
			 NADC_GOTO_ERROR( NADC_ERR_SQL, "SQL_CLD" );
	       }
#endif
               free( cld );
	  }
     }
/*
 * -------------------------
 * read/write Nadir fitting window application data
 */
     if ( param.write_nadir == PARAM_SET ) {
	  for ( n_nfit = 0; n_nfit < MAX_NFIT_SPECIES; n_nfit++ ) {
	       num_dsr = SCIA_OL2_RD_NFIT( fp, nfit_name[n_nfit], 
					   num_dsd, dsd, &nfit );
	       if ( param.flag_silent == PARAM_UNSET 
		    && param.write_sql == PARAM_UNSET ) 
		    (void) fprintf( stdout, "%s:\t%6u\n", 
				    nfit_name[n_nfit] , num_dsr );
	       if ( IS_ERR_STAT_FATAL ) 
		    NADC_GOTO_ERROR( NADC_ERR_PDS_RD, 
				     nfit_name[n_nfit] );
	       if ( num_dsr > 0 ) {
		    if ( param.write_ascii == PARAM_SET ) {
			 SCIA_OL2_WR_ASCII_NFIT( nfit_name[n_nfit], param, 
						 num_dsr, nfit );
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "NFIT" );
		    }
		    if ( param.write_hdf5 == PARAM_SET ) {
			 SCIA_OL2_WR_H5_NFIT( nfit_name[n_nfit], param, 
					      num_dsr, nfit );
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_HDF_WR, 
					       nfit_name[n_nfit] );
		    }
#ifdef _WITH_SQL
		    if ( param.write_sql == PARAM_SET ) {
#ifdef _KNMI_SQL
			 SCIA_OL2_WR_SQL_NFIT( conn, param.infile,
					       nfit_name[n_nfit], 
					       num_dsr, nfit );

#else
			 SCIA_OL2_WR_SQL_NFIT( conn, param.flag_verbose, 
					       param.infile, nfit_name[n_nfit], 
					       num_geo, ngeo, num_dsr, nfit );
#endif
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_SQL, "SQL_NFIT" );
		    }
#endif
		    free( nfit );
	       }
	  }
     }
/*
 * -------------------------
 * read/write Limb fitting window application data
 */
     if ( param.write_limb == PARAM_SET ) {
	  for ( n_lfit = 0; n_lfit < MAX_LFIT_SPECIES; n_lfit++ ) {
	       num_dsr = SCIA_OL2_RD_LFIT( fp, lfit_name[n_lfit],
					   num_dsd, dsd, &lfit );
	       if ( param.flag_silent == PARAM_UNSET 
		    && param.write_sql == PARAM_UNSET ) 
		    (void) fprintf( stdout, "%s:\t%6u\n", 
				    lfit_name[n_lfit], num_dsr );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_PDS_RD, 
				     lfit_name[n_lfit] );
	       if ( num_dsr > 0 ) {
		    if ( param.write_ascii == PARAM_SET ) {
			 SCIA_OL2_WR_ASCII_LFIT( lfit_name[n_lfit], param, 
						 num_dsr, lfit );
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "LFIT" );
		    }
		    if ( param.write_hdf5 == PARAM_SET ) {
			 SCIA_OL2_WR_H5_LFIT( lfit_name[n_lfit], param, 
					      num_dsr, lfit );
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_HDF_WR, 
					       lfit_name[n_lfit] );
		    }
		    free( lfit );
	       }
	  }
     }
/*
 * -------------------------
 * read/write Occultation fitting window application data
 */
     if ( param.write_occ != PARAM_SET ) {
	  for ( n_ofit = 0; n_ofit < MAX_OFIT_SPECIES; n_ofit++ ) {
	       num_dsr = SCIA_OL2_RD_LFIT( fp, ofit_name[n_ofit],
					   num_dsd, dsd, &ofit );
	       if ( param.flag_silent == PARAM_UNSET
		    && param.write_sql == PARAM_UNSET ) 
		    (void) fprintf( stdout, "%s:\t%6u\n", 
				    ofit_name[n_ofit], num_dsr );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_PDS_RD, 
				     ofit_name[n_ofit] );
	       if ( num_dsr > 0 ) {
		    if ( param.write_ascii == PARAM_SET ) {
			 SCIA_OL2_WR_ASCII_LFIT( ofit_name[n_ofit], param, 
						 num_dsr, ofit );
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "OFIT" );
		    }
		    if ( param.write_hdf5 == PARAM_SET ) {
			 SCIA_OL2_WR_H5_LFIT( ofit_name[n_ofit], param, 
					      num_dsr, ofit );
			 if ( IS_ERR_STAT_FATAL )
			      NADC_GOTO_ERROR( NADC_ERR_HDF_WR, 
					       ofit_name[n_ofit] );
		    }
		    free( ofit );
	       }
	  }
     }
/*
 * -------------------------
 * read/write Limb Clouds data sets
 */
     num_dsr = SCIA_OL2_RD_LCLD( fp, num_dsd, dsd, &lcld );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "LCLD" );
     if ( num_dsr > 0 ) {
	  if ( param.write_ascii == PARAM_SET ) {
	       SCIA_OL2_WR_ASCII_LCLD( param, num_dsr, lcld );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "LCLD" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_OL2_WR_H5_LCLD( param, num_dsr, lcld );
	       if ( IS_ERR_STAT_FATAL )
		    NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "LCLD" );
	  }
	  free( lcld );
     }
/*
 * -------------------------
 * read/write Ozone profile from Nadir measurements (TBD)
 */
/*
 * when an error has occurred we jump to here:
 */
 done:
/*
 * close input file
 */
     if ( fp != NULL ) (void) fclose( fp );
/*
 * close connection to PostgreSQL database
 */
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET && conn != NULL ) PQfinish( conn );
#endif
/*
 * close HDF5 output file
 */
     if ( param.write_hdf5 == PARAM_SET ) {
	  if ( param.hdf_file_id >= 0 && H5Fclose( param.hdf_file_id ) < 0 )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, param.hdf5_name );
     }
/*
 * free allocated memory
 */
     if ( dsd != NULL ) free( dsd );
     if ( ngeo != NULL ) free( ngeo );
/*
 * display error messages?
 */
     if ( param.flag_silent == PARAM_UNSET ) NADC_Err_Trace( stderr );
     if ( IS_ERR_STAT_FATAL ) 
	  return NADC_ERR_FATAL;
     else
	  return NADC_ERR_NONE;
}
Exemple #4
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
int main( int argc, char *argv[] )
/*@globals  errno, stderr, nadc_stat, nadc_err_stack;@*/
/*@modifies errno, stderr, nadc_stat, nadc_err_stack@*/
{
    register int ni;

    unsigned int num_dsd, num_dsr;

    FILE  *fp = NULL;

    struct param_record     param;
    struct mph_envi         mph;
    struct sph_meris        sph;
    struct dsd_envi         *dsd = NULL;
    struct sqads2_meris     *sqads;
    struct sfgi_meris       sfgi;
    struct tie_meris        *tie;
    struct mds_rr2_13_meris *mds_13;
    struct mds_rr2_14_meris *mds_14;
    struct mds_rr2_15_meris *mds_15;
    struct mds_rr2_16_meris *mds_16;
    struct mds_rr2_17_meris *mds_17;
    struct mds_rr2_18_meris *mds_18;
    struct mds_rr2_19_meris *mds_19;
    struct mds_rr2_20_meris *mds_20;
    /*
     * initialization of command-line parameters
     */
    MERIS_SET_PARAM( argc, argv, MERIS_LEVEL_2, &param );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PARAM, "" );
    /*
     * check if we have to display version and exit
     */
    if ( param.flag_version == PARAM_SET ) {
        MERIS_SHOW_VERSION( stdout, "meris_rr2" );
        exit( EXIT_SUCCESS );
    }
    /*
     * dump command-line parameters
     */
    if ( param.flag_show == PARAM_SET ) {
        MERIS_SHOW_PARAM( MERIS_LEVEL_2, param );
        exit( EXIT_SUCCESS );
    }
    /*
     * open input-file
     */
    if ( (fp = fopen( param.infile, "r" )) == NULL )
        NADC_GOTO_ERROR( NADC_ERR_FILE, param.infile );
    /*
     * create output file
     */
    if ( param.write_hdf5 == PARAM_SET ) {
        param.hdf_file_id = MERIS_CRE_H5_FILE( MERIS_LEVEL_2, &param );
        if ( IS_ERR_STAT_FATAL )
            NADC_GOTO_ERROR( NADC_ERR_HDF_CRE, "HDF5 base" );
        MERIS_WR_H5_VERSION( param.hdf_file_id );
    }
    /*
     * -------------------------
     * read Main Product Header
     */
    ENVI_RD_MPH( fp, &mph );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MPH" );
    if ( param.write_ascii == PARAM_SET ) {
        ENVI_WR_ASCII_MPH( param, &mph );
        if ( IS_ERR_STAT_FATAL )
            NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MPH" );
    }
    /*      if ( param.write_hdf5 == PARAM_SET ) { */
    /* 	  SCIA_WR_H5_MPH( param, &mph ); */
    /* 	  if ( IS_ERR_STAT_FATAL ) */
    /* 	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "MPH" ); */
    /*      } */
    /*
     * -------------------------
     * read Specific Product Header
     */
    MERIS_RD_SPH( fp, mph, &sph );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SPH" );
    if ( param.write_ascii == PARAM_SET ) {
        MERIS_WR_ASCII_SPH( param, &sph );
        if ( IS_ERR_STAT_FATAL )
            NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SPH" );
    }
    /*      if ( param.write_hdf5 == PARAM_SET ) { */
    /* 	  SCIA_OL2_WR_H5_SPH( param, &sph ); */
    /* 	  if ( IS_ERR_STAT_FATAL ) */
    /* 	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "SPH" ); */
    /*      } */
    /*
     * -------------------------
     * read Data Set Descriptor records
     */
    dsd = (struct dsd_envi *)
          malloc( (mph.num_dsd-1) * sizeof( struct dsd_envi ) );
    if ( dsd == NULL ) NADC_GOTO_ERROR( NADC_ERR_ALLOC, "dsd" );
    num_dsd = ENVI_RD_DSD( fp, mph, dsd );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "DSD" );
    if ( param.write_ascii == PARAM_SET ) {
        ENVI_WR_ASCII_DSD( param, num_dsd, dsd );
        if ( IS_ERR_STAT_FATAL )
            NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "DSD" );
    }
    /*
     * -------------------------
     * read/write Summary of Quality Flags
     */
    num_dsr = MERIS_RR2_RD_SQADS( fp, num_dsd, dsd, &sqads );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SQADS" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[SQADS] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SQADS( param, num_dsr, sqads ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SQADS" ); */
        /*           } */
        free( sqads );
    }
    /*
     * -------------------------
     * read/write Scaling Factors and General Info GADS
     */
    num_dsr = MERIS_RR2_RD_SFGI( fp, num_dsd, dsd, &sfgi );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SFGI" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[SFGI] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
    }
    /*
     * -------------------------
     * read/write Tie point locations and auxiliary data (LADS)
     */
    num_dsr = MERIS_RD_TIE( fp, num_dsd, dsd, &tie );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "TIE" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[TIE] = %-u\n", num_dsr );
        if ( param.write_ascii == PARAM_SET ) {
            MERIS_WR_ASCII_TIE( param, num_dsr, tie );
            if ( IS_ERR_STAT_FATAL )
                NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "TIE" );
        }
        free( tie );
    }
    /*
     * -------------------------
     * read/write RR-MDS 1 to 13
     */
    for ( ni = 1; ni <= 13; ni++ ) {
        num_dsr = MERIS_RR2_RD_MDS_13( ni, fp, num_dsd, dsd, &mds_13 );
        if ( IS_ERR_STAT_FATAL )
            NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_13" );
        if ( num_dsr > 0 ) {
            (void) fprintf( stderr, "num_dsr[MDS(%-d)] = %-u\n",
                            ni, num_dsr );
            /*           if ( param.write_ascii == PARAM_SET ) { */
            /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
            /*                if ( IS_ERR_STAT_FATAL ) */
            /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
            /*           } */
            free( mds_13 );
        }
    }
    /*
     * -------------------------
     * read/write RR-MDS 14
     */
    num_dsr = MERIS_RR2_RD_MDS_14( fp, num_dsd, dsd, &mds_14 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_14" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(14)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_14 );
    }
    /*
     * -------------------------
     * read/write RR-MDS 15
     */
    num_dsr = MERIS_RR2_RD_MDS_15( fp, num_dsd, dsd, &mds_15 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_15" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(15)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_15 );
    }
    /*
     * -------------------------
     * read/write RR-MDS 16
     */
    num_dsr = MERIS_RR2_RD_MDS_16( fp, num_dsd, dsd, &mds_16 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_16" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(16)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_16 );
    }
    /*
     * -------------------------
     * read/write RR-MDS 17
     */
    num_dsr = MERIS_RR2_RD_MDS_17( fp, num_dsd, dsd, &mds_17 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_17" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(17)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_17 );
    }
    /*
     * -------------------------
     * read/write RR-MDS 18
     */
    num_dsr = MERIS_RR2_RD_MDS_18( fp, num_dsd, dsd, &mds_18 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_18" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(18)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_18 );
    }
    /*
     * -------------------------
     * read/write RR-MDS 19
     */
    num_dsr = MERIS_RR2_RD_MDS_19( fp, num_dsd, dsd, &mds_19 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_19" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(19)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_19 );
    }
    /*
     * -------------------------
     * read/write RR-MDS 20
     */
    num_dsr = MERIS_RR2_RD_MDS_20( fp, num_dsd, dsd, &mds_20 );
    if ( IS_ERR_STAT_FATAL )
        NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_20" );
    if ( num_dsr > 0 ) {
        (void) fprintf( stderr, "num_dsr[MDS(20)] = %-u\n", num_dsr );
        /*           if ( param.write_ascii == PARAM_SET ) { */
        /*                MERIS_RR2_WR_ASCII_SFGI( param, num_dsr, sfgi ); */
        /*                if ( IS_ERR_STAT_FATAL ) */
        /*                     NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SFGI" ); */
        /*           } */
        free( mds_20 );
    }
    /*
     * when an error has occurred we jump to here:
     */
done:
    /*
     * close input file
     */
    if ( fp != NULL ) (void) fclose( fp );
    /*
     * close HDF5 output file
     */
    if ( param.write_hdf5 == PARAM_SET ) {
        if ( param.hdf_file_id >= 0 && H5Fclose( param.hdf_file_id ) < 0 )
            NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, param.hdf5_name );
    }
    /*
     * free allocated memory
     */
    if ( dsd != NULL ) free( dsd );
    /*
     * display error messages?
     */
    if ( param.flag_silent == PARAM_UNSET ) NADC_Err_Trace( stderr );
    if ( IS_ERR_STAT_FATAL )
        return NADC_ERR_FATAL;
    else
        return NADC_ERR_NONE;
}
Exemple #5
0
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
int main( int argc, char *argv[] )
     /*@globals  errno, stderr, stdout, nadc_stat, nadc_err_stack, 
       Use_Extern_Alloc;@*/
     /*@modifies errno, stderr, stdout, nadc_stat, nadc_err_stack@*/
{
     register size_t ns;

     size_t num_state_all = 0;
     size_t num_state = 0;

     unsigned short num;
     unsigned int   num_dsd;

     FILE  *fd = NULL;
#ifdef _WITH_SQL
     PGconn *conn = NULL;
#endif
     struct param_record param;
     struct mph_envi  mph;
     struct sph0_scia sph;
     struct dsd_envi  *dsd = NULL;
     struct mds0_states *states_all = NULL;
     struct mds0_states *states = NULL;
     struct mds0_aux  *aux;
     struct mds0_det  *det;
     struct mds0_pmd  *pmd;
/*
 * initialization of command-line parameters
 */
     SCIA_SET_PARAM( argc, argv, SCIA_LEVEL_0, &param );
     if ( IS_ERR_STAT_FATAL ) NADC_GOTO_ERROR( NADC_ERR_PARAM, "" );
/*
 * check if we have to display version and exit
 */
     if ( param.flag_version == PARAM_SET ) {
	  SCIA_SHOW_VERSION( stdout, "scia_nl0" );
	  exit( EXIT_SUCCESS );
     }
/*
 * dump command-line parameters
 */
     if ( param.flag_show == PARAM_SET ) {
          SCIA_SHOW_PARAM( SCIA_LEVEL_0, param );
          exit( EXIT_SUCCESS );
     }
/*
 * connect to PostgreSQL database
 */
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET ) {
	  CONNECT_NADC_DB( &conn, "scia" );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "PSQL" );
	  if ( param.flag_sql_remove == PARAM_SET 
	       || param.flag_sql_replace == PARAM_SET )
	       SCIA_LV0_DEL_ENTRY( conn, param.flag_verbose, param.infile );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "PSQL(remove)" );
	  if ( param.flag_sql_remove == PARAM_SET ) goto done;
     }
#endif
/*
 * open input-file
 */
     if ( (fd = fopen( param.infile, "r" )) == NULL )
	  NADC_GOTO_ERROR( NADC_ERR_FILE, param.infile );
/*
 * create output file
 */
     if ( param.write_hdf5 == PARAM_SET ) {
	  param.hdf_file_id = SCIA_CRE_H5_FILE( SCIA_LEVEL_0, &param );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_CRE, "HDF5 base" );
	  SCIA_WR_H5_VERSION( param.hdf_file_id );
     }
/*
 * -------------------------
 * read Main Product Header
 */
     ENVI_RD_MPH( fd, &mph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MPH" );
     if ( mph.tot_size != nadc_file_size( param.infile ) )
	  NADC_GOTO_ERROR( NADC_ERR_FATAL, "file size check failed" );
     if ( param.write_ascii == PARAM_SET ) {
	  ENVI_WR_ASCII_MPH( param, &mph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MPH" );
     }
     if ( param.write_hdf5 == PARAM_SET ) {
	  SCIA_WR_H5_MPH( param, &mph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "MPH" );
     }
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET ) {
	  SCIA_LV0_WR_SQL_META( conn, param.flag_verbose, param.infile, &mph );
	  if ( IS_ERR_STAT_WARN ) goto done;
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "SQL_META" );
     }
#endif
/*
 * -------------------------
 * read Specific Product Header
 */
     SCIA_LV0_RD_SPH( fd, mph, &sph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "SPH" );
     if ( param.write_ascii == PARAM_SET ) {
	  SCIA_LV0_WR_ASCII_SPH( param, &sph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "SPH" );
     }
     if ( param.write_hdf5 == PARAM_SET ) {
	  SCIA_LV0_WR_H5_SPH( param, &sph );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_WR, "SPH" );
     }
/*
 * -------------------------
 * read Data Set Descriptor records
 */
     dsd = (struct dsd_envi *)
	  malloc( (mph.num_dsd-1) * sizeof( struct dsd_envi ) );
     if ( dsd == NULL ) NADC_GOTO_ERROR( NADC_ERR_ALLOC, "dsd" );
     num_dsd = ENVI_RD_DSD( fd, mph, dsd );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "DSD" );
     if ( param.write_ascii == PARAM_SET ) {
	  ENVI_WR_ASCII_DSD( param, num_dsd, dsd );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "DSD" );
     }
     if ( param.write_meta == PARAM_SET ) goto done;
/*
 * -------------------------
 * read SCIAMACHY source packets
 *
 * first read MDS info data
 */
     num_state_all = SCIA_LV0_RD_MDS_INFO( fd, num_dsd, dsd, &states_all );
     if ( IS_ERR_STAT_FATAL )
	  NADC_GOTO_ERROR( NADC_ERR_FILE_RD, "RD_MDS_INFO" );
     if ( param.write_ascii == PARAM_SET ) {
	  SCIA_LV0_WR_ASCII_INFO( param, num_state_all, states_all );
	  if ( IS_ERR_STAT_FATAL ) 
	       NADC_GOTO_ERROR( NADC_ERR_FILE_RD, "WR_MDS_INFO" );
     }
     num_state = SCIA_LV0_SELECT_MDS(param, num_state_all, states_all, &states);
     SCIA_LV0_FREE_MDS_INFO( num_state_all, states_all );

     if ( num_state == 0 ) goto done;

#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET ) {
	  struct mds0_sql sqlState[256];

	  for ( ns = 0; ns < num_state && ns < 256; ns++ ) {
	       sqlState[ns].nrAux = 
		    SCIA_LV0_RD_AUX( fd, states[ns].info_aux,
				     states[ns].num_aux, &aux );
	       if ( IS_ERR_STAT_FATAL ) goto failed;

	       sqlState[ns].nrDet = 
		    SCIA_LV0_RD_DET( fd, states[ns].info_det,
				     states[ns].num_det, BAND_ALL, &det );
	       if ( IS_ERR_STAT_FATAL ) goto failed;

	       sqlState[ns].nrPMD = 
		    SCIA_LV0_RD_PMD( fd, states[ns].info_pmd,
				     states[ns].num_pmd, &pmd );
	       if ( IS_ERR_STAT_FATAL ) goto failed;

	       /* set DateTime and StateID of current state */
	       (void) memcpy( &sqlState[ns].mjd, &states[ns].mjd,
			      sizeof(struct mjd_envi) );
	       sqlState[ns].stateID = states[ns].state_id;

	       /* obtain OBM temperature of current state */
	       GET_SCIA_LV0_STATE_OBMtemp( TRUE, sqlState[ns].nrAux, aux,
					   &sqlState[ns].obmTemp );
	       if ( IS_ERR_STAT_FATAL ) goto failed;

	       /* obtain Detectory array temperature of current state */
	       GET_SCIA_LV0_STATE_DETtemp( sqlState[ns].nrDet, det, 
					   sqlState[ns].chanTemp );
	       if ( IS_ERR_STAT_FATAL ) goto failed;

	       /* obtain Detectory array temperature of current state */
	       GET_SCIA_LV0_STATE_PMDtemp( sqlState[ns].nrPMD, pmd, 
					   &sqlState[ns].pmdTemp );
	       if ( IS_ERR_STAT_FATAL ) goto failed;

	       /* release allocated memory */
	       if ( sqlState[ns].nrAux > 0 ) free( aux );
	       SCIA_LV0_FREE_MDS_DET( sqlState[ns].nrDet, det );
	       if ( sqlState[ns].nrPMD > 0 ) free( pmd );
	  }
 failed:
	  SCIA_LV0_MATCH_STATE( conn, param.flag_verbose,
				&mph, num_state, sqlState );
	  if ( IS_ERR_STAT_FATAL )
	       NADC_GOTO_ERROR( NADC_ERR_SQL, "SQL_STATE" );
	  goto done;
     }
#endif
/* 
 * process Auxiliary source packets
 */
     if ( param.flag_silent == PARAM_UNSET )
	  NADC_Info_Proc( stdout, "Auxiliary MDS", num_state );

     for ( ns = 0; ns < num_state; ns++ ) {
	  if ( states[ns].num_aux == 0 ) continue;
	  
	  if ( param.flag_silent == PARAM_UNSET )
	       NADC_Info_Update( stdout, 3, ns );

	  num = SCIA_LV0_RD_AUX( fd, states[ns].info_aux, states[ns].num_aux,
				 &aux );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_AUX" );
	  }
	  
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_LV0_WR_H5_AUX( param, ns, num, aux );
	  } else if ( param.write_ascii == PARAM_SET ) {
 	       SCIA_LV0_WR_ASCII_AUX( param, ns, num, aux );
	  }
	  free( aux );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MDS_AUX" );
	  }
     }
     if ( param.flag_silent == PARAM_UNSET )
	  NADC_Info_Finish( stdout, 3, ns );
/* 
 * process Detector source packets
 */
     if ( param.flag_silent == PARAM_UNSET )
	  NADC_Info_Proc( stdout, "Detector MDS", num_state );
     
     for ( ns = 0; ns < num_state; ns++ ) {
	  if ( states[ns].num_det == 0 ) continue;

	  if ( param.flag_silent == PARAM_UNSET )
	       NADC_Info_Update( stdout, 3, ns );

	  num = SCIA_LV0_RD_DET( fd, states[ns].info_det, states[ns].num_det,
				 param.chan_mask, &det );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_DET" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_LV0_WR_H5_DET( param, ns, num, det );
	  } else if ( param.write_ascii == PARAM_SET ) {
	       SCIA_LV0_WR_ASCII_DET( param, ns, num, det );
	  }
	  SCIA_LV0_FREE_MDS_DET( num, det );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MDS_DET" );
	  }
     }
     if ( param.flag_silent == PARAM_UNSET )
	  NADC_Info_Finish( stdout, 3, ns );
/* 
 * process PMD source packets
 */
     if ( param.flag_silent == PARAM_UNSET )
	  NADC_Info_Proc( stdout, "PMD MDS", num_state );

     for ( ns = 0; ns < num_state; ns++ ) {
	  if ( states[ns].num_pmd == 0 ) continue;

	  if ( param.flag_silent == PARAM_UNSET )
	       NADC_Info_Update( stdout, 3, ns );

	  num = SCIA_LV0_RD_PMD( fd, states[ns].info_pmd, states[ns].num_pmd,
				 &pmd );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_GOTO_ERROR( NADC_ERR_PDS_RD, "MDS_PMD" );
	  }
	  if ( param.write_hdf5 == PARAM_SET ) {
	       SCIA_LV0_WR_H5_PMD( param, ns, num, pmd );
	  } else if ( param.write_ascii == PARAM_SET ) {
	       SCIA_LV0_WR_ASCII_PMD( param, ns, num, pmd );
	  }
	  free( pmd );
	  if ( IS_ERR_STAT_FATAL ) {
	       NADC_GOTO_ERROR( NADC_ERR_FILE_WR, "MDS_PMD" );
	  }
     }
     if ( param.flag_silent == PARAM_UNSET )
	  NADC_Info_Finish( stdout, 3, ns );
/*
 * when an error has occurred we jump to here:
 */
 done:
/*
 * close input file
 */
     if ( fd != NULL ) (void) fclose( fd );
/*
 * close connection to PostgreSQL database
 */
#ifdef _WITH_SQL
     if ( param.write_sql == PARAM_SET && conn != NULL ) PQfinish( conn );
#endif
/*
 * close HDF5 output file
 */
     if ( param.write_hdf5 == PARAM_SET ) {
	  if ( param.hdf_file_id >= 0 && H5Fclose( param.hdf_file_id ) < 0 )
	       NADC_GOTO_ERROR( NADC_ERR_HDF_FILE, param.hdf5_name );
     }
/*
 * free allocated memory
 */
     if ( dsd != NULL ) free( dsd );
     SCIA_LV0_FREE_MDS_INFO( num_state, states );
/*
 * display error messages?
 */
     if ( param.flag_silent == PARAM_UNSET ) NADC_Err_Trace( stderr );
     if ( IS_ERR_STAT_FATAL ) 
	  return NADC_ERR_FATAL;
     else
	  return NADC_ERR_NONE;
}
/*+++++++++++++++++++++++++
.IDENTifer  SCIA_LV1_WR_DSD_UPDATE
.PURPOSE    update DSD records in output file
.INPUT/OUTPUT
  call as   SCIA_LV1_WR_DSD_UPDATE( fp_in, fp_out );
     input:
            FILE *fp_in   :  (open) stream pointer (input)
	    FILE *fp_out  :  (open) stream pointer (output)
            
.RETURNS     nothing
.COMMENTS    IMPORTANT: call this routine just before closing the PDS file
             Update MPH: PRODUCT, NUM_DSD, NUM_DATA_SETS
             Update SPH: NO_OF_NADIR_STATES, NO_OF_LIMB_STATES, 
                         NO_OF_OCCULTATION_STATES, NO_OF_MONI_STATES
             Update DSD records in file 
                         (recalculate all dsd records "ds_offset")
-------------------------*/
void SCIA_LV1_WR_DSD_UPDATE( FILE *fp_in, FILE *fp_out )
       /*@globals  errno, stderr, nadc_stat, nadc_err_stack, 
                   num_nadir_states, num_limb_states, num_occult_states,
                  num_monitor_states, num_dsd_out, dsd_out;@*/
       /*@modifies errno, stderr, nadc_stat, nadc_err_stack, fp_in, fp_out,
                   dsd_out[].offset@*/
{
     register unsigned int nr;
     register unsigned int offset;

     unsigned int sph_only_size;
     unsigned int num_data_sets;

     struct mph_envi    mph;
     struct sph1_scia   sph;

/* Note: MPH maybe modified, therefore, read MPH from output file */
     ENVI_RD_MPH( fp_out, &mph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_RETURN_ERROR( NADC_ERR_PDS_RD, "MPH" );
     SCIA_LV1_RD_SPH( fp_in, mph, &sph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_RETURN_ERROR( NADC_ERR_PDS_RD, "SPH" );
/*
 * update DSD records (recalculate all dsd records "ds_offset")
 */
     sph_only_size = mph.sph_size - mph.num_dsd * mph.dsd_size;
     num_data_sets = 2;          /* MPH & SPH */
     offset = PDS_MPH_LENGTH + sph_only_size 
	  + (num_dsd_out+1) * mph.dsd_size;
     for ( nr = 0; nr < num_dsd_out; nr++ ) {
	  if ( dsd_out[nr].type[0] == 'R' ) break;

	  if ( dsd_out[nr].size > 0u ) num_data_sets++;
	  if ( strncmp( dsd_out[nr].flname, "NOT USED", 8 ) != 0 )
	       dsd_out[nr].offset = offset;
	  offset += dsd_out[nr].size;
     }
/*
 * update MPH records
 */
     if ( fseek( fp_out, 0L, SEEK_SET ) != 0 ) 
	  perror( "SCIA_LV1_WR_DSD_UPDATE" );
     if ( IS_SCIA_LV1C( num_dsd_out, dsd_out )
	  && strncmp( mph.product, "SCI_NL__1P", 10 ) == 0 ) {
	  mph.product[6] = 'C';
	  mph.product[9] = 'C';
     }
     mph.num_dsd = num_dsd_out + 1;
     mph.sph_size = sph_only_size + mph.num_dsd * mph.dsd_size;
     mph.tot_size = offset;
     mph.num_data_sets = num_data_sets;
     ENVI_WR_MPH( fp_out, mph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_RETURN_ERROR( NADC_ERR_FILE_WR, "MPH" );
/*
 * update SPH records
 */
     sph.no_nadir = num_nadir_states;
     sph.no_limb = num_limb_states;
     sph.no_occult = num_occult_states;
     sph.no_monitor = num_monitor_states;
     SCIA_LV1_WR_SPH( fp_out, mph, sph );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_RETURN_ERROR( NADC_ERR_FILE_WR, "SPH" );
/*
 * update DSD records
 */
     ENVI_WR_DSD( fp_out, num_dsd_out, dsd_out );
     if ( IS_ERR_STAT_FATAL ) 
	  NADC_RETURN_ERROR( NADC_ERR_FILE_WR, "DSD" );
/*
 * close output file
 */
     (void) fclose( fp_out );
}