[SCM] epr-api branch, master, updated. debian/2.2-1-29-ge0d9945

Antonio Valentino antonio.valentino at tiscali.it
Tue Aug 13 18:49:07 UTC 2013


The following commit has been merged in the master branch:
commit 5812e8f0c8add4c105a47b6aa41332aab608bea4
Author: Antonio Valentino <antonio.valentino at tiscali.it>
Date:   Tue Aug 13 11:12:38 2013 +0000

    Imported Upstream version 2.3~dev20130813

diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index b9d8202..49e3629 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,8 +1,14 @@
 
-           CHANGELOG for the EPR-API, VERSION 2.2
+           CHANGELOG for the EPR-API, VERSION 2.3
 
 
 ----------------------------------------------------------------------
+Changes from Version 2.2 to Version 2.3 (of DD. MMMM YYYY)
+----------------------------------------------------------------------
+Bugfix in epr_band.c: [EPR-7] Interpolation of geolocation ADS
+Bugfix in epr_core.c: Setting errno to 0 in method epr_str_to_number.
+
+----------------------------------------------------------------------
 Changes from Version 2.1 to Version 2.2 (of 31. July 2010)
 ----------------------------------------------------------------------
 Generally replaced usage of data type "long" by "int" since "long" is 
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..85cb206
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,62 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+
+cmake_minimum_required(VERSION 2.8)
+project(epr-api)
+
+
+# set version number
+set(EPR_API_VERSION_MAJOR 2)
+set(EPR_API_VERSION_MINOR 3)
+set(EPR_API_VERSION_PATCH 0)
+
+
+# options
+option(BUILD_STATIC_LIB "build the static version of the library" YES)
+option(BUILD_TESTS "build test programs" OFF)
+option(BUILD_DOCS "build Doxygen documentation" OFF)
+
+
+# testing
+enable_testing()
+
+
+# sub-directories
+add_subdirectory(src)
+
+if(BUILD_TESTS)
+    add_subdirectory(bccunit)
+endif(BUILD_TESTS)
+
+if(BUILD_DOCS)
+    add_subdirectory(docs)
+endif(BUILD_DOCS)
+
+
+# uninstall target
+configure_file(
+    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+    IMMEDIATE @ONLY)
+
+add_custom_target(uninstall
+    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+
+
+# packaging
+include(InstallRequiredSystemLibraries)
+
+set(CPACK_GENERATOR TGZ ZIP STGZ)
+set(CPACK_SOURCE_GENERATOR TGZ ZIP)
+set(CPACK_PACKAGE_VERSION_MAJOR ${EPR_API_VERSION_MAJOR})
+set(CPACK_PACKAGE_VERSION_MINOR ${EPR_API_VERSION_MINOR})
+set(CPACK_PACKAGE_VERSION_PATCH ${EPR_API_VERSION_PATCH})
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.txt")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
+    "Delft object-oriented radar interferometric software")
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
+set(CPACK_SOURCE_IGNORE_FILES "/build.*;.*~;\\\\.git.*;\\\\.user$;\\\\.DS_Store")
+set(CPACK_STRIP_FILES TRUE)
+set(CPACK_SOURCE_STRIP_FILES TRUE)
+
+include(CPack)
diff --git a/README.txt b/README.txt
index 6a4bba5..fef26a3 100644
--- a/README.txt
+++ b/README.txt
@@ -1,9 +1,9 @@
                                  README
 
                      ENVISAT Product Reader API for C
-                              Version 2.2
+                              Version 2.3
 
-                              31. July 2010
+                              DD. MMMM YYYY
 
 
 Contents
@@ -135,13 +135,11 @@ Zip Archive Contents
 
 Bug Reports and Feedback
 
-    Please submit your bug reports via e-mail to
-    beam-issues at brockmann-consult.de
+    Please submit your bug reports at the issue tracker at
+    http://www.brockmann-consult.de/beam-jira/browse/EPR
+    or via e-mail to beam-issues at brockmann-consult.de
     and tell us which bug fixes matter most to you.
 
-    You can also send comments directly to the software engineering team
-    norman.fomferra at brockmann-consult.de
-    sabine.embacher at brockmann-consult.de
 
 --------------------------------------------------------------------------------
 Thank you for using the EPR API Software.
diff --git a/VERSION.txt b/VERSION.txt
index 96de6bf..79becbe 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1,2 +1,2 @@
-VERSION 2.2
+VERSION 2.3-SNAPSHOT
 
diff --git a/bccunit/CMakeLists.txt b/bccunit/CMakeLists.txt
new file mode 100644
index 0000000..980dfb7
--- /dev/null
+++ b/bccunit/CMakeLists.txt
@@ -0,0 +1,3 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+add_subdirectory(src)
diff --git a/bccunit/src/CMakeLists.txt b/bccunit/src/CMakeLists.txt
new file mode 100644
index 0000000..be2c4d7
--- /dev/null
+++ b/bccunit/src/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+add_library(bccunit STATIC bccunit.c)
+
+add_executable(bccunit_test bccunit_test.c)
+target_link_libraries(bccunit_test bccunit)
+
+add_test(BCCUNIT_TEST_SUITE_01 bccunit_test)
+set_tests_properties(BCCUNIT_TEST_SUITE_01 PROPERTIES PASS_REGULAR_EXPRESSION
+    "bccunit: test summary: 4 test case\\(s\\) total, 2 failure\\(s\\), 0 error\\(s\\)")
diff --git a/cmake_uninstall.cmake.in b/cmake_uninstall.cmake.in
new file mode 100644
index 0000000..c6d8094
--- /dev/null
+++ b/cmake_uninstall.cmake.in
@@ -0,0 +1,22 @@
+if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+    message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+string(REGEX REPLACE "\n" ";" files "${files}")
+list(REVERSE files)
+foreach (file ${files})
+    message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
+    if (EXISTS "$ENV{DESTDIR}${file}")
+        execute_process(
+            COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
+            OUTPUT_VARIABLE rm_out
+            RESULT_VARIABLE rm_retval
+        )
+        if(NOT ${rm_retval} EQUAL 0)
+            message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+        endif (NOT ${rm_retval} EQUAL 0)
+    else (EXISTS "$ENV{DESTDIR}${file}")
+        message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
+    endif (EXISTS "$ENV{DESTDIR}${file}")
+endforeach(file)
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
new file mode 100644
index 0000000..b4041d7
--- /dev/null
+++ b/docs/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+
+find_package(Doxygen)
+if(DOXYGEN_FOUND)
+    add_custom_command(
+        OUTPUT doxygen_main_content.html footer.html header.html images ${CMAKE_BINARY_DIR}/src/epr_api.h
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_main_content.html .
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/footer.html .
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/header.html .
+        COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/images images
+        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/src/epr_api.h ${CMAKE_BINARY_DIR}/src/epr_api.h
+        COMMENT "Copy template files and images")
+
+    add_custom_target(doc ALL
+        ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.txt
+        DEPENDS ${CMAKE_BINARY_DIR}/src/epr_api.h doxygen_main_content.html footer.html header.html images
+        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+        COMMENT "Generating API documentation with Doxygen" VERBATIM
+    )
+
+    add_custom_target(
+        clean_doc
+        COMMAND ${CMAKE_COMMAND} -E remove_directory epr_c_api
+        COMMENT "Clean HTML doc")
+
+    #add_dependencies(clean clean_doc)
+
+    install(
+        DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/epr_c_api/
+        DESTINATION share/doc/epr-api/html
+        COMPONENT doc)
+    install(
+        DIRECTORY images
+        DESTINATION share/doc/epr-api
+        COMPONENT doc)
+
+endif(DOXYGEN_FOUND)
diff --git a/docs/Doxyfile.txt b/docs/Doxyfile.txt
index 32b041e..a0875fa 100644
--- a/docs/Doxyfile.txt
+++ b/docs/Doxyfile.txt
@@ -31,7 +31,7 @@ PROJECT_NAME           = "ENVISAT Product Reader C API"
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = 2.2
+PROJECT_NUMBER         = 2.3
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
diff --git a/makefile b/makefile
index 42f1400..6824a71 100644
--- a/makefile
+++ b/makefile
@@ -15,7 +15,7 @@ OUTDIR = ./build/$(CONFIG)
 # TARGET  = $(OUTDIR)/libepr_api.so
 
 # for linux
-COMPILE = gcc -fPIC -ansi -c -I$(SRCDIR) -I$(THISDIR) $(OPTIONS)
+COMPILE = $(CC) $(CFLAGS) -fPIC -ansi -c -I$(SRCDIR) -I$(THISDIR) $(OPTIONS)
 LINK    = ld -shared
 TARGET  = $(OUTDIR)/libepr_api.so
 
@@ -119,7 +119,7 @@ clean:
 
 
 $(TARGET) : $(OBJECTS)
-	$(LINK) -o $@ $(OBJECTS) -lm
+	$(LINK) $(LDFLAGS) -o $@ $(OBJECTS) -lm -lc
 
 SRC_1 = $(SRCDIR)/epr_api.c
 $(OUTDIR)/epr_api.o : $(HEADERS) $(SRC_1)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..f1e9540
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,44 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+
+# sources
+set(SOURCES epr_api.c
+            epr_core.c
+            epr_dddb.c
+            epr_product.c
+            epr_dataset.c
+            epr_string.c
+            epr_ptrarray.c
+            epr_field.c
+            epr_record.c
+            epr_param.c
+            epr_dsd.c
+            epr_msph.c
+            epr_swap.c
+            epr_band.c
+            epr_bitmask.c
+            epr_dump.c
+            epr_typconv.c
+)
+
+
+# targets
+add_library(epr_api SHARED ${SOURCES})
+
+if(BUILD_STATIC_LIB)
+    add_library(epr_api_static STATIC ${SOURCES})
+	set_target_properties(epr_api_static PROPERTIES OUTPUT_NAME epr_api)
+endif(BUILD_STATIC_LIB)
+
+
+# sub-directories
+if(BUILD_TESTS)
+    add_subdirectory(api-test)
+    add_subdirectory(test)
+endif(BUILD_TESTS)
+
+
+# install
+install(TARGETS epr_api epr_api_static
+        LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
+install(FILES epr_api.h epr_ptrarray.h DESTINATION include)
diff --git a/src/api-test/CMakeLists.txt b/src/api-test/CMakeLists.txt
new file mode 100644
index 0000000..5f18494
--- /dev/null
+++ b/src/api-test/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+add_executable(api_tests api_tests.c)
+target_link_libraries(api_tests epr_api)
+
+#add_test(TEST_API_02 api_tests)
diff --git a/src/epr_api.h b/src/epr_api.h
index 077ed2c..402ca91 100644
--- a/src/epr_api.h
+++ b/src/epr_api.h
@@ -31,7 +31,7 @@ extern "C"
 #include "epr_ptrarray.h"
 
 #define EPR_PRODUCT_API_NAME_STR         "ENVISAT Product Reader API"
-#define EPR_PRODUCT_API_VERSION_STR      "2.2"
+#define EPR_PRODUCT_API_VERSION_STR      "2.3"
 
 /* needed by Doxygen */
 /** \mainpage
diff --git a/src/epr_band.c b/src/epr_band.c
index a450ff1..9092dc2 100644
--- a/src/epr_band.c
+++ b/src/epr_band.c
@@ -191,7 +191,13 @@ EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id) {
                     && strncmp(product_id->id_string, "ASA_APG", 7) != 0) {
                 band_id->lines_mirrored = TRUE;
             } else {
-                band_id->lines_mirrored = FALSE;
+                if (strncmp(product_id->id_string, EPR_ENVISAT_PRODUCT_SAR, 3) == 0
+                        && strncmp(product_id->id_string, "SAR_IMG", 7) != 0
+                        && strncmp(product_id->id_string, "SAR_APG", 7) != 0) {
+                    band_id->lines_mirrored = TRUE;
+                } else {
+                    band_id->lines_mirrored = FALSE;
+                }
             }
         }
 
@@ -666,7 +672,7 @@ int epr_read_band_raster(EPR_SBandId* band_id,
         }
     } else if (strcmp(rec_type, "A") == 0) {
         if (epr_read_band_annotation_data
-                (band_id, offset_x, offset_y, raster) == 1) {
+                (band_id, offset_x, offset_y, raster)) {
             epr_set_err(e_err_file_read_error,
                         "epr_read_band_raster: unsuccessfully reading band annotation data");
             return epr_get_last_err_code();
@@ -719,6 +725,8 @@ int epr_read_band_measurement_data(EPR_SBandId* band_id,
         scan_line_length = EPR_ATS_LINE_LENGTH;
     } else if (strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0) {
         scan_line_length = epr_get_scene_width(product_id);
+    } else if (strncmp(EPR_ENVISAT_PRODUCT_SAR, product_id->id_string, 3) == 0) {
+        scan_line_length = epr_get_scene_width(product_id);
     } else {
         epr_set_err(e_err_illegal_arg,
                     "epr_read_band_measurement_data: scan line length unknown");
@@ -774,6 +782,9 @@ int epr_read_band_measurement_data(EPR_SBandId* band_id,
 
         /*get the next record by the given name*/
         record = epr_read_record(dataset_id, iY, record);
+        if (record == NULL) {
+            return epr_get_last_err_code();
+        }
         /*get the field at its number*/
         field = epr_get_field_at(record, band_id->dataset_ref.field_index - 1);
         /*get the scaled "line" of physical values*/
@@ -875,7 +886,7 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
         field = epr_get_field(sph_record, "LINE_LENGTH");
         scan_line_length = epr_get_field_elem_as_uint(field, 0);
     } else if (strncmp(EPR_ENVISAT_PRODUCT_AATSR, product_id->id_string, 3) == 0) {
-        scan_offset_y = 0.5F;
+        scan_offset_y = 0.0F; /*!! EPR-7: was 0.5F !!*/
         scan_line_length = EPR_ATS_LINE_LENGTH;
         lines_per_tie_pt = EPR_AATSR_LINES_PER_TIE_PT;
         num_elems = field_info->num_elems;
@@ -890,7 +901,8 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
             epr_free_record(record);
             return epr_get_last_err_code();
         }
