ocssw  1.0
/disk01/web/ocssw/build/src/geogen_modis/GEO_read_L1AECS_metadata.c (r8106/r7924)
Go to the documentation of this file.
00001 #include "PGS_MODIS_35251.h"
00002 #include "GEO_input.h"
00003 #include "GEO_product.h"
00004 #include "L1a_data.h"
00005 #include "smfio.h"
00006 
00007 int  GEO_read_L1AECS_metadata(
00008                MODFILE * const l1a_file,
00009                ECS_metadata_struct * const ECS_metadata 
00010               )
00011 
00012 /* 
00013 !C**************************************************************************
00014 !Description:   
00015         Routine in the input group of the Level-1A geolocation
00016         software to read ECS Inventory metadata from the 
00017         L1A product file.  
00018 
00019         Reads ECS Inventory Metadata:
00020                         RANGEBEGINNINGDATE
00021                         RANGEBEGINNINGTIME
00022                         RANGEENDINGDATE
00023                         RANGEENDINGTIME
00024                         DAYNIGHTFLAG
00025                         LOCALGRANULEID
00026                         PARAMETERVALUE.1 ("GRANULENUMBER")
00027                         ASSOCIATEDPLATFORMSHORTNAME.1
00028                         PRODUCTIONHISTORY
00029 
00030 !Input Parameters:
00031         MODFILE *l1a_file - MAPI structure for Level 1A file
00032 
00033 !Output Parameters:
00034                 ECS_metadata - structure for ECS metadata inputs
00035 
00036 Returns:
00037                 SUCCEED         if all metadatea are retrieved
00038                 FAIL            otherwise.
00039 
00040 Global variables:
00041         None. 
00042 
00043 Called by:
00044                 GEO_prepare_l1a_data()
00045 
00046 Routines Called:
00047                 getMODISECSinfo - Reads an ECS metadata attribute from an
00048                         HDF global attribute.
00049                 modsmf - writes error status messages to log
00050 
00051 !Revision History:
00052  * $Log: GEO_read_L1AECS_metadata.c,v $
00053  * Revision 4.1  2003/02/21 22:49:42  kuyper
00054  * Corrected to use void* pointers with %p format code.
00055  *
00056  * Revision 3.1  2002/06/13 22:51:29  kuyper
00057  * Removed unnecessary NCSA acknowledgement.
00058  *
00059  * Revision 2.4  2001/01/17 16:06:37  vlin
00060  * PRODUCTIONHISTORY is added per CCR 507
00061  *
00062  * Revision 2.3  2000/08/12  23:02:24  fhliang
00063  * Added AssociatedPlatformShortName to the metadata list.
00064  * Changed return type to 'int'.
00065  * Cleaned up messages.
00066  * Changed 'rtval' to 'retval'.
00067  * Added static char filefunc and used it in calls to modsmf().
00068  * Removed an extra PDL paragraph.
00069  *
00070  * Revision 2.2  1998/03/04  00:48:51  jjb
00071  * Bug Fix MODxl00638: Initialized ECS_metadata ingest strings
00072  *  to prevent writing uninitialized metadata strings
00073  *  into the MOD03 product's metadata.
00074  *
00075  * Revision 2.1  1997/10/21  18:16:22  kuyper
00076  * Returned from ClearCase
00077  *
00078  * Revision /main/GEO_V2_DEV/3 1997/10/06 kuyper
00079  * Changed MECS_CORE to L1A_COREMETADATA.
00080  *
00081  * Revision /main/GEO_V2_DEV/2  1997/09/3  Ding
00082  * Modified the code to read V2 input data.
00083  * ding@ltpmail.gsfc.nasa.gov
00084  *
00085  * Revision 1.6.1.1  1997/07/21  22:20:17  kuyper
00086  * Merged in out-of-sequence changes.
00087  *
00088  * Revision 1.6  1997/07/21  16:24:34  kuyper
00089  * Baselined Version 1
00090  *
00091  *Parallel development:
00092  * Revision 1.5  1997/06/02  17:51:51  kuyper
00093  * Merged seed files.
00094  *
00095  * Revision 1.5  1997/03/26  18:12:56  fhliang
00096  * Initial revision of SDST delivery of GEO_read_L1AECS_metadata.c.
00097  *
00098     Revision 1.4  1997/03/11  22:05:34  fshaw
00099     *** empty log message ***
00100     
00101     Revision 1.3  1997/02/13  23:25:11  kuyper
00102     Fixed typo in error message.
00103     
00104         Revision 1.2  1997/01/13 19:41:15  kuyper
00105         Adjusted #include file list.
00106     James Kuyper Jr. <kuyper@ltpmail.gsfc.nasa.gov>
00107 
00108         Revision 1.1  1997/01/08 16:06:27  mikej
00109         Initial revision
00110 
00111 
00112 Requirements:
00113                 PR03-F-2.1-1
00114                 PR03-F-2.1-2
00115                 PR03-F-2.1-3
00116 
00117 
00118 !Team-unique Header:
00119                 This software is developed by the MODIS Science Data Support
00120                 Team for the National Aeronautics and Space Administration,
00121                 Goddard Space Flight Center, under contract NAS5-32373.
00122                 
00123 !END***************************************************************************
00124 */
00125 
00126 {
00127 
00128 #define N_ELEMENTS(foo) ((int) (sizeof(foo) / sizeof(foo[0])))
00129 #define STRMAX 120
00130 #define ARGMAX 80
00131     const char ECSINITSTRING[] = "NOT SET";  /* metadata output initialization*/
00132 
00133     /*
00134     Warning: The order and sequence of the initilizations can not
00135     be changed. We finish the initilization later and count on this order 
00136     */
00137     struct ECSmeta{
00138         char *attrNameStr; /* name of metadata */
00139         char *hdfAttrname; /* name of HDF global attribute */
00140         char datatype[DATATYPELENMAX]; /* metadata data type */
00141         int32 n_elements; /* Number of metadata elements to retrieve */
00142         void * data; /* pointer to the data */
00143     } ECS_input_metadata[] = {
00144         {CORE_RANGE_BEG_DATE, L1A_COREMETADATA, TXT,
00145             (int32) sizeof(ECS_metadata->rangebeginningdate), NULL},
00146         {CORE_RANGE_BEG_TIME, L1A_COREMETADATA, TXT, 
00147             (int32) sizeof(ECS_metadata->rangebeginningtime), NULL},
00148         {CORE_RANGE_ENDING_DATE, L1A_COREMETADATA, TXT,
00149             (int32) sizeof(ECS_metadata->rangeendingdate), NULL},
00150         {CORE_RANGE_ENDING_TIME, L1A_COREMETADATA, TXT,
00151             (int32) sizeof(ECS_metadata->rangeendingtime), NULL},
00152         {CORE_DAYNIGHTFLAG, L1A_COREMETADATA, TXT,
00153             (int32) sizeof(ECS_metadata->operationmode), NULL},
00154         {CORE_LOCALGRANULEID, L1A_COREMETADATA, TXT,
00155             (int32) sizeof(ECS_metadata->localinputgranuleid), NULL},
00156         {CORE_PARAMETERVALUE ".1", L1A_COREMETADATA, TXT,
00157             (int32) sizeof(ECS_metadata->granulenumber), NULL},
00158         {CORE_ASSOCIATEDPLATFORMSHORTNAME ".1", L1A_COREMETADATA, TXT,
00159             (int32) sizeof(ECS_metadata->platformshortname), NULL},
00160         {MECS_PRODHISTORY, ARCHIVEMETADATA, TXT, (int32) sizeof( \
00161             (ECS_metadata->version_metadata).productionhistory), NULL}
00162     };
00163 
00164     int i, retval=SUCCEED;  /* loop index */
00165     int sameattr;
00166     char msgbuf[STRMAX];    /* scratch string buffer */
00167 
00168     static char filefunc[] = __FILE__", GEO_read_L1AECS_metadata";
00169 
00170 
00171   if((l1a_file == NULL) || (ECS_metadata == NULL) )
00172   {
00173       sprintf(msgbuf, " l1a_file = %p, ECS_metadata = %p",
00174       (void*)l1a_file, (void*)ECS_metadata);
00175       modsmf(MODIS_E_BAD_INPUT_ARG, msgbuf, filefunc);
00176 
00177       return FAIL;
00178   } 
00179   
00180 /*  Initialize ECS_metadata output */
00181     (void)memset(ECS_metadata,0,sizeof(ECS_metadata_struct));
00182     (void)strncpy(ECS_metadata->rangebeginningdate,ECSINITSTRING,
00183        sizeof(ECS_metadata->rangebeginningdate)-1);
00184     (void)strncpy(ECS_metadata->rangebeginningtime,ECSINITSTRING,
00185        sizeof(ECS_metadata->rangebeginningtime)-1);
00186     (void)strncpy(ECS_metadata->rangeendingdate,ECSINITSTRING,
00187        sizeof(ECS_metadata->rangeendingdate)-1);
00188     (void)strncpy(ECS_metadata->rangeendingtime,ECSINITSTRING,
00189        sizeof(ECS_metadata->rangeendingtime)-1);
00190     (void)strncpy(ECS_metadata->operationmode,ECSINITSTRING,
00191        sizeof(ECS_metadata->operationmode)-1);
00192     (void)strncpy(ECS_metadata->localinputgranuleid,ECSINITSTRING,
00193        sizeof(ECS_metadata->localinputgranuleid)-1);
00194     (void)strncpy(ECS_metadata->granulenumber,ECSINITSTRING,
00195        sizeof(ECS_metadata->granulenumber)-1);
00196     (void)strncpy(ECS_metadata->platformshortname,ECSINITSTRING,
00197        sizeof(ECS_metadata->platformshortname)-1);
00198     (void)strncpy((ECS_metadata->version_metadata).productionhistory,ECSINITSTRING,\
00199            sizeof((ECS_metadata->version_metadata).productionhistory)-1);
00200 
00201 /*  Finish initializing the ECS_input_metadata array with the contents 
00202     defined above.
00203     
00204     See warning about sequence in declaration section 
00205 */
00206     ECS_input_metadata[0].data = &ECS_metadata->rangebeginningdate;
00207     ECS_input_metadata[1].data = &ECS_metadata->rangebeginningtime;
00208     ECS_input_metadata[2].data = &ECS_metadata->rangeendingdate;
00209     ECS_input_metadata[3].data = &ECS_metadata->rangeendingtime;
00210     ECS_input_metadata[4].data = &ECS_metadata->operationmode;
00211     ECS_input_metadata[5].data = &ECS_metadata->localinputgranuleid;
00212     ECS_input_metadata[6].data = &ECS_metadata->granulenumber;
00213     ECS_input_metadata[7].data = &ECS_metadata->platformshortname;
00214     ECS_input_metadata[8].data = &ECS_metadata->version_metadata.productionhistory;
00215 
00216     for (i = 0; i < N_ELEMENTS(ECS_input_metadata); i++)
00217     {
00218         sameattr = (i > 0 && !(strncmp(ECS_input_metadata[i].hdfAttrname,
00219                            ECS_input_metadata[i-1].hdfAttrname,
00220                           sizeof(ECS_input_metadata[i].hdfAttrname))));
00221         if (getMODISECSinfo(l1a_file, (sameattr ? NULL :
00222                    ECS_input_metadata[i].hdfAttrname), 
00223             ECS_input_metadata[i].attrNameStr, ECS_input_metadata[i].datatype,
00224             &ECS_input_metadata[i].n_elements, ECS_input_metadata[i].data) != MAPIOK && 
00225         strcmp(ECS_input_metadata[i].attrNameStr, MECS_PRODHISTORY) != 0) {
00226             sprintf(msgbuf, "getMODISECSinfo(%.*s)", ARGMAX,
00227           ECS_input_metadata[i].attrNameStr);
00228             modsmf(MODIS_E_GEO, msgbuf, filefunc);
00229 
00230             retval = FAIL;
00231         }
00232     }
00233     
00234     return retval;
00235 }