-    } else if (strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0) {
+    } else if ((strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0) ||
+               (strncmp(EPR_ENVISAT_PRODUCT_SAR, product_id->id_string, 3) == 0)) {
         EPR_SDatasetId* dataset_id = NULL;
         uint num_rec;
         scan_offset_x = 0.5F; /* @todo CHECK THIS FOR ASAR! */
@@ -947,11 +959,11 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
     /*select the correspondent function to scaling and transform data type*/
     transform_array_func = select_transform_array_function(band_datatype, datatype_id);
     if (transform_array_func == NULL) {
-        epr_set_err(e_err_illegal_data_type,
-                    "epr_read_band_annotation_data: internal error: illegal data type");
         epr_free_record(record);
         free(line_beg_buffer);
         free(line_end_buffer);
+        epr_set_err(e_err_illegal_data_type,
+                    "epr_read_band_annotation_data: internal error: illegal data type");
         return epr_get_last_err_code();
     }
     y_beg_old = 9999;
@@ -1015,6 +1027,12 @@ int epr_read_band_annotation_data(EPR_SBandId* band_id,
                     && strncmp(product_id->id_string, "ASA_IMG", 7) != 0
                     && strncmp(product_id->id_string, "ASA_APG", 7) != 0) {
                 mirror_float_array((float*)raster->buffer, raster->raster_width, raster->raster_height);
+            } else {
+                if (strncmp(EPR_ENVISAT_PRODUCT_SAR, product_id->id_string, 3) == 0
+                        && strncmp(product_id->id_string, "SAR_IMG", 7) != 0
+                        && strncmp(product_id->id_string, "SAR_APG", 7) != 0) {
+                    mirror_float_array((float*)raster->buffer, raster->raster_width, raster->raster_height);
+                }
             }
         }
     }
@@ -1155,6 +1173,8 @@ EPR_FArrayTransformer select_transform_array_function(EPR_EDataTypeId band_tid,
         transform_array_func = transform_array_int_to_float;
     else if (band_tid == e_tid_float && raw_tid == e_tid_uint)
         transform_array_func = transform_array_uint_to_float;
+    else if (band_tid == e_tid_float && raw_tid == e_tid_float)
+        transform_array_func = transform_array_float_to_float;
     else {
         return NULL;
     }
@@ -1681,6 +1701,18 @@ void transform_array_uint_to_float (void* sourceArray,
     }
 }
 
+void transform_array_float_to_float (void* sourceArray,
+                                     EPR_SBandId* band_id,
+                                     float* raster_buffer,
+                                     uint nel) {
+    uint ix;
+    float* sa = (float*) sourceArray;
+
+    for (ix = 0; ix < nel; ix ++) {
+        raster_buffer[ix] = band_id->scaling_offset + band_id->scaling_factor * sa[ix];
+    }
+}
+
 void mirror_float_array(float* raster_buffer, uint raster_width, uint raster_height) {
     uint w, h, pol_w, offset;
     float tmp;
diff --git a/src/epr_band.h b/src/epr_band.h
index 439a643..43d7f09 100644
--- a/src/epr_band.h
+++ b/src/epr_band.h
@@ -147,6 +147,7 @@ void transform_array_short_to_float (void* sourceArray, EPR_SBandId* band_id, fl
 void transform_array_ushort_to_float(void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel);
 void transform_array_int_to_float  (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel);
 void transform_array_uint_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel);
+void transform_array_float_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel);
 /*@}*/
 
 /**
diff --git a/src/epr_core.c b/src/epr_core.c
index 3c4c2e3..b31d98f 100644
--- a/src/epr_core.c
+++ b/src/epr_core.c
@@ -334,6 +334,7 @@ int epr_str_to_number(const char* str)
    if (strcmp(str, "*") == 0) return 1;
    if (strcmp(str, "") == 0) return 1;
 
+    errno = 0;
     l = strtol( str, &stopstring, 10 );
 
     if (errno == EDOM)
diff --git a/src/epr_core.h b/src/epr_core.h
index 7351359..c560d34 100644
--- a/src/epr_core.h
+++ b/src/epr_core.h
@@ -37,6 +37,7 @@ typedef struct EPR_Parameter EPR_SParameter;
 
 #define EPR_ENVISAT_PRODUCT_MERIS        "MER"
 #define EPR_ENVISAT_PRODUCT_ASAR         "ASA"
+#define EPR_ENVISAT_PRODUCT_SAR          "SAR"
 #define EPR_ENVISAT_PRODUCT_AATSR        "ATS"
 
 #define EPR_LONGI_BAND_NAME               "longitude"
diff --git a/src/epr_dataset.c b/src/epr_dataset.c
index cac23fc..0ae7bfd 100644
--- a/src/epr_dataset.c
+++ b/src/epr_dataset.c
@@ -109,6 +109,7 @@ EPR_SPtrArray* epr_create_dataset_ids(EPR_SProductId* product_id)
     const struct DatasetDescriptorTable* p_tables;
     int pt_index;
     int num_descr;
+    int asar_sw_version;
 
     if (product_id == NULL) {
         epr_set_err(e_err_null_pointer,
@@ -116,6 +117,8 @@ EPR_SPtrArray* epr_create_dataset_ids(EPR_SProductId* product_id)
         return NULL;
     }
 
+    asar_sw_version = epr_detect_asar_sw_version(product_id);
+
     /* @DDDB */
 
     p_tables = dddb_product_tables;
@@ -133,6 +136,14 @@ EPR_SPtrArray* epr_create_dataset_ids(EPR_SProductId* product_id)
                     strcmp(id, "MER_FR__2P_IODD6") == 0) {
                     pt_index = i;
                 }
+            } else if (asar_sw_version >= 602) {
+                if (strcmp(&(id[10]), "_602") == 0) {
+                    pt_index = i;
+                }
+            } else if (asar_sw_version < 602) {
+                if (strlen(id) == 10) {
+                    pt_index = i;
+                }
             } else {
                 pt_index = i;
             }
@@ -294,6 +305,12 @@ EPR_SRecord* epr_read_record(EPR_SDatasetId* dataset_id,
 
     if (record == NULL) {
         record = epr_create_record(dataset_id);
+        if (record == NULL) {
+            epr_set_err(e_err_invalid_record_name,
+                        "epr_read_record: unable to create a new record");
+
+            return NULL;
+        }
     } else if (record->info != dataset_id->record_info) {
         epr_set_err(e_err_invalid_record_name,
                     "epr_read_record: invalid record name");
diff --git a/src/epr_dddb.c b/src/epr_dddb.c
index bcbde0a..9ea9a4c 100644
--- a/src/epr_dddb.c
+++ b/src/epr_dddb.c
@@ -1191,6 +1191,241 @@ static const struct RecordDescriptor ASAR_Main_ADSR_asar_rec_data[] = {
     {"spare_14", e_tid_spare, NULL, 64, "1", "Spare"}
 };
 
+static const struct RecordDescriptor ASAR_Main_ADSR_asar_602_rec_data[] = {
+    {"first_zero_doppler_time", e_tid_time, "MJD", 12, "1", "First Zero Doppler Azimuth time of MDS which this data set describes Time of first range line in the MDS described by this data set."},
+    {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADSR)"},
+    {"last_zero_doppler_time", e_tid_time, "MJD", 12, "1", "Last Zero Doppler Azimuth time of MDS which this data set describes Time of last range line in the MDS described by this data set"},
+    {"work_order_id", e_tid_string, "ascii", 12, "1", "Work Order ID (left-justified)"},
+    {"time_diff", e_tid_float, "s", 4, "1", "Time difference between sensing time of first input line and zero Doppler time of first output image line (tdelta). (TBC)May be used during child product extraction from a stripline product (TBC). Left blank (set to zero) for non-stripline products."},
+    {"swath_id", e_tid_string, "ascii", 3, "1", "Swath number IS1, IS2, IS3, IS4, IS5, IS6, or IS7 for IM, WV and AP modes.Set to WSØ for WS and GM modes"},
+    {"range_spacing", e_tid_float, "m", 4, "1", "Range sample spacing"},
+    {"azimuth_spacing", e_tid_float, "m", 4, "1", "Azimuth sample spacing at image center"},
+    {"line_time_interval", e_tid_float, "s", 4, "1", "Azimuth sample spacing in time (Line Time Interval)"},
+    {"num_output_lines", e_tid_uint, "lines", 4, "1", "Number of output range lines in the image described by this ADS"},
+    {"num_samples_per_line", e_tid_uint, "samples", 4, "1", "Number of samples per output range line (includes zero filled samples)"},
+    {"data_type", e_tid_string, "ascii", 5, "1", "Output data type. SWORD, UWORD, or UBYTE"},
+/*  {"spare_1", e_tid_spare, NULL, 51, "1", "Spare"}, */
+    {"num_range_lines_per_burst", e_tid_uint, "lines", 4, "1", "Number of output range lines per burst"},
+    {"time_diff_zero_doppler", e_tid_float, NULL, 4, "1", "Time difference between zero Doppler time and acquisition time of output image lines"},
+    {"elapsed_time", e_tid_float, "s", 4, "1", "Elapsed time between the zero Doppler time of first output image line and the preceding ascending node"},
+    {"spare_1", e_tid_spare, NULL, 39, "1", "Spare"},
+/**/
+    {"data_analysis_flag", e_tid_uchar, "flag", 1, "1", "Raw Data Analysis used for Raw Data Correction. 0 = correction done using default parameters. 1 = correction done using raw data analysis results."},
+    {"ant_elev_corr_flag", e_tid_uchar, "flag", 1, "1", "Antenna Elevation Pattern Correction Applied. 0 = no correction applied. 1 = correction applied."},
+    {"chirp_extract_flag", e_tid_uchar, "flag", 1, "1", "Reconstructed Chirp used. 0 = nominal chirp replica used. 1 = reconstructed chirp used."},
+    {"srgr_flag", e_tid_uchar, "flag", 1, "1", "Slant Range to Ground Range Conversion Applied. 0 = no conversion applied. 1 = conversion applied"},
+    {"dop_cen_flag", e_tid_uchar, "flag", 1, "1", "Doppler Centroid Estimation Performed. 0 = no estimation done. 1 = estimation done."},
+    {"dop_amb_flag", e_tid_uchar, "flag", 1, "1", "Doppler Ambiguity Estimation Performed. 0 = no estimate done. 1 = estimate done"},
+    {"range_spread_comp_flag", e_tid_uchar, "flag", 1, "1", "Range-spreading loss compensation Applied. 0 = no compensation applied. 1 = compensation applied."},
+    {"detected_flag", e_tid_uchar, "flag", 1, "1", "Detection Applied. 0 = output product is complex. 1 = output product was detected."},
+    {"look_sum_flag", e_tid_uchar, "flag", 1, "1", "Look Summation Performed. 0 = product is single look. 1 = product is multi-looked."},
+    {"rms_equal_flag", e_tid_uchar, "flag", 1, "1", "RMS Equalization performed. 0= rms equalization not performed during FBAQ decoding. 1 = rms equalization performed during FBAQ decoding."},
+    {"ant_scal_flag", e_tid_uchar, "flag", 1, "1", "Antenna Elevation Gain Scaling Factor Applied. 0= no scaling factor applied. 1 =  scaling factor applied."},
+    {"vga_com_echo_flag", e_tid_uchar, "flag", 1, "1", "Receive Gain Droop Compensation Applied to Echo Data. 0 = no compensation applied. 1 = compensation applied."},
+    {"vga_com_pulse_2_flag", e_tid_uchar, "flag", 1, "1", "Receive Gain Droop Compensation Applied Calibration Pulse P2. 0 = no compensation applied. 1 = compensation applied."},
+    {"vga_com_pulse_zero_flag", e_tid_uchar, "flag", 1, "1", "Receive Gain Droop Compensation Applied Calibration Pulse P2 Order Zero: Nominal Time Delay Applied. 0 = no compensation applied. 1 = compensation applied."},
+    {"inv_filt_comp_flag", e_tid_uchar, "flag", 1, "1", "Inverse FIlter used for range compression (GM Mode only). 0 = matched filter used for range compression. 1 = inverse filter used for range compression"},
+/*  {"spare_2", e_tid_spare, NULL, 6, "1", "Spare"}, */
+    {"noise_subtraction_flag", e_tid_uchar, "flag", 1, "1", "Noise Subtraction Applied (APP, APG, APM, WSM products only), 0 = noise not subtracted, 1 = noise subtracted"},
+    {"spare_2", e_tid_spare, NULL, 5, "1", "Spare"},
+/**/
+    {"raw_data_analysis.1.num_gaps", e_tid_uint, "gaps", 4, "1", "Number of input data gaps (a gap is defined as a predetermined number of range lines) (record 1)"},
+    {"raw_data_analysis.1.num_missing_lines", e_tid_uint, "lines", 4, "1", "Number of missing lines, excluding data gaps (record 1)"},
+    {"raw_data_analysis.1.range_samp_skip", e_tid_uint, "samples", 4, "1", "Range sample skipping factor for raw data analysis (record 1)"},
+    {"raw_data_analysis.1.range_lines_skip", e_tid_uint, "lines", 4, "1", "Range lines skipping factor for raw data analysis (record 1)"},
+    {"raw_data_analysis.1.calc_i_bias", e_tid_float, NULL, 4, "1", "Calculated I channel bias (record 1)"},
+    {"raw_data_analysis.1.calc_q_bias", e_tid_float, NULL, 4, "1", "Calculated Q channel bias (record 1)"},
+    {"raw_data_analysis.1.calc_i_std_dev", e_tid_float, NULL, 4, "1", "Calculated I channel standard deviation (record 1)"},
+    {"raw_data_analysis.1.calc_q_std_dev", e_tid_float, NULL, 4, "1", "Calculated Q channel standard deviation (record 1)"},
+    {"raw_data_analysis.1.calc_gain", e_tid_float, NULL, 4, "1", "Calculated I/Q gain imbalance (record 1)"},
+    {"raw_data_analysis.1.calc_quad", e_tid_float, NULL, 4, "1", "Calculated I/Q quadrature departure (record 1)"},
+    {"raw_data_analysis.1.i_bias_max", e_tid_float, NULL, 4, "1", "I bias upper bound (record 1)"},
+    {"raw_data_analysis.1.i_bias_min", e_tid_float, NULL, 4, "1", "I bias lower bound (record 1)"},
+    {"raw_data_analysis.1.q_bias_max", e_tid_float, NULL, 4, "1", "Q bias upper bound (record 1)"},
+    {"raw_data_analysis.1.q_bias_min", e_tid_float, NULL, 4, "1", "Q bias lower bound (record 1)"},
+    {"raw_data_analysis.1.gain_min", e_tid_float, NULL, 4, "1", "I/Q gain lower bound (record 1)"},
+    {"raw_data_analysis.1.gain_max", e_tid_float, NULL, 4, "1", "I/Q gain upper bound (record 1)"},
+    {"raw_data_analysis.1.quad_min", e_tid_float, NULL, 4, "1", "I/Q quadrature departure lower bound (record 1)"},
+    {"raw_data_analysis.1.quad_max", e_tid_float, NULL, 4, "1", "I/Q quadrature departure upper bound (record 1)"},
+    {"raw_data_analysis.1.i_bias_flag", e_tid_uchar, "flag", 1, "1", "I bias significance. 0 = I bias falls within acceptable range. 1 = I bias falls outside acceptable range (record 1)"},
+    {"raw_data_analysis.1.q_bias_flag", e_tid_uchar, "flag", 1, "1", "Q bias Significance. 0 = Q bias falls within acceptable range. 1 = Q bias falls outside acceptable range (record 1)"},
+    {"raw_data_analysis.1.gain_flag", e_tid_uchar, "flag", 1, "1", "I/Q Gain Significance. 0 = Gain falls within acceptable range. 1 = Gain falls outside acceptable range (record 1)"},
+    {"raw_data_analysis.1.quad_flag", e_tid_uchar, "flag", 1, "1", "I/Q Quadrature Departure Significance. 0 = Quadrature departure falls within acceptable range. 1 =Quadrature departure falls outside acceptable range (record 1)"},
+    {"raw_data_analysis.1.used_i_bias", e_tid_float, NULL, 4, "1", "I channel bias used for correction (may be different from measured value) (record 1)"},
+    {"raw_data_analysis.1.used_q_bias", e_tid_float, NULL, 4, "1", "Q channel bias used for correction (may be different from measured value) (record 1)"},
+    {"raw_data_analysis.1.used_gain", e_tid_float, NULL, 4, "1", "I/Q gain imbalance used for correction (may be different from measured value) (record 1)"},
+    {"raw_data_analysis.1.used_quad", e_tid_float, NULL, 4, "1", "I/Q quadrature departure used for correction (may be different from measured value) (record 1)"},
+    {"raw_data_analysis.2.num_gaps", e_tid_uint, "gaps", 4, "1", "Number of input data gaps (a gap is defined as a predetermined number of range lines) (record 2)"},
+    {"raw_data_analysis.2.num_missing_lines", e_tid_uint, "lines", 4, "1", "Number of missing lines, excluding data gaps (record 2)"},
+    {"raw_data_analysis.2.range_samp_skip", e_tid_uint, "samples", 4, "1", "Range sample skipping factor for raw data analysis (record 2)"},
+    {"raw_data_analysis.2.range_lines_skip", e_tid_uint, "lines", 4, "1", "Range lines skipping factor for raw data analysis (record 2)"},
+    {"raw_data_analysis.2.calc_i_bias", e_tid_float, NULL, 4, "1", "Calculated I channel bias (record 2)"},
+    {"raw_data_analysis.2.calc_q_bias", e_tid_float, NULL, 4, "1", "Calculated Q channel bias (record 2)"},
+    {"raw_data_analysis.2.calc_i_std_dev", e_tid_float, NULL, 4, "1", "Calculated I channel standard deviation (record 2)"},
+    {"raw_data_analysis.2.calc_q_std_dev", e_tid_float, NULL, 4, "1", "Calculated Q channel standard deviation (record 2)"},
+    {"raw_data_analysis.2.calc_gain", e_tid_float, NULL, 4, "1", "Calculated I/Q gain imbalance (record 2)"},
+    {"raw_data_analysis.2.calc_quad", e_tid_float, NULL, 4, "1", "Calculated I/Q quadrature departure (record 2)"},
+    {"raw_data_analysis.2.i_bias_max", e_tid_float, NULL, 4, "1", "I bias upper bound (record 2)"},
+    {"raw_data_analysis.2.i_bias_min", e_tid_float, NULL, 4, "1", "I bias lower bound (record 2)"},
+    {"raw_data_analysis.2.q_bias_max", e_tid_float, NULL, 4, "1", "Q bias upper bound (record 2)"},
+    {"raw_data_analysis.2.q_bias_min", e_tid_float, NULL, 4, "1", "Q bias lower bound (record 2)"},
+    {"raw_data_analysis.2.gain_min", e_tid_float, NULL, 4, "1", "I/Q gain lower bound (record 2)"},
+    {"raw_data_analysis.2.gain_max", e_tid_float, NULL, 4, "1", "I/Q gain upper bound (record 2)"},
+    {"raw_data_analysis.2.quad_min", e_tid_float, NULL, 4, "1", "I/Q quadrature departure lower bound (record 2)"},
+    {"raw_data_analysis.2.quad_max", e_tid_float, NULL, 4, "1", "I/Q quadrature departure upper bound (record 2)"},
+    {"raw_data_analysis.2.i_bias_flag", e_tid_uchar, "flag", 1, "1", "I bias significance. 0 = I bias falls within acceptable range. 1 = I bias falls outside acceptable range (record 2)"},
+    {"raw_data_analysis.2.q_bias_flag", e_tid_uchar, "flag", 1, "1", "Q bias Significance. 0 = Q bias falls within acceptable range. 1 = Q bias falls outside acceptable range (record 2)"},
+    {"raw_data_analysis.2.gain_flag", e_tid_uchar, "flag", 1, "1", "I/Q Gain Significance. 0 = Gain falls within acceptable range. 1 = Gain falls outside acceptable range (record 2)"},
+    {"raw_data_analysis.2.quad_flag", e_tid_uchar, "flag", 1, "1", "I/Q Quadrature Departure Significance. 0 = Quadrature departure falls within acceptable range. 1 =Quadrature departure falls outside acceptable range (record 2)"},
+    {"raw_data_analysis.2.used_i_bias", e_tid_float, NULL, 4, "1", "I channel bias used for correction (may be different from measured value) (record 2)"},
+    {"raw_data_analysis.2.used_q_bias", e_tid_float, NULL, 4, "1", "Q channel bias used for correction (may be different from measured value) (record 2)"},
+    {"raw_data_analysis.2.used_gain", e_tid_float, NULL, 4, "1", "I/Q gain imbalance used for correction (may be different from measured value) (record 2)"},
+    {"raw_data_analysis.2.used_quad", e_tid_float, NULL, 4, "1", "I/Q quadrature departure used for correction (may be different from measured value) (record 2)"},
+    {"spare_3", e_tid_spare, NULL, 32, "1", "Spare"},
+    {"start_time.1.first_obt", e_tid_uint, NULL, 4, "2", "On-board binary time of first input line processed. LSB accurate to 15.26 us. (Contained in two long integers) (record 1)"},
+    {"start_time.1.first_mjd", e_tid_time, "MJD", 12, "1", "Sensing time (MJD format) of first input line processed converted from satellite binary time (record 1)"},
+    {"start_time.2.first_obt", e_tid_uint, NULL, 4, "2", "On-board binary time of first input line processed. LSB accurate to 15.26 us. (Contained in two long integers) (record 2)"},
+    {"start_time.2.first_mjd", e_tid_time, "MJD", 12, "1", "Sensing time (MJD format) of first input line processed converted from satellite binary time (record 2)"},
+    {"parameter_codes.first_swst_code", e_tid_ushort, "code", 2, "5", "Sampling Window Start time code of first processed line"},
+    {"parameter_codes.last_swst_code", e_tid_ushort, "code", 2, "5", "Sampling Window Start time code of last processed line"},
+    {"parameter_codes.pri_code", e_tid_ushort, "code", 2, "5", "Pulse Repetition Interval code"},
+    {"parameter_codes.tx_pulse_len_code", e_tid_ushort, "code", 2, "5", "Tx pulse length"},
+    {"parameter_codes.tx_bw_code", e_tid_ushort, "code", 2, "5", "Tx pulse bandwidth"},
+    {"parameter_codes.echo_win_len_code", e_tid_ushort, "code", 2, "5", "Echo Window Length"},
+    {"parameter_codes.up_code", e_tid_ushort, "code", 2, "5", "Upconverter Level - Upconverter gain set on the instrument"},
+    {"parameter_codes.down_code", e_tid_ushort, "code", 2, "5", "Downconverter Level - Downconverter gain set on the instrument"},
+    {"parameter_codes.resamp_code", e_tid_ushort, "code", 2, "5", "Resampling factor for echo data"},
+    {"parameter_codes.beam_adj_code", e_tid_ushort, "code", 2, "5", "Beam adjustment delta"},
+    {"parameter_codes.beam_set_num_code", e_tid_ushort, "code", 2, "5", "Antenna Beam Set Number"},
+    {"parameter_codes.tx_monitor_code", e_tid_ushort, "code", 2, "5", "Auxiliary Tx Monitor Level"},
+    {"spare_4", e_tid_spare, NULL, 60, "1", "Spare"},
+    {"error_counters.num_err_swst", e_tid_uint, NULL, 4, "1", "Number of errors detected in Sampling Window start time field."},
+    {"error_counters.num_err_pri", e_tid_uint, NULL, 4, "1", "Number of errors detected in PRI code field"},
+    {"error_counters.num_err_tx_pulse_len", e_tid_uint, NULL, 4, "1", "Number of errors detected in Tx pulse length field"},
+    {"error_counters.num_err_tx_pulse_bw", e_tid_uint, NULL, 4, "1", "Number of errors detected in Tx pulse bandwidth field."},
+    {"error_counters.num_err_echo_win_len", e_tid_uint, NULL, 4, "1", "Number of errors detected in Echo Window Length field."},
+    {"error_counters.num_err_up", e_tid_uint, NULL, 4, "1", "Number of errors detected in Upconverter Level field."},
+    {"error_counters.num_err_down", e_tid_uint, NULL, 4, "1", "Number of errors detected in Downconverter Level field."},
+    {"error_counters.num_err_resamp", e_tid_uint, NULL, 4, "1", "Number of errors detected in Resampling factor for echo data field."},
+    {"error_counters.num_err_beam_adj", e_tid_uint, NULL, 4, "1", "Number of errors detected in Beam adjustment delta field."},
+    {"error_counters.num_err_beam_set_num", e_tid_uint, NULL, 4, "1", "Number of errors detected in Antenna Beam Set Number field."},
+    {"spare_5", e_tid_spare, NULL, 26, "1", "Spare"},
+    {"image_parameters.first_swst_value", e_tid_float, "s", 4, "5", "Sampling Window Start time of first processed line"},
+    {"image_parameters.last_swst_value", e_tid_float, "s", 4, "5", "Sampling Window Start time of last processed line"},
+    {"image_parameters.swst_changes", e_tid_uint, NULL, 4, "5", "Number of Sample Window Start Time changes within a beam"},
+    {"image_parameters.prf_value", e_tid_float, "Hz", 4, "5", "Pulse Repetition Frequency"},
+    {"image_parameters.tx_pulse_len_value", e_tid_float, "s", 4, "5", "Tx pulse length"},
+    {"image_parameters.tx_pulse_bw_value", e_tid_float, "Hz", 4, "5", "Tx pulse bandwidth"},
+    {"image_parameters.echo_win_len_value", e_tid_float, "s", 4, "5", "Echo Window Length"},
+    {"image_parameters.up_value", e_tid_float, "dB", 4, "5", "Upconverter Level - Upconverter gain set on the instrument"},
+    {"image_parameters.down_value", e_tid_float, "dB", 4, "5", "Downconverter Level - Downconverter gain set on the instrument"},
+    {"image_parameters.resamp_value", e_tid_float, NULL, 4, "5", "Resampling factor"},
+    {"image_parameters.beam_adj_value", e_tid_float, "deg.", 4, "5", "Beam adjustment delta"},
+    {"image_parameters.beam_set_value", e_tid_ushort, NULL, 2, "5", "Antenna Beam Set Number"},
+    {"image_parameters.tx_monitor_value", e_tid_float, NULL, 4, "5", "Auxiliary Tx Monitor Level"},
+    {"spare_6", e_tid_spare, NULL, 82, "1", "Spare"},
+    {"first_proc_range_samp", e_tid_uint, "samples", 4, "1", "First processed input range sample, first sample is 1"},
+    {"range_ref", e_tid_float, "m", 4, "1", "Range spreading loss reference range"},
+    {"range_samp_rate", e_tid_float, "Hz", 4, "1", "Range sampling rate"},
+    {"radar_freq", e_tid_float, "Hz", 4, "1", "Radar Frequency"},
+    {"num_looks_range", e_tid_ushort, "looks", 2, "1", "Number of range looks"},
+    {"filter_window", e_tid_string, "ascii", 7, "1", "Matched filter window type:HAMMING or KAISERØ or NONEØØØ"},
+    {"window_coef_range", e_tid_float, NULL, 4, "1", "Window coefficient for range-matched filter"},
+    {"bandwidth.look_bw_range", e_tid_float, "Hz", 4, "5", "Range Look Bandwidth (null to null)"},
+    {"bandwidth.tot_bw_range", e_tid_float, "Hz", 4, "5", "Total processed range bandwidth (null to null)"},
+    {"nominal_chirp.1.nom_chirp_amp", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 nominal chirp amplitude coefficients (record 1)"},
+    {"nominal_chirp.1.nom_chirp_phs", e_tid_float, "cycles,Hz,Hz/s,Hz/s2", 4, "4", "4 nominal chirp phase coefficients (record 1)"},
+    {"nominal_chirp.2.nom_chirp_amp", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 nominal chirp amplitude coefficients (record 2)"},
+    {"nominal_chirp.2.nom_chirp_phs", e_tid_float, "cycles,Hz,Hz/s,Hz/s2", 4, "4", "4 nominal chirp phase coefficients (record 2)"},
+    {"nominal_chirp.3.nom_chirp_amp", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 nominal chirp amplitude coefficients (record 3)"},
+    {"nominal_chirp.3.nom_chirp_phs", e_tid_float, "cycles,Hz,Hz/s,Hz/s2", 4, "4", "4 nominal chirp phase coefficients (record 3)"},
+    {"nominal_chirp.4.nom_chirp_amp", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 nominal chirp amplitude coefficients (record 4)"},
+    {"nominal_chirp.4.nom_chirp_phs", e_tid_float, "cycles,Hz,Hz/s,Hz/s2", 4, "4", "4 nominal chirp phase coefficients (record 4)"},
+    {"nominal_chirp.5.nom_chirp_amp", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 nominal chirp amplitude coefficients (record 5)"},
+    {"nominal_chirp.5.nom_chirp_phs", e_tid_float, "cycles,Hz,Hz/s,Hz/s2", 4, "4", "4 nominal chirp phase coefficients (record 5)"},
+    {"spare_7", e_tid_spare, NULL, 60, "1", "Spare"},
+    {"num_lines_proc", e_tid_uint, "lines", 4, "1", "Number of input lines processed"},
+    {"num_look_az", e_tid_ushort, "looks", 2, "1", "Number of Azimuth Looks"},
+    {"look_bw_az", e_tid_float, "Hz", 4, "1", "Azimuth Look Bandwidth (null to null) -- this is the nominal value only for GM, WS, and AP."},
+    {"to_bw_az", e_tid_float, "Hz", 4, "1", "Processed Azimuth bandwidth (null to null) -- this field is used only for IM products and WV imagettes. Filled with zeros otherwise."},
+    {"filter_az", e_tid_string, "ascii", 7, "1", "Matched filter window type:HAMMING or KAISERØ or NONEØØØ"},
+    {"filter_coef_az", e_tid_float, NULL, 4, "1", "Window coefficient for azimuth-matched filter"},
+    {"az_fm_rate", e_tid_float, "Hz/sHz/s2Hz/s3", 4, "3", "3 co-efficients for Azimuth FM rate: Azimuth FM rate = C0 + C1(tSR-t0) + C2(tSR - t0)2tSR = 2 way slant range time"},
+    {"ax_fm_origin", e_tid_float, "ns", 4, "1", "2 way slant range time origin (t0) for Azimuth FM rate calculation"},
+    {"dop_amb_conf", e_tid_float, NULL, 4, "1", "Doppler Centroid Ambiguity Confidence Measure. Value between 0 and 1, 0 = poorest confidence, 1= highest confidence"},
+    {"spare_8", e_tid_spare, NULL, 68, "1", "Spare"},
+    {"calibration_factors.1.proc_scaling_fact", e_tid_float, NULL, 4, "1", "Processor scaling factor (factor units are linear when using Range/Doppler algorithm, dB when Specan is used) (record 1)"},
+    {"calibration_factors.1.ext_cal_fact", e_tid_float, NULL, 4, "1", "External Calibration Scaling Factor (mode/swath/polarization dependent) (record 1)"},
+    {"calibration_factors.2.proc_scaling_fact", e_tid_float, NULL, 4, "1", "Processor scaling factor (factor units are linear when using Range/Doppler algorithm, dB when Specan is used) (record 2)"},
+    {"calibration_factors.2.ext_cal_fact", e_tid_float, NULL, 4, "1", "External Calibration Scaling Factor (mode/swath/polarization dependent) (record 2)"},
+    {"noise_estimation.noise_power_corr", e_tid_float, NULL, 4, "5", "Noise power correction factors"},
+    {"noise_estimation.num_noise_lines", e_tid_uint, NULL, 4, "5", "Number of noise lines used to calculate factors"},
+    {"spare_9", e_tid_spare, NULL, 64, "1", "Spare"},
+    {"spare_10", e_tid_spare, NULL, 12, "1", "Spare"},
+    {"output_statistics.1.out_mean", e_tid_float, NULL, 4, "1", "Output data mean. Magnitude for detected products, real sample mean for SLC products (record 1)"},
+    {"output_statistics.1.out_imag_mean", e_tid_float, NULL, 4, "1", "Output imaginary data mean. Used for SLC products only (set to zero otherwise) (record 1)"},
+    {"output_statistics.1.out_std_dev", e_tid_float, NULL, 4, "1", "Output data standard deviation. Magnitude std. dev. for detected products, real sample std. dev. for SLC products (record 1)"},
+    {"output_statistics.1.out_imag_std_dev", e_tid_float, NULL, 4, "1", "Output imaginary data standard deviation. Used for SLC products only (set to zero otherwise) (record 1)"},
+    {"output_statistics.2.out_mean", e_tid_float, NULL, 4, "1", "Output data mean. Magnitude for detected products, real sample mean for SLC products (record 2)"},
+    {"output_statistics.2.out_imag_mean", e_tid_float, NULL, 4, "1", "Output imaginary data mean. Used for SLC products only (set to zero otherwise) (record 2)"},
+    {"output_statistics.2.out_std_dev", e_tid_float, NULL, 4, "1", "Output data standard deviation. Magnitude std. dev. for detected products, real sample std. dev. for SLC products (record 2)"},
+    {"output_statistics.2.out_imag_std_dev", e_tid_float, NULL, 4, "1", "Output imaginary data standard deviation. Used for SLC products only (set to zero otherwise) (record 2)"},
+    {"spare_11", e_tid_spare, NULL, 52, "1", "Spare"},
+    {"echo_comp", e_tid_string, "ascii", 4, "1", "Compression Method used for echo samples. FBAQ, S&MØ, NONE"},
+    {"echo_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for echo samples. 8/4, 8/3, 8/2, or 8/8"},
+    {"init_cal_comp", e_tid_string, "ascii", 4, "1", "Compression Method used for initial calibration samples. FBAQ, S&MØ, NONE"},
+    {"init_cal_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for initial calibration samples. 8/4, 8/3, 8/2, or 8/8"},
+    {"per_cal_comp", e_tid_string, "ascii", 4, "1", "Compression Method used for periodic calibration samples. FBAQ, S&MØ, NONE"},
+    {"per_cal_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for periodic calibration samples. 8/4, 8/3, 8/2, or 8/8"},
+    {"noise_comp", e_tid_string, "ascii", 4, "1", "Compression Method used for noise samples. FBAQ, S&MØ, NONE"},
+    {"noise_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for noise samples. 8/4, 8/3, 8/2, or 8/8"},
+    {"spare_12", e_tid_spare, NULL, 64, "1", "Spare"},
+    {"beam_merge_sl_range", e_tid_uint, NULL, 4, "4", "Number of slant range samples in beam merging, one value per mergae rregion (1-2, 2-3, 3-4, 4-5)"},
+    {"beam_merge_alg_param", e_tid_float, NULL, 4, "4", "Beam merge algorithm parameter used for beam merging, one value per merge region (1-2, 2-3, 3-4. 4-5)"},
+    {"lines_per_burst", e_tid_uint, "lines", 4, "5", "Number of lines per burst for this image. 5 values for beams SS1 to SS5 in WS and GM modes. Two values for AP mode, all others set to zero."},
+    {"spare_13", e_tid_spare, NULL, 28, "1", "Spare"},
+    {"orbit_state_vectors.1.state_vect_time_1", e_tid_time, "MJD", 12, "1", "Time of state vector (record 1)"},
+    {"orbit_state_vectors.1.x_pos_1", e_tid_int, "10 -2m", 4, "1", "X position in Earth fixed reference frame (record 1)"},
+    {"orbit_state_vectors.1.y_pos_1", e_tid_int, "10 -2m", 4, "1", "Y position in Earth fixed reference frame (record 1)"},
+    {"orbit_state_vectors.1.z_pos_1", e_tid_int, "10 -2m", 4, "1", "Z position in Earth fixed reference frame (record 1)"},
+    {"orbit_state_vectors.1.x_vel_1", e_tid_int, "10 -5m/s", 4, "1", "X velocity relative to Earth fixed reference frame (record 1)"},
+    {"orbit_state_vectors.1.y_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Y velocity relative to Earth fixed reference frame (record 1)"},
+    {"orbit_state_vectors.1.z_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Z velocity relative to Earth fixed reference frame (record 1)"},
+    {"orbit_state_vectors.2.state_vect_time_1", e_tid_time, "MJD", 12, "1", "Time of state vector (record 2)"},
+    {"orbit_state_vectors.2.x_pos_1", e_tid_int, "10 -2m", 4, "1", "X position in Earth fixed reference frame (record 2)"},
+    {"orbit_state_vectors.2.y_pos_1", e_tid_int, "10 -2m", 4, "1", "Y position in Earth fixed reference frame (record 2)"},
+    {"orbit_state_vectors.2.z_pos_1", e_tid_int, "10 -2m", 4, "1", "Z position in Earth fixed reference frame (record 2)"},
+    {"orbit_state_vectors.2.x_vel_1", e_tid_int, "10 -5m/s", 4, "1", "X velocity relative to Earth fixed reference frame (record 2)"},
+    {"orbit_state_vectors.2.y_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Y velocity relative to Earth fixed reference frame (record 2)"},
+    {"orbit_state_vectors.2.z_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Z velocity relative to Earth fixed reference frame (record 2)"},
+    {"orbit_state_vectors.3.state_vect_time_1", e_tid_time, "MJD", 12, "1", "Time of state vector (record 3)"},
+    {"orbit_state_vectors.3.x_pos_1", e_tid_int, "10 -2m", 4, "1", "X position in Earth fixed reference frame (record 3)"},
+    {"orbit_state_vectors.3.y_pos_1", e_tid_int, "10 -2m", 4, "1", "Y position in Earth fixed reference frame (record 3)"},
+    {"orbit_state_vectors.3.z_pos_1", e_tid_int, "10 -2m", 4, "1", "Z position in Earth fixed reference frame (record 3)"},
+    {"orbit_state_vectors.3.x_vel_1", e_tid_int, "10 -5m/s", 4, "1", "X velocity relative to Earth fixed reference frame (record 3)"},
+    {"orbit_state_vectors.3.y_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Y velocity relative to Earth fixed reference frame (record 3)"},
+    {"orbit_state_vectors.3.z_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Z velocity relative to Earth fixed reference frame (record 3)"},
+    {"orbit_state_vectors.4.state_vect_time_1", e_tid_time, "MJD", 12, "1", "Time of state vector (record 4)"},
+    {"orbit_state_vectors.4.x_pos_1", e_tid_int, "10 -2m", 4, "1", "X position in Earth fixed reference frame (record 4)"},
+    {"orbit_state_vectors.4.y_pos_1", e_tid_int, "10 -2m", 4, "1", "Y position in Earth fixed reference frame (record 4)"},
+    {"orbit_state_vectors.4.z_pos_1", e_tid_int, "10 -2m", 4, "1", "Z position in Earth fixed reference frame (record 4)"},
+    {"orbit_state_vectors.4.x_vel_1", e_tid_int, "10 -5m/s", 4, "1", "X velocity relative to Earth fixed reference frame (record 4)"},
+    {"orbit_state_vectors.4.y_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Y velocity relative to Earth fixed reference frame (record 4)"},
+    {"orbit_state_vectors.4.z_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Z velocity relative to Earth fixed reference frame (record 4)"},
+    {"orbit_state_vectors.5.state_vect_time_1", e_tid_time, "MJD", 12, "1", "Time of state vector (record 5)"},
+    {"orbit_state_vectors.5.x_pos_1", e_tid_int, "10 -2m", 4, "1", "X position in Earth fixed reference frame (record 5)"},
+    {"orbit_state_vectors.5.y_pos_1", e_tid_int, "10 -2m", 4, "1", "Y position in Earth fixed reference frame (record 5)"},
+    {"orbit_state_vectors.5.z_pos_1", e_tid_int, "10 -2m", 4, "1", "Z position in Earth fixed reference frame (record 5)"},
+    {"orbit_state_vectors.5.x_vel_1", e_tid_int, "10 -5m/s", 4, "1", "X velocity relative to Earth fixed reference frame (record 5)"},
+    {"orbit_state_vectors.5.y_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Y velocity relative to Earth fixed reference frame (record 5)"},
+    {"orbit_state_vectors.5.z_vel_1", e_tid_int, "10 -5m/s", 4, "1", "Z velocity relative to Earth fixed reference frame (record 5)"},
+    {"spare_14", e_tid_spare, NULL, 64, "1", "Spare"},
+/**/
+    {"cal_vec_ref_look_angle", e_tid_float, "degrees", 4, "5", "Calibration Vector Reference Look Angle (per swath)"},
+    {"sigma_cal_vec", e_tid_float, NULL, 4, "1005", "Sigma Calibration Vector"},
+    {"gamma_cal_vec", e_tid_float, NULL, 4, "1005", "Gamma Calibration Vector"},
+};
+
 static const struct RecordDescriptor ASAR_Map_GADS_asar_rec_data[] = {
     {"map_descriptor", e_tid_string, "ascii", 32, "1", "Map projection descriptorone of:UNIVERSAL_TRANSVERSE_MERCATORØØØUNIVERSAL_POLAR_STEREOGRAPHICØØØLAMBERT_CONFORMAL_CONICØØØØØØØØØTRANSVERSE_MERCATORØØØØØØØØØØØØØMERCATORØØØØØØØØØØØØØØØØØØØØØØØØPOLAR_STEREOGRAPHICØØØØØØØØØØØØØ"},
     {"samples", e_tid_uint, NULL, 4, "1", "Number of samples per line"},
@@ -1888,6 +2123,50 @@ static const struct RecordDescriptor ASA_CON_AX_GADS_asar_rec_data[] = {
     {"spare_3", e_tid_spare, NULL, 504, "1", "Spare"}
 };
 
+static const struct RecordDescriptor ASA_CON_AX_GADS_asar_602_rec_data[] = {
+    {"dsr_time", e_tid_time, "MJD", 12, "1", "Time of creation"},
+    {"dsr_length", e_tid_uint, "bytes", 4, "1", "Length of this DSR in bytes"},
+    {"thresh_chirp_broadening", e_tid_float, "%", 4, "1", "Threshold for setting the chirp quality flag. Maximum percentage broadening permitted in cross-correlation pulse width compared to theoretical width."},
+    {"thresh_chirp_sidelobe", e_tid_float, "dB", 4, "1", "Threshold for setting the chirp quality flag - First sidelobe of the chirp cross correlation function"},
+    {"thresh_chirp_islr", e_tid_float, "dB", 4, "1", "Threshold for setting the chirp quality flag - ISLR of the chirp cross correlation function"},
+    {"thresh_input_mean", e_tid_float, NULL, 4, "1", "Threshold for setting the mean of input data quality flag - For an expected mean value of x, this is the value T, such that the measured mean must fall between the x-T and x+T. Used for both I and Q channels."},
+    {"thresh_input_std_dev", e_tid_float, NULL, 4, "1", "Threshold for setting the standard deviation of input data quality flag - For an expected std. dev. value of y, this is the value D, such that the measured std. dev. must fall between the y-D and y+D. Used for both I and Q channels."},
+    {"thresh_dop_cen", e_tid_float, NULL, 4, "1", "Threshold for setting the Doppler Centroid quality flag - Threshold for Doppler Centroid confidence"},
+    {"thresh_dop_amb", e_tid_float, NULL, 4, "1", "Threshold for setting the Doppler Centroid ambiguity quality flag - Threshold for setting the Doppler Centroid ambiguity confidence flag"},
+    {"thresh_output_mean", e_tid_float, NULL, 4, "1", "Threshold for setting the mean of output data quality flag - For an expected mean value of x, this is the value T, such that the measured mean must fall between the x-T and x+T."},
+    {"thresh_output_std_dev", e_tid_float, NULL, 4, "1", "Threshold for setting the standard deviation of output data quality flag - For an expected std. dev. value of y, this is the value D, such that the measured std. dev. must fall between the y-D and y+D."},
+    {"thresh_missing_lines", e_tid_float, NULL, 4, "1", "Threshold for setting the missing lines quality flag - maximum percentage of missing lines to total lines."},
+    {"thresh_gaps", e_tid_float, NULL, 4, "1", "Threshold for setting the missing gaps quality flag - maximum number of gaps allowed."},
+    {"spare_1", e_tid_spare, NULL, 64, "1", "Spare"},
+    {"lines_per_gap", e_tid_uint, "lines", 4, "1", "Number of missing lines which constitute a gap"},
+    {"exp_im_mean", e_tid_float, NULL, 4, "1", "Expected mean of I and Q samples for IM (and WV) SLC images"},
+    {"exp_im_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of I and Q samples for IM (and WV) SLC images"},
+    {"exp_ap_mean", e_tid_float, NULL, 4, "1", "Expected mean of I and Q samples for AP SLC images"},
+    {"exp_ap_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of I and Q samples for AP SLC images"},
+    {"exp_imp_mean", e_tid_float, NULL, 4, "1", "Expected mean of IM PRI samples"},
+    {"exp_imp_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of IM PRI samples"},
+    {"exp_app_mean", e_tid_float, NULL, 4, "1", "Expected mean of AP PRI samples"},
+    {"exp_app_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of AP PRI samples"},
+    {"exp_imm_mean", e_tid_float, NULL, 4, "1", "Expected mean of IMM samples"},
+    {"exp_imm_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of IMM samples"},
+    {"exp_apm_mean", e_tid_float, NULL, 4, "1", "Expected mean of APM samples"},
+    {"exp_apm_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of APM samples"},
+    {"exp_wsm_mean", e_tid_float, NULL, 4, "1", "Expected mean of WSM samples"},
+    {"exp_wsm_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of WSM samples"},
+    {"exp_gm1_mean", e_tid_float, NULL, 4, "1", "Expected mean of GM1 samples"},
+    {"exp_gm1_std_dev", e_tid_float, NULL, 4, "1", "Expected standard deviation of GM1 samples"},
+    {"input_mean", e_tid_float, NULL, 4, "1", "Expected  input mean"},
+    {"expected_input_std_dev", e_tid_float, NULL, 4, "1", "Expected input standard deviation"},
+    {"look_conf_thresh", e_tid_float, NULL, 4, "2", "Look image statistics confidence parameter thresholds (minimum and maximum)"},
+    {"inter_look_conf_thresh", e_tid_float, NULL, 4, "1", "Inter-look confidence statistics confidence parameter threshold"},
+    {"az_cutoff_thresh", e_tid_float, NULL, 4, "1", "Azimuth cut-off convergence measure threshold"},
+    {"az_cutoff_iterations_thresh", e_tid_float, NULL, 4, "1", "Azimuth cut-off Iteration count overflow threshold"},
+    {"phs_peak_thresh", e_tid_float, NULL, 4, "1", "Phase information confidence measure threshold for the spectral peak"},
+    {"phs_cross_thresh", e_tid_float, "m", 4, "1", "Phase information confidence measure threshold for the cross covariance peak offset"},
+    {"spare_2", e_tid_spare, NULL, 64, "1", "Spare"},
+    {"spare_3", e_tid_spare, NULL, 612, "1", "Spare"}
+};
+
 static const struct RecordDescriptor ASA_INS_AX_GADS_asar_rec_data[] = {
     {"dsr_time", e_tid_time, "MJD", 12, "1", "Time of creation"},
     {"dsr_length", e_tid_uint, "bytes", 4, "1", "Length of this DSR in bytes"},
@@ -2668,6 +2947,20 @@ static const struct DatasetDescriptor ASA_APG_1P_dataset_data[] = {
     {"MDS2", "MDS2", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 2"}
 };
 
+static const struct DatasetDescriptor ASA_APG_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MAP_PROJECTION_GADS", "MAP PROJECTION GADS", ASAR_Map_GADS_asar_rec_data, "Map Projection parameters"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"},
+    {"MDS2", "MDS2", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 2"}
+};
+
 static const struct DatasetDescriptor ASA_APM_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
@@ -2681,6 +2974,19 @@ static const struct DatasetDescriptor ASA_APM_1P_dataset_data[] = {
     {"MDS2", "MDS2", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 2 (if requested)"}
 };
 
+static const struct DatasetDescriptor ASA_APM_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"},
+    {"MDS2", "MDS2", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 2 (if requested)"}
+};
+
 static const struct DatasetDescriptor ASA_APP_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
@@ -2694,6 +3000,19 @@ static const struct DatasetDescriptor ASA_APP_1P_dataset_data[] = {
     {"MDS2", "MDS2", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 2"}
 };
 
+static const struct DatasetDescriptor ASA_APP_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"},
+    {"MDS2", "MDS2", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 2"}
+};
+
 static const struct DatasetDescriptor ASA_APS_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
@@ -2705,6 +3024,17 @@ static const struct DatasetDescriptor ASA_APS_1P_dataset_data[] = {
     {"MDS2", "MDS2", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set 2"}
 };
 
+static const struct DatasetDescriptor ASA_APS_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set 1"},
+    {"MDS2", "MDS2", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set 2"}
+};
+
 static const struct DatasetDescriptor ASA_AP__BP_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
@@ -2724,6 +3054,17 @@ static const struct DatasetDescriptor ASA_GM1_1P_dataset_data[] = {
     {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
 };
 
+static const struct DatasetDescriptor ASA_GM1_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
+};
+
 static const struct DatasetDescriptor ASA_IMG_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_rec_data, "Main Processing parameters"},
@@ -2736,6 +3077,18 @@ static const struct DatasetDescriptor ASA_IMG_1P_dataset_data[] = {
     {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
 };
 
+static const struct DatasetDescriptor ASA_IMG_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MAP_PROJECTION_GADS", "MAP PROJECTION GADS", ASAR_Map_GADS_asar_rec_data, "Map Projection parameters"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
+};
+
 static const struct DatasetDescriptor ASA_IMM_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_rec_data, "Main Processing parameters"},
@@ -2747,6 +3100,17 @@ static const struct DatasetDescriptor ASA_IMM_1P_dataset_data[] = {
     {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
 };
 
+static const struct DatasetDescriptor ASA_IMM_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
+};
+
 static const struct DatasetDescriptor ASA_IMP_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_rec_data, "Main Processing parameters"},
@@ -2758,6 +3122,17 @@ static const struct DatasetDescriptor ASA_IMP_1P_dataset_data[] = {
     {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
 };
 
+static const struct DatasetDescriptor ASA_IMP_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
+};
+
 static const struct DatasetDescriptor ASA_IMS_1P_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_rec_data, "Main Processing parameters"},
@@ -2767,6 +3142,15 @@ static const struct DatasetDescriptor ASA_IMS_1P_dataset_data[] = {
     {"MDS1", "MDS1", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set 1"}
 };
 
+static const struct DatasetDescriptor ASA_IMS_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set 1"}
+};
+
 static const struct DatasetDescriptor ASA_IM__BP_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
@@ -2784,6 +3168,17 @@ static const struct DatasetDescriptor ASA_WSM_1P_dataset_data[] = {
     {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
 };
 
+static const struct DatasetDescriptor ASA_WSM_1P_602_dataset_data[] = {
+    {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
+    {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_602_rec_data, "Main Processing parameters"},
+    {"DOP_CENTROID_COEFFS_ADS", "DOP CENTROID COEFFS ADS", ASAR_Dop_Cen_ADSR_asar_rec_data, "Doppler Centroid Parameters"},
+    {"SR_GR_ADS", "SR GR ADS", ASAR_SRGR_ADSR_asar_rec_data, "Slant Range to Ground Range conversion parameters"},
+    {"CHIRP_PARAMS_ADS", "CHIRP PARAMS ADS", ASAR_Chirp_ADSR_asar_rec_data, "chirp parameters"},
+    {"ANTENNA_ELEV_PATTERN_ADS", "ANTENNA ELEV PATTERN ADS", ASAR_Antenna_ADSR_asar_rec_data, "Antenna Elevation patterns(s)"},
+    {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"},
+    {"MDS1", "MDS1", ASAR_Image_MDSR_Gen_asar_rec_data, "Measurement Data Set 1"}
+};
+
 static const struct DatasetDescriptor ASA_WS__BP_dataset_data[] = {
     {"MDS1_SQ_ADS", "MDS1 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
     {"MDS2_SQ_ADS", "MDS2 SQ ADS", ASAR_SQ1_Image_ADSR_asar_rec_data, "SQ ADSRs"},
@@ -3280,7 +3675,7 @@ static const struct DatasetDescriptor ATS_TOA_1P_dataset_data[] = {
 static const struct DatasetDescriptor MER_FR__1P_dataset_data[] = {
     {"Quality_ADS", "Quality ADS", MER_RR__1P_ADSR_sq_meris_rec_data, "Level 1b Summary Quality ADS(SQ ADS)"},
     {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__1P_GADS_sfgi_meris_rec_data, "Level 1b GADS Scaling Factor and General  Info"},
-    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxilliary Data (LADS)"},
+    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxiliary Data (LADS)"},
     {"Radiance_1", "Radiance MDS(1)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (1) TOA Radiance"},
     {"Radiance_2", "Radiance MDS(2)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (2) TOA Radiance"},
     {"Radiance_3", "Radiance MDS(3)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (3) TOA Radiance"},
@@ -3302,7 +3697,7 @@ static const struct DatasetDescriptor MER_FR__1P_dataset_data[] = {
 static const struct DatasetDescriptor MER_FR__1P_IODD5_dataset_data[] = {
     {"Quality_ADS", "Quality ADS", MER_RR__1P_ADSR_sq_meris_rec_data, "Level 1b Summary Quality ADS(SQ ADS)"},
     {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__1P_GADS_sfgi_meris_rec_data, "Level 1b GADS Scaling Factor and General  Info"},
-    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxilliary Data (LADS)"},
+    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxiliary Data (LADS)"},
     {"Radiance_1", "Radiance MDS(1)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (1) TOA Radiance"},
     {"Radiance_2", "Radiance MDS(2)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (2) TOA Radiance"},
     {"Radiance_3", "Radiance MDS(3)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (3) TOA Radiance"},
@@ -3405,7 +3800,7 @@ static const struct DatasetDescriptor MER_RRV_2P_dataset_data[] = {
 static const struct DatasetDescriptor MER_RR__1P_dataset_data[] = {
     {"Quality_ADS", "Quality ADS", MER_RR__1P_ADSR_sq_meris_rec_data, "Level 1b Summary Quality ADS(SQ ADS)"},
     {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__1P_GADS_sfgi_meris_rec_data, "Level 1b GADS Scaling Factor and General  Info"},
-    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxilliary Data (LADS)"},
+    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxiliary Data (LADS)"},
     {"Radiance_1", "Radiance MDS(1)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (1) TOA Radiance"},
     {"Radiance_2", "Radiance MDS(2)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (2) TOA Radiance"},
     {"Radiance_3", "Radiance MDS(3)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (3) TOA Radiance"},
@@ -3427,7 +3822,7 @@ static const struct DatasetDescriptor MER_RR__1P_dataset_data[] = {
 static const struct DatasetDescriptor MER_RR__1P_IODD5_dataset_data[] = {
     {"Quality_ADS", "Quality ADS", MER_RR__1P_ADSR_sq_meris_rec_data, "Level 1b Summary Quality ADS(SQ ADS)"},
     {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__1P_GADS_sfgi_meris_rec_data, "Level 1b GADS Scaling Factor and General  Info"},
-    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxilliary Data (LADS)"},
+    {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 1b ADS Tie Point Location and Auxiliary Data (LADS)"},
     {"Radiance_1", "Radiance MDS(1)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (1) TOA Radiance"},
     {"Radiance_2", "Radiance MDS(2)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (2) TOA Radiance"},
     {"Radiance_3", "Radiance MDS(3)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (3) TOA Radiance"},
@@ -4187,19 +4582,29 @@ static const struct FlagDescriptor MER_RR__2P_flags_IODD6_data[] = {
     {"LOW_PRESSURE", 1, {0, 0}, "Computed pressure lower than ECMWF one"}
 };
 
-const struct DatasetDescriptorTable dddb_product_tables[33] = {
+const struct DatasetDescriptorTable dddb_product_tables[64] = {
     {"ASA_APG_1P", "ASAR Alternating Polarization Ellipsoid Geocoded Image", 11, ASA_APG_1P_dataset_data},
+    {"ASA_APG_1P_602", "ASAR Alternating Polarization Ellipsoid Geocoded Image", 11, ASA_APG_1P_602_dataset_data},
     {"ASA_APM_1P", "ASAR Alternating Polarization Medium Resolution Image product", 10, ASA_APM_1P_dataset_data},
+    {"ASA_APM_1P_602", "ASAR Alternating Polarization Medium Resolution Image product", 10, ASA_APM_1P_602_dataset_data},
     {"ASA_APP_1P", "ASAR Alternating Polarization Mode Precision Image", 10, ASA_APP_1P_dataset_data},
+    {"ASA_APP_1P_602", "ASAR Alternating Polarization Mode Precision Image", 10, ASA_APP_1P_602_dataset_data},
     {"ASA_APS_1P", "ASAR Alternating Polarization Mode Single Look Complex", 8, ASA_APS_1P_dataset_data},
+    {"ASA_APS_1P_602", "ASAR Alternating Polarization Mode Single Look Complex", 8, ASA_APS_1P_602_dataset_data},
     {"ASA_AP__BP", "ASAR Alternating Polarization Browse Product", 5, ASA_AP__BP_dataset_data},
 	{"ASA_GM1_1P", "ASAR Global Monitoring Mode Image", 8, ASA_GM1_1P_dataset_data},
+    {"ASA_GM1_1P_602", "ASAR Global Monitoring Mode Image", 8, ASA_GM1_1P_602_dataset_data},
     {"ASA_IMG_1P", "ASAR Image Mode Ellipsoid Geocoded Image", 9, ASA_IMG_1P_dataset_data},
+    {"ASA_IMG_1P_602", "ASAR Image Mode Ellipsoid Geocoded Image", 9, ASA_IMG_1P_602_dataset_data},
     {"ASA_IMM_1P", "ASAR Image Mode Medium Resolution Image", 8, ASA_IMM_1P_dataset_data},
+    {"ASA_IMM_1P_602", "ASAR Image Mode Medium Resolution Image", 8, ASA_IMM_1P_602_dataset_data},
     {"ASA_IMP_1P", "ASAR Image Mode Precision Image", 8, ASA_IMP_1P_dataset_data},
+    {"ASA_IMP_1P_602", "ASAR Image Mode Precision Image", 8, ASA_IMP_1P_602_dataset_data},
     {"ASA_IMS_1P", "ASAR Image Mode Single Look Complex", 6, ASA_IMS_1P_dataset_data},
+    {"ASA_IMS_1P_602", "ASAR Image Mode Single Look Complex", 6, ASA_IMS_1P_602_dataset_data},
 	{"ASA_IM__BP", "ASAR Image Mode Browse Product", 3, ASA_IM__BP_dataset_data},
     {"ASA_WSM_1P", "ASAR Wide Swath Medium Resolution Image", 8, ASA_WSM_1P_dataset_data},
+    {"ASA_WSM_1P_602", "ASAR Wide Swath Medium Resolution Image", 8, ASA_WSM_1P_602_dataset_data},
     {"ASA_WS__BP", "ASAR Wide Swath Mode Browse Image", 5, ASA_WS__BP_dataset_data},
     {"ASA_WVI_1P", "ASAR Wave Mode SLC Imagette and Imagette Cross Spectra", 405, ASA_WVI_1P_dataset_data},
     {"ASA_WVS_1P", "ASAR Wave Mode Imagette Cross Spectra", 4, ASA_WVS_1P_dataset_data},
@@ -4220,9 +4625,31 @@ const struct DatasetDescriptorTable dddb_product_tables[33] = {
     {"MER_RR__1P", "MERIS Reduced Resolution Geolocated and Calibrated TOA Radiance", 19, MER_RR__1P_dataset_data},
 	{"MER_RR__1P_IODD5", "MERIS Reduced Resolution Geolocated and Calibrated TOA Radiance", 19, MER_RR__1P_IODD5_dataset_data},
     {"MER_RR__2P", "MERIS Reduced Resolution Geophysical Product", 23, MER_RR__2P_dataset_data},
-    {"MER_RR__2P_IODD6", "MERIS Reduced Resolution Geophysical Product", 23, MER_RR__2P_IODD6_dataset_data}
-};
-const struct BandDescriptorTable dddb_band_tables[27] = {
+    {"MER_RR__2P_IODD6", "MERIS Reduced Resolution Geophysical Product", 23, MER_RR__2P_IODD6_dataset_data},
+    {"SAR_APG_1P", "ERS Simulated Alternating Polarization Ellipsoid Geocoded Image", 11, ASA_APG_1P_dataset_data},
+    {"SAR_APG_1P_602", "ERS Simulated Alternating Polarization Ellipsoid Geocoded Image", 11, ASA_APG_1P_602_dataset_data},
+    {"SAR_APM_1P", "ERS Simulated Alternating Polarization Medium Resolution Image product", 10, ASA_APM_1P_dataset_data},
+    {"SAR_APM_1P_602", "ERS Simulated Alternating Polarization Medium Resolution Image product", 10, ASA_APM_1P_602_dataset_data},
+    {"SAR_APP_1P", "ERS Simulated Alternating Polarization Mode Precision Image", 10, ASA_APP_1P_dataset_data},
+    {"SAR_APP_1P_602", "ERS Simulated Alternating Polarization Mode Precision Image", 10, ASA_APP_1P_602_dataset_data},
+    {"SAR_APS_1P", "ERS Simulated Alternating Polarization Mode Single Look Complex", 8, ASA_APS_1P_dataset_data},
+    {"SAR_APS_1P_602", "ERS Simulated Alternating Polarization Mode Single Look Complex", 8, ASA_APS_1P_602_dataset_data},
+    {"SAR_AP__BP", "ERS Simulated Alternating Polarization Browse Product", 5, ASA_AP__BP_dataset_data},
+    {"SAR_IMG_1P", "ERS Image Mode Ellipsoid Geocoded Image", 9, ASA_IMG_1P_dataset_data},
+    {"SAR_IMG_1P_602", "ERS Image Mode Ellipsoid Geocoded Image", 9, ASA_IMG_1P_602_dataset_data},
+    {"SAR_IMM_1P", "ERS Image Mode Medium Resolution Image", 8, ASA_IMM_1P_dataset_data},
+    {"SAR_IMM_1P_602", "ERS Image Mode Medium Resolution Image", 8, ASA_IMM_1P_602_dataset_data},
+    {"SAR_IMP_1P", "ERS Image Mode Precision Image", 8, ASA_IMP_1P_dataset_data},
+    {"SAR_IMP_1P_602", "ERS Image Mode Precision Image", 8, ASA_IMP_1P_602_dataset_data},
+    {"SAR_IMS_1P", "ERS Image Mode Single Look Complex", 6, ASA_IMS_1P_dataset_data},
+    {"SAR_IMS_1P_602", "ERS Image Mode Single Look Complex", 6, ASA_IMS_1P_602_dataset_data},
+    {"SAR_IM__BP", "ERS Image Mode Browse Product", 3, ASA_IM__BP_dataset_data},
+    {"SAR_WVI_1P", "ERS Wave Mode SLC Imagette and Imagette Cross Spectra", 405, ASA_WVI_1P_dataset_data},
+    {"SAR_WVS_1P", "ERS Wave Mode Imagette Cross Spectra", 4, ASA_WVS_1P_dataset_data},
+    {"SAR_WVW_2P", "ERS Wave Mode Wave Spectra", 4, ASA_WVW_2P_dataset_data},
+};
+
+const struct BandDescriptorTable dddb_band_tables[37] = {
     {"ASA_APG_1P", "ASAR Alternating Polarization Geocoded Image", 6, ASA_APG_1P_band_data},
     {"ASA_APM_1P", "ASAR Alternating Polarization Medium Resolution Image", 6, ASA_APM_1P_band_data},
     {"ASA_APP_1P", "ASAR Alternating Polarization Precision Image", 6, ASA_APP_1P_band_data},
@@ -4249,8 +4676,19 @@ const struct BandDescriptorTable dddb_band_tables[27] = {
     {"MER_RR__1P", "MERIS Level 1b Reduced Resolution Geophysical Product", 32, MER_RR__1P_band_data},
     {"MER_RR__1P_IODD5", "MERIS Level 1b Reduced Resolution Geophysical Product", 32, MER_RR__1P_IODD5_band_data},
     {"MER_RR__2P", "MERIS Level 2 Reduced Resolution Geophysical Product", 47, MER_RR__2P_band_data},
-    {"MER_RR__2P_IODD6", "MERIS Level 2 Reduced Resolution Geophysical Product", 46, MER_RR__2P_IODD6_band_data}
+    {"MER_RR__2P_IODD6", "MERIS Level 2 Reduced Resolution Geophysical Product", 46, MER_RR__2P_IODD6_band_data},
+    {"SAR_APG_1P", "ERS Simulated Alternating Polarization Geocoded Image", 6, ASA_APG_1P_band_data},
+    {"SAR_APM_1P", "ERS Simulated Alternating Polarization Medium Resolution Image", 6, ASA_APM_1P_band_data},
+    {"SAR_APP_1P", "ERS Simulated Alternating Polarization Precision Image", 6, ASA_APP_1P_band_data},
+    {"SAR_APS_1P", "ERS Simulated Alternating Polarization SLC Image", 6, ASA_APS_1P_band_data},
+    {"SAR_AP__BP", "ERS Simulated Alternatin Polarization Mode Browse Product", 5, ASA_AP__BP_band_data},
+    {"SAR_IMG_1P", "ERS Image Mode Geocoded Image", 5, ASA_IMG_1P_band_data},
+    {"SAR_IMM_1P", "ERS Image Mode Medium Resolution Image", 5, ASA_IMM_1P_band_data},
+    {"SAR_IMP_1P", "ERS Image Mode Precision Image", 5, ASA_IMP_1P_band_data},
+    {"SAR_IMS_1P", "ERS Image Mode SLC Image", 6, ASA_IMS_1P_band_data},
+    {"SAR_IM__BP", "ERS Image Mode Browse Product", 5, ASA_IM__BP_band_data},
 };
+
 const struct FlagDescriptorTable dddb_flag_coding_tables[6] = {
     {"ATS_NR__2P_flags", "AATSR Level 2 Flags Codings", 14, ATS_NR__2P_flags_data},
     {"ATS_TOA_1P_cloud_flags", "AATSR TOA Level 1b Cloud Flags Codings", 13, ATS_TOA_1P_cloud_flags_data},
@@ -4318,6 +4756,7 @@ const struct RecordDescriptorTable dddb_asar_rec_tables[20] = {
     {"ASAR_Image_MDSR_Gen", "Measurement Data Set 1", 4, ASAR_Image_MDSR_Gen_asar_rec_data},
     {"ASAR_Image_MDSR_SLC", "Measurement Data Set 1", 4, ASAR_Image_MDSR_SLC_asar_rec_data},
     {"ASAR_Main_ADSR", "Main Processing parameters", 220, ASAR_Main_ADSR_asar_rec_data},
+    {"ASAR_Main_ADSR_602", "Main Processing parameters", 227, ASAR_Main_ADSR_asar_602_rec_data},
     {"ASAR_Map_GADS", "Map Projection parameters", 66, ASAR_Map_GADS_asar_rec_data},
     {"ASAR_Ocean_Spectra_MDSR", "Ocean Wave spectrum.", 29, ASAR_Ocean_Spectra_MDSR_asar_rec_data},
     {"ASAR_SQ1_Image_ADSR", "SQ ADSRs", 39, ASAR_SQ1_Image_ADSR_asar_rec_data},
@@ -4327,6 +4766,7 @@ const struct RecordDescriptorTable dddb_asar_rec_tables[20] = {
     {"ASAR_Wave_Param_ADSR", "Wave Mode processing parameters", 396, ASAR_Wave_Param_ADSR_asar_rec_data},
     {"ASAR_Wave_SQ_ADSR", "SQ ADSRs", 59, ASAR_Wave_SQ_ADSR_asar_rec_data},
     {"ASA_CON_AX_GADS", "Contains ASAR processor configuration data", 41, ASA_CON_AX_GADS_asar_rec_data},
+    {"ASA_CON_AX_GADS_602", "Contains ASAR processor configuration data", 41, ASA_CON_AX_GADS_asar_602_rec_data},
     {"ASA_INS_AX_GADS", "Contains ASAR instrument characterization data", 721, ASA_INS_AX_GADS_asar_rec_data},
     {"ASA_XCA_AX_GADS", "Contains ASAR external calibration data", 31, ASA_XCA_AX_GADS_asar_rec_data},
     {"ASA_XCH_AX_GADS", "Contains ASAR external characterization data", 5, ASA_XCH_AX_GADS_asar_rec_data}
diff --git a/src/epr_dddb.h b/src/epr_dddb.h
index bf11497..10f9cd9 100644
--- a/src/epr_dddb.h
+++ b/src/epr_dddb.h
@@ -75,15 +75,15 @@ struct RecordDescriptorTable {
     const struct RecordDescriptor* descriptors;
 };
 
-extern const struct DatasetDescriptorTable dddb_product_tables[33];
-extern const struct BandDescriptorTable dddb_band_tables[27];
+extern const struct DatasetDescriptorTable dddb_product_tables[64];
+extern const struct BandDescriptorTable dddb_band_tables[37];
 extern const struct FlagDescriptorTable dddb_flag_coding_tables[6];
 extern const struct RecordDescriptorTable dddb_meris_rec_tables[23];
 extern const struct RecordDescriptorTable dddb_aatsr_rec_tables[20];
 extern const struct RecordDescriptorTable dddb_asar_rec_tables[20];
 
-#define EPR_NUM_PRODUCT_TABLES         33
-#define EPR_NUM_BAND_TABLES            27
+#define EPR_NUM_PRODUCT_TABLES         66
+#define EPR_NUM_BAND_TABLES            37
 #define EPR_NUM_FLAG_CODING_TABLES     6
 #define EPR_NUM_MERIS_REC_TABLES       23
 #define EPR_NUM_AATSR_REC_TABLES       20
diff --git a/src/epr_dsd.c b/src/epr_dsd.c
index 95ab027..b1913ef 100644
--- a/src/epr_dsd.c
+++ b/src/epr_dsd.c
@@ -165,6 +165,35 @@ int epr_detect_meris_iodd_version(EPR_SProductId* product_id)
 }
 
 
+int epr_detect_asar_sw_version(EPR_SProductId* product_id)
+{
+    EPR_SDSD** elems;
+    int size = 0;
+    int rec_size = 0;
+    int i, version = 0;
+    char* name;
+
+    if ((strncmp("ASA", product_id->id_string, 3) == 0) ||
+        (strncmp("SAR", product_id->id_string, 3) == 0)) {
+
+        elems = (EPR_SDSD**)product_id->dsd_array->elems;
+        size = product_id->dsd_array->length;
+        for (i=0; i< size;i++){
+            name = elems[i]->ds_name;
+            if (strncmp("MAIN PROCESSING PARAMS ADS", name, 26) == 0) {
+                rec_size = elems[i]->dsr_size;
+                if (rec_size == 10069) {
+                    version = 602;
+                }
+                break;
+            }
+        }
+    }
+
+    return version;
+}
+
+
 /**
 * Release the memory allocated through a dataset ID.
 *
diff --git a/src/epr_param.c b/src/epr_param.c
index 0aa13dc..4e59a56 100644
--- a/src/epr_param.c
+++ b/src/epr_param.c
@@ -148,6 +148,13 @@ int epr_set_dyn_dddb_params(EPR_SProductId* product_id)
         }
 
         field = epr_get_field(product_id->sph_record, "LINE_LENGTH");
+        if (field == NULL) {
+            epr_set_err(e_err_invalid_value,
+                "epr_set_param: wrong SPH: unable to read LINE_LENGTH");
+            epr_free_string(tmp);
+            return 0;
+        }
+
         line_length = ((uint*) field->elems)[0];
         if (line_length == 0) {
             epr_set_err(e_err_invalid_value,
@@ -155,7 +162,15 @@ int epr_set_dyn_dddb_params(EPR_SProductId* product_id)
             epr_free_string(tmp);
             return 0;
         }
+
         field = epr_get_field(product_id->sph_record, "LINES_PER_TIE_PT");
+        if (field == NULL) {
+            epr_set_err(e_err_invalid_value,
+                "epr_set_param: wrong SPH: unable to read LINES_PER_TIE_PT");
+            epr_free_string(tmp);
+            return 0;
+        }
+
         num_tie_points_across = ((uint*) field->elems)[0];
         if (num_tie_points_across == 0) {
             epr_set_err(e_err_invalid_value,
@@ -177,9 +192,17 @@ int epr_set_dyn_dddb_params(EPR_SProductId* product_id)
     /* AATSR does NOT have any dynamic parameters in DDDB */
 
     /* ASAR */
-    else if (strcmp(EPR_ENVISAT_PRODUCT_ASAR, epr_sub_string((char*)product_field->elems, 0, 3)) == 0) {
+    else if ((strcmp(EPR_ENVISAT_PRODUCT_ASAR, epr_sub_string((char*)product_field->elems, 0, 3)) == 0) ||
+             (strcmp(EPR_ENVISAT_PRODUCT_SAR, epr_sub_string((char*)product_field->elems, 0, 3)) == 0)) {
 
         field = epr_get_field(product_id->sph_record, "LINE_LENGTH");
+        if (field == NULL) {
+            epr_set_err(e_err_invalid_value,
+                "epr_set_param: wrong SPH: unable to read LINE_LENGTH");
+            epr_free_string(tmp);
+            return 0;
+        }
+
         line_length = ((uint*) field->elems)[0];
         if (line_length == 0) {
             epr_set_err(e_err_invalid_value,
diff --git a/src/epr_product.c b/src/epr_product.c
index 05ec59f..ba9b45e 100644
--- a/src/epr_product.c
+++ b/src/epr_product.c
@@ -123,6 +123,7 @@ EPR_SProductId* epr_open_product(const char* product_file_path) {
     /* Product identifier filter*/
     if ((strncmp(EPR_ENVISAT_PRODUCT_MERIS, product_id->id_string, 3) != 0) &&
             (strncmp(EPR_ENVISAT_PRODUCT_ASAR,  product_id->id_string, 3) != 0) &&
+            (strncmp(EPR_ENVISAT_PRODUCT_SAR,  product_id->id_string, 3) != 0) &&
             (strncmp(EPR_ENVISAT_PRODUCT_AATSR, product_id->id_string, 3) != 0)) {
         epr_set_err(e_err_invalid_product_id,
                     "epr_open_product: invalid product identifier");
@@ -434,6 +435,9 @@ uint epr_compute_scene_width(const EPR_SProductId* product_id) {
     } else if (strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0) {
         const EPR_SField* field = field = epr_get_field(sph_record, "LINE_LENGTH");
         scan_line_length = epr_get_field_elem_as_uint(field, 0);
+    } else if (strncmp(EPR_ENVISAT_PRODUCT_SAR, product_id->id_string, 3) == 0) {
+        const EPR_SField* field = field = epr_get_field(sph_record, "LINE_LENGTH");
+        scan_line_length = epr_get_field_elem_as_uint(field, 0);
     } else {
         epr_set_err(e_err_illegal_arg,
                     "epr_compute_scene_width: unknown product type");
diff --git a/src/epr_record.c b/src/epr_record.c
index 5e7e40d..6f0dfcc 100644
--- a/src/epr_record.c
+++ b/src/epr_record.c
@@ -221,6 +221,9 @@ EPR_SRecordInfo* epr_read_record_info(EPR_SProductId* product_id, EPR_SDatasetId
 		r_tables = dddb_aatsr_rec_tables;
 		num_r_tables = EPR_NUM_AATSR_REC_TABLES;
 	} else if (strncmp(product_id->id_string, "ASA", 3) == 0) {
+            r_tables = dddb_asar_rec_tables;
+            num_r_tables = EPR_NUM_ASAR_REC_TABLES;
+	} else if (strncmp(product_id->id_string, "SAR", 3) == 0) {
 		r_tables = dddb_asar_rec_tables;
 		num_r_tables = EPR_NUM_ASAR_REC_TABLES;
 	} else {
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
new file mode 100644
index 0000000..d33d6f5
--- /dev/null
+++ b/src/test/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Copyright (c) 2013 Antonio Valentino <antonio.valentino at tiscali.it>
+
+set(TARGETS api_unit_tests
+            epr_main_test
+            epr_subset_test
+            epr_test_endian)
+
+foreach(TEST ${TARGETS})
+    add_executable(${TEST} ${TEST}.c)
+    target_link_libraries(${TEST} epr_api)
+endforeach(TEST)
+
+target_link_libraries(epr_main_test bccunit)
+
+
+# endianess
+include(TestBigEndian)
+
+TEST_BIG_ENDIAN(BIGENDIAN)
+if(${BIGENDIAN})
+    set(ENDIANESS BE)
+else(${BIGENDIAN})
+    set(ENDIANESS LE)
+endif(${BIGENDIAN})
+
+
+#add_test(TEST_API_01 api_unit_tests)
+#add_test(TEST_EPR_01 epr_main_test)
+#add_test(TEST_EPR_02 epr_subset_test)
+add_test(TEST_EPR_03 epr_test_endian)
+set_tests_properties(TEST_EPR_03 PROPERTIES PASS_REGULAR_EXPRESSION
+    ${ENDIANESS})
+

-- 
ENVISAT Product Reader API for C



More information about the Pkg-grass-devel mailing list