pax_global_header00006660000000000000000000000064114255444100014512gustar00rootroot0000000000000052 comment=a922482750ca782a50b0016964ec46a94baa96d3 bcdev-epr-api-a922482/000077500000000000000000000000001142554441000144055ustar00rootroot00000000000000bcdev-epr-api-a922482/CHANGELOG.txt000066400000000000000000000174351142554441000164470ustar00rootroot00000000000000 CHANGELOG for the EPR-API, VERSION 2.2 ---------------------------------------------------------------------- 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 ambiguous with respect to 32bit and 64bit operating systems. ---------------------------------------------------------------------- Changes from Version 2.0.5 to Version 2.1 (of 6. May 2009) ---------------------------------------------------------------------- Support of MER_FRS (full resulution full swath) products Support of IODD7 ---------------------------------------------------------------------- Changes from Version 2.0.4 to Version 2.0.5 (of 28. October 2004) ---------------------------------------------------------------------- Bugfix in file epr_bitmask.c: If function epr_read_bitmask_raster() was called with non-zero pixel offsets, the application crashed due to an invalid array index exception. ---------------------------------------------------------------------- Changes from Version 2.0.3 to Version 2.0.4 (of 23. June 2004) ---------------------------------------------------------------------- Support for updated MERIS RR/FR Level 2 product format Backward compatibility with older formats is ensured. The new product changes are: a) the band "aero_epsilon" has been replaced by "aero_alpha". b) new flags have been added: BLUE_AERO - Aerosol with high Angstrom Exponent selected for atmosphere correction BPAC_ON - Bright Pixels Atm. Correction activated (water) LOW_SUN - Sun low above horizon (or conversely high Sun zenith angle) c) The DDV flag is now exclusively evaluated above land (LAND=true) ---------------------------------------------------------------------- Changes from Version 2.0.2 to Version 2.0.3 (of 5. Nov 2003) ---------------------------------------------------------------------- Bugfix in file epr_band.c: In function epr_read_band_raster() an error occured if the percentage of raster->source_step_x is bigger than raster->raster_width. This restriction was removed. ---------------------------------------------------------------------- Changes from Version 2.0.1 to Version 2.0.2 (of 21. June 2003) ---------------------------------------------------------------------- 1) Bugfix: MERIS L1b flags now correcly read (read_measurement_... "unknown data type") 2) Bugfix: MERIS L2 flags now correcly read (wrong byte order) 3) Bugfix: MER_RRC_1P products now correctly handled 4) Support for MERIS, AATSR and ASAR child products added 5) Support for new MERIS L2 TOAVI flags included ... 6) New utility functions for geophysical raster data access have been added to the API: o epr_get_raster_elem_size o epr_get_raster_elem_addr o epr_get_raster_pixel_addr o epr_get_raster_line_addr 7) New utility functions have been added to the API: o epr_get_data_type_size o epr_data_type_id_to_str ---------------------------------------------------------------------- Changes from Version 2.0 to Version 2.0.1 (of 21.03.2003) ---------------------------------------------------------------------- Bugfix: The build-in support for older MERIS L1b/L2 products (IODD 5) caused that no other product types than MERIS L1b/L2 data products could be opened. The error message was "epr_create_band_ids: band not found". Now also the other MERIS, AATSR and ASAR products can be opened again. ---------------------------------------------------------------------- Changes from Version 1.4 to Version 2.0 (of 07.03.2003) ---------------------------------------------------------------------- 1) The operational ENVISAT MERIS Level 1b product format has slightly changed. The 'spectral shift index' has been replaced by a 'detector index' according to IODD 6.0 (PO-TN-MEL-GS-0003). The older format is still supported by the EPR-API. 2) The DDDB as such has been removed and merged into the files 'epr_dddb.c'and 'epr_dddb.h'. This makes it unnecessary to pass the DDDB path to epr_init_api(). The API therefore has become easier to maintain. 3) The computation of geolocation has been improved and adapted to the VISAT precision. ---------------------------------------------------------------------- Changes from Version 1.3 to Version 1.4 ---------------------------------------------------------------------- Support for ENVISAT ASAR data products added ---------------------------------------------------------------------- Changes from Version 1.2 to Version 1.3 ---------------------------------------------------------------------- 1) Function epr_get_field_elem_as_mjd has been changed, it has now only one parameter left: const EPR_STime* epr_get_field_elem_as_mjd(const EPR_SField* field) 2) Getter functions for dataset descriptions have been added to the API - epr_get_num_dsds - epr_get_dsd_at ---------------------------------------------------------------------- Changes from Version 1.1 to Version 1.2 ---------------------------------------------------------------------- 1) All functions defined in "epr_api.h" now properly return exeptional values in case of an error. 2) Some of the API function did not clear the internal API error state. All public API functions now clear the global error state before the execute their actual code. ---------------------------------------------------------------------- Changes from Version 1.0 to Version 1.1 ---------------------------------------------------------------------- 1) The 'epr_open_product' function now creates automatically all dataset and band identifiers found in a given ENVISAT product file. That means, the user must not take care of the memory de-allocation of these identifiers; this will automatically be done when the 'epr_close_product' function is called. 2) In addition eight functions have been implemented. Their purpose is to ease the work with dataset and band identifiers. The new functions are listed below. 3) The "epr_dataset.h" header-file has been added. 4) New functions have been added: /* Gets the number off all datasets contained in a product. */ uint epr_get_num_datasets(EPR_SProductId* product_id); /* Gets the dataset_id at the specified position within the product. */ EPR_SDatasetId* epr_get_dataset_id_at(EPR_SProductId* product_id, uint index); /* Gets the dataset_id coresponding to the specified dataset name. */ EPR_SDatasetId* epr_get_dataset_id(EPR_SProductId* product_id, const char* dataset_name); /* Gets the name of the dataset for the given dataset ID. */ const char* epr_get_dataset_name(EPR_SDatasetId* dataset_id); /* Gets the number off all bands contained in a product. */ uint epr_get_num_bands(EPR_SProductId* product_id); /* Gets the band_id at the specified position within the product. */ EPR_SBandId* epr_get_band_id_at(EPR_SProductId* product_id, uint index); /* Gets the band_id corresponding to the specified name. */ EPR_SBandId* epr_get_band_id(EPR_SProductId* product_id, const char* band_name); /* Gets the name of the band for the given dataset ID. */ char* epr_get_band_name(EPR_SBandId* band_id); 5) Some functions have been deprecated: 'epr_create_dataset_id' is no longer part of the public API. Please use 'epr_get_dataset_id' instead. 'epr_free_dataset_id' is no longer part of the public API. The dataset IDs retrieved with the 'epr_get_dataset_id' function do not require an explicite destruction. 'epr_band_dataset_id' is no longer part of the public API. Please use 'epr_get_band_id' instead. 'epr_free_band_id' is no longer part of the public API. The dataset IDs retrieved with the 'epr_get_band_id' function do not require an explicite destruction. bcdev-epr-api-a922482/ISSUES.txt000066400000000000000000000023011142554441000161550ustar00rootroot00000000000000 # I issue # B bug # + done/fixed # ~ in progress # - to be done # version, e.g. 1.2 # I+2.0.f nf/uk apply IODD 7 changes in DDDB I+2.0 nf/mp apply IODD 6 changes in DDDB I+2.0 mp/mp test 2.0 API for AATSR products I+2.0 mp/uk translate german in changelog I+2.0 mp/uk make UNIX shared libraries for IDL API I+1.2 nf/uk in epr_init_api: check if dddb path is valid, if not log the problem so that users can solve it by themselves I+1.2 nf/uk provide a hint in the example source code and README.txt, that users have to explicitely pass the DDDB path to epr_init_api or set the environment variable EPR_DDDB_HOME. The DDDB path is normally "$EPR_C_API_INSTALL_DIR$/dddb" and is NOT automatically set. I+1.2 nf/nf provide (or adapt?) version of the API itself in epr_api.h I+1.2 nf/uk write README.txt B+1.2 uk/uk remove double type decl. in epr_api.h B+1.2 uk/uk replace 'prep_to_show' in all makefiles with proper target names I+1.2 uk/uk check correct english spelling in docu/strings I+1.2 uk/?? implement support for ASAR products I+1.2 uk/uk also log the file which is about to be opened in 'epr_open_file', before (!) the feared file-not-found error can occur bcdev-epr-api-a922482/LICENSE.txt000066400000000000000000001045131142554441000162340ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . bcdev-epr-api-a922482/README-DEV.txt000066400000000000000000000012511142554441000165160ustar00rootroot00000000000000 Configuration management after an ESA release 1) Increment version number in epr_api.h (EPR_PRODUCT_API_VERSION_STR), build.xml, VERSION.txt, README.txt, CHANGELOG.txt, doxyfile.txt 2) Provide new entry in CHANGELOG.txt 3) Adapt / give a hint in README.txt 4) Optional: Generate API documentation with "doxygen" cd $MY_PROJECTS_DIR$ cd docs doxygen Doxyfile.txt watch out: Check english in API log and error messages! Don't modify or hack example files without testing! Remove test dumps (MPH.txt ...) from release builds! Test release builds (with code optimization on)! Check & run examples before a release! Search in files for: "todo" bcdev-epr-api-a922482/README.txt000066400000000000000000000130571142554441000161110ustar00rootroot00000000000000 README ENVISAT Product Reader API for C Version 2.2 31. July 2010 Contents o Introduction o The EPR-API for C o Zip Archive Contents o Documentation o Release Notes o Bug Reports and Feedback Introduction Thank you for downloading this release of the EPR API package. The ENVISAT Product Reader API is a set of C-source code files supporting developers who want to use MERIS, AATSR, and ASAR data products of the ESA ENVISAT satellite in their software. The ENVISAT Product Reader API is developed and distributed under the terms of open source software development. The main use case for the C API is the ingestion of ENVISAT data into o new scientific algorithms developed for the MERIS, AATSR or ASAR sensors or even all of them, o existing scientific software packages written in C or C++, or COTS software systems which allow for extension using a C or C++ interface. The EPR-API for C (epr-c-api) The epr-c-api is a rich library of functions for reading data from ENVISAT MERIS, AATSR Level 1b and Level 2 and also ASAR data products. The API provides access to the data either on a geophysical (decoded, ready-to-use pixel samples) or on a raw data layer. The raw data access makes it possible to read any data field contained in a product file. The epr-c-api is written in pure ANSI C and should compile with every ANSI conformant C-compiler. Just copy all '*.h' and '*.c' files contained in the 'src' folder of the distribution to your own source folder of your project and include them in your development environment. Examples: You'll find some starting points for your own applications in the examples directory: epr_api-XXX/ |- src/examples/ - contains source code examples for developers |- write_bands.c |- write_bitmask.c |- write_ndvi.c Compile the examples with console: To compile the examples, use the scripts in: epr_api-XXX/ |- prj/unix Windows users can use msys (http://www.mingw.org/wiki/msys) or cygwin (http://www.cygwin.com/) to compile the examples. Compile the examples with an IDE: Also all users can use Code::Blocks (http://www.codeblocks.org/) a cross platform IDE (integrated developmenht engine) to compile an work with the examples and the api-source code. Load the project settings from: epr_api-XXX/ |- prj/codeblocks Build a library of the epr-c-api: A library of the epr-c-api can be built by using the 'makefile' which is provided with the distribution. Note that the 'makefile' is provided as is. The manner how to build a library depends on the operating system as well as on the type of library being built. Settings are provided for building shared (or dynamic) libraries for Linux, Solaris and Mac OS X. For other operating systems please consider your system guidelines in order to find out the correct settings. Release Notes Although this is rather advanced release of the EPR API Software, it is still under development. Naturally, this software will improve and grow through extensive testing and user feedback. Documentation The documentation is located at: epr_api-XXX/ |- docs/ |- html/ - API documentation for C Aditional documentation listing the supported ENVISAT product tables (required as a reference for dataset-, field-, band- and flag-names) can be found at: http://www.brockmann-consult.de/beam/doc/help/general/envisat-products/index.html Zip Archive Contents After a successfull unzipping of the epr_api-XXX.zip archive you should get a folder named epr_api-XXX with following structure: epr_api-XXX/ |- docs/ - contains the api documentation as html |- prj/ - provides build scripts for the C examples and the Code::Blocks IDE workspace |- src/ - epr-c-api C source code |- src/examples/ - contains source code examples for C |- README.txt - this file |- VERSION.txt - the version string |- CHANGELOG.txt - the changes from version to version |- LICENSE.txt - the GNU public license |- makefile - the makefile to buld the epr-c-api static library ready to use in your projects Bug Reports and Feedback Please submit your bug reports via e-mail to beam-issues@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@brockmann-consult.de sabine.embacher@brockmann-consult.de -------------------------------------------------------------------------------- Thank you for using the EPR API Software. 2009-04-28 Geesthacht, Germany Brockmann Consult www.brockmann-consult.com -------------------------------------------------------------------------------- The EPR API Software is licensed under the terms of the GNU General Public License aggreement (see the accompanying LICENSE.txt file). -------------------------------------------------------------------------------- Brockmann Consult 2010 bcdev-epr-api-a922482/VERSION.txt000066400000000000000000000000151142554441000162670ustar00rootroot00000000000000VERSION 2.2 bcdev-epr-api-a922482/bccunit/000077500000000000000000000000001142554441000160345ustar00rootroot00000000000000bcdev-epr-api-a922482/bccunit/src/000077500000000000000000000000001142554441000166235ustar00rootroot00000000000000bcdev-epr-api-a922482/bccunit/src/bccunit.c000066400000000000000000000100721142554441000204160ustar00rootroot00000000000000#include "bccunit.h" static struct BcUnitTest g_test_buf[MAX_NUM_TEST_CASES]; static long g_test_buf_index = 0; BcTest bc_create_test_impl(const char* name, BcTestFunc func, void* user_data); void bc_run_test_impl(BcTest test, BcTestResult* result, int level); BcTestCase bc_create_test_case(const char* name, BcTestFunc func, void* user_data) { assert(func != NULL); return bc_create_test_impl(name, func, user_data); } BcTestSuite bc_create_test_suite(const char* name) { return bc_create_test_impl(name, NULL, NULL); } BcTest bc_create_test_impl(const char* name, BcTestFunc func, void* user_data) { BcTest test_new = NULL; assert(name != NULL); if (g_test_buf_index >= MAX_NUM_TEST_CASES) { fprintf(stderr, "bccunit error: no more test cases available\n"); return NULL; } if (strlen(name) > MAX_LEN_TEST_NAME) { fprintf(stderr, "bccunit error: test case name too long (max. length = %d): \"%s\"\n", MAX_LEN_TEST_NAME, name); return NULL; } test_new = &g_test_buf[g_test_buf_index++]; strcpy(test_new->name, name); test_new->func = func; test_new->user_data = user_data; test_new->test_first = NULL; test_new->test_next = NULL; test_new->test_last = NULL; test_new->num_tests = (func != NULL) ? 1 : 0; return test_new; } void bc_add_test_case(BcTestSuite test_suite, const char* name, BcTestFunc func) { BcTestCase test_case = bc_create_test_case(name, func, NULL); bc_add_test(test_suite, test_case); } void bc_add_test(BcTestSuite test_suite, BcTest test) { assert(test_suite != NULL); assert(test_suite->func == NULL); assert(test != NULL); assert(test->test_next == NULL); if (test_suite->test_last != NULL) { test_suite->test_last->test_next = test; test_suite->test_last = test; } else { test_suite->test_first = test; test_suite->test_last = test; } test_suite->num_tests++; } void bc_run_test(BcTest test, BcTestResult* result) { assert(result != NULL); result->num_test_cases = 0; result->num_failures = 0; result->num_errors = 0; bc_run_test_impl(test, result, 0); printf("bccunit: test summary: %d test case(s) total, %d failure(s), %d error(s)\n", result->num_test_cases, result->num_failures, result->num_errors); } void bc_print_message_prefix(int level) { int indent; printf("bccunit: "); for (indent = 0; indent < level; indent++) { printf(" "); } } void bc_run_test_impl(BcTest test, BcTestResult* result, int level) { assert(test != NULL); assert(result != NULL); if (test->func != NULL) { /* it´a BcTest */ int status; bc_print_message_prefix(level); printf("running test case \"%s\"\n", test->name); status = test->func(test->user_data); result->num_test_cases += 1; result->num_failures += (status >= BC_TEST_FAILURE) ? status : 0; result->num_errors += (status == BC_TEST_ERROR) ? 1 : 0; } else { /* If test or func not set --> it's a suite */ BcTest sub_test; bc_print_message_prefix(level); printf("running test suite \"%s\" containing %d test(s)\n", test->name, test->num_tests); for (sub_test = test->test_first; sub_test != NULL; sub_test = sub_test->test_next) { bc_run_test_impl(sub_test, result, level + 1); } } } int bc_assert_cond(const char* msg, int cond, const char* file_path, long line_no) { return bc_assert_status(msg, cond != 0 ? BC_TEST_SUCCESS : BC_TEST_FAILURE, file_path, line_no); } int bc_assert_status(const char* msg, int status, const char* file_path, long line_no) { const char* reason = NULL; if (status == BC_TEST_FAILURE) { reason = "failure"; } else if (status == BC_TEST_ERROR) { reason = "error"; } if (reason != NULL) { printf("bccunit: %s: file %s: line %ld: %s\n", reason, file_path, line_no, msg); } return status; } bcdev-epr-api-a922482/bccunit/src/bccunit.h000066400000000000000000000063551142554441000204340ustar00rootroot00000000000000#ifndef BCCUNIT_H_INCL #define BCCUNIT_H_INCL #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include #include #include #include /** * Maximum number of test cases. * Increase this number when you get the error message * "no more test cases available" */ #define MAX_NUM_TEST_CASES 1024 /** * Maximum string length of a test case name. * Increase this number when you get the error message * "test case name too long" */ #define MAX_LEN_TEST_NAME 64 #define BC_TEST_SUCCESS 0 #define BC_TEST_FAILURE 1 #define BC_TEST_ERROR -1 typedef struct { int num_test_cases; int num_failures; int num_errors; } BcTestResult; typedef int (*BcTestFunc)(void* user_data); typedef void (*BcTestResultFunc)(BcTestResult* result, void* user_data); struct BcUnitTest { char name[MAX_LEN_TEST_NAME + 1]; BcTestFunc func; /* always NULL for test suites */ void* user_data; /* always NULL for test suites, optional user data, passed as arg to func call */ struct BcUnitTest* test_first; /* valid for test suites only */ struct BcUnitTest* test_last; /* valid for test suites only */ struct BcUnitTest* test_next; /* valid for test cases only */ int num_tests; /* valid for test suites only, for cases aways 1 */ }; typedef struct BcUnitTest* BcTest; typedef struct BcUnitTest* BcTestCase; typedef struct BcUnitTest* BcTestSuite; BcTestSuite bc_create_test_suite(const char* name); BcTestCase bc_create_test_case(const char* name, BcTestFunc func, void* user_data); void bc_add_test(BcTestSuite test_suite, BcTest test); void bc_add_test_case(BcTestSuite test_suite, const char* name, BcTestFunc func); void bc_run_test(BcTest test, BcTestResult* result); int bc_assert_cond(const char* msg, int cond, const char* file_path, long line_no); int bc_assert_status(const char* msg, int status, const char* file_path, long line_no); #define BC_BEGIN_TEST(TEST) \ int TEST(void* user_data) { #define BC_END_TEST() \ return (BC_TEST_SUCCESS); } #define BC_ASSERT_TRUE(EXPR) \ BC_ASSERT_IMPL("(" #EXPR ")", (EXPR)) #define BC_ASSERT_FALSE(EXPR) \ BC_ASSERT_IMPL("!(" #EXPR ")", !(EXPR)) #define BC_ASSERT_NOT_NULL(EXPR) \ BC_ASSERT_IMPL("(" #EXPR ") != NULL", (EXPR) != NULL) #define BC_ASSERT_NULL(EXPR) \ BC_ASSERT_IMPL("(" #EXPR ") == NULL", (EXPR) == NULL) #define BC_ASSERT_SAME(EXPR1, EXPR2) \ BC_ASSERT_IMPL("(" #EXPR1 ") == (" #EXPR2 ")", (EXPR1) == (EXPR2)) #define BC_ASSERT_NOT_SAME(EXPR1, EXPR2) \ BC_ASSERT_IMPL("(" #EXPR1 ") != (" #EXPR2 ")", (EXPR1) != (EXPR2)) #define BC_FAIL(MSG) \ BC_ASSERT_IMPL(MSG, 0) #define BC_ERROR(MSG) \ { return bc_assert_status(MSG, BC_TEST_ERROR, __FILE__, __LINE__); } #define BC_ASSERT_IMPL(MSG, COND) \ if (bc_assert_cond(MSG, COND, __FILE__, __LINE__) != BC_TEST_SUCCESS) { return BC_TEST_FAILURE; } else { } #ifdef __cplusplus } #endif /* __cplusplus */ #endif /*BCCUNIT_H_INCL*/ bcdev-epr-api-a922482/bccunit/src/bccunit_test.c000066400000000000000000000017161142554441000214620ustar00rootroot00000000000000#include "bccunit.h" BC_BEGIN_TEST(test_func_1) BC_ASSERT_TRUE(1 == 1); BC_END_TEST() BC_BEGIN_TEST(test_func_2) BC_ASSERT_NOT_NULL((void*)1); BC_END_TEST() int get_3() { return 2; } BC_BEGIN_TEST(test_func_3) int x = 3; BC_ASSERT_NULL(NULL); //BC_ASSERT_NULL((void*) 4); BC_ASSERT_SAME(3, get_3()); BC_END_TEST() BC_BEGIN_TEST(test_func_4) int x = 3; BC_ASSERT_NULL(NULL); //BC_ASSERT_NULL((void*) 4); BC_ASSERT_SAME(3, get_3()); BC_END_TEST() int main(int argc, char** argv) { BcTestSuite tsuite1; BcTestSuite tsuite2; BcTestResult result; tsuite1 = bc_create_test_suite("test_suite_1"); bc_add_test_case(tsuite1, "test_case_1", test_func_1); bc_add_test_case(tsuite1, "test_case_2", test_func_2); bc_add_test_case(tsuite1, "test_case_3", test_func_3); tsuite2 = bc_create_test_suite("test_suite_2"); bc_add_test_case(tsuite2, "test_case_4", test_func_4); bc_add_test(tsuite1, tsuite2); bc_run_test(tsuite1, &result); return 0; } bcdev-epr-api-a922482/build.xml000066400000000000000000000135541142554441000162360ustar00rootroot00000000000000 bcdev-epr-api-a922482/docs/000077500000000000000000000000001142554441000153355ustar00rootroot00000000000000bcdev-epr-api-a922482/docs/Doxyfile.txt000066400000000000000000001733261142554441000176750ustar00rootroot00000000000000# Doxyfile 1.5.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "ENVISAT Product Reader C API" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 2.2 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../src/epr_api.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = . # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = epr_c_api # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to FRAME, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Options related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO bcdev-epr-api-a922482/docs/doxygen_main_content.html000066400000000000000000000367351142554441000224540ustar00rootroot00000000000000

1. Introduction

The ENVISAT Product Reader API for C (epr-c-api) is a library of data structures and functions for simple access to MERIS, AATSR and ASAR products. You can use them in your programs to retrieve directly the geophysically coded values, e.g. such as the chlorophyll concentration in mg/m³, in a data matrix.

The epr-c-api is generic, i.e. it has no instrument specific functions but utilises the generic ENVISAT product format. However, it is not necessary for a user of the epr-c-api to know the ENVISAT product format - the epr-c-api knows it, and that's sufficient.

All a user of the epr-c-api has to know are a few functions and the name of the geophysical variable he wants to get. In fact, the epr-c-api can do more: all information stored in ENVISAT products can be retrieved in a unique way, just by requesting it identified by its name, without worrying too much where and how it is stored in the world of the ENVISAT product format.

Now, here's the tricky bit: there are many different products and the number of items stored in each product is huge. Therefore a ENVISAT Data Products documentation is included in the BEAM software homepage, which describes the internal structure of each supported product. In order to access a certain item such as a dataset, record, band or flag you have to consult the data product documentation for he correct name or ID for the dataset, record, band or flag you want to access.

2. Using the API in your own C-Programs

The epr-c-api is written in pure ANSI C and should compile with every ANSI conformant C-compiler:

  1. Copy all *.h *.c files contained in the distribution's src folder to your own source folder of your project and include them in your development environment (makefile or IDE).
  2. Include the public API header epr-api.h in your C source files.
  3. Optionally refer to the example code in src/examples directory

3. API Design

3.1 Basic Concepts

Given here are some of the basic concepts of the API.

  • The API works exclusively with pointers to dynamically allocated structures. For every structure type in the API a constructor/desctructor function pair always exists: X epr_create_X(...) and void epr_free_X(X). Example: For the type EPR_SRecord* these functions are EPR_SRecord* epr_create_record(...) and void epr_free_record(EPR_SRecord*).
  • In most cases, the first parameter is the object on which the function is operating. For example, uint epr_get_num_fields(const EPR_SRecord* record).
  • Access functions exist for all important members of structures. So, the user of the API should not need to work directly with the API structures but with functions to get values. For example, if you use the epr_get_pixel_as_float to access a pixel value of raster, your code is less dependent on API changes as if you would have directly accessed a structure member.
  • A central concept is that all items, which can be retrieved from ENVISAT products, are identified by name. For example, to access the MERIS L1B radiance of band 1, you have to call epr_get_dataset_id(product_id, "Radiance_1") But how do you know, what name you should use for the data you want to retrieve? There are three possibilities:
    1. The ENVISAT Data Products documentation provides all valid names used in the all supported data products. All tables in the documentation have a similar structure, the first column is always contains the longed-for name.
    2. One can use VISAT to open a product. The names shown in VISAT in the product browser are the same as in the ENVISAT data product tables documentation and are hence those needed.
    3. One can open a product using the epr-c-api, scan all datasets in a look and print the names of the datasets and records by the access function. The same can be done with all fields of a record.

3.2 Data Access Types

The API provides two access types for ENVISAT data:

  1. Access of data as it is stored in the product (we call this basic or raw data access) and
  2. Access to the geophysical raster data (what we call this geophysical data access).

The difference between the two is how they treat the measurement data: Access type (1) returns the data in its native data product structure: as datasets, records and fields. This gives a direct read access to the raw data as it is stored in the data product, without any interpretation of the content. For example, the MERIS L1B measurement data set MDS 15 stores chlorophyll, vegetation index or cloud top height in the same byte. The content has to be interpreted depending on the surface type, which itself is coded in MDS 20. To get the true geophysical value one needs to retrieve the proper scaling factors from a certain GADS. Access type (2) decodes all this and provides, for example, a data matrix with the chlorophyll concentration in a float variable in its geophysical units, i.e. mg/m³. The data of the measurement datasets and the tie-point values, i.e. geometry, geo-location and meteorological data, are available by this method. The tie-point data are interpolated to the corresponding image grid.

3.3 Working with the Basic/Raw Data Access

Level Correspondence in ENVISAT product
Product ENVISAT product file
Dataset Dataset, e.g. Main Product Header MPH, or a Measurement Data Set MDS. A dataset contains records. For example, the MERIS L1b MDS1 contains many records with radiance values.
Record A single record within a dataset. A record contains many fields. For example, a record within the MERIS L1b MDS1 contains a time-stamp field, a quality flag field and then a field with as many radiance values as contained in the width of the image.
Field A field within a record. Fields can be a scalar or a vector. In the example, the time stamp and quality flag are scalars while the radiance field is a vector of the length of an image line.
Element Optional. If a field is a vector, these are the elements of that vector. In the example each element of the radiance field is the radiance of a certain pixel.

On each level of the hierarchy, functions exist to point to a certain instance of it, e.g. a certain product, dataset or record and so on. That function generally requires the name of the item to be retrieved. All possible names can be found in the DDDB , and the name of the most important items are listed here. The function returns an identifier of that instance. The identifier is not the instance but a pointer to it. It is used to get the values of the instance by using access functions.

For example,

my_product_id = epr_open_product("my_MERIS_product");

returns the identifier to the my_product_id which points to the product contained in the file "my_MERIS_product".

rad1_id = epr_get_dataset_id(my_product_id, "Radiance_1");

This my_product_id is used get the identifier rad1_id which points to the Radiance_1 dataset. Now, one can call

num_rec = epr_get_num_records(rad1_id);

to get the number of records which this dataset contains. Finally one can loop over all records and gets its fields and elements. See the examples to get a complete code example.

3.4 Working with Geophysical Data Access

To work with geophysical data is easier than the basic access. No such deep hierarchy exists. Instead of accessing datasets, so called bands will be accessed. A band directly includes one single geophysical variable.

For example,

my_product_id = epr_open_product(my_product_file_path);
my_chl_id = epr_create_band_id(my_product_id, "algal_1");

returns the identifier to a band containing the chlorophyll product. Now, the actual data are read into a raster.

chl_raster = epr_create_compatible_raster(my_chl_id, ...);
status = epr_read_band_raster(chl_raster, ...);

The raster chl_raster now contains the data as two dimensional matrix of pixel. To get the value of a pixel at a certain index (i,j), one should use the access function:

chl_pixel = epr_get_pixel_as_float(chl_raster, i, j);

(See also the examples ndvi.c for complete example codes.)

The concept of the raster allows spatial subsets and undersampling: A certain portion of the ENVISAT product will be read into the raster. This is called the source. The complete ENVISAT product can be much greater than the source. One can move the raster over the complete ENVISAT product and read in turn different parts - always of the size of the source - of it into the raster.

A typical example is a processing in blocks. Lets say, a block has 64x32 pixel. Then, the source has a width of 64 pixel and a height of 32 pixel. Another example is a processing of complete image lines. Then, the source has a widths of the complete product (for example 1121 for a MERIS RR product), and a height of 1. One can loop over all blocks or image lines, read into the raster and process it. It is, of course, also possible to define a raster of the size of the complete product.

In addition, it is possible to define a subsampling step for a raster. This means, that the source is not read 1:1 into the raster, but that only every 2nd or 3rd pixel is read. This step can be set differently for the across track and along track directions.

3.5 Bit masks

MERIS and AATSR provide many so called flags, which are binary information indicating a certain state of a pixel. For example, this can be a quality indicator, which, if set, indicates that the value of the pixel is invalid. Other example are a cloud flag, indicating that this pixel is a measurement above a cloud, or a coastline flag. The flags are stored in a packed format inside the ENVISAT products, but the epr-c-api provides a function to easily access the flags. It returns a bit-mask, which is a byte array that matches the corresponding image raster and is 1 where the flag is set and 0 elsewhere. Even more, this functions permits to formulate a bit-mask expression to combine any number of flags in a logical expression and returns the resulting combined bit-mask:

bm_expr = "flags.LAND OR flags.CLOUD";
status = epr_read_bitmask_raster(product_id, bm_expr, ..., bm_raster);

This is an example to get a bit-mask which masks out all land and cloud pixels. The names of the flags are found in the DDDB. The epr_read_bitmask_raster function read from product, identified by product_id, the flags and stores the resulting bit-mask in the raster bm_raster. See the examples for the complete code.

4. API Function Group Index

The epr-c-api provides the following group of functions:

(1) Initialisation Functions for setting up the environment of the API and releasing memory when the API is closed.
(2) Logging Functions to manage logging information
(3) Error handling Functions for determining the behaviour of the API in case of errors, and of getting information about runtime errors
(4) Input / Output Opening and closing ENVISAT products and writing data to a file or stdout.
(5) Basic data access Functions to retrieve raw data as stored in ENVISAT products
(6) Geophysical data access Functions to retrieve geophysically interpreted data in a raster matrix
(7) Bit masks Functions for generating bit masks from the flags included in ENVISAT products.
bcdev-epr-api-a922482/docs/epr_c_api/000077500000000000000000000000001142554441000172565ustar00rootroot00000000000000bcdev-epr-api-a922482/docs/epr_c_api/annotated.html000066400000000000000000000143351142554441000221270ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Data Structures

Here are the data structures with brief descriptions:
EPR_BandIdThe EPR_BandId structure contains information about a band within an ENVISAT product file which has been opened with the epr_open_product() API function
EPR_DatasetIdThe EPR_DatasetId structure contains information about a dataset within an ENVISAT product file which has been opened with the epr_open_product() API function
EPR_DatasetRefThe EPR_DatasetRef structure represents the information from dddb
with the reference to data name (in dddb), field-name and index of the element in field-array, in which (by name) searchable values are located
EPR_DSDThe EPR_DSD structure contains information about the propertier of a dataset properties and its location within an ENVISAT product file
EPR_FieldRepresents a field within a record
EPR_FlagDefRepresents a flag-field within a flag-record
EPR_ProductIdThe EPR_ProductId structure contains information about an ENVISAT product file which has been opened with the epr_open_product() function
EPR_RasterRepresents a raster in which data will be stored
EPR_RecordThe EPR_Record structure represents a record instance read from an ENVISAT dataset
EPR_TimeRepresents a binary time value field in ENVISAT records

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/classes.html000066400000000000000000000071701142554441000216060ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Data Structure Index

  E  
EPR_DatasetRef   EPR_Field   EPR_ProductId   EPR_Record   
EPR_BandId   EPR_DSD   EPR_FlagDef   EPR_Raster   EPR_Time   
EPR_DatasetId   

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/custom.css000066400000000000000000000006661142554441000213120ustar00rootroot00000000000000td { vertical-align: top; } .header { vertical-align: middle; } .code, code { font-family: Courier New, Courier, mono, monospace; color: #1e90ff; } .top { text-align: right; margin-top: 10px; font-size: xx-small; font-weight: bold; font-family: Verdana, Arial, Helvetica, sans-serif; } .tableHeadline { font-weight: bold; } .tableSubHeadline { font-style: italic; font-size: small; } bcdev-epr-api-a922482/docs/epr_c_api/doxygen.css000066400000000000000000000173471142554441000214610ustar00rootroot00000000000000/* The standard CSS for doxygen */ body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; } /* @group Heading Levels */ h1 { text-align: center; font-size: 150%; } h2 { font-size: 120%; } h3 { font-size: 100%; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #153788; font-weight: normal; text-decoration: none; } .contents a:visited { color: #1b77c5; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code { color: #3030f0; } a.codeRef { color: #3030f0; } /* @end */ dl.el { margin-left: -1cm; } .fragment { font-family: monospace, fixed; font-size: 105%; } pre.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background: white; color: black; margin-right: 20px; margin-left: 20px; } td.indexkey { background-color: #e8eef2; font-weight: bold; border: 1px solid #CCCCCC; margin: 2px 0px 2px 0; padding: 2px 10px; } td.indexvalue { background-color: #e8eef2; border: 1px solid #CCCCCC; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #f0f0f0; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } /* @end */ .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #84b0c7; } th.dirtab { background: #e8eef2; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #666; } hr.footer { height: 1px; } /* @group Member Descriptions */ .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #FAFAFA; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #ccc; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memTemplParams { color: #606060; white-space: nowrap; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #606060; font-weight: normal; margin-left: 3px; } .memnav { background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .memitem { padding: 0; margin-bottom: 10px; } .memname { white-space: nowrap; font-weight: bold; margin-left: 6px; } .memproto { border-top: 1px solid #84b0c7; border-left: 1px solid #84b0c7; border-right: 1px solid #84b0c7; padding: 0; background-color: #d5e1e8; font-weight: bold; /* firefox specific markup */ background-image: -moz-linear-gradient(rgba(228, 233, 245, 1.0) 0%, rgba(193, 205, 232, 1.0) 100%); -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 8px; -moz-border-radius-topleft: 8px; /* webkit specific markup */ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(228, 233, 245, 1.0)), to(rgba(193, 205, 232, 1.0))); -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 8px; -webkit-border-top-left-radius: 8px; } .memdoc { border-bottom: 1px solid #84b0c7; border-left: 1px solid #84b0c7; border-right: 1px solid #84b0c7; padding: 2px 5px; background-color: #eef3f5; border-top-width: 0; /* firefox specific markup */ -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; /* webkit specific markup */ -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } /* @end */ /* @group Directory (tree) */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin: 0.5em; } /* these are for tree view when used as main index */ .directory { font-size: 9pt; font-weight: bold; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } /* The following two styles can be used to replace the root node title with an image of your choice. Simply uncomment the next two styles, specify the name of your image and be sure to set 'height' to the proper pixel height of your image. */ /* .directory h3.swap { height: 61px; background-repeat: no-repeat; background-image: url("yourimage.gif"); } .directory h3.swap span { display: none; } */ .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { font-size: 100%; font-weight: bold; } .directory-alt h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory-alt > h3 { margin-top: 0; } .directory-alt p { margin: 0px; white-space: nowrap; } .directory-alt div { display: none; margin: 0px; } .directory-alt img { vertical-align: -30%; } /* @end */ address { font-style: normal; color: #333; } table.doxtable { border-collapse:collapse; } table.doxtable td, table.doxtable th { border: 1px solid #153788; padding: 3px 7px 2px; } table.doxtable th { background-color: #254798; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; text-align:left; } bcdev-epr-api-a922482/docs/epr_c_api/doxygen.png000066400000000000000000000024011142554441000214360ustar00rootroot00000000000000‰PNG  IHDRd-ok>ÂgAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<]PLTEǾÏ"&©ÈÎï¶»ÖÓÚú“¢Þ ¬à¶Âõ‡§ÕÙêÉÊÎáâæ{ŽÔ¡ëˆ™× ²ø§¬¹ÀÀ±ÝÝÎùùéõõçëëåED9×ÖËhg]_X<@:#mhUÿÿÿÝÀ1tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍvÿIDATxÚbC£: d#„„………h` @¡X",***LKˆ.–], ºX@t± €èb @ÑÅ€BµD„6–š%""´° € ˜% ˆ™B:H¢ˆ²Áf@• ˆRPy"K`\PbC(!II!h©…ëƒ(ñ„Ä!ꈬC„Ä…àl!0[X\J\$TMˆ(’>a$S„ Ù@ Ш@R.$‚¬LJBR¢‰AÌG1 ¬ Â(FȃÔPhhÁTÀ¢„%!`€&q°%u P ¹¢ ¬ € ¹CT$B¢à|‚ºW„¤Àl £!B`R$( …Ĉ‘’ž@AÅ%ĤÄ%@,(—ʂڱ%$ÁââRPmB U`1IˆYB  99€\1 yCCCÿf"[N 'Ü=TGÈ’øl8˜^Kû5<êSæRɤ”%î@@ à›Ê b1 qÅAXHˆ¸&ØB’R y n˜P„Ìã–4A €€j¹€€>Ü ˜ t!˜+(.ÈÅWQ±A2ÜÜMUÜ‚’’‚‚â `1 %`19€F< 3cZÄ`óe!\ˆ DÈ+. 83‹³Àä¸!lYYA -6‚EJŠ¢V €@©žXXX 4„å Ê@86Ð`RdB´€4I "Ý "–@xrÊŒ‚H€AÊ`—f ÉȰCŒ"XV0ɲ³C b@2…¬H ¬È“ p)!(ì‚ 0Ž4ˆ)(%RÁÎ ¶$€TÊ€¥Àþb‡b,säÐ@7À üѰ‚Òî?f¥Ö—\PIx!I´¦"”Ȉ’3¨ QY˜ÿt^^ÛØgv- }>WJOAV`$&#”¦8ùøø8€\FF ›SFJ$ÂÆ€ÐƊС䈉ÀÀ 4ª…Èäå -Á§‡ €H²…—ŸŸŸf ?ðâ5„ €k1Âd‰,ŒÃ ³ƒ“€.€"­F™ËË€àñ‚½ÁIÈ€"±Ù4ÉH gx|‚f©m)))9´. aMDƒ& ºX@t± €èb @ÑÅ€¢‹%DKˆ.–], ºX@t± €èb @€d`‚ɽSµOIEND®B`‚bcdev-epr-api-a922482/docs/epr_c_api/epr__api_8h.html000066400000000000000000003267521142554441000223400ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

epr_api.h File Reference

#include <stdio.h>
#include "epr_ptrarray.h"
#include <stdlib.h>

Go to the source code of this file.

Data Structures

struct  EPR_ProductId
 The EPR_ProductId structure contains information about an ENVISAT product file which has been opened with the epr_open_product() function. More...
struct  EPR_DatasetId
 The EPR_DatasetId structure contains information about a dataset within an ENVISAT product file which has been opened with the epr_open_product() API function. More...
struct  EPR_DSD
 The EPR_DSD structure contains information about the propertier of a dataset properties and its location within an ENVISAT product file. More...
struct  EPR_Record
 The EPR_Record structure represents a record instance read from an ENVISAT dataset. More...
struct  EPR_Field
 Represents a field within a record. More...
struct  EPR_Raster
 Represents a raster in which data will be stored. More...
struct  EPR_DatasetRef
 The EPR_DatasetRef structure represents the information from dddb
with the reference to data name (in dddb), field-name and index of the element in field-array, in which (by name) searchable values are located. More...
struct  EPR_FlagDef
 Represents a flag-field within a flag-record. More...
struct  EPR_BandId
 The EPR_BandId structure contains information about a band within an ENVISAT product file which has been opened with the epr_open_product() API function. More...
struct  EPR_Time
 Represents a binary time value field in ENVISAT records. More...

Defines

#define EPR_PRODUCT_API_NAME_STR   "ENVISAT Product Reader API"
#define EPR_PRODUCT_API_VERSION_STR   "2.2"
#define EPR_MAGIC_PRODUCT_ID   0xCAFFEE64
#define EPR_MAGIC_DATASET_ID   0xEFEABDCA
#define EPR_MAGIC_BAND_ID   0xFEC21ABD
#define EPR_MAGIC_RECORD   0x7BABACAE
#define EPR_MAGIC_FIELD   0xBA0BABBA
#define EPR_MAGIC_RASTER   0x0BABA0EB
#define EPR_MAGIC_FLAG_DEF   0xCABA11AD
#define TRUE   1
#define FALSE   0
#define EPR_PRODUCT_ID_STRLEN   48

Typedefs

typedef enum EPR_DataTypeId EPR_EDataTypeId
typedef enum EPR_ErrCode EPR_EErrCode
typedef enum EPR_LogLevel EPR_ELogLevel
typedef enum EPR_SampleModel EPR_ESampleModel
typedef enum EPR_ScalingMethod EPR_EScalingMethod
typedef struct EPR_ProductId EPR_SProductId
typedef struct EPR_DatasetId EPR_SDatasetId
typedef struct EPR_BandId EPR_SBandId
typedef struct EPR_Record EPR_SRecord
typedef struct EPR_RecordInfo EPR_SRecordInfo
typedef struct EPR_Field EPR_SField
typedef struct EPR_FieldInfo EPR_SFieldInfo
typedef struct EPR_DSD EPR_SDSD
typedef struct EPR_Raster EPR_SRaster
typedef struct EPR_FlagDef EPR_SFlagDef
typedef struct EPR_ParamElem EPR_SParamElem
typedef struct EPR_Time EPR_STime
typedef struct EPR_DatasetRef EPR_SDatasetRef
typedef struct EPR_BitmaskTerm EPR_SBitmaskTerm
typedef struct EPR_FlagSet EPR_SFlagSet
typedef void(* EPR_FErrHandler )(EPR_EErrCode err_code, const char *err_message)
typedef void(* EPR_FLogHandler )(EPR_ELogLevel log_level, const char *log_message)
typedef int epr_boolean
typedef unsigned char uchar
typedef unsigned short ushort
typedef unsigned int uint
typedef unsigned long ulong
typedef int EPR_Magic

Enumerations

enum  EPR_DataTypeId {
  e_tid_unknown = 0, e_tid_uchar = 1, e_tid_char = 2, e_tid_ushort = 3,
  e_tid_short = 4, e_tid_uint = 5, e_tid_int = 6, e_tid_float = 7,
  e_tid_double = 8, e_tid_string = 11, e_tid_spare = 13, e_tid_time = 21
}
 

The EPR_DataTypeId enumeration lists all possible data types for field elements in ENVISAT dataset records.

More...
enum  EPR_ErrCode {
  e_err_none = 0, e_err_null_pointer = 1, e_err_illegal_arg = 2, e_err_illegal_state = 3,
  e_err_out_of_memory = 4, e_err_index_out_of_range = 5, e_err_illegal_conversion = 6, e_err_illegal_data_type = 7,
  e_err_file_not_found = 101, e_err_file_access_denied = 102, e_err_file_read_error = 103, e_err_file_write_error = 104,
  e_err_file_open_failed = 105, e_err_file_close_failed = 106, e_err_api_not_initialized = 201, e_err_invalid_product_id = 203,
  e_err_invalid_record = 204, e_err_invalid_band = 205, e_err_invalid_raster = 206, e_err_invalid_dataset_name = 207,
  e_err_invalid_field_name = 208, e_err_invalid_record_name = 209, e_err_invalid_product_name = 210, e_err_invalid_band_name = 211,
  e_err_invalid_data_format = 212, e_err_invalid_value = 213, e_err_invalid_keyword_name = 214, e_err_unknown_endian_order = 216,
  e_err_flag_not_found = 301, e_err_invalid_ddbb_format = 402
}
 

The EPR_ErrCode enumeration lists all possible error codes for the ENVISAT product reader API.

More...
enum  EPR_LogLevel { e_log_debug = -1, e_log_info = 0, e_log_warning = 1, e_log_error = 2 }
 

The EPR_LogLevel enumeration lists possible log levels for the ENVISAT product reader API.

More...
enum  EPR_SampleModel {
  e_smod_1OF1 = 0, e_smod_1OF2 = 1, e_smod_2OF2 = 2, e_smod_3TOI = 3,
  e_smod_2TOF = 4
}
enum  EPR_ScalingMethod { e_smid_non = 0, e_smid_lin = 1, e_smid_log = 2 }

Functions

int epr_init_api (EPR_ELogLevel log_level, EPR_FLogHandler log_handler, EPR_FErrHandler err_handler)
 Initializes the ENVISAT product reader API.
void epr_close_api ()
 Closes the ENVISAT product reader API by releasing all resources allocated by the API.
int epr_set_log_level (EPR_ELogLevel log_level)
 Sets the log level for the ENVISAT API.
void epr_set_log_handler (EPR_FLogHandler log_handler)
 Sets the log handler for the ENVISAT API.
void epr_log_message (EPR_ELogLevel log_level, const char *log_message)
 A default implementation for a logging function to be passed into the epr_init() function.
void epr_set_err_handler (EPR_FErrHandler err_handler)
 Sets the error handler for the ENVISAT API.
EPR_EErrCode epr_get_last_err_code ()
 Gets the error code of the error that occured during the last API function call.
const char * epr_get_last_err_message ()
 Gets the error message of the error that occured during the last API function call.
void epr_clear_err ()
 Clears the last error.
EPR_SProductIdepr_open_product (const char *product_file_path)
 Opens the ENVISAT product file with the given file path,
reads MPH, SPH and all DSDs,
organized the table with parameter of line length and tie points number;
returns a file identifier for the product.
int epr_close_product (EPR_SProductId *product_id)
 Closes the ENVISAT product file determined by the given product identifier.
void epr_print_record (const EPR_SRecord *record, FILE *ostream)
void epr_print_field (const EPR_SField *field, FILE *ostream)
void epr_print_element (const EPR_SRecord *record, uint field_index, uint element_index, FILE *ostream)
void epr_dump_record (const EPR_SRecord *record)
void epr_dump_field (const EPR_SField *field)
void epr_dump_element (const EPR_SRecord *record, uint field_index, uint element_index)
uint epr_get_scene_width (const EPR_SProductId *product_id)
 Gets the product's scene width in pixels.
uint epr_get_scene_height (const EPR_SProductId *product_id)
 Gets the product's scene height in pixels.
uint epr_get_num_datasets (EPR_SProductId *product_id)
 Gets the number off all datasets contained in a product.
EPR_SDatasetIdepr_get_dataset_id_at (EPR_SProductId *product_id, uint index)
 Gets the dataset_id at the specified position within the product.
EPR_SDatasetIdepr_get_dataset_id (EPR_SProductId *product_id, const char *dataset_name)
 Gets the dataset_id coresponding to the specified dataset name.
const char * epr_get_dataset_name (EPR_SDatasetId *dataset_id)
 Gets the name of the dataset for the given dataset ID.
const char * epr_get_dsd_name (const EPR_SDatasetId *dataset_id)
 Gets the name of the dsd for the given dataset ID.
EPR_SRecordepr_get_mph (const EPR_SProductId *product_id)
 Gets the MPH record from the given product_id.
EPR_SRecordepr_get_sph (const EPR_SProductId *product_id)
 Gets the SPH record from the given product_id.
const EPR_SDSDepr_get_dsd (const EPR_SDatasetId *dataset_id)
 Gets the dataset descriptor (DSD) for the dataset specified by dataset_id.
uint epr_get_num_records (const EPR_SDatasetId *dataset_id)
 Gets the number of records of the dataset specified by dataset_id.
uint epr_get_num_dsds (const EPR_SProductId *product_id)
EPR_SDSDepr_get_dsd_at (const EPR_SProductId *product_id, uint dsd_index)
EPR_SRecordepr_create_record (EPR_SDatasetId *dataset_id)
 Creates a new, empty record with a structure compatible with the dataset specified by dataset_id.
EPR_SRecordepr_read_record (EPR_SDatasetId *dataset_id, uint record_index, EPR_SRecord *record)
 Reads a record of a dataset specified by dataset_id.
void epr_free_record (EPR_SRecord *record)
 Frees the memory allocated through the given record.
const EPR_SFieldepr_get_field (const EPR_SRecord *record, const char *field_name)
 Gets a field from the given record.
uint epr_get_num_fields (const EPR_SRecord *record)
 Gets the number of fields contained in the given record.
const EPR_SFieldepr_get_field_at (const EPR_SRecord *record, uint field_index)
 Gets a field at the specified position within the record.
const char * epr_get_field_unit (const EPR_SField *field)
 Gets the unit of the field.
const char * epr_get_field_description (const EPR_SField *field)
 Gets the description of the field.
uint epr_get_field_num_elems (const EPR_SField *field)
 Gets the number of elements of the field.
const char * epr_get_field_name (const EPR_SField *field)
 Gets the name of the field.
EPR_EDataTypeId epr_get_field_type (const EPR_SField *field)
 Gets the type of the field.
char epr_get_field_elem_as_char (const EPR_SField *field, uint elem_index)
uchar epr_get_field_elem_as_uchar (const EPR_SField *field, uint elem_index)
short epr_get_field_elem_as_short (const EPR_SField *field, uint elem_index)
ushort epr_get_field_elem_as_ushort (const EPR_SField *field, uint elem_index)
int epr_get_field_elem_as_int (const EPR_SField *field, uint elem_index)
uint epr_get_field_elem_as_uint (const EPR_SField *field, uint elem_index)
float epr_get_field_elem_as_float (const EPR_SField *field, uint elem_index)
double epr_get_field_elem_as_double (const EPR_SField *field, uint elem_index)
const EPR_STimeepr_get_field_elem_as_mjd (const EPR_SField *field)
const char * epr_get_field_elem_as_str (const EPR_SField *field)
const char * epr_get_field_elems_char (const EPR_SField *field)
const ucharepr_get_field_elems_uchar (const EPR_SField *field)
const short * epr_get_field_elems_short (const EPR_SField *field)
const ushortepr_get_field_elems_ushort (const EPR_SField *field)
const int * epr_get_field_elems_int (const EPR_SField *field)
const uintepr_get_field_elems_uint (const EPR_SField *field)
const float * epr_get_field_elems_float (const EPR_SField *field)
const double * epr_get_field_elems_double (const EPR_SField *field)
uint epr_copy_field_elems_as_ints (const EPR_SField *field, int *buffer, uint num_elems)
uint epr_copy_field_elems_as_uints (const EPR_SField *field, uint *buffer, uint num_elems)
uint epr_copy_field_elems_as_floats (const EPR_SField *field, float *buffer, uint num_elems)
uint epr_copy_field_elems_as_doubles (const EPR_SField *field, double *buffer, uint num_elems)
EPR_SRasterepr_create_compatible_raster (EPR_SBandId *band_id, uint source_width, uint source_height, uint source_step_x, uint source_step_y)
 Creates a raster which is compatible with the data type contained in the band identified by band_id.
EPR_SRasterepr_create_raster (EPR_EDataTypeId data_type, uint source_width, uint source_height, uint source_step_x, uint source_step_y)
 Creates a raster of the specified data type.
EPR_SRasterepr_create_bitmask_raster (uint source_width, uint source_height, uint source_step_x, uint source_step_y)
 Creates a raster to be used for reading bitmasks.
int epr_read_band_raster (EPR_SBandId *band_id, int offset_x, int offset_y, EPR_SRaster *raster)
 Reads (geo-)physical values of the given band of the specified source-region.
uint epr_get_raster_elem_size (const EPR_SRaster *raster)
void * epr_get_raster_elem_addr (const EPR_SRaster *raster, uint offset)
void * epr_get_raster_pixel_addr (const EPR_SRaster *raster, uint x, uint y)
void * epr_get_raster_line_addr (const EPR_SRaster *raster, uint y)
uint epr_get_raster_width (EPR_SRaster *raster)
 Gets the raster's scene width in pixels.
uint epr_get_raster_height (EPR_SRaster *raster)
 Gets the raster's scene height in pixels.
uint epr_get_num_bands (EPR_SProductId *product_id)
 Gets the number of all bands contained in a product.
EPR_SBandIdepr_get_band_id_at (EPR_SProductId *product_id, uint index)
 Gets the band ID at the specified position within the product.
EPR_SBandIdepr_get_band_id (EPR_SProductId *product_id, const char *band_name)
 Gets the band ID corresponding to the specified name.
const char * epr_get_band_name (EPR_SBandId *band_id)
 Gets the name of the band for the given band ID.
void epr_free_raster (EPR_SRaster *raster)
 Release the memory allocated through a raster.
uint epr_get_pixel_as_uint (const EPR_SRaster *raster, int x, int y)
 This group of functions is for getting the values of the elements of a raster (i.e.
int epr_get_pixel_as_int (const EPR_SRaster *raster, int x, int y)
float epr_get_pixel_as_float (const EPR_SRaster *raster, int x, int y)
double epr_get_pixel_as_double (const EPR_SRaster *raster, int x, int y)
int epr_read_bitmask_raster (EPR_SProductId *product_id, const char *bm_expr, int offset_x, int offset_y, EPR_SRaster *raster)
 Calculates a bit-mask, composed of flags of the given product and combined as described in the given bit-mask expression, for the a certain dimension and sub-sampling as defined in the given raster.
uint epr_get_data_type_size (EPR_EDataTypeId data_type_id)
 Gets the size in bytes for an element of the given data type.
const char * epr_data_type_id_to_str (EPR_EDataTypeId data_type_id)
 Gets the 'C' data type string for the given data type.

Define Documentation

#define EPR_PRODUCT_API_NAME_STR   "ENVISAT Product Reader API"
#define EPR_PRODUCT_API_VERSION_STR   "2.2"
#define EPR_MAGIC_PRODUCT_ID   0xCAFFEE64
#define EPR_MAGIC_DATASET_ID   0xEFEABDCA
#define EPR_MAGIC_BAND_ID   0xFEC21ABD
#define EPR_MAGIC_RECORD   0x7BABACAE
#define EPR_MAGIC_FIELD   0xBA0BABBA
#define EPR_MAGIC_RASTER   0x0BABA0EB
#define EPR_MAGIC_FLAG_DEF   0xCABA11AD
#define TRUE   1
#define FALSE   0
#define EPR_PRODUCT_ID_STRLEN   48

Typedef Documentation

typedef enum EPR_ErrCode EPR_EErrCode
typedef struct EPR_ProductId EPR_SProductId
typedef struct EPR_DatasetId EPR_SDatasetId
typedef struct EPR_BandId EPR_SBandId
typedef struct EPR_Record EPR_SRecord
typedef struct EPR_RecordInfo EPR_SRecordInfo
typedef struct EPR_Field EPR_SField
typedef struct EPR_FieldInfo EPR_SFieldInfo
typedef struct EPR_DSD EPR_SDSD
typedef struct EPR_Raster EPR_SRaster
typedef struct EPR_FlagDef EPR_SFlagDef
typedef struct EPR_ParamElem EPR_SParamElem
typedef struct EPR_Time EPR_STime
typedef struct EPR_BitmaskTerm EPR_SBitmaskTerm
typedef struct EPR_FlagSet EPR_SFlagSet
typedef void(* EPR_FErrHandler)(EPR_EErrCode err_code, const char *err_message)
typedef void(* EPR_FLogHandler)(EPR_ELogLevel log_level, const char *log_message)
typedef int epr_boolean
typedef unsigned char uchar
typedef unsigned short ushort
typedef unsigned int uint
typedef unsigned long ulong
typedef int EPR_Magic

Enumeration Type Documentation

The EPR_DataTypeId enumeration lists all possible data types for field elements in ENVISAT dataset records.

Enumerator:
e_tid_unknown 

The ID for unknown types.

e_tid_uchar 

An array of unsigned 8-bit integers, C type is uchar*

e_tid_char 

An array of signed 8-bit integers, C type is char*

e_tid_ushort 

An array of unsigned 16-bit integers, C type is ushort*

e_tid_short 

An array of signed 16-bit integers, C type is short*

e_tid_uint 

An array of unsigned 32-bit integers, C type is uint*

e_tid_int 

An array of signed 32-bit integers, C type is int*

e_tid_float 

An array of 32-bit floating point numbers, C type is float*

e_tid_double 

An array of 64-bit floating point numbers, C type is double*

e_tid_string 

A zero-terminated ASCII string, C type is char*

e_tid_spare 

An array of unsigned character, C type is uchar*

e_tid_time 

A time (MJD) structure, C type is EPR_Time

The EPR_ErrCode enumeration lists all possible error codes for the ENVISAT product reader API.

Enumerator:
e_err_none 
e_err_null_pointer 
e_err_illegal_arg 
e_err_illegal_state 
e_err_out_of_memory 
e_err_index_out_of_range 
e_err_illegal_conversion 
e_err_illegal_data_type 
e_err_file_not_found 
e_err_file_access_denied 
e_err_file_read_error 
e_err_file_write_error 
e_err_file_open_failed 
e_err_file_close_failed 
e_err_api_not_initialized 
e_err_invalid_product_id 
e_err_invalid_record 
e_err_invalid_band 
e_err_invalid_raster 
e_err_invalid_dataset_name 
e_err_invalid_field_name 
e_err_invalid_record_name 
e_err_invalid_product_name 
e_err_invalid_band_name 
e_err_invalid_data_format 
e_err_invalid_value 
e_err_invalid_keyword_name 
e_err_unknown_endian_order 
e_err_flag_not_found 
e_err_invalid_ddbb_format 

The EPR_LogLevel enumeration lists possible log levels for the ENVISAT product reader API.

Enumerator:
e_log_debug 
e_log_info 
e_log_warning 
e_log_error 
Enumerator:
e_smod_1OF1 
e_smod_1OF2 
e_smod_2OF2 
e_smod_3TOI 
e_smod_2TOF 
Enumerator:
e_smid_non 
e_smid_lin 
e_smid_log 

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/epr__api_8h_source.html000066400000000000000000003310331142554441000237040ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/files.html000066400000000000000000000051401142554441000212460ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

File List

Here is a list of all files with brief descriptions:
epr_api.h [code]

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/functions.html000066400000000000000000000306101142554441000221540ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Here is a list of all struct and union fields with links to the structures/unions they belong to:

- b -

- d -

- e -

- f -

- i -

- l -

- m -

- n -

- p -

- r -

- s -

- t -

- u -


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/functions_vars.html000066400000000000000000000304551142554441000232160ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

 

- b -

- d -

- e -

- f -

- i -

- l -

- m -

- n -

- p -

- r -

- s -

- t -

- u -


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/globals.html000066400000000000000000000647101142554441000215770ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:

- e -

- f -

- t -

- u -


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/globals_defs.html000066400000000000000000000103021142554441000225640ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

 

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/globals_enum.html000066400000000000000000000066071142554441000226240ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

 

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/globals_eval.html000066400000000000000000000255341142554441000226070ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

 

- e -


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/globals_func.html000066400000000000000000000323241142554441000226060ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

 

- e -


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/globals_type.html000066400000000000000000000135611142554441000226360ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

 

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__BM.html000066400000000000000000000144441142554441000220240ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Bitmask

Functions

int epr_read_bitmask_raster (EPR_SProductId *product_id, const char *bm_expr, int offset_x, int offset_y, EPR_SRaster *raster)
 Calculates a bit-mask, composed of flags of the given product and combined as described in the given bit-mask expression, for the a certain dimension and sub-sampling as defined in the given raster.

Function Documentation

int epr_read_bitmask_raster ( EPR_SProductId product_id,
const char *  bm_expr,
int  offset_x,
int  offset_y,
EPR_SRaster raster 
)

Calculates a bit-mask, composed of flags of the given product and combined as described in the given bit-mask expression, for the a certain dimension and sub-sampling as defined in the given raster.

Parameters:
product_id Identifier of the ENVISAT product for which the bit-mask shall be created. This is used by the function to retreive the needed flags.
bm_expr A string holding the logical expression for the defintion of the bit-mask. In a bit-mask expression, any number of the flag-names (found in the DDDB) can be composed with "(", ")", "NOT", "AND", "OR". Valid bit-mask expression are for example:
"flags.LAND OR flags.CLOUD" or "NOT flags.WATER AND flags.TURBID_S".
offset_x across-track co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region
offset_y along-track co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region
raster the raster for the bit-mask. The data type of the raster must be either e_tid_uchar or e_tid_char.
Returns:
zero for success, an error code otherwise
See also:
create_band_raster

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__CFE.html000066400000000000000000000252121142554441000221160ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Copy Field Elems This group of functions is for copying the data of the given field into the given
[Basic Data Access]

buffer of elements by selected type. More...

Functions

uint epr_copy_field_elems_as_ints (const EPR_SField *field, int *buffer, uint num_elems)
uint epr_copy_field_elems_as_uints (const EPR_SField *field, uint *buffer, uint num_elems)
uint epr_copy_field_elems_as_floats (const EPR_SField *field, float *buffer, uint num_elems)
uint epr_copy_field_elems_as_doubles (const EPR_SField *field, double *buffer, uint num_elems)

Detailed Description

buffer of elements by selected type.

The actual number of elements copied is the minimum of the given number of elements (the buffer's size) and the actual number of elements contained in the field.

If the actual field data type is not selected type, the function automatically performs the conversion.

Parameters:
field the field from which to copy the elements
buffer the buffer in which to copy the data
num_elems the number of elements in the given buffer
Returns:
the actual number of elements copied

Function Documentation

uint epr_copy_field_elems_as_ints ( const EPR_SField field,
int *  buffer,
uint  num_elems 
)
uint epr_copy_field_elems_as_uints ( const EPR_SField field,
uint buffer,
uint  num_elems 
)
uint epr_copy_field_elems_as_floats ( const EPR_SField field,
float *  buffer,
uint  num_elems 
)
uint epr_copy_field_elems_as_doubles ( const EPR_SField field,
double *  buffer,
uint  num_elems 
)

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__DA.html000066400000000000000000000165761142554441000220220ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Basic Data Access

Modules

 Dataset Access
 Record Access
 Field Access
 Field Single Element Access
 

This group of functions is for getting the elements of a field as a typed value.


 Field Array Element Access This group of functions is for getting an array of field elements
 

of a certain data type.


 Copy Field Elems This group of functions is for copying the data of the given field into the given
 

buffer of elements by selected type.


Functions

uint epr_get_scene_width (const EPR_SProductId *product_id)
 Gets the product's scene width in pixels.
uint epr_get_scene_height (const EPR_SProductId *product_id)
 Gets the product's scene height in pixels.

Function Documentation

uint epr_get_scene_width ( const EPR_SProductId product_id  ) 

Gets the product's scene width in pixels.

Parameters:
product_id the product identifier, must not be NULL
Returns:
the product's total scene width in pixels, or 0 if an error occured.
uint epr_get_scene_height ( const EPR_SProductId product_id  ) 

Gets the product's scene height in pixels.

Parameters:
product_id the product identifier, must not be NULL
Returns:
the product's total scene height in pixels, or 0 if an error occured.

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__DATASET.html000066400000000000000000000515571142554441000226210ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Dataset Access
[Basic Data Access]

Functions

uint epr_get_num_datasets (EPR_SProductId *product_id)
 Gets the number off all datasets contained in a product.
EPR_SDatasetIdepr_get_dataset_id_at (EPR_SProductId *product_id, uint index)
 Gets the dataset_id at the specified position within the product.
EPR_SDatasetIdepr_get_dataset_id (EPR_SProductId *product_id, const char *dataset_name)
 Gets the dataset_id coresponding to the specified dataset name.
const char * epr_get_dataset_name (EPR_SDatasetId *dataset_id)
 Gets the name of the dataset for the given dataset ID.
const char * epr_get_dsd_name (const EPR_SDatasetId *dataset_id)
 Gets the name of the dsd for the given dataset ID.
EPR_SRecordepr_get_mph (const EPR_SProductId *product_id)
 Gets the MPH record from the given product_id.
EPR_SRecordepr_get_sph (const EPR_SProductId *product_id)
 Gets the SPH record from the given product_id.
const EPR_SDSDepr_get_dsd (const EPR_SDatasetId *dataset_id)
 Gets the dataset descriptor (DSD) for the dataset specified by dataset_id.
uint epr_get_num_records (const EPR_SDatasetId *dataset_id)
 Gets the number of records of the dataset specified by dataset_id.
uint epr_get_num_dsds (const EPR_SProductId *product_id)
EPR_SDSDepr_get_dsd_at (const EPR_SProductId *product_id, uint dsd_index)

Function Documentation

uint epr_get_num_datasets ( EPR_SProductId product_id  ) 

Gets the number off all datasets contained in a product.

Parameters:
product_id the product identifier, must not be NULL
Returns:
the number off all dataset
EPR_SDatasetId* epr_get_dataset_id_at ( EPR_SProductId product_id,
uint  index 
)

Gets the dataset_id at the specified position within the product.

Parameters:
product_id the product identifier, must not be NULL
index the index identifying the position of the dataset, starting with 0, must not be negative
Returns:
the requested dataset_id
EPR_SDatasetId* epr_get_dataset_id ( EPR_SProductId product_id,
const char *  dataset_name 
)

Gets the dataset_id coresponding to the specified dataset name.

Parameters:
product_id the product identifier, must not be NULL
dataset_name the dataset name, must not be NULL
Returns:
the requested dataset_id
const char* epr_get_dataset_name ( EPR_SDatasetId dataset_id  ) 

Gets the name of the dataset for the given dataset ID.

Parameters:
dataset_id the dataset identifier, must not be NULL
Returns:
the name of the dataset.
const char* epr_get_dsd_name ( const EPR_SDatasetId dataset_id  ) 

Gets the name of the dsd for the given dataset ID.

Parameters:
dataset_id the dataset identifier, must not be NULL
Returns:
the name of the dsd.
EPR_SRecord* epr_get_mph ( const EPR_SProductId product_id  ) 

Gets the MPH record from the given product_id.

Parameters:
product_id the product identifier, must not be NULL
Returns:
the MPH record or NULL if an error occured.
EPR_SRecord* epr_get_sph ( const EPR_SProductId product_id  ) 

Gets the SPH record from the given product_id.

Parameters:
product_id the product identifier, must not be NULL
Returns:
the SPH record or NULL if an error occured.
const EPR_SDSD* epr_get_dsd ( const EPR_SDatasetId dataset_id  ) 

Gets the dataset descriptor (DSD) for the dataset specified by dataset_id.

Parameters:
dataset_id the dataset identifier, must not be NULL
Returns:
the pointer at the dsd or NULL if an error occured.
uint epr_get_num_records ( const EPR_SDatasetId dataset_id  ) 

Gets the number of records of the dataset specified by dataset_id.

Parameters:
dataset_id the dataset identifier, must not be NULL
Returns:
the number of records or 0 if an error occured.
uint epr_get_num_dsds ( const EPR_SProductId product_id  ) 
EPR_SDSD* epr_get_dsd_at ( const EPR_SProductId product_id,
uint  dsd_index 
)

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__ERROR.html000066400000000000000000000164601142554441000224170ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Error Handling

Functions

void epr_set_err_handler (EPR_FErrHandler err_handler)
 Sets the error handler for the ENVISAT API.
EPR_EErrCode epr_get_last_err_code ()
 Gets the error code of the error that occured during the last API function call.
const char * epr_get_last_err_message ()
 Gets the error message of the error that occured during the last API function call.
void epr_clear_err ()
 Clears the last error.

Function Documentation

void epr_set_err_handler ( EPR_FErrHandler  err_handler  ) 

Sets the error handler for the ENVISAT API.

Parameters:
err_handler the new error handler (function pointer), can be NULL, if errors shall not be reported
EPR_EErrCode epr_get_last_err_code (  ) 

Gets the error code of the error that occured during the last API function call.

Returns:
the error code, e_err_none or zero if no error occured
const char* epr_get_last_err_message (  ) 

Gets the error message of the error that occured during the last API function call.

Returns:
the error message, NULL if no error occured
void epr_clear_err (  ) 

Clears the last error.

After calling this function, calling epr_get_last_err_code returns e_err_none or zero and epr_get_last_err_message returns NULL.


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__FA.html000066400000000000000000000404641142554441000220150ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Field Access
[Basic Data Access]

Functions

const EPR_SFieldepr_get_field (const EPR_SRecord *record, const char *field_name)
 Gets a field from the given record.
uint epr_get_num_fields (const EPR_SRecord *record)
 Gets the number of fields contained in the given record.
const EPR_SFieldepr_get_field_at (const EPR_SRecord *record, uint field_index)
 Gets a field at the specified position within the record.
const char * epr_get_field_unit (const EPR_SField *field)
 Gets the unit of the field.
const char * epr_get_field_description (const EPR_SField *field)
 Gets the description of the field.
uint epr_get_field_num_elems (const EPR_SField *field)
 Gets the number of elements of the field.
const char * epr_get_field_name (const EPR_SField *field)
 Gets the name of the field.
EPR_EDataTypeId epr_get_field_type (const EPR_SField *field)
 Gets the type of the field.

Function Documentation

const EPR_SField* epr_get_field ( const EPR_SRecord record,
const char *  field_name 
)

Gets a field from the given record.

The field is here identified through the given name.
It contains the field info and all corresponding values.

Parameters:
record the record identifier, must not be NULL
field_name the the name of required field, must not be NULL.
Returns:
the field or NULL if an error occured.
uint epr_get_num_fields ( const EPR_SRecord record  ) 

Gets the number of fields contained in the given record.

Parameters:
record the record to be analysed, must not be NULL
Returns:
the fields number or 0 if an error occured.
const EPR_SField* epr_get_field_at ( const EPR_SRecord record,
uint  field_index 
)

Gets a field at the specified position within the record.

Parameters:
record the record from the field shall be returned, must not be NULL
field_index the zero-based index (position within record) of the field
Returns:
the field or NULL if an error occured.
const char* epr_get_field_unit ( const EPR_SField field  ) 

Gets the unit of the field.

Parameters:
field the field from which the unit shall be returned, must not be NULL
Returns:
the field unit or NULL if an error occured.
const char* epr_get_field_description ( const EPR_SField field  ) 

Gets the description of the field.

Parameters:
field field from which the description shall be returned, must not be NULL
Returns:
the field description or NULL if an error occured.
uint epr_get_field_num_elems ( const EPR_SField field  ) 

Gets the number of elements of the field.

Parameters:
field field to be analysed, must not be NULL
Returns:
the number of elements of the field or 0 if an error occured.
const char* epr_get_field_name ( const EPR_SField field  ) 

Gets the name of the field.

Parameters:
field field to be analysed, must not be NULL
Returns:
the field name or NULL if an error occured.
EPR_EDataTypeId epr_get_field_type ( const EPR_SField field  ) 

Gets the type of the field.

Parameters:
field field to be analysed, must not be NULL
Returns:
the field type or 0 if an error occured.

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__FAEA.html000066400000000000000000000262461142554441000222250ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Field Array Element Access This group of functions is for getting an array of field elements
[Basic Data Access]

of a certain data type. More...

Functions

const char * epr_get_field_elems_char (const EPR_SField *field)
const ucharepr_get_field_elems_uchar (const EPR_SField *field)
const short * epr_get_field_elems_short (const EPR_SField *field)
const ushortepr_get_field_elems_ushort (const EPR_SField *field)
const int * epr_get_field_elems_int (const EPR_SField *field)
const uintepr_get_field_elems_uint (const EPR_SField *field)
const float * epr_get_field_elems_float (const EPR_SField *field)
const double * epr_get_field_elems_double (const EPR_SField *field)

Detailed Description

of a certain data type.

If the given field is not of the expected type, the functions return NULL.

Parameters:
field the field, must not be NULL
Returns:
the data array of the expected type or NULL if the field is of a different type

Function Documentation

const char* epr_get_field_elems_char ( const EPR_SField field  ) 
const uchar* epr_get_field_elems_uchar ( const EPR_SField field  ) 
const short* epr_get_field_elems_short ( const EPR_SField field  ) 
const ushort* epr_get_field_elems_ushort ( const EPR_SField field  ) 
const int* epr_get_field_elems_int ( const EPR_SField field  ) 
const uint* epr_get_field_elems_uint ( const EPR_SField field  ) 
const float* epr_get_field_elems_float ( const EPR_SField field  ) 
const double* epr_get_field_elems_double ( const EPR_SField field  ) 

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__FSEA.html000066400000000000000000000415601142554441000222430ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Field Single Element Access
[Basic Data Access]

This group of functions is for getting the elements of a field as a typed value. More...

Functions

char epr_get_field_elem_as_char (const EPR_SField *field, uint elem_index)
uchar epr_get_field_elem_as_uchar (const EPR_SField *field, uint elem_index)
short epr_get_field_elem_as_short (const EPR_SField *field, uint elem_index)
ushort epr_get_field_elem_as_ushort (const EPR_SField *field, uint elem_index)
int epr_get_field_elem_as_int (const EPR_SField *field, uint elem_index)
uint epr_get_field_elem_as_uint (const EPR_SField *field, uint elem_index)
float epr_get_field_elem_as_float (const EPR_SField *field, uint elem_index)
double epr_get_field_elem_as_double (const EPR_SField *field, uint elem_index)
const EPR_STimeepr_get_field_elem_as_mjd (const EPR_SField *field)
const char * epr_get_field_elem_as_str (const EPR_SField *field)

Detailed Description

This group of functions is for getting the elements of a field as a typed value.


Typed value means that the returned variable is of a certain variable type, e.g. such as short or float.
The type is located in the field info. See epr_get_field_type.
One field must have one type only.

Parameters:
field the field, must not be NULL
elem_index the zero-based index of element to be returned, must not be negative.
Returns:
the typed value from given field

Function Documentation

char epr_get_field_elem_as_char ( const EPR_SField field,
uint  elem_index 
)
uchar epr_get_field_elem_as_uchar ( const EPR_SField field,
uint  elem_index 
)
short epr_get_field_elem_as_short ( const EPR_SField field,
uint  elem_index 
)
ushort epr_get_field_elem_as_ushort ( const EPR_SField field,
uint  elem_index 
)
int epr_get_field_elem_as_int ( const EPR_SField field,
uint  elem_index 
)
uint epr_get_field_elem_as_uint ( const EPR_SField field,
uint  elem_index 
)
float epr_get_field_elem_as_float ( const EPR_SField field,
uint  elem_index 
)
double epr_get_field_elem_as_double ( const EPR_SField field,
uint  elem_index 
)
const EPR_STime* epr_get_field_elem_as_mjd ( const EPR_SField field  ) 
const char* epr_get_field_elem_as_str ( const EPR_SField field  ) 

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__GDA.html000066400000000000000000000052031142554441000221120ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Geopysical Data Access

Modules

 Raster Data Access
 Single Pixel Access

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__INIT.html000066400000000000000000000144421142554441000222670ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

API Initialisation

Functions

int epr_init_api (EPR_ELogLevel log_level, EPR_FLogHandler log_handler, EPR_FErrHandler err_handler)
 Initializes the ENVISAT product reader API.
void epr_close_api ()
 Closes the ENVISAT product reader API by releasing all resources allocated by the API.

Function Documentation

int epr_init_api ( EPR_ELogLevel  log_level,
EPR_FLogHandler  log_handler,
EPR_FErrHandler  err_handler 
)

Initializes the ENVISAT product reader API.

Parameters:
log_level the log level. All logging messages with a log level lower than the given one, will be supressed
log_handler the log handler function pointer which will be used for logging, can be NULL, if logging shall be disabled
err_handler the new error handler (function pointer), can be NULL, if errors shall not be reported
Returns:
zero for success, an error code otherwise
Author:
Norman Fomferra
void epr_close_api (  ) 

Closes the ENVISAT product reader API by releasing all resources allocated by the API.

Author:
Norman Fomferra

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__IO.html000066400000000000000000000054661142554441000220410ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Input / Output

Modules

 Product IO
 Writing to a file or standard output
 

This group of functions is for writing an object to a file or standard output.



Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__LOGGING.html000066400000000000000000000175021142554441000226120ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Logging

Functions

int epr_set_log_level (EPR_ELogLevel log_level)
 Sets the log level for the ENVISAT API.
void epr_set_log_handler (EPR_FLogHandler log_handler)
 Sets the log handler for the ENVISAT API.
void epr_log_message (EPR_ELogLevel log_level, const char *log_message)
 A default implementation for a logging function to be passed into the epr_init() function.

Function Documentation

int epr_set_log_level ( EPR_ELogLevel  log_level  ) 

Sets the log level for the ENVISAT API.

All logging messages with a log level lower than the given one, will be supressed, thus the log handler will not be called for such messages.

Parameters:
log_level the new log level. All logging messages with a log level lower than the given one, will be supressed
Returns:
zero for success, an error code otherwise
void epr_set_log_handler ( EPR_FLogHandler  log_handler  ) 

Sets the log handler for the ENVISAT API.

Parameters:
log_handler the log handler function pointer which will be used for logging, can be NULL, if logging shall be disabled
See also:
epr_log_message
void epr_log_message ( EPR_ELogLevel  log_level,
const char *  log_message 
)

A default implementation for a logging function to be passed into the epr_init() function.

The function writes to stdout, the format is: log_level date time log_message.

Parameters:
log_level the log level
log_message the log message

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__ProductIO.html000066400000000000000000000140531142554441000233720ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Product IO
[Input / Output]

Functions

EPR_SProductIdepr_open_product (const char *product_file_path)
 Opens the ENVISAT product file with the given file path,
reads MPH, SPH and all DSDs,
organized the table with parameter of line length and tie points number;
returns a file identifier for the product.
int epr_close_product (EPR_SProductId *product_id)
 Closes the ENVISAT product file determined by the given product identifier.

Function Documentation

EPR_SProductId* epr_open_product ( const char *  product_file_path  ) 

Opens the ENVISAT product file with the given file path,
reads MPH, SPH and all DSDs,
organized the table with parameter of line length and tie points number;
returns a file identifier for the product.

The ENVISAT product reader API must be initialized before.

Parameters:
product_file_path the path to the ENVISAT product file
Returns:
the product identifier, or NULL if the file could not be opened. epr_get_error_code() should be called in this case in order to obtain the error code.
int epr_close_product ( EPR_SProductId product_id  ) 

Closes the ENVISAT product file determined by the given product identifier.

Parameters:
product_id the product identifier, if NULL the function immediately returns zero.
Returns:
zero for success, an error code otherwise

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__RASTER.html000066400000000000000000001117401142554441000225230ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Raster Data Access
[Geopysical Data Access]

Functions

EPR_SRasterepr_create_compatible_raster (EPR_SBandId *band_id, uint source_width, uint source_height, uint source_step_x, uint source_step_y)
 Creates a raster which is compatible with the data type contained in the band identified by band_id.
EPR_SRasterepr_create_raster (EPR_EDataTypeId data_type, uint source_width, uint source_height, uint source_step_x, uint source_step_y)
 Creates a raster of the specified data type.
EPR_SRasterepr_create_bitmask_raster (uint source_width, uint source_height, uint source_step_x, uint source_step_y)
 Creates a raster to be used for reading bitmasks.
int epr_read_band_raster (EPR_SBandId *band_id, int offset_x, int offset_y, EPR_SRaster *raster)
 Reads (geo-)physical values of the given band of the specified source-region.
uint epr_get_raster_elem_size (const EPR_SRaster *raster)
void * epr_get_raster_elem_addr (const EPR_SRaster *raster, uint offset)
void * epr_get_raster_pixel_addr (const EPR_SRaster *raster, uint x, uint y)
void * epr_get_raster_line_addr (const EPR_SRaster *raster, uint y)
uint epr_get_raster_width (EPR_SRaster *raster)
 Gets the raster's scene width in pixels.
uint epr_get_raster_height (EPR_SRaster *raster)
 Gets the raster's scene height in pixels.
uint epr_get_num_bands (EPR_SProductId *product_id)
 Gets the number of all bands contained in a product.
EPR_SBandIdepr_get_band_id_at (EPR_SProductId *product_id, uint index)
 Gets the band ID at the specified position within the product.
EPR_SBandIdepr_get_band_id (EPR_SProductId *product_id, const char *band_name)
 Gets the band ID corresponding to the specified name.
const char * epr_get_band_name (EPR_SBandId *band_id)
 Gets the name of the band for the given band ID.
void epr_free_raster (EPR_SRaster *raster)
 Release the memory allocated through a raster.

Function Documentation

EPR_SRaster* epr_create_compatible_raster ( EPR_SBandId band_id,
uint  source_width,
uint  source_height,
uint  source_step_x,
uint  source_step_y 
)

Creates a raster which is compatible with the data type contained in the band identified by band_id.

The created raster is used to read the data in it (see epr_read_band_raster).

The raster is defined on the grid of the product, from which the data are read. Spatial subsets and undersampling are possible) through the parameter of the function.

The concept of defining the raster is such: A certain portion of the ENVISAT product will be read into the raster. This is called the source. The complete ENVISAT product can be much greater than the source. One can move the raster over the complete ENVISAT product and read in turn different parts - always of the size of the source - of it into the raster. The source is specified by the parameter source_height and source_width.

A typical example is a processing in blocks. Lets say, a block has 64x32 pixel. Then, my source has a width of 64 pixel and a height of 32 pixel. Another example is a processing of complete image lines. Then, my source has a widths of the complete product (for example 1121 for a MERIS RR product), and a height of 1). One can loop over all blocks read into the raster and process it.

In addition, it is possible to defined a subsampling step for a raster. This means, that the source is not read 1:1 into the raster, but that only every 2nd or 3rd pixel is read. This step can be set differently for the across track (source_step_x) and along track (source_step_y) directions.

Parameters:
band_id the band identifier. The raster will be compatible with the data type of that band; must not be NULL
source_width the width (across track dimension) of the source to be read into the raster. See text above.
source_height the height (along track dimension) of the source to be read into the raster. See text above.
source_step_x the subsampling step across track of the source when reading into the raster. See text above.
source_step_y the subsampling step along track of the source when reading into the raster. See text above.
Returns:
the new raster instance or NULL if an error occured.
EPR_SRaster* epr_create_raster ( EPR_EDataTypeId  data_type,
uint  source_width,
uint  source_height,
uint  source_step_x,
uint  source_step_y 
)

Creates a raster of the specified data type.

This function can be used to create any type of raster, e.g. for later use as a bit-mask.

Parameters:
data_type the type of the data to stored in the raster, must not be NULL
source_width the width (across track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster.
source_height the height (along track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster.
source_step_x the subsampling step across track of the source when reading into the raster. See description of epr_create_compatible_raster.
source_step_y the subsampling step along track of the source when reading into the raster. See description of epr_create_compatible_raster.
Returns:
the new raster instance or NULL if an error occured.
EPR_SRaster* epr_create_bitmask_raster ( uint  source_width,
uint  source_height,
uint  source_step_x,
uint  source_step_y 
)

Creates a raster to be used for reading bitmasks.

The raster returned always is of type byte.

Parameters:
source_width the width (across track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster.
source_height the height (along track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster.
source_step_x the subsampling step across track of the source when reading into the raster. See description of epr_create_compatible_raster.
source_step_y the subsampling step along track of the source when reading into the raster. See description of epr_create_compatible_raster.
Returns:
the new raster instance or NULL if an error occured.
int epr_read_band_raster ( EPR_SBandId band_id,
int  offset_x,
int  offset_y,
EPR_SRaster raster 
)

Reads (geo-)physical values of the given band of the specified source-region.

The source-region is a defined part of the whole ENVISAT product image, which shall be read into a raster. In this routine the co-ordinates are specified, where the source-region to be read starts. The dimension of the region and the sub-sampling are attributes of the raster into which the data are read.

Parameters:
band_id the identified of the band to be read into the raster.
offset_x across-track source co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region
offset_y along-track source co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region
raster the identifier to given raster information and raster buffer
Returns:
zero for success, and error code otherwise
See also:
epr_create_compatible_raster
epr_create_rater
uint epr_get_raster_elem_size ( const EPR_SRaster raster  ) 
void* epr_get_raster_elem_addr ( const EPR_SRaster raster,
uint  offset 
)
void* epr_get_raster_pixel_addr ( const EPR_SRaster raster,
uint  x,
uint  y 
)
void* epr_get_raster_line_addr ( const EPR_SRaster raster,
uint  y 
)
uint epr_get_raster_width ( EPR_SRaster raster  ) 

Gets the raster's scene width in pixels.

Parameters:
raster the raster identifier, must not be NULL
Returns:
the raster's total scene width in pixels, or 0 if an error occured.
uint epr_get_raster_height ( EPR_SRaster raster  ) 

Gets the raster's scene height in pixels.

Parameters:
raster the product identifier, must not be NULL
Returns:
the raster's total scene height in pixels, or 0 if an error occured.
uint epr_get_num_bands ( EPR_SProductId product_id  ) 

Gets the number of all bands contained in a product.

Parameters:
product_id the source product ID, must not be NULL
Returns:
the number off all bands
EPR_SBandId* epr_get_band_id_at ( EPR_SProductId product_id,
uint  index 
)

Gets the band ID at the specified position within the product.

Parameters:
product_id the source product ID, must not be NULL
index the index identifying the position of the band, starting with 0, must not be negative
Returns:
the requested band ID, or NULL if not found
EPR_SBandId* epr_get_band_id ( EPR_SProductId product_id,
const char *  band_name 
)

Gets the band ID corresponding to the specified name.

Parameters:
product_id the source product ID, must not be NULL
band_name the name of the band, must not be NULL
Returns:
the requested band ID, or NULL if not found
const char* epr_get_band_name ( EPR_SBandId band_id  ) 

Gets the name of the band for the given band ID.

Parameters:
band_id the band identifier, must not be NULL
Returns:
the name of the band.
void epr_free_raster ( EPR_SRaster raster  ) 

Release the memory allocated through a raster.

Parameters:
raster the raster to be released.

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__REC.html000066400000000000000000000212151142554441000221310ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Record Access
[Basic Data Access]

Functions

EPR_SRecordepr_create_record (EPR_SDatasetId *dataset_id)
 Creates a new, empty record with a structure compatible with the dataset specified by dataset_id.
EPR_SRecordepr_read_record (EPR_SDatasetId *dataset_id, uint record_index, EPR_SRecord *record)
 Reads a record of a dataset specified by dataset_id.
void epr_free_record (EPR_SRecord *record)
 Frees the memory allocated through the given record.

Function Documentation

EPR_SRecord* epr_create_record ( EPR_SDatasetId dataset_id  ) 

Creates a new, empty record with a structure compatible with the dataset specified by dataset_id.

Such a record is typically used in subsequent calls to epr_read_record.

Parameters:
dataset_id the dataset identifier, must not be NULL
Returns:
the new record instance or NULL if an error occured.
EPR_SRecord* epr_read_record ( EPR_SDatasetId dataset_id,
uint  record_index,
EPR_SRecord record 
)

Reads a record of a dataset specified by dataset_id.

The record is identified through the given dataset identifier and the given zero-based record index. In order to reduce memory reallocation, a record (pre-) created by the function epr_create_record can be passed to this function. Data is then read into this given record. If no record (NULL) is given, the function initiates a new one. In both cases, the record in which the data is read into will be returned.

Parameters:
dataset_id the dataset identifier, must not be NULL
record_index the zero-based record index
record a pre-created record to reduce memory reallocation, can be NULL to let the function allocate a new record
Returns:
the record in which the data has been read into or NULL if an error occured.
void epr_free_record ( EPR_SRecord record  ) 

Frees the memory allocated through the given record.

After calling this function the given record pointer becomes invalid and should not be used anymore.


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__SPA.html000066400000000000000000000220361142554441000221450ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Single Pixel Access
[Geopysical Data Access]

Functions

uint epr_get_pixel_as_uint (const EPR_SRaster *raster, int x, int y)
 This group of functions is for getting the values of the elements of a raster (i.e.
int epr_get_pixel_as_int (const EPR_SRaster *raster, int x, int y)
float epr_get_pixel_as_float (const EPR_SRaster *raster, int x, int y)
double epr_get_pixel_as_double (const EPR_SRaster *raster, int x, int y)

Function Documentation

uint epr_get_pixel_as_uint ( const EPR_SRaster raster,
int  x,
int  y 
)

This group of functions is for getting the values of the elements of a raster (i.e.

pixel) in a type-safe way.

Parameters:
raster the raster which contains the pixel, must not be NULL
x the (zero-based) X co-ordinate of the pixel
y the (zero-based) Y co-ordinate of the pixel
Returns:
the typed value at the given co-ordinate.
int epr_get_pixel_as_int ( const EPR_SRaster raster,
int  x,
int  y 
)
float epr_get_pixel_as_float ( const EPR_SRaster raster,
int  x,
int  y 
)
double epr_get_pixel_as_double ( const EPR_SRaster raster,
int  x,
int  y 
)

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__UTILS.html000066400000000000000000000117431142554441000224250ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Utility Functions

Functions

uint epr_get_data_type_size (EPR_EDataTypeId data_type_id)
 Gets the size in bytes for an element of the given data type.
const char * epr_data_type_id_to_str (EPR_EDataTypeId data_type_id)
 Gets the 'C' data type string for the given data type.

Function Documentation

uint epr_get_data_type_size ( EPR_EDataTypeId  data_type_id  ) 

Gets the size in bytes for an element of the given data type.

const char* epr_data_type_id_to_str ( EPR_EDataTypeId  data_type_id  ) 

Gets the 'C' data type string for the given data type.


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/group__WtFoSO.html000066400000000000000000000275501142554441000226510ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

Writing to a file or standard output
[Input / Output]

This group of functions is for writing an object to a file or standard output. More...

Functions

void epr_print_record (const EPR_SRecord *record, FILE *ostream)
void epr_print_field (const EPR_SField *field, FILE *ostream)
void epr_print_element (const EPR_SRecord *record, uint field_index, uint element_index, FILE *ostream)
void epr_dump_record (const EPR_SRecord *record)
void epr_dump_field (const EPR_SField *field)
void epr_dump_element (const EPR_SRecord *record, uint field_index, uint element_index)

Detailed Description

This group of functions is for writing an object to a file or standard output.

An object can be:

  • record
  • field
  • field element

If FILE* istream is given, the ASCII file will be outputed, else printed to standard output device.

In case record and/or field:

Parameters:
record the record, must not be NULL
field the field, must not be NULL

In case field element:

Parameters:
record the record, must not be NULL
field_index the index of field in the given record
element_index the index of element in the given field
ostream the identifier of the output file.

Function Documentation

void epr_print_record ( const EPR_SRecord record,
FILE *  ostream 
)
void epr_print_field ( const EPR_SField field,
FILE *  ostream 
)
void epr_print_element ( const EPR_SRecord record,
uint  field_index,
uint  element_index,
FILE *  ostream 
)
void epr_dump_record ( const EPR_SRecord record  ) 
void epr_dump_field ( const EPR_SField field  ) 
void epr_dump_element ( const EPR_SRecord record,
uint  field_index,
uint  element_index 
)

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/index.html000066400000000000000000000433221142554441000212570ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

ENVISAT Product Reader C API Documentation

2.2

1. Introduction

The ENVISAT Product Reader API for C (epr-c-api) is a library of data structures and functions for simple access to MERIS, AATSR and ASAR products. You can use them in your programs to retrieve directly the geophysically coded values, e.g. such as the chlorophyll concentration in mg/m³, in a data matrix.

The epr-c-api is generic, i.e. it has no instrument specific functions but utilises the generic ENVISAT product format. However, it is not necessary for a user of the epr-c-api to know the ENVISAT product format - the epr-c-api knows it, and that's sufficient.

All a user of the epr-c-api has to know are a few functions and the name of the geophysical variable he wants to get. In fact, the epr-c-api can do more: all information stored in ENVISAT products can be retrieved in a unique way, just by requesting it identified by its name, without worrying too much where and how it is stored in the world of the ENVISAT product format.

Now, here's the tricky bit: there are many different products and the number of items stored in each product is huge. Therefore a ENVISAT Data Products documentation is included in the BEAM software homepage, which describes the internal structure of each supported product. In order to access a certain item such as a dataset, record, band or flag you have to consult the data product documentation for he correct name or ID for the dataset, record, band or flag you want to access.

2. Using the API in your own C-Programs

The epr-c-api is written in pure ANSI C and should compile with every ANSI conformant C-compiler:

  1. Copy all *.h *.c files contained in the distribution's src folder to your own source folder of your project and include them in your development environment (makefile or IDE).
  2. Include the public API header epr-api.h in your C source files.
  3. Optionally refer to the example code in src/examples directory

3. API Design

3.1 Basic Concepts

Given here are some of the basic concepts of the API.

  • The API works exclusively with pointers to dynamically allocated structures. For every structure type in the API a constructor/desctructor function pair always exists: X epr_create_X(...) and void epr_free_X(X). Example: For the type EPR_SRecord* these functions are EPR_SRecord* epr_create_record(...) and void epr_free_record(EPR_SRecord*).
  • In most cases, the first parameter is the object on which the function is operating. For example, uint epr_get_num_fields(const EPR_SRecord* record).
  • Access functions exist for all important members of structures. So, the user of the API should not need to work directly with the API structures but with functions to get values. For example, if you use the epr_get_pixel_as_float to access a pixel value of raster, your code is less dependent on API changes as if you would have directly accessed a structure member.
  • A central concept is that all items, which can be retrieved from ENVISAT products, are identified by name. For example, to access the MERIS L1B radiance of band 1, you have to call epr_get_dataset_id(product_id, "Radiance_1") But how do you know, what name you should use for the data you want to retrieve? There are three possibilities:
    1. The ENVISAT Data Products documentation provides all valid names used in the all supported data products. All tables in the documentation have a similar structure, the first column is always contains the longed-for name.
    2. One can use VISAT to open a product. The names shown in VISAT in the product browser are the same as in the ENVISAT data product tables documentation and are hence those needed.
    3. One can open a product using the epr-c-api, scan all datasets in a look and print the names of the datasets and records by the access function. The same can be done with all fields of a record.

3.2 Data Access Types

The API provides two access types for ENVISAT data:

  1. Access of data as it is stored in the product (we call this basic or raw data access) and
  2. Access to the geophysical raster data (what we call this geophysical data access).

The difference between the two is how they treat the measurement data: Access type (1) returns the data in its native data product structure: as datasets, records and fields. This gives a direct read access to the raw data as it is stored in the data product, without any interpretation of the content. For example, the MERIS L1B measurement data set MDS 15 stores chlorophyll, vegetation index or cloud top height in the same byte. The content has to be interpreted depending on the surface type, which itself is coded in MDS 20. To get the true geophysical value one needs to retrieve the proper scaling factors from a certain GADS. Access type (2) decodes all this and provides, for example, a data matrix with the chlorophyll concentration in a float variable in its geophysical units, i.e. mg/m³. The data of the measurement datasets and the tie-point values, i.e. geometry, geo-location and meteorological data, are available by this method. The tie-point data are interpolated to the corresponding image grid.

3.3 Working with the Basic/Raw Data Access

Level Correspondence in ENVISAT product
Product ENVISAT product file
Dataset Dataset, e.g. Main Product Header MPH, or a Measurement Data Set MDS. A dataset contains records. For example, the MERIS L1b MDS1 contains many records with radiance values.
Record A single record within a dataset. A record contains many fields. For example, a record within the MERIS L1b MDS1 contains a time-stamp field, a quality flag field and then a field with as many radiance values as contained in the width of the image.
Field A field within a record. Fields can be a scalar or a vector. In the example, the time stamp and quality flag are scalars while the radiance field is a vector of the length of an image line.
Element Optional. If a field is a vector, these are the elements of that vector. In the example each element of the radiance field is the radiance of a certain pixel.

On each level of the hierarchy, functions exist to point to a certain instance of it, e.g. a certain product, dataset or record and so on. That function generally requires the name of the item to be retrieved. All possible names can be found in the DDDB , and the name of the most important items are listed here. The function returns an identifier of that instance. The identifier is not the instance but a pointer to it. It is used to get the values of the instance by using access functions.

For example,

my_product_id = epr_open_product("my_MERIS_product");

returns the identifier to the my_product_id which points to the product contained in the file "my_MERIS_product".

rad1_id = epr_get_dataset_id(my_product_id, "Radiance_1");

This my_product_id is used get the identifier rad1_id which points to the Radiance_1 dataset. Now, one can call

num_rec = epr_get_num_records(rad1_id);

to get the number of records which this dataset contains. Finally one can loop over all records and gets its fields and elements. See the examples to get a complete code example.

3.4 Working with Geophysical Data Access

To work with geophysical data is easier than the basic access. No such deep hierarchy exists. Instead of accessing datasets, so called bands will be accessed. A band directly includes one single geophysical variable.

For example,

my_product_id = epr_open_product(my_product_file_path);
my_chl_id = epr_create_band_id(my_product_id, "algal_1");

returns the identifier to a band containing the chlorophyll product. Now, the actual data are read into a raster.

chl_raster = epr_create_compatible_raster(my_chl_id, ...);
status = epr_read_band_raster(chl_raster, ...);

The raster chl_raster now contains the data as two dimensional matrix of pixel. To get the value of a pixel at a certain index (i,j), one should use the access function:

chl_pixel = epr_get_pixel_as_float(chl_raster, i, j);

(See also the examples ndvi.c for complete example codes.)

The concept of the raster allows spatial subsets and undersampling: A certain portion of the ENVISAT product will be read into the raster. This is called the source. The complete ENVISAT product can be much greater than the source. One can move the raster over the complete ENVISAT product and read in turn different parts - always of the size of the source - of it into the raster.

A typical example is a processing in blocks. Lets say, a block has 64x32 pixel. Then, the source has a width of 64 pixel and a height of 32 pixel. Another example is a processing of complete image lines. Then, the source has a widths of the complete product (for example 1121 for a MERIS RR product), and a height of 1. One can loop over all blocks or image lines, read into the raster and process it. It is, of course, also possible to define a raster of the size of the complete product.

In addition, it is possible to define a subsampling step for a raster. This means, that the source is not read 1:1 into the raster, but that only every 2nd or 3rd pixel is read. This step can be set differently for the across track and along track directions.

3.5 Bit masks

MERIS and AATSR provide many so called flags, which are binary information indicating a certain state of a pixel. For example, this can be a quality indicator, which, if set, indicates that the value of the pixel is invalid. Other example are a cloud flag, indicating that this pixel is a measurement above a cloud, or a coastline flag. The flags are stored in a packed format inside the ENVISAT products, but the epr-c-api provides a function to easily access the flags. It returns a bit-mask, which is a byte array that matches the corresponding image raster and is 1 where the flag is set and 0 elsewhere. Even more, this functions permits to formulate a bit-mask expression to combine any number of flags in a logical expression and returns the resulting combined bit-mask:

bm_expr = "flags.LAND OR flags.CLOUD";
status = epr_read_bitmask_raster(product_id, bm_expr, ..., bm_raster);

This is an example to get a bit-mask which masks out all land and cloud pixels. The names of the flags are found in the DDDB. The epr_read_bitmask_raster function read from product, identified by product_id, the flags and stores the resulting bit-mask in the raster bm_raster. See the examples for the complete code.

4. API Function Group Index

The epr-c-api provides the following group of functions:

(1) Initialisation Functions for setting up the environment of the API and releasing memory when the API is closed.
(2) Logging Functions to manage logging information
(3) Error handling Functions for determining the behaviour of the API in case of errors, and of getting information about runtime errors
(4) Input / Output Opening and closing ENVISAT products and writing data to a file or stdout.
(5) Basic data access Functions to retrieve raw data as stored in ENVISAT products
(6) Geophysical data access Functions to retrieve geophysically interpreted data in a raster matrix
(7) Bit masks Functions for generating bit masks from the flags included in ENVISAT products.

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/modules.html000066400000000000000000000071611142554441000216210ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C


Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__BandId.html000066400000000000000000000535001142554441000234020ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_BandId Struct Reference

The EPR_BandId structure contains information about a band within an ENVISAT product file which has been opened with the epr_open_product() API function. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
EPR_SProductIdproduct_id
 The ID of the product to which this band belongs to.
char * band_name
 The name as presented to the user in a band selection dialog (also known as spectral subset).
int spectr_band_index
 The (zero-based) spectral band index.
EPR_SDatasetRef dataset_ref
 The reference of the source dataset containing the raw data used to create the band's pixel values.
EPR_ESampleModel sample_model
 The sample model operation applied to the source dataset for getting the correct samples from the MDS (for example MERIS L2).
EPR_EDataTypeId data_type
 The data type of the band's pixel values.
EPR_EScalingMethod scaling_method
 The scaling method which must be applied to the raw source data in order to get the 'real' pixel values in geo-physical units.
float scaling_offset
 The scaling offset.
float scaling_factor
 The scaling factor.
char * bm_expr
 A bit-mask expression used to filter valid pixels.
EPR_SPtrArray * flag_coding
 The flag coding is a list of EPR_SFlag instances.
char * unit
 The geophysical unit for the band's pixel values.
char * description
 A short description of the band's contents.
epr_boolean lines_mirrored
 If true (=1) lines will be mirrored (flipped) after read into a raster in order to ensure a pixel ordering in raster X direction from WEST to EAST.

Detailed Description

The EPR_BandId structure contains information about a band within an ENVISAT product file which has been opened with the epr_open_product() API function.

A new EPR_BandId instance can be obtained with the epr_get_band_id() API function.

See also:
epr_open_product
epr_get_band_id

Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The ID of the product to which this band belongs to.

The name as presented to the user in a band selection dialog (also known as spectral subset).

The (zero-based) spectral band index.

-1 if this is not a spectral band.

The reference of the source dataset containing the raw data used to create the band's pixel values.

The external format used in the DDDB is MDS-name.field, where field is a one-based index (field=1 corresponds to the first field)

The sample model operation applied to the source dataset for getting the correct samples from the MDS (for example MERIS L2).

Possible values are:

  • * --> no operation (direct copy)
  • 1OF2 --> first byte of 2-byte interleaved MDS
  • 2OF2 --> second byte of 2-byte interleaved MDS
  • 0123 --> combine 3-bytes interleaved to 4-byte integer

The data type of the band's pixel values.

Possible values are:

  • * --> the datatype remains unchanged.
  • uint8_t --> 8-bit unsigned integer
  • uint32_t --> 32-bit unsigned integer
  • Float --> 32-bit IEEE floating point

The scaling method which must be applied to the raw source data in order to get the 'real' pixel values in geo-physical units.

Possible values are:

  • * --> no scaling applied
  • Linear_Scale --> linear scaling applied: y = offset + scale * x
  • Log_Scale --> logarithmic scaling applied: y = log10(offset + scale * x)

The scaling offset.

Possible values are:

  • * --> no offset provided (implies scaling_method=*)
  • const --> a floating point constant
  • GADS.field[.field2] --> value is provided in global annotation dataset with name GADS in field field. Optionally a second element index for multiple-element fields can be given too

The scaling factor.

Possible values are:

  • * --> no factor provided (implies scaling_method=*)
  • const --> a floating point constant
  • GADS.field[.field2] --> value is provided in global annotation dataset with name GADS in field field. Optionally a second element index for multiple-element fields can be given too

A bit-mask expression used to filter valid pixels.

All others are set to zero.

EPR_SPtrArray* EPR_BandId::flag_coding

The flag coding is a list of EPR_SFlag instances.

It determines each of the flags used in this band (= flags dataset). Each flag has a name, a bit-index and a description.

The geophysical unit for the band's pixel values.

A short description of the band's contents.

If true (=1) lines will be mirrored (flipped) after read into a raster in order to ensure a pixel ordering in raster X direction from WEST to EAST.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__DSD.html000066400000000000000000000302241142554441000226710ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_DSD Struct Reference

The EPR_DSD structure contains information about the propertier of a dataset properties and its location within an ENVISAT product file. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
int index
 The index of this DSD (zero-based).
char * ds_name
 The dataset name.
char * ds_type
 The dataset type descriptor.
char * filename
 The filename in the DDDB with the description of this dataset.
uint ds_offset
 The offset of dataset-information the product file.
uint ds_size
 The size of dataset-information in dataset product file.
uint num_dsr
 The number of dataset records for the given dataset name.
uint dsr_size
 The size of dataset record for the given dataset name.

Detailed Description

The EPR_DSD structure contains information about the propertier of a dataset properties and its location within an ENVISAT product file.

See also:
epr_read_each_dsd

Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The index of this DSD (zero-based).

The dataset name.

The dataset type descriptor.

The filename in the DDDB with the description of this dataset.

The offset of dataset-information the product file.

The size of dataset-information in dataset product file.

The number of dataset records for the given dataset name.

The size of dataset record for the given dataset name.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__DatasetId.html000066400000000000000000000321331142554441000241220ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_DatasetId Struct Reference

The EPR_DatasetId structure contains information about a dataset within an ENVISAT product file which has been opened with the epr_open_product() API function. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
EPR_SProductIdproduct_id
 The ID of the product to which this dataset belongs to.
char * dsd_name
 The name as presented to the user in a dsd selection dialog.
const EPR_SDSDdsd
 The dataset descriptor obtained from the current product.
char * dataset_name
 The name as presented to the user in a dataset selection dialog.
struct RecordDescriptor * record_descriptor
 The record descriptor found in the DDDB for this dataset.
EPR_SRecordInforecord_info
 The record info which describes a record of this dataset.
char * description
 A short description of the band's contents.

Detailed Description

The EPR_DatasetId structure contains information about a dataset within an ENVISAT product file which has been opened with the epr_open_product() API function.

A new EPR_DatasetId instance can be obtained with the epr_get_dataset_id() or epr_get_dataset_id_at() API functions.

See also:
epr_open_product
epr_get_dataset_id
epr_get_dataset_id_at

Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The ID of the product to which this dataset belongs to.

The name as presented to the user in a dsd selection dialog.

The dataset descriptor obtained from the current product.

The name as presented to the user in a dataset selection dialog.

struct RecordDescriptor* EPR_DatasetId::record_descriptor

The record descriptor found in the DDDB for this dataset.

The record info which describes a record of this dataset.

A short description of the band's contents.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__DatasetRef.html000066400000000000000000000150401142554441000243000ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_DatasetRef Struct Reference

The EPR_DatasetRef structure represents the information from dddb
with the reference to data name (in dddb), field-name and index of the element in field-array, in which (by name) searchable values are located. More...

#include <epr_api.h>

Data Fields

EPR_SDatasetIddataset_id
int field_index
int elem_index

Detailed Description

The EPR_DatasetRef structure represents the information from dddb
with the reference to data name (in dddb), field-name and index of the element in field-array, in which (by name) searchable values are located.

Example for the search for a scaling_offset information: This information for the reflec_10 is described with the Scaling_Factor_GADS.22.10 In dataset_id the searched ENVISAT product name (e.g. MER_RR__2P) is located.
In the corresponding file (e.g. /product/MER_RR__2P.dd) the path, how to find that information will be decribed. In that file, in the field number 22 there is an information about the location of the searched value in the ENVISAT product data.

See also:
EPR_SDatasetId

Field Documentation


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__Field.html000066400000000000000000000163401142554441000233050ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_Field Struct Reference

Represents a field within a record. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
EPR_SFieldInfoinfo
 The corresponding field info for this field.
void * elems
 The elements of this field.

Detailed Description

Represents a field within a record.

A field is composed of one or more data elements of one of the types defined in the in field_info.

See also:
EPR_Record

Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The corresponding field info for this field.

supplierCardinality 1

The elements of this field.

In order to use the data, this member must be casted to one of the following array data types:

  1. unsigned char* - array of unsigned 8-bit integer elements
  2. char* - array of signed 8-bit integer fields
  3. unsigned short* - array of unsigned 16-bit integer elements
  4. short* - array of signed 16-bit integer elements
  5. unsigned int* - array of unsigned 32-bit integer elements
  6. int* - array of signed 32-bit integer elements
  7. float* - array of signed 32-bit floating point elements
  8. double* - array of signed 64-bit floating point elements
  9. EPR_STime* - array of MJD elements

Dedicated access routine are available The element type is given by info->data_type_id and the array length by info->num_elems.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__FlagDef.html000066400000000000000000000154211142554441000235510ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_FlagDef Struct Reference

Represents a flag-field within a flag-record. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
char * name
 The flag name.
uint bit_mask
 The bit mask describing this flag.
char * description
 The flag description.

Detailed Description

Represents a flag-field within a flag-record.


Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The flag name.

The bit mask describing this flag.

The flag description.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__ProductId.html000066400000000000000000000472621142554441000241660ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_ProductId Struct Reference

The EPR_ProductId structure contains information about an ENVISAT product file which has been opened with the epr_open_product() function. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
char * file_path
 The file's path including the file name.
FILE * istream
 The input stream as returned by the ANSI C fopen function for the given file path.
uint tot_size
 The total size in bytes of the product file.
uint scene_width
 The total width of product's scene raster in pixels.
uint scene_height
 The total height of product's scene raster in pixels.
char id_string [EPR_PRODUCT_ID_STRLEN+1]
 The product identifier string obtained from the MPH parameter 'PRODUCT'.
EPR_SRecordmph_record
 The record representing the main product header (MPH).
EPR_SRecordsph_record
 The record representing the specific product header (SPH).
EPR_SPtrArray * dsd_array
 An array containing all (!) DSDs read from the product's specific product header (SPH).
EPR_SPtrArray * record_info_cache
 Cache for record infos.
EPR_SPtrArray * param_table
 A table containing dynamic field info parameters.
EPR_SPtrArray * dataset_ids
 Contains and array of all dataset IDs for the product (type EPR_SDatasetId*).
EPR_SPtrArray * band_ids
 Contains and array of all band IDs for the product (type EPR_SBandId*).
int meris_iodd_version
 For MERIS L1b and RR and FR to provide backward compatibility.

Detailed Description

The EPR_ProductId structure contains information about an ENVISAT product file which has been opened with the epr_open_product() function.

See also:
epr_open_product

Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The file's path including the file name.

The input stream as returned by the ANSI C fopen function for the given file path.

The total size in bytes of the product file.

The total width of product's scene raster in pixels.

The total height of product's scene raster in pixels.

char EPR_ProductId::id_string[EPR_PRODUCT_ID_STRLEN+1]

The product identifier string obtained from the MPH parameter 'PRODUCT'.

The first 10 characters of this string identify the the product type, e.g. "MER_1P__FR" for a MERIS Level 1b full resolution product. The rest of the string decodes product instance properties.

The record representing the main product header (MPH).

The record representing the specific product header (SPH).

EPR_SPtrArray* EPR_ProductId::dsd_array

An array containing all (!) DSDs read from the product's specific product header (SPH).

Cache for record infos.

Contains all record infos read from the database for this file so far.

The reason for caching record infos on a per-file-base is that a some record infos instances can contain file related content such as the number of pixels in a measurecment dataset record (MDSR).

A table containing dynamic field info parameters.

Dynamic field info parameters are created at runtime because the are derived from the product file contents and can not be staically stored in the record info database.

Contains and array of all dataset IDs for the product (type EPR_SDatasetId*).

EPR_SPtrArray* EPR_ProductId::band_ids

Contains and array of all band IDs for the product (type EPR_SBandId*).

For MERIS L1b and RR and FR to provide backward compatibility.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__Raster.html000066400000000000000000000331011142554441000235140ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_Raster Struct Reference

Represents a raster in which data will be stored. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
EPR_EDataTypeId data_type
 The data type of the band's pixel values.
uint elem_size
 The size in byte of a single element (sample) of this raster's buffer.
uint source_width
 The width of the source .
uint source_height
 The height of the source.
uint source_step_x
 The sub-sampling for the across-track direction in pixel.
uint source_step_y
 The sub-sampling for the along-track direction in pixel.
uint raster_width
 The width of the raster in pixel.
uint raster_height
 The height of the raster in pixel.
void * buffer
 The elements of this raster.

Detailed Description

Represents a raster in which data will be stored.

All 'size' parameter are in PIXEL.


Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The data type of the band's pixel values.


All corresponding with EPR_DataTypeId types are possible

The size in byte of a single element (sample) of this raster's buffer.

The width of the source .

The height of the source.

The sub-sampling for the across-track direction in pixel.

The sub-sampling for the along-track direction in pixel.

The width of the raster in pixel.


raster_width = (source_width - 1) / source_step_x + 1

The height of the raster in pixel.


raster_height = (source_height - 1) / source_step_y + 1

The elements of this raster.


Its volume is raster_width * raster_height * sizeof(data_type) in bytes.


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__Record.html000066400000000000000000000176501142554441000235050ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_Record Struct Reference

The EPR_Record structure represents a record instance read from an ENVISAT dataset. More...

#include <epr_api.h>

Data Fields

EPR_Magic magic
 The magic number for this structure.
EPR_SRecordInfoinfo
 The corresponding record info for this record (a 'soft' pointer).
uint num_fields
 The number of fields contained in this record.
EPR_SField ** fields
 The record fields.

Detailed Description

The EPR_Record structure represents a record instance read from an ENVISAT dataset.

A record is composed of multiple fields.

See also:
EPR_Field

Field Documentation

The magic number for this structure.

IMPORTANT: This must always be the first member of this structure.

The corresponding record info for this record (a 'soft' pointer).

The number of fields contained in this record.

The value is always equal info->field_infos->length and is provided here for convenience only.

The record fields.

An array of EPR_Field* of length info->num_fields


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/structEPR__Time.html000066400000000000000000000125421142554441000231600ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

EPR_Time Struct Reference

Represents a binary time value field in ENVISAT records. More...

#include <epr_api.h>

Data Fields

int days
uint seconds
uint microseconds

Detailed Description

Represents a binary time value field in ENVISAT records.

Refer to ENVISAT documentation for the exact definition of this data type.


Field Documentation


The documentation for this struct was generated from the following file:

Generated on Mon Aug 2 15:24:00 2010

ENVISAT Product Reader C API

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/epr_c_api/tab_b.gif000066400000000000000000000000431142554441000210110ustar00rootroot00000000000000GIF89a€„°Ç,D;bcdev-epr-api-a922482/docs/epr_c_api/tab_l.gif000066400000000000000000000013021142554441000210220ustar00rootroot00000000000000GIF89a ,Õö÷ùñô÷öøúüýþúûüùúûøùúêïóïóöÆÕßÒÞæØâéÞçíÝæìåìñèîòô÷ùóöø³ÈÕÁÒÝËÙâÏÜäÖá薴ŹɯÂÍ»ÎÙÃÔÞÂÓÝÈ×àÌÚâÕáèÙäê×âèåìðëðó„°ÇÑÞåÜæëãëïëñôîóõ÷úûûüüÿÿÿþþþ, ,ÿ@–P±É`H$!%CqVe2X­ŠÌJ(“Ä +€˜3 2$ÀÆ ¼kvŠä-Ëçõu*…"}ã|}|~q(" $f„ 'Žl(Œ&&$r‘™ › & ! )¢¤›{¨£¥r­ª°©¯„±¯¬´¦·»º³®«§¾¶ÃÂÀ¿²¹ÇÄËÆ²ÌÉεҽͼ„ÔÈÓ×иÙÝÕÏÙÊâÜßãçæê¾äÛÅëÇíáîÖìéïøñ÷õüÑðåùü¤Pß?‚ƒœÇÛBm åAœÎáÀ†%V܈î!Çk÷Ø/áÄ;^¤¨²$Æ–#Mf)f͇(WÎL‰“æKçÒ„° ’I)L:eD ¡Cµ´x*4 U¨h  %A«£^ÁNKb¬Ùe§X±‚´k»x!ÁÖí—2tÝÖ !¯š5tÛæé—À]$¬´%ƒXíâ.i[¬]Y­•ÊfžEëõkg`µ††:zëçÒž;£}ºµj×aa‹–Mš¶é׸cçž½»vïÛºƒóî›8ðáÈ‹'?®¼9óç©G_>Ýyuè¬_ßž]zwêß­‡Ç¾º¼mîæµG~½ûôÞთ/ž>ùööÙ«Ïÿ¿ÿýÿÅà|ÖWà}v;bcdev-epr-api-a922482/docs/epr_c_api/tab_r.gif000066400000000000000000000050311142554441000210330ustar00rootroot00000000000000GIF89a,Õö÷ùñô÷öøúüýþúûüùúûøùúêïóïóöÆÕßÒÞæØâéÞçíÝæìåìñèîòô÷ùóöø³ÈÕÁÒÝËÙâÏÜäÖá薴ŹɯÂÍ»ÎÙÃÔÞÂÓÝÈ×àÌÚâÕáèÙäê×âèåìðëðó„°ÇÑÞåÜæëãëïëñôîóõ÷úûûüüÿÿÿþþþ,,ÿ@’pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬v •h<¬pkL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~ÏwVa+‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ “*)^,*ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂö)'ÆÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæÚ¥(" ðñòóôõö÷øùúûüýþÿ H° ÁƒòK"ƒRHœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\éÅu&@€ Á²¦Í›8sêÜɳ§Oÿ–(±€DУH“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯S84± ‰hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€Ó} âDÌf(^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹m¹ðCÄHœXͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N÷ÃJ” Á®¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾úñ€ dÇ@€‚‚L¤"ÉÈF:ò‘Œ¤$9† (8…&ÉÉNzò“  ¥(G©FB^²!˨)WÉÊVºò•°l¤)1™ wÄò–¸Ì¥.wÊYºäƒà¥0‡IÌbó¾|ÉHpÌf:ó™Ðìe pJ±ˆ€}Ȧ6·ÉÍnzó›à §8û0Â%"¸æ8×ÉÎvºóðŒ§<ÉPÎQ`ò%×$€>÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'ZPKF Ö¼&16ÊÑŽzô£ ©HGJRb ÷Lç5ÏÁÒ–ºô¥ÿ0©LgJÓšš#(e>¯‰Óžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕª&5;%U·ÊÕ®zõ«` «XÇJV«ÂC§‹ÑjY×ÊÖ¶ºõ­p«\ŠU´À¦xÍ«^÷Ê×¾úõ¯ÐÀi)$‚”ô°ˆM¬bËØÆ:vˆ, ಘͬf7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­*$ÛSPô¶¸Í­nwËÛÞúö·ÀÅm +„â¸ÈM®r—ËÜæ:÷¹ÐE®?±9ÏêZ÷ºØÍ®v¿9€î"‚ºÛ ¯xÇKÞòb—™ÑLÿ¯z×Ë^A¢·½ð¯|ç†÷Ò÷¾øÍ¯0í«ßþú÷¿¡ä/€Là»×ÀN°‚ï(à;øÁ n0„'LaýJ¸ÂÎ0{/¬á{ؘþ°ˆG|Ë“øÄ(¥‰SÌâCrÅ.ޱŒ ãÛøÆv¬1ŽwÌc6ê¸Ç@ÞñƒLd¹ÈHNñ‘“Ìd/¹ÉPÎð“£LeO¹ÊXŽp–·|â+sùËýõ2˜ÇL_1“ùÌí53š×M5³ùÍÇt3œç¼_:ÛÙÂwÎs™õÌgøÊ¹Ï€p ýÌ?úÐ/F´¢ë¼èFãÒÐŽŽt!-éJã‘Ò–Îô1­éN»‘ÓžuÿA-êP“ºÔ>5ª3­êUWºÕ®Ž4¬cÝèYÓZѶ¾õ¡s­ëAóº×€þ5°ù,ìaç¹ØÆ¶3²“=çe3ûÍÎ~öš£-í3S»Úc¾6¶¿¬ímo¹ÛÞÆ2¸ÃMåq“Êæ>7“Ó­n$³»ÝD~7¼,ïyó¸ÞöÆ1¾ómã}óÛÈÿvµ¿Þâ\É/µÁNâ…3ÜÉ÷´Ã#Þá‰S\ÊguÆ-mñO¸ã0ÈC¾à‘“\Ë'_´ÉS^à•³|À.ùc.ó0לÐ4¿9~s®ó=÷¼Ï<ÿy|ƒ.ô4]ÏD?ºz“®ô67]ÙO§3Ó£ÞÌ©SÄW‡vÖÙl>õ­3Úëdî:Øu)ö±?ÚìÙF;˜Ë®öW²½í­|;ÜW)÷¹²îvtÞ˽w¾÷Ý|à×=xÂÞÝA;bcdev-epr-api-a922482/docs/epr_c_api/tabs.css000066400000000000000000000034641142554441000207300ustar00rootroot00000000000000/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ DIV.tabs { float : left; width : 100%; background : url("tab_b.gif") repeat-x bottom; margin-bottom : 4px; } DIV.tabs UL { margin : 0px; padding-left : 10px; list-style : none; } DIV.tabs LI, DIV.tabs FORM { display : inline; margin : 0px; padding : 0px; } DIV.tabs FORM { float : right; } DIV.tabs A { float : left; background : url("tab_r.gif") no-repeat right top; border-bottom : 1px solid #84B0C7; font-size : 80%; font-weight : bold; text-decoration : none; } DIV.tabs A:hover { background-position: 100% -150px; } DIV.tabs A:link, DIV.tabs A:visited, DIV.tabs A:active, DIV.tabs A:hover { color: #1A419D; } DIV.tabs SPAN { float : left; display : block; background : url("tab_l.gif") no-repeat left top; padding : 5px 9px; white-space : nowrap; } DIV.tabs #MSearchBox { float : right; display : inline; font-size : 1em; } DIV.tabs TD { font-size : 80%; font-weight : bold; text-decoration : none; } /* Commented Backslash Hack hides rule from IE5-Mac \*/ DIV.tabs SPAN {float : none;} /* End IE5-Mac hack */ DIV.tabs A:hover SPAN { background-position: 0% -150px; } DIV.tabs LI.current A { background-position: 100% -150px; border-width : 0px; } DIV.tabs LI.current SPAN { background-position: 0% -150px; padding-bottom : 6px; } DIV.navpath { background : none; border : none; border-bottom : 1px solid #84B0C7; text-align : center; margin : 2px; padding : 2px; } bcdev-epr-api-a922482/docs/footer.html000066400000000000000000000012311142554441000175160ustar00rootroot00000000000000

Generated on $datetime

$projectname

Written by Brockmann Consult, © 2002     Brockmann Consult      Eropean Space Agency

bcdev-epr-api-a922482/docs/header.html000066400000000000000000000020631142554441000174540ustar00rootroot00000000000000 ENVISAT Product Reader C API: Main Page
  ENVISAT Product Reader API for C

bcdev-epr-api-a922482/docs/images/000077500000000000000000000000001142554441000166025ustar00rootroot00000000000000bcdev-epr-api-a922482/docs/images/bc_logo.gif000066400000000000000000000021731142554441000207000ustar00rootroot00000000000000GIF89a÷DªðpEhV)9X+; C70'7XÓw? A©ín? Öx¡×x>5= ×w @ŸÕw ?B B4OrX:áõÏXfv§énCgT$4TBhQ&6T /S7s}‹šÑs2¢´œPbm —djŒ"2R AImW²Ü?9¾ÀÅ5)7Y¡ãj¥ðj @4 : 6¿ã¡15TOBµÈ¨ BNbf,P? DœÕv BÑÿŒ@cReŠcŽŒžÕwPUz?˜Ök3w‰‚<×t@šÚiÅû‰ESj\sk=AC¦ìkÿÿà @ 4axr C 5 ; 4¡×w E’Ôc¡äk=(7Y%GtŠ} =!D(K’Ðh¨Ø† > 7¢æm9©ðo<ž¢¸'Hñÿ·Qmb9WMrw¢çjAdT3B”Ôjñÿ©0CW#F 8AbS,CQ/P9 @DhVœÔvŸÖw>^SžÖw B<]S:9.Éã«­÷i8=;¦´¥Ql`=ªño 66&G> D;He®óo ?> :?'6X&6V'7V©ím8K[:HeÿÿÝ AETkWqj;56SNry”75Ba§ëm3˜Ôh";Em‰v!1N›Ùj˜ÚkÎú¢â÷Ì$3U BÏc+:X$F:–Óhak„; 9:8==VY4 9< B”—³6´àã÷Ãèÿ¤Ha^*8Y©ïp5LT5tŒ @¸í‚?4NL«Ü€ 3:GhV°½« <:šÒrœ}›Òq@Mi ×x(8W!Dÿÿÿ!ù,ÿåÉvf …2,aôÈ NÄØÁ« r¡yÒ®Š_ÀvÁYg‹… >µÆñ´!œ%>H}”ìÁ„Yé"dâÇ%rH6pêªâpJ[6rº¢".ÂHÜÞÁ‹€Ž=‚®™™ÔFK<ÓÐÚ5ˆJÐÖ|Z†!ƒ¹D€°5Æ–^X8Ð᪔º+±$èåoŒ¯.zŽ”¥ Óœo&èe‹*»>œ`M@†!L@¬Ý @ i yaÏ 1'’ØaKmA+0 àz.ž'3Îùa[AZ¥Wƒ¢ 9Æ Â-cM qa+Š™6¼éX ¥(Ó³þtj´5^´PDIq'‡&tdš‰¸Ql×®.6¦ °Ä ’X#K0< ò_WAˆ8#=à!;-À3À‡j CBÛ$PC*_T#P@;bcdev-epr-api-a922482/docs/images/beam_header.gif000066400000000000000000000035651142554441000215160ustar00rootroot00000000000000GIF89aã÷ÿ·bÿÍk­F-÷­]ÑzD²M0Ÿ3%Äf<éžU‰ÿÂfå”Q… áNÂf:–°J/›*"ŒêšSöµ_å’O¸Y5Œ܆J– Ëq@Ø‚H”ÿ¾fàNߌL 0%Œ÷ª[ò¥Xï¡W”޼]7”àN܉KÙ…IÕHþ¸aÌr@Çl?Çl<ž/%¾^8ºX5¸V4ÝL“ްK/ËrA©>*§=*’¢4&¹U5·T3´O2… ‡™'!„Žÿ¿e¯I.•Žÿ¾eµQ2ÿ½eŽŒ“Ø‚G‘ÐyDÿ½d»Y6ü¸b”Ém?ÿÁeÿÀeºX6“¥;)Èn>Ìq@½]8’µP2”Ú‡J’ÿ¾dÿÀf‘ÿ¼c“ÿÁf¯J.ÿ¼d‘ÿµ`ÿ¿dÖ€FÒ~EÛ‡J‘’ÿ»cÿºc×GŽû³_þ¹bÿÉiÈm>¶R3ÐzC£7'‡ ÛˆKÐxDý´`ÏwC–‘؃GÿÊjÿ¸b’×FŽÔEÿÁgâNÿ¼e«C,’¢5%ëS¡5&ê›T®H.¤:'Ñ|EÚ†J©B+ª@+¤9(Éo>»\7Èn?¸W4ÍtAÄh<ÿ³_«C+ú´_©@+°I.—$å–RÊn?ú²^ÿ¹bÖFÈo?’¾_8Én=ï¥Xã‘O¹X5ÿÂe… Ên=“û°]û²_‘ÍsBä“Q—# ƒ ‘ߎMÜM·S4ÿÄfÒzEàM³P1àŒMÔ‚Gü¶`ËtAß‘Oÿ³`ÿÃhÑyD¶P2é›S­H.ÿºbæ›Sè˜Rå˜RÆk=ØGÕF¯H.ÑxDÐwC·U4¿`9Ål<½^7Áb:Ö‚HŽô§Y¸V3ÿ»dØ„GŽ•ÿÿÿ!ù,ãÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—ýÉœI³¦Í›8sêÜÉs'ÌŸ){ J´¨P HKT&ŠS*PËä¹YGˆÓ(TÊPqjÅÉL@O¢h…JM8[²ñhëÖµ=“Ê )4‡™wšèÕ»C™+3½¡‘wïÞ4xé@ÆÑÃM"8B× ÂMî˜C2áÔãxŠ;·tLžN”¸àÊ(°—x£¤nžX–LÙ2%ŽoQ *H˜£ "ÝS’¿Æ%k /YˆåVŽªÑ€0¯ã ð1‡§éï{¦ÿÖ²‰B;,˜0aéST-*þÊH4‚!X8èÇÒb,QBXˆ;„ Ge’ }ütÒ ÍlBÁ€€1Ôáx R$žZرŒJ¤¨„2CL¡Žs<`%GèqI&ž¨hH?@Hr )4 bŠÊÐ#G ’`M=a'T³E (VAM:| ć!vùЈZ„KL”ÉDEàÑ‹ Wèñ‰Â4PÈoð@çøäá5ÇÐa5á£dQE6KÌ€l(ÐÂCàSI@D9Vpéå¦ )H(ò êõX È"o¤æÇ>ÇðÅ«°~ÿ+s¼à7BIgTá Y´…L@pÅ l±F¦:qjmB`î1 6 tÛí¤Â0zø¡m2`¤«.< 5 2fÔ[¯àlï,Qì±É.Ûì³ÑN«éµÿ&܈‘ÆÃsñ‡ö\B…‚üwÌE ¯¨¯-ˆtaòÉ]8N¡U௱È*ˬ³ÐJKmN ç¬0j$ÚáKf2ñF?`Šo|Æ: èt™øâ­{ ‚à h³B58PË.ÿ³À4|3N:' ¦ÅLÃOfÒÀ-›”£AȆôÿýö“}ñL(t\@9pÂ' ̬¡aÃðÌÛ|pÚ^ŠçI$ÀX 1l€Æ‹0 —QÀ ùô°ÁëhŒŽ-‹H£À …‹ÀÆî»‹pÃ:b?à ÙãQÄÙ7a~­x÷tÃÇ9KTo}ƒ€ N¨°È/aXo=âT€Ä è(BŒ¦  8Y`@HßËFÖh’°¡ЏF.ç< …¹ ‚È@)0¢cPƒLœ ‰Rl£ dD4wÌâR£‰‚€ °A ¹°ÁHá'xaÈ‚½à] ƒ€©V75K¼á @ "RÉ@C@@&y¢uá„JXÁ p¸ ܰ%X ݙÉ! xD™<ÑCÜ¡iŒBÆ2š1ŒbœË×ÈÆ2¦ñpŒ£çHÇ:ÚñŽxÌ£÷HÇ€;bcdev-epr-api-a922482/docs/images/esa_logo.gif000066400000000000000000000026731142554441000210710ustar00rootroot00000000000000GIF89a2÷C@AA=>,()*&'9567458352-./+--'(        "!  ^[\ÎÍÍ ³²²¼»»Žïîºûûû÷ööøøøTQR~ÇÆÆc``dabOLM]YZ @<=+'(ýüüÐÏÐolm žž@==ŽŒ>;<ñòòjghIFF½¼¼412ŒŠ‹»¹ºÎÎÏ?<=ØØØ›ššüûüc_a‘ñððúüûÏÐÏA>?ROPpnn‘Ž(#$;78¡¡ }}Їˆ}{|ˆ…ˆÜÜÜÝÝÝÐÏÏøùøíííïïïëë딓“Љˆ‹‰ŠêééÔÒÓ($%ÊÊÊ)%&öööëêê{yy«ªª´²³# !©§§¦¥¥˜•–TRRUSSc`a967‡„…RNNQNO534% !%"#2/0301_\]°¯¯ ’HEDÍÍÍHEE ebcÞÝÝC?@ÈÈÇ«««‚€€ ¾½½›œ˜––¨¨§ÝÞÝçææßÞÞßÞßìíí623.)*“‘’KGHÁÀÀ€}~ÕÖÖš™™B>?ñðñ¼¼¼©§¨lij<9:ðïï€~~ÕÓÓ”‘’ÓÒÒ´³³À¿¿ÆÆÆ ¿½¾çæç523-)*GCDgde!žœœìíì„‚“‘|yzFCD‘vtußààÂÂÂ734úùùNKL^\]äããèéé]Z[»»»îí혖˜KHI¸··ÕÔÔÄÃÃÖÕÕWSUîï—²±°£¡¢½½¼®¬¬¯­®¯®®´³´ÆÅÅtprúúúÉÈÈàààŒ‰‹ÀÀÀ¨§§¦¤¥ððð3.0]ZZ†„…a^_º¹¹÷ø÷SPPheeääãìëëÂÁÁþþþ# ÿÿÿ!ù,2ÿÿ ¸‡€ è 4°¡Ã‡#BüÁ <ŒPÐ2‰ CBd‘@DýúyB §DÊÉ$)UŽ þê@tá"â}}4‹ÑPˆœ)=„ pÏœ¶”°×0! hj¨¢U p‚•HíH#$Õû§bÇÉœ Dyˆ­Ë@þü)HxˆÀC.è"&Âß µlø›p€ ‹n`9!c‰$­8G㟫=üþ‘"°á‘³"X0(èôo™¿^qžôo”¿2þUYqáKá&ŒX0"ƒa3–ü%óOŠ“Q.ôP6°¿9ÿ\ÿ˜vMà*Y¹þÝKà˜©|>„`ЦL  Tý£õ'_µ0üóÂ,ÿp=Þ<€(°Å?-H'ÂV„áÎ@èx1C(¤“À3L0S$ @7ÿlÃÌ?2ÄÆìlòOàD°@²‹ŒÄ( u‘üSŠd$CN!)˜p °Bs™ü# 0ÀÀLÊ?9\p@C¦ QÃ?lñ0, 3?~&÷˜ ™/[‚àŠd„?¤”<=qyä‰ è…þd1þ¼‚Dˆ#ýT`H]w¥ôA˜$MƒðòMC¨ø˜ãÈFôCÖüÊ?¬ñ)øs :TÐ@jhaðÜùTN, €6 esù3@;ÁÈÙb`Œ@•D­}ØðÎ?5ÝíäN3œ¼AÅC5´ 7Ñ8´Ž¾¢œÐРŨƒÇ?Ÿì3Ž@$™„’N·l€‰ÌdqDY„‘F  4‡ QA%¤"§;bcdev-epr-api-a922482/makefile000066400000000000000000000113211142554441000161030ustar00rootroot00000000000000################################################# ## Macro definitions for this file ## Note: OUTDIR must be predefined and not empty ################################################# THISDIR= . SRCDIR = ./src OUTDIR = ./build/$(CONFIG) ## CFLAGS = -xCC -Xc -xildoff -v -I. # for solaris # COMPILE = cc -Kpic -G -CFLAGS -I$(SRCDIR) -I$(THISDIR) $(OPTIONS) # LINK = ld -G # TARGET = $(OUTDIR)/libepr_api.so # for linux COMPILE = gcc -fPIC -ansi -c -I$(SRCDIR) -I$(THISDIR) $(OPTIONS) LINK = ld -shared TARGET = $(OUTDIR)/libepr_api.so # for Mac OS X # COMPILE = gcc -fPIC -ansi -c -I$(SRCDIR) -I$(THISDIR) $(OPTIONS) # LINK = ld -dylib # TARGET = $(OUTDIR)/libepr_api.dylib HEADERS=\ $(SRCDIR)/epr_api.h\ $(SRCDIR)/epr_core.h\ $(SRCDIR)/epr_dddb.h\ $(SRCDIR)/epr_string.h\ $(SRCDIR)/epr_ptrarray.h\ $(SRCDIR)/epr_field.h\ $(SRCDIR)/epr_record.h\ $(SRCDIR)/epr_param.h\ $(SRCDIR)/epr_dsd.h\ $(SRCDIR)/epr_dataset.h\ $(SRCDIR)/epr_msph.h\ $(SRCDIR)/epr_swap.h\ $(SRCDIR)/epr_band.h\ $(SRCDIR)/epr_bitmask.h SOURCES=\ $(SRCDIR)/epr_api.c\ $(SRCDIR)/epr_core.c\ $(SRCDIR)/epr_dddb.c\ $(SRCDIR)/epr_product.c\ $(SRCDIR)/epr_dataset.c\ $(SRCDIR)/epr_string.c\ $(SRCDIR)/epr_ptrarray.c\ $(SRCDIR)/epr_field.c\ $(SRCDIR)/epr_record.c\ $(SRCDIR)/epr_param.c\ $(SRCDIR)/epr_dsd.c\ $(SRCDIR)/epr_msph.c\ $(SRCDIR)/epr_swap.c\ $(SRCDIR)/epr_band.c\ $(SRCDIR)/epr_bitmask.c\ $(SRCDIR)/epr_dump.c\ $(SRCDIR)/epr_typconv.c OBJECTS=\ $(OUTDIR)/epr_api.o\ $(OUTDIR)/epr_core.o\ $(OUTDIR)/epr_dddb.o\ $(OUTDIR)/epr_product.o\ $(OUTDIR)/epr_dataset.o\ $(OUTDIR)/epr_string.o\ $(OUTDIR)/epr_ptrarray.o\ $(OUTDIR)/epr_field.o\ $(OUTDIR)/epr_record.o\ $(OUTDIR)/epr_param.o\ $(OUTDIR)/epr_dsd.o\ $(OUTDIR)/epr_msph.o\ $(OUTDIR)/epr_swap.o\ $(OUTDIR)/epr_band.o\ $(OUTDIR)/epr_bitmask.o\ $(OUTDIR)/epr_dump.o\ $(OUTDIR)/epr_typconv.o ############################################### ## Arguments for the 'make' command ############################################### info: @echo '****** Make file for target "EPR_C_API" ******' @echo 'For the release build type "make rel"' @echo 'For the debug build type "make deb"' @echo 'For a complete release rebuild type "make all_rel"' @echo 'For a complete debug rebuild type "make all_deb"' all: $(TARGET) deb: @echo 'Building debug version of target "EPR_C_API"...' @$(MAKE) all "CONFIG=debug" "OPTIONS=-g -D_DEBUG" rel: @echo 'Building release version of target "EPR_C_API"...' @$(MAKE) all "CONFIG=release" "OPTIONS=-DNDEBUG" all_deb: @$(MAKE) clean "CONFIG=debug" @$(MAKE) deb all_rel: @$(MAKE) clean "CONFIG=release" @$(MAKE) rel clean: @echo 'Deleting output files for target "EPR_C_API"...' @rm -f $(OBJECTS) $(TARGET) ############################################### ## Link object files to executable target ############################################### $(TARGET) : $(OBJECTS) $(LINK) -o $@ $(OBJECTS) -lm SRC_1 = $(SRCDIR)/epr_api.c $(OUTDIR)/epr_api.o : $(HEADERS) $(SRC_1) $(COMPILE) -o $@ $(SRC_1) SRC_2 = $(SRCDIR)/epr_core.c $(OUTDIR)/epr_core.o : $(HEADERS) $(SRC_2) $(COMPILE) -o $@ $(SRC_2) SRC_3 = $(SRCDIR)/epr_dddb.c $(OUTDIR)/epr_dddb.o : $(HEADERS) $(SRC_3) $(COMPILE) -o $@ $(SRC_3) SRC_4 = $(SRCDIR)/epr_product.c $(OUTDIR)/epr_product.o : $(HEADERS) $(SRC_4) $(COMPILE) -o $@ $(SRC_4) SRC_5 = $(SRCDIR)/epr_dataset.c $(OUTDIR)/epr_dataset.o : $(HEADERS) $(SRC_5) $(COMPILE) -o $@ $(SRC_5) SRC_6 = $(SRCDIR)/epr_string.c $(OUTDIR)/epr_string.o : $(HEADERS) $(SRC_6) $(COMPILE) -o $@ $(SRC_6) SRC_7 = $(SRCDIR)/epr_ptrarray.c $(OUTDIR)/epr_ptrarray.o : $(HEADERS) $(SRC_7) $(COMPILE) -o $@ $(SRC_7) SRC_8 = $(SRCDIR)/epr_field.c $(OUTDIR)/epr_field.o : $(HEADERS) $(SRC_8) $(COMPILE) -o $@ $(SRC_8) SRC_9 = $(SRCDIR)/epr_record.c $(OUTDIR)/epr_record.o : $(HEADERS) $(SRC_9) $(COMPILE) -o $@ $(SRC_9) SRC_10 = $(SRCDIR)/epr_param.c $(OUTDIR)/epr_param.o : $(HEADERS) $(SRC_10) $(COMPILE) -o $@ $(SRC_10) SRC_11 = $(SRCDIR)/epr_dsd.c $(OUTDIR)/epr_dsd.o : $(HEADERS) $(SRC_11) $(COMPILE) -o $@ $(SRC_11) SRC_12 = $(SRCDIR)/epr_msph.c $(OUTDIR)/epr_msph.o : $(HEADERS) $(SRC12) $(COMPILE) -o $@ $(SRC_12) SRC_13 = $(SRCDIR)/epr_swap.c $(OUTDIR)/epr_swap.o : $(HEADERS) $(SRC_13) $(COMPILE) -o $@ $(SRC_13) SRC_14 = $(SRCDIR)/epr_band.c $(OUTDIR)/epr_band.o : $(HEADERS) $(SRC_14) $(COMPILE) -o $@ $(SRC_14) SRC_15 = $(SRCDIR)/epr_bitmask.c $(OUTDIR)/epr_bitmask.o : $(HEADERS) $(SRC_15) $(COMPILE) -o $@ $(SRC_15) SRC_16 = $(SRCDIR)/epr_dump.c $(OUTDIR)/epr_dump.o : $(HEADERS) $(SRC_16) $(COMPILE) -o $@ $(SRC_16) SRC_17 = $(SRCDIR)/epr_typconv.c $(OUTDIR)/epr_typconv.o : $(HEADERS) $(SRC_17) $(COMPILE) -o $@ $(SRC_17) ############################################### bcdev-epr-api-a922482/prj/000077500000000000000000000000001142554441000152005ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/unix/000077500000000000000000000000001142554441000161635ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/unix/cc_make_examples.sh000066400000000000000000000020401142554441000217730ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../bin" ] then mkdir ../../bin fi if [ -f "../../bin/write_bands" ] then rm ../../bin/write_bands fi if [ -f "../../bin/write_bitmask" ] then rm ../../bin/write_bitmask fi if [ -f "../../bin/write_ndvi" ] then rm ../../bin/write_ndvi fi cc -lm ../../src/*.c ../../src/examples/write_bands.c -o ../../bin/write_bands cc -lm ../../src/*.c ../../src/examples/write_bitmask.c -o ../../bin/write_bitmask cc -lm ../../src/*.c ../../src/examples/write_ndvi.c -o ../../bin/write_ndvi if [ ! -f "../../bin/write_bands" ] then echo "" echo "Error:" echo "--> write_bands could not be compiled" else echo "--> write_bands compiled successful" fi if [ ! -f "../../bin/write_bitmask" ] then echo "" echo "Error:" echo "--> write_bitmask could not be compiled" else echo "--> write_bitmask compiled successful" fi if [ ! -f "../../bin/write_ndvi" ] then echo "" echo "Error:" echo "--> write_ndvi could not be compiled" else echo "--> write_ndvi compiled successful" fi bcdev-epr-api-a922482/prj/unix/gcc_make_examples.sh000066400000000000000000000020431142554441000221450ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../bin" ] then mkdir ../../bin fi if [ -f "../../bin/write_bands" ] then rm ../../bin/write_bands fi if [ -f "../../bin/write_bitmask" ] then rm ../../bin/write_bitmask fi if [ -f "../../bin/write_ndvi" ] then rm ../../bin/write_ndvi fi gcc -lm ../../src/*.c ../../src/examples/write_bands.c -o ../../bin/write_bands gcc -lm ../../src/*.c ../../src/examples/write_bitmask.c -o ../../bin/write_bitmask gcc -lm ../../src/*.c ../../src/examples/write_ndvi.c -o ../../bin/write_ndvi if [ ! -f "../../bin/write_bands" ] then echo "" echo "Error:" echo "--> write_bands could not be compiled" else echo "--> write_bands compiled successful" fi if [ ! -f "../../bin/write_bitmask" ] then echo "" echo "Error:" echo "--> write_bitmask could not be compiled" else echo "--> write_bitmask compiled successful" fi if [ ! -f "../../bin/write_ndvi" ] then echo "" echo "Error:" echo "--> write_ndvi could not be compiled" else echo "--> write_ndvi compiled successful" fi bcdev-epr-api-a922482/prj/unix/tests/000077500000000000000000000000001142554441000173255ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/unix/tests/cc_make_api_tests.sh000066400000000000000000000006241142554441000233200ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../../bin" ] then mkdir ../../../bin fi if [ -f "../../../bin/api_tests" ] then rm ../../../bin/api_tests fi cc -lm ../../../src/*.c ../../../src/api-test/api_tests.c -o ../../../bin/api_tests if [ ! -f "../../../bin/api_tests" ] then echo "" echo "Error:" echo "--> api_tests could not be compiled" else echo "--> api_tests compiled successful" fi bcdev-epr-api-a922482/prj/unix/tests/cc_make_api_unit_tests.sh000066400000000000000000000007221142554441000243560ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../../bin" ] then mkdir ../../../bin fi if [ -f "../../../bin/api_unit_tests" ] then rm ../../../bin/api_unit_tests fi cc -lm ../../../bccunit/src/bccunit.c ../../../src/*.c ../../../src/test/api_unit_tests.c -o ../../../bin/api_unit_tests if [ ! -f "../../../bin/api_unit_tests" ] then echo "" echo "Error:" echo "--> api_unit_tests could not be compiled" else echo "--> api_unit_tests compiled successful" fi bcdev-epr-api-a922482/prj/unix/tests/cc_make_epr_main_test.sh000066400000000000000000000007121142554441000241540ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../../bin" ] then mkdir ../../../bin fi if [ -f "../../../bin/epr_main_test" ] then rm ../../../bin/epr_main_test fi cc -lm ../../../bccunit/src/bccunit.c ../../../src/*.c ../../../src/test/epr_main_test.c -o ../../../bin/epr_main_test if [ ! -f "../../../bin/epr_main_test" ] then echo "" echo "Error:" echo "--> epr_main_test could not be compiled" else echo "--> epr_main_test compiled successful" fi bcdev-epr-api-a922482/prj/unix/tests/gcc_make_api_tests.sh000066400000000000000000000006241142554441000234670ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../../bin" ] then mkdir ../../../bin fi if [ -f "../../../bin/api_tests" ] then rm ../../../bin/api_tests fi gcc -lm ../../../src/*.c ../../../src/api-test/api_tests.c -o ../../../bin/api_tests if [ ! -f "../../../bin/api_tests" ] then echo "" echo "Error:" echo "--> api_tests could not be compiled" else echo "--> api_tests compiled successful" fibcdev-epr-api-a922482/prj/unix/tests/gcc_make_api_unit_tests.sh000066400000000000000000000007231142554441000245260ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../../bin" ] then mkdir ../../../bin fi if [ -f "../../../bin/api_unit_tests" ] then rm ../../../bin/api_unit_tests fi gcc -lm ../../../bccunit/src/bccunit.c ../../../src/*.c ../../../src/test/api_unit_tests.c -o ../../../bin/api_unit_tests if [ ! -f "../../../bin/api_unit_tests" ] then echo "" echo "Error:" echo "--> api_unit_tests could not be compiled" else echo "--> api_unit_tests compiled successful" fi bcdev-epr-api-a922482/prj/unix/tests/gcc_make_epr_main_test.sh000066400000000000000000000007131142554441000243240ustar00rootroot00000000000000#!/bin/bash if [ ! -f "../../../bin" ] then mkdir ../../../bin fi if [ -f "../../../bin/epr_main_test" ] then rm ../../../bin/epr_main_test fi gcc -lm ../../../bccunit/src/bccunit.c ../../../src/*.c ../../../src/test/epr_main_test.c -o ../../../bin/epr_main_test if [ ! -f "../../../bin/epr_main_test" ] then echo "" echo "Error:" echo "--> epr_main_test could not be compiled" else echo "--> epr_main_test compiled successful" fi bcdev-epr-api-a922482/prj/unix/tests/write_bands_test.sh000066400000000000000000000004101142554441000232140ustar00rootroot00000000000000#!/bin/bash EXEC_PATH=./build/release TESTDATA_DIR=../../testdata OUTPUT_DIR=$TESTDATA_DIR/output mkdir $OUTPUT_DIR FILENAME=MER_RR__1PNPDK20020415_103725_000002702005_00094_00649_1059.N1 $EXEC_PATH/write_bands $TESTDATA_DIR/$FILENAME $OUTPUT_DIR radiance_1 bcdev-epr-api-a922482/prj/win__code_blocks/000077500000000000000000000000001142554441000204635ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/api_tests/000077500000000000000000000000001142554441000224565ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/api_tests/api_tests.bmarks000066400000000000000000000004221142554441000256500ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/api_tests/api_tests.cbp000066400000000000000000000030311142554441000251340ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/api_tests/api_tests.depend000066400000000000000000000000371142554441000256320ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/api_tests/api_tests.layout000066400000000000000000000004141142554441000257070ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/api_unit_tests/000077500000000000000000000000001142554441000235155ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/api_unit_tests/api_unit_tests.bmarks000066400000000000000000000007711142554441000277550ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/api_unit_tests/api_unit_tests.cbp000066400000000000000000000033151142554441000272370ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/api_unit_tests/api_unit_tests.depend000066400000000000000000000000371142554441000277300ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/api_unit_tests/api_unit_tests.layout000066400000000000000000000007631142554441000300140ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/bccunit_lib/000077500000000000000000000000001142554441000227405ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/bccunit_lib/bccunit_lib.bmarks000066400000000000000000000006161142554441000264210ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/bccunit_lib/bccunit_lib.cbp000066400000000000000000000024341142554441000257060ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/bccunit_lib/bccunit_lib.depend000066400000000000000000000000371142554441000263760ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/bccunit_lib/bccunit_lib.layout000066400000000000000000000006101142554441000264510ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr.workspace000066400000000000000000000012721142554441000231730ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_all.workspace000066400000000000000000000024501142554441000240220ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_api/000077500000000000000000000000001142554441000221025ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/epr_api/epr_api.bmarks000066400000000000000000000057201142554441000247260ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_api/epr_api.cbp000066400000000000000000000064541142554441000242200ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_api/epr_api.depend000066400000000000000000000000371142554441000247020ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/epr_api/epr_api.layout000066400000000000000000000057121142554441000247650ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_main_test/000077500000000000000000000000001142554441000233145ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/epr_main_test/epr_main_test.bmarks000066400000000000000000000004231142554441000273450ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_main_test/epr_main_test.cbp000066400000000000000000000027411142554441000266370ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_main_test/epr_main_test.layout000066400000000000000000000004151142554441000274040ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_subset_test/000077500000000000000000000000001142554441000236755ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/epr_subset_test/epr_subset_test.bmarks000066400000000000000000000004231142554441000303070ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_subset_test/epr_subset_test.cbp000066400000000000000000000030721142554441000275770ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_subset_test/epr_subset_test.depend000066400000000000000000000000371142554441000302700ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/epr_subset_test/epr_subset_test.layout000066400000000000000000000004151142554441000303460ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_test_endian/000077500000000000000000000000001142554441000236265ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/epr_test_endian/epr_test_endian.bmarks000066400000000000000000000004201142554441000301660ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_test_endian/epr_test_endian.cbp000066400000000000000000000021311142554441000274540ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/epr_test_endian/epr_test_endian.depend000066400000000000000000000000371142554441000301520ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/epr_test_endian/epr_test_endian.layout000066400000000000000000000004121142554441000302250ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/swap_eo/000077500000000000000000000000001142554441000221205ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/swap_eo/swap_eo.bmarks000066400000000000000000000004111142554441000247520ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/swap_eo/swap_eo.cbp000066400000000000000000000023551142554441000242500ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/swap_eo/swap_eo.depend000066400000000000000000000000371142554441000247360ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/swap_eo/swap_eo.layout000066400000000000000000000004031142554441000250110ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_bands/000077500000000000000000000000001142554441000227645ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/write_bands/write_bands.bmarks000066400000000000000000000004241142554441000264660ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_bands/write_bands.cbp000066400000000000000000000031311142554441000257510ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_bands/write_bands.depend000066400000000000000000000000371142554441000264460ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/write_bands/write_bands.layout000066400000000000000000000004161142554441000265250ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_bitmask/000077500000000000000000000000001142554441000233275ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/write_bitmask/write_bitmask.bmarks000066400000000000000000000004231142554441000273730ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_bitmask/write_bitmask.cbp000066400000000000000000000032531142554441000266640ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_bitmask/write_bitmask.depend000066400000000000000000000000371142554441000273540ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/write_bitmask/write_bitmask.layout000066400000000000000000000004151142554441000274320ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_ndvi/000077500000000000000000000000001142554441000226355ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/write_ndvi/write_ndvi.bmarks000066400000000000000000000004231142554441000262070ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_ndvi/write_ndvi.cbp000066400000000000000000000030571142554441000255020ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_ndvi/write_ndvi.depend000066400000000000000000000000371142554441000261700ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/write_ndvi/write_ndvi.layout000066400000000000000000000004151142554441000262460ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_rgb/000077500000000000000000000000001142554441000224475ustar00rootroot00000000000000bcdev-epr-api-a922482/prj/win__code_blocks/write_rgb/write_rgb.bmarks000066400000000000000000000004221142554441000256320ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_rgb/write_rgb.cbp000066400000000000000000000035311142554441000251230ustar00rootroot00000000000000 bcdev-epr-api-a922482/prj/win__code_blocks/write_rgb/write_rgb.depend000066400000000000000000000000371142554441000256140ustar00rootroot00000000000000# depslib dependency file v1.0 bcdev-epr-api-a922482/prj/win__code_blocks/write_rgb/write_rgb.layout000066400000000000000000000004141142554441000256710ustar00rootroot00000000000000 bcdev-epr-api-a922482/src/000077500000000000000000000000001142554441000151745ustar00rootroot00000000000000bcdev-epr-api-a922482/src/api-test/000077500000000000000000000000001142554441000167225ustar00rootroot00000000000000bcdev-epr-api-a922482/src/api-test/api_tests.c000066400000000000000000000102551142554441000210640ustar00rootroot00000000000000#include #include #include #include #include #include #include #include "../epr_api.h" int write_raw_image(const char* output_dir, EPR_SProductId* product_id, const char* band_name); #if defined(WIN32) && defined(_DEBUG) #include #endif /* if defined(WIN32) && defined(_DEBUG) */ /** * A program wich tests the epr-c-api by converting producing ENVI raster * information from dataset. * * It generates a *.raw data file for all rasters included in the * given product in the given output directory. * * Call: api_test */ int main(int argc, char** argv) { EPR_SProductId* product_id; int i, numGrids; const char* product_file_path; const char* output_dir_path; if (argc <= 2) { printf("Usage: api_test "); printf(" where envisat-product is the input filename\n"); printf(" and output-dir is the output directory\n"); printf("Example:\n"); printf(" api_test \"./MER_RR__2P_TEST.N1\" \".\\output\" \n\n"); exit(1); } product_file_path = argv[1]; output_dir_path = argv[2]; /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) */ epr_init_api(e_log_debug, epr_log_message, NULL); /* Open the product; an argument is a path to product data file */ product_id = epr_open_product(product_file_path); numGrids = epr_get_num_bands(product_id); for (i = 0; i < numGrids; i ++) { write_raw_image(output_dir_path, product_id, epr_get_band_name(epr_get_band_id_at(product_id, i))); } /* Close product_id and release rest of the allocated memory */ epr_close_product(product_id); /* Closes product reader API, release all allocated resources */ epr_close_api(); return 0; } /** * Generate the ENVI binary pattern image file for an actual DS. * * The first parameter is the output directory path. * * The function returns 1, if the file is generated, 0 otherwise. */ int write_raw_image(const char* output_dir, EPR_SProductId* product_id, const char* band_name) { FILE *out_stream; uint y, numwritten; char image_file_path[1024]; EPR_SBandId* band_id = NULL; int err_code; EPR_SRaster* raster = NULL; uint source_w, source_h; uint source_step_x, source_step_y; /* Build ENVI file path, DS name specifically */ #ifdef WIN32 sprintf(image_file_path, "%s\\%s.img", output_dir, band_name); #else sprintf(image_file_path, "%s/%s.img", output_dir, band_name); #endif band_id = epr_get_band_id(product_id, band_name); if (band_id == NULL) { printf("Error: band '%s' not found\n", band_name); return 1; } source_w = epr_get_scene_width(product_id); source_h = epr_get_scene_height(product_id); source_step_x = 1; source_step_y = 1; raster = epr_create_compatible_raster(band_id, source_w, source_h, source_step_x, source_step_y); printf("Reading band '%s'...\n", band_name); err_code = epr_read_band_raster(band_id, 0, 0, raster); if (err_code != 0) { printf("Error: can't read raster data from '%s'\n", band_name); return 2; } out_stream = fopen(image_file_path, "wb"); if (out_stream == NULL) { printf("Error: can't open '%s'\n", image_file_path); return 3; } for (y = 0; y < (uint)raster->raster_height; y ++) { numwritten = fwrite(epr_get_raster_line_addr(raster, y), raster->elem_size, raster->raster_width, out_stream); if (numwritten != raster->raster_width) { printf("Error: can't write to %s\n", image_file_path); return 4; } } fclose(out_stream); printf("Raw image data successfully written to '%s'.\n", image_file_path); printf("C data type is '%s', element size %u byte(s), raster size is %u x %u pixels.\n", epr_data_type_id_to_str(raster->data_type), raster->elem_size, raster->raster_width, raster->raster_height); epr_free_raster(raster); return 0; } bcdev-epr-api-a922482/src/epr_api.c000066400000000000000000000076641142554441000167740ustar00rootroot00000000000000/* * $Id: epr_api.c,v 1.1.1.1 2004-10-28 19:22:21 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_dddb.h" /*********************************** API ***********************************/ /** * Initializes the ENVISAT product reader API. */ int epr_init_api(EPR_ELogLevel log_level, EPR_FLogHandler log_handler, EPR_FErrHandler err_handler) { if (epr_api.init_flag) { return e_err_none; } epr_clear_err(); /* Determine endian order architecture */ if (epr_is_little_endian_order()) { epr_api.little_endian_order = TRUE; } else if (epr_is_big_endian_order()) { epr_api.little_endian_order = FALSE; } else { epr_set_err(e_err_unknown_endian_order, "epr_init_api: failed to determine endian order"); return epr_get_last_err_code(); } epr_api.log_level = log_level; epr_api.log_handler = log_handler; epr_api.err_handler = err_handler; epr_api.last_err_code = e_err_none; epr_api.last_err_message = NULL; epr_api.init_flag = TRUE; epr_log(e_log_info, EPR_PRODUCT_API_NAME_STR ", version " EPR_PRODUCT_API_VERSION_STR); epr_log(e_log_info, "API successfully initialized"); if (epr_api.little_endian_order) { epr_log(e_log_debug, "running on a little endian order architecture"); } else { epr_log(e_log_debug, "running on a big endian order architecture"); } return epr_get_last_err_code(); } /* Function: epr_close_api Access: public API Changelog: 2002/01/05 mp initial version */ /** * Closes the ENVISAT product reader API by releasing all * resources allocated by the API. */ void epr_close_api() { epr_clear_err(); if (epr_api.init_flag) { epr_log(e_log_info, "ENVISAT product reader API is being closed"); epr_api.last_err_code = e_err_none; epr_free_and_null_string(&epr_api.last_err_message); epr_api.init_flag = FALSE; } } /* Function: epr_set_log_handler Access: public API Changelog: 2002/01/05 nf initial version */ /** * Sets the log handler for the ENVISAT API. * * @param log_handler the new log handler (function pointer), * can be NULL, if logging shall be disabled * @return zero for success, an error code otherwise */ void epr_set_log_handler(EPR_FLogHandler log_handler) { epr_api.log_handler = log_handler; } void epr_log_message(EPR_ELogLevel log_level, const char* log_message) { struct tm* ptm; time_t millis; time(&millis); ptm = gmtime(&millis); fprintf(stdout, "%c %04d/%02d/%02d %02d:%02d:%02d - %s\n", log_level == e_log_debug ? 'D' : log_level == e_log_info ? 'I' : log_level == e_log_warning ? 'W' : log_level == e_log_error ? 'E' : '?', ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, log_message); } bcdev-epr-api-a922482/src/epr_api.def000066400000000000000000000021741142554441000172770ustar00rootroot00000000000000; $Revision: 1.1.1.1 $ $Date: 2003/07/08 10:41:38 $ ; Declares the WIN32 epr_api.dll parameters. LIBRARY epr_api.dll DESCRIPTION 'ENVISAT PRODUCT READER C-API' EXPORTS epr_init_api epr_close_api epr_open_product epr_close_product epr_get_scene_width epr_get_scene_height epr_get_num_datasets epr_get_dataset_id_at epr_get_dataset_id epr_get_dataset_name epr_get_mph epr_get_sph epr_get_dsd epr_get_num_dsds epr_get_dsd_at epr_get_num_records epr_create_record epr_read_record epr_free_record epr_get_field epr_get_num_fields epr_get_field_at epr_get_field_unit epr_get_field_description epr_get_field_num_elems epr_get_field_name epr_get_field_type epr_create_compatible_raster epr_create_bitmask_raster epr_create_raster epr_free_raster epr_read_bitmask_raster epr_read_band_raster epr_get_raster_width epr_get_raster_height epr_get_num_bands epr_get_band_id_at epr_get_band_id epr_get_band_name epr_get_pixel_as_float epr_log_message epr_get_last_err_code epr_get_last_err_message epr_print_record epr_print_field epr_print_element epr_dump_record epr_dump_field epr_dump_element bcdev-epr-api-a922482/src/epr_api.h000066400000000000000000001436771142554441000170060ustar00rootroot00000000000000/* * $Id: epr_api.h,v 1.3 2009-03-27 10:25:54 sabine Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_API_H_INCL #define EPR_API_H_INCL #ifdef __cplusplus extern "C" { #endif /* to make the FILE structure available */ #include /* to make dynamic arrays available*/ #include "epr_ptrarray.h" #define EPR_PRODUCT_API_NAME_STR "ENVISAT Product Reader API" #define EPR_PRODUCT_API_VERSION_STR "2.2" /* needed by Doxygen */ /** \mainpage * \htmlinclude doxygen_main_content.html */ /** * The EPR_DataTypeId enumeration lists all possible data * types for field elements in ENVISAT dataset records. */ enum EPR_DataTypeId { /** The ID for unknown types. */ e_tid_unknown = 0, /** An array of unsigned 8-bit integers, C type is uchar* */ e_tid_uchar = 1, /** An array of signed 8-bit integers, C type is char* */ e_tid_char = 2, /** An array of unsigned 16-bit integers, C type is ushort* */ e_tid_ushort = 3, /** An array of signed 16-bit integers, C type is short* */ e_tid_short = 4, /** An array of unsigned 32-bit integers, C type is uint* */ e_tid_uint = 5, /** An array of signed 32-bit integers, C type is int* */ e_tid_int = 6, /** An array of 32-bit floating point numbers, C type is float* */ e_tid_float = 7, /** An array of 64-bit floating point numbers, C type is double* */ e_tid_double = 8, /** A zero-terminated ASCII string, C type is char* */ e_tid_string = 11, /** An array of unsigned character, C type is uchar* */ e_tid_spare = 13, /** A time (MJD) structure, C type is EPR_Time */ e_tid_time = 21 }; /** * The EPR_ErrCode enumeration lists all possible error * codes for the ENVISAT product reader API. */ enum EPR_ErrCode { /* Not an error */ e_err_none = 0, /* Low level errors */ e_err_null_pointer = 1, e_err_illegal_arg = 2, e_err_illegal_state = 3, e_err_out_of_memory = 4, e_err_index_out_of_range = 5, e_err_illegal_conversion = 6, e_err_illegal_data_type = 7, /* I/O errors */ e_err_file_not_found = 101, e_err_file_access_denied = 102, e_err_file_read_error = 103, e_err_file_write_error = 104, e_err_file_open_failed = 105, e_err_file_close_failed = 106, /* API related errors */ e_err_api_not_initialized = 201, e_err_invalid_product_id = 203, e_err_invalid_record = 204, e_err_invalid_band = 205, e_err_invalid_raster = 206, e_err_invalid_dataset_name = 207, e_err_invalid_field_name = 208, e_err_invalid_record_name = 209, e_err_invalid_product_name = 210, e_err_invalid_band_name = 211, e_err_invalid_data_format = 212, e_err_invalid_value = 213, e_err_invalid_keyword_name = 214, e_err_unknown_endian_order = 216, /* Bitmask term errors */ e_err_flag_not_found = 301, /* DDDB errors */ e_err_invalid_ddbb_format = 402 }; /** * The EPR_LogLevel enumeration lists possible log levels * for the ENVISAT product reader API. */ enum EPR_LogLevel { e_log_debug = -1, e_log_info = 0, e_log_warning = 1, e_log_error = 2 }; enum EPR_SampleModel { e_smod_1OF1 = 0, e_smod_1OF2 = 1, e_smod_2OF2 = 2, e_smod_3TOI = 3, e_smod_2TOF = 4 }; enum EPR_ScalingMethod { e_smid_non = 0, e_smid_lin = 1, e_smid_log = 2 }; struct EPR_ProductId; struct EPR_DatasetId; struct EPR_BandId; struct EPR_Record; struct EPR_RecordInfo; struct EPR_Field; struct EPR_FieldInfo; struct EPR_ProductInfo; struct EPR_DSD; struct EPR_Raster; struct EPR_DatasetRef; struct EPR_Flag; struct EPR_BandId; struct EPR_ParamElem; struct EPR_Time; typedef enum EPR_DataTypeId EPR_EDataTypeId; typedef enum EPR_ErrCode EPR_EErrCode; typedef enum EPR_LogLevel EPR_ELogLevel; typedef enum EPR_SampleModel EPR_ESampleModel; typedef enum EPR_ScalingMethod EPR_EScalingMethod; typedef struct EPR_ProductId EPR_SProductId; typedef struct EPR_DatasetId EPR_SDatasetId; typedef struct EPR_BandId EPR_SBandId; typedef struct EPR_Record EPR_SRecord; typedef struct EPR_RecordInfo EPR_SRecordInfo; typedef struct EPR_Field EPR_SField; typedef struct EPR_FieldInfo EPR_SFieldInfo; typedef struct EPR_DSD EPR_SDSD; typedef struct EPR_Raster EPR_SRaster; typedef struct EPR_FlagDef EPR_SFlagDef; typedef struct EPR_ParamElem EPR_SParamElem; typedef struct EPR_Time EPR_STime; typedef struct EPR_DatasetRef EPR_SDatasetRef; typedef struct EPR_BitmaskTerm EPR_SBitmaskTerm; typedef struct EPR_FlagSet EPR_SFlagSet; typedef void (*EPR_FErrHandler)(EPR_EErrCode err_code, const char* err_message); typedef void (*EPR_FLogHandler)(EPR_ELogLevel log_level, const char* log_message); typedef int epr_boolean; typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; typedef int EPR_Magic; #define EPR_MAGIC_PRODUCT_ID 0xCAFFEE64 #define EPR_MAGIC_DATASET_ID 0xEFEABDCA #define EPR_MAGIC_BAND_ID 0xFEC21ABD #define EPR_MAGIC_RECORD 0x7BABACAE #define EPR_MAGIC_FIELD 0xBA0BABBA #define EPR_MAGIC_RASTER 0x0BABA0EB #define EPR_MAGIC_FLAG_DEF 0xCABA11AD #define TRUE 1 #define FALSE 0 #define EPR_PRODUCT_ID_STRLEN 48 /*************************************************************************/ /******************************** STRUCTURES *****************************/ /*************************************************************************/ /** * The EPR_ProductId structure contains information * about an ENVISAT product file which has been opened with the * epr_open_product() function. * * @see epr_open_product */ struct EPR_ProductId { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The file's path including the file name. */ char* file_path; /** * The input stream as returned by the ANSI C fopen * function for the given file path. */ FILE* istream; /** * The total size in bytes of the product file. */ uint tot_size; /** * The total width of product's scene raster in pixels. */ uint scene_width; /** * The total height of product's scene raster in pixels. */ uint scene_height; /** * The product identifier string obtained from the MPH * parameter 'PRODUCT'. *

The first 10 characters of this string identify the * the product type, e.g. "MER_1P__FR" for a MERIS Level 1b * full resolution product. The rest of the string decodes * product instance properties. */ char id_string[EPR_PRODUCT_ID_STRLEN + 1]; /** * The record representing the main product header (MPH). */ EPR_SRecord* mph_record; /** * The record representing the specific product header (SPH). */ EPR_SRecord* sph_record; /** * An array containing all (!) DSDs read from the product's * specific product header (SPH). */ EPR_SPtrArray* dsd_array; /** * Cache for record infos. Contains all record infos read * from the database for this file so far. * * The reason for caching record infos on a per-file-base is that * a some record infos instances can contain file related content * such as the number of pixels in a measurecment dataset record * (MDSR). */ EPR_SPtrArray* record_info_cache; /** * A table containing dynamic field info parameters. * Dynamic field info parameters are created at runtime because * the are derived from the product file contents and can * not be staically stored in the record info database. */ EPR_SPtrArray* param_table; /** * Contains and array of all dataset IDs for the product (type EPR_SDatasetId*) */ EPR_SPtrArray* dataset_ids; /** * Contains and array of all band IDs for the product (type EPR_SBandId*) */ EPR_SPtrArray* band_ids; /** * For MERIS L1b and RR and FR to provide backward compatibility */ int meris_iodd_version; }; /** * The EPR_DatasetId structure contains information * about a dataset within an ENVISAT product file which has been opened with the * epr_open_product() API function. * * A new EPR_DatasetId instance can be obtained with the * epr_get_dataset_id() or epr_get_dataset_id_at() API functions. * * @see epr_open_product * @see epr_get_dataset_id * @see epr_get_dataset_id_at */ struct EPR_DatasetId { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The ID of the product to which this dataset belongs to. */ EPR_SProductId* product_id; /** * The name as presented to the user in a dsd selection dialog */ char* dsd_name; /** * The dataset descriptor obtained from the current product. */ const EPR_SDSD* dsd; /** * The name as presented to the user in a dataset selection dialog */ char* dataset_name; /** * The record descriptor found in the DDDB for this dataset. */ const struct RecordDescriptor* record_descriptor; /** * The record info which describes a record of this dataset. */ EPR_SRecordInfo* record_info; /** * A short description of the band's contents */ char* description; }; /** * The EPR_DSD structure contains information * about the propertier of a dataset properties and its location * within an ENVISAT product file * * @see epr_read_each_dsd */ struct EPR_DSD { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The index of this DSD (zero-based) */ int index; /** * The dataset name. */ char* ds_name; /** * The dataset type descriptor. */ char* ds_type; /** * The filename in the DDDB with the description of this dataset. */ char* filename; /** * The offset of dataset-information the product file. */ uint ds_offset; /** * The size of dataset-information in dataset product file. */ uint ds_size; /** * The number of dataset records for the given dataset name. */ uint num_dsr; /** * The size of dataset record for the given dataset name. */ uint dsr_size; }; /** * The EPR_Record structure represents a * record instance read from an ENVISAT dataset. * A record is composed of multiple fields. * * @see EPR_Field */ struct EPR_Record { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The corresponding record info for this record (a 'soft' pointer). */ EPR_SRecordInfo* info; /** * The number of fields contained in this record. * The value is always equal info->field_infos->length and is * provided here for convenience only. */ uint num_fields; /** * The record fields. An array of EPR_Field* * of length info->num_fields */ EPR_SField** fields; }; /** * Represents a field within a record. A field is composed of * one or more data elements of one of the types defined in the * in field_info. * * @see EPR_Record */ struct EPR_Field { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The corresponding field info for this field. * supplierCardinality 1 */ EPR_SFieldInfo* info; /** * The elements of this field. * * In order to use the data, this member must be casted to one * of the following array data types: * * -# unsigned char* - array of unsigned 8-bit integer elements * -# char* - array of signed 8-bit integer fields * -# unsigned short* - array of unsigned 16-bit integer elements * -# short* - array of signed 16-bit integer elements * -# unsigned int* - array of unsigned 32-bit integer elements * -# int* - array of signed 32-bit integer elements * -# float* - array of signed 32-bit floating point elements * -# double* - array of signed 64-bit floating point elements * -# EPR_STime* - array of MJD elements * * Dedicated access routine are available * The element type is given by info->data_type_id and the array length by * info->num_elems. */ void* elems; }; /** * Represents a raster in which data will be stored. * * All 'size' parameter are in PIXEL. */ struct EPR_Raster { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The data type of the band's pixel values. *
All corresponding with EPR_DataTypeId types are possible */ EPR_EDataTypeId data_type; /** * The size in byte of a single element (sample) of this raster's buffer. */ uint elem_size; /** * The width of the source . */ uint source_width; /** * The height of the source. */ uint source_height; /** * The sub-sampling for the across-track direction in pixel. */ uint source_step_x; /** * The sub-sampling for the along-track direction in pixel. */ uint source_step_y; /** * The width of the raster in pixel. *
raster_width = (source_width - 1) / source_step_x + 1 */ uint raster_width; /** * The height of the raster in pixel. *
raster_height = (source_height - 1) / source_step_y + 1 */ uint raster_height; /** * The elements of this raster. *
Its volume is raster_width * raster_height * sizeof(data_type) in bytes. */ void* buffer; }; /** * The EPR_DatasetRef structure represents the information from dddb *
with the reference to data name (in dddb), field-name and index * of the element in field-array, in which (by name) searchable values are located. * Example for the search for a scaling_offset information: * This information for the reflec_10 is described with the Scaling_Factor_GADS.22.10 * In dataset_id the searched ENVISAT product name (e.g. MER_RR__2P) is located. *
In the corresponding file (e.g. /product/MER_RR__2P.dd) the path, * how to find that information will be decribed. * In that file, in the field number 22 there is an information about the location * of the searched value in the ENVISAT product data. * * @see EPR_SDatasetId */ struct EPR_DatasetRef { EPR_SDatasetId* dataset_id; int field_index; /* -1 if not used */ int elem_index; /* -1 if not used */ }; /** * Represents a flag-field within a flag-record. * */ struct EPR_FlagDef { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The flag name. */ char* name; /** * The bit mask describing this flag */ uint bit_mask; /** * The flag description. */ char* description; }; /** * The EPR_BandId structure contains information * about a band within an ENVISAT product file which has been opened with the * epr_open_product() API function. * * A new EPR_BandId instance can be obtained with the * epr_get_band_id() API function. * * @see epr_open_product * @see epr_get_band_id */ struct EPR_BandId { /** * The magic number for this structure. * IMPORTANT: This must always be the first member of this structure. */ EPR_Magic magic; /** * The ID of the product to which this band belongs to. */ EPR_SProductId* product_id; /** * The name as presented to the user in a band selection dialog * (also known as spectral subset) */ char* band_name; /** * The (zero-based) spectral band index. -1 if this is not a spectral band. */ int spectr_band_index; /** * The reference of the source dataset containing the raw data used to * create the band's pixel values. The external format used in the DDDB * is MDS-name.field, where field is a one-based * index (field=1 corresponds to the first field) */ EPR_SDatasetRef dataset_ref; /** * The sample model operation applied to the source dataset for getting the * correct samples from the MDS (for example MERIS L2). * Possible values are: * - * --> no operation (direct copy) * - 1OF2 --> first byte of 2-byte interleaved MDS * - 2OF2 --> second byte of 2-byte interleaved MDS * - 0123 --> combine 3-bytes interleaved to 4-byte integer */ EPR_ESampleModel sample_model; /** * The data type of the band's pixel values. Possible values are: * - * --> the datatype remains unchanged. * - uint8_t --> 8-bit unsigned integer * - uint32_t --> 32-bit unsigned integer * - Float --> 32-bit IEEE floating point */ EPR_EDataTypeId data_type; /** * The scaling method which must be applied to the raw source data in order * to get the 'real' pixel values in geo-physical units. * Possible values are: * - * --> no scaling applied * - Linear_Scale --> linear scaling applied: y = offset + scale * x * - Log_Scale --> logarithmic scaling applied: y = log10(offset + scale * x) */ EPR_EScalingMethod scaling_method; /** * The scaling offset. Possible values are:
* - * --> no offset provided (implies scaling_method=*) * - const --> a floating point constant * - GADS.field[.field2] --> value is provided in * global annotation dataset with name GADS in field * field. Optionally a second element index * for multiple-element fields can be given too */ float scaling_offset; /** * The scaling factor. * Possible values are: * - * --> no factor provided (implies scaling_method=*) * - const --> a floating point constant * - GADS.field[.field2] --> value is provided in global annotation dataset with name * GADS in field field. Optionally * a second element index for multiple-element fields can be * given too */ float scaling_factor; /** * A bit-mask expression used to filter valid pixels. All others are set to zero. */ char* bm_expr; /** * The flag coding is a list of EPR_SFlag instances. It determines each of the flags * used in this band (= flags dataset). * Each flag has a name, a bit-index and a description. */ EPR_SPtrArray* flag_coding; /** * The geophysical unit for the band's pixel values */ char* unit; /** * A short description of the band's contents */ char* description; /** * If true (=1) lines will be mirrored (flipped) after read into a raster * in order to ensure a pixel ordering in raster X direction from * WEST to EAST. */ epr_boolean lines_mirrored; }; /** * Represents a binary time value field in ENVISAT records. * *

Refer to ENVISAT documentation for the exact definition of * this data type. */ struct EPR_Time { int days; uint seconds; uint microseconds; }; /*************************************************************************/ /********************************* FUNCTIONS *****************************/ /*************************************************************************/ /* * ============================ (1) Initialisation ========================== */ /** * @defgroup INIT API Initialisation * @{ */ /** * Initializes the ENVISAT product reader API. * * * @param log_level the log level. All logging messages with a log level lower * than the given one, will be supressed * @param log_handler the log handler function pointer which * will be used for logging, can be NULL, * if logging shall be disabled * @param err_handler the new error handler (function pointer), * can be NULL, if errors shall not be reported * @return zero for success, an error code otherwise * * @author Norman Fomferra */ int epr_init_api(EPR_ELogLevel log_level, EPR_FLogHandler log_handler, EPR_FErrHandler err_handler); /** * Closes the ENVISAT product reader API by releasing all * resources allocated by the API. * * @author Norman Fomferra */ void epr_close_api(); /** @} */ /* * ============================ (2) Logging ============================ */ /** * @defgroup LOGGING Logging * @{ */ /** * Sets the log level for the ENVISAT API. All logging * messages with a log level lower than the given one, will * be supressed, thus the log handler will not be called * for such messages. * * @param log_level the new log level. All logging messages with a log level lower * than the given one, will be supressed * @return zero for success, an error code otherwise */ int epr_set_log_level(EPR_ELogLevel log_level); /** * Sets the log handler for the ENVISAT API. * * @param log_handler the log handler function pointer which * will be used for logging, can be NULL, if logging shall * be disabled * * @see epr_log_message */ void epr_set_log_handler(EPR_FLogHandler log_handler); /** * A default implementation for a logging function to be passed into * the epr_init() function. The function writes to * stdout, the format is: log_level date time log_message. * * @param log_level the log level * @param log_message the log message */ void epr_log_message(EPR_ELogLevel log_level, const char* log_message); /** @} */ /* * ========================= (3) Error Handling ========================== */ /** * @defgroup ERROR Error Handling * @{ */ /** * Sets the error handler for the ENVISAT API. * * @param err_handler the new error handler (function pointer), * can be NULL, if errors shall not be reported */ void epr_set_err_handler(EPR_FErrHandler err_handler); /** * Gets the error code of the error that occured during * the last API function call. * * @return the error code, e_err_none or zero if no error occured */ EPR_EErrCode epr_get_last_err_code(); /** * Gets the error message of the error that occured during * the last API function call. * * @return the error message, NULL if no error occured */ const char* epr_get_last_err_message(); /** * Clears the last error. After calling this function, calling * epr_get_last_err_code returns e_err_none or zero and * epr_get_last_err_message returns NULL. */ void epr_clear_err(); /** @} */ /* * ========================== (4) Input / Output ============================ */ /** * @defgroup IO Input / Output * @{ */ /* * ======================= (4.1) Product File Access ========================== */ /** * @defgroup ProductIO Product IO * @{ */ /** * Opens the ENVISAT product file with the given file path, *
reads MPH, SPH and all DSDs,
organized the table with * parameter of line length and tie points number; *
returns a file identifier for the product. * *

The ENVISAT product reader API must be initialized before. * * @param product_file_path the path to the ENVISAT product file * @return the product identifier, or NULL if the file * could not be opened. epr_get_error_code() should * be called in this case in order to obtain the error code. */ EPR_SProductId* epr_open_product(const char* product_file_path); /** * Closes the ENVISAT product file determined by the given product identifier. * * @param product_id the product identifier, if NULL the function * immediately returns zero. * @return zero for success, an error code otherwise */ int epr_close_product(EPR_SProductId* product_id); /** @} */ /** @} */ /* * ================= (4.2) Writing to a file or standard output ================= */ /** * @ingroup IO * @defgroup WtFoSO Writing to a file or standard output * This group of functions is for writing an object to a file * or standard output. * * An object can be: * - record * - field * - field element * * If FILE* istream is given, the ASCII file will be outputed, * else printed to standard output device. * *

In case record and/or field: * @param record the record, must not be NULL * @param field the field, must not be NULL * *

In case field element: * @param record the record, must not be NULL * @param field_index the index of field in the given record * @param element_index the index of element in the given field * * @param ostream the identifier of the output file. */ /** @{ */ void epr_print_record(const EPR_SRecord* record, FILE* ostream); void epr_print_field(const EPR_SField* field, FILE* ostream); void epr_print_element(const EPR_SRecord* record, uint field_index, uint element_index, FILE* ostream); void epr_dump_record(const EPR_SRecord* record); void epr_dump_field(const EPR_SField* field); void epr_dump_element(const EPR_SRecord* record, uint field_index, uint element_index); /** @} */ /* * ======================= (5) Basic Data Access ========================= */ /** * @defgroup DA Basic Data Access * @{ */ /** * Gets the product's scene width in pixels. * * @param product_id the product identifier, must not be NULL * @return the product's total scene width in pixels, or 0 * if an error occured. */ uint epr_get_scene_width(const EPR_SProductId* product_id); /** * Gets the product's scene height in pixels. * * @param product_id the product identifier, must not be NULL * @return the product's total scene height in pixels, or 0 * if an error occured. */ uint epr_get_scene_height(const EPR_SProductId* product_id); /** @} */ /* * ============================ (5.1) Dataset ============================== */ /** * @ingroup DA * @defgroup DATASET Dataset Access * @{ */ /** * Gets the number off all datasets contained in a product. * * @param product_id the product identifier, must not be NULL * @return the number off all dataset */ uint epr_get_num_datasets(EPR_SProductId* product_id); /** * Gets the dataset_id at the specified position within the product. * * @param product_id the product identifier, must not be NULL * @param index the index identifying the position of the dataset, starting with 0, * must not be negative * @return the requested dataset_id */ EPR_SDatasetId* epr_get_dataset_id_at(EPR_SProductId* product_id, uint index); /** * Gets the dataset_id coresponding to the specified dataset name. * * @param product_id the product identifier, must not be NULL * @param dataset_name the dataset name, must not be NULL * @return the requested dataset_id */ EPR_SDatasetId* epr_get_dataset_id(EPR_SProductId* product_id, const char* dataset_name); /** * Gets the name of the dataset for the given dataset ID. * * @param dataset_id the dataset identifier, must not be NULL * @return the name of the dataset. */ const char* epr_get_dataset_name(EPR_SDatasetId* dataset_id); /** * Gets the name of the dsd for the given dataset ID. * * @param dataset_id the dataset identifier, must not be NULL * @return the name of the dsd. */ const char* epr_get_dsd_name(const EPR_SDatasetId* dataset_id); /** * Gets the MPH record from the given product_id. * * @param product_id the product identifier, must not be NULL * @return the MPH record or NULL if an error occured. */ EPR_SRecord* epr_get_mph(const EPR_SProductId* product_id); /** * Gets the SPH record from the given product_id. * * @param product_id the product identifier, must not be NULL * @return the SPH record or NULL if an error occured. */ EPR_SRecord* epr_get_sph(const EPR_SProductId* product_id); /** * Gets the dataset descriptor (DSD) for the dataset specified by dataset_id. * * @param dataset_id the dataset identifier, must not be NULL * @return the pointer at the dsd or NULL if an error occured. */ const EPR_SDSD* epr_get_dsd(const EPR_SDatasetId* dataset_id); /** * Gets the number of records of the dataset specified by dataset_id. * * @param dataset_id the dataset identifier, must not be NULL * @return the number of records or 0 if an error occured. */ uint epr_get_num_records(const EPR_SDatasetId* dataset_id); uint epr_get_num_dsds(const EPR_SProductId* product_id); EPR_SDSD* epr_get_dsd_at(const EPR_SProductId* product_id, uint dsd_index); /** @} */ /* * ================================= (5.2) Records ============================ */ /** * @ingroup DA * @defgroup REC Record Access * @{ */ /** * Creates a new, empty record with a structure compatible with the dataset specified * by dataset_id. Such a record is typically used in subsequent calls to epr_read_record. * * @param dataset_id the dataset identifier, must not be NULL * @return the new record instance * or NULL if an error occured. */ EPR_SRecord* epr_create_record(EPR_SDatasetId* dataset_id); /** * Reads a record of a dataset specified by dataset_id. *

* The record is identified through the given dataset identifier and the given * zero-based record index. In order to reduce memory reallocation, a * record (pre-) created by the function epr_create_record * can be passed to this function. Data is then read into this given record. * If no record (NULL) is given, the function initiates a new * one. In both cases, the record in which the data is read into will be * returned. * * @param dataset_id the dataset identifier, must not be NULL * @param record_index the zero-based record index * @param record a pre-created record to reduce memory reallocation, * can be NULL to let the function allocate a new record * @return the record in which the data has been read into * or NULL if an error occured. */ EPR_SRecord* epr_read_record(EPR_SDatasetId* dataset_id, uint record_index, EPR_SRecord* record); /** * Frees the memory allocated through the given record. * *

After calling this function the given record pointer becomes * invalid and should not be used anymore. * */ void epr_free_record(EPR_SRecord* record); /** @} */ /* * =========================== (5.3) Field Access ============================= */ /** * @ingroup DA * @defgroup FA Field Access * @{ */ /** * Gets a field from the given record. * *

The field is here identified through the given name. *
It contains the field info and all corresponding values. * * @param record the record identifier, must not be NULL * @param field_name the the name of required field, must not be NULL. * @return the field or NULL if an error occured. */ const EPR_SField* epr_get_field(const EPR_SRecord* record, const char* field_name); /** * Gets the number of fields contained in the given record. * * @param record the record to be analysed, must not be NULL * @return the fields number or 0 if an error occured. */ uint epr_get_num_fields(const EPR_SRecord* record); /** * Gets a field at the specified position within the record. * * @param record the record from the field shall be returned, * must not be NULL * @param field_index the zero-based index (position within record) of the field * @return the field or NULL if an error occured. */ const EPR_SField* epr_get_field_at(const EPR_SRecord* record, uint field_index); /** * Gets the unit of the field. * * @param field the field from which the unit shall be returned, must not be NULL * @return the field unit or NULL if an error occured. */ const char* epr_get_field_unit(const EPR_SField* field); /** * Gets the description of the field. * * @param field field from which the description shall be returned, must not be NULL * * @return the field description or NULL if an error occured. */ const char* epr_get_field_description(const EPR_SField* field); /** * Gets the number of elements of the field. * * @param field field to be analysed, must not be NULL * * @return the number of elements of the field or 0 if an error occured. */ uint epr_get_field_num_elems(const EPR_SField* field); /** * Gets the name of the field. * * @param field field to be analysed, must not be NULL * * @return the field name or NULL if an error occured. */ const char* epr_get_field_name(const EPR_SField* field); /** * Gets the type of the field. * * @param field field to be analysed, must not be NULL * * @return the field type or 0 if an error occured. */ EPR_EDataTypeId epr_get_field_type(const EPR_SField* field); /** @} */ /* * ========================= (5.4) Single Element Access ========================= */ /** * @ingroup DA * @defgroup FSEA Field Single Element Access * This group of functions is for getting the elements of a field as a typed value. *
Typed value means that the returned variable is of a certain variable type, * e.g. such as short or float. *
The type is located in the field info. See epr_get_field_type. *
One field must have one type only. * * @param field the field, must not be NULL * @param elem_index the zero-based index of element to be returned, must not be negative. * * @return the typed value from given field */ /*@{*/ char epr_get_field_elem_as_char(const EPR_SField* field, uint elem_index); uchar epr_get_field_elem_as_uchar(const EPR_SField* field, uint elem_index); short epr_get_field_elem_as_short(const EPR_SField* field, uint elem_index); ushort epr_get_field_elem_as_ushort(const EPR_SField* field, uint elem_index); int epr_get_field_elem_as_int(const EPR_SField* field, uint elem_index); uint epr_get_field_elem_as_uint(const EPR_SField* field, uint elem_index); float epr_get_field_elem_as_float(const EPR_SField* field, uint elem_index); double epr_get_field_elem_as_double(const EPR_SField* field, uint elem_index); const EPR_STime* epr_get_field_elem_as_mjd(const EPR_SField* field); const char* epr_get_field_elem_as_str(const EPR_SField* field); /*@}*/ /* * =========================== (5.5) Array Element Access ============================= */ /** * @ingroup DA * @defgroup FAEA Field Array Element Access * This group of functions is for getting an array of field elements * of a certain data type. *

If the given field is not of the expected type, the functions * return NULL. * * @param field the field, must not be NULL * @return the data array of the expected type or NULL * if the field is of a different type */ /*@{*/ const char* epr_get_field_elems_char(const EPR_SField* field); const uchar* epr_get_field_elems_uchar(const EPR_SField* field); const short* epr_get_field_elems_short(const EPR_SField* field); const ushort* epr_get_field_elems_ushort(const EPR_SField* field); const int* epr_get_field_elems_int(const EPR_SField* field); const uint* epr_get_field_elems_uint(const EPR_SField* field); const float* epr_get_field_elems_float(const EPR_SField* field); const double* epr_get_field_elems_double(const EPR_SField* field); /*@}*/ /** * @ingroup DA * @defgroup CFE Copy Field Elems * This group of functions is for copying the data of the given field into the given * buffer of elements by selected type. The actual number of elements copied is the * minimum of the given number of elements (the buffer's size) and the actual number * of elements contained * in the field. *

If the actual field data type is not selected type, the function automatically * performs the conversion. * * @param field the field from which to copy the elements * @param buffer the buffer in which to copy the data * @param num_elems the number of elements in the given buffer * @return the actual number of elements copied */ /*@{*/ uint epr_copy_field_elems_as_ints(const EPR_SField* field, int* buffer, uint num_elems); uint epr_copy_field_elems_as_uints(const EPR_SField* field, uint* buffer, uint num_elems); uint epr_copy_field_elems_as_floats(const EPR_SField* field, float* buffer, uint num_elems); uint epr_copy_field_elems_as_doubles(const EPR_SField* field, double* buffer, uint num_elems); /*@}*/ /* * ======================== (6) Geophysical Data Access ========================= */ /** * @defgroup GDA Geopysical Data Access * @{ */ /** @} */ /* * ================================== (6.1) Raster =============================== */ /** * @ingroup GDA * @defgroup RASTER Raster Data Access * @{ */ /** * Creates a raster which is compatible with the data type contained in the band * identified by band_id. The created raster is used to read the data in it * (see epr_read_band_raster). *

* The raster is defined on the grid of the product, from which the data are read. Spatial * subsets and undersampling are possible) through the parameter of the function. *

* The concept of defining the raster is such: A certain portion of the ENVISAT product * will be read into the raster. This is called the source. The complete ENVISAT product can be * much greater than the source. One can move the raster over the complete ENVISAT product and * read in turn different parts - always of the size of the source - of it into the raster. * The source is specified by the parameter source_height and source_width. *

* A typical example is a processing in blocks. Lets say, a block * has 64x32 pixel. Then, my source has a width of 64 pixel and a height of 32 pixel. Another * example is a processing of complete image lines. Then, my source has a widths of the complete * product (for example 1121 for a MERIS RR product), and a height of 1). One can loop over all blocks * read into the raster and process it. *

* In addition, it is possible to defined a subsampling step for a raster. This means, that the * source is not read 1:1 into the raster, but that only every 2nd or 3rd pixel is read. This step * can be set differently for the across track (source_step_x) and along track (source_step_y) directions. * * @param band_id the band identifier. The raster will be compatible with the data type * of that band; must not be NULL * @param source_width the width (across track dimension) of the source to be read into the raster. See text above. * @param source_height the height (along track dimension) of the source to be read into the raster. See text above. * @param source_step_x the subsampling step across track of the source when reading into the raster. See text above. * @param source_step_y the subsampling step along track of the source when reading into the raster. See text above. * * @return the new raster instance * or NULL if an error occured. */ EPR_SRaster* epr_create_compatible_raster(EPR_SBandId* band_id, uint source_width, uint source_height, uint source_step_x, uint source_step_y); /** * Creates a raster of the specified data type. This function can be used to create any type of raster, * e.g. for later use as a bit-mask. * * @param data_type the type of the data to stored in the raster, must not be NULL * @param source_width the width (across track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster. * @param source_height the height (along track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster. * @param source_step_x the subsampling step across track of the source when reading into the raster. See description of epr_create_compatible_raster. * @param source_step_y the subsampling step along track of the source when reading into the raster. See description of epr_create_compatible_raster. * @return the new raster instance * or NULL if an error occured. */ EPR_SRaster* epr_create_raster(EPR_EDataTypeId data_type, uint source_width, uint source_height, uint source_step_x, uint source_step_y); /** * Creates a raster to be used for reading bitmasks. The raster returned always is of type byte. * * @param source_width the width (across track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster. * @param source_height the height (along track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster. * @param source_step_x the subsampling step across track of the source when reading into the raster. See description of epr_create_compatible_raster. * @param source_step_y the subsampling step along track of the source when reading into the raster. See description of epr_create_compatible_raster. * @return the new raster instance * or NULL if an error occured. */ EPR_SRaster* epr_create_bitmask_raster(uint source_width, uint source_height, uint source_step_x, uint source_step_y); /** * Reads (geo-)physical values of the given band of the specified source-region. *

The source-region is a defined part of the whole ENVISAT product image, which shall be read into * a raster. In this routine the co-ordinates are specified, where the source-region to be read starts. * The dimension of the region and the sub-sampling are attributes of the raster into which the data are * read. * * @param band_id the identified of the band to be read into the raster. * @param offset_x across-track source co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region * @param offset_y along-track source co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region * @param raster the identifier to given raster information and raster buffer * * @return zero for success, and error code otherwise * * @see epr_create_compatible_raster * @see epr_create_rater */ int epr_read_band_raster(EPR_SBandId* band_id, int offset_x, int offset_y, EPR_SRaster* raster); /** * @todo 1 se/nf - doku */ uint epr_get_raster_elem_size(const EPR_SRaster* raster); /** * @todo 1 se/nf - doku */ void* epr_get_raster_elem_addr(const EPR_SRaster* raster, uint offset); /** * @todo 1 se/nf - doku */ void* epr_get_raster_pixel_addr(const EPR_SRaster* raster, uint x, uint y); /** * @todo 1 se/nf - doku */ void* epr_get_raster_line_addr(const EPR_SRaster* raster, uint y); /** * Gets the raster's scene width in pixels. * * @param raster the raster identifier, must not be NULL * @return the raster's total scene width in pixels, or 0 * if an error occured. */ uint epr_get_raster_width(EPR_SRaster* raster); /** * Gets the raster's scene height in pixels. * * @param raster the product identifier, must not be NULL * @return the raster's total scene height in pixels, or 0 * if an error occured. */ uint epr_get_raster_height(EPR_SRaster* raster); /** * Gets the number of all bands contained in a product. * * @param product_id the source product ID, must not be NULL * @return the number off all bands */ uint epr_get_num_bands(EPR_SProductId* product_id); /** * Gets the band ID at the specified position within the product. * * @param product_id the source product ID, must not be NULL * @param index the index identifying the position of the band, starting with 0, * must not be negative * @return the requested band ID, or NULL if not found */ EPR_SBandId* epr_get_band_id_at(EPR_SProductId* product_id, uint index); /** * Gets the band ID corresponding to the specified name. * * @param product_id the source product ID, must not be NULL * @param band_name the name of the band, must not be NULL * @return the requested band ID, or NULL if not found */ EPR_SBandId* epr_get_band_id(EPR_SProductId* product_id, const char* band_name); /** * Gets the name of the band for the given band ID. * * @param band_id the band identifier, must not be NULL * @return the name of the band. */ const char* epr_get_band_name(EPR_SBandId* band_id); /** * Release the memory allocated through a raster. * * @param raster the raster to be released. */ void epr_free_raster(EPR_SRaster* raster); /** @} */ /* * ============================ (6.2) Single Pixel Access ======================== */ /** * @ingroup GDA * @defgroup SPA Single Pixel Access * @{ */ /** * This group of functions is for getting the values of the elements of a raster * (i.e. pixel) in a type-safe way.
* * @param raster the raster which contains the pixel, must not be NULL * @param x the (zero-based) X co-ordinate of the pixel * @param y the (zero-based) Y co-ordinate of the pixel * * @return the typed value at the given co-ordinate. */ uint epr_get_pixel_as_uint(const EPR_SRaster* raster, int x, int y); int epr_get_pixel_as_int(const EPR_SRaster* raster, int x, int y); float epr_get_pixel_as_float(const EPR_SRaster* raster, int x, int y); double epr_get_pixel_as_double(const EPR_SRaster* raster, int x, int y); /*@}*/ /* * ================================= (7) Bitmasks ========================== */ /** * @defgroup BM Bitmask * @{ */ /** * Calculates a bit-mask, composed of flags of the given product and combined as described in the * given bit-mask expression, for the a certain dimension and sub-sampling as defined in the * given raster. *

* * @param product_id Identifier of the ENVISAT product for which the bit-mask shall be created. * This is used by the function to retreive the needed flags. * @param bm_expr A string holding the logical expression for the defintion of the bit-mask. * In a bit-mask expression, any number of the flag-names (found in the DDDB) can * be composed with "(", ")", "NOT", "AND", "OR". Valid bit-mask expression are for example:
* "flags.LAND OR flags.CLOUD" or "NOT flags.WATER AND flags.TURBID_S". * @param offset_x across-track co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region * @param offset_y along-track co-ordinate in pixel co-ordinates (zero-based) of the upper right corner of the source-region * @param raster the raster for the bit-mask. The data type of the raster must be either e_tid_uchar or e_tid_char. * * @return zero for success, an error code otherwise * * @see create_band_raster */ int epr_read_bitmask_raster(EPR_SProductId* product_id, const char* bm_expr, int offset_x, int offset_y, EPR_SRaster* raster); /** @} */ /* * ================================= (8) Utility functions ========================== */ /** * @defgroup UTILS Utility Functions * @{ */ /** * Gets the size in bytes for an element of the given data type. */ uint epr_get_data_type_size(EPR_EDataTypeId data_type_id); /** * Gets the 'C' data type string for the given data type. */ const char* epr_data_type_id_to_str(EPR_EDataTypeId data_type_id); /** @} */ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_API_H_INCL */ bcdev-epr-api-a922482/src/epr_band.c000066400000000000000000002024301142554441000171130ustar00rootroot00000000000000/* * $Id: epr_band.c,v 1.2 2009-03-27 10:25:54 sabine Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" /** * Obtains all bands infos from the dddb. */ EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id) { EPR_SBandId* band_id = NULL; EPR_SPtrArray* band_ids = NULL; char test_block[1024]; int bt_index; int i; const struct BandDescriptorTable* b_tables; int num_descr; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_create_band_ids: product_id must not be NULL"); return NULL; } /* @DDDB */ b_tables = dddb_band_tables; bt_index = -1; for (i = 0; i < EPR_NUM_BAND_TABLES; i++) { const char* id = b_tables[i].name; if (strncmp(product_id->id_string, id, 10) == 0) { if (product_id->meris_iodd_version == 5) { if (strcmp(id, "MER_RR__1P_IODD5") == 0 || strcmp(id, "MER_FR__1P_IODD5") == 0) { bt_index = i; } } else if (product_id->meris_iodd_version == 6) { if (strcmp(id, "MER_RR__2P_IODD6") == 0 || strcmp(id, "MER_FR__2P_IODD6") == 0) { bt_index = i; } } else { bt_index = i; } } if (bt_index != -1) { break; } } if (bt_index == -1) { epr_set_err(e_err_null_pointer, "epr_create_band_ids: unknown product type"); return NULL; } band_ids = epr_create_ptr_array(16); num_descr = b_tables[bt_index].num_descriptors; for (i = 0; i < num_descr; i++) { band_id = (EPR_SBandId*) calloc(1, sizeof (EPR_SBandId)); if (band_id == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_band_ids: out of memory"); return NULL; } band_id->magic = EPR_MAGIC_BAND_ID; band_id->product_id = product_id; /* 1: band_name */ epr_assign_string(&band_id->band_name, b_tables[bt_index].descriptors[i].id); /* 2: dataset_name */ band_id->dataset_ref = epr_get_ref_struct(product_id, b_tables[bt_index].descriptors[i].rec_name); if (band_id->dataset_ref.dataset_id == NULL) { epr_set_err(e_err_invalid_dataset_name, "epr_create_band_ids: invalid dataset name in DDDB"); epr_free_band_id(band_id); return NULL; } /* 3: sample_offset */ band_id->sample_model = b_tables[bt_index].descriptors[i].sample_offset; /* 4: band_datatype */ band_id->data_type = b_tables[bt_index].descriptors[i].type; /* 5: spectr_band_index*/ band_id->spectr_band_index = b_tables[bt_index].descriptors[i].spectral_index; /* 6: scaling_method*/ if (b_tables[bt_index].descriptors[i].scale_method == e_smid_non) { band_id->scaling_method = 0; band_id->scaling_offset = 0.0; band_id->scaling_factor = 1.0; } else { band_id->scaling_method = b_tables[bt_index].descriptors[i].scale_method; /* 7: scaling_offset*/ strcpy (test_block, b_tables[bt_index].descriptors[i].scale_offset); if (test_block == NULL) { band_id->scaling_offset = 0.0; } else { float scaling_offset = (float)atof(test_block); if (epr_numeral_suspicion(test_block) == 1) { band_id->scaling_offset = scaling_offset; } else { scaling_offset = epr_get_scaling_params(product_id, test_block); if (scaling_offset == -909.909) { /* @todo what an ugly return value. Eeeek!*/ epr_set_err(e_err_invalid_dataset_name, "epr_create_band_ids: invalid dataset name in dddb"); epr_free_band_id(band_id); return NULL; } band_id->scaling_offset = scaling_offset; } } /* 8: scaling_factor*/ strcpy (test_block, b_tables[bt_index].descriptors[i].scale_factor); if (test_block == NULL) { band_id->scaling_factor = 0.0; } else { float scaling_factor = (float)atof(test_block); if (epr_numeral_suspicion(test_block) == 1) { band_id->scaling_factor = scaling_factor; } else { scaling_factor = epr_get_scaling_params(product_id, test_block); if (scaling_factor == -909.909) { /* @todo what an ugly return value. Eeeek!*/ epr_set_err(e_err_invalid_dataset_name, "epr_create_band_ids: invalid dataset name in dddb"); epr_free_band_id(band_id); return NULL; } band_id->scaling_factor = scaling_factor; } } } /* 9: bit_expr*/ epr_assign_string(&band_id->bm_expr, b_tables[bt_index].descriptors[i].bitmask_expr); /* 10: flags_definition_file*/ if (b_tables[bt_index].descriptors[i].flag_coding_name != NULL) { band_id->flag_coding = epr_create_flag_coding(product_id, b_tables[bt_index].descriptors[i].flag_coding_name); if (band_id->flag_coding == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_band_ids: out of memory"); epr_free_band_id(band_id); return NULL; } } else { band_id->flag_coding = NULL; } /* 11: unit*/ epr_assign_string(&band_id->unit, b_tables[bt_index].descriptors[i].unit); /* 12: description*/ epr_assign_string(&band_id->description, b_tables[bt_index].descriptors[i].description); /* lines_flipped*/ if (strncmp(product_id->id_string, EPR_ENVISAT_PRODUCT_MERIS, 3) == 0 || strncmp(product_id->id_string, EPR_ENVISAT_PRODUCT_AATSR, 3) == 0) { band_id->lines_mirrored = TRUE; } else { if (strncmp(product_id->id_string, EPR_ENVISAT_PRODUCT_ASAR, 3) == 0 && strncmp(product_id->id_string, "ASA_IMG", 7) != 0 && strncmp(product_id->id_string, "ASA_APG", 7) != 0) { band_id->lines_mirrored = TRUE; } else { band_id->lines_mirrored = FALSE; } } epr_add_ptr_array_elem(band_ids, band_id); } return band_ids; } uint epr_get_num_bands(EPR_SProductId* product_id) { epr_clear_err(); if (!epr_check_api_init_flag()) { return 0; } if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_num_bands: product_id must not be NULL"); return (uint) -1; } return product_id->band_ids->length; } EPR_SBandId* epr_get_band_id_at(EPR_SProductId* product_id, uint index) { EPR_SBandId* band_id = NULL; epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_band_id_at: product_id must not be NULL"); return NULL; } if (index >= product_id->band_ids->length) { epr_set_err(e_err_index_out_of_range, "epr_get_band_id_at: band index out of range"); return NULL; } band_id = (EPR_SBandId*)epr_get_ptr_array_elem_at(product_id->band_ids, index); return band_id; } EPR_SBandId* epr_get_band_id(EPR_SProductId* product_id, const char* band_name) { EPR_SBandId* band_id = NULL; int num_bands, i; epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_band_id: product_id must not be NULL"); return NULL; } if (band_name == NULL) { epr_set_err(e_err_null_pointer, "epr_get_band_id: dataset_name must not be NULL"); return NULL; } num_bands = epr_get_num_bands(product_id); for (i = 0; i < num_bands; i++) { band_id = epr_get_band_id_at(product_id, i); if (epr_equal_names(band_name, epr_get_band_name(band_id))) { return band_id; } } epr_set_err(e_err_invalid_band_name, "epr_get_band_id: band not found"); return NULL; } const char* epr_get_band_name(EPR_SBandId* band_id) { epr_clear_err(); if (band_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_band_name: band_id must not be NULL"); return NULL; } return band_id->band_name; } /** * Release the memory allocated through a band ID. * * @param band the dataset description identifier, if NULL the function * immediately returns zero. * @return zero for success, an error code otherwise */ void epr_free_band_id(EPR_SBandId* band_id) { if (band_id == NULL) return; band_id->dataset_ref.elem_index = -1; band_id->dataset_ref.field_index = -1; band_id->dataset_ref.dataset_id = NULL; epr_free_and_null_string(&band_id->band_name); epr_free_and_null_string(&band_id->bm_expr); epr_free_flag_coding(band_id->flag_coding); band_id->flag_coding = NULL; band_id->spectr_band_index = 0; band_id->scaling_offset = 0; band_id->scaling_factor = 0; band_id->data_type = e_tid_unknown; epr_free_and_null_string(&band_id->unit); epr_free_and_null_string(&band_id->description); band_id->lines_mirrored = FALSE; free(band_id); } /** * Gets the scaling params: factor or offset by the given dataset_id, field_index, elem_index * * @param product_id the the product file identifier * @param str the string with the name, separator ('.') and indexes. * @return the dataset_id, field_index and elem_index (-1 if no). * NULL if correspondent dataset name was not found. */ float epr_get_scaling_params(EPR_SProductId* product_id, const char* str) { EPR_SDatasetRef scal_fact; const EPR_SField* field = NULL; EPR_SRecord* record = NULL; float ziff; scal_fact = epr_get_ref_struct(product_id, str); if (scal_fact.dataset_id == NULL) { return (float)(-909.909); } /*'Scaling_Factor_GADS'*/ record = epr_create_record(scal_fact.dataset_id); record = epr_read_record(scal_fact.dataset_id, 0, record); field = epr_get_field_at(record, scal_fact.field_index - 1); ziff = epr_get_field_elem_as_float(field, (uint)(scal_fact.elem_index - 1)); epr_free_record(record); return ziff; } /** * Gets the scaling factor by the given dataset_id, field_index, elem_index * * @param product_id the the product file identifier * @param str the string with the name, separator ('.') and indexes. * @return the dataset_id, field_index and elem_index (-1 if no). * NULL if correspondent dataset name was not found. */ float epr_get_scaling_factor(EPR_SProductId* product_id, const char* str) { EPR_SDatasetRef scal_fact; const EPR_SField* field = NULL; EPR_SRecord* record = NULL; float ziff; scal_fact = epr_get_ref_struct(product_id, str); if (scal_fact.dataset_id == NULL) { return (float)(-909.909); } /*'Scaling_Factor_GADS'*/ record = epr_create_record(scal_fact.dataset_id); record = epr_read_record(scal_fact.dataset_id, 0, record); field = epr_get_field_at(record, scal_fact.field_index - 1); ziff = epr_get_field_elem_as_float(field, (uint)(scal_fact.elem_index - 1)); epr_free_record(record); return ziff; } /** * Gets the dataset_id, field_index and elem_index * * @param product_id the the product file identifier * @param str the string with the name, separator ('.') and indexes. * @return the dataset_id, field_index and elem_index (-1 if no). * NULL if correspondent dataset name was not found. */ EPR_SDatasetRef epr_get_ref_struct(EPR_SProductId* product_id, const char* str) { EPR_SDatasetRef ref_struct; int pos = 0; char* stopstring; char* token; ref_struct.dataset_id = NULL; ref_struct.field_index = -1; ref_struct.elem_index = -1; token = epr_str_tok(str, ".", &pos); ref_struct.dataset_id = epr_get_dataset_id(product_id, token); if (ref_struct.dataset_id == NULL) { epr_free_and_null_string(&token); return ref_struct; } epr_free_and_null_string(&token); token = epr_str_tok(str, ".", &pos); if (token == NULL) { ref_struct.field_index = -1; } else { ref_struct.field_index = strtol(token, &stopstring, 10); } epr_free_and_null_string(&token); token = epr_str_tok(str, ".", &pos); if (token == NULL) { ref_struct.elem_index = -1; } else { ref_struct.elem_index = strtol(token, &stopstring, 10); } epr_free_and_null_string(&token); return ref_struct; } /** * Converts the given string into a scaling method identifier. * * @param str the string to be converted. * @return the scaling method identifier represented by the given string. * If the string is equal of '*' the value * e_non_smid is returned. */ EPR_EScalingMethod epr_str_to_scaling_method(const char* str) { assert(str != NULL); if (epr_equal_names(str, "Linear_Scale")) return e_smid_lin; else if (epr_equal_names(str, "Log_Scale")) return e_smid_log; else return e_smid_non; } /** * Converts the given string into a sample offset identifier. * * @param str the string to be converted. * @return the sample offset identifier represented by the given string. * If the string is equal of '*' the value * e_none_samoff is returned. */ EPR_ESampleModel epr_str_to_sample_offset(const char* str) { assert(str != NULL); if (epr_equal_names(str, "1OF2")) return e_smod_1OF2; else if (epr_equal_names(str, "2OF2")) return e_smod_2OF2; else if (epr_equal_names(str, "3TOI")) return e_smod_3TOI; else if (epr_equal_names(str, "2TOF")) return e_smod_2TOF; else return e_smod_1OF1; } /** * Creates a raster to be used for reading bitmasks. The raster returned is always of type byte. * * @param source_width the width (across track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster. * @param source_height the height (along track dimension) of the source to be read into the raster. See description of epr_create_compatible_raster. * @param source_step_x the subsampling step across track of the source when reading into the raster. See description of epr_create_compatible_raster. * @param source_step_y the subsampling step along track of the source when reading into the raster. See description of epr_create_compatible_raster. * @return the new raster instance * or NULL if an error occured. */ EPR_SRaster* epr_create_bitmask_raster(uint source_width, uint source_height, uint source_step_x, uint source_step_y) { return epr_create_raster(e_tid_uchar, source_width, source_height, source_step_x, source_step_y); } /** * Creates a raster for the given datatype and dimension. * * @param data_type the data type identifier * @param source_width the source's width * @param source_height the source's height * @param source_step_x the sub-sampling in X * @param source_step_y the sub-sampling in Y * @return the new raster instance * or NULL if an error occured. */ EPR_SRaster* epr_create_raster(EPR_EDataTypeId data_type, uint source_width, uint source_height, uint source_step_x, uint source_step_y) { EPR_SRaster* raster = NULL; uint num_elems; epr_clear_err(); if (data_type == e_tid_string || data_type == e_tid_spare || data_type == e_tid_time) { epr_set_err(e_err_illegal_data_type, "epr_create_raster: illegal data type"); return NULL; } raster = (EPR_SRaster*) calloc(1, sizeof (EPR_SRaster)); if (raster == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_raster: out of memory"); return NULL; } raster->magic = EPR_MAGIC_RASTER; raster->data_type = data_type; raster->elem_size = epr_get_data_type_size(data_type); raster->source_height = source_height; raster->source_width = source_width; raster->source_step_x = source_step_x; raster->source_step_y = source_step_y; raster->raster_width = (source_width - 1) / source_step_x + 1; raster->raster_height = (source_height - 1) / source_step_y + 1; num_elems = raster->raster_width * raster->raster_height; raster->buffer = calloc(raster->elem_size, num_elems); if (raster->buffer == NULL) { epr_free_raster(raster); epr_set_err(e_err_out_of_memory, "epr_create_raster: out of memory"); return NULL; } return raster; } /** * Creates a compatible raster for the given band. * * @param band_id the band identifier, must not be NULL * @return the new raster instance * or NULL if an error occured. */ EPR_SRaster* epr_create_compatible_raster(EPR_SBandId* band_id, uint source_width, uint source_height, uint source_step_x, uint source_step_y) { epr_clear_err(); if (band_id == NULL) { epr_set_err(e_err_invalid_band, "epr_create_raster: band_id must not be NULL"); return NULL; } return epr_create_raster(band_id->data_type, source_width, source_height, source_step_x, source_step_y); } void epr_free_raster(EPR_SRaster* raster) { epr_clear_err(); if (raster == NULL) return; raster->data_type = e_tid_unknown; raster->elem_size = 0; raster->raster_height = 0; raster->raster_width = 0; raster->source_height = 0; raster->source_width = 0; raster->source_step_x = 0; raster->source_step_y = 0; if (raster->buffer != NULL) { free(raster->buffer); raster->buffer = NULL; } free(raster); } int epr_read_band_raster(EPR_SBandId* band_id, int offset_x, int offset_y, EPR_SRaster* raster/*, EPR_SRaster** bitmask_raster*/) { EPR_SProductId* product_id = NULL; EPR_SDatasetId* dataset_id = NULL; char* rec_type; epr_clear_err(); if (band_id == NULL) { epr_set_err(e_err_invalid_band, "epr_read_band_raster: band_id must not be NULL"); return epr_get_last_err_code(); } if (band_id->data_type != raster->data_type) { epr_set_err(e_err_illegal_data_type, "epr_read_band_raster: illegal raster data type"); return epr_get_last_err_code(); } if (raster->buffer == NULL) { epr_set_err(e_err_illegal_arg, "epr_read_band_raster: raster->buffer must not be NULL"); return epr_get_last_err_code(); } if ((offset_x<0) || (offset_y<0) || (raster->raster_width<0) || (raster->raster_height<0) || (raster->source_step_x<0) || (raster->source_step_y<0)) { epr_set_err(e_err_invalid_value, "epr_read_band_raster: all digit parameter must be positive"); return epr_get_last_err_code(); } /* removed because the source_step_x can truly be greater than raster_width. if ((raster->source_step_x>raster->raster_width) || (raster->source_step_y>raster->raster_height)) { epr_set_err(e_err_invalid_value, "epr_read_band_raster: too small raster sizes or large steps"); return epr_get_last_err_code(); } */ product_id = band_id->product_id; dataset_id = band_id->dataset_ref.dataset_id; rec_type = dataset_id->dsd->ds_type; if (strcmp(rec_type, "M") == 0) { if (epr_read_band_measurement_data(band_id, offset_x, offset_y, raster) != 0) { epr_set_err(e_err_file_read_error, "epr_read_band_raster: unsuccessfully reading band measurement data"); return epr_get_last_err_code(); } if (band_id->bm_expr != NULL) { EPR_SRaster* bm_raster; int rd_bm; bm_raster = epr_create_raster(e_tid_uchar, /*was char*/ raster->source_width, raster->source_height, raster->source_step_x, raster->source_step_y); rd_bm = epr_read_bitmask_raster(product_id, band_id->bm_expr, offset_x, offset_y, bm_raster); epr_zero_invalid_pixels(raster, bm_raster); epr_free_raster(bm_raster); } } else if (strcmp(rec_type, "A") == 0) { if (epr_read_band_annotation_data (band_id, offset_x, offset_y, raster) == 1) { epr_set_err(e_err_file_read_error, "epr_read_band_raster: unsuccessfully reading band annotation data"); return epr_get_last_err_code(); } } else { epr_set_err(e_err_invalid_value, "epr_read_band_raster: illegat DS-TYPE; 'A' or'M' will be accepted"); return epr_get_last_err_code(); } return e_err_none; } /** * Reads the measurement data and converts its into physical values. * * @param band_id the information about properties and quantities of ENVISAT data. * @param offset_x X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param offset_y Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param raster the instance to the buffer information was used * * @return zero for success, an error code otherwise */ int epr_read_band_measurement_data(EPR_SBandId* band_id, int offset_x, int offset_y, EPR_SRaster* raster) { EPR_SProductId* product_id = NULL; const EPR_SField* field = NULL; EPR_SFieldInfo* field_info = NULL; EPR_SDatasetId* dataset_id = NULL; EPR_SRecord* record = NULL; EPR_SRecord* sph_record = NULL; EPR_EDataTypeId band_datatype, datatype_id; EPR_ESampleModel band_smod; uint rec_size; uint rec_numb; int iY, raster_pos, delta_raster_pos; int offset_x_mirrored = 0; uint scan_line_length; EPR_FLineDecoder decode_func; uint scene_width; product_id = band_id->product_id; if (strncmp(EPR_ENVISAT_PRODUCT_MERIS, product_id->id_string, 3) == 0) { sph_record = product_id->sph_record; 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_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 { epr_set_err(e_err_illegal_arg, "epr_read_band_measurement_data: scan line length unknown"); return epr_get_last_err_code(); } dataset_id = band_id->dataset_ref.dataset_id; /*the length of measurement record size*/ rec_size = dataset_id->dsd->dsr_size; /*the number of measurement records*/ rec_numb = dataset_id->dsd->num_dsr; /*data type in the band*/ band_datatype = band_id->data_type; /*data model in the band*/ band_smod = band_id->sample_model; record = epr_create_record(dataset_id); field_info = (EPR_SFieldInfo*)epr_get_ptr_array_elem_at(record->info->field_infos, band_id->dataset_ref.field_index - 1); datatype_id = field_info->data_type_id; /* if the user raster (or part of) is outside bbox in source coordinates*/ if (offset_x + raster->raster_width > (int)scan_line_length) { epr_set_err(e_err_illegal_arg, "epr_read_band_measurement_data: raster x co-ordinates out of bounds"); epr_free_record(record); return epr_get_last_err_code(); } if (offset_y + raster->raster_height > (int)(rec_numb)) { epr_set_err(e_err_illegal_arg, "epr_read_band_measurement_data: raster y co-ordinates out of bounds"); epr_free_record(record); return epr_get_last_err_code(); } raster_pos = 0; delta_raster_pos = (int)floor((raster->source_width - 1) / raster->source_step_x) + 1; /*select the correspondent function to scaling and transform data type*/ decode_func = select_line_decode_function(band_datatype, band_smod, datatype_id); if (decode_func == NULL) { epr_set_err(e_err_illegal_data_type, "epr_read_band_measurement_data: internal error: unknown data type"); epr_free_record(record); return epr_get_last_err_code(); } scene_width = band_id->product_id->scene_width; if (band_id->lines_mirrored) { offset_x_mirrored = (scene_width - 1) - (offset_x + raster->source_width - 1); } else { offset_x_mirrored = offset_x; } for (iY = offset_y; (uint)iY < offset_y + raster->source_height; iY += raster->source_step_y ) { /*get the next record by the given name*/ record = epr_read_record(dataset_id, iY, record); /*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*/ decode_func(field->elems, band_id, offset_x_mirrored, raster->source_width, raster->source_step_x, raster->buffer, raster_pos); /*locate "data point" for the next "line"*/ raster_pos += delta_raster_pos; } if (band_id->lines_mirrored) { if (band_datatype == e_tid_float) { mirror_float_array((float*)raster->buffer, raster->raster_width, raster->raster_height); } else if (band_datatype == e_tid_uchar || band_datatype == e_tid_char) { mirror_uchar_array((uchar*)raster->buffer, raster->raster_width, raster->raster_height); } else if (band_datatype == e_tid_ushort || band_datatype == e_tid_short) { mirror_ushort_array((ushort*)raster->buffer, raster->raster_width, raster->raster_height); } else if (band_datatype == e_tid_uint || band_datatype == e_tid_int) { mirror_uint_array((uint*)raster->buffer, raster->raster_width, raster->raster_height); } else { epr_set_err(e_err_illegal_data_type, "epr_read_band_measurement_data: internal error: unknown data type"); epr_free_record(record); return epr_get_last_err_code(); } } epr_free_record(record); return 0; } /** * Reads the annotation data and converts its into physical values. * * @param band_id the information about properties and quantities of ENVISAT data. * @param offset_x X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param offset_y Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param raster the instance to the buffer information was used * * @return zero for success, an error code otherwise */ int epr_read_band_annotation_data(EPR_SBandId* band_id, int offset_x, int offset_y, EPR_SRaster* raster) { EPR_SProductId* product_id = NULL; const EPR_SField* field = NULL; const EPR_SField* field_beg = NULL; const EPR_SField* field_end = NULL; EPR_SFieldInfo* field_info = NULL; EPR_SDatasetId* dataset_id = NULL; EPR_SRecord* record = NULL; EPR_SRecord* record_beg = NULL; EPR_SRecord* record_end = NULL; EPR_SRecord* sph_record = NULL; EPR_EDataTypeId band_datatype = 0, datatype_id = 0; EPR_ESampleModel band_smod = 0; uint rec_size = 0; uint rec_numb = 0; uint lines_per_tie_pt, samples_per_tie_pt, scan_line_length; int iY, raster_pos, delta_raster_pos; EPR_FArrayTransformer transform_array_func = NULL; int y_beg, y_end, y_beg_old, y_end_old; int offset_x_mirrored = 0; uint num_elems = 0; float y_mod = 0; float scan_offset_x = 0; float scan_offset_y = 0; void* line_beg_buffer = NULL; void* line_end_buffer = NULL; product_id = band_id->product_id; dataset_id = band_id->dataset_ref.dataset_id; /*the length of annotation record size*/ rec_size = dataset_id->dsd->dsr_size; /*the number of annotation records*/ rec_numb = dataset_id->dsd->num_dsr; /*data type in the band*/ band_datatype = band_id->data_type; /*data model in the band*/ band_smod = band_id->sample_model; record = epr_create_record(dataset_id); field_info = (EPR_SFieldInfo*)epr_get_ptr_array_elem_at(record->info->field_infos, band_id->dataset_ref.field_index - 1); datatype_id = field_info->data_type_id; /*find LINES_PER_TIE_PT & SAMPLES_PER_TIE_PT for different products*/ if (strncmp(EPR_ENVISAT_PRODUCT_MERIS, product_id->id_string, 3) == 0) { /*elements number in the band (e.g.71)*/ scan_offset_x = 0.0F; /*!! was 0.5F !!*/ scan_offset_y = 0.0F; /*!! was 0.5F !!*/ num_elems = field_info->num_elems; sph_record = product_id->sph_record; field = epr_get_field(sph_record, "LINES_PER_TIE_PT"); lines_per_tie_pt = epr_get_field_elem_as_uint(field, 0); field = epr_get_field(sph_record, "SAMPLES_PER_TIE_PT"); samples_per_tie_pt = epr_get_field_elem_as_uint(field, 0); 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_line_length = EPR_ATS_LINE_LENGTH; lines_per_tie_pt = EPR_AATSR_LINES_PER_TIE_PT; num_elems = field_info->num_elems; if (num_elems == EPR_ATS_NUM_PER_POINT_ACROSS_LOCAT) { scan_offset_x = -19.0F; samples_per_tie_pt = 25; } else if (num_elems == EPR_ATS_NUM_PER_POINT_ACROSS_SOLAR) { scan_offset_x = 6.0F; samples_per_tie_pt = 50; } else { epr_set_err(e_err_invalid_value, "epr_read_band_annotation_data: internal error: illegal value for samples_per_tie_pt"); epr_free_record(record); return epr_get_last_err_code(); } } else if (strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0) { EPR_SDatasetId* dataset_id = NULL; uint num_rec; scan_offset_x = 0.5F; /* @todo CHECK THIS FOR ASAR! */ scan_offset_y = 0.5F; scan_line_length = epr_get_scene_width(product_id); samples_per_tie_pt = scan_line_length / (EPR_ASAR_NUM_PER_POINT_ACROSS_LOCAT - 1); dataset_id = epr_get_dataset_id(product_id, "GEOLOCATION_GRID_ADS"); num_rec = epr_get_num_records(dataset_id); lines_per_tie_pt = epr_get_scene_height(product_id) / (num_rec - 1); num_elems = field_info->num_elems; } else { epr_set_err(e_err_illegal_arg, "epr_read_band_annotation_data: unhandled ENVISAT product type"); epr_free_record(record); return epr_get_last_err_code(); } /*memory allocate for the increasingly begin tie point line*/ line_beg_buffer = calloc(sizeof(float), num_elems); if (line_beg_buffer == NULL) { epr_set_err(e_err_out_of_memory, "epr_read_band_annotation_data: out of memory"); epr_free_record(record); return epr_get_last_err_code(); } /*memory allocate for the increasingly end tie point line*/ line_end_buffer = calloc(sizeof(float), num_elems); if (line_end_buffer == NULL) { epr_set_err(e_err_out_of_memory, "epr_read_band_annotation_data: out of memory"); epr_free_record(record); free(line_beg_buffer); return epr_get_last_err_code(); } /* if the user raster (or its part) is outside of orbit in source coordinates*/ if (offset_x + raster->raster_width > (int)scan_line_length) { epr_set_err(e_err_illegal_arg, "epr_read_band_data: raster x co-ordinates out of bounds"); epr_free_record(record); free(line_beg_buffer); free(line_end_buffer); return epr_get_last_err_code(); } if (offset_y + raster->raster_height > (int)(rec_numb * lines_per_tie_pt)) { epr_set_err(e_err_illegal_arg, "epr_read_band_data: raster y co-ordinates out of bounds"); epr_free_record(record); free(line_beg_buffer); free(line_end_buffer); return epr_get_last_err_code(); } raster_pos = 0; delta_raster_pos = (int)floor((raster->source_width - 1) / raster->source_step_x) + 1; /*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); return epr_get_last_err_code(); } y_beg_old = 9999; y_end_old = 9999; if (band_id->lines_mirrored) { offset_x_mirrored = num_elems - (offset_x + raster->source_width - 1) - 1; } else { offset_x_mirrored = offset_x; } for (iY = offset_y; (uint)iY < offset_y + raster->source_height; iY += raster->source_step_y ) { /*find the increasing neighbour begin and end tie point lines*/ y_mod = ((float)iY - scan_offset_y) / lines_per_tie_pt; y_beg = (uint)floor(y_mod); if (y_beg < 0) { y_beg = 0; } if ((uint)y_beg > dataset_id->dsd->num_dsr - 2) { y_beg = dataset_id->dsd->num_dsr - 2; } y_mod -= y_beg; y_end = y_beg + 1; /*as long as between increasing neighbour tie point lines, not to change them*/ if (y_beg_old != y_beg) { record_beg = epr_read_record(dataset_id, y_beg, record_beg); y_beg_old = y_beg; } if (y_end_old != y_end) { record_end = epr_read_record(dataset_id, y_end, record_end); y_end_old = y_end; } /*get the values for the increasing neighbour tie point lines*/ field_beg = epr_get_field_at(record_beg, band_id->dataset_ref.field_index - 1); field_end = epr_get_field_at(record_end, band_id->dataset_ref.field_index - 1); /*transform and scale the values for the increasing neighbour tie point lines*/ transform_array_func(field_beg->elems, band_id, line_beg_buffer, num_elems); transform_array_func(field_end->elems, band_id, line_end_buffer, num_elems); /*get the "line" of interpolated physical values from tie point data*/ decode_tiepoint_band(line_beg_buffer, line_end_buffer, samples_per_tie_pt, num_elems, band_id, offset_x, scan_offset_x, y_mod, raster->source_width, raster->source_step_x, raster->buffer, raster_pos); /*locate "data point" for the next "line"*/ raster_pos += delta_raster_pos; } if (strncmp(EPR_ENVISAT_PRODUCT_MERIS, product_id->id_string, 3) == 0) { mirror_float_array((float*)raster->buffer, raster->raster_width, raster->raster_height); } else { if (strncmp(EPR_ENVISAT_PRODUCT_AATSR, product_id->id_string, 3) == 0) { mirror_float_array((float*)raster->buffer, raster->raster_width, raster->raster_height); } else { if (strncmp(EPR_ENVISAT_PRODUCT_ASAR, product_id->id_string, 3) == 0 && 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); } } } epr_free_record(record_beg); epr_free_record(record_end); epr_free_record(record); free(line_beg_buffer); free(line_end_buffer); return 0; } uint epr_get_raster_elem_size(const EPR_SRaster* raster) { if (raster == NULL) { epr_set_err(e_err_invalid_raster, "epr_get_raster_elem_size: raster must not be NULL"); return 0; } return raster->elem_size; } void* epr_get_raster_elem_addr(const EPR_SRaster* raster, uint offset) { if (raster == NULL) { epr_set_err(e_err_invalid_raster, "epr_get_raster_elem_addr: raster must not be NULL"); return 0; } return ((uchar*) raster->buffer) + epr_get_raster_elem_size(raster) * offset; } void* epr_get_raster_pixel_addr(const EPR_SRaster* raster, uint x, uint y) { if (raster == NULL) { epr_set_err(e_err_invalid_raster, "epr_get_raster_pixel_addr: raster must not be NULL"); return 0; } return epr_get_raster_elem_addr(raster, y * raster->raster_width + x); } void* epr_get_raster_line_addr(const EPR_SRaster* raster, uint y) { if (raster == NULL) { epr_set_err(e_err_invalid_raster, "epr_get_raster_line_addr: raster must not be NULL"); return 0; } return epr_get_raster_elem_addr(raster, y * raster->raster_width); } uint epr_get_raster_width(EPR_SRaster* raster) { if (raster == NULL) { epr_set_err(e_err_invalid_raster, "epr_get_raster_width: raster must not be NULL"); return 0; } return raster->raster_width; } uint epr_get_raster_height(EPR_SRaster* raster) { if (raster == NULL) { epr_set_err(e_err_invalid_raster, "epr_get_raster_height: raster must not be NULL"); return 0; } return raster->raster_height; } /******************************************************************/ EPR_FLineDecoder select_line_decode_function(EPR_EDataTypeId band_tid, EPR_ESampleModel band_smod, EPR_EDataTypeId raw_tid) { EPR_FLineDecoder decode_func; if ((band_tid == e_tid_char || band_tid == e_tid_uchar) && band_smod == e_smod_1OF1 && (raw_tid == e_tid_char || raw_tid == e_tid_uchar)) decode_func = decode_line_uchar_1_of_1_to_uchar; else if ((band_tid == e_tid_char || band_tid == e_tid_uchar) && band_smod == e_smod_1OF2 && (raw_tid == e_tid_char || raw_tid == e_tid_uchar)) decode_func = decode_line_uchar_1_of_2_to_uchar; else if ((band_tid == e_tid_char || band_tid == e_tid_uchar) && band_smod == e_smod_2OF2 && (raw_tid == e_tid_char || raw_tid == e_tid_uchar)) decode_func = decode_line_uchar_2_of_2_to_uchar; else if ((band_tid == e_tid_short || band_tid == e_tid_ushort) && band_smod == e_smod_1OF1 && (raw_tid == e_tid_short || raw_tid == e_tid_ushort)) decode_func = decode_line_ushort_1_of_1_to_ushort; else if (band_tid == e_tid_float && band_smod == e_smod_1OF1 && raw_tid == e_tid_uchar) decode_func = decode_line_uchar_1_of_1_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_1OF1 && raw_tid == e_tid_char) decode_func = decode_line_char_1_of_1_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_1OF1 && raw_tid == e_tid_ushort) decode_func = decode_line_ushort_1_of_1_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_1OF1 && raw_tid == e_tid_short) decode_func = decode_line_short_1_of_1_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_1OF2 && raw_tid == e_tid_short) decode_func = decode_line_short_1_of_2_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_2OF2 && raw_tid == e_tid_short) decode_func = decode_line_short_2_of_2_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_1OF2 && raw_tid == e_tid_uchar) decode_func = decode_line_uchar_1_of_2_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_2OF2 && raw_tid == e_tid_uchar) decode_func = decode_line_uchar_2_of_2_to_float; else if (band_tid == e_tid_float && band_smod == e_smod_2TOF && raw_tid == e_tid_uchar) decode_func = decode_line_uchar_2_to_f_to_float; else if (band_tid == e_tid_uint && band_smod == e_smod_3TOI && raw_tid == e_tid_uchar) decode_func = decode_line_uchar_3_to_i_to_uint; else { return NULL; } return decode_func; } EPR_FArrayTransformer select_transform_array_function(EPR_EDataTypeId band_tid, EPR_EDataTypeId raw_tid) { EPR_FArrayTransformer transform_array_func; if (band_tid == e_tid_float && raw_tid == e_tid_short) transform_array_func = transform_array_short_to_float; else if (band_tid == e_tid_float && raw_tid == e_tid_ushort) transform_array_func = transform_array_ushort_to_float; else if (band_tid == e_tid_float && raw_tid == e_tid_int) 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 { return NULL; } return transform_array_func; } void decode_line_uchar_1_of_1_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; uchar* sa = (uchar*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * sa[x]); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * sa[x]; } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[x]; } } } void decode_line_char_1_of_1_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; char* sa = (char*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * sa[x]); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * sa[x]; } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[x]; } } } void decode_line_ushort_1_of_1_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; ushort* sa = (ushort*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * sa[x]); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * sa[x]; } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[x]; } } } void decode_line_short_1_of_1_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; short* sa = (short*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * sa[x]); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * sa[x]; } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[x]; } } } void decode_line_short_1_of_2_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; short* sa = (short*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * sa[2 * x]); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * sa[2 * x]; } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)(sa[2 * x]); } } } void decode_line_short_2_of_2_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; short* sa = (short*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * sa[2 * x + 1]); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * sa[2 * x + 1]; } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)(sa[2 * x + 1]); } } } void decode_line_uchar_1_of_1_to_uchar(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; uchar* sa = (uchar*) source_array; uchar* buf = (uchar*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[x]; } } void decode_line_uchar_1_of_2_to_uchar(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; uchar* sa = (uchar*) source_array; uchar* buf = (uchar*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[2 * x]; } } void decode_line_uchar_2_of_2_to_uchar(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; uchar* sa = (uchar*) source_array; uchar* buf = (uchar*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[2 * x + 1]; } } void decode_line_ushort_1_of_1_to_ushort(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; ushort* sa = (ushort*) source_array; ushort* buf = (ushort*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = sa[x]; } } void decode_line_uchar_2_to_f_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2, shi; uchar* sa = (uchar*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { shi = (((sa[2 * x] & 0xff)) | ((sa[2 * x + 1] & 0xff) << 8)) & 0xffff; buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * shi); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { shi = (((sa[2 * x] & 0xff)) | ((sa[2 * x + 1] & 0xff) << 8)) & 0xffff; buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * shi; } } else { for (x = x1; x <= x2; x += step_x) { shi = (((sa[2 * x] & 0xff)) | ((sa[2 * x + 1] & 0xff) << 8)) & 0xffff; buf[raster_pos++] = (float)shi; } } } void decode_line_uchar_1_of_2_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; uchar* sa = (uchar*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * (sa[2 * x] & 0xff)); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * (sa[2 * x] & 0xff); } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)(sa[2 * x] & 0xff); } } } void decode_line_uchar_2_of_2_to_float(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2; uchar* sa = (uchar*) source_array; float* buf = (float*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; if (band_id->scaling_method == e_smid_log) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)pow(10, band_id->scaling_offset + band_id->scaling_factor * (sa[2 * x + 1] & 0xff)); } } else if (band_id->scaling_method == e_smid_lin) { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = band_id->scaling_offset + band_id->scaling_factor * (sa[2 * x + 1] & 0xff); } } else { for (x = x1; x <= x2; x += step_x) { buf[raster_pos++] = (float)(sa[2 * x + 1] & 0xff); } } } void decode_line_uchar_3_to_i_to_uint(void* source_array, EPR_SBandId* band_id, int offset_x, int raster_width, int step_x, void* raster_buffer, int raster_pos) { int x, x1, x2, n; uchar* sa = (uchar*) source_array; uint* buf = (uint*) raster_buffer; x1 = offset_x; x2 = x1 + raster_width - 1; for (x = x1; x <= x2; x += step_x) { n = 3 * x; buf[raster_pos++] = (sa[n] & 0xff) << 16 | ((sa[n+1] & 0xff) << 8) | ((sa[n+2] & 0xff) ); } } /** * Computes the physical values for the annotation data. * * @param sa_beg the float array of tie points "before" Y-coordinate of the point to search * @param sa_end the float array of tie points "after" Y-coordinate of the point to search * @param samples_per_tie_pt the "distance" between two neighbour tie points (in scan-line direction) * @param num_elems number of elements in one tie point scan-line * @param band_id the information about properties and quantities of ENVISAT data. * @param offset_x [PIXEL] X-coordinate (0-based) of the upper right raster corner to search * @param y_mod [PIXEL] relative location of the point is being searched for (in flight direction) * @param raster_width [PIXEL] the width of the raster is being searched for * @param s_x [PIXEL] X-step to get the next point (in source coordinates) to search * @param raster_buffer the float user array to be filled with physical values * @param raster_pos the actual "filled" position in raster_buffer-array * */ void decode_tiepoint_band(float* sa_beg, float* sa_end, uint samples_per_tie_pt, uint num_elems, EPR_SBandId* band_id, int offset_x, float scan_offset_x, float y_mod, int raster_width, int s_x, float* raster_buffer, int raster_pos) { int ix; float x_mod; uint x_knot; int inti_flag = 0; int intersection = 0; float circle; float half_circle; float null_point; circle = EPR_LONGI_ABS_MAX - EPR_LONGI_ABS_MIN; half_circle = 0.5F * circle; null_point = 0.5F * (EPR_LONGI_ABS_MAX + EPR_LONGI_ABS_MIN); if (strncmp(band_id->band_name, EPR_LONGI_BAND_NAME, strlen(EPR_LONGI_BAND_NAME)) == 0) { inti_flag = 1; } else { inti_flag = 0; } for (ix = offset_x; ix < offset_x + raster_width; ix += s_x) { x_mod = (ix - scan_offset_x) / samples_per_tie_pt; if (x_mod >= 0.0F) { x_knot = (uint)floor(x_mod); if (x_knot >= num_elems - 1) { x_knot = num_elems - 2; } } else { x_knot = (uint)0; } x_mod -= x_knot; if (inti_flag == 1) { if (fabs((float)(sa_beg[x_knot + 1] - sa_beg[x_knot])) > half_circle || fabs((float)(sa_beg[x_knot] - sa_end[x_knot])) > half_circle || fabs((float)(sa_end[x_knot] - sa_end[x_knot + 1])) > half_circle || fabs((float)(sa_end[x_knot + 1] - sa_beg[x_knot + 1])) > half_circle) { intersection = 1; if (sa_beg[x_knot] < (float)null_point) { sa_beg[x_knot] += circle; } if (sa_beg[x_knot + 1] < (float)null_point) { sa_beg[x_knot + 1] += circle; } if (sa_end[x_knot] < (float)null_point) { sa_end[x_knot] += circle; } if (sa_end[x_knot + 1] < (float)null_point) { sa_end[x_knot + 1] += circle; } } } else { intersection = 0; } raster_buffer[raster_pos] = epr_interpolate2D(x_mod, y_mod, sa_beg[x_knot], sa_beg[x_knot + 1], sa_end[x_knot], sa_end[x_knot + 1]); if (inti_flag == 1 && intersection == 1 && raster_buffer[raster_pos] > EPR_LONGI_ABS_MAX) { raster_buffer[raster_pos] -= circle; } raster_pos++; } } float epr_interpolate2D(float wi, float wj, float x00, float x10, float x01, float x11) { return x00 + wi * (x10 - x00) + wj * (x01 - x00) + wi * wj * (x11 + x00 - x01 - x10); } void transform_array_short_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel) { uint ix; short* sa = (short*) sourceArray; for (ix = 0; ix < nel; ix ++) { raster_buffer[ix] = band_id->scaling_offset + band_id->scaling_factor * sa[ix]; } } void transform_array_ushort_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel) { uint ix; ushort* sa = (ushort*) sourceArray; for (ix = 0; ix < nel; ix ++) { raster_buffer[ix] = band_id->scaling_offset + band_id->scaling_factor * sa[ix]; } } void transform_array_int_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel) { uint ix; int* sa = (int*) sourceArray; for (ix = 0; ix < nel; ix ++) { raster_buffer[ix] = band_id->scaling_offset + band_id->scaling_factor * sa[ix]; } } void transform_array_uint_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel) { uint ix; uint* sa = (uint*) 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; pol_w = raster_width / 2; for (h = 0; h < raster_height; h ++) { for (w = 0; w < pol_w; w ++) { offset = h * raster_width; tmp = raster_buffer[w + offset]; raster_buffer[w + offset] = raster_buffer[raster_width - 1 - w + offset]; raster_buffer[raster_width - 1 - w + offset] = tmp; } } } void mirror_uchar_array(uchar* raster_buffer, uint raster_width, uint raster_height) { uint w, h, pol_w, offset; uchar tmp; pol_w = raster_width / 2; for (h = 0; h < raster_height; h ++) { for (w = 0; w < pol_w; w ++) { offset = h * raster_width; tmp = raster_buffer[w + offset]; raster_buffer[w + offset] = raster_buffer[raster_width - 1 - w + offset]; raster_buffer[raster_width - 1 - w + offset] = tmp; } } } void mirror_ushort_array(ushort* raster_buffer, uint raster_width, uint raster_height) { uint w, h, pol_w, offset; ushort tmp; pol_w = raster_width / 2; for (h = 0; h < raster_height; h ++) { for (w = 0; w < pol_w; w ++) { offset = h * raster_width; tmp = raster_buffer[w + offset]; raster_buffer[w + offset] = raster_buffer[raster_width - 1 - w + offset]; raster_buffer[raster_width - 1 - w + offset] = tmp; } } } void mirror_uint_array(uint* raster_buffer, uint raster_width, uint raster_height) { uint w, h, pol_w, offset; uint tmp; pol_w = raster_width / 2; for (h = 0; h < raster_height; h ++) { for (w = 0; w < pol_w; w ++) { offset = h * raster_width; tmp = raster_buffer[w + offset]; raster_buffer[w + offset] = raster_buffer[raster_width - 1 - w + offset]; raster_buffer[raster_width - 1 - w + offset] = tmp; } } } void epr_zero_invalid_pixels(EPR_SRaster* raster, EPR_SRaster* bm_raster) { uchar* bm_pixels; uint bm_pos = 0; uint bm_len = raster->raster_width * raster->raster_height; assert(bm_raster->data_type == e_tid_char || bm_raster->data_type == e_tid_uchar); bm_pixels = (uchar*) bm_raster->buffer; switch (raster->data_type) { case e_tid_char: case e_tid_uchar: { char* pixels = (char*) raster->buffer; for (bm_pos = 0; bm_pos < bm_len; bm_pos++) { if (bm_pixels[bm_pos] == 0) { pixels[bm_pos] = 0; } } } break; case e_tid_short: case e_tid_ushort: { short* pixels = (short*) raster->buffer; for (bm_pos = 0; bm_pos < bm_len; bm_pos++) { if (bm_pixels[bm_pos] == 0) { pixels[bm_pos] = 0; } } } break; case e_tid_int: case e_tid_uint: { int* pixels = (int*) raster->buffer; for (bm_pos = 0; bm_pos < bm_len; bm_pos++) { if (bm_pixels[bm_pos] == 0) { pixels[bm_pos] = 0; } } } break; case e_tid_float: { float* pixels = (float*) raster->buffer; for (bm_pos = 0; bm_pos < bm_len; bm_pos++) { if (bm_pixels[bm_pos] == 0) { pixels[bm_pos] = 0.0F; } } } break; case e_tid_double: { double* pixels = (double*) raster->buffer; for (bm_pos = 0; bm_pos < bm_len; bm_pos++) { if (bm_pixels[bm_pos] == 0) { pixels[bm_pos] = 0.0; } } } break; default: {} break; } } bcdev-epr-api-a922482/src/epr_band.h000066400000000000000000000271111142554441000171210ustar00rootroot00000000000000/* * $Id: epr_band.h,v 1.1.1.1 2004-10-28 19:22:22 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_BAND_H_INCL #define EPR_BAND_H_INCL #ifdef __cplusplus extern "C" { #endif #include "epr_ptrarray.h" #include /* just to get the ANSI-C type FILE */ /** * Converts the given string into a scaling method identifier. * * @param str the string to be converted. * @return the scaling method identifier represented by the given string. * If the string is equal of '*' the value * e_non_smid is returned. */ EPR_EScalingMethod epr_str_to_scaling_method(const char* str); /** * Converts the given string into a sample offset identifier. * * @param str the string to be converted. * @return the sample offset identifier represented by the given string. * If the string is equal of '*' the value * e_none_samoff is returned. */ EPR_ESampleModel epr_str_to_sample_offset(const char* str); /** * Gets the dataset_id, field_index and elem_index * * @param product_id the the product file identifier * @param str the string with the name, separator ('.') and indexes. * @return the dataset_id, field_index and elem_index (-1 if no). * NULL if correspondent dataset name was not found. */ EPR_SDatasetRef epr_get_ref_struct(EPR_SProductId* product_id, const char* str); /** * Gets the scaling factor by the given dataset_id, field_index, elem_index * * @param product_id the the product file identifier * @param str the string with the name, separator ('.') and indexes. * @return the dataset_id, field_index and elem_index (-1 if no). * NULL if correspondent dataset name was not found. */ float epr_get_scaling_factor(EPR_SProductId* product_id, const char* str); float epr_get_scaling_params(EPR_SProductId* product_id, const char* str); /** * Reads the measurement data and converts its in physical values. * * @param band_id the information about properties and quantities of ENVISAT data. * @param offset_x X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param offset_y Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param raster the instance to the buffer information was used * * @return zero for success, and error code otherwise */ int epr_read_band_measurement_data(EPR_SBandId* band_id, int offset_x, int offset_y, EPR_SRaster* raster); /** * Reads the annotation data and converts its in physical values. * * @param band_id the information about properties and quantities of ENVISAT data. * @param offset_x X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param offset_y Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param raster the instance to the buffer information was used * * @return zero for success, and error code otherwise */ int epr_read_band_annotation_data(EPR_SBandId* band_id, int offset_x, int offset_y, EPR_SRaster* raster); /** * This group of functions is for scaling the field element for a physical measurement values. *
The type is located in the field info. *
One field must have one type only. * * @param sourceArray the sourse array identifier (to be scaled) * @param band_id the band ID with the information about the field's physical properties * @param xo [PIXEL] X-coordinate (0-bazed) of the upper right corner raster to search * @param raster_width [PIXEL] the width of the raster is been research * @param s_x X-step to get the next raster to search * @param raster_buffer [BYTE] the memory buffer to save information was scaled * @param raster_pos shows the point of filling of the array raster_buffer * */ /*@{*/ void decode_line_uchar_1_of_1_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_ushort_1_of_1_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_short_1_of_1_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_short_1_of_2_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_short_2_of_2_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_char_1_of_1_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_1_of_1_to_uchar (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_1_of_2_to_uchar (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_2_of_2_to_uchar (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_ushort_1_of_1_to_ushort (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_1_of_2_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_2_of_2_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_2_to_f_to_float (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); void decode_line_uchar_3_to_i_to_uint (void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); /*@}*/ /** * This group of functions is for scaling the field element for a physical annotation values. *
The type is located in the field info. *
One field must have one type only. * * @param sourceArray the sourse array identifier (to be scaled) * @param band_id the band ID with the information about the field's physical properties * @param raster_buffer [BYTE] the memory buffer to save information was scaled * @param nel number of element to scale * */ /*@{*/ void transform_array_short_to_float (void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel); 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); /*@}*/ /** * This group of functions is for mirroring the scaled line of a physical MERIS values. * * @param raster_buffer [BYTE] the memory buffer to be Y-mirrored * @param raster_width [PIXEL] the width of the raster is been Y-mirrored * @param raster_height [PIXEL] the height of the raster is been Y-mirrored * */ /*@{*/ void mirror_float_array (float* raster_buffer, uint raster_width, uint raster_height); void mirror_uchar_array (uchar* raster_buffer, uint raster_width, uint raster_height); void mirror_ushort_array (ushort* raster_buffer, uint raster_width, uint raster_height); void mirror_uint_array (uint* raster_buffer, uint raster_width, uint raster_height); /*@}*/ /** * Two dimenzional interpolation * * @param wi the interpolation point location in [0,1] in "horizontal" direction * @param wj the interpolation point location in [0,1] in "vertical" direction * @param x00 the first point in "horizontal" direction * @param x10 the second point in "horizontal" direction * @param x01 the first point in "vertical" direction * @param x11 the second point in "vertical" direction * * @return float interpolated value */ float epr_interpolate2D(float wi, float wj, float x00, float x10, float x01, float x11); /** * Computes the physical values for the annotation data. * * @param sa_beg the float array of tie points "before" Y-coordinate of the point to search * @param sa_end the float array of tie points "after" Y-coordinate of the point to search * @param samples_per_tie_pt the "distance" between two neighbour tie point (in scan-line direction) * @param num_elems number of elements in one tie point scan-line * @param band_id the information about properties and quantities of ENVISAT data. * @param xo [PIXEL] X-coordinate (0-bazed) of the upper right corner raster to search * @param y_mod [PIXEL] relativ location of the point is been researched (in fly direction) * @param raster_width [PIXEL] the width of the raster is been researched * @param s_x [PIXEL] X-step to get the next point (in source coordinates) to search * @param raster_buffer the float user array to be filled with physical values * @param raster_pos the actual "filled" position in raster_buffer-array * */ void decode_tiepoint_band(float* sa_beg, float* sa_end, uint samples_per_tie_pt, uint num_elems, EPR_SBandId* band_id, int xo, float scan_offset_x, float y_mod, int raster_width, int s_x, float* raster_buffer, int raster_pos); typedef void (*EPR_FLineDecoder)(void* sourceArray, EPR_SBandId* band_id, int xo, int raster_width, int s_x, void* raster_buffer, int raster_pos); /** * Selects the line decode function, depended on measurement data type. */ EPR_FLineDecoder select_line_decode_function(EPR_EDataTypeId band_daty, EPR_ESampleModel band_smod, EPR_EDataTypeId daty_id); typedef void (*EPR_FArrayTransformer)(void* sourceArray, EPR_SBandId* band_id, float* raster_buffer, uint nel); /** * Selects the transform array function, dependent on annotation data type. */ EPR_FArrayTransformer select_transform_array_function(EPR_EDataTypeId band_daty, EPR_EDataTypeId daty_id); /** * Masks the band information out. * The band information will be masked dependent on bit mask filter for the same * selected area (described in raster). * * @param raster selected and physically processed the ENVISAT product data band information * @param bm_raster selected the ENVISAT flag bit mask filter */ void epr_zero_invalid_pixels(EPR_SRaster* raster, EPR_SRaster* bm_raster); /** * Release the memory allocated through a band ID. * * @param band_id the band identifier to be released. */ void epr_free_band_id(EPR_SBandId* band_id); EPR_SPtrArray* epr_create_band_ids(EPR_SProductId* product_id); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_BAND_H_INCL */ bcdev-epr-api-a922482/src/epr_bitmask.c000066400000000000000000000715341142554441000176520ustar00rootroot00000000000000/* * $Id: epr_bitmask.c,v 1.2 2004-10-28 20:10:57 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" void epr_resolve_bm_ref(EPR_SBmEvalContext* context, EPR_SBmTerm* term); EPR_SBmEvalContext* epr_create_bm_eval_context(EPR_SProductId* product_id, int offset_x, int offset_y, EPR_SRaster* bitmask_raster) { EPR_SBmEvalContext* context; context = (EPR_SBmEvalContext*) calloc(1, sizeof (EPR_SBmEvalContext)); if (context == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_bm_eval_context: out of memory"); return NULL; } context->product_id = product_id; context->offset_x = offset_x; context->offset_y = offset_y; context->bitmask_raster = bitmask_raster; context->flag_band_ids = epr_create_ptr_array(4); context->flag_rasters = epr_create_ptr_array(4); return context; } void epr_free_bm_eval_context(EPR_SBmEvalContext* context) { EPR_SRaster* flag_raster; uint flag_index; if (context == NULL) { return; } if (context->flag_band_ids != NULL) { for (flag_index = 0; flag_index < context->flag_band_ids->length; flag_index++) { /* * Note that the release of band ID's is handled by the epr_close_product() function, * The rasters need to be released, because they are internally used by this * context. */ flag_raster = (EPR_SRaster*)context->flag_rasters->elems[flag_index]; epr_free_raster(flag_raster); } epr_free_ptr_array(context->flag_band_ids); epr_free_ptr_array(context->flag_rasters); } free(context); } /** * Reads bit-mask pixels of the given product for the given bit-mask expression * for the given region offset and raster. * * @param product_id the product ID * @param bm_expr the bit-mask expression * @param offset_x X-coordinate in pixel co-ordinates (zero-based) of the upper right raster corner to be searched for * @param offset_y Y-coordinate in pixel co-ordinates (zero-based) of the upper right raster corner to be searched for * @param raster the instance to the buffer information was used * * @return zero for success, an error code otherwise */ int epr_read_bitmask_raster(EPR_SProductId* product_id, const char* bm_expr, int offset_x, int offset_y, EPR_SRaster* bm_raster) { EPR_SBmEvalContext* context; EPR_SBmTerm* term; uint x, y; uint pos; uchar* bm_buffer = NULL; EPR_EErrCode errcode; epr_clear_err(); if (bm_raster->data_type != e_tid_uchar && bm_raster->data_type != e_tid_char) { epr_set_err(e_err_illegal_data_type, "epr_read_bitmask_raster: illegal raster datatype; must be 'char' or 'uchar'"); return e_err_illegal_data_type; } bm_buffer = (uchar*) bm_raster->buffer; if (bm_buffer == NULL) { epr_set_err(e_err_out_of_memory, "epr_read_bitmask_raster: false memory allocation for a raster buffer"); return e_err_out_of_memory; } context = epr_create_bm_eval_context(product_id, offset_x, offset_y, bm_raster); if (context == NULL) { epr_set_err(e_err_illegal_arg, "epr_read_bitmask_raster: the context cannot be created"); return e_err_illegal_arg; } term = epr_parse_bm_expr_str(bm_expr); if (term == NULL) { epr_set_err(e_err_illegal_arg, "epr_read_bitmask_raster: the term was not build"); return e_err_illegal_arg; } pos = 0; epr_clear_err(); errcode = epr_get_last_err_code(); for (y = 0; y < bm_raster->raster_height; y++) { for (x = 0; x < bm_raster->raster_width; x++) { bm_buffer[pos] = (uchar) epr_eval_bm_term(context, term, x, y); pos++; errcode = epr_get_last_err_code(); if (errcode != 0) { break; } } if (errcode != 0) { break; } } epr_free_bm_term(term); epr_free_bm_eval_context(context); return errcode; } /** * Evaluates the given bitmask expression. * * @param term the bitmask term * @param x the pixel's x co-ordinate * @param y the pixel's y co-ordinate */ epr_boolean epr_eval_bm_term(EPR_SBmEvalContext* context, EPR_SBmTerm* term, int x, int y) { uint temp; uint eval; if (term == NULL) { return FALSE; } switch (term->op_code) { case BMT_REF: { EPR_SRaster* flag_raster = term->op.ref.flag_raster; uint flag_mask = term->op.ref.flag_mask; if (flag_raster == NULL) { epr_resolve_bm_ref(context, term); flag_raster = term->op.ref.flag_raster; flag_mask = term->op.ref.flag_mask; if (flag_raster == NULL) { return FALSE; } } assert(flag_raster != NULL); assert(flag_mask != FLAG_MASK_NOT_COMPUTED); temp = epr_get_pixel_as_uint(flag_raster, x, y); eval = temp & flag_mask; return (eval) == flag_mask; } case BMT_AND: { if (!epr_eval_bm_term(context, term->op.binary.arg1, x, y)) { return FALSE; } return epr_eval_bm_term(context, term->op.binary.arg2, x, y); } case BMT_OR: { if (epr_eval_bm_term(context, term->op.binary.arg1, x, y)) { return TRUE; } return epr_eval_bm_term(context, term->op.binary.arg2, x, y); } case BMT_NOT: { return !epr_eval_bm_term(context, term->op.unary.arg, x, y); } default: assert(0); return FALSE; } } void epr_resolve_bm_ref(EPR_SBmEvalContext* context, EPR_SBmTerm* term) { const char* band_name = term->op.ref.band_name; const char* flag_name = term->op.ref.flag_name; EPR_SBandId* flag_band_id = NULL; uint flag_band_index = (uint) -1; uint band_index = 0; uint num_bands = context->flag_band_ids->length; EPR_SRaster* flag_raster = NULL; uint flag_mask = 0; uint flag_computed = 0; /* Find the corresponding flag_band_id for band_name */ for (band_index = 0; band_index < num_bands; band_index++) { flag_band_id = (EPR_SBandId*) context->flag_band_ids->elems[band_index]; if (epr_equal_names(band_name, flag_band_id->band_name)) { flag_band_index = band_index; break; } } /* flag_band_id found? */ if (flag_band_index != (uint) -1) { /* Yes, found: get flag_band_id and the corresponding raster */ flag_band_id = (EPR_SBandId*)(context->flag_band_ids->elems[flag_band_index]); flag_raster = (EPR_SRaster*)(context->flag_rasters->elems[flag_band_index]); } else { /* Not found: get flag_band_id from product and load the corresponding raster */ flag_band_id = epr_get_band_id(context->product_id, band_name); if (flag_band_id != NULL) { flag_raster = epr_create_compatible_raster(flag_band_id, context->bitmask_raster->source_width, context->bitmask_raster->source_height, context->bitmask_raster->source_step_x, context->bitmask_raster->source_step_y); epr_read_band_raster(flag_band_id, context->offset_x, context->offset_y, flag_raster); /* register flag_band_id and flag_raster for later use */ epr_add_ptr_array_elem(context->flag_band_ids, flag_band_id); epr_add_ptr_array_elem(context->flag_rasters, flag_raster); } else { epr_set_err(e_err_flag_not_found, "flags band not found"); return; } } /* Now, compute flag_mask */ /* Does the band have a flag coding? */ if (flag_band_id->flag_coding != NULL) { /* Yes, now find flag definition for flag_name */ EPR_SFlagDef* flag_def = NULL; uint flag_def_index; for (flag_def_index = 0; flag_def_index < flag_band_id->flag_coding->length; flag_def_index++) { flag_def = (EPR_SFlagDef*) flag_band_id->flag_coding->elems[flag_def_index]; if (epr_equal_names(flag_def->name, flag_name)) { flag_computed = 1; flag_mask |= flag_def->bit_mask; /* TODO!!! */ break; } } } if (flag_computed == 0) { flag_mask = FLAG_MASK_NOT_COMPUTED; epr_set_err(e_err_flag_not_found, "flag not found"); } term->op.ref.flag_mask = flag_mask; term->op.ref.flag_raster = flag_raster; } /** * Parses the bit-mask expression given as character string. * * @param bm_expr the bit-mask expression given as character string * @return the bit-mask term tree representing the bit-mask expression * @throws BitmaskExpressionParseException if the given code could not be epr_parse'd * @throws IOException if an I/O error occurs */ EPR_SBmTerm* epr_parse_bm_expr_str(const char* bm_expr) { EPR_SBmTerm* term; EPR_SParseInfo parse_info; parse_info.bm_expr = bm_expr; parse_info.bm_expr_pos = 0; parse_info.pushed_back = FALSE; parse_info.token = NULL; parse_info.err_message = NULL; term = epr_parse_bm_expr(&parse_info, FALSE); epr_free_string(parse_info.token); parse_info.token = NULL; if (epr_is_bm_expr_error(&parse_info)) { char tmp[256] = {"bitmap-expression error: "}; strcat(tmp, parse_info.err_message); epr_set_err(e_err_invalid_value, tmp); } return term; } EPR_SPtrArray* epr_create_flag_coding(EPR_SProductId* product_id, const char* flag_coding_name) { int num_descr; int i, j; const struct FlagDescriptorTable* fc_tables; int fct_index; EPR_SPtrArray* flag_coding = NULL; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_create_flag_coding: product_id must not be NULL"); return NULL; } /* @DDDB */ fc_tables = dddb_flag_coding_tables; fct_index = -1; for (i = 0; i < EPR_NUM_FLAG_CODING_TABLES; i++) { const char* id = fc_tables[i].name; if (epr_equal_names(id, flag_coding_name)) { fct_index = i; break; } } if (fct_index == -1) { epr_set_err(e_err_null_pointer, "epr_create_flag_coding: unknown flag coding"); return NULL; } flag_coding = epr_create_ptr_array(16); num_descr = fc_tables[fct_index].num_descriptors; for (i = 0; i < num_descr; i++) { EPR_SFlagDef* flag_def = (EPR_SFlagDef*) calloc(1, sizeof (EPR_SFlagDef)); if (flag_def == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_flag_coding: out of memory"); return NULL; } /* 1: flag_name */ epr_assign_string(&flag_def->name, fc_tables[fct_index].descriptors[i].id); if (flag_def->name == NULL) { epr_set_err(e_err_out_of_memory, "epr_get_flag_coding: out of memory"); epr_free_flag_def(flag_def); return NULL; } /* 2: dataset_name */ /* flag_def->bit_index = (uint)fc_tables[fct_index].descriptors[i].bit_index; */ flag_def->bit_mask = 0; for (j = 0; j < fc_tables[fct_index].descriptors[i].num_indices; j++) { flag_def->bit_mask |= (1 << fc_tables[fct_index].descriptors[i].bit_indices[j]); } /* 3: sample_offset */ epr_assign_string(&flag_def->description, fc_tables[fct_index].descriptors[i].description); epr_add_ptr_array_elem(flag_coding, flag_def); } return flag_coding; } void epr_free_flag_coding(EPR_SPtrArray* flag_coding) { EPR_SFlagDef* flag_def = NULL; uint flag_index; if (flag_coding == NULL) { return; } for (flag_index = 0; flag_index < flag_coding->length; flag_index++) { flag_def = (EPR_SFlagDef*) flag_coding->elems[flag_index]; epr_free_flag_def(flag_def); flag_def = NULL; } epr_free_ptr_array(flag_coding); } EPR_SFlagDef* epr_create_flag_def() { EPR_SFlagDef* flag_def = NULL; flag_def = (EPR_SFlagDef*) calloc(1, sizeof (EPR_SFlagDef)); if (flag_def == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_flag_def: out of memory"); return NULL; } flag_def->magic = EPR_MAGIC_FLAG_DEF; return flag_def; } void epr_free_flag_def(EPR_SFlagDef* flag_def) { if (flag_def == NULL) return; epr_free_string(flag_def->name); flag_def->name = NULL; flag_def->bit_mask = 0; epr_free_string(flag_def->description); flag_def->description = NULL; free(flag_def); } EPR_SBmTerm* epr_parse_bm_expr(EPR_SParseInfo* parse_info, epr_boolean term_required) { return epr_parse_bm_OR_expr(parse_info, term_required); } EPR_SBmTerm* epr_parse_bm_OR_expr(EPR_SParseInfo* parse_info, epr_boolean term_required) { EPR_SBmTerm* term1 = epr_parse_bm_AND_expr(parse_info, term_required); if (term1 == NULL) { return NULL; } while (!epr_is_bm_expr_error(parse_info)) { epr_next_bm_expr_token(parse_info); if (epr_is_bm_OR_keyword(parse_info) || epr_is_bm_OR_operator(parse_info)) { EPR_SBmTerm* term2 = epr_parse_bm_OR_expr(parse_info, TRUE); term1 = epr_create_bm_OR_term(term1, term2); } else { epr_push_back_bm_expr_token(parse_info); break; } } return term1; } EPR_SBmTerm* epr_parse_bm_AND_expr(EPR_SParseInfo* parse_info, epr_boolean term_required) { EPR_SBmTerm* term1 = epr_parse_bm_unary_expr(parse_info, term_required); if (term1 == NULL) { return NULL; } while (!epr_is_bm_expr_error(parse_info)) { epr_next_bm_expr_token(parse_info); if (epr_is_bm_AND_keyword(parse_info) || epr_is_bm_AND_operator(parse_info)) { EPR_SBmTerm* term2 = epr_parse_bm_AND_expr(parse_info, TRUE); term1 = epr_create_bm_AND_term(term1, term2); } else { epr_push_back_bm_expr_token(parse_info); break; } } return term1; } EPR_SBmTerm* epr_parse_bm_unary_expr(EPR_SParseInfo* parse_info, epr_boolean term_required) { EPR_SBmTerm* term = NULL; epr_next_bm_expr_token(parse_info); if (epr_is_bm_NOT_keyword(parse_info) || epr_is_bm_NOT_operator(parse_info)) { term = epr_parse_bm_unary_expr(parse_info, TRUE); term = epr_create_bm_NOT_term(term); } else { epr_push_back_bm_expr_token(parse_info); term = epr_parse_bm_primary_expr(parse_info, term_required); } return term; } EPR_SBmTerm* epr_parse_bm_primary_expr(EPR_SParseInfo* parse_info, epr_boolean term_required) { EPR_SBmTerm* term = NULL; epr_next_bm_expr_token(parse_info); if (epr_get_token_char(parse_info) == '(') { term = epr_parse_bm_expr(parse_info, TRUE); epr_next_bm_expr_token(parse_info); if (epr_get_token_char(parse_info) != ')') { epr_set_bm_expr_error(parse_info, "')' expected"); } } else if (epr_is_bm_name_token(parse_info)) { char* ds_name = epr_consume_token(parse_info); epr_next_bm_expr_token(parse_info); if (epr_get_token_char(parse_info) == '.') { epr_next_bm_expr_token(parse_info); if (epr_is_bm_name_token(parse_info)) { char* flag_name = epr_consume_token(parse_info); term = epr_create_bm_REF_term(ds_name, flag_name); } else { epr_set_bm_expr_error(parse_info, "flag name expected"); } } else { epr_set_bm_expr_error(parse_info, "'.' expected"); } } else if (epr_is_bm_EOS_token(parse_info)) { if (term_required) { epr_set_bm_expr_error(parse_info, "operator or flag name expected"); } } else { epr_set_bm_expr_error(parse_info, "operator or flag name expected"); } return term; } epr_boolean epr_is_bm_OR_keyword(EPR_SParseInfo* parse_info) { return epr_is_bm_name_token(parse_info) && stricmp("or", parse_info->token) == 0; } epr_boolean epr_is_bm_AND_keyword(EPR_SParseInfo* parse_info) { return epr_is_bm_name_token(parse_info) && stricmp("and", parse_info->token) == 0; } epr_boolean epr_is_bm_NOT_keyword(EPR_SParseInfo* parse_info) { return epr_is_bm_name_token(parse_info) && stricmp("not", parse_info->token) == 0; } epr_boolean epr_is_bm_AND_operator(EPR_SParseInfo* parse_info) { return epr_get_token_char(parse_info) == '&'; } epr_boolean epr_is_bm_OR_operator(EPR_SParseInfo* parse_info) { return epr_get_token_char(parse_info) == '|'; } epr_boolean epr_is_bm_NOT_operator(EPR_SParseInfo* parse_info) { return epr_get_token_char(parse_info) == '!'; } epr_boolean epr_is_bm_name_token(EPR_SParseInfo* parse_info) { return parse_info->token_type == BME_NAME && parse_info->token != NULL; } epr_boolean epr_is_bm_EOS_token(EPR_SParseInfo* parse_info) { return parse_info->token_type == BME_EOS; } epr_boolean epr_is_bm_expr_error(EPR_SParseInfo* parse_info) { return parse_info->err_message != NULL; } int epr_get_token_char(EPR_SParseInfo* parse_info) { if (parse_info->token_type == BME_SPECIAL && parse_info->token != NULL) { return parse_info->token[0]; } return '\0'; } char* epr_consume_token(EPR_SParseInfo* parse_info) { char* token = parse_info->token; /* Prevent from being released by epr_free_string() */ parse_info->token = NULL; parse_info->token_type = BME_UNKNOWN; parse_info->pushed_back = FALSE; return token; } void epr_next_bm_expr_token(EPR_SParseInfo* parse_info) { if (parse_info->pushed_back) { parse_info->pushed_back = FALSE; return; } epr_free_string(parse_info->token); parse_info->token_type = epr_tokenize_bm_expr(parse_info->bm_expr, &(parse_info->bm_expr_pos), &(parse_info->token)); } void epr_push_back_bm_expr_token(EPR_SParseInfo* parse_info) { parse_info->pushed_back = TRUE; } void epr_set_bm_expr_error(EPR_SParseInfo* parse_info, const char* message) { static char msg_buf[2048]; epr_push_back_bm_expr_token(parse_info); if (message != NULL) { if (!epr_is_bm_EOS_token(parse_info)) { sprintf(msg_buf, "%s, but found token '%s'", message, parse_info->token); } else { sprintf(msg_buf, "%s, but found 'end-of-string'", message); } } else { if (!epr_is_bm_EOS_token(parse_info)) { sprintf(msg_buf, "unexpected token '%s' found", parse_info->token); } else { sprintf(msg_buf, "unexpected 'end-of-string' found"); } } parse_info->err_message = epr_clone_string(msg_buf); } int epr_tokenize_bm_expr(const char* bm_expr, int* bm_expr_pos, char** token) { int pos = *bm_expr_pos; while (isspace(bm_expr[pos])) { pos++; } if (bm_expr[pos] == '\0') { *bm_expr_pos = pos; *token = NULL; return BME_EOS; } if (isalpha(bm_expr[pos]) || bm_expr[pos] == '_') { int pos0 = pos; size_t len; char* tok; pos++; while (isalnum(bm_expr[pos]) || bm_expr[pos] == '_') { pos++; } len = pos - pos0; tok = epr_create_string(len + 1); strncpy(tok, bm_expr + pos0, len); tok[len] = '\0'; *token = tok; *bm_expr_pos = pos; return BME_NAME; } if (bm_expr[pos] == '(' || bm_expr[pos] == ')' || bm_expr[pos] == '.' || bm_expr[pos] == '&' || bm_expr[pos] == '|' || bm_expr[pos] == '!') { char* tok; tok = epr_create_string(2); tok[0] = bm_expr[pos]; tok[1] = '\0'; pos++; *token = tok; *bm_expr_pos = pos; return BME_SPECIAL; } *token = NULL; *bm_expr_pos = pos; return BME_UNKNOWN; } EPR_SBmTerm* epr_create_bm_term(EPR_EBmOpCode op_code) { EPR_SBmTerm* term = (EPR_SBmTerm*) malloc(sizeof (EPR_SBmTerm)); term->op_code = op_code; return term; } EPR_SBmTerm* epr_create_bm_REF_term(char* band_name, char* flag_name) { EPR_SBmTerm* term = epr_create_bm_term(BMT_REF); term->op.ref.band_name = band_name; term->op.ref.flag_name = flag_name; term->op.ref.flag_mask = FLAG_MASK_NOT_COMPUTED; /* not computed */ term->op.ref.flag_raster = NULL; return term; } EPR_SBmTerm* epr_create_bm_NOT_term(EPR_SBmTerm* arg) { EPR_SBmTerm* term = epr_create_bm_term(BMT_NOT); term->op.unary.arg = arg; return term; } EPR_SBmTerm* epr_create_bm_OR_term(EPR_SBmTerm* arg1, EPR_SBmTerm* arg2) { EPR_SBmTerm* term = epr_create_bm_term(BMT_OR); term->op.binary.arg1 = arg1; term->op.binary.arg2 = arg2; return term; } EPR_SBmTerm* epr_create_bm_AND_term(EPR_SBmTerm* arg1, EPR_SBmTerm* arg2) { EPR_SBmTerm* term = epr_create_bm_term(BMT_AND); term->op.binary.arg1 = arg1; term->op.binary.arg2 = arg2; return term; } uint epr_get_pixel_as_uint(const EPR_SRaster* raster, int x, int y) { epr_clear_err(); switch (raster->data_type) { case (e_tid_uchar) : return (uint) ((uchar*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_char) : return (uint) ((char*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_ushort): return (uint) ((ushort*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_short) : return (uint) ((short*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_uint): return (uint) ((uint*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_int) : return (uint) ((int*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_float) : return (uint) ((float*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_double) : return (uint) ((double*)raster->buffer)[y * raster->raster_width + x]; default: return 0; } } int epr_get_pixel_as_int(const EPR_SRaster* raster, int x, int y) { epr_clear_err(); switch (raster->data_type) { case (e_tid_uchar) : return (int) ((uchar*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_char) : return (int) ((char*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_ushort): return (int) ((ushort*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_short) : return (int) ((short*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_uint): return (int) ((uint*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_int) : return (int) ((int*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_float) : return (int) ((float*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_double) : return (int) ((double*)raster->buffer)[y * raster->raster_width + x]; default: return 0; } } float epr_get_pixel_as_float(const EPR_SRaster* raster, int x, int y) { epr_clear_err(); switch (raster->data_type) { case (e_tid_uchar) : return (float) ((uchar*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_char) : return (float) ((char*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_ushort): return (float) ((ushort*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_short) : return (float) ((short*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_uint): return (float) ((uint*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_int) : return (float) ((int*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_float) : return (float) ((float*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_double) : return (float) ((double*)raster->buffer)[y * raster->raster_width + x]; default: return 0; } } double epr_get_pixel_as_double(const EPR_SRaster* raster, int x, int y) { epr_clear_err(); switch (raster->data_type) { case (e_tid_uchar) : return (double) ((uchar*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_char) : return (double) ((char*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_ushort): return (double) ((ushort*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_short) : return (double) ((short*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_uint): return (double) ((uint*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_int) : return (double) ((int*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_float) : return (double) ((float*)raster->buffer)[y * raster->raster_width + x]; case (e_tid_double) : return (double) ((double*)raster->buffer)[y * raster->raster_width + x]; default: return 0; } } /** * Releases a new bitmask term instance. */ void epr_free_bm_term(EPR_SBmTerm* term) { if (term == NULL) return; switch (term->op_code) { case BMT_REF: epr_free_string(term->op.ref.band_name); epr_free_string(term->op.ref.flag_name); term->op.ref.band_name = NULL; term->op.ref.flag_name = NULL; break; case BMT_AND: /* OR */ case BMT_OR: epr_free_bm_term(term->op.binary.arg1); epr_free_bm_term(term->op.binary.arg2); term->op.binary.arg1 = NULL; term->op.binary.arg2 = NULL; break; case BMT_NOT: epr_free_bm_term(term->op.unary.arg); term->op.unary.arg = NULL; break; default: assert(0); } free(term); } /** * Creates a new bitmask expression from the given bitmask term. *

The expression returned is a valid in the sense that the epr_parse_bm_expr() * applied to the returned string would return an equivalent term. * * @param term the term to be converted */ char* epr_create_bm_expr(EPR_SBmTerm* term) { if (term == NULL) return NULL; switch (term->op_code) { case BMT_REF: { char* s0 = epr_create_string(strlen(term->op.ref.band_name) + strlen(term->op.ref.flag_name) + 16); sprintf(s0, "%s.%s", term->op.ref.band_name, term->op.ref.flag_name); return s0; } case BMT_AND: { char* s1 = epr_create_bm_expr(term->op.binary.arg1); char* s2 = epr_create_bm_expr(term->op.binary.arg2); char* s0 = epr_create_string(strlen(s1) + strlen(s2) + 16); sprintf(s0, "(%s) AND (%s)", s1, s2); epr_free_string(s1); epr_free_string(s2); return s0; } case BMT_OR: { char* s1 = epr_create_bm_expr(term->op.binary.arg1); char* s2 = epr_create_bm_expr(term->op.binary.arg2); char* s0 = epr_create_string(strlen(s1) + strlen(s2) + 16); sprintf(s0, "(%s) OR (%s)", s1, s2); epr_free_string(s1); epr_free_string(s2); return s0; } case BMT_NOT: { char* s1 = epr_create_bm_expr(term->op.unary.arg); char* s0 = epr_create_string(strlen(s1) + 16); sprintf(s0, "NOT (%s)", s1); epr_free_string(s1); return s0; } default: assert(FALSE); return NULL; } } /** * Prints the given term as an expression to the console. */ void epr_print_bm_term(EPR_SBmTerm* term) { epr_write_bm_term(term, stdout); } /** * Writes the given term as an expression to the given output stream. */ void epr_write_bm_term(EPR_SBmTerm* term, FILE* ostream) { char* bm_expr = epr_create_bm_expr(term); fprintf(ostream, "%s", bm_expr); epr_free_string(bm_expr); } bcdev-epr-api-a922482/src/epr_bitmask.h000066400000000000000000000355461142554441000176620ustar00rootroot00000000000000/* * $Id: epr_bitmask.h,v 1.1.1.1 2004-10-28 19:22:22 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_BITMASK_H_INCL #define EPR_BITMASK_H_INCL #ifdef __cplusplus extern "C" { #endif #define FLAG_MASK_NOT_COMPUTED ((uint) -1) typedef struct EPR_BmTerm EPR_SBmTerm; typedef struct EPR_BmEvalContext EPR_SBmEvalContext; typedef struct EPR_BmFlagDataset EPR_SBmFlagDataset; typedef enum EPR_BmOpCode EPR_EBmOpCode; /* private implementations */ enum EPR_BmOpCode { BMT_UNKNOWN = 0, BMT_REF, BMT_AND, BMT_OR, BMT_NOT }; enum EPR_Tok { BME_UNKNOWN = 0, BME_EOS, BME_SPECIAL, BME_NAME }; /** * The EPR_BmTerm structure is the union of structures: * each of them can contain either the subject (operand) for the logic operators * or this operators itself with referd operand(s). Thus they are recursive. * The example of term: flags.WATER or flags.LAND * here: 'flags' is a band_name; 'WATER' and 'LAND' - flag_name's; 'or' - logical operator. * * @see EPR_SRaster */ struct EPR_BmTerm { EPR_EBmOpCode op_code; union { struct /*BMT_REF*/ { char* band_name; char* flag_name; uint flag_mask; EPR_SRaster* flag_raster; } ref; struct /*BMT_NOT*/ { EPR_SBmTerm* arg; } unary; struct /*BMT_AND and BMT_OR*/ { EPR_SBmTerm* arg1; EPR_SBmTerm* arg2; } binary; } op; }; /** * The EPR_BmEvalContext structure represents an evaluation context for bitmask * expressions. It is used internally only. *

* An instance of this structure holds the product ID, references to all flag datasets * required to evaluate the expression as well as information about the bitmask raster beeing * created. * * @see EPR_SProductId * @see EPR_SRaster * @see EPR_SPtrArray */ struct EPR_BmEvalContext { /** * The ID of the product to which this band belongs to. */ EPR_SProductId* product_id; /** * X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster. */ int offset_x; /** * Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster. */ int offset_y; /** * The result 0/1 bit mask raster for all flag bands */ EPR_SRaster* bitmask_raster; /** * The band_id of flags (can be 0, 1 or 4 - for AATSR) */ EPR_SPtrArray* flag_band_ids; /** * The corresponding 0/1 bit mask raster for each flag bands */ EPR_SPtrArray* flag_rasters; }; /** * Represents a flag-field within a flag-record. * */ struct EPR_BmFlagDataset { /*The name of bitmask dataset*/ char* name; /*The value of bitmask dataset (the number of the relevant bit in bitmask)*/ uint bit_index; /*The description of bitmask dataset*/ char* description; }; /** * Creates bit-mask evaluation context * for the given raster and offsets of start corner * * @param product_id the product ID * @param offset_x X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param offset_y Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param raster the bitmask_raster * * @return bit-mask evaluated context for success, and error code otherwise */ EPR_SBmEvalContext* epr_create_bm_eval_context(EPR_SProductId* product_id, int offset_x, int offset_y, EPR_SRaster* raster); /** * Release the memory allocated through a EPR_SBmEvalContext. * * @param context the bit mask context, if NULL the function * immediately returns zero. * @return zero for success, an error code otherwise */ void epr_free_bm_eval_context(EPR_SBmEvalContext* context); /** * Reads bit-mask pixels of the given product for the given bit-mask expression * for the given region and and with the given sub-sampling. * *

*

bit-mask-expression :=
*     or-expression * *

or-expression :=
*     and-expression
*     or-expression or and-expression * *

and-expression :=
*     not-expression
*     and-expression and not-expression * *

not-expression :=
*     primary-expression
*     not not-expression * *

primary-expression :=
*     flag-reference
*     ( bit-mask-expression ) * *

flag-reference :=
*     dataset-name.flag-name *

* *

Where dataset-name and flag-name are names specific for a particular data product. * Names are in general resolved case-insenitively. The parser also accepts an alternate notation for * the boolean operators: *

* The | character for the or operator,
* the & character for the and operator and finally
* the ! character for the not operator. *
* * @param product_id the product ID * @param bm_expr the bit-mask expression * @param xo X-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param yo Y-coordinate in pixel co-ordinates (zero-based) of the upper right corner raster to search * @param raster_width the width in pixel co-ordinates of the raster to search * @param raster_height the height in pixel co-ordinates of raster to search * @param s_x X-step in pixel co-ordinates to get the next raster to search * @param s_y Y-step in pixel co-ordinates to get the next raster to search * @param raster_buffer [BYTE] the memory buffer to save information was read * * @return zero for success, and error code otherwise */ int epr_read_bitmask_data(const EPR_SProductId* product_id, const char* bm_expr, int xo, int yo, int raster_width, int raster_height, int s_x, int s_y, void* raster_buffer); /** * Evaluates the given bitmask expression. * * @param term the bitmask term * @param x the x co-ordinate in pixels * @param y the y co-ordinate in pixels */ epr_boolean epr_eval_bm_term(EPR_SBmEvalContext* context, EPR_SBmTerm* term, int x, int y); /** * Parses a bitmask expression string. * *

The bit-mask expressions recognized by this parser must have the following syntax: * *

*

bit-mask-expression :=
*     or-expression * *

or-expression :=
*     and-expression
*     or-expression or and-expression * *

and-expression :=
*     not-expression
*     and-expression and not-expression * *

not-expression :=
*     primary-expression
*     not not-expression * *

primary-expression :=
*     flag-reference
*     ( bit-mask-expression ) * *

flag-reference :=
*     dataset-name.flag-name *

* *

Where dataset-name and flag-name are names specific for a particular data product. * Names are in general resolved case-insenitively. The parser also accepts an alternate notation for * the boolean operators: *

* The | character for the or operator,
* the & character for the and operator and finally
* the ! character for the not operator. *
* *

For example, the following parseBitmaskExpression request will perform without errors: *

 *     BitmaskTerm term = BitmaskExpressionParser.parse("flags.LAND and not flags.DDV");
 * 
*

Another example for a valid expression in alternatate notation is: *

 *     BitmaskTerm term = BitmaskExpressionParser.parse("flags.LAND | (flags.COASTLINE & !flags.CLOUD)");
 * 
* *

The terms created in the examples above could successfully be evaluated in an evaluation context * provided by an ENVISAT MERIS Level 2 data product. * * @param bm_expr the bitmask expression * @return the bitmask term representing the given expression */ EPR_SBmTerm* epr_parse_bm_expr_str(const char* bm_expr); struct EPR_ParseInfo { const char* bm_expr; int bm_expr_pos; epr_boolean pushed_back; int token_type; char* token; char* err_message; }; typedef struct EPR_ParseInfo EPR_SParseInfo; /** * This group of functions is for parsing the expression. * * @param parse_info parse_info structure * @param term_required the boolean value expression. * * @return the bit mask term (see EPR_BmTerm). */ /*@{*/ EPR_SBmTerm* epr_parse_bm_expr(EPR_SParseInfo* parse_info, epr_boolean term_required); EPR_SBmTerm* epr_parse_bm_OR_expr(EPR_SParseInfo* parse_info, epr_boolean term_required); EPR_SBmTerm* epr_parse_bm_AND_expr(EPR_SParseInfo* parse_info, epr_boolean term_required); EPR_SBmTerm* epr_parse_bm_unary_expr(EPR_SParseInfo* parse_info, epr_boolean term_required); EPR_SBmTerm* epr_parse_bm_primary_expr(EPR_SParseInfo* parse_info, epr_boolean term_required); /*@}*/ /** * This group of functions is for recognizing the keyword. * * @param parse_info parse_info structure * * @return TRUE or FALSE. */ /*@{*/ epr_boolean epr_is_bm_OR_keyword(EPR_SParseInfo* parse_info); epr_boolean epr_is_bm_AND_keyword(EPR_SParseInfo* parse_info); epr_boolean epr_is_bm_NOT_keyword(EPR_SParseInfo* parse_info); /*@}*/ /** * This group of functions is for recognizing the operator. * * @param parse_info parse_info structure * * @return TRUE or FALSE. */ /*@{*/ epr_boolean epr_is_bm_AND_operator(EPR_SParseInfo* parse_info); epr_boolean epr_is_bm_OR_operator(EPR_SParseInfo* parse_info); epr_boolean epr_is_bm_NOT_operator(EPR_SParseInfo* parse_info); /*@}*/ /** * Tests the given expression for operand name only (not operator). * * @param parse_info parse_info structure * * @return TRUE if the term is not NULL and an operand, or FALSE otherwise */ epr_boolean epr_is_bm_name_token(EPR_SParseInfo* parse_info); /** * Tests the given expression for the end of string. * * @param parse_info parse_info structure * * @return TRUE if the EOS occurs, or FALSE otherwise */ epr_boolean epr_is_bm_EOS_token(EPR_SParseInfo* parse_info); /** * Tests the given expression for errors. * * @param parse_info parse_info structure * * @return TRUE if no error occurs, or FALSE otherwise */ epr_boolean epr_is_bm_expr_error(EPR_SParseInfo* parse_info); /** * Gets the first character of token for the given expression or EOS. * * @param parse_info parse_info structure * * @return '(' , ')', '.' , '&' , '|' ,'!', or '\0' otherwise */ int epr_get_token_char(EPR_SParseInfo* parse_info); /** * Releases the actual token given expression. * * @param parse_info parse_info structure * * @return token */ char* epr_consume_token(EPR_SParseInfo* parse_info); /** * Selectss the next token given expression. * * @param parse_info parse_info structure */ void epr_next_bm_expr_token(EPR_SParseInfo* parse_info); void epr_push_back_bm_expr_token(EPR_SParseInfo* parse_info); void epr_set_bm_expr_error(EPR_SParseInfo* parse_info, const char* message); int epr_tokenize_bm_expr(const char* bm_expr, int* bm_expr_pos, char** token); /** * Creates a new bitmask term instance. */ EPR_SBmTerm* epr_create_bm_term(EPR_EBmOpCode op_code); /** * Creates a new bitmask reference term instance. */ EPR_SBmTerm* epr_create_bm_REF_term(char* ds_name, char* flag_name); /** * Creates a new bitmask NOT term instance. */ EPR_SBmTerm* epr_create_bm_NOT_term(EPR_SBmTerm* arg); /** * Creates a new bitmask OR term instance. */ EPR_SBmTerm* epr_create_bm_OR_term(EPR_SBmTerm* arg1, EPR_SBmTerm* arg2); /** * Creates a new bitmask reference AND term instance. */ EPR_SBmTerm* epr_create_bm_AND_term(EPR_SBmTerm* arg1, EPR_SBmTerm* arg2); /** * Releases a new bitmask term instance. */ void epr_free_bm_term(EPR_SBmTerm* term); /** * Creates a new bitmask expression from the given bitmask term. *

The expression returned is a valid in the sense that the epr_parse_bm_expr() * applied to the returned string would return an equivalent term. * * @param term the term to be converted */ char* epr_create_bm_expr(EPR_SBmTerm* term); /** * Prints the given term as an expression to the console. */ void epr_print_bm_term(EPR_SBmTerm* term); /** * Writes the given term as an expression to the given output stream. */ void epr_write_bm_term(EPR_SBmTerm* term, FILE* ostream); /** * Creates the coding flag info * * @param str the local path to dddb * * @return the the pointer at the coding flag information. */ EPR_SPtrArray* epr_create_flag_coding(EPR_SProductId* product_id, const char* str); /** * Creates the coding flag definition * * @return the the pointer at the coding flag definition information. */ EPR_SFlagDef* epr_create_flag_def(); /** * Releases the coding flag definition */ void epr_free_flag_def(EPR_SFlagDef* flag_def); /** * Releases the coding flag info */ void epr_free_flag_coding(EPR_SPtrArray* flag_coding); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_BITMASK_H_INCL */ bcdev-epr-api-a922482/src/epr_core.c000066400000000000000000000330751142554441000171460ustar00rootroot00000000000000/* * $Id: epr_core.c,v 1.1.1.1 2004-10-28 19:22:22 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" /** * The one and only ENVISAT API instance. */ EPR_SAPI epr_api; /* Function: epr_str_to_data_type_id Access: private API implementation helper Changelog: 2002/01/05 nf initial version */ /** * Converts the given string into a data type identifier. * * @param str the string to be converted. * @return the data type identifier represented by the given string. * If the string can not be converted the special value * e_tid_unknown is returned. */ EPR_EDataTypeId epr_str_to_data_type_id(const char* str) { assert(str != NULL); if (epr_equal_names(str, "UChar") || epr_equal_names(str, "uchar")) return e_tid_uchar; else if (epr_equal_names(str, "AChar") || epr_equal_names(str, "SChar") || epr_equal_names(str, "char")) return e_tid_char; else if (epr_equal_names(str, "UShort") || epr_equal_names(str, "ushort")) return e_tid_ushort; else if (epr_equal_names(str, "SShort") || epr_equal_names(str, "short")) return e_tid_short; else if (epr_equal_names(str, "UInt") || epr_equal_names(str, "uint")) return e_tid_uint; else if (epr_equal_names(str, "SInt") || epr_equal_names(str, "int")) return e_tid_int; else if (epr_equal_names(str, "ULong") || epr_equal_names(str, "ulong")) return e_tid_uint; else if (epr_equal_names(str, "SLong") || epr_equal_names(str, "long")) return e_tid_int; else if (epr_equal_names(str, "Float") || epr_equal_names(str, "float")) return e_tid_float; else if (epr_equal_names(str, "Double") || epr_equal_names(str, "double")) return e_tid_double; else if (epr_equal_names(str, "@/types/UTC.dd") || epr_equal_names(str, "time")) return e_tid_time; else if (epr_equal_names(str, "String") || epr_equal_names(str, "string")) return e_tid_string; else if (epr_equal_names(str, "Spare") || epr_equal_names(str, "spare")) return e_tid_spare; else return e_tid_unknown; } /* Function: epr_data_type_id_to_str Access: public API implementation helper Changelog: 2003/07/10 nf initial version */ /** * Converts the given data type identifier to a string representing the C-type of the data type. * * @param data_type_id the data type identifier. * If the identifier can not be converted, an empty string * "" is returned. * @return the C-type string */ const char* epr_data_type_id_to_str(EPR_EDataTypeId data_type_id) { switch (data_type_id) { case e_tid_uchar: return "uchar"; case e_tid_char: return "char"; case e_tid_ushort: return "ushort"; case e_tid_short: return "short"; case e_tid_uint: return "uint"; case e_tid_int: return "int"; case e_tid_float: return "float"; case e_tid_double: return "double"; case e_tid_string: return "string"; case e_tid_spare: return "spare"; case e_tid_time: return "time"; default: return ""; } } /* Function: epr_get_data_type_size Access: private API implementation helper Changelog: 2002/01/24 nf initial version */ /** * Determines the length of the given data type identifier. * * @param data_type_id the data type identifier. * @return the the length of the data type identifier. * If the data type identifier is unknown, * e_tid_unknown is returned. */ uint epr_get_data_type_size(EPR_EDataTypeId data_type_id) { switch (data_type_id) { case e_tid_uchar: return sizeof(uchar); case e_tid_char: return sizeof(char); case e_tid_ushort: return sizeof(ushort); case e_tid_short: return sizeof(short); case e_tid_uint: return sizeof(uint); case e_tid_int: return sizeof(int); case e_tid_float: return sizeof(float); case e_tid_double: return sizeof(double); case e_tid_string: return sizeof(char); case e_tid_spare: return sizeof(uchar); case e_tid_time: return sizeof (int) /* days */ + sizeof (uint) /* seconds */ + sizeof (uint); /* microseconds */ default: return 0; } } /* * ===================== Logging ============================== */ /* Function: epr_log Access: private API implementation helper Changelog: 2002/01/05 mp initial version */ /** * Logs a message with the given log level. * *

The function calls this API's log handler if * it is not NULL and if the given log * level is greater than or equal to the global log level. * * @param log_level the log level (or message type) for the mesage * @param log_message the mesage */ void epr_log(EPR_ELogLevel log_level, const char* log_message) { if (epr_api.log_handler != NULL && log_level >= epr_api.log_level) epr_api.log_handler(log_level, log_message); } /* * ===================== Error Handling ============================== */ /* Function: epr_set_error Access: private API implementation helper Changelog: 2002/01/05 mp initial version */ /** * Sets the given error code and the associated error message and * calls this API's error handler if it is not NULL. * * @param err_code the error code * @param err_message the error mesage */ void epr_set_err(EPR_EErrCode err_code, const char* err_message) { epr_api.last_err_code = err_code; epr_assign_string(&epr_api.last_err_message, err_message); if (epr_api.log_handler != NULL) { epr_api.log_handler(e_log_error, err_message); } if (epr_api.err_handler != NULL) { epr_api.err_handler(err_code, err_message); } } /* Function: epr_set_error Access: private API implementation helper Changelog: 2002/01/05 mp initial version */ /** * Clears the last error. After calling this function, calling * epr_get_last_err_code returns e_err_none or zero and * epr_get_last_err_message returns NULL. */ void epr_clear_err() { epr_api.last_err_code = e_err_none; epr_free_string(epr_api.last_err_message); epr_api.last_err_message = NULL; } /* Function: epr_get_last_err_code Access: private API implementation helper Changelog: 2002/01/05 nf initial version */ /** * Sets the error code of the error that occured during * the last API function call. * * @return the error code, e_err_none or zero if no error occured */ EPR_EErrCode epr_get_last_err_code() { return epr_api.last_err_code; } /* Function: epr_get_last_err_message Access: private API implementation helper Changelog: 2002/01/05 nf initial version */ /** * Sets the error message of the error that occured during * the last API function call. * * @return the error message, NULL if no error occured */ const char* epr_get_last_err_message() { return epr_api.last_err_message; } /** * Opens a file to read. * * @param file_path the path to the file. * * @return the file handle or * NULL if an error occured. */ FILE* epr_open_file(char* file_path) { FILE* db_file; epr_log(e_log_debug, "about to open file: "); epr_log(e_log_debug, file_path); db_file = fopen(epr_trim_string(file_path), "rb"); if (db_file == NULL) { epr_log(e_log_debug, "open failed"); if (errno == ENOENT) { epr_set_err(e_err_file_not_found, "epr_open_file: file not found"); } else { epr_set_err(e_err_file_access_denied, "epr_open_file: file open failed"); } } /*epr_log(e_log_debug, "open successful");*/ return db_file; } /** * Converts the given string into an int number. * * @param str the string to be converted. * @return the int type number represented by the given string. * If the string can not be converted, * the value of 1 is returned. */ int epr_str_to_number(const char* str) { char *stopstring; int l; assert(str != NULL); if (strcmp(str, "*") == 0) return 1; if (strcmp(str, "") == 0) return 1; l = strtol( str, &stopstring, 10 ); if (errno == EDOM) { epr_set_err(e_err_illegal_conversion, "failed to convert string to integer: errno = EDOM"); return -1; } if (errno == ERANGE) { epr_set_err(e_err_illegal_conversion, "failed to convert string to integer: errno = ERANGE"); return -1; } return l; } /** * Converts the given string into a field length. * * The string can represent a single integer value or a sequence * of integer value and parameter references (names). Integers * and value are expected to be separated by the asterisk * character ('*'). E.g. the string "3 * 4 * num_pixels_across" * is represents a valid field length as long as the parameter * name 'num_pixels_across' is found in the given parameter table. * * @param count the string to be converted * @param product_id the Product identifier containing the values * for the Product * @return the field length computed from the given string or * (uint)-1 if an error occured. */ uint epr_parse_value_count(EPR_SProductId* product_id, const char* count) { char seps[] = EPR_COUNT_SEPARATOR_ARRAY; char * token; char * str; uint c; int pos = 0; uint comes_from_convert; c = 1; str = epr_clone_string(count); if (str == NULL) { epr_set_err(e_err_out_of_memory, "epr_parse_value_count: cannot allocate memory"); return 16111;/*8999*/ /* @todo check: why in the hell 16111 ? */ } while ((token = epr_str_tok(str, seps, &pos)) != NULL) { comes_from_convert = epr_str_to_number(token); if (comes_from_convert == 0 && (strcmp(token, "0") != 0)) { /* check if "token" belongs to param_table*/ comes_from_convert = epr_param_to_value(token, product_id->param_table); if (comes_from_convert == -1) { epr_set_err(e_err_illegal_conversion, "epr_parse_value_count: parameter not found"); return 16111; /* @todo check: why in the hell 16111 ? */ } } c *= comes_from_convert; epr_free_string(token); token = NULL; } epr_free_string(str); return c; } /** * Finds in the param_table the value corresponding to its name. * * @param str the parameter name * @param param_table the pointer to param_table * * @return the value of the given name or * (uint)-1 if an error occured. */ uint epr_param_to_value(const char* str, EPR_SPtrArray* param_table) { EPR_SParamElem* param_elem = NULL; int elem_index; int param_table_length; param_table_length = (int)epr_get_ptr_array_length(param_table); for (elem_index = 0; elem_index < param_table_length; elem_index++) { param_elem = (EPR_SParamElem*)epr_get_ptr_array_elem_at(param_table, elem_index); if (epr_equal_names(param_elem->param_name, str)) { return param_elem->param_value; } } return (uint) -1; /*error*/ } /** * Adapts path description to operating system. * * @param path the path to a file. * */ void epr_make_os_compatible_path(char* path) { if (path != NULL) { char* pc = path; while (*pc != '\0') { #ifdef WIN32 if (*pc == '/') *pc = '\\'; #elif _M_MPPC if (*pc == '/') *pc = ':'; /* UK note: the colon is an old-style path separator of the Mac OS */ /* possibly not used any more but supported for Classic compatibility */ /* @to do: check whether the forward slash / should be used in Mac OS X */ #else if (*pc == '\\') *pc = '/'; #endif pc++; } } } epr_boolean epr_check_api_init_flag() { if (!epr_api.init_flag) { epr_set_err(e_err_api_not_initialized, "epr_open_product: API not initialized (forgot to call epr_init_api?)"); return FALSE; } return TRUE; } bcdev-epr-api-a922482/src/epr_core.h000066400000000000000000000203121142554441000171410ustar00rootroot00000000000000/* * $Id: epr_core.h,v 1.1.1.1 2004-10-28 19:22:22 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_CORE_H_INCL #define EPR_CORE_H_INCL #ifdef __cplusplus extern "C" { #endif #include /* just to get the ANSI-C type FILE */ #include "epr_ptrarray.h" struct EPR_API; struct EPR_Parameter; typedef struct EPR_API EPR_SAPI; typedef struct EPR_Parameter EPR_SParameter; #define EPR_ENVISAT_PRODUCT_MERIS "MER" #define EPR_ENVISAT_PRODUCT_ASAR "ASA" #define EPR_ENVISAT_PRODUCT_AATSR "ATS" #define EPR_LONGI_BAND_NAME "longitude" #define EPR_AATSR_LINES_PER_TIE_PT 32 #define EPR_MPH_SIZE 1247 #define EPR_SPH_SIZE 11622 #define EPR_DSD_SIZE 280 #define EPR_PRODUCT_MPH_SIZE 1048 /*??????*/ #define EPR_PRODUCT_MAGIC_STR "PRODUCT=\"" #define EPR_PRODUCT_ID_OFFSET 9 #define EPR_PRODUCT_TYPE_ID_STRLEN 10 #define EPR_LENGTH_NUM_DSD_IDENTIFIER 9 #define EPR_COUNT_SEPARATOR_ARRAY ",*" #define EPR_IRRELEVANCE_SYMBOL '*' #define EPR_FIELD_SEPARATOR_ARRAY "|" #define EPR_HEADER_SEPARATOR_ARRAY "=<>" #define EPR_HEADER_EXCEPTIONS_ARRAY "eE" #define EPR_LONGI_ABS_MAX 180 #define EPR_LONGI_ABS_MIN -180 #define EPR_LINE_MAX_LENGTH 2000 #define EPR_BE_MAGIC_NUMBER 1162761801UL #define EPR_LE_MAGIC_NUMBER 1230392901UL #define EPR_LE_MAGIC_BYTE_0 'E' #define EPR_LE_MAGIC_BYTE_1 'N' #define EPR_LE_MAGIC_BYTE_2 'V' #define EPR_LE_MAGIC_BYTE_3 'I' #define EPR_ATS_NUM_PER_POINT_ACROSS_LOCAT 23 #define EPR_ATS_NUM_PER_POINT_ACROSS_SOLAR 11 #define EPR_ATS_LINE_LENGTH 512 #define EPR_ASAR_NUM_PER_POINT_ACROSS_LOCAT 11 /** * The EPR_API structure is a container for all globally * required information related to to the ENVISAT product reader API. * *

A single global (but hidden) instance exists for this structure. */ struct EPR_API { /** * The directory path to the record info database. */ epr_boolean init_flag; /** * A boolean value indicating whether this code run's on a * little endian order machine or not. *

1 stands for little endian (LE), * 0 stands for big endian (BE). */ int little_endian_order; /** * A unsigned int value indicating head length */ uint epr_head_size; /** * The directory path to the record info database. */ /*char* db_dir_path;*/ /** * The current log level for the ENVISAT API. */ EPR_ELogLevel log_level; /** * The log handler (function pointer) for the ENVISAT API. * Can be NULL. */ EPR_FLogHandler log_handler; /** * The error code of the last error occured. */ EPR_EErrCode last_err_code; /** * The error message of the last error occured. */ char* last_err_message; /** * The error handler (function pointer) for the ENVISAT API. * Can be NULL. */ EPR_FErrHandler err_handler; }; /** * The one and only ENVISAT API instance. */ extern EPR_SAPI epr_api; /* * ====================================================================== */ /** * Frees the memory allocated by the given product file identifier. * *

After calling this function the give product file identifier pointer * gets invalid and should not be used anymore. * * @param record the product file identifier to be released, * if NULL the function immediately returns */ void epr_free_product_id(EPR_SProductId* product_id); /** * Logs a message with the given log level. * *

The function calls this API's log handler if * it is not NULL and if the given log * level is greater than or equal to the global log level. * * @param log_level the log level (or message type) for the mesage * @param log_message the mesage */ void epr_log(EPR_ELogLevel log_level, const char* log_message); /** * Sets the given error code and the associated error message and * calls this API's error handler if it is not NULL. * * @param err_code the error code * @param err_message the error mesage */ void epr_set_err(EPR_EErrCode err_code, const char* err_message); /** * Reads the full main product header (MPH) of the ENVISAT product file * given by the given product identifier. * * @param product_id the product identifier, must not be NULL * @return a record representing the MPH of the specified product file * or NULL if an error occured. */ EPR_SRecord* epr_read_mph(EPR_SProductId* product_id); /** * Reads the full specific product header (SPH) of the ENVISAT product file * given by the given product identifier. * * @param product_id the product identifier, must not be NULL * @return a record representing the MPH of the specified product file * or NULL if an error occured. */ EPR_SRecord* epr_read_sph(EPR_SProductId* product_id); /** * Converts the given string into a data type identifier. * * @param str the string to be converted. * @return the data type identifier represented by the given string. * If the string can not be converted the special value * e_tid_unknown is returned. */ EPR_EDataTypeId epr_str_to_data_type_id(const char* str); /* * Converts the given string into a field length. * * The string can represent a single integer value or a sequence * of integer value and parameter references (names). Integers * and value are expected to be separated by the asterisk * character ('*'). E.g. the string "3 * 4 * num_pixels_across" * is represents a valid field length as long as the parameter * name 'num_pixels_across' is found in the given parameter table. * * @param str the string to be converted * @param param_table the parameter table containing the values * for the parameter references in the string * @return the field length computed from the given string or * (uint)-1 if an error occured. */ /*uint epr_str_to_field_length(const char* str, EPR_SParamTable* param_table);*/ /** * Compares the two given names and returns TRUE if * they are equal ignoring the case of each letter. * *

This function is used to compare names throughout the * ENVISAT product reader API. * * @param name1 the first name, must not be NULL * @param name2 the second name, must not be NULL * @return TRUE if the names are equal, * FALSE otherwise */ char* epr_build_db_file_istream_name(EPR_SProductId* product_id, char* what); FILE* epr_open_file(char* path_to_file); int epr_str_to_number(const char* str); uint epr_parse_value_count(EPR_SProductId* product_id, const char* str); uint epr_param_to_value(const char* str, EPR_SPtrArray* param_table); void epr_make_os_compatible_path(char* path); epr_boolean epr_check_api_init_flag(); /* void epr_make_image_header(EPR_SProductId* product_id, EPR_SDatasetId* dataset_id, EPR_SRecord* record); int epr_make_image(EPR_SProductId* product_id, EPR_SDatasetId* dataset_id, EPR_SRecord* record); */ /** * Gets the element content to output FILE stream. * * @param field the pointer at the field to get out. * @param istream the identifier of the output file. */ void epr_output_element(const EPR_SField* field, uint field_index, uint element_index, FILE* istream); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_CORE_H_INCL */ bcdev-epr-api-a922482/src/epr_dataset.c000066400000000000000000000256201142554441000176400ustar00rootroot00000000000000/* * $Id: epr_dataset.c,v 1.1.1.1 2004-10-28 19:22:22 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_dataset.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" EPR_SDatasetId* epr_create_dataset_id(EPR_SProductId* product_id, const EPR_SDSD* dsd, const char* dataset_name, const struct RecordDescriptor* record_descriptor, const char* dsd_name, const char* description) { EPR_SDatasetId* dataset_id = (EPR_SDatasetId*) calloc(1, sizeof (EPR_SDatasetId)); if (dataset_id == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_dataset_id: out of memory"); return NULL; } dataset_id->magic = EPR_MAGIC_DATASET_ID; dataset_id->product_id = product_id; dataset_id->dsd = dsd; dataset_id->record_info = NULL; epr_assign_string(&dataset_id->dataset_name, dataset_name); dataset_id->record_descriptor = record_descriptor; epr_assign_string(&dataset_id->dsd_name, dsd_name); epr_assign_string(&dataset_id->description, description); return dataset_id; } /** * Release the memory allocated through a dataset ID. * * @param product_id the file identifier, if NULL the function * immediately returns zero. * @return zero for success, an error code otherwise */ void epr_free_dataset_id(EPR_SDatasetId* dataset_id) { if (dataset_id == NULL) return; /* Don't free the product ID, it is NOT owned by a dataset ID */ dataset_id->product_id = NULL; /* Don't free the record information, it is NOT owned by a dataset ID */ dataset_id->record_info = NULL; /* Don't free the DSD, it is NOT owned by a dataset ID */ dataset_id->dsd = NULL; epr_free_and_null_string(&dataset_id->dataset_name); epr_free_and_null_string(&dataset_id->dsd_name); epr_free_and_null_string(&dataset_id->description); free(dataset_id); } /** * Creates an array of dataset_id for the given ENVISAT product * * @param product_id the the product file identifier * @return the instance of the array */ EPR_SPtrArray* epr_create_dataset_ids(EPR_SProductId* product_id) { EPR_SPtrArray* dataset_ids = NULL; EPR_SDatasetId* dataset_id = NULL; const EPR_SDSD* dsd = NULL; uint dsd_index; int i; const struct DatasetDescriptorTable* p_tables; int pt_index; int num_descr; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "create_dataset_ids: product_id must not be NULL"); return NULL; } /* @DDDB */ p_tables = dddb_product_tables; pt_index = -1; for (i = 0; i < EPR_NUM_PRODUCT_TABLES; i++) { const char* id = p_tables[i].name; if (strncmp(product_id->id_string, id, 10) == 0) { if (product_id->meris_iodd_version == 5) { if (strcmp(id, "MER_RR__1P_IODD5") == 0 || strcmp(id, "MER_FR__1P_IODD5") == 0) { pt_index = i; } } else if (product_id->meris_iodd_version == 6) { if (strcmp(id, "MER_RR__2P_IODD6") == 0 || strcmp(id, "MER_FR__2P_IODD6") == 0) { pt_index = i; } } else { pt_index = i; } } if (pt_index != -1) { break; } } if (pt_index == -1) { epr_set_err(e_err_null_pointer, "create_dataset_ids: unknown product type"); return NULL; } dataset_ids = epr_create_ptr_array(16); num_descr = p_tables[pt_index].num_descriptors; for (i = 0; i < num_descr; i++) { for (dsd_index = 0; dsd_index < product_id->dsd_array->length; dsd_index++) { dsd = (EPR_SDSD*)epr_get_ptr_array_elem_at(product_id->dsd_array, dsd_index); if (strncmp(dsd->ds_name, p_tables[pt_index].descriptors[i].ds_name, strlen(epr_strip_string_r(dsd->ds_name))) == 0) { dataset_id = epr_create_dataset_id(product_id, dsd, p_tables[pt_index].descriptors[i].id, p_tables[pt_index].descriptors[i].rec_descriptor, p_tables[pt_index].descriptors[i].ds_name, p_tables[pt_index].descriptors[i].description); epr_add_ptr_array_elem(dataset_ids, dataset_id); break; } } } return dataset_ids; } const char* epr_get_dataset_name(EPR_SDatasetId* dataset_id) { epr_clear_err(); if (dataset_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_dataset_name: band_id must not be NULL"); return NULL; } return epr_trim_string(dataset_id->dataset_name); } uint epr_get_num_records(const EPR_SDatasetId* dataset_id) { epr_clear_err(); if (dataset_id == NULL) { epr_set_err(e_err_invalid_dataset_name, "epr_get_num_records: invalid dataset name"); return (uint)-1; } return dataset_id->dsd->num_dsr; } const EPR_SDSD* epr_get_dsd(const EPR_SDatasetId* dataset_id) { epr_clear_err(); if (dataset_id == NULL) { epr_set_err(e_err_invalid_dataset_name, "epr_get_dsd: invalid dataset name"); return NULL; } return dataset_id->dsd; } const char* epr_get_dsd_name(const EPR_SDatasetId* dataset_id) { epr_clear_err(); if (dataset_id == NULL) { epr_set_err(e_err_invalid_dataset_name, "epr_get_dsd_name: invalid dataset name"); return NULL; } return epr_trim_string(dataset_id->dsd_name); } uint epr_get_dataset_offset(EPR_SDatasetId* dataset_id) { if (dataset_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_dataset_offset: dataset_id must not be NULL"); return (uint)0; } return dataset_id->dsd->ds_offset; } /*********************************** RECORD ***********************************/ /* Function: epr_create_record Access: public API Changelog: 2002/01/23 mp initial version */ /** * Creates a new record for the dataset given by the specified * dataset identifier. */ EPR_SRecord* epr_create_record(EPR_SDatasetId* dataset_id) { EPR_SRecord* record = NULL; epr_clear_err(); if (dataset_id == NULL) { epr_set_err(e_err_illegal_arg, "epr_create_record: dataset ID must not be NULL"); return NULL; } if (dataset_id->record_info == NULL) { dataset_id->record_info = epr_get_record_info(dataset_id); } record = epr_create_record_from_info(dataset_id->record_info); if (record == NULL) { epr_set_err(e_err_invalid_record_name, "epr_create_record: invalid record name"); return NULL; } return record; } /** * Reads a full record from ENVISAT product file. */ EPR_SRecord* epr_read_record(EPR_SDatasetId* dataset_id, uint record_index, EPR_SRecord* record) { uint field_index; uint dsd_offset; uint record_size; uint data_type_size; uint elements_to_read; uint elements_read; EPR_SField* field = NULL; epr_clear_err(); if (dataset_id == NULL) { epr_set_err(e_err_invalid_dataset_name, "epr_read_record: invalid dataset name"); return NULL; } if ((record_index < 0) || (record_index >= dataset_id->dsd->num_dsr)) { epr_set_err(e_err_invalid_value, "epr_read_record: invalid record_index parameter, must be >=0 and info != dataset_id->record_info) { epr_set_err(e_err_invalid_record_name, "epr_read_record: invalid record name"); return NULL; } /*READ FILE with: dataset_id->product_id->istream after the setting it to begin*/ rewind(dataset_id->product_id->istream); /*GET OFFSET*/ dsd_offset = dataset_id->dsd->ds_offset; record_size = record->info->tot_size; if (record_size != dataset_id->dsd->dsr_size) { epr_set_err(e_err_invalid_data_format, "epr_read_record: wrong record size"); return NULL; } /* Set file pointer to begin of demanded record */ if (fseek(dataset_id->product_id->istream, dsd_offset + record_size * record_index, SEEK_SET) != 0) { epr_set_err(e_err_file_access_denied, "epr_read_record: file seek failed"); return NULL; } for (field_index = 0; field_index < record->num_fields; field_index++) { field = record->fields[field_index]; elements_to_read = field->info->num_elems ; data_type_size = epr_get_data_type_size(field->info->data_type_id); assert(data_type_size != 0); assert(field->elems != NULL); if (elements_to_read * data_type_size != field->info->tot_size) { /*epr_log(e_log_info, "Spare");*/ data_type_size = field->info->tot_size / elements_to_read; } elements_read = fread(field->elems, data_type_size, elements_to_read, dataset_id->product_id->istream); if (elements_read != elements_to_read) { epr_set_err(e_err_file_read_error, "epr_read_record: file read failed"); return NULL; } /* * SWAP bytes on little endian (LE) order architectures (I368, Pentium Processors). * ENVISAT products are stored in big endian (BE) order. */ if (epr_api.little_endian_order) { epr_swap_endian_order(field); } } return record; } bcdev-epr-api-a922482/src/epr_dataset.h000066400000000000000000000032661142554441000176470ustar00rootroot00000000000000/* * $Id: epr_dataset.h,v 1.1.1.1 2004-10-28 19:22:22 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_DATASET_H_INCL #define EPR_DATASET_H_INCL #ifdef __cplusplus extern "C" { #endif /** * @todo add docu here... */ EPR_SDatasetId* epr_create_dataset_id(EPR_SProductId* product_id, const EPR_SDSD* dsd, const char* dataset_name, const struct RecordDescriptor* record_info_ref, const char* dsd_name, const char* description); /** * Release the memory allocated through a dataset ID. * * @param product_id the file identifier, if NULL the function * immediately returns * @see epr_create_dataset_id */ void epr_free_dataset_id(EPR_SDatasetId* dataset_id); EPR_SPtrArray* epr_create_dataset_ids(EPR_SProductId* product_id); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_DATASET_H_INCL */ bcdev-epr-api-a922482/src/epr_dddb.c000066400000000000000000020775771142554441000171340ustar00rootroot00000000000000#include "epr_api.h" #include "epr_dddb.h" static const struct RecordDescriptor MER_LRC_2P_MDSR_cl_thick_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"cl_opt_thick_pix", e_tid_uchar, NULL, 1, "sceneRasterWidth", "cloud optical thickness pixel #1- #281"} }; static const struct RecordDescriptor MER_LRC_2P_MDSR_cl_top_press_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"cl_top_press_pix", e_tid_uchar, NULL, 1, "sceneRasterWidth", "cloud top pressure pixel #1- #281"} }; static const struct RecordDescriptor MER_LRC_2P_MDSR_flag_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"pixel_info", e_tid_uchar, "counts", 1, "3*sceneRasterWidth", "Flags associated with pixel #1 - #281"} }; static const struct RecordDescriptor MER_LRC_2P_MDSR_twv_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"wvapour_cont_pix", e_tid_uchar, NULL, 1, "sceneRasterWidth", "Water Vapour Content pixel #1- #281"} }; static const struct RecordDescriptor MER_RRC_2P_GADS_sfgi_meris_rec_data[] = { {"sf_cl_opt_thick", e_tid_float, NULL, 4, "1", "scaling factor - Cloud optical thickness"}, {"sf_cloud_top_press", e_tid_float, NULL, 4, "1", "scaling factor - Cloud Top Pressure"}, {"sf_wvapour", e_tid_float, NULL, 4, "1", "scaling factor - Water vapour"}, {"off_cl_opt_thick", e_tid_float, NULL, 4, "1", "offset-Cloud optical thickness"}, {"off_cloud_top_press", e_tid_float, "hPa", 4, "1", "offset - Cloud Top Pressure"}, {"off_wvapour", e_tid_float, "g.cm-2", 4, "1", "offset-Water vapour"}, {"spare_1", e_tid_spare, NULL, 52, "1", "Spare"} }; static const struct RecordDescriptor MER_RRV_2P_GADS_sfgi_meris_rec_data[] = { {"sf_toa_veg_ind", e_tid_float, NULL, 4, "1", "scaling factor - TOA Vegetation Index"}, {"sf_boa_veg_ind", e_tid_float, NULL, 4, "1", "scaling factor - BOA Vegetation Index"}, {"off_toa_veg_ind", e_tid_float, NULL, 4, "1", "offset-TOA Vegetation Index"}, {"off_boa_veg_ind", e_tid_float, NULL, 4, "1", "offset-BOA Vegetation Index"}, {"spare_1", e_tid_spare, NULL, 60, "1", "Spare"} }; static const struct RecordDescriptor MER_RR__1P_ADSR_sq_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Time of the first line in the MDS corresponding to this record."}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (Set to 1 if all the records in all the bands are blank for the period corresponding to this record, set to zero otherwise)"}, {"range_flag", e_tid_ushort, "flag", 2, "5", "Out of Range flag. For every band, when the number of out of range samples is above a given threshold then it is set to TRUE, otherwise it is left to FALSE. The 15 flags for all the bands of a module are stored in an unsigned integer. To have this informati"}, {"range_blind_flag", e_tid_ushort, "flag", 2, "5", "Out of Range blind flag. Flags set to TRUE when the number of out of range blind spectral samples per module is above a given threshold. Flag ordering same as described in field 3."} }; static const struct RecordDescriptor MER_RR__1P_ADSR_tie_pt_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start time of the measurement"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (set to 1 if all MDSRs corresponding to this ADSR are blank, set to zero otherwise)"}, {"lat_tie_pt", e_tid_int, "(1e-6) degrees", 4, "tiePointGridWidth", "Latitude of the tie points WGS84, positive N"}, {"long_tie_pt", e_tid_int, "(1e-6) degrees", 4, "tiePointGridWidth", "Longitude of the tie points WGS84, Greenwich origin, positive E"}, {"dem_alt_tie_pt", e_tid_int, "m", 4, "tiePointGridWidth", "DEM altitude"}, {"dem_rough", e_tid_uint, "m", 4, "tiePointGridWidth", "DEM roughness"}, {"dem_lat_corrc", e_tid_int, "(1e-6) degrees", 4, "tiePointGridWidth", "DEM latitude corrections"}, {"dem_long_corrc", e_tid_int, "(1e-6) degrees", 4, "tiePointGridWidth", "DEM longitude corrections"}, {"sun_zen_ang", e_tid_uint, "(1e-6) degrees", 4, "tiePointGridWidth", "Sun zenith angles"}, {"sun_azi_ang", e_tid_int, "(1e-6) degrees", 4, "tiePointGridWidth", "Sun azimuth angles"}, {"vw_zen_ang", e_tid_uint, "(1e-6) degrees", 4, "tiePointGridWidth", "Viewing zenith angles"}, {"vw_azi_ang", e_tid_int, "(1e-6) degrees", 4, "tiePointGridWidth", "Viewing azimuth angles"}, {"zon_wind", e_tid_short, "m*s-1", 2, "tiePointGridWidth", "Zonal winds"}, {"meri_wind", e_tid_short, "m*s-1", 2, "tiePointGridWidth", "Meridional winds"}, {"atm_pres", e_tid_ushort, "hPa", 2, "tiePointGridWidth", "Mean sea level pressures"}, {"tot_ozone", e_tid_ushort, "DU", 2, "tiePointGridWidth", "Total ozone"}, {"rel_humid", e_tid_ushort, "%", 2, "tiePointGridWidth", "Relative humidity"} }; static const struct RecordDescriptor MER_RR__1P_GADS_sfgi_meris_rec_data[] = { {"sf_alt", e_tid_float, NULL, 4, "1", "scaling factor - altitude"}, {"sf_rough", e_tid_float, NULL, 4, "1", "scaling factor - roughness"}, {"sf_zon_wind", e_tid_float, NULL, 4, "1", "scaling factor - zonal wind"}, {"sf_merr_wind", e_tid_float, NULL, 4, "1", "scaling factor - meridional wind"}, {"sf_atm_pres", e_tid_float, NULL, 4, "1", "scaling factor - atmospheric pressure"}, {"sf_ozone", e_tid_float, NULL, 4, "1", "scaling factor - ozone"}, {"sf_rel_hum", e_tid_float, NULL, 4, "1", "scaling factor - relative humidity"}, {"sf_rad", e_tid_float, NULL, 4, "15", "scaling factor - radiances"}, {"gain_set", e_tid_uchar, NULL, 1, "5*16", "Gain setting"}, {"samp_rate", e_tid_uint, "(10-6) s", 4, "1", "sampling rate"}, {"sun_spec_flux", e_tid_float, "LU", 4, "15", "Sun Spectral Flux (for bands 1-15)"}, {"spare_1", e_tid_spare, NULL, 60, "1", "Spare"} }; static const struct RecordDescriptor MER_RR__1P_MDSR_16_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start time of the Data Set Record"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"flags", e_tid_uchar, NULL, 1, "sceneRasterWidth", "Flags and spectral shift index"}, {"detector_index", e_tid_short, NULL, 2, "sceneRasterWidth", "Flags and spectral shift index"} }; static const struct RecordDescriptor MER_RR__1P_MDSR_16_IODD5_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start time of the Data Set Record"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"pixel_info", e_tid_uchar, NULL, 1, "2*sceneRasterWidth", "Flags and spectral shift index"} }; static const struct RecordDescriptor MER_RR__1P_MDSR_1_15_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start time of the Data Set Record"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"toa_rad", e_tid_ushort, "LU", 2, "sceneRasterWidth", "TOA radiance"} }; static const struct RecordDescriptor MER_RR__2P_ADSR_sq_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start time of the measurement"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (set to 1 if all MDSRs corresponding to this ADSR are blank, set to zero otherwise)"}, {"perc_water_abs_aero", e_tid_uchar, "%", 1, "1", "% of water pixels having absorbing aerosols"}, {"perc_water", e_tid_uchar, "%", 1, "1", "% of water pixels"}, {"perc_ddv_land", e_tid_uchar, "%", 1, "1", "% of DDV land pixels"}, {"perc_land", e_tid_uchar, "%", 1, "1", "% of land pixels"}, {"perc_cloud", e_tid_uchar, "%", 1, "1", "% of cloud pixels"}, {"perc_low_poly_press", e_tid_uchar, "%", 1, "1", "% of pixels with low polynomial pressure"}, {"perc_low_neural_press", e_tid_uchar, "%", 1, "1", "% of pixels with low Neural Network pressure"}, {"perc_out_ran_inp_wvapour", e_tid_uchar, "%", 1, "1", "% of pixels with out of range inputs for water vapour proc."}, {"per_out_ran_outp_wvapour", e_tid_uchar, "%", 1, "1", "% of pixels with out of range outputs for water vapour proc."}, {"perc_out_range_inp_cl", e_tid_uchar, "%", 1, "1", "% of pixels with out of range inputs for Cloud proc."}, {"perc_out_ran_outp_cl", e_tid_uchar, "%", 1, "1", "% of pixels with out of range outputs for Cloud proc."}, {"perc_in_ran_inp_land", e_tid_uchar, "%", 1, "1", "% of pixels with out of range inputs for Land proc."}, {"perc_out_ran_outp_land", e_tid_uchar, "%", 1, "1", "% of pixels with out of range outputs for Land proc."}, {"perc_out_ran_inp_ocean", e_tid_uchar, "%", 1, "1", "% of pixels with out of range inputs for Ocean proc."}, {"perc_out_ran_outp_ocean", e_tid_uchar, "%", 1, "1", "% of pixels with out of range outputs for Ocean proc."}, {"perc_out_ran_inp_case1", e_tid_uchar, "%", 1, "1", "% of pixels with out of range inputs for Case 1 proc."}, {"perc_out_ran_outp_case1", e_tid_uchar, "%", 1, "1", "% of pixels with out of range outputs for Case 1 proc."}, {"perc_out_ran_inp_case2", e_tid_uchar, "%", 1, "1", "% of pixels with. out of range inputs for Case 2 proc."}, {"perc_out_ran_outp_case2", e_tid_uchar, "%", 1, "1", "% of pixels with. out of range outputs for Case 2 proc."} }; static const struct RecordDescriptor MER_RR__2P_GADS_sfgi_meris_rec_data[] = { {"sf_alt", e_tid_float, NULL, 4, "1", "scaling factor - altitude"}, {"sf_rough", e_tid_float, NULL, 4, "1", "scaling factor - roughness"}, {"sf_zon_wind", e_tid_float, NULL, 4, "1", "scaling factor - zonal wind"}, {"sf_merr_wind", e_tid_float, NULL, 4, "1", "scaling factor - meridional wind"}, {"sf_atm_pres", e_tid_float, NULL, 4, "1", "scaling factor - atmospheric pressure"}, {"sf_ozone", e_tid_float, NULL, 4, "1", "scaling factor - ozone"}, {"sf_rel_humid", e_tid_float, NULL, 4, "1", "scaling factor - relative humidity"}, {"sf_reflec", e_tid_float, NULL, 4, "13", "scaling factor - reflectances"}, {"sf_algal_pig_ind", e_tid_float, NULL, 4, "1", "scaling factor - Algal pigment index"}, {"sf_yellow_subs", e_tid_float, NULL, 4, "1", "scaling factor - Yellow substance"}, {"sf_susp_sed", e_tid_float, NULL, 4, "1", "scaling factor - Suspended sediment"}, {"sf_aero_epsilon", e_tid_float, NULL, 4, "1", "scaling factor - Aerosol epsilon"}, {"sf_aer_opt_thick", e_tid_float, NULL, 4, "1", "scaling factor - Aerosol optical thickness"}, {"sf_cl_opt_thick", e_tid_float, NULL, 4, "1", "scaling factor - Cloud optical thickness"}, {"sf_surf_pres", e_tid_float, NULL, 4, "1", "scaling factor - Surface pressure"}, {"sf_wvapour", e_tid_float, NULL, 4, "1", "scaling factor - Water vapour"}, {"sf_photosyn_rad", e_tid_float, NULL, 4, "1", "scaling factor - Photosynthetically active radiation"}, {"sf_toa_veg", e_tid_float, NULL, 4, "1", "scaling factor - TOA Vegetation index"}, {"sf_boa_veg", e_tid_float, NULL, 4, "1", "scaling factor - BOA Vegetation index"}, {"sf_cloud_albedo", e_tid_float, NULL, 4, "1", "scaling factor - Cloud Albedo"}, {"sf_cloud_top_press", e_tid_float, NULL, 4, "1", "scaling factor - Cloud Top Pressure"}, {"off_reflec", e_tid_float, NULL, 4, "13", "offset - reflectances"}, {"off_algal", e_tid_float, "log10(mg.m-3)", 4, "1", "offset - Algal pigment index"}, {"off_yellow_subs", e_tid_float, "m-1", 4, "1", "offset - Yellow substance"}, {"off_total_susp", e_tid_float, "log10(g.m-3)", 4, "1", "offset - Total suspended matter"}, {"off_aero_epsilon", e_tid_float, NULL, 4, "1", "offset - Aerosol epsilon"}, {"off_aer_opt_thick", e_tid_float, NULL, 4, "1", "offset - Aerosol optical thickness"}, {"off_cl_opt_thick", e_tid_float, NULL, 4, "1", "offset - Cloud optical thickness"}, {"off_surf_pres", e_tid_float, "hPa", 4, "1", "offset - Surface pressure"}, {"off_wvapour", e_tid_float, "g.cm-2", 4, "1", "offset - Water vapour"}, {"off_photosyn_rad", e_tid_float, "W.m-2", 4, "1", "offset - Photosynthetically active radiation"}, {"off_toa_veg", e_tid_float, NULL, 4, "1", "offset - TOA Vegetation index"}, {"off_boa_veg", e_tid_float, NULL, 4, "1", "offset - BOA Vegetation index"}, {"off_cloud_albedo", e_tid_float, NULL, 4, "1", "offset - Cloud Albedo"}, {"off_cloud_top_press", e_tid_float, "hPa", 4, "1", "offset - Cloud Top Pressure"}, {"gain_set", e_tid_uchar, NULL, 1, "5*16", "Gain setting"}, {"sampl_rate", e_tid_uint, "(10-6) s", 4, "1", "sampling rate"}, {"sun_spec_flux", e_tid_float, "LU", 4, "15", "Sun Spectral Flux (for bands 1-15)"}, {"sf_rect_refl_nir", e_tid_float, NULL, 4, "1", "scaling factor - Rectified near infrared reflectance"}, {"off_rect_refl_nir", e_tid_float, NULL, 4, "1", "offset - Rectified near infrared reflectance"}, {"sf_rect_refl_red", e_tid_float, NULL, 4, "1", "scaling factor - Rectified infrared reflectance"}, {"off_rect_refl_red", e_tid_float, NULL, 4, "1", "offset - Rectified infrared reflectance"}, {"spare_1", e_tid_spare, NULL, 1, "44", "spare"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_14_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"wvapour_content_pix", e_tid_uchar, "g.cm-2", 1, "sceneRasterWidth", "Water vapour content pixels"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_15_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"algal_toavi_cl_pix", e_tid_uchar, "mg.m-3, or -, or hPa", 1, "sceneRasterWidth", "Algal I or TOAVI or cloud top pressure pixels"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_16_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"ys_tsm_pix", e_tid_uchar, NULL, 1, "2*sceneRasterWidth", "Yellow Substance, Total Suspended Matter or Rectified Reflectances pixels, interleaved by pixel"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_17_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"algal2_boavi_pix", e_tid_uchar, "mg.m-3 or -", 1, "sceneRasterWidth", "Algal II or BOAVI pixels"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_18_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"par_sp_cl_albe_pix", e_tid_uchar, "W.m-2 or -", 1, "sceneRasterWidth", "PAR or surface pressure or cloud albedo pixels"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_19_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"aer_cl_opt_pix", e_tid_uchar, NULL, 1, "2*sceneRasterWidth", "Aerosol Angstrom exponent or cloud type and optical thickness pixels, interleaved by pixel"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_19_IODD6_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"air_cl_opt_pix", e_tid_uchar, NULL, 1, "2*sceneRasterWidth", "Aerosol epsilon or cloud type and optical thickness pixels, interleaved by pixel"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_1_13_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of the measurement"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"norm_surf_reflec_pix", e_tid_ushort, NULL, 2, "sceneRasterWidth", "Normalised surface reflectance pixels"} }; static const struct RecordDescriptor MER_RR__2P_MDSR_20_meris_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Start Time of DSR"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"pixel_info", e_tid_uchar, "counts", 1, "3*sceneRasterWidth", "Flags associated with pixels"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_lr_large_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"pix_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, nadir view"}, {"pix_ls_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over land surface, nadir view"}, {"perc_cl_pix_ls_nad", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over land surface, nadir view"}, {"lat_corr_nad", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic latitude correction, nadir view"}, {"long_corr_nad", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic longitude correction, nadir view"}, {"sa_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (nadir view)"}, {"sd_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (nadir view)"}, {"sd_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (nadir view)"}, {"sd_37bt_clr_nad", e_tid_int, "%/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_16toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_87toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_67toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_55toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_12bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (nadir view)"}, {"sd_12bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (nadir view)"}, {"sd_11bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (nadir view)"}, {"sd_37bt_cl_nad", e_tid_int, "%/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_16toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_87toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_67toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_55toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"fail_flag_nad", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, nadir view"}, {"pix_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, forward view"}, {"pix_ls_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over land surface, forward view"}, {"perc_cl_pix_ls_for", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over land surface, forward view"}, {"lat_corr_for", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic latitude correction, forward view"}, {"long_corr_for", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic longitude correction, forward view"}, {"sa_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (forward view)"}, {"sd_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (forward view)"}, {"sd_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (forward view)"}, {"sd_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_16toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_87toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_67toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_55toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_12bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (forward view)"}, {"sd_12bt_cl_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (forward view)"}, {"sd_11bt_cl_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (forward view)"}, {"sd_37bt_cl_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_16toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_87toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_67toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_55toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"fail_flag_for", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, forward view"}, {"pix_nsig_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels (N-Sigma), nadir view"}, {"pix_ss", e_tid_short, "%/100", 2, "1", "Percentage filled pixels over land surface"}, {"low_11bt_cl_nad", e_tid_short, "K/100", 2, "1", "Lowest 11 micron BT of all cloudy pixels, nadir view"}, {"corr_12bt_nad", e_tid_short, "K/100", 2, "1", "Corresponding 12 micron BT, nadir view"}, {"corr_37bt_nad", e_tid_short, "K/100", 2, "1", "Corresponding 3.7 micron BT, nadir view"}, {"corr_16ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 1.6 micron reflectance, nadir view"}, {"corr_87ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 0.87 micron reflectance, nadir view"}, {"corr_67ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 0.67 micron reflectance, nadir view"}, {"corr_55ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 0.55 micron reflectance, nadir view"}, {"low_11bt_cl_for", e_tid_short, "K/100", 2, "1", "Lowest 11 micron BT of all cloudy pixels, forward view"}, {"corr_12bt_for", e_tid_short, "K/100", 2, "1", "Corresponding 12 micron BT, forward view"}, {"corr_37bt_for", e_tid_short, "K/100", 2, "1", "Corresponding 3.7 micron BT, forward view"}, {"corr_16ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 1.6 micron reflectance, forward view"}, {"corr_87ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 0.87 micron reflectance, forward view"}, {"corr_67ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 0.67 micron reflectance, forward view"}, {"corr_55ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 0.55 micron reflectance, forward view"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_lr_small_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"pix_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, nadir view"}, {"pix_ls_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over land surface, nadir view"}, {"perc_cl_pix_ls_nad", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over land surface, nadir view"}, {"lat_corr_nad", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic latitude correction, nadir view"}, {"long_corr_nad", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic longitude correction, nadir view"}, {"sa_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (nadir view)"}, {"sa_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (nadir view)"}, {"sa_37bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (nadir view)"}, {"sa_16toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_87toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_67toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_55toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_12bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (nadir view)"}, {"sa_11bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (nadir view)"}, {"sa_37bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (nadir view)"}, {"sa_16toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sa_87toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sa_67toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sa_55toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"fail_flag_nad", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, nadir view"}, {"pix_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, forward view"}, {"pix_ss_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over land surface, forward view"}, {"perc_cl_pix_ss_for", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over land surface, forward view"}, {"lat_corr_for", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic latitude correction, forward view"}, {"long_corr_for", e_tid_int, "(1e-6) degrees", 4, "1", "Topographic longitude correction, forward view"}, {"sa_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (forward view)"}, {"sa_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (forward view)"}, {"sa_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (forward view)"}, {"sa_16toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_87toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_67toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_55toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_12bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (forward view)"}, {"sa_11bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (forward view)"}, {"sa_37bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (forward view)"}, {"sa_16toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sa_87toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sa_67toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sa_55toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (forward view)"}, {"fail_flag_for", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, forward view"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_lst_large_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"m_lst", e_tid_short, "K/100", 2, "1", "mean land surface temperature (ST)"}, {"sd_lst", e_tid_short, "K/100", 2, "1", "standard deviation of land ST"}, {"pix_lst", e_tid_ushort, NULL, 2, "1", "Number of pixels in land surface temperature average"}, {"m_ndvi", e_tid_short, NULL, 2, "1", "mean NDVI"}, {"sd_ndvi", e_tid_short, NULL, 2, "1", "standard deviation of NDVI"}, {"pix_ndvi", e_tid_ushort, NULL, 2, "1", "Number of pixels in NDVI average"}, {"ast_conf_flags", e_tid_ushort, "flags", 2, "2", "AST confidence word"}, {"cl_top_temp_nad", e_tid_short, "K/100", 2, "1", "Cloud-top temperature, nadir view"}, {"perc_cl_cov_nad", e_tid_short, "%/100", 2, "1", "Percentage cloud-cover, nadir view"}, {"cl_top_temp_for", e_tid_short, "K/100", 2, "1", "Cloud-top temperature, forward view"}, {"perc_cl_cov_for", e_tid_short, "%/100", 2, "1", "Percentage cloud-cover, forward view"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_lst_small_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"m_lst", e_tid_short, "K/100", 2, "1", "mean land ST in cells"}, {"pix_lst", e_tid_ushort, NULL, 2, "1", "Number of pixels in land surface temperature average"}, {"m_ndvi", e_tid_short, NULL, 2, "1", "mean NDVI"}, {"pix_ndvi", e_tid_ushort, NULL, 2, "1", "Number of pixels in NDVI average"}, {"ast_conf_flags", e_tid_ushort, "flags", 2, "2", "AST confidence word"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_sr_large_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"pix_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, nadir view"}, {"pix_ss_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over sea surface, nadir view"}, {"clpix_ss_nad", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over sea surface, nadir view"}, {"sa_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (nadir view)"}, {"sd_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (nadir view)"}, {"sd_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (nadir view)"}, {"sd_37bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_16toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_87toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_67toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (nadir view)"}, {"sd_55toa_clr_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_12bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (nadir view)"}, {"sd_12bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (nadir view)"}, {"sd_11bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (nadir view)"}, {"sd_37bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_16toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_87toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_67toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sd_55toa_cl_nad", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"fail_flag_nad", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, nadir view"}, {"pix_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, forward view"}, {"pix_ss_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over sea surface, forward view"}, {"perc_cl_pix_ss_for", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over sea surface, forward view"}, {"sa_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (forward view)"}, {"sd_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (forward view)"}, {"sd_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (forward view)"}, {"sd_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_16toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_87toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_67toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (forward view)"}, {"sd_55toa_clr_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_12bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (forward view)"}, {"sd_12bt_cl_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_11bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (forward view)"}, {"sd_11bt_cl_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_37bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (forward view)"}, {"sd_37bt_cl_for", e_tid_int, "K/1000", 4, "1", "Standard deviation of above"}, {"sa_16toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_16toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_87toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_87toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_67toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_67toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"sa_55toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sd_55toa_cl_for", e_tid_short, "%/100", 2, "1", "Standard deviation of above"}, {"fail_flag_for", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, foward view"}, {"pix_nsig_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels (N-Sigma), nadir view"}, {"pix_ss", e_tid_short, "%/100", 2, "1", "Percentage filled pixels over sea surface"}, {"low_11bt_cl_nad", e_tid_short, "K/100", 2, "1", "Lowest 11 micron BT of all cloudy pixels, nadir view"}, {"corr_12bt_nad", e_tid_short, "K/100", 2, "1", "Corresponding 12 micron BT, nadir view"}, {"corr_37bt_nad", e_tid_short, "K/100", 2, "1", "Corresponding 3.7 micron BT, nadir view"}, {"corr_16ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 1.6 micron reflectance, nadir view"}, {"corr_87ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 0.87 micron reflectance, nadir view"}, {"corr_67ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 0.67 micron reflectance, nadir view"}, {"corr_55ref_nad", e_tid_short, "%/100", 2, "1", "Corresponding 0.55 micron reflectance, nadir view"}, {"low_11bt_cl_for", e_tid_short, "K/100", 2, "1", "Lowest 11 micron BT of all cloudy pixels, forward view"}, {"corr_12bt_for", e_tid_short, "K/100", 2, "1", "Corresponding 12 micron BT, forward view"}, {"corr_37bt_for", e_tid_short, "K/100", 2, "1", "Corresponding 3.7 micron BT, forward view"}, {"corr_16ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 1.6 micron reflectance, forward view"}, {"corr_87ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 0.87 micron reflectance, forward view"}, {"corr_67ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 0.67 micron reflectance, forward view"}, {"corr_55ref_for", e_tid_short, "%/100", 2, "1", "Corresponding 0.55 micron reflectance, forward view"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_sr_small_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"pix_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, nadir view"}, {"pix_ss_nad", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over sea surface, nadir view"}, {"clpix_ss_nad", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over sea surface, nadir view"}, {"sa_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (nadir view)"}, {"sa_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (nadir view)"}, {"sa_37bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (nadir view)"}, {"sa_16toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_87toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_67toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_55toa_clr_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (nadir view)"}, {"sa_12bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (nadir view)"}, {"sa_11bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (nadir view)"}, {"sa_37bt_cl_nad", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (nadir view)"}, {"sa_16toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sa_87toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sa_67toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"sa_55toa_cl_nad", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (nadir view)"}, {"fail_flag_nad", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, nadir view"}, {"pix_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell, forward view"}, {"pix_ss_for", e_tid_short, NULL, 2, "1", "Number of filled pixels in cell over sea surface, forward view"}, {"perc_cl_pix_ss_for", e_tid_short, NULL, 2, "1", "Percentage of cloudy pixels in cell over sea surface, forward view"}, {"sa_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all clear pixels (forward view)"}, {"sa_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all clear pixels (forward view)"}, {"sa_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all clear pixels (forward view)"}, {"sa_16toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_87toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_67toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_55toa_clr_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all clear pixels (forward view)"}, {"sa_12bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 12 micron BT of all cloudy pixels (forward view)"}, {"sa_11bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 11 micron BT of all cloudy pixels (forward view)"}, {"sa_37bt_cl_for", e_tid_int, "K/1000", 4, "1", "Spatially averaged 3.7 micron BT of all cloudy pixels (forward view)"}, {"sa_16toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 1.6 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sa_87toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.87 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sa_67toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.67 micron TOA reflectance of all cloudy pixels (forward view)"}, {"sa_55toa_cl_for", e_tid_short, "%/100", 2, "1", "Spatially averaged 0.55 micron TOA reflectance of all cloudy pixels (forward view)"}, {"fail_flag_for", e_tid_ushort, NULL, 2, "1", "Pixel threshold failure flags for averages, foward view"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_sst_large_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"m_nad", e_tid_short, "K/100", 2, "1", "mean nadir-only SST"}, {"sd_nad", e_tid_short, "K/100", 2, "1", "standard deviation of nadir-only SST"}, {"pix_nad", e_tid_ushort, NULL, 2, "1", "Number of pixels in nadir-only average"}, {"m_dual_vw", e_tid_short, "K/100", 2, "1", "mean dual-view SST"}, {"sd_dual_vw", e_tid_short, "K/100", 2, "1", "standard deviation of dual-view SST"}, {"pix_dual_vw", e_tid_ushort, NULL, 2, "1", "Number of pixels in dual view average"}, {"ast_conf_flags", e_tid_ushort, "flags", 2, "2", "AST confidence word"}, {"cl_top_temp_nad", e_tid_short, "K/100", 2, "1", "Cloud-top temperature, nadir view"}, {"perc_cl_cov_nad", e_tid_short, "%/100", 2, "1", "Percentage cloud-cover, nadir view"}, {"cl_top_temp_for", e_tid_short, "K/100", 2, "1", "Cloud-top temperature, forward view"}, {"perc_cl_cov_for", e_tid_short, "%/100", 2, "1", "Percentage cloud-cover, forward view"} }; static const struct RecordDescriptor ATS_AR__2P_MDSR_sst_small_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of cell"}, {"m_actrk_pix_num", e_tid_short, NULL, 2, "1", "Mean across-track pixel number"}, {"m_nad", e_tid_short, "K/100", 2, "1", "mean nadir-only SST"}, {"pix_nad", e_tid_ushort, NULL, 2, "1", "Number of pixels in nadir-only average"}, {"m_dual_vw", e_tid_short, "K/100", 2, "1", "mean dual-view SST"}, {"pix_dual_vw", e_tid_ushort, NULL, 2, "1", "Number of pixels in dual-view average"}, {"ast_conf_flags", e_tid_ushort, "flags", 2, "2", "AST confidence word"} }; static const struct RecordDescriptor ATS_MET_2P_meteo_user_prod_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"rec_qua_ind", e_tid_char, NULL, 1, "1", "Record Quality indicator"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"lat", e_tid_int, "(1e-6) degrees", 4, "1", "Latitude of 10 arcmin cell"}, {"lon", e_tid_int, "(1e-6) degrees", 4, "1", "Longitude of 10 arcmin cell"}, {"sa_12bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Nadir spatially averaged 12 micron BT of all clear pixels 10 arcmin cells"}, {"sa_11bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Nadir spatially averaged 11 micron BT of all clear pixels in 10 arcmin cells"}, {"sa_37bt_clr_nad", e_tid_int, "K/1000", 4, "1", "Nadir spatially averaged 3.7 micron BT of all clear pixels in 10 arcmin cells"}, {"sa_12bt_clr_for", e_tid_int, "K/1000", 4, "1", "Forward spatially averaged 12 micron BT of all clear pixels in 10 arcmin cells"}, {"sa_11bt_clr_for", e_tid_int, "K/1000", 4, "1", "Forward spatially averaged 11 micron BT of all clear pixels in 10 arcmin cells"}, {"sa_37bt_clr_for", e_tid_int, "K/1000", 4, "1", "Forward spatially averaged 3.7 micron BT of all clear pixels in 10 arcmin cells"}, {"m_actrk_pix_num", e_tid_short, "none", 2, "1", "Mean across-track pixel number"}, {"m_nad", e_tid_short, "K/100", 2, "1", "Mean nadir-only SST 10 arcmin cells"}, {"pix_nad", e_tid_ushort, "none", 2, "1", "Number of pixels in nadir-only average, 10 arcmin cells"}, {"m_dual_vw", e_tid_short, "K/100", 2, "1", "Mean dual-view SST in 10 arcmin cells"}, {"pix_dual_vw", e_tid_ushort, "none", 2, "1", "Number of pixels in dual-view average, 10 arcmin cells"}, {"ast_conf_flags", e_tid_ushort, "flags", 2, "2", "AST confidence word"} }; static const struct RecordDescriptor ATS_NR__2P_ADSR_sq_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment flag(set to 1 if all MDSRs corresponding to this ADSR are blank, set to 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"scan_num", e_tid_ushort, NULL, 2, "1", "image scan number"}, {"pv_nad_null_pac", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans null packet"}, {"pv_nad_fail_val", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans failing basic validation"}, {"pv_nad_fail_crc_chk", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans failing CRC check"}, {"pv_nad_show_buf_full", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans showing buffers full"}, {"pv_nad_scan_jitt", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans showing scan jitter"}, {"per_cloud_pix", e_tid_short, "0.01 %", 2, "1", "percentage of cloudy pixels"}, {"per_ndvi_inv", e_tid_short, "0.01 %", 2, "1", "percentage of NDVI invalid"}, {"per_sst_for_inv", e_tid_short, "0.01 %", 2, "1", "percentage of SST (nadir view) invalid"}, {"per_sst_dual_inv", e_tid_short, "0.01 %", 2, "1", "percentage of SST (dual view) invalid"}, {"pv_nad_scan_error", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans - all other errors"}, {"pv_for_null_pac", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans null packet"}, {"pv_for_fail_val", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans failing basic validation"}, {"pv_for_fail_crc_chk", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans failing CRC check"}, {"pv_for_show_buf_full", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans showing buffers full"}, {"pv_for_scan_jitt", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans showing scan jitter"}, {"resv_char_5", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_6", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_7", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_8", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"pv_for_scan_error", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans - all other errors"}, {"spare_2", e_tid_spare, NULL, 28, "1", "Spare"} }; static const struct RecordDescriptor ATS_NR__2P_MDSR_dp_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"conf_wd_flags", e_tid_ushort, "flags", 2, "512", "confidence words (Defined in Table 7.5.1.7.8 3)"}, {"nad_field", e_tid_short, "K/100", 2, "512", "nadir field (Note 1)"}, {"comb_field", e_tid_short, "See Note 1", 2, "512", "combined field (Note 1)"} }; static const struct RecordDescriptor ATS_TOA_1P_ADSR_loc_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (set to 1 if all MDSRs corresponding to this ADSR are blank, set to 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"tie_pt_lat", e_tid_int, "(1e-6) degrees", 4, "23", "tie point latitudes"}, {"tie_pt_long", e_tid_int, "(1e-6) degrees", 4, "23", "tie point longitudes"}, {"lat_corr_nadv", e_tid_int, "(1e-6) degrees", 4, "23", "latitude corrections, nadir view"}, {"long_corr_nadv", e_tid_int, "(1e-6) degrees", 4, "23", "longitude corrections, nadir view"}, {"lat_corr_forv", e_tid_int, "(1e-6) degrees", 4, "23", "latitude corrections, forward view"}, {"long_corr_forv", e_tid_int, "(1e-6) degrees", 4, "23", "longitude corrections, forward view"}, {"topo_alt", e_tid_short, "metres", 2, "23", "Topographic Altitude"}, {"spare_2", e_tid_spare, NULL, 8, "1", "Spare"} }; static const struct RecordDescriptor ATS_TOA_1P_ADSR_pix_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment flag (always set to zero for this ADS)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"instr_scan_num", e_tid_ushort, NULL, 2, "512", "instrument scan number"}, {"pix_num", e_tid_ushort, NULL, 2, "512", "pixel number"} }; static const struct RecordDescriptor ATS_TOA_1P_ADSR_sa_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADS)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"tie_pt_sol_elev", e_tid_int, "mdeg", 4, "11", "tie point solar elevation"}, {"tie_pt_sat_elev_nad", e_tid_int, "mdeg", 4, "11", "tie point satellite elevation nadir"}, {"tie_pt_sol_az", e_tid_int, "mdeg", 4, "11", "tie point solar azimuth"}, {"tie_pt_sat_azi", e_tid_int, "mdeg", 4, "11", "tie point satellite azimuth"}, {"spare_2", e_tid_spare, NULL, 20, "1", "Spare"} }; static const struct RecordDescriptor ATS_TOA_1P_ADSR_scan_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Scan UTC time in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADS)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"instr_scan_num", e_tid_ushort, NULL, 2, "1", "instrument scan number"}, {"tie_pix_x", e_tid_int, "m", 4, "99", "tie pixel x coordinate"}, {"tie_pix_y", e_tid_int, "m", 4, "99", "tie pixel y coordinate"}, {"spare_2", e_tid_spare, NULL, 20, "1", "spare"} }; static const struct RecordDescriptor ATS_TOA_1P_ADSR_sq_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment flag(set to 1 if all MDSRs corresponding to this ADSR are blank, set to 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"scan_num", e_tid_ushort, NULL, 2, "1", "scan number"}, {"pv_nad_null_pac", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans null packet"}, {"pv_nad_fail_val", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans failing basic validation"}, {"pv_nad_fail_crc_chk", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans failing CRC check"}, {"pv_nad_show_buf_full", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans showing buffers full"}, {"pv_nad_scan_jitt", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans showing scan jitter"}, {"resv_char_1", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_2", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_3", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_4", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"pv_nad_scan_error", e_tid_short, NULL, 2, "1", "Packet Validation during nadir view number of scans - all other errors"}, {"pv_for_null_pac", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans null packet"}, {"pv_for_fail_val", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans failing basic validation"}, {"pv_for_fail_crc_chk", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans failing CRC check"}, {"pv_for_show_buf_full", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans showing buffers full"}, {"pv_for_scan_jitt", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans showing scan jitter"}, {"resv_char_5", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_6", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_7", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"resv_char_8", e_tid_short, NULL, 2, "1", "reserved for future use"}, {"pv_for_scan_error", e_tid_short, NULL, 2, "1", "Packet Validation during forward view number of scans - all other errors"}, {"spare_2", e_tid_spare, NULL, 28, "1", "Spare"} }; static const struct RecordDescriptor ATS_TOA_1P_MDSR_brgt_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"bt_rad_pix", e_tid_short, "K/100%/100", 2, "512", "BT or refectance for pixel 0 - 511(Units are K/100 for BT, %/100 for reflectance. Small negative values may be used to represent channel-specific exceptional values)."} }; static const struct RecordDescriptor ATS_TOA_1P_MDSR_cl_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"cl_land_flags", e_tid_ushort, "flags", 2, "512", "cloud/land flags"} }; static const struct RecordDescriptor ATS_TOA_1P_MDSR_conf_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Nadir UTC time in MJD format"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"img_scan_y", e_tid_int, "m", 4, "1", "image scan y coordinate"}, {"conf_wd_flags", e_tid_ushort, "flags", 2, "512", "Confidence words"} }; static const struct RecordDescriptor ATS_VC1_AX_GADS_aatsr_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Time of cal in MJD format"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment flag (always set to zero for this flag)"}, {"spare_1", e_tid_spare, NULL, 3, "1", "Spare"}, {"slp_16_mic", e_tid_float, NULL, 4, "1", "1.6 micron slope"}, {"slp_087_mic", e_tid_float, NULL, 4, "1", "0.870 micron slope"}, {"slp_067_mic", e_tid_float, NULL, 4, "1", "0.670 micron slope"}, {"slp_055_mic", e_tid_float, NULL, 4, "1", "0.555 micron slope"}, {"asc_time", e_tid_time, "MJD", 12, "1", "UTC at ascending node crossing, in MJD format"}, {"ave_mon_cnt", e_tid_float, NULL, 4, "1", "Average Monitor count"}, {"sd_mon_cnt", e_tid_float, NULL, 4, "1", "Standard deviation of Monitor count"}, {"sol_irr_16", e_tid_float, NULL, 4, "1", "Solar irradiance (1.6 micron)"}, {"sol_irr_087", e_tid_float, NULL, 4, "1", "Solar irradiance (0.870 micron)"}, {"sol_irr_067", e_tid_float, NULL, 4, "1", "Solar irradiance (0.670 micron)"}, {"sol_irr_055", e_tid_float, NULL, 4, "1", "Solar irradiance (0.555 micron)"}, {"ave_vispix_16", e_tid_float, NULL, 4, "1", "Average VISCAL Pixel Counts (1.6 (m)"}, {"ave_vispix_087", e_tid_float, NULL, 4, "1", "Average VISCAL Pixel Counts (0.87 (m)"}, {"ave_vispix_067", e_tid_float, NULL, 4, "1", "Average VISCAL Pixel Counts (0.67 (m)"}, {"ave_vispix_055", e_tid_float, NULL, 4, "1", "Average VISCAL Pixel Counts (0.55 (m)"}, {"vis_pixnois_16", e_tid_float, NULL, 4, "1", "VISCAL Pixel Noise (1.6 micron)"}, {"vis_pixnois_087", e_tid_float, NULL, 4, "1", "VISCAL Pixel Noise (0.87 micron)"}, {"vis_pixnois_067", e_tid_float, NULL, 4, "1", "VISCAL Pixel Noise (0.67 micron)"}, {"vis_pixnois_055", e_tid_float, NULL, 4, "1", "VISCAL Pixel Noise (0.55 micron)"}, {"ave_xbb_16", e_tid_float, NULL, 4, "1", "Average -X BB Pixel Counts (1.6 (m)"}, {"ave_xbb_cnt_087", e_tid_float, NULL, 4, "1", "Average -X BB Pixel Counts (0.87 (m)"}, {"ave_xbb_cnt_067", e_tid_float, NULL, 4, "1", "Average -X BB Pixel Counts (0.67 (m)"}, {"ave_xbb_cnt_055", e_tid_float, NULL, 4, "1", "Average -X BB Pixel Counts (0.55 (m)"}, {"xbb_nois_16", e_tid_float, NULL, 4, "1", "-X BB Pixel Noise (1.6 micron)"}, {"xbb_nois_087", e_tid_float, NULL, 4, "1", "-X BB Pixel Noise (0.87 micron)"}, {"xbb_nois_067", e_tid_float, NULL, 4, "1", "-X BB Pixel Noise (0.67 micron)"}, {"xbb_nois_055", e_tid_float, NULL, 4, "1", "-X BB Pixel Noise (0.55 micron)"}, {"parity_char", e_tid_short, NULL, 2, "1", "(Reserved for parity indicator)"}, {"spare_2", e_tid_spare, NULL, 20, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Antenna_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler azimuth time at which pattern applies"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADSR)"}, {"beam_id", e_tid_string, "ascii", 3, "1", "Beam ID to which pattern applies SS1 to SS5 or NSØ"}, {"elevation_pattern.slant_range_time", e_tid_float, "ns", 4, "11", "2 way slant range times"}, {"elevation_pattern.elevation_angles", e_tid_float, "degrees", 4, "11", "Corresponding elevation angles"}, {"elevation_pattern.antenna_pattern", e_tid_float, "dB", 4, "11", "Corresponding two-way antenna elevation pattern values"}, {"spare_1", e_tid_spare, NULL, 14, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Chirp_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler azimuth time in azimuth at which estimate applies"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADSR)"}, {"beam_id", e_tid_string, "ascii", 3, "1", "Beam ID: SS1, SS2, SS3, SS4, or SS5 for WS and GM images. Set to NSØ for AP, IM, and WV images."}, {"polar", e_tid_string, "ascii", 3, "1", "Tx/Rx polarization H/H, H/V, V/V, or V/H"}, {"chirp_width", e_tid_float, "samples", 4, "1", "3-dB pulse width of chirp replica cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_sidelobe", e_tid_float, "dB", 4, "1", "First side lobe level of chirp replica cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_islr", e_tid_float, "dB", 4, "1", "ISLR of chirp replica cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_peak_loc", e_tid_float, "samples", 4, "1", "Peak location of cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_power", e_tid_float, "dB", 4, "1", "Chirp power"}, {"elev_corr_factor", e_tid_float, NULL, 4, "1", "Elevation gain correction scaling factor applied to range compressed samples"}, {"spare_1", e_tid_spare, NULL, 16, "1", "Spare"}, {"cal_pulse_info.1.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 1)"}, {"cal_pulse_info.1.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 1)"}, {"cal_pulse_info.1.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 1)"}, {"cal_pulse_info.1.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 1)"}, {"cal_pulse_info.2.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 2)"}, {"cal_pulse_info.2.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 2)"}, {"cal_pulse_info.2.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 2)"}, {"cal_pulse_info.2.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 2)"}, {"cal_pulse_info.3.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 3)"}, {"cal_pulse_info.3.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 3)"}, {"cal_pulse_info.3.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 3)"}, {"cal_pulse_info.3.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 3)"}, {"cal_pulse_info.4.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 4)"}, {"cal_pulse_info.4.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 4)"}, {"cal_pulse_info.4.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 4)"}, {"cal_pulse_info.4.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 4)"}, {"cal_pulse_info.5.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 5)"}, {"cal_pulse_info.5.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 5)"}, {"cal_pulse_info.5.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 5)"}, {"cal_pulse_info.5.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 5)"}, {"cal_pulse_info.6.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 6)"}, {"cal_pulse_info.6.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 6)"}, {"cal_pulse_info.6.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 6)"}, {"cal_pulse_info.6.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 6)"}, {"cal_pulse_info.7.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 7)"}, {"cal_pulse_info.7.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 7)"}, {"cal_pulse_info.7.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 7)"}, {"cal_pulse_info.7.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 7)"}, {"cal_pulse_info.8.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 8)"}, {"cal_pulse_info.8.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 8)"}, {"cal_pulse_info.8.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 8)"}, {"cal_pulse_info.8.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 8)"}, {"cal_pulse_info.9.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 9)"}, {"cal_pulse_info.9.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 9)"}, {"cal_pulse_info.9.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 9)"}, {"cal_pulse_info.9.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 9)"}, {"cal_pulse_info.10.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 10)"}, {"cal_pulse_info.10.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 10)"}, {"cal_pulse_info.10.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 10)"}, {"cal_pulse_info.10.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 10)"}, {"cal_pulse_info.11.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 11)"}, {"cal_pulse_info.11.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 11)"}, {"cal_pulse_info.11.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 11)"}, {"cal_pulse_info.11.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 11)"}, {"cal_pulse_info.12.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 12)"}, {"cal_pulse_info.12.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 12)"}, {"cal_pulse_info.12.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 12)"}, {"cal_pulse_info.12.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 12)"}, {"cal_pulse_info.13.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 13)"}, {"cal_pulse_info.13.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 13)"}, {"cal_pulse_info.13.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 13)"}, {"cal_pulse_info.13.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 13)"}, {"cal_pulse_info.14.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 14)"}, {"cal_pulse_info.14.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 14)"}, {"cal_pulse_info.14.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 14)"}, {"cal_pulse_info.14.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 14)"}, {"cal_pulse_info.15.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 15)"}, {"cal_pulse_info.15.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 15)"}, {"cal_pulse_info.15.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 15)"}, {"cal_pulse_info.15.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 15)"}, {"cal_pulse_info.16.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 16)"}, {"cal_pulse_info.16.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 16)"}, {"cal_pulse_info.16.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 16)"}, {"cal_pulse_info.16.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 16)"}, {"cal_pulse_info.17.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 17)"}, {"cal_pulse_info.17.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 17)"}, {"cal_pulse_info.17.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 17)"}, {"cal_pulse_info.17.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 17)"}, {"cal_pulse_info.18.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 18)"}, {"cal_pulse_info.18.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 18)"}, {"cal_pulse_info.18.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 18)"}, {"cal_pulse_info.18.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 18)"}, {"cal_pulse_info.19.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 19)"}, {"cal_pulse_info.19.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 19)"}, {"cal_pulse_info.19.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 19)"}, {"cal_pulse_info.19.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 19)"}, {"cal_pulse_info.20.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 20)"}, {"cal_pulse_info.20.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 20)"}, {"cal_pulse_info.20.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 20)"}, {"cal_pulse_info.20.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 20)"}, {"cal_pulse_info.21.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 21)"}, {"cal_pulse_info.21.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 21)"}, {"cal_pulse_info.21.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 21)"}, {"cal_pulse_info.21.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 21)"}, {"cal_pulse_info.22.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 22)"}, {"cal_pulse_info.22.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 22)"}, {"cal_pulse_info.22.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 22)"}, {"cal_pulse_info.22.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 22)"}, {"cal_pulse_info.23.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 23)"}, {"cal_pulse_info.23.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 23)"}, {"cal_pulse_info.23.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 23)"}, {"cal_pulse_info.23.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 23)"}, {"cal_pulse_info.24.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 24)"}, {"cal_pulse_info.24.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 24)"}, {"cal_pulse_info.24.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 24)"}, {"cal_pulse_info.24.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 24)"}, {"cal_pulse_info.25.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 25)"}, {"cal_pulse_info.25.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 25)"}, {"cal_pulse_info.25.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 25)"}, {"cal_pulse_info.25.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 25)"}, {"cal_pulse_info.26.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 26)"}, {"cal_pulse_info.26.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 26)"}, {"cal_pulse_info.26.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 26)"}, {"cal_pulse_info.26.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 26)"}, {"cal_pulse_info.27.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 27)"}, {"cal_pulse_info.27.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 27)"}, {"cal_pulse_info.27.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 27)"}, {"cal_pulse_info.27.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 27)"}, {"cal_pulse_info.28.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 28)"}, {"cal_pulse_info.28.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 28)"}, {"cal_pulse_info.28.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 28)"}, {"cal_pulse_info.28.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 28)"}, {"cal_pulse_info.29.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 29)"}, {"cal_pulse_info.29.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 29)"}, {"cal_pulse_info.29.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 29)"}, {"cal_pulse_info.29.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 29)"}, {"cal_pulse_info.30.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 30)"}, {"cal_pulse_info.30.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 30)"}, {"cal_pulse_info.30.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 30)"}, {"cal_pulse_info.30.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 30)"}, {"cal_pulse_info.31.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 31)"}, {"cal_pulse_info.31.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 31)"}, {"cal_pulse_info.31.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 31)"}, {"cal_pulse_info.31.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 31)"}, {"cal_pulse_info.32.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 32)"}, {"cal_pulse_info.32.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 32)"}, {"cal_pulse_info.32.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 32)"}, {"cal_pulse_info.32.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 32)"}, {"spare_2", e_tid_spare, NULL, 16, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Dop_Cen_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler azimuth time at which estimate applies"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADSR)"}, {"slant_range_time", e_tid_float, "ns", 4, "1", "2-way slant range time origin (t0)"}, {"dop_coef", e_tid_float, "HzHz/sHz/s2Hz/s3Hz/s4", 4, "5", "Doppler centroid coefficients as a function of slant range time: D0, D1, D2, D3, and D4. where Doppler Centroid = D0 + D1(tSR-t0) + D2(tSR-t0)2 + D3(tSR-t0)3 + D4(tSR-t0)4"}, {"dop_conf", e_tid_float, NULL, 4, "1", "Doppler Centroid Confidence Measure. Value between 0 and 1, 0 = poorest confidence, 1= highest confidence. If multiple Doppler Centroid estimates were performed, this value is the lowest confidence value attained."}, {"dop_thresh_flag", e_tid_uchar, "flag", 1, "1", "Doppler Confidence Below Threshold Flag. 0 = confidence above threshold, Doppler Centroid calculated from data. 1 = confidence below threshold, Doppler Centroid calculated from orbit."}, {"spare_1", e_tid_spare, NULL, 13, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Geo_Grid_ADSR_asar_rec_data[] = { {"first_zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time in azimuth of first line of the granule. Gives azimuth location of grid line for first line of the granule."}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (set to 1 if all MDSRs corresponding to this ADSR are blank, set to zero otherwise)."}, {"line_num", e_tid_uint, NULL, 4, "1", "Range line number corresponding to the first line of the granule"}, {"num_lines", e_tid_uint, "lines", 4, "1", "Number of output lines in this granule"}, {"sub_sat_track", e_tid_float, "deg.", 4, "1", "Subsatellite track heading (relative to North) for first line of granule. This is the heading on the ground (includes Earth rotation)."}, {"first_line_tie_points.samp_numbers", e_tid_uint, NULL, 4, "11", "Range sample number. Gives the range location of the grid points. First range sample is 1, last is M. Zero filled samples are included."}, {"first_line_tie_points.slant_range_times", e_tid_float, "ns", 4, "11", "2 way slant range time to range sample"}, {"first_line_tie_points.angles", e_tid_float, "deg.", 4, "11", "Incidence Angle at range sample"}, {"first_line_tie_points.lats", e_tid_int, "(1e-6) degrees", 4, "11", "geodetic latitude (positive north)"}, {"first_line_tie_points.longs", e_tid_int, "(1e-6) degrees", 4, "11", "geodetic longitude (positive east)"}, {"spare_1", e_tid_spare, NULL, 22, "1", "Spare"}, {"last_zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero doppler time for the last line of the granule"}, {"last_line_tie_points.samp_numbers", e_tid_uint, NULL, 4, "11", "Range sample number. Gives the range location of the grid points. First range sample is 1, last is M."}, {"last_line_tie_points.slant_range_times", e_tid_float, "ns", 4, "11", "2 way slant range time to range sample"}, {"last_line_tie_points.angles", e_tid_float, "deg.", 4, "11", "Incidence Angle at range sample"}, {"last_line_tie_points.lats", e_tid_int, "(1e-6) degrees", 4, "11", "geodetic latitude (positive north)"}, {"last_line_tie_points.longs", e_tid_int, "(1e-6) degrees", 4, "11", "geodetic longitude (positive east)"}, {"spare_2", e_tid_spare, NULL, 22, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Image_MDSR_BP_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time (MJD format)"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"line_num", e_tid_uint, NULL, 4, "1", "Range line number. Numbered sequentially, for each product (or slice) first range line in MDS is 1"}, {"proc_data", e_tid_uchar, NULL, 1, "sceneRasterWidth", "SAR Processed Data for Browse Products (detected data)"} }; static const struct RecordDescriptor ASAR_Image_MDSR_Gen_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time (MJD format)"}, {"quality_flag", e_tid_char, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"line_num", e_tid_uint, NULL, 4, "1", "Range line number. Numbered sequentially, for each product (or slice) first range line in MDS is 1"}, {"proc_data", e_tid_ushort, NULL, 2, "sceneRasterWidth", "SAR Processed Data. Real samples (detected products)"} }; static const struct RecordDescriptor ASAR_Image_MDSR_SLC_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time (MJD format)"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"line_num", e_tid_uint, NULL, 4, "1", "Range line number. Numbered sequentially, for each product (or slice) first range line in MDS is 1"}, {"proc_data", e_tid_short, NULL, 2, "2*sceneRasterWidth", "SAR Processed Data for SLC products. Alternates Real Part, Imaginary Part, Real Part Imaginary Part)"} }; static const struct RecordDescriptor ASAR_Main_ADSR_asar_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"}, {"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"}, {"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"} }; 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"}, {"lines", e_tid_uint, NULL, 4, "1", "Number of lines"}, {"sample_spacing", e_tid_float, "m", 4, "1", "Nominal inter-sample distance"}, {"line_spacing", e_tid_float, "m", 4, "1", "Nominal inter-line distance"}, {"orientation", e_tid_float, "deg", 4, "1", "Output scene centre orientation"}, {"spare_1", e_tid_spare, NULL, 40, "1", "Spare"}, {"heading", e_tid_float, "deg", 4, "1", "Platform heading, degrees"}, {"ellipsoid_name", e_tid_string, "ascii", 32, "1", "Reference ellipsoid name"}, {"semi_major", e_tid_float, "m", 4, "1", "Ellipsoid semi-major axis, metres"}, {"semi_minor", e_tid_float, "m", 4, "1", "Ellipsoid semi-minor axis, metres"}, {"shift_dx", e_tid_float, "m", 4, "1", "Datum shift parameter referenced to Greenwich: dx (metres)"}, {"shift_dy", e_tid_float, "m", 4, "1", "Datum shift parameter perpendicular to Greenwich: dy (metres)"}, {"shift_dz", e_tid_float, "m", 4, "1", "Datum shift parameter direction of the rotation axis: dz (metres)"}, {"avg_height", e_tid_float, NULL, 4, "1", "average scene height above ellipsoid used for geocoding"}, {"spare_2", e_tid_spare, NULL, 12, "1", "Spare"}, {"projection_description", e_tid_string, "ascii", 32, "1", "Map projection alphanumeric description"}, {"utm_descriptor", e_tid_string, "ascii", 32, "1", "UTM descriptorUNIVERSAL_TRANSVERSE_MERCATORØØØ"}, {"utm_zone", e_tid_string, "ascii", 4, "1", "UTM zone signature"}, {"utm_origin_easting", e_tid_float, "m", 4, "1", "Map origin, false easting"}, {"utm_origin_northing", e_tid_float, "m", 4, "1", "Map origin, false northing"}, {"utm_center_long", e_tid_int, "(1e-6) degrees", 4, "1", "Projection centre longitude, deg"}, {"utm_center_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Projection centre latitude, deg"}, {"utm_para1", e_tid_float, "deg", 4, "1", "1st standard parallel, deg"}, {"utm_para2", e_tid_float, "deg", 4, "1", "2nd standard parallel, deg"}, {"utm_scale", e_tid_float, NULL, 4, "1", "Scale factor"}, {"ups_descriptor", e_tid_string, "ascii", 32, "1", "UPS descriptor"}, {"ups_center_long", e_tid_int, "(1e-6) degrees", 4, "1", "Projection centre longitude, deg"}, {"ups_center_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Projection centre latitude, deg"}, {"ups_scale", e_tid_float, NULL, 4, "1", "Scale factor"}, {"nsp_descriptor", e_tid_string, "ascii", 32, "1", "NSP descriptor"}, {"origin_easting", e_tid_float, "m", 4, "1", "Map origin, false easting"}, {"origin_northing", e_tid_float, "m", 4, "1", "Map origin, false northing"}, {"center_long", e_tid_int, "(1e-6) degrees", 4, "1", "Projection centre longitude, deg"}, {"center_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Projection centre latitude, deg"}, {"standard_parallel_parameters.para1", e_tid_float, "deg", 4, "1", "Standard parallel1, deg"}, {"standard_parallel_parameters.para2", e_tid_float, "deg", 4, "1", "Standard parallel2, deg"}, {"standard_parallel_parameters.para3", e_tid_float, "deg", 4, "1", "Standard parallel3, deg"}, {"standard_parallel_parameters.para4", e_tid_float, "deg", 4, "1", "Standard parallel4, deg"}, {"central_meridian_parameters.central_m1", e_tid_float, "deg", 4, "1", "Central meridian1, deg"}, {"central_meridian_parameters.central_m2", e_tid_float, "deg", 4, "1", "Central meridian2, deg"}, {"central_meridian_parameters.central_m3", e_tid_float, "deg", 4, "1", "Central meridian3, deg"}, {"projection_parameters.spare_3", e_tid_spare, NULL, 4, "1", "Spare"}, {"projection_parameters.spare_4", e_tid_spare, NULL, 4, "1", "Spare"}, {"projection_parameters.spare_5", e_tid_spare, NULL, 4, "1", "Spare"}, {"projection_parameters.spare_6", e_tid_spare, NULL, 4, "1", "Spare"}, {"position_northings_eastings.tl_northing", e_tid_float, "m", 4, "1", "Top left corner northing, meters;"}, {"position_northings_eastings.tl_easting", e_tid_float, "m", 4, "1", "Top left corner easting, meters;"}, {"position_northings_eastings.tr_northing", e_tid_float, "m", 4, "1", "Top right corner northing, meters;"}, {"position_northings_eastings.tr_easting", e_tid_float, "m", 4, "1", "Top right corner easting, meters;"}, {"position_northings_eastings.br_northing", e_tid_float, "m", 4, "1", "Bottom right corner northing, meters;"}, {"position_northings_eastings.br_easting", e_tid_float, "m", 4, "1", "Bottom right corner easting, meters;"}, {"position_northings_eastings.bl_northing", e_tid_float, "m", 4, "1", "Bottom left corner northing, meters;"}, {"position_northings_eastings.bl_easting", e_tid_float, "m", 4, "1", "Bottom left corner easting, meters;"}, {"position_lat_long.tl_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Top left corner latitude"}, {"position_lat_long.tl_long", e_tid_int, "(1e-6) degrees", 4, "1", "Top left corner longitude"}, {"position_lat_long.tr_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Top right corner latitude"}, {"position_lat_long.tr_long", e_tid_int, "(1e-6) degrees", 4, "1", "Top right corner longitude"}, {"position_lat_long.br_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Bottom right corner latitude"}, {"position_lat_long.br_long", e_tid_int, "(1e-6) degrees", 4, "1", "Bottom right corner longitude"}, {"position_lat_long.bl_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Bottom left corner latitude"}, {"position_lat_long.bl_long", e_tid_int, "(1e-6) degrees", 4, "1", "Bottom left corner longitude"}, {"spare_7", e_tid_spare, NULL, 32, "1", "Spare"}, {"image_to_map_coefs", e_tid_float, NULL, 4, "8", "8 coefficients to convert a line(L) and sample (S) position to the map projection frame of reference, say (E,N)E = A11 + A12*L + A13 *S + A14 *L*SN = A21 + A22*L + A23 *S + A24 *L*S"}, {"map_to_image_coefs", e_tid_float, NULL, 4, "8", "8 coefficients to convert from the map projection (E,N) to line (L) and sample(S) position in the imageL = B11 + B12*E + B13 *N + B14 *E*NS = B21 + B22*E + B23 *N + B24 *E*N"}, {"spare_8", e_tid_spare, NULL, 35, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Ocean_Spectra_MDSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "First Zero Doppler Azimuth time of the wave cellTime of first range line in the SLC Imagette MDS described by this data set"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"range_spectral_res", e_tid_float, NULL, 4, "1", "Range spectral bin size of the cartesian cross spectrum"}, {"az_spectral_res", e_tid_float, NULL, 4, "1", "Azimuth spectral bin size of the cartesian cross spectrum"}, {"spare_1", e_tid_spare, NULL, 4, "1", "Spare"}, {"spec_tot_energy", e_tid_float, NULL, 4, "1", "Spectrum Total Energy"}, {"spec_max_energy", e_tid_float, NULL, 4, "1", "Spectrum Max Energy"}, {"spec_max_dir", e_tid_float, "deg", 4, "1", "Direction of Spectrum Max (deg)on higher resolution grid"}, {"spec_max_wl", e_tid_float, "m", 4, "1", "Wavelength of Spectrum Max (m)on higher resolution grid"}, {"az_image_shift_var", e_tid_float, "m^2", 4, "1", "Variance of the azimuth image shift caused by the orbital velocity"}, {"az_cutoff", e_tid_float, "m", 4, "1", "Azimuthal Clutter Cut-off length (m)"}, {"nonlinear_spectral_width", e_tid_float, "m", 4, "1", "Spectral width of the non-linear part of the cross spectra"}, {"image_intensity", e_tid_float, NULL, 4, "1", "Image intensity"}, {"image_variance", e_tid_float, NULL, 4, "1", "Normalised image variance"}, {"spare_2", e_tid_spare, NULL, 56, "1", "Spare"}, {"min_spectrum", e_tid_float, "m^4", 4, "1", "Min value of ocean wave spectrum"}, {"max_spectrum", e_tid_float, "m^4", 4, "1", "Max value of ocean wave spectrum"}, {"spare_3", e_tid_spare, NULL, 8, "1", "Spare"}, {"wind_speed", e_tid_float, "m/s", 4, "1", "Forcast Wind speed (if provided)"}, {"wind_direction", e_tid_float, "deg", 4, "1", "Forcast Wind direction (if provided)"}, {"SAR_wave_height", e_tid_float, "m", 4, "1", "SAR swell wave height"}, {"SAR_az_shift_var", e_tid_float, "m^2", 4, "1", "Variance of the azimuth shift computed from the SAR swell wave spectra"}, {"backscatter", e_tid_float, "dB", 4, "1", "Backscattering coefficient"}, {"confidence", e_tid_int, NULL, 4, "1", "Confidence measure of the swell inversion"}, {"signal_to_noise", e_tid_float, NULL, 4, "1", "Average signal-to-noise ratio"}, {"radar_vel_corr", e_tid_float, "m/s", 4, "1", "Radar velocity off-set correction"}, {"cmod_cal_const", e_tid_float, NULL, 4, "1", "Calibration constant - CMOD"}, {"spare_4", e_tid_spare, NULL, 28, "1", "Spare"}, {"ocean_spectra", e_tid_uchar, NULL, 1, "!REF_TBD!", "Ocean Wave Swell spectra polar grid. Number of bins in wavelength and direction defined in SPH (nominally 24 by 36). Arranged as 24 wavelength cells from shortest to longest wavelength, for zero degrees, then 10 degrees, up to 350 degrees."} }; static const struct RecordDescriptor ASAR_Spectra_MDSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "First Zero Doppler Azimuth time of the wave cellTime of first range line in the SLC Imagette MDS described by this data set"}, {"quality_flag", e_tid_uchar, "flag", 1, "1", "Quality Indicator (-1 for blank MDSR, 0 otherwise)"}, {"range_spectral_res", e_tid_float, NULL, 4, "1", "Range spectral resolution of the cartesian cross spectrum"}, {"az_spectral_res", e_tid_float, NULL, 4, "1", "Azimuth spectral resolution of the cartesian cross spectrum"}, {"az_resample_factor", e_tid_float, NULL, 4, "1", "Azimuth re-sampling factor in look extraction(Swath specific)"}, {"spec_tot_energy", e_tid_float, NULL, 4, "1", "Spectrum Total Energy"}, {"spec_max_energy", e_tid_float, NULL, 4, "1", "Spectrum Max Energy"}, {"spec_max_dir", e_tid_float, "deg", 4, "1", "Direction of Spectrum Max (deg)on higher resolution grid"}, {"spec_max_wl", e_tid_float, "m", 4, "1", "Wavelength of Spectrum Max (m)on higher resolution grid"}, {"clutter_noise", e_tid_float, NULL, 4, "1", "Clutter Noise"}, {"az_cutoff", e_tid_float, "m", 4, "1", "Azimuthal Clutter Cut-off length (m)"}, {"num_iterations", e_tid_float, NULL, 4, "1", "Number of iterations to compute Azimuthal Clutter Cut-off"}, {"range_offset", e_tid_float, "m", 4, "1", "Range offset of peak of cross covariance function (m)"}, {"ax_offset", e_tid_float, "m", 4, "1", "Azimuth offset of peak of cross covariance function (m)"}, {"cc_range_res", e_tid_float, "rad/m", 4, "1", "Range resolution of cross co-variance spectrum (rad/m)"}, {"cc_azimuth_res", e_tid_float, "rad/m", 4, "1", "Azimuth resolution of cross co-variance spectrum (rad/m)"}, {"sublook_means", e_tid_float, NULL, 4, "2", "1st and last Sub-look Image Means"}, {"sublook_variance", e_tid_float, NULL, 4, "2", "1st and last Sub-look Image Variance"}, {"sublook_skewness", e_tid_float, NULL, 4, "2", "1st and last Sub-look Image Skewness"}, {"sublook_kurtosis", e_tid_float, NULL, 4, "2", "1st and last Sub-look Image Kurtosis"}, {"range_sublook_detrend_coeff", e_tid_float, NULL, 4, "2", "1st and last Sub-look de-trend coefficient in range"}, {"az_sublook_detrend_coeff", e_tid_float, NULL, 4, "2", "1st and last Sub-look de-trend coefficient in azimuth"}, {"min_imag", e_tid_float, NULL, 4, "1", "Min value of Imaginary part of cross spectrum"}, {"max_imag", e_tid_float, NULL, 4, "1", "Max value of Imaginary part of cross spectrum"}, {"min_real", e_tid_float, NULL, 4, "1", "Min value of Real part of cross spectrum"}, {"max_real", e_tid_float, NULL, 4, "1", "Max value of Real part of cross spectrum"}, {"spare_1", e_tid_spare, NULL, 64, "1", "Spare"}, {"real_spectra", e_tid_uchar, NULL, 1, ".SPH.num_wl_bins,.SPH.num_dir_bins", "Real part of cross spectra polar gridNumber of bins in wavelength and direction defined in SPH (nominally 24 by 36). However, only 0 to 180 degree of the spectrum need be supplied (24 by 18). Arranged as: 24 wavelength values for 0-10 deg. sector, 24 valu"}, {"imag_spectra", e_tid_uchar, NULL, 1, ".SPH.num_wl_bins,.SPH.num_dir_bins", "Complex part of cross spectra polar gridNumber of bins in wavelength and direction defined in SPH (nominally 24 by 36). However, only 0 to 180 degree of the spectrum need be supplied (24 by 18). Arranged as: 24 wavelength values for 0-10 deg. sector, 24 v"} }; static const struct RecordDescriptor ASAR_SQ1_Image_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero doppler time at which SQ information applies"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (set to 1 if all MDSRs corresponding to this ADSR are blank, set to zero otherwise).Note: in practice for ASAR products, this flag will always be zero since this ADSR is updated once per slice or scene. Therefore, if there are no MDSRs, this ADSR is not produced at all."}, {"input_mean_flag", e_tid_uchar, "flag", 1, "1", "Input data mean outside nominal range flag. 0 = mean of I and Q input values are both within specified range from expected mean. For expected mean of x, the measured mean must fall between x-threshold to x+threshold. 1 = otherwise"}, {"input_std_dev_flag", e_tid_uchar, "flag", 1, "1", "Input data standard deviation outside nominal range flag. 0 = standard deviation values of I and Q input values are both within specified range of expected standard deviation. For expected std. dev. x, the measured std. dev. must fall between x-threshold to x+threshold. 1 = otherwise"}, {"input_gaps_flag", e_tid_uchar, "flag", 1, "1", "Significant gaps in the input data flag. An input data gap is defined as a contiguous block of N missing lines (the value of N is predefined for each product). 0 = number of input gaps <= threshold value. 1 = number of input data gaps > threshold value"}, {"input_missing_lines_flag", e_tid_uchar, "flag", 1, "1", "Missing lines significant flag. 0 = percentage of missing lines <= threshold value 1 = percentage of missing lines > threshold value. The number of missing lines is the number of lines missing from the input data excluding data gaps."}, {"dop_cen_flag", e_tid_uchar, "flag", 1, "1", "Doppler Centroid Uncertain flag. 0 = confidence measure >= specified value. 1 = confidence measure < specified value (note: if more than one Doppler centroid estimation is performed in a slice the flag is set if any confidence measure is less than the threshold)."}, {"dop_amb_flag", e_tid_uchar, "flag", 1, "1", "Doppler ambiguity estimate uncertain flag. 0 = confidence measure >= specified value. 1 = confidence measure < specified value"}, {"output_mean_flag", e_tid_uchar, "flag", 1, "1", "Output data mean outside nominal range flag. 0 = mean of I and Q output values for SLC image or mean of detected pixels for a detected product, are both within specified range from expected mean. For expected mean of x, the measured mean must fall between x-threshold to x+threshold. 1 = otherwise."}, {"output_std_dev_flag", e_tid_uchar, "flag", 1, "1", "Output data standard deviation outside nominal range flag. 0 = std. dev. of I and Q output values for SLC image or std. dev. of detected pixels for a detected product, are both within specified range from expected std. dev. For expected std. dev. of x, the measured std. dev must fall between x-threshold and x+threshold. 1 = otherwise."}, {"chirp_flag", e_tid_uchar, "flag", 1, "1", "Chirp extraction failed or is of low quality flag. 0 = able to extract all chirps or chirp extraction not requested (nominal chirp used) AND all quality measures were acceptable. 1 = unable to extract a chirp during processing and chirp extraction was requequested or the quality is below the acceptable levels."}, {"missing_data_sets_flag", e_tid_uchar, "flag", 1, "1", "Data sets missing flag. 0 = all data sets which are supposed to be in the product are present. 1 = any data sets (including ADSs) are missing from the product which are supposed to be included under normal circumstances. Which data sets are missing can be determined by an examination of the DSDs in the SPH."}, {"invalid_downlink_flag", e_tid_uchar, "flag", 1, "1", "Invalid downlink parameters flag. 0 = all parameters read from the downlinked data were valid. 1 = displayed if any downlink parameter is out of range and therefore a default value has been used during processing."}, {"spare_1", e_tid_spare, NULL, 7, "1", "Spare"}, {"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."}, {"exp_input_mean", e_tid_float, NULL, 4, "1", "Expected mean input value for this product for both I and Q."}, {"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."}, {"exp_input_std_dev", e_tid_float, NULL, 4, "1", "Expected input std. dev. for this product for both I and Q."}, {"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."}, {"exp_output_mean", e_tid_float, NULL, 4, "1", "Expected mean output value for this product. For an SLC product this is the expected mean of both the I and Q values."}, {"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."}, {"exp_output_std_dev", e_tid_float, NULL, 4, "1", "Expected output std. dev. for this product. For an SLC product this is the expected output std. dev. for both I and Q values."}, {"thresh_input_missing_lines", e_tid_float, "%", 4, "1", "Threshold for setting the missing lines quality flag - maximum percentage of missing lines to total lines."}, {"thresh_input_gaps", e_tid_float, NULL, 4, "1", "Threshold for setting the missing gaps quality flag - maximum number of missing gaps allowed."}, {"lines_per_gaps", e_tid_uint, "lines", 4, "1", "Number of missing lines which constitute a gap"}, {"spare_2", e_tid_spare, NULL, 15, "1", "Spare"}, {"input_mean", e_tid_float, NULL, 4, "2", "Input data mean (i channel, q channel)"}, {"input_std_dev", e_tid_float, NULL, 4, "2", "Input data standard deviation (i channel, q channel)"}, {"num_gaps", e_tid_float, NULL, 4, "1", "Number of gaps (composed of a predetermined number of consecutive missing lines)"}, {"num_missing_lines", e_tid_float, NULL, 4, "1", "Number of missing lines (excluding gaps)"}, {"output_mean", e_tid_float, NULL, 4, "2", "Output data mean (detected samples, followed by zero, or i channel followed by q channel for SLC)"}, {"output_std_dev", e_tid_float, NULL, 4, "2", "Output data standard deviation (detected samples followed by zero, or i channel followed by q channel for SLC)"}, {"tot_errors", e_tid_uint, NULL, 4, "1", "Total number of errors detected in ISP headers"}, {"Spare_3", e_tid_spare, NULL, 16, "1", "Spare"} }; static const struct RecordDescriptor ASAR_SRGR_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time in azimuth from which parameters apply"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (always set to zero for this ADSR)"}, {"slant_range_time", e_tid_float, "ns", 4, "1", "2 way slant range time to first range sample"}, {"ground_range_origin", e_tid_float, "m", 4, "1", "Ground range origin of the polynomial (GR0) measured for the first pixel of the line."}, {"srgr_coeff", e_tid_float, "m, m-1, m-2, m-3, m-4", 4, "5", "The coefficients S0, S1, S2, S3, and S4 of the ground range to slant range conversion polynomial. Slant range = S0 + S1(GR-GR0) + S2 (GR-GR0)2 + S3(GR-GR0)3 + S4(GR-GR0)4"}, {"spare_1", e_tid_spare, NULL, 14, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Wave_Geolocation_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time of first line of the first line of the imagette"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag (set to 1 if unable to compute the cross spectra for a given SLC imagette (i.e. no Cross Spectra MDSR corresponding to this ADSR), set to 0 otherwise)"}, {"center_lat", e_tid_int, "(1e-6) degrees", 4, "1", "Geodetic latitude of center point (positive north) This is the center point of the wave cell. It is calculated after the cross spectra processing, and thus may differ from the center sample latitude of the SLC imagette if slant range to ground range conve"}, {"center_long", e_tid_int, "(1e-6) degrees", 4, "1", "Geodetic longitude of center point (positive east)This is the center point of the wave cell. It is calculated after the cross spectra processing, and thus may differ from the center sample latitude of the SLC imagette if slant range to ground range conver"}, {"spare_1", e_tid_spare, NULL, 4, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Wave_Param_ADSR_asar_rec_data[] = { {"first_zero_doppler_time", e_tid_time, "MJD", 12, "1", "First Zero Doppler Azimuth time of MDS which this data set describesTime 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 describesTime 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 typeSWORD, UWORD, or UBYTE"}, {"spare_1", e_tid_spare, NULL, 51, "1", "Spare"}, {"data_analysis_flag", e_tid_uchar, "flag", 1, "1", "Raw Data Analysis used for Raw Data Correction 0 = correction done using default parameters1 = 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 applied1 = correction applied"}, {"chirp_extract_flag", e_tid_uchar, "flag", 1, "1", "reconstructed Chirp used 0 = nominal chirp replica used1 = reconstructed chirp used"}, {"srgr_flag", e_tid_uchar, "flag", 1, "1", "Slant Range to Ground Range Conversion Applied0 = no conversion applied1 = conversion applied"}, {"dop_cen_flag", e_tid_uchar, "flag", 1, "1", "Doppler Centroid Estimation Performed0 = no estimation done1 = estimation done"}, {"dop_amb_flag", e_tid_uchar, "flag", 1, "1", "Doppler Ambiguity Estimation Performed0 = no estimate done1 = estimate done"}, {"range_spread_comp_flag", e_tid_uchar, "flag", 1, "1", "Range-spreading loss compensation Applied0 = no compensation applied1 = compensation applied"}, {"detected_flag", e_tid_uchar, "flag", 1, "1", "Detection Applied0 = output product is complex1 = output product was detected"}, {"look_sum_flag", e_tid_uchar, "flag", 1, "1", "Look Summation Performed0 = product is single look1 = 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 Elevationscaling Factor applied 0= no scaling factor applied, 1 = scaling factor applied"}, {"spare_2", e_tid_spare, NULL, 10, "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 significance0 = I bias falls within acceptable range1 = I bias falls outside acceptable range (record 1)"}, {"raw_data_analysis.1.q_bias_flag", e_tid_uchar, "flag", 1, "1", "Q bias Significance0 = Q bias falls within acceptable range1 = Q bias falls outside acceptable range (record 1)"}, {"raw_data_analysis.1.gain_flag", e_tid_uchar, "flag", 1, "1", "I/Q Gain Significance0 = Gain falls within acceptable range1 = Gain falls outside acceptable range (record 1)"}, {"raw_data_analysis.1.quad_flag", e_tid_uchar, "flag", 1, "1", "I/Q Quadrature Departure Significance0 = Quadrature departure falls within acceptable range1 =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 significance0 = I bias falls within acceptable range1 = I bias falls outside acceptable range (record 2)"}, {"raw_data_analysis.2.q_bias_flag", e_tid_uchar, "flag", 1, "1", "Q bias Significance0 = Q bias falls within acceptable range1 = Q bias falls outside acceptable range (record 2)"}, {"raw_data_analysis.2.gain_flag", e_tid_uchar, "flag", 1, "1", "I/Q Gain Significance0 = Gain falls within acceptable range1 = Gain falls outside acceptable range (record 2)"}, {"raw_data_analysis.2.quad_flag", e_tid_uchar, "flag", 1, "1", "I/Q Quadrature Departure Significance0 = Quadrature departure falls within acceptable range1 =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 processedLSB accurate to 15.26 ms. (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 processedconverted 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 processedLSB accurate to 15.26 ms. (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 processedconverted from satellite binary time (record 2)"}, {"parameter_codes.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.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_range", e_tid_string, "ascii", 7, "1", "Matched filter window type:HAMMING or KAISERØ or NONEØØØ"}, {"filter_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 MeasureValue 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 (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 (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 samples8/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 samples8/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 samples8/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 samples8/4, 8/3, 8/2, or 8/8"}, {"spare_12", e_tid_spare, NULL, 64, "1", "Spare"}, {"beam_overlap", e_tid_uint, NULL, 4, "4", "Number of slant range samples in beam overlap(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.One value for AP mode, all others set to zero."}, {"spare_13", e_tid_spare, NULL, 44, "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"}, {"slant_range_time", e_tid_float, "ns", 4, "1", "2-way slant range time origin (t0)"}, {"dop_coef", e_tid_float, "HzHz/sHz/s2Hz/s3Hz/s4", 4, "5", "Doppler centroid coefficients as a function of slant range time: D0, D1, D2, D3, and D4.where Doppler Centroid = D0 + D1(tSR-t0) + D2(tSR-t0)2 + D3(tSR-t0)3 + D4(tSR-t0)4"}, {"dop_conf", e_tid_float, NULL, 4, "1", "Doppler Centroid Confidence MeasureValue between 0 and 1, 0 = poorest confidence, 1= highest confidence"}, {"spare_15", e_tid_spare, NULL, 14, "1", "Spare"}, {"chirp_width", e_tid_float, "samples", 4, "1", "3-dB pulse width of chirp replica cross-correlation function between extract chirp and nominal chirp"}, {"chirp_sidelobe", e_tid_float, "dB", 4, "1", "First side lobe level of chirp replica cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_islr", e_tid_float, "dB", 4, "1", "ISLR of chirp replica cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_peak_loc", e_tid_float, "samples", 4, "1", "Peak location of cross-correlation function between reconstructed chirp and nominal chirp"}, {"chirp_power", e_tid_float, NULL, 4, "1", "Chirp power"}, {"elev_corr_factor", e_tid_float, NULL, 4, "1", "Elevation gain correction scaling factor applied to range compressed samples"}, {"spare_16", e_tid_spare, NULL, 16, "1", "Spare"}, {"cal_info.1.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 1)"}, {"cal_info.1.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 1)"}, {"cal_info.1.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 1)"}, {"cal_info.1.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 1)"}, {"cal_info.2.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 2)"}, {"cal_info.2.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 2)"}, {"cal_info.2.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 2)"}, {"cal_info.2.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 2)"}, {"cal_info.3.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 3)"}, {"cal_info.3.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 3)"}, {"cal_info.3.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 3)"}, {"cal_info.3.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 3)"}, {"cal_info.4.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 4)"}, {"cal_info.4.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 4)"}, {"cal_info.4.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 4)"}, {"cal_info.4.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 4)"}, {"cal_info.5.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 5)"}, {"cal_info.5.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 5)"}, {"cal_info.5.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 5)"}, {"cal_info.5.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 5)"}, {"cal_info.6.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 6)"}, {"cal_info.6.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 6)"}, {"cal_info.6.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 6)"}, {"cal_info.6.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 6)"}, {"cal_info.7.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 7)"}, {"cal_info.7.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 7)"}, {"cal_info.7.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 7)"}, {"cal_info.7.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 7)"}, {"cal_info.8.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 8)"}, {"cal_info.8.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 8)"}, {"cal_info.8.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 8)"}, {"cal_info.8.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 8)"}, {"cal_info.9.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 9)"}, {"cal_info.9.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 9)"}, {"cal_info.9.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 9)"}, {"cal_info.9.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 9)"}, {"cal_info.10.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 10)"}, {"cal_info.10.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 10)"}, {"cal_info.10.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 10)"}, {"cal_info.10.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 10)"}, {"cal_info.11.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 11)"}, {"cal_info.11.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 11)"}, {"cal_info.11.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 11)"}, {"cal_info.11.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 11)"}, {"cal_info.12.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 12)"}, {"cal_info.12.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 12)"}, {"cal_info.12.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 12)"}, {"cal_info.12.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 12)"}, {"cal_info.13.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 13)"}, {"cal_info.13.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 13)"}, {"cal_info.13.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 13)"}, {"cal_info.13.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 13)"}, {"cal_info.14.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 14)"}, {"cal_info.14.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 14)"}, {"cal_info.14.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 14)"}, {"cal_info.14.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 14)"}, {"cal_info.15.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 15)"}, {"cal_info.15.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 15)"}, {"cal_info.15.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 15)"}, {"cal_info.15.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 15)"}, {"cal_info.16.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 16)"}, {"cal_info.16.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 16)"}, {"cal_info.16.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 16)"}, {"cal_info.16.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 16)"}, {"cal_info.17.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 17)"}, {"cal_info.17.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 17)"}, {"cal_info.17.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 17)"}, {"cal_info.17.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 17)"}, {"cal_info.18.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 18)"}, {"cal_info.18.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 18)"}, {"cal_info.18.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 18)"}, {"cal_info.18.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 18)"}, {"cal_info.19.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 19)"}, {"cal_info.19.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 19)"}, {"cal_info.19.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 19)"}, {"cal_info.19.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 19)"}, {"cal_info.20.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 20)"}, {"cal_info.20.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 20)"}, {"cal_info.20.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 20)"}, {"cal_info.20.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 20)"}, {"cal_info.21.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 21)"}, {"cal_info.21.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 21)"}, {"cal_info.21.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 21)"}, {"cal_info.21.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 21)"}, {"cal_info.22.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 22)"}, {"cal_info.22.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 22)"}, {"cal_info.22.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 22)"}, {"cal_info.22.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 22)"}, {"cal_info.23.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 23)"}, {"cal_info.23.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 23)"}, {"cal_info.23.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 23)"}, {"cal_info.23.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 23)"}, {"cal_info.24.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 24)"}, {"cal_info.24.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 24)"}, {"cal_info.24.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 24)"}, {"cal_info.24.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 24)"}, {"cal_info.25.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 25)"}, {"cal_info.25.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 25)"}, {"cal_info.25.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 25)"}, {"cal_info.25.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 25)"}, {"cal_info.26.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 26)"}, {"cal_info.26.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 26)"}, {"cal_info.26.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 26)"}, {"cal_info.26.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 26)"}, {"cal_info.27.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 27)"}, {"cal_info.27.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 27)"}, {"cal_info.27.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 27)"}, {"cal_info.27.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 27)"}, {"cal_info.28.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 28)"}, {"cal_info.28.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 28)"}, {"cal_info.28.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 28)"}, {"cal_info.28.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 28)"}, {"cal_info.29.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 29)"}, {"cal_info.29.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 29)"}, {"cal_info.29.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 29)"}, {"cal_info.29.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 29)"}, {"cal_info.30.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 30)"}, {"cal_info.30.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 30)"}, {"cal_info.30.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 30)"}, {"cal_info.30.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 30)"}, {"cal_info.31.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 31)"}, {"cal_info.31.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 31)"}, {"cal_info.31.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 31)"}, {"cal_info.31.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 31)"}, {"cal_info.32.max_cal", e_tid_float, NULL, 4, "3", "Max of Cal pulses 1, 2, and 3 amplitude (record 32)"}, {"cal_info.32.avg_cal", e_tid_float, NULL, 4, "3", "Average of Cal pulse 1, 2, and 3 amplitude over the 3 dB on either side of the max amplitude (record 32)"}, {"cal_info.32.avg_val_1a", e_tid_float, NULL, 4, "1", "Average of Cal pulse 1A over the sample window (record 32)"}, {"cal_info.32.phs_cal", e_tid_float, "degrees", 4, "4", "Extracted phase for calibration pulse 1, 1A, 2, and 3 (record 32)"}, {"spare_17", e_tid_spare, NULL, 16, "1", "Spare"}, {"first_line_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time at first line of imagette"}, {"first_line_tie_points.range_samp_nums_first", e_tid_uint, NULL, 4, "3", "Range sample number Gives the range location of the grid points. First range sample is 1, is M (includes zero filled samples)"}, {"first_line_tie_points.slant_range_times_first", e_tid_float, "ns", 4, "3", "2 way slant range time to range sample"}, {"first_line_tie_points.inc_angles_first", e_tid_float, "deg.", 4, "3", "Incidence Angle at range sample"}, {"first_line_tie_points.lats_first", e_tid_int, "(1e-6) degrees", 4, "3", "geodetic latitude of range sample (positive north)"}, {"first_line_tie_points.longs_first", e_tid_int, "(1e-6) degrees", 4, "3", "geodetic longitude of range sample (positive east)"}, {"mid_line_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time at centre line of imagette"}, {"mid_range_line_nums", e_tid_uint, NULL, 4, "1", "Range line number of the center range line"}, {"mid_line_tie_points.range_samp_nums_mid", e_tid_uint, NULL, 4, "3", "Range sample number Gives the range location of the grid points. First range sample is 1, is M (includes zero filled samples)"}, {"mid_line_tie_points.slant_range_times_mid", e_tid_float, "ns", 4, "3", "2 way slant range time to range sample"}, {"mid_line_tie_points.inc_angles_mid", e_tid_float, "deg.", 4, "3", "Incidence Angle at range sample"}, {"mid_line_tie_points.lats_mid", e_tid_int, "(1e-6) degrees", 4, "3", "geodetic latitude of range sample (positive north)"}, {"mid_line_tie_points.longs_mid", e_tid_int, "(1e-6) degrees", 4, "3", "geodetic longitude of range sample (positive east)"}, {"last_line_time", e_tid_time, "MJD", 12, "1", "Zero Doppler Time at last line of imagette"}, {"last_line_num", e_tid_uint, NULL, 4, "1", "Range line number of the last range line"}, {"last_line_tie_points.range_samp_nums_last", e_tid_uint, NULL, 4, "3", "Range sample number Gives the range location of the grid points. First range sample is 1, is M (includes zero filled samples)"}, {"last_line_tie_points.slant_range_times_last", e_tid_float, "ns", 4, "3", "2 way slant range time to range sample"}, {"last_line_tie_points.inc_angles_last", e_tid_float, "deg.", 4, "3", "Incidence Angle at range sample"}, {"last_line_tie_points.lats_last", e_tid_int, "(1e-6) degrees", 4, "3", "geodetic latitude of range sample (positive north)"}, {"last_line_tie_points.longs_last", e_tid_int, "(1e-6) degrees", 4, "3", "geodetic longitude of range sample (positive east)"}, {"swst_offset", e_tid_float, "ns", 4, "1", "Wave cell SWST offset from center of the sub-swath to start of imagette. 208 ns increments"}, {"ground_range_bias", e_tid_float, "km", 4, "1", "Wave cell Ground range bias from centre of the Sub-Swath to the centre of the imagette (Ground range, km)"}, {"elev_angle_bias", e_tid_float, "deg", 4, "1", "Wave cell Elevation angle biasfrom centre of the Sub-Swath elevation to the centre of the imagette (deg)"}, {"imagette_range_len", e_tid_float, "m", 4, "1", "Imagette length in range (m)"}, {"imagette_az_len", e_tid_float, "m", 4, "1", "Imagette length in azimuth (m)"}, {"imagette_range_res", e_tid_float, "m", 4, "1", "Nominal Imagette resolution in slant range (m)"}, {"ground_res", e_tid_float, "m", 4, "1", "Nominal resolution in ground range"}, {"imagette_az_res", e_tid_float, "m", 4, "1", "Nominal Imagette resolution in azimuth (m)"}, {"platform_alt", e_tid_float, "m", 4, "1", "Altitude (platform to ellipsoid) in metres (centre of wave cell)"}, {"platform_vel", e_tid_float, "m/s", 4, "1", "Platform Velocity (m/s)w.r.t moving earth"}, {"slant_range", e_tid_float, "m", 4, "1", "Range to centre of imagette (m)from platform to target"}, {"cw_drift", e_tid_float, NULL, 4, "1", "CW signal drift"}, {"wave_subcycle", e_tid_ushort, NULL, 2, "1", "Wave sub-cycle (1 or 2) of this wave cell"}, {"earth_radius", e_tid_float, "m", 4, "1", "Earth Radius at imagette center sample"}, {"sat_height", e_tid_float, "m", 4, "1", "Satellite distance to earth center"}, {"first_sample_slant_range", e_tid_float, "m", 4, "1", "Distance from satellite to first range pixel in the full SLC image"}, {"spare_18", e_tid_spare, NULL, 12, "1", "Spare"}, {"elevation_pattern.slant_range_time", e_tid_float, "ns", 4, "11", "2 way slant range times"}, {"elevation_pattern.elevation_angles", e_tid_float, "degrees", 4, "11", "Corresponding elevation angles"}, {"elevation_pattern.antenna_pattern", e_tid_float, "dB", 4, "11", "Corresponding two-way antenna elevation pattern values"}, {"spare_19", e_tid_spare, NULL, 14, "1", "Spare"} }; static const struct RecordDescriptor ASAR_Wave_SQ_ADSR_asar_rec_data[] = { {"zero_doppler_time", e_tid_time, "MJD", 12, "1", "Zero doppler time at which SQ information applies"}, {"attach_flag", e_tid_uchar, "flag", 1, "1", "Attachment Flag. Set to 1 if PF-ASAR was unable to produce an imagette for the wave cell. The fields in other DSR's corresponding to this one are set to zero, apart from the Zero Doppler Time."}, {"input_mean_flag", e_tid_uchar, "flag", 1, "1", "Input data mean outside nominal range flag0 = mean of I and Q input values are both within specified range from expected mean. For expected mean of x, the measured mean must fall between x-threshold to x+threshold.1 = otherwise"}, {"input_std_dev_flag", e_tid_uchar, "flag", 1, "1", "Input data standard deviation outside nominal range flag0 = standard deviation values of I and Q input values are both within specified range of expected standard deviation. For expected std. dev. x, the measured std. dev. must fall between x-threshold to"}, {"input_gaps_flag", e_tid_uchar, "flag", 1, "1", "Significant gaps in the input data flagAn input data gap is defined as a contiguous block of N missing lines (the value of N is predefined for each product)0 = number of input gaps <= threshold value1 = number of input data gaps > threshold value"}, {"input_missing_lines_flag", e_tid_uchar, "flag", 1, "1", "Missing lines significant flag 0 = percentage of missing lines <= threshold value 1 = percentage of missing lines > threshold valueThe number of missing lines is the number of lines missing from the input data excluding data gaps."}, {"dop_cen_flag", e_tid_uchar, "flag", 1, "1", "Doppler Centroid Uncertain flag0 = confidence measure >= specified value1 = Error message generated if confidence measure < specified value(note: if more than one Doppler centroid estimation is performed in a slice the flag is set if any confidence measur"}, {"dop_amb_flag", e_tid_uchar, "flag", 1, "1", "Doppler ambiguity estimate uncertain flag0 = confidence measure >= specified value1 = confidence measure < specified value"}, {"output_mean_flag", e_tid_uchar, "flag", 1, "1", "Output data mean outside nominal range flag0 = mean of I and Q output values for SLC image or mean of detected pixels for a detected product, are both within specified range from expected mean. For expected mean of x, the measured mean must fall between x"}, {"output_std_dev_flag", e_tid_uchar, "flag", 1, "1", "Output data standard deviation outside nominal range flag0 = std. dev. of I and Q output values for SLC image or std. dev. of detected pixels for a detected product, are both within specified range from expected std. dev. For expected std. dev. of x, the"}, {"chirp_flag", e_tid_uchar, "flag", 1, "1", "Chirp extraction failed or is of low quality flag 0 = able to extract all chirps or chirp extraction not requested (nominal chirp used) AND all quality measures were acceptable.1 = unable to extract a chirp during processing and chirp extraction was reque"}, {"missing_data_sets_flag", e_tid_uchar, "flag", 1, "1", "Data sets missing flag0 = all data sets which are supposed to be in the product are present1 = any data sets (including ADSs) are missing from the product which are supposed to be included under normal circumstances. Which data sets are missing can be det"}, {"invalid_downlink_flag", e_tid_uchar, "flag", 1, "1", "Invalid downlink parameters flag0 = all parameters read from the downlinked data were valid1 = displayed if any downlink parameter is out of range and therefore a default value has been used during processing."}, {"spare_1", e_tid_spare, NULL, 7, "1", "Spare"}, {"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."}, {"exp_input_mean", e_tid_float, NULL, 4, "1", "Expected mean input value for this product for both I and Q."}, {"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."}, {"exp_input_std_dev", e_tid_float, NULL, 4, "1", "Expected input std. dev. for this product for both I and Q."}, {"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."}, {"exp_output_mean", e_tid_float, NULL, 4, "1", "Expected mean output value for this product. For an SLC product this is the expected mean of both the I and Q values."}, {"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."}, {"exp_output_std_dev", e_tid_float, NULL, 4, "1", "Expected output std. dev. for this product. For an SLC product this is the expected output std. dev. for both I and Q values."}, {"thresh_input_missing_lines", e_tid_float, "%", 4, "1", "Threshold for setting the missing lines quality flag - maximum percentage of missing lines to total lines."}, {"thresh_input_gaps", e_tid_float, NULL, 4, "1", "Threshold for setting the missing gaps quality flag - maximum number of missing gaps allowed."}, {"lines_per_gaps", e_tid_uint, "lines", 4, "1", "Number of missing lines which constitute a gap"}, {"spare_2", e_tid_spare, NULL, 15, "1", "Spare"}, {"input_mean", e_tid_float, NULL, 4, "2", "Input data mean (i channel, q channel"}, {"input_std_dev", e_tid_float, NULL, 4, "2", "Input data standard deviation (i channel, q channel)"}, {"num_gaps", e_tid_float, NULL, 4, "1", "Number of gaps (composed of a predetermined number of consecutive missing lines)"}, {"num_missing_lines", e_tid_float, NULL, 4, "1", "Number of missing lines (excluding gaps)"}, {"output_mean", e_tid_float, NULL, 4, "2", "Output data mean (detected samples, followed by zero, or i channel followed by q channel for SLC)"}, {"output_std_dev", e_tid_float, NULL, 4, "2", "Output data standard deviation (detected samples followed by zero, or i channel followed by q channel for SLC)"}, {"tot_errors", e_tid_uint, NULL, 4, "1", "Total number of errors detected in ISP headers"}, {"Spare_3", e_tid_spare, NULL, 16, "1", "Spare"}, {"land_flag", e_tid_uchar, "flag", 1, "1", "Land Flag 0 = no land in imagette1 = land in imagette"}, {"look_conf_flag", e_tid_uchar, "flag", 1, "1", "Look image statistics confidence parameter flag 1 = The ratio of the standard deviation to the mean of the first look image is outside the range given by a minimum and a maximum threshold.0 =otherwise"}, {"inter_look_conf_flag", e_tid_uchar, "flag", 1, "1", "Inter-look confidence statistics confidence parameter flag1 = The normalised deviation of the two inter-look sub-images is greater than a maximum threshold.0 = otherwise"}, {"az_cutoff_flag", e_tid_uchar, "flag", 1, "1", "Azimuth cut-off convergence measure flag1 = The normalised RMS error between the fitted co-variance profile is greater than a maximum threshold.0 = otherwise"}, {"az_cutoff_iteration_flag", e_tid_uchar, "flag", 1, "1", "Azimuth cut-off Iteration count overflow flag1 = The Azimuth cut-off fit did not converge within a minimum number of iterations.0 = otherwise"}, {"phase_flag", e_tid_uchar, "flag", 1, "1", "Phase information confidence measure flag1 = The imaginary spectral peak is less than a minimum threshold, and the zero lag shift is greater than a minimum threshold.0 = otherwise"}, {"spare_4", e_tid_spare, NULL, 4, "1", "Spare"}, {"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_uint, NULL, 4, "1", "Azimuth cut-off Iteration count overflow threshold"}, {"phase_peak_thresh", e_tid_float, NULL, 4, "1", "Phase information confidence measure threshold for the spectral peak"}, {"phase_cross_thresh", e_tid_float, "m", 4, "1", "Phase information confidence measure threshold for cross covariance peak offset"}, {"spare_5", e_tid_spare, NULL, 12, "1", "Spare"}, {"look_conf", e_tid_float, NULL, 4, "1", "Look image statistics confidence parameterThe ratio of the standard deviation to the mean of the first look image"}, {"inter_look_conf", e_tid_float, NULL, 4, "1", "Inter-look confidence statistics confidence parameter.The normalised deviation of the two inter-look sub-images"}, {"az_cutoff", e_tid_float, NULL, 4, "1", "Azimuth cut-off convergence measureThe normalised RMS error between the fitted co-variance profile"}, {"phase_peak_conf", e_tid_float, NULL, 4, "1", "Phase information confidence measure for the spectral peakThe imaginary spectral peak"}, {"phase_cross_conf", e_tid_float, "m", 4, "1", "Phase information confidence measure for cross covariance peak offset"}, {"spare_6", e_tid_spare, NULL, 12, "1", "Spare"} }; static const struct RecordDescriptor ASA_CON_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"}, {"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, 504, "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"}, {"radar_freq", e_tid_float, "Hz", 4, "1", "Radar Frequency"}, {"samp_rate", e_tid_float, "Hz", 4, "1", "Radar Sampling Rate"}, {"offset_freq", e_tid_float, "Hz", 4, "1", "Offset frequency for wave mode calibration pulses"}, {"cal_pulse_im_hh_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_hh_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_hh_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_hh_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_hh_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_hh_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_hh_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_hh_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_hh_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_hh_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_hh_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_hh_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_hh_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_hh_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_vv_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_vv_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_vv_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_vv_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_vv_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_vv_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_vv_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_vv_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_vv_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_vv_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_vv_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_vv_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_vv_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_vv_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_hh_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_hh_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_hh_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_hh_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_hh_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_hh_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_hh_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_hh_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_hh_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_hh_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_hh_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_hh_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_hh_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_hh_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_vv_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_vv_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_vv_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_vv_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_vv_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_vv_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_vv_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_vv_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_vv_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_vv_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_vv_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_vv_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_vv_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_vv_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_hh_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_hh_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_hh_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_hh_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_hh_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_hh_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_hh_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_hh_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_hh_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_hh_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_hh_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_hh_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_hh_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_hh_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_vv_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_vv_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_im_vv_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_vv_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_im_vv_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_vv_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_im_vv_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_vv_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_im_vv_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_vv_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_im_vv_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_vv_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_im_vv_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_im_vv_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hh_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hh_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hh_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hh_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hh_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hh_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hh_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hh_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hh_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hh_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hh_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hh_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hh_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hh_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vv_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vv_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vv_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vv_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vv_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vv_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vv_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vv_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vv_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vv_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vv_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vv_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vv_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vv_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hv_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hv_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hv_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hv_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hv_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hv_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hv_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hv_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hv_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hv_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hv_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hv_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hv_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hv_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vh_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vh_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vh_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vh_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vh_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vh_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vh_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vh_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vh_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vh_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vh_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vh_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vh_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vh_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hh_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hh_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hh_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hh_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hh_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hh_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hh_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hh_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hh_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hh_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hh_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hh_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hh_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hh_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vv_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vv_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vv_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vv_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vv_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vv_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vv_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vv_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vv_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vv_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vv_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vv_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vv_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vv_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hv_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hv_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hv_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hv_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hv_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hv_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hv_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hv_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hv_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hv_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hv_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hv_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hv_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hv_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vh_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vh_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vh_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vh_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vh_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vh_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vh_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vh_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vh_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vh_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vh_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vh_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vh_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vh_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hh_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hh_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hh_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hh_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hh_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hh_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hh_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hh_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hh_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hh_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hh_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hh_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hh_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hh_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vv_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vv_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vv_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vv_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vv_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vv_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vv_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vv_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vv_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vv_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vv_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vv_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vv_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vv_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hv_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hv_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_hv_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hv_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_hv_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hv_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_hv_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hv_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_hv_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hv_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_hv_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hv_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_hv_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_hv_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vh_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vh_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ap_vh_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vh_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ap_vh_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vh_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ap_vh_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vh_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ap_vh_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vh_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ap_vh_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vh_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_ap_vh_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ap_vh_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_hh_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_hh_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_hh_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_hh_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_hh_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_hh_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_hh_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_hh_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_hh_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_hh_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_hh_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_hh_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_hh_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_hh_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_vv_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_vv_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_vv_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_vv_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_vv_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_vv_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_vv_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_vv_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_vv_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_vv_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_vv_1.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_vv_1.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_vv_1.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_vv_1.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_hh_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_hh_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_hh_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_hh_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_hh_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_hh_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_hh_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_hh_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_hh_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_hh_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_hh_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_hh_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_hh_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_hh_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_vv_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_vv_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_vv_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_vv_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_vv_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_vv_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_vv_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_vv_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_vv_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_vv_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_vv_2.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_vv_2.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_vv_2.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_vv_2.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_hh_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_hh_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_hh_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_hh_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_hh_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_hh_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_hh_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_hh_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_hh_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_hh_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_hh_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_hh_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_hh_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_hh_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_vv_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_vv_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_wv_vv_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_vv_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_wv_vv_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_vv_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_wv_vv_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_vv_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_wv_vv_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_vv_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_wv_vv_3.6.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_vv_3.6.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 6)"}, {"cal_pulse_wv_vv_3.7.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_wv_vv_3.7.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 7)"}, {"cal_pulse_ws_hh_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_hh_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_hh_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_hh_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_hh_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_hh_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_hh_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_hh_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_hh_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_hh_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_vv_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_vv_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_vv_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_vv_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_vv_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_vv_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_vv_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_vv_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_vv_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_vv_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_hh_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_hh_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_hh_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_hh_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_hh_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_hh_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_hh_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_hh_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_hh_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_hh_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_vv_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_vv_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_vv_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_vv_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_vv_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_vv_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_vv_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_vv_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_vv_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_vv_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_hh_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_hh_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_hh_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_hh_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_hh_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_hh_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_hh_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_hh_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_hh_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_hh_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_vv_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_vv_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_ws_vv_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_vv_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_ws_vv_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_vv_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_ws_vv_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_vv_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_ws_vv_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_ws_vv_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_hh_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_hh_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_hh_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_hh_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_hh_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_hh_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_hh_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_hh_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_hh_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_hh_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_vv_1.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_vv_1.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_vv_1.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_vv_1.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_vv_1.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_vv_1.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_vv_1.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_vv_1.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_vv_1.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_vv_1.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_hh_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_hh_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_hh_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_hh_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_hh_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_hh_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_hh_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_hh_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_hh_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_hh_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_vv_2.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_vv_2.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_vv_2.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_vv_2.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_vv_2.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_vv_2.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_vv_2.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_vv_2.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_vv_2.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_vv_2.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_hh_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_hh_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_hh_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_hh_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_hh_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_hh_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_hh_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_hh_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_hh_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_hh_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_vv_3.1.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_vv_3.1.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 1)"}, {"cal_pulse_gm_vv_3.2.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_vv_3.2.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 2)"}, {"cal_pulse_gm_vv_3.3.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_vv_3.3.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 3)"}, {"cal_pulse_gm_vv_3.4.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_vv_3.4.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 4)"}, {"cal_pulse_gm_vv_3.5.nom_amplitude", e_tid_float, NULL, 4, "32", "Nominal amplitude (ax,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"cal_pulse_gm_vv_3.5.nom_phase", e_tid_float, "cycles", 4, "32", "Nominal value of phase (fx,n,nom) for antenna row 1 to antenna row 32 (where x is the pulse number) (record 5)"}, {"nom_pulse_im.1.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 1)"}, {"nom_pulse_im.1.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 1)"}, {"nom_pulse_im.1.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 1)"}, {"nom_pulse_im.2.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 2)"}, {"nom_pulse_im.2.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 2)"}, {"nom_pulse_im.2.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 2)"}, {"nom_pulse_im.3.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 3)"}, {"nom_pulse_im.3.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 3)"}, {"nom_pulse_im.3.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 3)"}, {"nom_pulse_im.4.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 4)"}, {"nom_pulse_im.4.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 4)"}, {"nom_pulse_im.4.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 4)"}, {"nom_pulse_im.5.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 5)"}, {"nom_pulse_im.5.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 5)"}, {"nom_pulse_im.5.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 5)"}, {"nom_pulse_im.6.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 6)"}, {"nom_pulse_im.6.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 6)"}, {"nom_pulse_im.6.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 6)"}, {"nom_pulse_im.7.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 7)"}, {"nom_pulse_im.7.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 7)"}, {"nom_pulse_im.7.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 7)"}, {"nom_pulse_ap.1.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 1)"}, {"nom_pulse_ap.1.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 1)"}, {"nom_pulse_ap.1.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 1)"}, {"nom_pulse_ap.2.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 2)"}, {"nom_pulse_ap.2.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 2)"}, {"nom_pulse_ap.2.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 2)"}, {"nom_pulse_ap.3.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 3)"}, {"nom_pulse_ap.3.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 3)"}, {"nom_pulse_ap.3.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 3)"}, {"nom_pulse_ap.4.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 4)"}, {"nom_pulse_ap.4.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 4)"}, {"nom_pulse_ap.4.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 4)"}, {"nom_pulse_ap.5.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 5)"}, {"nom_pulse_ap.5.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 5)"}, {"nom_pulse_ap.5.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 5)"}, {"nom_pulse_ap.6.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 6)"}, {"nom_pulse_ap.6.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 6)"}, {"nom_pulse_ap.6.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 6)"}, {"nom_pulse_ap.7.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 7)"}, {"nom_pulse_ap.7.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 7)"}, {"nom_pulse_ap.7.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 7)"}, {"nom_pulse_wv.1.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 1)"}, {"nom_pulse_wv.1.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 1)"}, {"nom_pulse_wv.1.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 1)"}, {"nom_pulse_wv.2.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 2)"}, {"nom_pulse_wv.2.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 2)"}, {"nom_pulse_wv.2.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 2)"}, {"nom_pulse_wv.3.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 3)"}, {"nom_pulse_wv.3.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 3)"}, {"nom_pulse_wv.3.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 3)"}, {"nom_pulse_wv.4.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 4)"}, {"nom_pulse_wv.4.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 4)"}, {"nom_pulse_wv.4.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 4)"}, {"nom_pulse_wv.5.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 5)"}, {"nom_pulse_wv.5.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 5)"}, {"nom_pulse_wv.5.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 5)"}, {"nom_pulse_wv.6.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 6)"}, {"nom_pulse_wv.6.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 6)"}, {"nom_pulse_wv.6.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 6)"}, {"nom_pulse_wv.7.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 7)"}, {"nom_pulse_wv.7.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 7)"}, {"nom_pulse_wv.7.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 7)"}, {"nom_pulse_ws.1.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 1)"}, {"nom_pulse_ws.1.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 1)"}, {"nom_pulse_ws.1.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 1)"}, {"nom_pulse_ws.2.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 2)"}, {"nom_pulse_ws.2.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 2)"}, {"nom_pulse_ws.2.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 2)"}, {"nom_pulse_ws.3.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 3)"}, {"nom_pulse_ws.3.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 3)"}, {"nom_pulse_ws.3.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 3)"}, {"nom_pulse_ws.4.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 4)"}, {"nom_pulse_ws.4.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 4)"}, {"nom_pulse_ws.4.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 4)"}, {"nom_pulse_ws.5.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 5)"}, {"nom_pulse_ws.5.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 5)"}, {"nom_pulse_ws.5.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 5)"}, {"nom_pulse_gm.1.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 1)"}, {"nom_pulse_gm.1.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 1)"}, {"nom_pulse_gm.1.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 1)"}, {"nom_pulse_gm.2.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 2)"}, {"nom_pulse_gm.2.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 2)"}, {"nom_pulse_gm.2.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 2)"}, {"nom_pulse_gm.3.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 3)"}, {"nom_pulse_gm.3.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 3)"}, {"nom_pulse_gm.3.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 3)"}, {"nom_pulse_gm.4.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 4)"}, {"nom_pulse_gm.4.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 4)"}, {"nom_pulse_gm.4.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 4)"}, {"nom_pulse_gm.5.pulse_amp_coeff", e_tid_float, "-, s-1, s-2, s-3", 4, "4", "4 pulse amplitude coefficients (record 5)"}, {"nom_pulse_gm.5.pulse_phs_coeff", e_tid_float, "cyclesHz,Hz/s,Hz/s2", 4, "4", "4 pulse phase coefficients (record 5)"}, {"nom_pulse_gm.5.pulse_duration", e_tid_float, "s", 4, "1", "Nominal pulse duration (record 5)"}, {"az_pattern", e_tid_float, "dB", 4, "101", "2 way antenna azimuth pattern(pattern values are from beam center - 0.25 deg to beam center + 0.25 deg. in 0.005 degree steps. TBC by ESA)"}, {"range_gate_bias", e_tid_float, "s", 4, "1", "Range Gate bias"}, {"adc_lut_i", e_tid_float, NULL, 4, "255", "Look Up Table for ADC Characterization (I Channel)Contains 255 normalized amplitude levels corresponding to voltage thresholds. First value in LUT is for -127, last value is for +127. Format as is given in PO-TN-MMS-SR-0248."}, {"adc_lut_q", e_tid_float, NULL, 4, "255", "Look Up Table for ADC Characterization (Q Channel)Contains 255 normalized amplitude levels corresponding to voltage thresholds. First value in LUT is for -127, last value is for +127. Format as is given in PO-TN-MMS-SR-0248."}, {"spare_1", e_tid_spare, NULL, 60, "1", "Spare"}, {"full8_lut_i", e_tid_float, NULL, 4, "256", "Reconstruction Look Up Table for Full 8-bit Quantization (I Channel)Contains normalized amplitude levels corresponding to sample codewords. First value in LUT is for codeword 0, last value is for +255 (binary offset format). Format as is given in PO-TN-MM"}, {"full8_lut_q", e_tid_float, NULL, 4, "256", "Reconstruction Look Up Table for Full 8-bit Quantization (Q Channel)Contains normalized amplitude levels corresponding to sample codewords. First value in LUT is for codeword 0, last value is for +255 (binary- offset format). Format as is given in PO-TN-M"}, {"fbaq4_lut_i", e_tid_float, NULL, 4, "4096", "Reconstruction Look Up Table for FBAQ 4-bit Quantization (I Channel)Gives 4096 normalized amplitude reconstruction levels which include ADC correction. Format as is given in PO-TN-MMS-SR-0248."}, {"fbaq3_lut_i", e_tid_float, NULL, 4, "2048", "Reconstruction Look Up Table for FBAQ 3-bit Quantization (I Channel)Gives 2048 normalized amplitude reconstruction levels which include ADC correction. Format as is given in PO-TN-MMS-SR-0248."}, {"fbaq2_lut_i", e_tid_float, NULL, 4, "1024", "Reconstruction Look Up Table for FBAQ 2-bit Quantization (I Channel)Gives 1024 normalized amplitude reconstruction levels which include ADC correction. Format as is given in PO-TN-MMS-SR-0248."}, {"fbaq4_lut_q", e_tid_float, NULL, 4, "4096", "Reconstruction Look Up Table for FBAQ 4-bit Quantization (Q Channel)Gives 4096 normalized amplitude reconstruction levels which include ADC correction. Format as is given in PO-TN-MMS-SR-0248."}, {"fbaq3_lut_q", e_tid_float, NULL, 4, "2048", "Reconstruction Look Up Table for FBAQ 3-bit Quantization (Q Channel)Gives 2048 normalized amplitude reconstruction levels which include ADC correction. Format as is given in PO-TN-MMS-SR-0248."}, {"fbaq2_lut_q", e_tid_float, NULL, 4, "1024", "Reconstruction Look Up Table for FBAQ 2-bit Quantization (Q Channel)Gives 1024 normalized amplitude reconstruction levels which include ADC correction. Format as is given in PO-TN-MMS-SR-0248."}, {"fbaq4_no_adc", e_tid_float, "values from-127 to +127", 4, "4096", "Reconstruction Look Up Table for FBAQ 4-bit Quantization (no ADC)This is the FBAQ reconstruction LUT which does not have ADC correction incorporated into it. It gives 4096 reconstruction levels which decodes FBAQ codewords to floating point values on the"}, {"fbaq3_no_adc", e_tid_float, "values from-127 to +127", 4, "2048", "Reconstruction Look Up Table for FBAQ 3-bit Quantization (no ADC)This is the FBAQ reconstruction LUT which does not have ADC correction incorporated into it. It gives 2048 reconstruction levels which decodes FBAQ codewords to floating point values on the"}, {"fbaq2_no_adc", e_tid_float, "values from-127 to +127-", 4, "1024", "Reconstruction Look Up Table for FBAQ 2-bit Quantization (No ADC)This is the FBAQ reconstruction LUT which does not have ADC correction incorporated into it. It gives 1024 reconstruction levels which decodes FBAQ codewords to floating point values on the"}, {"sm_lut_i", e_tid_float, NULL, 4, "16", "Reconstruction Look Up Table for Sign + Magnitude Quantization (I Channel)Contains normalized amplitude reconstruction levels corresponding to sample codewords. First value in LUT is for threshold -7, last value is for threshold +7. Format as is given in"}, {"sm_lut_q", e_tid_float, NULL, 4, "16", "Reconstruction Look Up Table for Sign + Magnitude Quantization (Q Channel)Contains normalized amplitude reconstruction levels corresponding to sample codewords. First value in LUT is for threshold -7, last value is for threshold +7. Format as is given in"}, {"data_config_im.echo_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for echo samples FBAQ, S+MØ, NONE"}, {"data_config_im.echo_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for echo samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_im.echo_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to echo samples? (1=yes, 0=no)"}, {"data_config_im.init_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for initial calibration samples FBAQ, S+MØ, NONE"}, {"data_config_im.init_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for initial calibration samples8/4, 8/3, 8/2, 8/8"}, {"data_config_im.init_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to initial calibration samples? (1=yes, 0=no)"}, {"data_config_im.per_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for periodic calibration samples FBAQ, S+MØ, NONE"}, {"data_config_im.per_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for periodic calibration samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_im.per_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to periodic calibration samples? (1=yes, 0=no)"}, {"data_config_im.noise_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for noise samples FBAQ, S+MØ, NONE"}, {"data_config_im.noise_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for noise samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_im.noise_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to noise samples? (1=yes, 0=no)"}, {"data_config_ap.echo_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for echo samples FBAQ, S+MØ, NONE"}, {"data_config_ap.echo_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for echo samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_ap.echo_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to echo samples? (1=yes, 0=no)"}, {"data_config_ap.init_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for initial calibration samples FBAQ, S+MØ, NONE"}, {"data_config_ap.init_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for initial calibration samples8/4, 8/3, 8/2, 8/8"}, {"data_config_ap.init_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to initial calibration samples? (1=yes, 0=no)"}, {"data_config_ap.per_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for periodic calibration samples FBAQ, S+MØ, NONE"}, {"data_config_ap.per_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for periodic calibration samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_ap.per_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to periodic calibration samples? (1=yes, 0=no)"}, {"data_config_ap.noise_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for noise samples FBAQ, S+MØ, NONE"}, {"data_config_ap.noise_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for noise samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_ap.noise_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to noise samples? (1=yes, 0=no)"}, {"data_config_ws.echo_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for echo samples FBAQ, S+MØ, NONE"}, {"data_config_ws.echo_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for echo samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_ws.echo_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to echo samples? (1=yes, 0=no)"}, {"data_config_ws.init_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for initial calibration samples FBAQ, S+MØ, NONE"}, {"data_config_ws.init_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for initial calibration samples8/4, 8/3, 8/2, 8/8"}, {"data_config_ws.init_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to initial calibration samples? (1=yes, 0=no)"}, {"data_config_ws.per_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for periodic calibration samples FBAQ, S+MØ, NONE"}, {"data_config_ws.per_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for periodic calibration samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_ws.per_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to periodic calibration samples? (1=yes, 0=no)"}, {"data_config_ws.noise_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for noise samples FBAQ, S+MØ, NONE"}, {"data_config_ws.noise_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for noise samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_ws.noise_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to noise samples? (1=yes, 0=no)"}, {"data_config_gm.echo_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for echo samples FBAQ, S+MØ, NONE"}, {"data_config_gm.echo_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for echo samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_gm.echo_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to echo samples? (1=yes, 0=no)"}, {"data_config_gm.init_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for initial calibration samples FBAQ, S+MØ, NONE"}, {"data_config_gm.init_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for initial calibration samples8/4, 8/3, 8/2, 8/8"}, {"data_config_gm.init_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to initial calibration samples? (1=yes, 0=no)"}, {"data_config_gm.per_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for periodic calibration samples FBAQ, S+MØ, NONE"}, {"data_config_gm.per_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for periodic calibration samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_gm.per_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to periodic calibration samples? (1=yes, 0=no)"}, {"data_config_gm.noise_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for noise samples FBAQ, S+MØ, NONE"}, {"data_config_gm.noise_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for noise samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_gm.noise_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to noise samples? (1=yes, 0=no)"}, {"data_config_wv.echo_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for echo samples FBAQ, S+MØ, NONE"}, {"data_config_wv.echo_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for echo samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_wv.echo_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to echo samples? (1=yes, 0=no)"}, {"data_config_wv.init_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for initial calibration samples FBAQ, S+MØ, NONE"}, {"data_config_wv.init_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for initial calibration samples8/4, 8/3, 8/2, 8/8"}, {"data_config_wv.init_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to initial calibration samples? (1=yes, 0=no)"}, {"data_config_wv.per_cal_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for periodic calibration samples FBAQ, S+MØ, NONE"}, {"data_config_wv.per_cal_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for periodic calibration samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_wv.per_cal_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to periodic calibration samples? (1=yes, 0=no)"}, {"data_config_wv.noise_comp_method", e_tid_string, "ascii", 4, "1", "Compression Method used for noise samples FBAQ, S+MØ, NONE"}, {"data_config_wv.noise_comp_ratio", e_tid_string, "ascii", 3, "1", "Compression Ratio for noise samples: 8/4, 8/3, 8/2, 8/8"}, {"data_config_wv.noise_resamp_flag", e_tid_uchar, "flag", 1, "1", "Resampling applied to noise samples? (1=yes, 0=no)"}, {"swath_config_im.num_samp_windows_echo", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for echo samples, initial calibration samples (from beam 1 (IS1 or SS1) to beam 7 (IS7))"}, {"swath_config_im.num_samp_windows_init_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for initial calibration samples (from beam 1 to beam 7)"}, {"swath_config_im.num_samp_windows_per_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for periodic calibration samples (from beam 1 to beam 7)"}, {"swath_config_im.num_samp_windows_noise", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for noise samples (from beam 1 to beam 7)"}, {"swath_config_im.resample_factor", e_tid_float, NULL, 4, "7", "Resampling factor (beam 1 to beam 7)"}, {"swath_config_ap.num_samp_windows_echo", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for echo samples, initial calibration samples (from beam 1 (IS1 or SS1) to beam 7 (IS7))"}, {"swath_config_ap.num_samp_windows_init_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for initial calibration samples (from beam 1 to beam 7)"}, {"swath_config_ap.num_samp_windows_per_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for periodic calibration samples (from beam 1 to beam 7)"}, {"swath_config_ap.num_samp_windows_noise", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for noise samples (from beam 1 to beam 7)"}, {"swath_config_ap.resample_factor", e_tid_float, NULL, 4, "7", "Resampling factor (beam 1 to beam 7)"}, {"swath_config_ws.num_samp_windows_echo", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for echo samples, initial calibration samples (from beam 1 (IS1 or SS1) to beam 7 (IS7))"}, {"swath_config_ws.num_samp_windows_init_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for initial calibration samples (from beam 1 to beam 7)"}, {"swath_config_ws.num_samp_windows_per_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for periodic calibration samples (from beam 1 to beam 7)"}, {"swath_config_ws.num_samp_windows_noise", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for noise samples (from beam 1 to beam 7)"}, {"swath_config_ws.resample_factor", e_tid_float, NULL, 4, "7", "Resampling factor (beam 1 to beam 7)"}, {"swath_config_gm.num_samp_windows_echo", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for echo samples, initial calibration samples (from beam 1 (IS1 or SS1) to beam 7 (IS7))"}, {"swath_config_gm.num_samp_windows_init_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for initial calibration samples (from beam 1 to beam 7)"}, {"swath_config_gm.num_samp_windows_per_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for periodic calibration samples (from beam 1 to beam 7)"}, {"swath_config_gm.num_samp_windows_noise", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for noise samples (from beam 1 to beam 7)"}, {"swath_config_gm.resample_factor", e_tid_float, NULL, 4, "7", "Resampling factor (beam 1 to beam 7)"}, {"swath_config_wv.num_samp_windows_echo", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for echo samples, initial calibration samples (from beam 1 (IS1 or SS1) to beam 7 (IS7))"}, {"swath_config_wv.num_samp_windows_init_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for initial calibration samples (from beam 1 to beam 7)"}, {"swath_config_wv.num_samp_windows_per_cal", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for periodic calibration samples (from beam 1 to beam 7)"}, {"swath_config_wv.num_samp_windows_noise", e_tid_ushort, NULL, 2, "7", "Number of sample windows per source packet for noise samples (from beam 1 to beam 7)"}, {"swath_config_wv.resample_factor", e_tid_float, NULL, 4, "7", "Resampling factor (beam 1 to beam 7)"}, {"per_cal_widows_ec", e_tid_ushort, NULL, 2, "1", "Number of periodic calibration sample windows per source packet for External Characterization mode"}, {"per_cal_windows_ms", e_tid_ushort, NULL, 2, "1", "Number of periodic calibration sample windows per source packet for Module Stepping mode"}, {"swath_id_im.swath_num", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_im.beam_set_num", e_tid_ushort, NULL, 2, "7", "Antenna Beam Set numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_ap.swath_num", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_ap.beam_set_num", e_tid_ushort, NULL, 2, "7", "Antenna Beam Set numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_ws.swath_num", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_ws.beam_set_num", e_tid_ushort, NULL, 2, "7", "Antenna Beam Set numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_gm.swath_num", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_gm.beam_set_num", e_tid_ushort, NULL, 2, "7", "Antenna Beam Set numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_wv.swath_num", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"swath_id_wv.beam_set_num", e_tid_ushort, NULL, 2, "7", "Antenna Beam Set numbers (IS1 to IS7 or SS1 to SS5)"}, {"init_cal_beam_set_wv", e_tid_ushort, NULL, 2, "1", "Beam Set number for Wave Mode initial calibration"}, {"beam_set_ec", e_tid_ushort, NULL, 2, "1", "Beam Set number for External Characterization Mode"}, {"beam_set_ms", e_tid_ushort, NULL, 2, "1", "Beam Set number for Module Stepping Mode"}, {"cal_seq", e_tid_ushort, NULL, 2, "32", "Calibration Row Sequence Table(32 numbers give the Row number sequence used during initial and periodic calibration)"}, {"timeline_im.swath_nums", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"timeline_im.m_values", e_tid_ushort, NULL, 2, "7", "M values (IS1 to IS7 or SS1 to SS5) M is the number of echo sampling PTIs in a cycle or subcycle"}, {"timeline_im.r_values", e_tid_ushort, NULL, 2, "7", "R values (IS1 to IS7 or SS1 to SS5) R is the rank (i.e., the number of PRI between transmitted pulse and return echo)"}, {"timeline_im.g_values", e_tid_ushort, NULL, 2, "7", "G values (IS1 to IS7 or SS1 to SS5) G is the number of cycles"}, {"timeline_ap.swath_nums", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"timeline_ap.m_values", e_tid_ushort, NULL, 2, "7", "M values (IS1 to IS7 or SS1 to SS5) M is the number of echo sampling PTIs in a cycle or subcycle"}, {"timeline_ap.r_values", e_tid_ushort, NULL, 2, "7", "R values (IS1 to IS7 or SS1 to SS5) R is the rank (i.e., the number of PRI between transmitted pulse and return echo)"}, {"timeline_ap.g_values", e_tid_ushort, NULL, 2, "7", "G values (IS1 to IS7 or SS1 to SS5) G is the number of cycles"}, {"timeline_ws.swath_nums", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"timeline_ws.m_values", e_tid_ushort, NULL, 2, "7", "M values (IS1 to IS7 or SS1 to SS5) M is the number of echo sampling PTIs in a cycle or subcycle"}, {"timeline_ws.r_values", e_tid_ushort, NULL, 2, "7", "R values (IS1 to IS7 or SS1 to SS5) R is the rank (i.e., the number of PRI between transmitted pulse and return echo)"}, {"timeline_ws.g_values", e_tid_ushort, NULL, 2, "7", "G values (IS1 to IS7 or SS1 to SS5) G is the number of cycles"}, {"timeline_gm.swath_nums", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"timeline_gm.m_values", e_tid_ushort, NULL, 2, "7", "M values (IS1 to IS7 or SS1 to SS5) M is the number of echo sampling PTIs in a cycle or subcycle"}, {"timeline_gm.r_values", e_tid_ushort, NULL, 2, "7", "R values (IS1 to IS7 or SS1 to SS5) R is the rank (i.e., the number of PRI between transmitted pulse and return echo)"}, {"timeline_gm.g_values", e_tid_ushort, NULL, 2, "7", "G values (IS1 to IS7 or SS1 to SS5) G is the number of cycles"}, {"timeline_wv.swath_nums", e_tid_ushort, NULL, 2, "7", "Swath numbers (IS1 to IS7 or SS1 to SS5)"}, {"timeline_wv.m_values", e_tid_ushort, NULL, 2, "7", "M values (IS1 to IS7 or SS1 to SS5) M is the number of echo sampling PTIs in a cycle or subcycle"}, {"timeline_wv.r_values", e_tid_ushort, NULL, 2, "7", "R values (IS1 to IS7 or SS1 to SS5) R is the rank (i.e., the number of PRI between transmitted pulse and return echo)"}, {"timeline_wv.g_values", e_tid_ushort, NULL, 2, "7", "G values (IS1 to IS7 or SS1 to SS5) G is the number of cycles"}, {"m_ec", e_tid_ushort, NULL, 2, "1", "M value (see field above) for External Characterization"}, {"spare_2", e_tid_spare, NULL, 64, "1", "Spare"}, {"ref_elev_angle_is1", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS1"}, {"ref_elev_angle_is2", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS2"}, {"ref_elev_angle_is3_ss2", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS3 / SS2"}, {"ref_elev_angle_is4_ss3", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS4 / SS3"}, {"ref_elev_angle_is5_ss4", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS5 / SS4"}, {"ref_elev_angle_is6_ss5", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS6 / SS5"}, {"ref_elev_angle_is7", e_tid_float, "deg.", 4, "1", "Reference elevation angle for IS7"}, {"ref_elev_angle_ss1", e_tid_float, "deg.", 4, "1", "Reference elevation angle for SS1"}, {"spare_3", e_tid_spare, NULL, 64, "1", "Spare"}, {"cal_loop_ref_is1", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS1(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_ref_is2", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS2(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_ref_is3_ss2", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS3/SS2(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_ref_is4_ss3", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS4/SS3(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_ref_is5_ss4", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS5/SS4(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_ref_is6_ss5", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS6/SS5(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_ref_is7", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for IS7(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_ref_iss1", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Swath Reference Elevation Angle for SS1(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_cen_is1", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS1(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_cen_is2", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS2(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_cen_is3_ss2", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS3/SS2(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_cen_is4_ss3", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS4/SS3(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_cen_is5_ss4", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS5/SS4(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_cen_is6_ss5", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS6/SS5(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, fo"}, {"cal_loop_cen_is7", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for IS7(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"cal_loop_cen_iss1", e_tid_float, NULL, 4, "128", "Calibration Loop Characterization Factors at the Center of Swath Elevation Angle for SS1(complex factor characterizing the path through the calibration loop and from the calibration coupler to the antenna face) 32 complex values for H polarization, follow"}, {"spare_4", e_tid_spare, NULL, 1024, "1", "Spare"} }; static const struct RecordDescriptor ASA_XCA_AX_GADS_asar_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Time of creation of this file"}, {"dsr_length", e_tid_uint, "bytes", 4, "1", "Length of this DSR in bytes"}, {"ext_cal_im_hh", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for IM mode, HH polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_im_vv", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for IM mode, VV polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_ap_hh", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for AP mode, HH polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_ap_vv", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for AP mode, VV polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_ap_hv", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for AP mode, HV polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_ap_vh", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for AP mode, VH polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_wv_hh", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for WV mode, HH polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_wv_vv", e_tid_float, NULL, 4, "7", "External Calibration scaling factors for WV mode, VV polar. (7 values from swath IS1 to IS7)"}, {"ext_cal_ws_hh", e_tid_float, NULL, 4, "1", "External Calibration scaling factors for WS mode, HH polar."}, {"ext_cal_ws_vv", e_tid_float, NULL, 4, "1", "External Calibration scaling factors for WS mode, VV polar."}, {"ext_cal_gm_hh", e_tid_float, NULL, 4, "1", "External Calibration scaling factors for GM mode, HH polar."}, {"ext_cal_gm_vv", e_tid_float, NULL, 4, "1", "External Calibration scaling factors for GM mode, VV polar."}, {"elev_ang_is1", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS1"}, {"elev_ang_is2", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS2"}, {"elev_ang_is3_ss2", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS3 / SS2"}, {"elev_ang_is4_ss3", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS4 / SS3"}, {"elev_ang_is5_ss4", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS5 / SS4"}, {"elev_ang_is6_ss5", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS6 / SS5"}, {"elev_ang_is7", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for IS7"}, {"elev_ang_ss1", e_tid_float, "deg.", 4, "1", "Center of swath elevation angle for SS1"}, {"pattern_is1", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS1 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_is2", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS2 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_is3_ss2", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS3 / SS2 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_is4_ss3", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS4 / SS3 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_is5_ss4", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS5 / SS4 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_is6_ss5", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS6 / SS5 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_is7", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for IS7 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps.)"}, {"pattern_ss1", e_tid_float, "dB", 4, "201", "Two-way Antenna Elevation Pattern Gain Table for SS1 (pattern is defined from Center of swath elevation angle - 5 deg. to Center of Swath elevation angle + 5 deg. in 0.05 degree steps. )"}, {"spare_1", e_tid_spare, NULL, 32, "1", "Spare"} }; static const struct RecordDescriptor ASA_XCH_AX_GADS_asar_rec_data[] = { {"dsr_time", e_tid_time, "MJD", 12, "1", "Time of characterization"}, {"dsr_length", e_tid_uint, "bytes", 4, "1", "Length of this DSR in bytes"}, {"complex_loop_factors", e_tid_float, NULL, 4, "128", "Complex Loop Paths Characterization Factors relative to free space (from External Characterization data). 64 complex (I,Q) values of gnp where n is the index of the row (1 to 32) and p is the index of the polarization (H=1, V=2) (TBC) Arranged H: 1 to 32, then V: 1-32)"}, {"pointing_error", e_tid_float, NULL, 4, "1", "Antenna pointing error DP1 (from External Characterization data)"}, {"spare_1", e_tid_spare, NULL, 64, "1", "Spare"} }; static const struct DatasetDescriptor ASA_APG_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"}, {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_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"}, {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_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"}, {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_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"}, {"MAIN_PROCESSING_PARAMS_ADS", "MAIN PROCESSING PARAMS ADS", ASAR_Main_ADSR_asar_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"}, {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"}, {"MDS1", "MDS1", ASAR_Image_MDSR_BP_asar_rec_data, "Measurement Data Set 1"}, {"MDS2", "MDS2", ASAR_Image_MDSR_BP_asar_rec_data, "Measurement Data Set 2"} }; static const struct DatasetDescriptor ASA_GM1_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"}, {"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"}, {"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"}, {"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"}, {"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"}, {"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"}, {"MDS1", "MDS1", ASAR_Image_MDSR_BP_asar_rec_data, "Measurement Data Set 1"} }; static const struct DatasetDescriptor ASA_WSM_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"}, {"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"}, {"GEOLOCATION_GRID_ADS", "GEOLOCATION GRID ADS", ASAR_Geo_Grid_ADSR_asar_rec_data, "Geolocation Grid ADSRs"}, {"MDS1", "MDS1", ASAR_Image_MDSR_BP_asar_rec_data, "Measurement Data Set 1"}, {"MDS2", "MDS2", ASAR_Image_MDSR_BP_asar_rec_data, "Measurement Data Set 2"} }; static const struct DatasetDescriptor ASA_WVI_1P_dataset_data[] = { {"SQ_ADS", "SQ ADS", ASAR_Wave_SQ_ADSR_asar_rec_data, "SQ ADSRs"}, {"GEOLOCATION_ADS", "GEOLOCATION ADS", ASAR_Wave_Geolocation_ADSR_asar_rec_data, "Wave Mode Geolocation ADS"}, {"PROCESSING_PARAMS_ADS", "PROCESSING PARAMS ADS", ASAR_Wave_Param_ADSR_asar_rec_data, "Wave Mode processing parameters"}, {"CROSS_SPECTRA_MDS", "CROSS SPECTRA MDS", ASAR_Spectra_MDSR_asar_rec_data, "Measurement Data Set containing spectra. 1 MDSR per spectra."}, {"SLC_IMAGETTE_MDS", "SLC IMAGETTE MDS", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_001", "SLC IMAGETTE MDS 001", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_002", "SLC IMAGETTE MDS 002", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_003", "SLC IMAGETTE MDS 003", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_004", "SLC IMAGETTE MDS 004", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_005", "SLC IMAGETTE MDS 005", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_006", "SLC IMAGETTE MDS 006", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_007", "SLC IMAGETTE MDS 007", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_008", "SLC IMAGETTE MDS 008", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_009", "SLC IMAGETTE MDS 009", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_010", "SLC IMAGETTE MDS 010", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_011", "SLC IMAGETTE MDS 011", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_012", "SLC IMAGETTE MDS 012", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_013", "SLC IMAGETTE MDS 013", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_014", "SLC IMAGETTE MDS 014", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_015", "SLC IMAGETTE MDS 015", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_016", "SLC IMAGETTE MDS 016", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_017", "SLC IMAGETTE MDS 017", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_018", "SLC IMAGETTE MDS 018", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_019", "SLC IMAGETTE MDS 019", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_020", "SLC IMAGETTE MDS 020", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_021", "SLC IMAGETTE MDS 021", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_022", "SLC IMAGETTE MDS 022", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_023", "SLC IMAGETTE MDS 023", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_024", "SLC IMAGETTE MDS 024", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_025", "SLC IMAGETTE MDS 025", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_026", "SLC IMAGETTE MDS 026", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_027", "SLC IMAGETTE MDS 027", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_028", "SLC IMAGETTE MDS 028", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_029", "SLC IMAGETTE MDS 029", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_030", "SLC IMAGETTE MDS 030", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_031", "SLC IMAGETTE MDS 031", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_032", "SLC IMAGETTE MDS 032", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_033", "SLC IMAGETTE MDS 033", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_034", "SLC IMAGETTE MDS 034", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_035", "SLC IMAGETTE MDS 035", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_036", "SLC IMAGETTE MDS 036", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_037", "SLC IMAGETTE MDS 037", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_038", "SLC IMAGETTE MDS 038", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_039", "SLC IMAGETTE MDS 039", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_040", "SLC IMAGETTE MDS 040", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_041", "SLC IMAGETTE MDS 041", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_042", "SLC IMAGETTE MDS 042", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_043", "SLC IMAGETTE MDS 043", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_044", "SLC IMAGETTE MDS 044", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_045", "SLC IMAGETTE MDS 045", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_046", "SLC IMAGETTE MDS 046", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_047", "SLC IMAGETTE MDS 047", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_048", "SLC IMAGETTE MDS 048", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_049", "SLC IMAGETTE MDS 049", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_050", "SLC IMAGETTE MDS 050", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_051", "SLC IMAGETTE MDS 051", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_052", "SLC IMAGETTE MDS 052", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_053", "SLC IMAGETTE MDS 053", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_054", "SLC IMAGETTE MDS 054", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_055", "SLC IMAGETTE MDS 055", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_056", "SLC IMAGETTE MDS 056", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_057", "SLC IMAGETTE MDS 057", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_058", "SLC IMAGETTE MDS 058", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_059", "SLC IMAGETTE MDS 059", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_060", "SLC IMAGETTE MDS 060", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_061", "SLC IMAGETTE MDS 061", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_062", "SLC IMAGETTE MDS 062", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_063", "SLC IMAGETTE MDS 063", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_064", "SLC IMAGETTE MDS 064", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_065", "SLC IMAGETTE MDS 065", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_066", "SLC IMAGETTE MDS 066", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_067", "SLC IMAGETTE MDS 067", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_068", "SLC IMAGETTE MDS 068", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_069", "SLC IMAGETTE MDS 069", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_070", "SLC IMAGETTE MDS 070", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_071", "SLC IMAGETTE MDS 071", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_072", "SLC IMAGETTE MDS 072", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_073", "SLC IMAGETTE MDS 073", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_074", "SLC IMAGETTE MDS 074", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_075", "SLC IMAGETTE MDS 075", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_076", "SLC IMAGETTE MDS 076", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_077", "SLC IMAGETTE MDS 077", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_078", "SLC IMAGETTE MDS 078", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_079", "SLC IMAGETTE MDS 079", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_080", "SLC IMAGETTE MDS 080", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_081", "SLC IMAGETTE MDS 081", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_082", "SLC IMAGETTE MDS 082", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_083", "SLC IMAGETTE MDS 083", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_084", "SLC IMAGETTE MDS 084", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_085", "SLC IMAGETTE MDS 085", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_086", "SLC IMAGETTE MDS 086", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_087", "SLC IMAGETTE MDS 087", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_088", "SLC IMAGETTE MDS 088", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_089", "SLC IMAGETTE MDS 089", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_090", "SLC IMAGETTE MDS 090", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_091", "SLC IMAGETTE MDS 091", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_092", "SLC IMAGETTE MDS 092", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_093", "SLC IMAGETTE MDS 093", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_094", "SLC IMAGETTE MDS 094", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_095", "SLC IMAGETTE MDS 095", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_096", "SLC IMAGETTE MDS 096", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_097", "SLC IMAGETTE MDS 097", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_098", "SLC IMAGETTE MDS 098", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_099", "SLC IMAGETTE MDS 099", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_100", "SLC IMAGETTE MDS 100", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_101", "SLC IMAGETTE MDS 101", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_102", "SLC IMAGETTE MDS 102", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_103", "SLC IMAGETTE MDS 103", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_104", "SLC IMAGETTE MDS 104", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_105", "SLC IMAGETTE MDS 105", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_106", "SLC IMAGETTE MDS 106", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_107", "SLC IMAGETTE MDS 107", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_108", "SLC IMAGETTE MDS 108", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_109", "SLC IMAGETTE MDS 109", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_110", "SLC IMAGETTE MDS 110", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_111", "SLC IMAGETTE MDS 111", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_112", "SLC IMAGETTE MDS 112", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_113", "SLC IMAGETTE MDS 113", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_114", "SLC IMAGETTE MDS 114", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_115", "SLC IMAGETTE MDS 115", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_116", "SLC IMAGETTE MDS 116", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_117", "SLC IMAGETTE MDS 117", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_118", "SLC IMAGETTE MDS 118", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_119", "SLC IMAGETTE MDS 119", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_120", "SLC IMAGETTE MDS 120", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_121", "SLC IMAGETTE MDS 121", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_122", "SLC IMAGETTE MDS 122", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_123", "SLC IMAGETTE MDS 123", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_124", "SLC IMAGETTE MDS 124", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_125", "SLC IMAGETTE MDS 125", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_126", "SLC IMAGETTE MDS 126", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_127", "SLC IMAGETTE MDS 127", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_128", "SLC IMAGETTE MDS 128", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_129", "SLC IMAGETTE MDS 129", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_130", "SLC IMAGETTE MDS 130", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_131", "SLC IMAGETTE MDS 131", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_132", "SLC IMAGETTE MDS 132", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_133", "SLC IMAGETTE MDS 133", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_134", "SLC IMAGETTE MDS 134", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_135", "SLC IMAGETTE MDS 135", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_136", "SLC IMAGETTE MDS 136", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_137", "SLC IMAGETTE MDS 137", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_138", "SLC IMAGETTE MDS 138", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_139", "SLC IMAGETTE MDS 139", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_140", "SLC IMAGETTE MDS 140", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_141", "SLC IMAGETTE MDS 141", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_142", "SLC IMAGETTE MDS 142", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_143", "SLC IMAGETTE MDS 143", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_144", "SLC IMAGETTE MDS 144", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_145", "SLC IMAGETTE MDS 145", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_146", "SLC IMAGETTE MDS 146", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_147", "SLC IMAGETTE MDS 147", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_148", "SLC IMAGETTE MDS 148", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_149", "SLC IMAGETTE MDS 149", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_150", "SLC IMAGETTE MDS 150", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_151", "SLC IMAGETTE MDS 151", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_152", "SLC IMAGETTE MDS 152", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_153", "SLC IMAGETTE MDS 153", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_154", "SLC IMAGETTE MDS 154", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_155", "SLC IMAGETTE MDS 155", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_156", "SLC IMAGETTE MDS 156", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_157", "SLC IMAGETTE MDS 157", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_158", "SLC IMAGETTE MDS 158", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_159", "SLC IMAGETTE MDS 159", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_160", "SLC IMAGETTE MDS 160", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_161", "SLC IMAGETTE MDS 161", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_162", "SLC IMAGETTE MDS 162", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_163", "SLC IMAGETTE MDS 163", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_164", "SLC IMAGETTE MDS 164", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_165", "SLC IMAGETTE MDS 165", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_166", "SLC IMAGETTE MDS 166", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_167", "SLC IMAGETTE MDS 167", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_168", "SLC IMAGETTE MDS 168", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_169", "SLC IMAGETTE MDS 169", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_170", "SLC IMAGETTE MDS 170", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_171", "SLC IMAGETTE MDS 171", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_172", "SLC IMAGETTE MDS 172", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_173", "SLC IMAGETTE MDS 173", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_174", "SLC IMAGETTE MDS 174", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_175", "SLC IMAGETTE MDS 175", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_176", "SLC IMAGETTE MDS 176", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_177", "SLC IMAGETTE MDS 177", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_178", "SLC IMAGETTE MDS 178", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_179", "SLC IMAGETTE MDS 179", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_180", "SLC IMAGETTE MDS 180", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_181", "SLC IMAGETTE MDS 181", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_182", "SLC IMAGETTE MDS 182", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_183", "SLC IMAGETTE MDS 183", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_184", "SLC IMAGETTE MDS 184", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_185", "SLC IMAGETTE MDS 185", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_186", "SLC IMAGETTE MDS 186", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_187", "SLC IMAGETTE MDS 187", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_188", "SLC IMAGETTE MDS 188", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_189", "SLC IMAGETTE MDS 189", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_190", "SLC IMAGETTE MDS 190", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_191", "SLC IMAGETTE MDS 191", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_192", "SLC IMAGETTE MDS 192", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_193", "SLC IMAGETTE MDS 193", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_194", "SLC IMAGETTE MDS 194", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_195", "SLC IMAGETTE MDS 195", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_196", "SLC IMAGETTE MDS 196", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_197", "SLC IMAGETTE MDS 197", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_198", "SLC IMAGETTE MDS 198", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_199", "SLC IMAGETTE MDS 199", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_200", "SLC IMAGETTE MDS 200", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_201", "SLC IMAGETTE MDS 201", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_202", "SLC IMAGETTE MDS 202", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_203", "SLC IMAGETTE MDS 203", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_204", "SLC IMAGETTE MDS 204", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_205", "SLC IMAGETTE MDS 205", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_206", "SLC IMAGETTE MDS 206", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_207", "SLC IMAGETTE MDS 207", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_208", "SLC IMAGETTE MDS 208", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_209", "SLC IMAGETTE MDS 209", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_210", "SLC IMAGETTE MDS 210", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_211", "SLC IMAGETTE MDS 211", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_212", "SLC IMAGETTE MDS 212", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_213", "SLC IMAGETTE MDS 213", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_214", "SLC IMAGETTE MDS 214", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_215", "SLC IMAGETTE MDS 215", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_216", "SLC IMAGETTE MDS 216", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_217", "SLC IMAGETTE MDS 217", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_218", "SLC IMAGETTE MDS 218", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_219", "SLC IMAGETTE MDS 219", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_220", "SLC IMAGETTE MDS 220", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_221", "SLC IMAGETTE MDS 221", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_222", "SLC IMAGETTE MDS 222", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_223", "SLC IMAGETTE MDS 223", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_224", "SLC IMAGETTE MDS 224", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_225", "SLC IMAGETTE MDS 225", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_226", "SLC IMAGETTE MDS 226", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_227", "SLC IMAGETTE MDS 227", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_228", "SLC IMAGETTE MDS 228", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_229", "SLC IMAGETTE MDS 229", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_230", "SLC IMAGETTE MDS 230", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_231", "SLC IMAGETTE MDS 231", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_232", "SLC IMAGETTE MDS 232", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_233", "SLC IMAGETTE MDS 233", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_234", "SLC IMAGETTE MDS 234", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_235", "SLC IMAGETTE MDS 235", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_236", "SLC IMAGETTE MDS 236", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_237", "SLC IMAGETTE MDS 237", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_238", "SLC IMAGETTE MDS 238", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_239", "SLC IMAGETTE MDS 239", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_240", "SLC IMAGETTE MDS 240", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_241", "SLC IMAGETTE MDS 241", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_242", "SLC IMAGETTE MDS 242", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_243", "SLC IMAGETTE MDS 243", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_244", "SLC IMAGETTE MDS 244", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_245", "SLC IMAGETTE MDS 245", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_246", "SLC IMAGETTE MDS 246", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_247", "SLC IMAGETTE MDS 247", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_248", "SLC IMAGETTE MDS 248", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_249", "SLC IMAGETTE MDS 249", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_250", "SLC IMAGETTE MDS 250", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_251", "SLC IMAGETTE MDS 251", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_252", "SLC IMAGETTE MDS 252", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_253", "SLC IMAGETTE MDS 253", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_254", "SLC IMAGETTE MDS 254", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_255", "SLC IMAGETTE MDS 255", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_256", "SLC IMAGETTE MDS 256", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_257", "SLC IMAGETTE MDS 257", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_258", "SLC IMAGETTE MDS 258", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_259", "SLC IMAGETTE MDS 259", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_260", "SLC IMAGETTE MDS 260", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_261", "SLC IMAGETTE MDS 261", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_262", "SLC IMAGETTE MDS 262", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_263", "SLC IMAGETTE MDS 263", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_264", "SLC IMAGETTE MDS 264", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_265", "SLC IMAGETTE MDS 265", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_266", "SLC IMAGETTE MDS 266", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_267", "SLC IMAGETTE MDS 267", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_268", "SLC IMAGETTE MDS 268", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_269", "SLC IMAGETTE MDS 269", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_270", "SLC IMAGETTE MDS 270", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_271", "SLC IMAGETTE MDS 271", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_272", "SLC IMAGETTE MDS 272", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_273", "SLC IMAGETTE MDS 273", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_274", "SLC IMAGETTE MDS 274", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_275", "SLC IMAGETTE MDS 275", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_276", "SLC IMAGETTE MDS 276", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_277", "SLC IMAGETTE MDS 277", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_278", "SLC IMAGETTE MDS 278", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_279", "SLC IMAGETTE MDS 279", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_280", "SLC IMAGETTE MDS 280", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_281", "SLC IMAGETTE MDS 281", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_282", "SLC IMAGETTE MDS 282", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_283", "SLC IMAGETTE MDS 283", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_284", "SLC IMAGETTE MDS 284", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_285", "SLC IMAGETTE MDS 285", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_286", "SLC IMAGETTE MDS 286", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_287", "SLC IMAGETTE MDS 287", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_288", "SLC IMAGETTE MDS 288", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_289", "SLC IMAGETTE MDS 289", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_290", "SLC IMAGETTE MDS 290", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_291", "SLC IMAGETTE MDS 291", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_292", "SLC IMAGETTE MDS 292", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_293", "SLC IMAGETTE MDS 293", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_294", "SLC IMAGETTE MDS 294", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_295", "SLC IMAGETTE MDS 295", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_296", "SLC IMAGETTE MDS 296", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_297", "SLC IMAGETTE MDS 297", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_298", "SLC IMAGETTE MDS 298", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_299", "SLC IMAGETTE MDS 299", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_300", "SLC IMAGETTE MDS 300", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_301", "SLC IMAGETTE MDS 301", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_302", "SLC IMAGETTE MDS 302", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_303", "SLC IMAGETTE MDS 303", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_304", "SLC IMAGETTE MDS 304", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_305", "SLC IMAGETTE MDS 305", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_306", "SLC IMAGETTE MDS 306", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_307", "SLC IMAGETTE MDS 307", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_308", "SLC IMAGETTE MDS 308", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_309", "SLC IMAGETTE MDS 309", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_310", "SLC IMAGETTE MDS 310", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_311", "SLC IMAGETTE MDS 311", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_312", "SLC IMAGETTE MDS 312", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_313", "SLC IMAGETTE MDS 313", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_314", "SLC IMAGETTE MDS 314", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_315", "SLC IMAGETTE MDS 315", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_316", "SLC IMAGETTE MDS 316", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_317", "SLC IMAGETTE MDS 317", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_318", "SLC IMAGETTE MDS 318", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_319", "SLC IMAGETTE MDS 319", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_320", "SLC IMAGETTE MDS 320", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_321", "SLC IMAGETTE MDS 321", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_322", "SLC IMAGETTE MDS 322", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_323", "SLC IMAGETTE MDS 323", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_324", "SLC IMAGETTE MDS 324", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_325", "SLC IMAGETTE MDS 325", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_326", "SLC IMAGETTE MDS 326", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_327", "SLC IMAGETTE MDS 327", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_328", "SLC IMAGETTE MDS 328", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_329", "SLC IMAGETTE MDS 329", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_330", "SLC IMAGETTE MDS 330", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_331", "SLC IMAGETTE MDS 331", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_332", "SLC IMAGETTE MDS 332", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_333", "SLC IMAGETTE MDS 333", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_334", "SLC IMAGETTE MDS 334", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_335", "SLC IMAGETTE MDS 335", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_336", "SLC IMAGETTE MDS 336", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_337", "SLC IMAGETTE MDS 337", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_338", "SLC IMAGETTE MDS 338", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_339", "SLC IMAGETTE MDS 339", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_340", "SLC IMAGETTE MDS 340", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_341", "SLC IMAGETTE MDS 341", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_342", "SLC IMAGETTE MDS 342", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_343", "SLC IMAGETTE MDS 343", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_344", "SLC IMAGETTE MDS 344", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_345", "SLC IMAGETTE MDS 345", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_346", "SLC IMAGETTE MDS 346", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_347", "SLC IMAGETTE MDS 347", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_348", "SLC IMAGETTE MDS 348", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_349", "SLC IMAGETTE MDS 349", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_350", "SLC IMAGETTE MDS 350", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_351", "SLC IMAGETTE MDS 351", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_352", "SLC IMAGETTE MDS 352", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_353", "SLC IMAGETTE MDS 353", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_354", "SLC IMAGETTE MDS 354", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_355", "SLC IMAGETTE MDS 355", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_356", "SLC IMAGETTE MDS 356", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_357", "SLC IMAGETTE MDS 357", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_358", "SLC IMAGETTE MDS 358", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_359", "SLC IMAGETTE MDS 359", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_360", "SLC IMAGETTE MDS 360", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_361", "SLC IMAGETTE MDS 361", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_362", "SLC IMAGETTE MDS 362", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_363", "SLC IMAGETTE MDS 363", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_364", "SLC IMAGETTE MDS 364", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_365", "SLC IMAGETTE MDS 365", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_366", "SLC IMAGETTE MDS 366", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_367", "SLC IMAGETTE MDS 367", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_368", "SLC IMAGETTE MDS 368", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_369", "SLC IMAGETTE MDS 369", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_370", "SLC IMAGETTE MDS 370", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_371", "SLC IMAGETTE MDS 371", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_372", "SLC IMAGETTE MDS 372", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_373", "SLC IMAGETTE MDS 373", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_374", "SLC IMAGETTE MDS 374", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_375", "SLC IMAGETTE MDS 375", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_376", "SLC IMAGETTE MDS 376", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_377", "SLC IMAGETTE MDS 377", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_378", "SLC IMAGETTE MDS 378", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_379", "SLC IMAGETTE MDS 379", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_380", "SLC IMAGETTE MDS 380", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_381", "SLC IMAGETTE MDS 381", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_382", "SLC IMAGETTE MDS 382", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_383", "SLC IMAGETTE MDS 383", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_384", "SLC IMAGETTE MDS 384", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_385", "SLC IMAGETTE MDS 385", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_386", "SLC IMAGETTE MDS 386", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_387", "SLC IMAGETTE MDS 387", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_388", "SLC IMAGETTE MDS 388", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_389", "SLC IMAGETTE MDS 389", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_390", "SLC IMAGETTE MDS 390", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_391", "SLC IMAGETTE MDS 391", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_392", "SLC IMAGETTE MDS 392", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_393", "SLC IMAGETTE MDS 393", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_394", "SLC IMAGETTE MDS 394", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_395", "SLC IMAGETTE MDS 395", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_396", "SLC IMAGETTE MDS 396", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_397", "SLC IMAGETTE MDS 397", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_398", "SLC IMAGETTE MDS 398", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_399", "SLC IMAGETTE MDS 399", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"}, {"SLC_IMAGETTE_MDS_400", "SLC IMAGETTE MDS 400", ASAR_Image_MDSR_SLC_asar_rec_data, "Measurement Data Set for a single imagette (corresponds to one spectrum MDSR)"} }; static const struct DatasetDescriptor ASA_WVS_1P_dataset_data[] = { {"SQ_ADS", "SQ ADS", ASAR_Wave_SQ_ADSR_asar_rec_data, "SQ ADSRs"}, {"GEOLOCATION_ADS", "GEOLOCATION ADS", ASAR_Wave_Geolocation_ADSR_asar_rec_data, "Wave Mode Geolocation ADS"}, {"PROCESSING_PARAMS_ADS", "PROCESSING PARAMS ADS", ASAR_Wave_Param_ADSR_asar_rec_data, "Wave Mode processing parameters"}, {"CROSS_SPECTRA_MDS", "CROSS SPECTRA MDS", ASAR_Spectra_MDSR_asar_rec_data, "Measurement Data Set containing spectra. 1 MDSR per spectra."} }; static const struct DatasetDescriptor ASA_WVW_2P_dataset_data[] = { {"SQ_ADS", "SQ ADS", ASAR_Wave_SQ_ADSR_asar_rec_data, "SQ ADSRs"}, {"GEOLOCATION_ADS", "GEOLOCATION ADS", ASAR_Wave_Geolocation_ADSR_asar_rec_data, "Wave Mode Geolocation ADS"}, {"PROCESSING_PARAMS_ADS", "PROCESSING PARAMS ADS", ASAR_Wave_Param_ADSR_asar_rec_data, "Wave Mode processing parameters"}, {"WAVE_SPECTRA_MDS", "WAVE SPECTRA MDS", ASAR_Ocean_Spectra_MDSR_asar_rec_data, "Ocean Wave Spectra"} }; static const struct DatasetDescriptor ATS_AR__2P_dataset_data[] = { {"SEA_ST_50_KM_CELL_MDS", "SEA_ST_50_KM_CELL_MDS", ATS_AR__2P_MDSR_sst_large_aatsr_rec_data, "SST record 50 km cell MDS"}, {"SEA_ST_17_KM_CELL_MDS", "SEA_ST_17_KM_CELL_MDS", ATS_AR__2P_MDSR_sst_small_aatsr_rec_data, "SST record 17 km cell MDS"}, {"SEA_ST_10_MIN_CELL_MDS", "SEA_ST_10_MIN_CELL_MDS", ATS_AR__2P_MDSR_sst_small_aatsr_rec_data, "SST record 10 arc minute cell MDS"}, {"SEA_ST_30_MIN_CELL_MDS", "SEA_ST_30_MIN_CELL_MDS", ATS_AR__2P_MDSR_sst_large_aatsr_rec_data, "SST record 30 arc minute cell MDS"}, {"LAND_ST_50_KM_CELL_MDS", "LAND_ST_50_KM_CELL_MDS", ATS_AR__2P_MDSR_lst_large_aatsr_rec_data, "LST record 50 km cell MDS"}, {"LAND_ST_17_KM_CELL_MDS", "LAND_ST_17_KM_CELL_MDS", ATS_AR__2P_MDSR_lst_small_aatsr_rec_data, "LST record 17 km cell MDS"}, {"LAND_ST_10_MIN_CELL_MDS", "LAND_ST_10_MIN_CELL_MDS", ATS_AR__2P_MDSR_lst_small_aatsr_rec_data, "LST record 10 arc minute cell MDS"}, {"LAND_ST_30_MIN_CELL_MDS", "LAND_ST_30_MIN_CELL_MDS", ATS_AR__2P_MDSR_lst_large_aatsr_rec_data, "LST record 30 arc minute cell MDS"}, {"BT_TOA_LAND_50_KM_CELL_MDS", "BT_TOA_LAND_50_KM_CELL_MDS", ATS_AR__2P_MDSR_lr_large_aatsr_rec_data, "BT/TOA Land record 50 km cell MDS"}, {"BT_TOA_LAND_17_KM_CELL_MDS", "BT_TOA_LAND_17_KM_CELL_MDS", ATS_AR__2P_MDSR_lr_small_aatsr_rec_data, "BT/TOA Land record 17 km cell MDS"}, {"BT_TOA_LAND_10_MIN_CELL_MDS", "BT_TOA_LAND_10_MIN_CELL_MDS", ATS_AR__2P_MDSR_lr_small_aatsr_rec_data, "BT/TOA Land record 10 arc minute cell MDS"}, {"BT_TOA_LAND_30_MIN_CELL_MDS", "BT_TOA_LAND_30_MIN_CELL_MDS", ATS_AR__2P_MDSR_lr_large_aatsr_rec_data, "BT/TOA Land record 30 arc minute cell MDS"}, {"BT_TOA_SEA_50_KM_CELL_MDS", "BT_TOA_SEA_50_KM_CELL_MDS", ATS_AR__2P_MDSR_sr_large_aatsr_rec_data, "BT/TOA Sea record 50 km cell MDS"}, {"BT_TOA_SEA_17_KM_CELL_MDS", "BT_TOA_SEA_17_KM_CELL_MDS", ATS_AR__2P_MDSR_sr_small_aatsr_rec_data, "BT/TOA Sea record 17 km cell MDS"}, {"BT_TOA_SEA_10_MIN_CELL_MDS", "BT_TOA_SEA_10_MIN_CELL_MDS", ATS_AR__2P_MDSR_sr_small_aatsr_rec_data, "BT/TOA Sea record 10 arc minute cell MDS"}, {"BT_TOA_SEA_30_MIN_CELL_MDS", "BT_TOA_SEA_30_MIN_CELL_MDS", ATS_AR__2P_MDSR_sr_large_aatsr_rec_data, "BT/TOA Sea record 30 arc minute cell MDS"} }; static const struct DatasetDescriptor ATS_MET_2P_dataset_data[] = { {"SEA_ST_10_MIN_CELL_MDS", "SEA_ST_10_MIN_CELL_MDS", ATS_MET_2P_meteo_user_prod_aatsr_rec_data, "10-arcminute mds"} }; static const struct DatasetDescriptor ATS_NR__2P_dataset_data[] = { {"SUMMARY_QUALITY_ADS", "SUMMARY_QUALITY_ADS", ATS_NR__2P_ADSR_sq_aatsr_rec_data, "Summary Quality ADS"}, {"GEOLOCATION_ADS", "GEOLOCATION_ADS", ATS_TOA_1P_ADSR_loc_aatsr_rec_data, "Grid pixel latitude and longtitude topographic corrections ADS"}, {"SCAN_PIXEL_X_AND_Y_ADS", "SCAN_PIXEL_X_AND_Y_ADS", ATS_TOA_1P_ADSR_scan_aatsr_rec_data, "Scan pixel x and y ADS"}, {"NADIR_VIEW_SOLAR_ANGLES_ADS", "NADIR_VIEW_SOLAR_ANGLES_ADS", ATS_TOA_1P_ADSR_sa_aatsr_rec_data, "Nadir view solar angles ADS"}, {"FWARD_VIEW_SOLAR_ANGLES_ADS", "FWARD_VIEW_SOLAR_ANGLES_ADS", ATS_TOA_1P_ADSR_sa_aatsr_rec_data, "Forward view solar angles ADS"}, {"NADIR_VIEW_SCAN_PIX_NUM_ADS", "NADIR_VIEW_SCAN_PIX_NUM_ADS", ATS_TOA_1P_ADSR_pix_aatsr_rec_data, "Scan and pixel number nadir view ADS"}, {"FWARD_VIEW_SCAN_PIX_NUM_ADS", "FWARD_VIEW_SCAN_PIX_NUM_ADS", ATS_TOA_1P_ADSR_pix_aatsr_rec_data, "Scan and pixel number forward view ADS"}, {"DISTRIB_SST_CLOUD_LAND_MDS", "DISTRIB_SST_CLOUD_LAND_MDS", ATS_NR__2P_MDSR_dp_aatsr_rec_data, "Distributed product MDS"} }; static const struct DatasetDescriptor ATS_TOA_1P_dataset_data[] = { {"SUMMARY_QUALITY_ADS", "SUMMARY_QUALITY_ADS", ATS_TOA_1P_ADSR_sq_aatsr_rec_data, "Summary Quality ADS"}, {"GEOLOCATION_ADS", "GEOLOCATION_ADS", ATS_TOA_1P_ADSR_loc_aatsr_rec_data, "Grid pixel latitude and longtitude topographic corrections ADS"}, {"SCAN_PIXEL_X_AND_Y_ADS", "SCAN_PIXEL_X_AND_Y_ADS", ATS_TOA_1P_ADSR_scan_aatsr_rec_data, "Scan pixel x and y ADS"}, {"NADIR_VIEW_SOLAR_ANGLES_ADS", "NADIR_VIEW_SOLAR_ANGLES_ADS", ATS_TOA_1P_ADSR_sa_aatsr_rec_data, "Nadir view solar angles ADS"}, {"FWARD_VIEW_SOLAR_ANGLES_ADS", "FWARD_VIEW_SOLAR_ANGLES_ADS", ATS_TOA_1P_ADSR_sa_aatsr_rec_data, "Forward view solar angles ADS"}, {"VISIBLE_CALIB_COEFS_GADS", "VISIBLE_CALIB_COEFS_GADS", ATS_VC1_AX_GADS_aatsr_rec_data, "Visible calibration coefficients GADS"}, {"NADIR_VIEW_SCAN_PIX_NUM_ADS", "NADIR_VIEW_SCAN_PIX_NUM_ADS", ATS_TOA_1P_ADSR_pix_aatsr_rec_data, "Scan and pixel number nadir view ADS"}, {"FWARD_VIEW_SCAN_PIX_NUM_ADS", "FWARD_VIEW_SCAN_PIX_NUM_ADS", ATS_TOA_1P_ADSR_pix_aatsr_rec_data, "Scan and pixel number forward view ADS"}, {"11500_12500_NM_NADIR_TOA_MDS", "11500_12500_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "12 micron nadir view MDS"}, {"10400_11300_NM_NADIR_TOA_MDS", "10400_11300_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "11 micron nadir view MDS"}, {"03505_03895_NM_NADIR_TOA_MDS", "03505_03895_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "3.7 micron nadir view MDS"}, {"01580_01640_NM_NADIR_TOA_MDS", "01580_01640_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "1.6 micron nadir view MDS"}, {"00855_00875_NM_NADIR_TOA_MDS", "00855_00875_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "0.87 micron nadir view MDS"}, {"00649_00669_NM_NADIR_TOA_MDS", "00649_00669_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "0.67 micron nadir view MDS"}, {"00545_00565_NM_NADIR_TOA_MDS", "00545_00565_NM_NADIR_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "0.55 micron nadir view MDS"}, {"11500_12500_NM_FWARD_TOA_MDS", "11500_12500_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "12 micron forward view MDS"}, {"10400_11300_NM_FWARD_TOA_MDS", "10400_11300_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "11 micron forward view MDS"}, {"03505_03895_NM_FWARD_TOA_MDS", "03505_03895_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "3.7 micron forward view MDS"}, {"01580_01640_NM_FWARD_TOA_MDS", "01580_01640_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "1.6 micron forward view MDS"}, {"00855_00875_NM_FWARD_TOA_MDS", "00855_00875_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "0.87 micron forward view MDS"}, {"00649_00669_NM_FWARD_TOA_MDS", "00649_00669_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "0.67 micron forward view MDS"}, {"00545_00565_NM_FWARD_TOA_MDS", "00545_00565_NM_FWARD_TOA_MDS", ATS_TOA_1P_MDSR_brgt_aatsr_rec_data, "0.55 micron forward view MDS"}, {"NADIR_VIEW_CONFIDENCE_MDS", "NADIR_VIEW_CONFIDENCE_MDS", ATS_TOA_1P_MDSR_conf_aatsr_rec_data, "Confidence words nadir view MDS"}, {"FWARD_VIEW_CONFIDENCE_MDS", "FWARD_VIEW_CONFIDENCE_MDS", ATS_TOA_1P_MDSR_conf_aatsr_rec_data, "Confidence words forward view MDS"}, {"NADIR_VIEW_CLOUD_MDS", "NADIR_VIEW_CLOUD_MDS", ATS_TOA_1P_MDSR_cl_aatsr_rec_data, "Cloud flag nadir view MDS"}, {"FWARD_VIEW_CLOUD_MDS", "FWARD_VIEW_CLOUD_MDS", ATS_TOA_1P_MDSR_cl_aatsr_rec_data, "Cloud flag forward view MDS"} }; 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)"}, {"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"}, {"Radiance_4", "Radiance MDS(4)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (4) TOA Radiance"}, {"Radiance_5", "Radiance MDS(5)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (5) TOA Radiance"}, {"Radiance_6", "Radiance MDS(6)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (6) TOA Radiance"}, {"Radiance_7", "Radiance MDS(7)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (7) TOA Radiance"}, {"Radiance_8", "Radiance MDS(8)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (8) TOA Radiance"}, {"Radiance_9", "Radiance MDS(9)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (9) TOA Radiance"}, {"Radiance_10", "Radiance MDS(10)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (10) TOA Radiance"}, {"Radiance_11", "Radiance MDS(11)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (11) TOA Radiance"}, {"Radiance_12", "Radiance MDS(12)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (12) TOA Radiance"}, {"Radiance_13", "Radiance MDS(13)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (13) TOA Radiance"}, {"Radiance_14", "Radiance MDS(14)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (14) TOA Radiance"}, {"Radiance_15", "Radiance MDS(15)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (15) TOA Radiance"}, {"Flags", "Flags MDS(16)", MER_RR__1P_MDSR_16_meris_rec_data, "Level 1b MDS (16) Flags & Detector Index"} }; 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)"}, {"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"}, {"Radiance_4", "Radiance MDS(4)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (4) TOA Radiance"}, {"Radiance_5", "Radiance MDS(5)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (5) TOA Radiance"}, {"Radiance_6", "Radiance MDS(6)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (6) TOA Radiance"}, {"Radiance_7", "Radiance MDS(7)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (7) TOA Radiance"}, {"Radiance_8", "Radiance MDS(8)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (8) TOA Radiance"}, {"Radiance_9", "Radiance MDS(9)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (9) TOA Radiance"}, {"Radiance_10", "Radiance MDS(10)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (10) TOA Radiance"}, {"Radiance_11", "Radiance MDS(11)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (11) TOA Radiance"}, {"Radiance_12", "Radiance MDS(12)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (12) TOA Radiance"}, {"Radiance_13", "Radiance MDS(13)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (13) TOA Radiance"}, {"Radiance_14", "Radiance MDS(14)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (14) TOA Radiance"}, {"Radiance_15", "Radiance MDS(15)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (15) TOA Radiance"}, {"Flags", "Flags MDS(16)", MER_RR__1P_MDSR_16_IODD5_meris_rec_data, "Level 1b MDS (16) Flags & Spectral Shift Index"} }; static const struct DatasetDescriptor MER_FR__2P_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 ADS Summary Quality (SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factors and Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux. Data(L ADS)"}, {"Norm_rho_surf_1", "Norm. rho_surf - MDS(1)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(1) normalised surface reflectance"}, {"Norm_rho_surf_2", "Norm. rho_surf - MDS(2)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(2) normalised surface reflectance"}, {"Norm_rho_surf_3", "Norm. rho_surf - MDS(3)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(3) normalised surface reflectance"}, {"Norm_rho_surf_4", "Norm. rho_surf - MDS(4)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(4) normalised surface reflectance"}, {"Norm_rho_surf_5", "Norm. rho_surf - MDS(5)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(5) normalised surface reflectance"}, {"Norm_rho_surf_6", "Norm. rho_surf - MDS(6)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(6) normalised surface reflectance"}, {"Norm_rho_surf_7", "Norm. rho_surf - MDS(7)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(7) normalised surface reflectance"}, {"Norm_rho_surf_8", "Norm. rho_surf - MDS(8)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(8) normalised surface reflectance"}, {"Norm_rho_surf_9", "Norm. rho_surf - MDS(9)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(9) normalised surface reflectance"}, {"Norm_rho_surf_10", "Norm. rho_surf - MDS(10)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(10) normalised surface reflectance"}, {"Norm_rho_surf_11", "Norm. rho_surf - MDS(11)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(11) normalised surface reflectance"}, {"Norm_rho_surf_12", "Norm. rho_surf - MDS(12)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(12) normalised surface reflectance"}, {"Norm_rho_surf_13", "Norm. rho_surf - MDS(13)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(13) normalised surface reflectance"}, {"Vapour_Content", "Vapour Content - MDS(14)", MER_RR__2P_MDSR_14_meris_rec_data, "Level 2 MDS(14) water vapour content"}, {"Chl_1_TOAVI_CTP", "Chl_1, TOAVI - MDS(15)", MER_RR__2P_MDSR_15_meris_rec_data, "Level 2 MDS(15) algal index I or TOAVI"}, {"YS_SPM_Rect_rho", "YS, SPM, Rect. Rho- MDS(16)", MER_RR__2P_MDSR_16_meris_rec_data, "Level 2 MDS(16) yellow substance total suspended matter"}, {"Chl_2_BOAVI", "Chl_2, BOAVI - MDS(17)", MER_RR__2P_MDSR_17_meris_rec_data, "Level 2 MDS(17) algal index II BOAVI"}, {"Press_PAR_Alb", "Press PAR Alb - MDS(18)", MER_RR__2P_MDSR_18_meris_rec_data, "Level 2 MDS(18) surface pressure PAR cloud albedo"}, {"Alpha_OPT", "Alpha, OPT - MDS(19)", MER_RR__2P_MDSR_19_meris_rec_data, "Level 2 MDS(19) aerosol Angstrom exponent or cloud type and optical thickness"}, {"Flags", "Flags - MDS(20)", MER_RR__2P_MDSR_20_meris_rec_data, "Level 2 MDS(20) flags"} }; static const struct DatasetDescriptor MER_FR__2P_IODD6_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 ADS Summary Quality (SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factors and Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux. Data(L ADS)"}, {"Norm_rho_surf_1", "Norm. rho_surf - MDS(1)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(1) normalised surface reflectance"}, {"Norm_rho_surf_2", "Norm. rho_surf - MDS(2)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(2) normalised surface reflectance"}, {"Norm_rho_surf_3", "Norm. rho_surf - MDS(3)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(3) normalised surface reflectance"}, {"Norm_rho_surf_4", "Norm. rho_surf - MDS(4)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(4) normalised surface reflectance"}, {"Norm_rho_surf_5", "Norm. rho_surf - MDS(5)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(5) normalised surface reflectance"}, {"Norm_rho_surf_6", "Norm. rho_surf - MDS(6)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(6) normalised surface reflectance"}, {"Norm_rho_surf_7", "Norm. rho_surf - MDS(7)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(7) normalised surface reflectance"}, {"Norm_rho_surf_8", "Norm. rho_surf - MDS(8)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(8) normalised surface reflectance"}, {"Norm_rho_surf_9", "Norm. rho_surf - MDS(9)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(9) normalised surface reflectance"}, {"Norm_rho_surf_10", "Norm. rho_surf - MDS(10)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(10) normalised surface reflectance"}, {"Norm_rho_surf_11", "Norm. rho_surf - MDS(11)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(11) normalised surface reflectance"}, {"Norm_rho_surf_12", "Norm. rho_surf - MDS(12)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(12) normalised surface reflectance"}, {"Norm_rho_surf_13", "Norm. rho_surf - MDS(13)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(13) normalised surface reflectance"}, {"Vapour_Content", "Vapour Content - MDS(14)", MER_RR__2P_MDSR_14_meris_rec_data, "Level 2 MDS(14) water vapour content"}, {"Chl_1_TOAVI_CTP", "Chl_1, TOAVI - MDS(15)", MER_RR__2P_MDSR_15_meris_rec_data, "Level 2 MDS(15) algal index I or TOAVI"}, {"YS_SPM_Rect_rho", "YS, SPM, Rect. Rho- MDS(16)", MER_RR__2P_MDSR_16_meris_rec_data, "Level 2 MDS(16) yellow substance total suspended matter"}, {"Chl_2_BOAVI", "Chl_2, BOAVI - MDS(17)", MER_RR__2P_MDSR_17_meris_rec_data, "Level 2 MDS(17) algal index II BOAVI"}, {"Press_PAR_Alb", "Press PAR Alb - MDS(18)", MER_RR__2P_MDSR_18_meris_rec_data, "Level 2 MDS(18) surface pressure PAR cloud albedo"}, {"Epsilon_OPT", "Epsilon, OPT - MDS(19)", MER_RR__2P_MDSR_19_IODD6_meris_rec_data, "Level 2 MDS(19) aerosol epsilon or cloud type and optical thickness"}, {"Flags", "Flags - MDS(20)", MER_RR__2P_MDSR_20_meris_rec_data, "Level 2 MDS(20) flags"} }; static const struct DatasetDescriptor MER_LRC_2P_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 Summary Quality ADS(SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RRC_2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factor and Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux. Data ( L ADS)"}, {"Cloud_Type_OT", "MDS Cloud Type, OT", MER_LRC_2P_MDSR_cl_thick_meris_rec_data, "Level 2 MDS Cloud Optical Thickness"}, {"Cloud_Top_Pressure", "MDS Cloud Top Pressure", MER_LRC_2P_MDSR_cl_top_press_meris_rec_data, "Level 2 MDS Cloud Top Pressure"}, {"Vapour_Content", "MDS Vapour Content", MER_LRC_2P_MDSR_twv_meris_rec_data, "Level 2 MDS Total Water vapour"}, {"Flags", "MDS Flags", MER_LRC_2P_MDSR_flag_meris_rec_data, "Level 2 MDS Flags"} }; static const struct DatasetDescriptor MER_RRC_2P_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 Summary Quality ADS (SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RRC_2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factor And Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux Data( L ADS)"}, {"Cloud_Type_OT", "MDS Cloud Type, OT", MER_RR__2P_MDSR_19_meris_rec_data, "Level 2 MDS Cloud Optical Thickness"}, {"Cloud_Top_Pressure", "MDS Cloud Top Pressure", MER_RR__2P_MDSR_15_meris_rec_data, "Level 2 MDS Cloud Top Pressure"}, {"Vapour_Content", "MDS Vapour Content", MER_RR__2P_MDSR_14_meris_rec_data, "Level 2 MDS Total Water vapour"}, {"Flags", "MDS Flags", MER_RR__2P_MDSR_20_meris_rec_data, "Level 2 MDS Flags"} }; static const struct DatasetDescriptor MER_RRV_2P_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 Summary Quality ADS (SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RRV_2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factor and Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux. Data (L ADS)"}, {"TOAVI", "MDS TOAVI", MER_RR__2P_MDSR_15_meris_rec_data, "Level 2 MDS TOA Vegetable Index"}, {"BOAVI", "MDS BOAVI", MER_RR__2P_MDSR_17_meris_rec_data, "Level 2 MDS BOA Vegetable Index"}, {"Flags", "MDS Flags", MER_RR__2P_MDSR_20_meris_rec_data, "Level 2 MDS Flag"} }; 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)"}, {"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"}, {"Radiance_4", "Radiance MDS(4)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (4) TOA Radiance"}, {"Radiance_5", "Radiance MDS(5)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (5) TOA Radiance"}, {"Radiance_6", "Radiance MDS(6)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (6) TOA Radiance"}, {"Radiance_7", "Radiance MDS(7)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (7) TOA Radiance"}, {"Radiance_8", "Radiance MDS(8)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (8) TOA Radiance"}, {"Radiance_9", "Radiance MDS(9)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (9) TOA Radiance"}, {"Radiance_10", "Radiance MDS(10)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (10) TOA Radiance"}, {"Radiance_11", "Radiance MDS(11)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (11) TOA Radiance"}, {"Radiance_12", "Radiance MDS(12)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (12) TOA Radiance"}, {"Radiance_13", "Radiance MDS(13)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (13) TOA Radiance"}, {"Radiance_14", "Radiance MDS(14)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (14) TOA Radiance"}, {"Radiance_15", "Radiance MDS(15)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (15) TOA Radiance"}, {"Flags", "Flags MDS(16)", MER_RR__1P_MDSR_16_meris_rec_data, "Level 1b MDS (16) Flags & Detector Index"} }; 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)"}, {"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"}, {"Radiance_4", "Radiance MDS(4)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (4) TOA Radiance"}, {"Radiance_5", "Radiance MDS(5)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (5) TOA Radiance"}, {"Radiance_6", "Radiance MDS(6)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (6) TOA Radiance"}, {"Radiance_7", "Radiance MDS(7)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (7) TOA Radiance"}, {"Radiance_8", "Radiance MDS(8)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (8) TOA Radiance"}, {"Radiance_9", "Radiance MDS(9)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (9) TOA Radiance"}, {"Radiance_10", "Radiance MDS(10)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (10) TOA Radiance"}, {"Radiance_11", "Radiance MDS(11)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (11) TOA Radiance"}, {"Radiance_12", "Radiance MDS(12)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (12) TOA Radiance"}, {"Radiance_13", "Radiance MDS(13)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (13) TOA Radiance"}, {"Radiance_14", "Radiance MDS(14)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (14) TOA Radiance"}, {"Radiance_15", "Radiance MDS(15)", MER_RR__1P_MDSR_1_15_meris_rec_data, "Level 1b MDS (15) TOA Radiance"}, {"Flags", "Flags MDS(16)", MER_RR__1P_MDSR_16_IODD5_meris_rec_data, "Level 1b MDS (16) Flags & Spectral Shift Index"} }; static const struct DatasetDescriptor MER_RR__2P_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 ADS Summary Quality (SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factors and Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux. Data(L ADS)"}, {"Norm_rho_surf_1", "Norm. rho_surf - MDS(1)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(1) normalised surface reflectance"}, {"Norm_rho_surf_2", "Norm. rho_surf - MDS(2)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(2) normalised surface reflectance"}, {"Norm_rho_surf_3", "Norm. rho_surf - MDS(3)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(3) normalised surface reflectance"}, {"Norm_rho_surf_4", "Norm. rho_surf - MDS(4)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(4) normalised surface reflectance"}, {"Norm_rho_surf_5", "Norm. rho_surf - MDS(5)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(5) normalised surface reflectance"}, {"Norm_rho_surf_6", "Norm. rho_surf - MDS(6)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(6) normalised surface reflectance"}, {"Norm_rho_surf_7", "Norm. rho_surf - MDS(7)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(7) normalised surface reflectance"}, {"Norm_rho_surf_8", "Norm. rho_surf - MDS(8)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(8) normalised surface reflectance"}, {"Norm_rho_surf_9", "Norm. rho_surf - MDS(9)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(9) normalised surface reflectance"}, {"Norm_rho_surf_10", "Norm. rho_surf - MDS(10)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(10) normalised surface reflectance"}, {"Norm_rho_surf_11", "Norm. rho_surf - MDS(11)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(11) normalised surface reflectance"}, {"Norm_rho_surf_12", "Norm. rho_surf - MDS(12)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(12) normalised surface reflectance"}, {"Norm_rho_surf_13", "Norm. rho_surf - MDS(13)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(13) normalised surface reflectance"}, {"Vapour_Content", "Vapour Content - MDS(14)", MER_RR__2P_MDSR_14_meris_rec_data, "Level 2 MDS(14) water vapour content"}, {"Chl_1_TOAVI_CTP", "Chl_1, TOAVI - MDS(15)", MER_RR__2P_MDSR_15_meris_rec_data, "Level 2 MDS(15) algal index I or TOAVI"}, {"YS_SPM_Rect_rho", "YS, SPM, Rect. Rho- MDS(16)", MER_RR__2P_MDSR_16_meris_rec_data, "Level 2 MDS(16) yellow substance total suspended matter"}, {"Chl_2_BOAVI", "Chl_2, BOAVI - MDS(17)", MER_RR__2P_MDSR_17_meris_rec_data, "Level 2 MDS(17) algal index II BOAVI"}, {"Press_PAR_Alb", "Press PAR Alb - MDS(18)", MER_RR__2P_MDSR_18_meris_rec_data, "Level 2 MDS(18) surface pressure PAR cloud albedo"}, {"Alpha_OPT", "Alpha, OPT - MDS(19)", MER_RR__2P_MDSR_19_meris_rec_data, "Level 2 MDS(19) aerosol Angstrom exponent or cloud type and optical thickness"}, {"Flags", "Flags - MDS(20)", MER_RR__2P_MDSR_20_meris_rec_data, "Level 2 MDS(20) flags"} }; static const struct DatasetDescriptor MER_RR__2P_IODD6_dataset_data[] = { {"Quality_ADS", "Quality ADS", MER_RR__2P_ADSR_sq_meris_rec_data, "Level 2 ADS Summary Quality (SQ ADS)"}, {"Scaling_Factor_GADS", "Scaling Factor GADS", MER_RR__2P_GADS_sfgi_meris_rec_data, "Level 2 GADS Scaling Factors and Offsets"}, {"Tie_points_ADS", "Tie points ADS", MER_RR__1P_ADSR_tie_pt_meris_rec_data, "Level 2 ADS Tie Points Location & Aux. Data(L ADS)"}, {"Norm_rho_surf_1", "Norm. rho_surf - MDS(1)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(1) normalised surface reflectance"}, {"Norm_rho_surf_2", "Norm. rho_surf - MDS(2)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(2) normalised surface reflectance"}, {"Norm_rho_surf_3", "Norm. rho_surf - MDS(3)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(3) normalised surface reflectance"}, {"Norm_rho_surf_4", "Norm. rho_surf - MDS(4)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(4) normalised surface reflectance"}, {"Norm_rho_surf_5", "Norm. rho_surf - MDS(5)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(5) normalised surface reflectance"}, {"Norm_rho_surf_6", "Norm. rho_surf - MDS(6)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(6) normalised surface reflectance"}, {"Norm_rho_surf_7", "Norm. rho_surf - MDS(7)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(7) normalised surface reflectance"}, {"Norm_rho_surf_8", "Norm. rho_surf - MDS(8)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(8) normalised surface reflectance"}, {"Norm_rho_surf_9", "Norm. rho_surf - MDS(9)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(9) normalised surface reflectance"}, {"Norm_rho_surf_10", "Norm. rho_surf - MDS(10)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(10) normalised surface reflectance"}, {"Norm_rho_surf_11", "Norm. rho_surf - MDS(11)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(11) normalised surface reflectance"}, {"Norm_rho_surf_12", "Norm. rho_surf - MDS(12)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(12) normalised surface reflectance"}, {"Norm_rho_surf_13", "Norm. rho_surf - MDS(13)", MER_RR__2P_MDSR_1_13_meris_rec_data, "Level 2 MDS(13) normalised surface reflectance"}, {"Vapour_Content", "Vapour Content - MDS(14)", MER_RR__2P_MDSR_14_meris_rec_data, "Level 2 MDS(14) water vapour content"}, {"Chl_1_TOAVI_CTP", "Chl_1, TOAVI - MDS(15)", MER_RR__2P_MDSR_15_meris_rec_data, "Level 2 MDS(15) algal index I or TOAVI"}, {"YS_SPM_Rect_rho", "YS, SPM, Rect. Rho- MDS(16)", MER_RR__2P_MDSR_16_meris_rec_data, "Level 2 MDS(16) yellow substance total suspended matter"}, {"Chl_2_BOAVI", "Chl_2, BOAVI - MDS(17)", MER_RR__2P_MDSR_17_meris_rec_data, "Level 2 MDS(17) algal index II BOAVI"}, {"Press_PAR_Alb", "Press PAR Alb - MDS(18)", MER_RR__2P_MDSR_18_meris_rec_data, "Level 2 MDS(18) surface pressure PAR cloud albedo"}, {"Epsilon_OPT", "Epsilon, OPT - MDS(19)", MER_RR__2P_MDSR_19_IODD6_meris_rec_data, "Level 2 MDS(19) aerosol epsilon or cloud type and optical thickness"}, {"Flags", "Flags - MDS(20)", MER_RR__2P_MDSR_20_meris_rec_data, "Level 2 MDS(20) flags"} }; static const struct BandDescriptor ASA_APG_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data_1", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Geocoded Image"}, {"proc_data_2", "MDS2.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Geocoded Image"} }; static const struct BandDescriptor ASA_APM_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data_1", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Medium Resolution Image"}, {"proc_data_2", "MDS2.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Medium Resolution Image"} }; static const struct BandDescriptor ASA_APP_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data_1", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Precision Mode Image"}, {"proc_data_2", "MDS2.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Precision Mode Image"} }; static const struct BandDescriptor ASA_APS_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"i", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization SLC Image (i)"}, {"q", "MDS2.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization SLC Image (q)"} }; static const struct BandDescriptor ASA_AP__BP_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Mode Browse Product"} }; static const struct BandDescriptor ASA_IMG_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Image Mode Geocoded Image"} }; static const struct BandDescriptor ASA_IMM_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Image Mode Medium Resolution Image (stripline)"} }; static const struct BandDescriptor ASA_IMP_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Image Mode Precision Image"} }; static const struct BandDescriptor ASA_IMS_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"i", "MDS1.4", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Image Mode SLC Image (i)"}, {"q", "MDS1.4", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Image Mode SLC Image (q)"} }; static const struct BandDescriptor ASA_IM__BP_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Image Mode Browse Image"} }; static const struct BandDescriptor ASA_WSM_1P_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Wide Swath Mode Medium Resolution Image"} }; static const struct BandDescriptor ASA_WS__BP_band_data[] = { {"slant_range_time", "GEOLOCATION_GRID_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "ns", "2 way slant range time"}, {"incident_angle", "GEOLOCATION_GRID_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "deg", "Incident angle"}, {"latitude", "GEOLOCATION_GRID_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "GEOLOCATION_GRID_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"proc_data", "MDS1.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, NULL, "Alternating Polarization Mode Browse Product"} }; static const struct BandDescriptor ATS_NR__2P_band_data[] = { {"latitude", "GEOLOCATION_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitudes"}, {"longitude", "GEOLOCATION_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitudes"}, {"lat_corr_nadir", "GEOLOCATION_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude corrections, nadir view"}, {"lon_corr_nadir", "GEOLOCATION_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude corrections, nadir view"}, {"lat_corr_fward", "GEOLOCATION_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude corrections, forward view"}, {"lon_corr_fward", "GEOLOCATION_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude corrections, forward view"}, {"altitude", "GEOLOCATION_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Topographic altitude"}, {"sun_elev_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar elevation nadir view"}, {"view_elev_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite elevation nadir view"}, {"sun_azimuth_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar azimuth nadir view"}, {"view_azimuth_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite azimuth nadir view"}, {"sun_elev_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar elevation forward view"}, {"view_elev_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite elevation forward view"}, {"sun_azimuth_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar azimuth forward view"}, {"view_azimuth_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite azimuth forward view"}, {"sst_nadir", "DISTRIB_SST_CLOUD_LAND_MDS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", "!flags.NADIR_CLOUD and !flags.LAND", NULL, "K", "Sea surface temperature nadir view"}, {"sst_comb", "DISTRIB_SST_CLOUD_LAND_MDS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", "!flags.NADIR_CLOUD and !flags.LAND", NULL, "K", "Sea surface temperature combined views"}, {"cloud_top_temp", "DISTRIB_SST_CLOUD_LAND_MDS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", "flags.NADIR_CLOUD", NULL, "K", "Cloud top temperature"}, {"cloud_top_height", "DISTRIB_SST_CLOUD_LAND_MDS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", "flags.NADIR_CLOUD", NULL, "m", "Cloud top height"}, {"lst", "DISTRIB_SST_CLOUD_LAND_MDS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", "!flags.NADIR_CLOUD and flags.LAND", NULL, "K", "Land surface temperature"}, {"ndvi", "DISTRIB_SST_CLOUD_LAND_MDS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.0001", "!flags.NADIR_CLOUD and flags.LAND", NULL, NULL, "Normalized difference vegetation index"}, {"flags", "DISTRIB_SST_CLOUD_LAND_MDS.5", e_smod_1OF1, e_tid_ushort, -1, e_smid_non, NULL, NULL, NULL, "ATS_NR__2P_flags", NULL, "Classification and quality flags"} }; static const struct BandDescriptor ATS_TOA_1P_band_data[] = { {"latitude", "GEOLOCATION_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitudes"}, {"longitude", "GEOLOCATION_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitudes"}, {"lat_corr_nadir", "GEOLOCATION_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude corrections, nadir view"}, {"lon_corr_nadir", "GEOLOCATION_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude corrections, nadir view"}, {"lat_corr_fward", "GEOLOCATION_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude corrections, forward view"}, {"lon_corr_fward", "GEOLOCATION_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude corrections, forward view"}, {"altitude", "GEOLOCATION_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Topographic altitude"}, {"sun_elev_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar elevation, nadir view"}, {"view_elev_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite elevation, nadir view"}, {"sun_azimuth_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar azimuth, nadir view"}, {"view_azimuth_nadir", "NADIR_VIEW_SOLAR_ANGLES_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite azimuth, nadir view"}, {"sun_elev_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar elevation, forward view"}, {"view_elev_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite elevation, forward view"}, {"sun_azimuth_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Solar azimuth, forward view"}, {"view_azimuth_fward", "FWARD_VIEW_SOLAR_ANGLES_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-03", NULL, NULL, "deg", "Satellite azimuth, forward view"}, {"btemp_nadir_1200", "11500_12500_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "0.0", "0.01", NULL, NULL, "K", "Brightness temperature, nadir view (11500-12500 nm)"}, {"btemp_nadir_1100", "10400_11300_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "0.0", "0.01", NULL, NULL, "K", "Brightness temperature, nadir view (10400-11300 nm)"}, {"btemp_nadir_0370", "03505_03895_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "0.0", "0.01", NULL, NULL, "K", "Brightness temperature, nadir view (3505-3895 nm)"}, {"reflec_nadir_1600", "01580_01640_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, nadir view (1580-1640 nm)"}, {"reflec_nadir_0870", "00855_00875_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, nadir view (855-875 nm)"}, {"reflec_nadir_0670", "00649_00669_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, nadir view (649-669 nm)"}, {"reflec_nadir_0550", "00545_00565_NM_NADIR_TOA_MDS.5", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, nadir view (545-565 nm)"}, {"btemp_fward_1200", "11500_12500_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "0.0", "0.01", NULL, NULL, "K", "Brightness temperature, forward view (11500-12500 nm)"}, {"btemp_fward_1100", "10400_11300_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "0.0", "0.01", NULL, NULL, "K", "Brightness temperature, forward view (10400-11300 nm)"}, {"btemp_fward_0370", "03505_03895_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "0.0", "0.01", NULL, NULL, "K", "Brightness temperature, forward view (3505-3895 nm)"}, {"reflec_fward_1600", "01580_01640_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, forward view (1580-1640 nm)"}, {"reflec_fward_0870", "00855_00875_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, forward view (855-875 nm)"}, {"reflec_fward_0670", "00649_00669_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, forward view (649-669 nm)"}, {"reflec_fward_0550", "00545_00565_NM_FWARD_TOA_MDS.5", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "0.0", "0.01", NULL, NULL, "%", "Refectance, forward view (545-565 nm)"}, {"confid_flags_nadir", "NADIR_VIEW_CONFIDENCE_MDS.5", e_smod_1OF1, e_tid_ushort, -1, e_smid_non, NULL, NULL, NULL, "ATS_TOA_1P_confid_flags", NULL, "Confidence flags, nadir view"}, {"confid_flags_fward", "FWARD_VIEW_CONFIDENCE_MDS.5", e_smod_1OF1, e_tid_ushort, -1, e_smid_non, NULL, NULL, NULL, "ATS_TOA_1P_confid_flags", NULL, "Confidence flags, forward view"}, {"cloud_flags_nadir", "NADIR_VIEW_CLOUD_MDS.5", e_smod_1OF1, e_tid_ushort, -1, e_smid_non, NULL, NULL, NULL, "ATS_TOA_1P_cloud_flags", NULL, "Cloud flags, nadir view"}, {"cloud_flags_fward", "FWARD_VIEW_CLOUD_MDS.5", e_smod_1OF1, e_tid_ushort, -1, e_smid_non, NULL, NULL, NULL, "ATS_TOA_1P_cloud_flags", NULL, "Cloud flags, forward view"} }; static const struct BandDescriptor MER_FR__1P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"radiance_1", "Radiance_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.1", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 1"}, {"radiance_2", "Radiance_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.2", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 2"}, {"radiance_3", "Radiance_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.3", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 3"}, {"radiance_4", "Radiance_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.4", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 4"}, {"radiance_5", "Radiance_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.5", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 5"}, {"radiance_6", "Radiance_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.6", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 6"}, {"radiance_7", "Radiance_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.7", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 7"}, {"radiance_8", "Radiance_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.8", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 8"}, {"radiance_9", "Radiance_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.9", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 9"}, {"radiance_10", "Radiance_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.10", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 10"}, {"radiance_11", "Radiance_11.3", e_smod_1OF1, e_tid_float, 11, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.11", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 11"}, {"radiance_12", "Radiance_12.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.12", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 12"}, {"radiance_13", "Radiance_13.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.13", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 13"}, {"radiance_14", "Radiance_14.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.14", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 14"}, {"radiance_15", "Radiance_15.3", e_smod_1OF1, e_tid_float, 15, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.15", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 15"}, {"l1_flags", "Flags.3", e_smod_1OF1, e_tid_uchar, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__1P_flags", NULL, "Level 1b classification and quality flags"}, {"detector_index", "Flags.4", e_smod_1OF1, e_tid_short, -1, e_smid_non, NULL, NULL, NULL, NULL, NULL, "Detector index"} }; static const struct BandDescriptor MER_FR__1P_IODD5_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"radiance_1", "Radiance_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.1", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 1"}, {"radiance_2", "Radiance_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.2", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 2"}, {"radiance_3", "Radiance_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.3", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 3"}, {"radiance_4", "Radiance_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.4", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 4"}, {"radiance_5", "Radiance_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.5", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 5"}, {"radiance_6", "Radiance_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.6", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 6"}, {"radiance_7", "Radiance_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.7", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 7"}, {"radiance_8", "Radiance_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.8", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 8"}, {"radiance_9", "Radiance_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.9", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 9"}, {"radiance_10", "Radiance_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.10", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 10"}, {"radiance_11", "Radiance_11.3", e_smod_1OF1, e_tid_float, 11, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.11", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 11"}, {"radiance_12", "Radiance_12.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.12", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 12"}, {"radiance_13", "Radiance_13.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.13", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 13"}, {"radiance_14", "Radiance_14.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.14", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 14"}, {"radiance_15", "Radiance_15.3", e_smod_1OF1, e_tid_float, 15, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.15", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 15"}, {"l1_flags", "Flags.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__1P_flags", NULL, "Level 1b classification and quality flags"}, {"ssi", "Flags.3", e_smod_2OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, NULL, NULL, NULL, "Spectral shift index"} }; static const struct BandDescriptor MER_FR__2P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"reflec_1", "Norm_rho_surf_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "Scaling_Factor_GADS.22.1", "Scaling_Factor_GADS.8.1", NULL, NULL, "dl", "Normalized surface reflectance, band 1"}, {"reflec_2", "Norm_rho_surf_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "Scaling_Factor_GADS.22.2", "Scaling_Factor_GADS.8.2", NULL, NULL, "dl", "Normalized surface reflectance, band 2"}, {"reflec_3", "Norm_rho_surf_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "Scaling_Factor_GADS.22.3", "Scaling_Factor_GADS.8.3", NULL, NULL, "dl", "Normalized surface reflectance, band 3"}, {"reflec_4", "Norm_rho_surf_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "Scaling_Factor_GADS.22.4", "Scaling_Factor_GADS.8.4", NULL, NULL, "dl", "Normalized surface reflectance, band 4"}, {"reflec_5", "Norm_rho_surf_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "Scaling_Factor_GADS.22.5", "Scaling_Factor_GADS.8.5", NULL, NULL, "dl", "Normalized surface reflectance, band 5"}, {"reflec_6", "Norm_rho_surf_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "Scaling_Factor_GADS.22.6", "Scaling_Factor_GADS.8.6", NULL, NULL, "dl", "Normalized surface reflectance, band 6"}, {"reflec_7", "Norm_rho_surf_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "Scaling_Factor_GADS.22.7", "Scaling_Factor_GADS.8.7", NULL, NULL, "dl", "Normalized surface reflectance, band 7"}, {"reflec_8", "Norm_rho_surf_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "Scaling_Factor_GADS.22.8", "Scaling_Factor_GADS.8.8", NULL, NULL, "dl", "Normalized surface reflectance, band 8"}, {"reflec_9", "Norm_rho_surf_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "Scaling_Factor_GADS.22.9", "Scaling_Factor_GADS.8.9", NULL, NULL, "dl", "Normalized surface reflectance, band 9"}, {"reflec_10", "Norm_rho_surf_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "Scaling_Factor_GADS.22.10", "Scaling_Factor_GADS.8.10", NULL, NULL, "dl", "Normalized surface reflectance, band 10"}, {"reflec_12", "Norm_rho_surf_11.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "Scaling_Factor_GADS.22.11", "Scaling_Factor_GADS.8.11", NULL, NULL, "dl", "Normalized surface reflectance, band 12"}, {"reflec_13", "Norm_rho_surf_12.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "Scaling_Factor_GADS.22.12", "Scaling_Factor_GADS.8.12", NULL, NULL, "dl", "Normalized surface reflectance, band 13"}, {"reflec_14", "Norm_rho_surf_13.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "Scaling_Factor_GADS.22.13", "Scaling_Factor_GADS.8.13", NULL, NULL, "dl", "Normalized surface reflectance, band 14"}, {"water_vapour", "Vapour_Content.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.30.1", "Scaling_Factor_GADS.16.1", NULL, NULL, "g/cm^2", "Water vapour content"}, {"algal_1", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 1 content"}, {"algal_2", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 2 content"}, {"yellow_subs", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.24.1", "Scaling_Factor_GADS.10.1", "l2_flags.WATER", NULL, "1/m", "Yellow substance"}, {"total_susp", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.25.1", "Scaling_Factor_GADS.11.1", "l2_flags.WATER", NULL, "g/m^3", "Total suspended matter"}, {"photosyn_rad", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.31.1", "Scaling_Factor_GADS.17.1", "l2_flags.WATER", NULL, "myEinstein/(m^2*s)", "Photosynthetically active radiation"}, {"toa_veg", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.32.1", "Scaling_Factor_GADS.18.1", "l2_flags.LAND", NULL, "1", "MGVI - MERIS global vegetation index"}, {"boa_veg", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.33.1", "Scaling_Factor_GADS.19.1", "l2_flags.LAND", NULL, "1", "MTCI - MERIS terrestrial chlorophyll index"}, {"rect_refl_red", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.40.1", "Scaling_Factor_GADS.39.1", "l2_flags.LAND", NULL, "dl", "Rectified reflectance in a red band"}, {"rect_refl_nir", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.42.1", "Scaling_Factor_GADS.41.1", "l2_flags.LAND", NULL, "dl", "Rectified reflectances in a near infrared band"}, {"surf_press", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.29.1", "Scaling_Factor_GADS.15.1", "l2_flags.LAND", NULL, "hPa", "Surface pressure"}, {"aero_alpha", "Alpha_OPT.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.26.1", "Scaling_Factor_GADS.12.1", "!l2_flags.CLOUD", NULL, "dl", "Aerosol Angstrom exponent"}, {"aero_opt_thick_443", "Alpha_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.27.1", "Scaling_Factor_GADS.13.1", "!l2_flags.LAND", NULL, "dl", "Aerosol optical thickness at 443 nm"}, {"aero_opt_thick_865", "Alpha_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.27.1", "Scaling_Factor_GADS.13.1", "!l2_flags.WATER", NULL, "dl", "Aerosol optical thickness at 865 nm"}, {"cloud_albedo", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.34.1", "Scaling_Factor_GADS.20.1", "l2_flags.CLOUD", NULL, "dl", "Cloud albedo"}, {"cloud_opt_thick", "Alpha_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.28.1", "Scaling_Factor_GADS.14.1", "l2_flags.CLOUD", NULL, "dl", "Cloud optical thickness"}, {"cloud_top_press", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.35.1", "Scaling_Factor_GADS.21.1", "l2_flags.CLOUD", NULL, "hPa", "Cloud top pressure"}, {"cloud_type", "Alpha_OPT.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, "l2_flags.CLOUD", NULL, NULL, "Cloud type"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags", NULL, "Level 2 classification and quality flags"} }; static const struct BandDescriptor MER_FR__2P_IODD6_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"reflec_1", "Norm_rho_surf_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "Scaling_Factor_GADS.22.1", "Scaling_Factor_GADS.8.1", NULL, NULL, "dl", "Normalized surface reflectance, band 1"}, {"reflec_2", "Norm_rho_surf_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "Scaling_Factor_GADS.22.2", "Scaling_Factor_GADS.8.2", NULL, NULL, "dl", "Normalized surface reflectance, band 2"}, {"reflec_3", "Norm_rho_surf_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "Scaling_Factor_GADS.22.3", "Scaling_Factor_GADS.8.3", NULL, NULL, "dl", "Normalized surface reflectance, band 3"}, {"reflec_4", "Norm_rho_surf_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "Scaling_Factor_GADS.22.4", "Scaling_Factor_GADS.8.4", NULL, NULL, "dl", "Normalized surface reflectance, band 4"}, {"reflec_5", "Norm_rho_surf_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "Scaling_Factor_GADS.22.5", "Scaling_Factor_GADS.8.5", NULL, NULL, "dl", "Normalized surface reflectance, band 5"}, {"reflec_6", "Norm_rho_surf_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "Scaling_Factor_GADS.22.6", "Scaling_Factor_GADS.8.6", NULL, NULL, "dl", "Normalized surface reflectance, band 6"}, {"reflec_7", "Norm_rho_surf_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "Scaling_Factor_GADS.22.7", "Scaling_Factor_GADS.8.7", NULL, NULL, "dl", "Normalized surface reflectance, band 7"}, {"reflec_8", "Norm_rho_surf_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "Scaling_Factor_GADS.22.8", "Scaling_Factor_GADS.8.8", NULL, NULL, "dl", "Normalized surface reflectance, band 8"}, {"reflec_9", "Norm_rho_surf_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "Scaling_Factor_GADS.22.9", "Scaling_Factor_GADS.8.9", NULL, NULL, "dl", "Normalized surface reflectance, band 9"}, {"reflec_10", "Norm_rho_surf_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "Scaling_Factor_GADS.22.10", "Scaling_Factor_GADS.8.10", NULL, NULL, "dl", "Normalized surface reflectance, band 10"}, {"reflec_12", "Norm_rho_surf_11.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "Scaling_Factor_GADS.22.11", "Scaling_Factor_GADS.8.11", NULL, NULL, "dl", "Normalized surface reflectance, band 12"}, {"reflec_13", "Norm_rho_surf_12.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "Scaling_Factor_GADS.22.12", "Scaling_Factor_GADS.8.12", NULL, NULL, "dl", "Normalized surface reflectance, band 13"}, {"reflec_14", "Norm_rho_surf_13.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "Scaling_Factor_GADS.22.13", "Scaling_Factor_GADS.8.13", NULL, NULL, "dl", "Normalized surface reflectance, band 14"}, {"water_vapour", "Vapour_Content.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.30.1", "Scaling_Factor_GADS.16.1", NULL, NULL, "g/cm^2", "Water vapour content"}, {"algal_1", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 1 content"}, {"algal_2", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 2 content"}, {"yellow_subs", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.24.1", "Scaling_Factor_GADS.10.1", "l2_flags.WATER", NULL, "1/m", "Yellow substance"}, {"total_susp", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.25.1", "Scaling_Factor_GADS.11.1", "l2_flags.WATER", NULL, "g/m^3", "Total suspended matter"}, {"photosyn_rad", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.31.1", "Scaling_Factor_GADS.17.1", "l2_flags.WATER", NULL, "myEinstein/m^2", "Photosynthetically active radiation"}, {"toa_veg", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.32.1", "Scaling_Factor_GADS.18.1", "l2_flags.LAND", NULL, "1", "TOA vegetation index"}, {"boa_veg", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.33.1", "Scaling_Factor_GADS.19.1", "l2_flags.LAND", NULL, "1", "BOA vegetation index"}, {"rect_refl_nir", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.40.1", "Scaling_Factor_GADS.39.1", "l2_flags.LAND", NULL, "dl", "Rectified surface reflectances"}, {"rect_refl_red", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.42.1", "Scaling_Factor_GADS.41.1", "l2_flags.LAND", NULL, "dl", "Rectified surface reflectances"}, {"surf_press", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.29.1", "Scaling_Factor_GADS.15.1", "l2_flags.LAND", NULL, "hPa", "Surface pressure"}, {"aero_epsilon", "Epsilon_OPT.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.26.1", "Scaling_Factor_GADS.12.1", "!l2_flags.CLOUD", NULL, "dl", "Aerosol epsilon"}, {"aero_opt_thick", "Epsilon_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.27.1", "Scaling_Factor_GADS.13.1", "!l2_flags.CLOUD", NULL, "dl", "Aerosol optical thickness"}, {"cloud_albedo", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.34.1", "Scaling_Factor_GADS.20.1", "l2_flags.CLOUD", NULL, "dl", "Cloud albedo"}, {"cloud_opt_thick", "Epsilon_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.28.1", "Scaling_Factor_GADS.14.1", "l2_flags.CLOUD", NULL, "dl", "Cloud optical thickness"}, {"cloud_top_press", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.35.1", "Scaling_Factor_GADS.21.1", "l2_flags.CLOUD", NULL, "hPa", "Cloud top pressure"}, {"cloud_type", "Epsilon_OPT.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, "l2_flags.CLOUD", NULL, NULL, "Cloud type"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags_IODD6", NULL, "Level 2 classification and quality flags"} }; static const struct BandDescriptor MER_LRC_2P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "dl", "Relative humidity"}, {"water_vapour", "Vapour_Content.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.6.1", "Scaling_Factor_GADS.3.1", NULL, NULL, "g/cm^2", "Water vapour content"}, {"cloud_opt_thick", "Cloud_Type_OT.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.4.1", "Scaling_Factor_GADS.1.1", "l2_flags.CLOUD", NULL, "dl", "Cloud optical thickness"}, {"cloud_top_press", "Cloud_Top_Pressure.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.5.1", "Scaling_Factor_GADS.2.1", "l2_flags.CLOUD", NULL, "hPa", "Cloud top pressure"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags", NULL, "Level 2 classification and quality flags"} }; static const struct BandDescriptor MER_RRC_2P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "dl", "Relative humidity"}, {"water_vapour", "Vapour_Content.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.6.1", "Scaling_Factor_GADS.3.1", NULL, NULL, "g/cm^2", "Water vapour content"}, {"cloud_opt_thick", "Cloud_Type_OT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.4.1", "Scaling_Factor_GADS.1.1", "l2_flags.CLOUD", NULL, "dl", "Cloud optical thickness"}, {"cloud_top_press", "Cloud_Top_Pressure.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.5.1", "Scaling_Factor_GADS.2.1", "l2_flags.CLOUD", NULL, "hPa", "Cloud top pressure"}, {"cloud_type", "Cloud_Type_OT.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, "l2_flags.CLOUD", NULL, NULL, "Cloud type"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags", NULL, "Level 2 Classification and quality flags"} }; static const struct BandDescriptor MER_RRV_2P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.01", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "0.1", NULL, NULL, "dl", "Relative humidity"}, {"toa_veg", "TOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.3.1", "Scaling_Factor_GADS.1.1", "l2_flags.LAND", NULL, "dl", "TOA vegetation index"}, {"boa_veg", "BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.4.1", "Scaling_Factor_GADS.2.1", "l2_flags.LAND", NULL, "dl", "BOA vegetation index"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags", NULL, "Level 2 Classification and quality flags"} }; static const struct BandDescriptor MER_RR__1P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"radiance_1", "Radiance_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.1", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 1"}, {"radiance_2", "Radiance_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.2", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 2"}, {"radiance_3", "Radiance_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.3", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 3"}, {"radiance_4", "Radiance_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.4", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 4"}, {"radiance_5", "Radiance_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.5", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 5"}, {"radiance_6", "Radiance_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.6", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 6"}, {"radiance_7", "Radiance_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.7", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 7"}, {"radiance_8", "Radiance_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.8", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 8"}, {"radiance_9", "Radiance_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.9", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 9"}, {"radiance_10", "Radiance_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.10", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 10"}, {"radiance_11", "Radiance_11.3", e_smod_1OF1, e_tid_float, 11, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.11", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 11"}, {"radiance_12", "Radiance_12.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.12", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 12"}, {"radiance_13", "Radiance_13.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.13", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 13"}, {"radiance_14", "Radiance_14.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.14", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 14"}, {"radiance_15", "Radiance_15.3", e_smod_1OF1, e_tid_float, 15, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.15", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 15"}, {"l1_flags", "Flags.3", e_smod_1OF1, e_tid_uchar, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__1P_flags", NULL, "Level 1b classification and quality flags"}, {"detector_index", "Flags.4", e_smod_1OF1, e_tid_short, -1, e_smid_non, NULL, NULL, NULL, NULL, NULL, "Detector index"} }; static const struct BandDescriptor MER_RR__1P_IODD5_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"radiance_1", "Radiance_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.1", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 1"}, {"radiance_2", "Radiance_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.2", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 2"}, {"radiance_3", "Radiance_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.3", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 3"}, {"radiance_4", "Radiance_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.4", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 4"}, {"radiance_5", "Radiance_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.5", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 5"}, {"radiance_6", "Radiance_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.6", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 6"}, {"radiance_7", "Radiance_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.7", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 7"}, {"radiance_8", "Radiance_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.8", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 8"}, {"radiance_9", "Radiance_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.9", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 9"}, {"radiance_10", "Radiance_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.10", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 10"}, {"radiance_11", "Radiance_11.3", e_smod_1OF1, e_tid_float, 11, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.11", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 11"}, {"radiance_12", "Radiance_12.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.12", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 12"}, {"radiance_13", "Radiance_13.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.13", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 13"}, {"radiance_14", "Radiance_14.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.14", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 14"}, {"radiance_15", "Radiance_15.3", e_smod_1OF1, e_tid_float, 15, e_smid_lin, "0.0", "Scaling_Factor_GADS.8.15", "!l1_flags.INVALID", NULL, "mW/(m^2*sr*nm)", "TOA radiance band 15"}, {"l1_flags", "Flags.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__1P_flags", NULL, "Level 1b classification and quality flags"}, {"ssi", "Flags.3", e_smod_2OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, NULL, NULL, NULL, "Spectral shift index"} }; static const struct BandDescriptor MER_RR__2P_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"reflec_1", "Norm_rho_surf_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "Scaling_Factor_GADS.22.1", "Scaling_Factor_GADS.8.1", NULL, NULL, "dl", "Normalized surface reflectance, band 1"}, {"reflec_2", "Norm_rho_surf_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "Scaling_Factor_GADS.22.2", "Scaling_Factor_GADS.8.2", NULL, NULL, "dl", "Normalized surface reflectance, band 2"}, {"reflec_3", "Norm_rho_surf_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "Scaling_Factor_GADS.22.3", "Scaling_Factor_GADS.8.3", NULL, NULL, "dl", "Normalized surface reflectance, band 3"}, {"reflec_4", "Norm_rho_surf_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "Scaling_Factor_GADS.22.4", "Scaling_Factor_GADS.8.4", NULL, NULL, "dl", "Normalized surface reflectance, band 4"}, {"reflec_5", "Norm_rho_surf_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "Scaling_Factor_GADS.22.5", "Scaling_Factor_GADS.8.5", NULL, NULL, "dl", "Normalized surface reflectance, band 5"}, {"reflec_6", "Norm_rho_surf_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "Scaling_Factor_GADS.22.6", "Scaling_Factor_GADS.8.6", NULL, NULL, "dl", "Normalized surface reflectance, band 6"}, {"reflec_7", "Norm_rho_surf_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "Scaling_Factor_GADS.22.7", "Scaling_Factor_GADS.8.7", NULL, NULL, "dl", "Normalized surface reflectance, band 7"}, {"reflec_8", "Norm_rho_surf_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "Scaling_Factor_GADS.22.8", "Scaling_Factor_GADS.8.8", NULL, NULL, "dl", "Normalized surface reflectance, band 8"}, {"reflec_9", "Norm_rho_surf_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "Scaling_Factor_GADS.22.9", "Scaling_Factor_GADS.8.9", NULL, NULL, "dl", "Normalized surface reflectance, band 9"}, {"reflec_10", "Norm_rho_surf_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "Scaling_Factor_GADS.22.10", "Scaling_Factor_GADS.8.10", NULL, NULL, "dl", "Normalized surface reflectance, band 10"}, {"reflec_12", "Norm_rho_surf_11.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "Scaling_Factor_GADS.22.11", "Scaling_Factor_GADS.8.11", NULL, NULL, "dl", "Normalized surface reflectance, band 12"}, {"reflec_13", "Norm_rho_surf_12.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "Scaling_Factor_GADS.22.12", "Scaling_Factor_GADS.8.12", NULL, NULL, "dl", "Normalized surface reflectance, band 13"}, {"reflec_14", "Norm_rho_surf_13.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "Scaling_Factor_GADS.22.13", "Scaling_Factor_GADS.8.13", NULL, NULL, "dl", "Normalized surface reflectance, band 14"}, {"water_vapour", "Vapour_Content.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.30.1", "Scaling_Factor_GADS.16.1", NULL, NULL, "g/cm^2", "Water vapour content"}, {"algal_1", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 1 content"}, {"algal_2", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 2 content"}, {"yellow_subs", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.24.1", "Scaling_Factor_GADS.10.1", "l2_flags.WATER", NULL, "1/m", "Yellow substance"}, {"total_susp", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.25.1", "Scaling_Factor_GADS.11.1", "l2_flags.WATER", NULL, "g/m^3", "Total suspended matter"}, {"photosyn_rad", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.31.1", "Scaling_Factor_GADS.17.1", "l2_flags.WATER", NULL, "myEinstein/(m^2*s)", "Photosynthetically active radiation"}, {"toa_veg", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.32.1", "Scaling_Factor_GADS.18.1", "l2_flags.LAND", NULL, "1", "MGVI - MERIS global vegetation index"}, {"boa_veg", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.33.1", "Scaling_Factor_GADS.19.1", "l2_flags.LAND", NULL, "1", "MTCI - MERIS terrestrial chlorophyll index"}, {"rect_refl_red", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.40.1", "Scaling_Factor_GADS.39.1", "l2_flags.LAND", NULL, "dl", "Rectified reflectance in a red band"}, {"rect_refl_nir", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.42.1", "Scaling_Factor_GADS.41.1", "l2_flags.LAND", NULL, "dl", "Rectified reflectances in a near infrared band"}, {"surf_press", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.29.1", "Scaling_Factor_GADS.15.1", "l2_flags.LAND", NULL, "hPa", "Surface pressure"}, {"aero_alpha", "Alpha_OPT.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.26.1", "Scaling_Factor_GADS.12.1", "!l2_flags.CLOUD", NULL, "dl", "Aerosol Angstrom exponent"}, {"aero_opt_thick_443", "Alpha_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.27.1", "Scaling_Factor_GADS.13.1", "!l2_flags.LAND", NULL, "dl", "Aerosol optical thickness at 443 nm"}, {"aero_opt_thick_865", "Alpha_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.27.1", "Scaling_Factor_GADS.13.1", "!l2_flags.WATER", NULL, "dl", "Aerosol optical thickness at 865 nm"}, {"cloud_albedo", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.34.1", "Scaling_Factor_GADS.20.1", "l2_flags.CLOUD", NULL, "dl", "Cloud albedo"}, {"cloud_opt_thick", "Alpha_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.28.1", "Scaling_Factor_GADS.14.1", "l2_flags.CLOUD", NULL, "dl", "Cloud optical thickness"}, {"cloud_top_press", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.35.1", "Scaling_Factor_GADS.21.1", "l2_flags.CLOUD", NULL, "hPa", "Cloud top pressure"}, {"cloud_type", "Alpha_OPT.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, "l2_flags.CLOUD", NULL, NULL, "Cloud type"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags", NULL, "Level 2 classification and quality flags"} }; static const struct BandDescriptor MER_RR__2P_IODD6_band_data[] = { {"latitude", "Tie_points_ADS.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Latitude of the tie points (WGS-84), positive N"}, {"longitude", "Tie_points_ADS.4", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Longitude of the tie points (WGS-84), Greenwich origin, positive E"}, {"dem_alt", "Tie_points_ADS.5", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.1.1", NULL, NULL, "m", "Digital elevation model altitude"}, {"dem_rough", "Tie_points_ADS.6", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.2.1", NULL, NULL, "m", "Digital elevation model roughness"}, {"lat_corr", "Tie_points_ADS.7", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model latitude corrections"}, {"lon_corr", "Tie_points_ADS.8", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Digital elevation model longitude corrections"}, {"sun_zenith", "Tie_points_ADS.9", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun zenith angle"}, {"sun_azimuth", "Tie_points_ADS.10", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Sun azimuth angles"}, {"view_zenith", "Tie_points_ADS.11", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing zenith angles"}, {"view_azimuth", "Tie_points_ADS.12", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "1.0E-06", NULL, NULL, "deg", "Viewing azimuth angles"}, {"zonal_wind", "Tie_points_ADS.13", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.3.1", NULL, NULL, "m/s", "Zonal wind"}, {"merid_wind", "Tie_points_ADS.14", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.4.1", NULL, NULL, "m/s", "Meridional wind"}, {"atm_press", "Tie_points_ADS.15", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.5.1", NULL, NULL, "hPa", "Mean sea level pressure"}, {"ozone", "Tie_points_ADS.16", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.6.1", NULL, NULL, "DU", "Total ozone"}, {"rel_hum", "Tie_points_ADS.17", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "0.0", "Scaling_Factor_GADS.7.1", NULL, NULL, "%", "Relative humidity"}, {"reflec_1", "Norm_rho_surf_1.3", e_smod_1OF1, e_tid_float, 1, e_smid_lin, "Scaling_Factor_GADS.22.1", "Scaling_Factor_GADS.8.1", NULL, NULL, "dl", "Normalized surface reflectance, band 1"}, {"reflec_2", "Norm_rho_surf_2.3", e_smod_1OF1, e_tid_float, 2, e_smid_lin, "Scaling_Factor_GADS.22.2", "Scaling_Factor_GADS.8.2", NULL, NULL, "dl", "Normalized surface reflectance, band 2"}, {"reflec_3", "Norm_rho_surf_3.3", e_smod_1OF1, e_tid_float, 3, e_smid_lin, "Scaling_Factor_GADS.22.3", "Scaling_Factor_GADS.8.3", NULL, NULL, "dl", "Normalized surface reflectance, band 3"}, {"reflec_4", "Norm_rho_surf_4.3", e_smod_1OF1, e_tid_float, 4, e_smid_lin, "Scaling_Factor_GADS.22.4", "Scaling_Factor_GADS.8.4", NULL, NULL, "dl", "Normalized surface reflectance, band 4"}, {"reflec_5", "Norm_rho_surf_5.3", e_smod_1OF1, e_tid_float, 5, e_smid_lin, "Scaling_Factor_GADS.22.5", "Scaling_Factor_GADS.8.5", NULL, NULL, "dl", "Normalized surface reflectance, band 5"}, {"reflec_6", "Norm_rho_surf_6.3", e_smod_1OF1, e_tid_float, 6, e_smid_lin, "Scaling_Factor_GADS.22.6", "Scaling_Factor_GADS.8.6", NULL, NULL, "dl", "Normalized surface reflectance, band 6"}, {"reflec_7", "Norm_rho_surf_7.3", e_smod_1OF1, e_tid_float, 7, e_smid_lin, "Scaling_Factor_GADS.22.7", "Scaling_Factor_GADS.8.7", NULL, NULL, "dl", "Normalized surface reflectance, band 7"}, {"reflec_8", "Norm_rho_surf_8.3", e_smod_1OF1, e_tid_float, 8, e_smid_lin, "Scaling_Factor_GADS.22.8", "Scaling_Factor_GADS.8.8", NULL, NULL, "dl", "Normalized surface reflectance, band 8"}, {"reflec_9", "Norm_rho_surf_9.3", e_smod_1OF1, e_tid_float, 9, e_smid_lin, "Scaling_Factor_GADS.22.9", "Scaling_Factor_GADS.8.9", NULL, NULL, "dl", "Normalized surface reflectance, band 9"}, {"reflec_10", "Norm_rho_surf_10.3", e_smod_1OF1, e_tid_float, 10, e_smid_lin, "Scaling_Factor_GADS.22.10", "Scaling_Factor_GADS.8.10", NULL, NULL, "dl", "Normalized surface reflectance, band 10"}, {"reflec_12", "Norm_rho_surf_11.3", e_smod_1OF1, e_tid_float, 12, e_smid_lin, "Scaling_Factor_GADS.22.11", "Scaling_Factor_GADS.8.11", NULL, NULL, "dl", "Normalized surface reflectance, band 12"}, {"reflec_13", "Norm_rho_surf_12.3", e_smod_1OF1, e_tid_float, 13, e_smid_lin, "Scaling_Factor_GADS.22.12", "Scaling_Factor_GADS.8.12", NULL, NULL, "dl", "Normalized surface reflectance, band 13"}, {"reflec_14", "Norm_rho_surf_13.3", e_smod_1OF1, e_tid_float, 14, e_smid_lin, "Scaling_Factor_GADS.22.13", "Scaling_Factor_GADS.8.13", NULL, NULL, "dl", "Normalized surface reflectance, band 14"}, {"water_vapour", "Vapour_Content.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.30.1", "Scaling_Factor_GADS.16.1", NULL, NULL, "g/cm^2", "Water vapour content"}, {"algal_1", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 1 content"}, {"algal_2", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.23.1", "Scaling_Factor_GADS.9.1", "l2_flags.WATER", NULL, "mg/m^3", "Chlorophyll 2 content"}, {"yellow_subs", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.24.1", "Scaling_Factor_GADS.10.1", "l2_flags.WATER", NULL, "1/m", "Yellow substance"}, {"total_susp", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_log, "Scaling_Factor_GADS.25.1", "Scaling_Factor_GADS.11.1", "l2_flags.WATER", NULL, "g/m^3", "Total suspended matter"}, {"photosyn_rad", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.31.1", "Scaling_Factor_GADS.17.1", "l2_flags.WATER", NULL, "myEinstein/m^2", "Photosynthetically active radiation"}, {"toa_veg", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.32.1", "Scaling_Factor_GADS.18.1", "l2_flags.LAND", NULL, "1", "TOA vegetation index"}, {"boa_veg", "Chl_2_BOAVI.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.33.1", "Scaling_Factor_GADS.19.1", "l2_flags.LAND", NULL, "1", "BOA vegetation index"}, {"rect_refl_nir", "YS_SPM_Rect_rho.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.40.1", "Scaling_Factor_GADS.39.1", "l2_flags.LAND", NULL, "dl", "Rectified surface reflectances"}, {"rect_refl_red", "YS_SPM_Rect_rho.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.42.1", "Scaling_Factor_GADS.41.1", "l2_flags.LAND", NULL, "dl", "Rectified surface reflectances"}, {"surf_press", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.29.1", "Scaling_Factor_GADS.15.1", "l2_flags.LAND", NULL, "hPa", "Surface pressure"}, {"aero_epsilon", "Epsilon_OPT.3", e_smod_1OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.26.1", "Scaling_Factor_GADS.12.1", "!l2_flags.CLOUD", NULL, "dl", "Aerosol epsilon"}, {"aero_opt_thick", "Epsilon_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.27.1", "Scaling_Factor_GADS.13.1", "!l2_flags.CLOUD", NULL, "dl", "Aerosol optical thickness"}, {"cloud_albedo", "Press_PAR_Alb.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.34.1", "Scaling_Factor_GADS.20.1", "l2_flags.CLOUD", NULL, "dl", "Cloud albedo"}, {"cloud_opt_thick", "Epsilon_OPT.3", e_smod_2OF2, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.28.1", "Scaling_Factor_GADS.14.1", "l2_flags.CLOUD", NULL, "dl", "Cloud optical thickness"}, {"cloud_top_press", "Chl_1_TOAVI_CTP.3", e_smod_1OF1, e_tid_float, -1, e_smid_lin, "Scaling_Factor_GADS.35.1", "Scaling_Factor_GADS.21.1", "l2_flags.CLOUD", NULL, "hPa", "Cloud top pressure"}, {"cloud_type", "Epsilon_OPT.3", e_smod_1OF2, e_tid_uchar, -1, e_smid_non, NULL, NULL, "l2_flags.CLOUD", NULL, NULL, "Cloud type"}, {"l2_flags", "Flags.3", e_smod_3TOI, e_tid_uint, -1, e_smid_non, NULL, NULL, NULL, "MER_RR__2P_flags_IODD6", NULL, "Level 2 classification and quality flags"} }; static const struct FlagDescriptor ATS_NR__2P_flags_data[] = { {"NADIR_SST_ONLY_VALID", 1, {0, 0}, "Nadir-only SST is valid"}, {"NADIR_SST_ONLY_37_MY_VALID", 1, {1, 0}, "Nadir-only SST retrieval includes 3.7 micron channel"}, {"DUAL_SST_VALID", 1, {2, 0}, "Dual-view SST is valid"}, {"DUAL_SST_VALID_37_MY", 1, {3, 0}, "Dual-view SST retrieval includes 3.7 micron channel"}, {"LAND", 1, {4, 0}, "Pixel is over land"}, {"NADIR_CLOUD", 1, {5, 0}, "Nadir-view pixel is cloudy"}, {"NADIR_BLANKING", 1, {6, 0}, "Nadir-view pixel has blanking pulse"}, {"NADIR_COSMETIC", 1, {7, 0}, "Nadir-view pixel is cosmetic fill"}, {"FWARD_CLOUD", 1, {8, 0}, "Forward-view pixel is cloudy"}, {"FWARD_BLANKING", 1, {9, 0}, "Forward-view pixel has blanking pulse"}, {"FWARD_COSMETIC", 1, {10, 0}, "Forward-view pixel is cosmetic fill"}, {"CLOUDY_16_MY", 1, {11, 0}, "One or both views flagged cloudy by 1.6 micron test (daytime only)"}, {"CLOUDY_11_12_MY", 1, {12, 0}, "Cloud flagged by 11 micron/12 micron nadir-forward test"}, {"CLOUDY_HISTO", 1, {13, 0}, "One or both views flagged cloudy by infra-red histogram test"} }; static const struct FlagDescriptor ATS_TOA_1P_cloud_flags_data[] = { {"LAND", 1, {0, 0}, "Pixel is over land"}, {"CLOUDY", 1, {1, 0}, "Pixel is cloudy (result of all cloud tests)"}, {"SUN_GLINT", 1, {2, 0}, "Sunglint detected in pixel"}, {"CLOUDY_REFL_HIST", 1, {3, 0}, "1.6 micron reflectance histogram test shows pixel cloudy (day-time only)"}, {"CLOUDY_SPAT_COHER_16", 1, {4, 0}, "1.6 micron spatial coherence test shows pixel cloudy (day-time only)"}, {"CLOUDY_SPAT_COHER_11", 1, {5, 0}, "11 micron spatial coherence test shows pixel cloudy"}, {"CLOUDY_GROSS_12", 1, {6, 0}, "12 micron gross cloud test shows pixel cloudy"}, {"CLOUDY_CIRRUS_11_12", 1, {7, 0}, "11/12 micron thin cirrus test shows pixel cloudy"}, {"CLOUDY_MED_HI_LEVEL_37_12", 1, {8, 0}, "3.7/12 micron medium/high level test shows pixel cloudy (night-time only)"}, {"CLOUDY_FOG_LOW_STRATUS_11_37", 1, {9, 0}, "11/3.7 micron fog/low stratus test shows pixel cloudy (night-time only)"}, {"CLOUDY_VW_DIFF_11_12", 1, {10, 0}, "11/12 micron view-difference test shows pixel cloudy"}, {"CLOUDY_VW_DIFF_37_11", 1, {11, 0}, "3.7/11 micron view-difference test shows pixel cloudy (night-time only)"}, {"CLOUDY_THERM_HIST_11_12", 1, {12, 0}, "11/12 micron thermal histogram test shows pixel cloudy"} }; static const struct FlagDescriptor ATS_TOA_1P_confid_flags_data[] = { {"BLANKING", 1, {0, 0}, "Blanking Pulse"}, {"COSMETIC", 1, {1, 0}, "Cosmetic Fill Pixel"}, {"SCAN_ABSENT", 1, {2, 0}, "Entire scan absent from telemetry"}, {"ABSENT", 1, {3, 0}, "Pixel absent from telemetry"}, {"NOT_DECOMPR", 1, {4, 0}, "Pixel not decompressed owing to error in packet validation"}, {"NO_SIGNAL", 1, {5, 0}, "No signal in some channel (zero count)"}, {"SATURATION", 1, {6, 0}, "Saturation in some channel (maximum count)"}, {"OUT_OF_RANGE", 1, {7, 0}, "Derived radiance of some channel outside range of calibration"}, {"NO_CALIB_PARAM", 1, {8, 0}, "Calibration Parameters unavailable for pixel"}, {"UNFILLED", 1, {9, 0}, "Pixel unfilled (cosmetic fill algorithm unable to find nearest neighbour pixel)"} }; static const struct FlagDescriptor MER_RR__1P_flags_data[] = { {"COSMETIC", 1, {0, 0}, "Pixel is cosmetic"}, {"DUPLICATED", 1, {1, 0}, "Pixel has been duplicated (filled in)"}, {"GLINT_RISK", 1, {2, 0}, "Pixel has glint risk"}, {"SUSPECT", 1, {3, 0}, "Pixel is suspect"}, {"LAND_OCEAN", 1, {4, 0}, "Pixel is over land, not ocean"}, {"BRIGHT", 1, {5, 0}, "Pixel is bright (saturation)"}, {"COASTLINE", 1, {6, 0}, "Pixel is part of a coastline"}, {"INVALID", 1, {7, 0}, "Pixel is invalid"} }; static const struct FlagDescriptor MER_RR__2P_flags_data[] = { {"LAND", 1, {23, 0}, "Land product available"}, {"CLOUD", 1, {22, 0}, "Cloud product available"}, {"WATER", 1, {21, 0}, "Water product available"}, {"PCD_1_13", 1, {20, 0}, "Uncertain normalized surface reflectance"}, {"PCD_14", 1, {19, 0}, "Uncertain total water vapour content"}, {"PCD_15", 1, {18, 0}, "Uncertain algal pigment index 1 or cloud top pressure or top of atmosphere vegetation index"}, {"PCD_16", 1, {17, 0}, "Uncertain yellow substance and total suspended matter or rectified reflectances"}, {"PCD_17", 1, {16, 0}, "Uncertain algal pigment index 2 or bottom of atmosphere vegetation index"}, {"PCD_18", 1, {15, 0}, "Uncertain PAR or cloud albedo or land surface pressure"}, {"PCD_19", 1, {14, 0}, "Uncertain aerosol type and optical thickness or cloud optical thickness"}, {"COASTLINE", 1, {13, 0}, "Coastline pixel"}, {"COSMETIC", 1, {12, 0}, "Cosmetic pixel (from level-1b)"}, {"SUSPECT", 1, {11, 0}, "Suspect pixel (from level-1b)"}, {"OOADB", 1, {10, 0}, "Aerosol model is out of aerosol model database"}, {"ABSOA_DUST", 1, {9, 0}, "Dust-like absorbing aerosol selected for atmosphere correction"}, {"CASE2_S", 1, {8, 0}, "Turbid (sediment dominated Case 2) water"}, {"CASE2_ANOM", 2, {7, 21}, "Anomalous scattering water"}, {"TOAVI_BRIGHT", 2, {7, 23}, "Bright pixel flagged by MGVI processing"}, {"CASE2_Y", 2, {6, 21}, "Yellow substance loaded water"}, {"TOAVI_BAD", 2, {6, 23}, "Bad pixel flagged by MGVI processing"}, {"ICE_HAZE", 2, {5, 21}, "Ice or high aerosol load pixel"}, {"TOAVI_CSI", 2, {5, 23}, "Cloud, snow or ice over land pixel acc. to MGVI processing"}, {"MEDIUM_GLINT", 2, {4, 21}, "Corrected for glint (water)"}, {"TOAVI_WS", 2, {4, 23}, "Water/shadow pixel acc. to MGVI processing (land)"}, {"LARS_ON", 2, {3, 23}, "Land aerosol remote sensing turned on"}, {"BPAC_ON", 2, {3, 21}, "Bright pixels atmospheric correction activated (water)"}, {"HIGH_GLINT", 2, {2, 21}, "High (uncorrected) glint (water)"}, {"TOAVI_INVAL_REC", 2, {2, 23}, "Invalid rectification (land)"}, {"LOW_SUN", 1, {1, 0}, "Sun low above horizon (or conversely high sun zenith angle)"}, {"LOW_PRESSURE", 1, {0, 0}, "Computed pressure is lower than ECMWF one (land, cloud)"}, {"WHITE_SCATTERER", 2, {0, 21}, "Presense of white scatterer in water"} }; static const struct FlagDescriptor MER_RR__2P_flags_IODD6_data[] = { {"LAND", 1, {23, 0}, "Land product available"}, {"CLOUD", 1, {22, 0}, "Cloud product available"}, {"WATER", 1, {21, 0}, "Water product available"}, {"PCD_1_13", 1, {20, 0}, "Uncertain normalized surface reflectance"}, {"PCD_14", 1, {19, 0}, "Uncertain total water vapour content"}, {"PCD_15", 1, {18, 0}, "Uncertain algal pigment index 1 or cloud top pressure or top of atmosphere vegetation index"}, {"PCD_16", 1, {17, 0}, "Uncertain yellow substance and total suspended matter or rectified reflectances"}, {"PCD_17", 1, {16, 0}, "Uncertain algal pigment index 2 or bottom of atmosphere vegetation index"}, {"PCD_18", 1, {15, 0}, "Uncertain PAR or cloud albedo or land surface pressure"}, {"PCD_19", 1, {14, 0}, "Uncertain aerosol type and optical thickness or cloud optical thickness"}, {"COASTLINE", 1, {13, 0}, "Coastline pixel"}, {"COSMETIC", 1, {12, 0}, "Cosmetic pixel (from level-1B)"}, {"SUSPECT", 1, {11, 0}, "Suspect pixel (from level-1B)"}, {"ABSOA_CONT", 1, {10, 0}, "Continental absorbing aerosol"}, {"ABSOA_DUST", 1, {9, 0}, "Dust-like absorbing aerosol"}, {"CASE2_S", 1, {8, 0}, "Turbid water"}, {"CASE2_ANOM", 2, {7, 21}, "Anomalous scattering water"}, {"TOAVI_BRIGHT", 2, {7, 23}, "Bright pixel flagged by TOAVI processing"}, {"CASE2_Y", 2, {6, 21}, "Yellow substance loaded water"}, {"TOAVI_BAD", 2, {6, 23}, "Bad pixel flagged by TOAVI processing"}, {"ICE_HAZE", 2, {5, 21}, "Ice at high aerosol load pixel"}, {"TOAVI_CSI", 2, {5, 23}, "Cloud, snow or ice flagged by TOAVI"}, {"MEDIUM_GLINT", 2, {4, 21}, "Corrected for glint"}, {"TOAVI_WS", 2, {4, 23}, "Water or deep shadow flagged by TOAVI"}, {"DDV", 1, {3, 0}, "Dense dark vegetation"}, {"HIGH_GLINT", 2, {2, 21}, "High (uncorrected) glint"}, {"TOAVI_INVAL_REC", 2, {2, 23}, "Invalid rectification flagged by TOAVI"}, {"P_CONFIDENCE", 1, {1, 0}, "The two pressure estimates do not compare successfully"}, {"LOW_PRESSURE", 1, {0, 0}, "Computed pressure lower than ECMWF one"} }; const struct DatasetDescriptorTable dddb_product_tables[33] = { {"ASA_APG_1P", "ASAR Alternating Polarization Ellipsoid Geocoded Image", 11, ASA_APG_1P_dataset_data}, {"ASA_APM_1P", "ASAR Alternating Polarization Medium Resolution Image product", 10, ASA_APM_1P_dataset_data}, {"ASA_APP_1P", "ASAR Alternating Polarization Mode Precision Image", 10, ASA_APP_1P_dataset_data}, {"ASA_APS_1P", "ASAR Alternating Polarization Mode Single Look Complex", 8, ASA_APS_1P_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_IMG_1P", "ASAR Image Mode Ellipsoid Geocoded Image", 9, ASA_IMG_1P_dataset_data}, {"ASA_IMM_1P", "ASAR Image Mode Medium Resolution Image", 8, ASA_IMM_1P_dataset_data}, {"ASA_IMP_1P", "ASAR Image Mode Precision Image", 8, ASA_IMP_1P_dataset_data}, {"ASA_IMS_1P", "ASAR Image Mode Single Look Complex", 6, ASA_IMS_1P_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_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}, {"ASA_WVW_2P", "ASAR Wave Mode Wave Spectra", 4, ASA_WVW_2P_dataset_data}, {"ATS_AR__2P", "AATSR averaged geophysical product", 16, ATS_AR__2P_dataset_data}, {"ATS_MET_2P", "AATSR Spatially Averaged Sea Surface Temperature for Meteo Users", 1, ATS_MET_2P_dataset_data}, {"ATS_NR__2P", "AATSR geophysical product (full resolution)", 8, ATS_NR__2P_dataset_data}, {"ATS_TOA_1P", "AATSR Gridded brightness temperature and reflectance", 26, ATS_TOA_1P_dataset_data}, {"MER_FR__1P", "MERIS Full Resolution Geolocated and Calibrated TOA Radiance", 19, MER_FR__1P_dataset_data}, {"MER_FRS_1P", "MERIS Full Resolution Full Swath Geolocated and Calibrated TOA Radiance", 19, MER_FR__1P_dataset_data}, {"MER_FR__1P_IODD5", "MERIS Full Resolution Geolocated and Calibrated TOA Radiance", 19, MER_FR__1P_IODD5_dataset_data}, {"MER_FR__2P", "MERIS Full Resolution Geophysical Product", 23, MER_FR__2P_dataset_data}, {"MER_FRS_2P", "MERIS Full Resolution Full Swath Geophysical Product", 23, MER_FR__2P_dataset_data}, {"MER_FR__2P_IODD6", "MERIS Full Resolution Geophysical Product", 23, MER_FR__2P_IODD6_dataset_data}, {"MER_LRC_2P", "MERIS Extracted Cloud Thickness and Water Vapour for Meteo Users", 7, MER_LRC_2P_dataset_data}, {"MER_RRC_2P", "MERIS Extracted Cloud Thickness and Water Vapour", 7, MER_RRC_2P_dataset_data}, {"MER_RRV_2P", "MERIS Extracted Vegetation Indices", 6, MER_RRV_2P_dataset_data}, {"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] = { {"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}, {"ASA_APS_1P", "ASAR Alternating Polarization SLC Image", 6, ASA_APS_1P_band_data}, {"ASA_AP__BP", "ASAR Alternatin Polarization Mode Browse Product", 5, ASA_AP__BP_band_data}, {"ASA_IMG_1P", "ASAR Image Mode Geocoded Image", 5, ASA_IMG_1P_band_data}, {"ASA_IMM_1P", "ASAR Image Mode Medium Resolution Image", 5, ASA_IMM_1P_band_data}, {"ASA_IMP_1P", "ASAR Image Mode Precision Image", 5, ASA_IMP_1P_band_data}, {"ASA_IMS_1P", "ASAR Image Mode SLC Image", 6, ASA_IMS_1P_band_data}, {"ASA_IM__BP", "ASAR Image Mode Browse Product", 5, ASA_IM__BP_band_data}, {"ASA_WSM_1P", "ASAR Wide Swath Mode Medium Resolution Image", 5, ASA_WSM_1P_band_data}, {"ASA_WS__BP", "ASAR Wide Swap Mode Browse Image", 5, ASA_WS__BP_band_data}, {"ATS_NR__2P", "AATSR Geophysical Level 2 Product", 22, ATS_NR__2P_band_data}, {"ATS_TOA_1P", "AATSR Gridded brightness temperature and reflectance", 33, ATS_TOA_1P_band_data}, {"MER_FR__1P", "MERIS Level 1b Full Resolution Geophysical Product", 32, MER_FR__1P_band_data}, {"MER_FRS_1P", "MERIS Level 1b Full Resolution Full Swath Geophysical Product", 32, MER_FR__1P_band_data}, {"MER_FR__1P_IODD5", "MERIS Level 1b Full Resolution Geophysical Product", 32, MER_FR__1P_IODD5_band_data}, {"MER_FR__2P", "MERIS Level 2 Full Resolution Geophysical Product", 47, MER_FR__2P_band_data}, {"MER_FRS_2P", "MERIS Level 2 Full Resolution Full Swath Geophysical Product", 47, MER_FR__2P_band_data}, {"MER_FR__2P_IODD6", "MERIS Level 2 Full Resolution Geophysical Product", 46, MER_FR__2P_IODD6_band_data}, {"MER_LRC_2P", "MERIS Level 2 Extracted Cloud Thickness and Water Vapour for Meteo Users", 19, MER_LRC_2P_band_data}, {"MER_RRC_2P", "MERIS Level 2 Extracted Cloud Thickness and Water Vapour", 20, MER_RRC_2P_band_data}, {"MER_RRV_2P", "MERIS Level 2 Extracted Vegetation Indices", 18, MER_RRV_2P_band_data}, {"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} }; 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}, {"ATS_TOA_1P_confid_flags", "AATSR TOA Level 1b Confidence Flag Codings", 10, ATS_TOA_1P_confid_flags_data}, {"MER_RR__1P_flags", "MERIS RR Level 1b Flag Codings", 8, MER_RR__1P_flags_data}, {"MER_RR__2P_flags", "MERIS Level 2 Flag Codings", 31, MER_RR__2P_flags_data}, {"MER_RR__2P_flags_IODD6", "MERIS Level 2 Flag Codings", 29, MER_RR__2P_flags_IODD6_data}, }; const struct RecordDescriptorTable dddb_meris_rec_tables[23] = { {"MER_LRC_2P_MDSR_cl_thick", "Level 2 MDS Cloud Optical Thickness", 3, MER_LRC_2P_MDSR_cl_thick_meris_rec_data}, {"MER_LRC_2P_MDSR_cl_top_press", "Level 2 MDS Cloud Top Pressure", 3, MER_LRC_2P_MDSR_cl_top_press_meris_rec_data}, {"MER_LRC_2P_MDSR_flag", "Level 2 MDS Flags", 3, MER_LRC_2P_MDSR_flag_meris_rec_data}, {"MER_LRC_2P_MDSR_twv", "Level 2 MDS Total Water vapour", 3, MER_LRC_2P_MDSR_twv_meris_rec_data}, {"MER_RRC_2P_GADS_sfgi", "Level 2 GADS Scaling Factor and Offsets", 7, MER_RRC_2P_GADS_sfgi_meris_rec_data}, {"MER_RRV_2P_GADS_sfgi", "Level 2 GADS Scaling Factor and Offsets", 5, MER_RRV_2P_GADS_sfgi_meris_rec_data}, {"MER_RR__1P_ADSR_sq", "Level 1b Summary Quality ADS(SQ ADS)", 4, MER_RR__1P_ADSR_sq_meris_rec_data}, {"MER_RR__1P_ADSR_tie_pt", "Level 2 ADS Tie Points Location & Aux. Data ( L ADS)", 17, MER_RR__1P_ADSR_tie_pt_meris_rec_data}, {"MER_RR__1P_GADS_sfgi", "Level 1b GADS Scaling Factor and General Info", 12, MER_RR__1P_GADS_sfgi_meris_rec_data}, {"MER_RR__1P_MDSR_16", "Level 1b MDS (16) Flags & Spectral Shift Index", 4, MER_RR__1P_MDSR_16_meris_rec_data}, {"MER_RR__1P_MDSR_16_IODD5", "Level 1b MDS (16) Flags & Detector Index", 3, MER_RR__1P_MDSR_16_IODD5_meris_rec_data}, {"MER_RR__1P_MDSR_1_15", "Level 1b MDS (1) TOA Radiance", 3, MER_RR__1P_MDSR_1_15_meris_rec_data}, {"MER_RR__2P_ADSR_sq", "Level 2 ADS Summary Quality ADS (SQ ADS)", 21, MER_RR__2P_ADSR_sq_meris_rec_data}, {"MER_RR__2P_GADS_sfgi", "Level 2 GADS Scaling Factors and Offsets", 43, MER_RR__2P_GADS_sfgi_meris_rec_data}, {"MER_RR__2P_MDSR_14", "Level 2 MDS(14) water vapour content", 3, MER_RR__2P_MDSR_14_meris_rec_data}, {"MER_RR__2P_MDSR_15", "Level 2 MDS(15) algal index I TOAVI", 3, MER_RR__2P_MDSR_15_meris_rec_data}, {"MER_RR__2P_MDSR_16", "Level 2 MDS(16) yellow substance total suspended matter or rectified reflectances", 3, MER_RR__2P_MDSR_16_meris_rec_data}, {"MER_RR__2P_MDSR_17", "Level 2 MDS(17) algal index II BOAVI", 3, MER_RR__2P_MDSR_17_meris_rec_data}, {"MER_RR__2P_MDSR_18", "Level 2 MDS(18) surface pressure PAR cloud albedo", 3, MER_RR__2P_MDSR_18_meris_rec_data}, {"MER_RR__2P_MDSR_19", "Level 2 MDS(19) aerosol epsilon or cloud type and optical thickness", 3, MER_RR__2P_MDSR_19_meris_rec_data}, {"MER_RR__2P_MDSR_19_IODD6", "Level 2 MDS(19) aerosol epsilon or cloud type and optical thickness", 3, MER_RR__2P_MDSR_19_IODD6_meris_rec_data}, {"MER_RR__2P_MDSR_1_13", "Level 2 MDS(1) normalised surface reflectance", 3, MER_RR__2P_MDSR_1_13_meris_rec_data}, {"MER_RR__2P_MDSR_20", "Level 2 MDS(20) flags", 3, MER_RR__2P_MDSR_20_meris_rec_data} }; const struct RecordDescriptorTable dddb_aatsr_rec_tables[20] = { {"ATS_AR__2P_MDSR_lr_large", "BT/TOA Land record 50 km cell MDS", 90, ATS_AR__2P_MDSR_lr_large_aatsr_rec_data}, {"ATS_AR__2P_MDSR_lr_small", "BT/TOA Land record 17 km cell MDS", 46, ATS_AR__2P_MDSR_lr_small_aatsr_rec_data}, {"ATS_AR__2P_MDSR_lst_large", "LST record 50 km cell MDS", 17, ATS_AR__2P_MDSR_lst_large_aatsr_rec_data}, {"ATS_AR__2P_MDSR_lst_small", "LST record 17 km cell MDS", 11, ATS_AR__2P_MDSR_lst_small_aatsr_rec_data}, {"ATS_AR__2P_MDSR_sr_large", "BT/TOA Sea record 50 km cell MDS", 86, ATS_AR__2P_MDSR_sr_large_aatsr_rec_data}, {"ATS_AR__2P_MDSR_sr_small", "BT/TOA Sea record 17 km cell MDS", 42, ATS_AR__2P_MDSR_sr_small_aatsr_rec_data}, {"ATS_AR__2P_MDSR_sst_large", "SST record 50 km cell MDS", 17, ATS_AR__2P_MDSR_sst_large_aatsr_rec_data}, {"ATS_AR__2P_MDSR_sst_small", "SST record 17 km cell MDS", 11, ATS_AR__2P_MDSR_sst_small_aatsr_rec_data}, {"ATS_MET_2P_meteo_user_prod", "10-arcminute mds", 17, ATS_MET_2P_meteo_user_prod_aatsr_rec_data}, {"ATS_NR__2P_ADSR_sq", "Summary Quality ADS", 25, ATS_NR__2P_ADSR_sq_aatsr_rec_data}, {"ATS_NR__2P_MDSR_dp", "Distributed product MDS", 7, ATS_NR__2P_MDSR_dp_aatsr_rec_data}, {"ATS_TOA_1P_ADSR_loc", "Grid pixel latitude and longtitude topographic corrections ADS", 12, ATS_TOA_1P_ADSR_loc_aatsr_rec_data}, {"ATS_TOA_1P_ADSR_pix", "Scan and pixel number nadir view ADS", 6, ATS_TOA_1P_ADSR_pix_aatsr_rec_data}, {"ATS_TOA_1P_ADSR_sa", "Nadir view solar angles ADS", 9, ATS_TOA_1P_ADSR_sa_aatsr_rec_data}, {"ATS_TOA_1P_ADSR_scan", "Scan pixel x and y ADS", 7, ATS_TOA_1P_ADSR_scan_aatsr_rec_data}, {"ATS_TOA_1P_ADSR_sq", "Summary quality ADS", 25, ATS_TOA_1P_ADSR_sq_aatsr_rec_data}, {"ATS_TOA_1P_MDSR_brgt", "12 micron nadir view MDS", 5, ATS_TOA_1P_MDSR_brgt_aatsr_rec_data}, {"ATS_TOA_1P_MDSR_cl", "Cloud flag nadir view MDS", 5, ATS_TOA_1P_MDSR_cl_aatsr_rec_data}, {"ATS_TOA_1P_MDSR_conf", "Confidence words nadir view MDS", 5, ATS_TOA_1P_MDSR_conf_aatsr_rec_data}, {"ATS_VC1_AX_GADS", "Visible calibration coefficients GADS", 32, ATS_VC1_AX_GADS_aatsr_rec_data} }; const struct RecordDescriptorTable dddb_asar_rec_tables[20] = { {"ASAR_Antenna_ADSR", "Antenna Elevation patterns(s)", 7, ASAR_Antenna_ADSR_asar_rec_data}, {"ASAR_Chirp_ADSR", "chirp parameters", 140, ASAR_Chirp_ADSR_asar_rec_data}, {"ASAR_Dop_Cen_ADSR", "Doppler Centroid Parameters", 7, ASAR_Dop_Cen_ADSR_asar_rec_data}, {"ASAR_Geo_Grid_ADSR", "Geolocation Grid ADSRs", 18, ASAR_Geo_Grid_ADSR_asar_rec_data}, {"ASAR_Image_MDSR_BP", "Measurement Data Set 1", 4, ASAR_Image_MDSR_BP_asar_rec_data}, {"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_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}, {"ASAR_SRGR_ADSR", "Slant Range to Ground Range conversion parameters", 6, ASAR_SRGR_ADSR_asar_rec_data}, {"ASAR_Spectra_MDSR", "Measurement Data Set containing spectra. 1 MDSR per spectra.", 29, ASAR_Spectra_MDSR_asar_rec_data}, {"ASAR_Wave_Geolocation_ADSR", "Wave Mode Geolocation ADS", 5, ASAR_Wave_Geolocation_ADSR_asar_rec_data}, {"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_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} }; bcdev-epr-api-a922482/src/epr_dddb.h000066400000000000000000000044611142554441000171150ustar00rootroot00000000000000#ifndef EPR_DDDB_H_INCL #define EPR_DDDB_H_INCL #include "epr_api.h" #ifdef __cplusplus extern "C" { #endif struct RecordDescriptor { const char* id; const EPR_EDataTypeId type; const char* unit; const int elem_size; const char* num_elem; const char* description; }; struct DatasetDescriptor { const char* id; const char* ds_name; const struct RecordDescriptor* rec_descriptor; const char* description; }; struct BandDescriptor { const char* id; const char* rec_name; const EPR_ESampleModel sample_offset; const EPR_EDataTypeId type; const int spectral_index; const EPR_EScalingMethod scale_method; const char* scale_offset; const char* scale_factor; const char* bitmask_expr; const char* flag_coding_name; const char* unit; const char* description; }; struct FlagDescriptor { const char* id; const int num_indices; const int bit_indices[2]; const char* description; }; struct DatasetDescriptorTable { const char* name; const char* description; int num_descriptors; const struct DatasetDescriptor* descriptors; }; struct BandDescriptorTable { const char* name; const char* description; int num_descriptors; const struct BandDescriptor* descriptors; }; struct FlagDescriptorTable { const char* name; const char* description; int num_descriptors; const struct FlagDescriptor* descriptors; }; struct RecordDescriptorTable { const char* name; const char* description; int num_descriptors; const struct RecordDescriptor* descriptors; }; extern const struct DatasetDescriptorTable dddb_product_tables[33]; extern const struct BandDescriptorTable dddb_band_tables[27]; 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_FLAG_CODING_TABLES 6 #define EPR_NUM_MERIS_REC_TABLES 23 #define EPR_NUM_AATSR_REC_TABLES 20 #define EPR_NUM_ASAR_REC_TABLES 20 #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_DDDB_H_INCL */ bcdev-epr-api-a922482/src/epr_dsd.c000066400000000000000000000524161142554441000167700ustar00rootroot00000000000000/* * $Id: epr_dsd.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" /** * Opens dsd for a dataset description, * obtained from an ENVISAT product file. * * @param dsd_index the number of dsd (zero-based), emrty dsd inclusive * * @return the the pointer at the dsd information. */ EPR_SDSD* epr_create_dsd(int dsd_index) { EPR_SDSD* dsd; dsd = (EPR_SDSD*) calloc(1, sizeof (EPR_SDSD)); if (dsd == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_dsd: out of memory"); return NULL; } dsd->index = dsd_index; return dsd; } uint epr_get_num_datasets(EPR_SProductId* product_id) { epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_num_datasets: product_id must not be NULL"); return (uint)-1; } return product_id->dataset_ids->length; } EPR_SDatasetId* epr_get_dataset_id_at(EPR_SProductId* product_id, uint index) { EPR_SDatasetId* dataset_id = NULL; epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_dataset_id_at: product_id must not be NULL"); return NULL; } if (index >= product_id->dataset_ids->length){ epr_set_err(e_err_index_out_of_range, "epr_get_dataset_id_at: dataset index out of range"); return NULL; } dataset_id = (EPR_SDatasetId*)epr_get_ptr_array_elem_at(product_id->dataset_ids, index); return dataset_id; } EPR_SDatasetId* epr_get_dataset_id(EPR_SProductId* product_id, const char* dataset_name) { EPR_SDatasetId* dataset_id = NULL; int datasets_num, i; epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_dataset_id: product_id must not be NULL"); return NULL; } if (dataset_name == NULL) { epr_set_err(e_err_null_pointer, "epr_get_dataset_id: dataset_name must not be NULL"); return NULL; } datasets_num = epr_get_num_datasets(product_id); for (i = 0; i < datasets_num; i ++) { dataset_id = epr_get_dataset_id_at(product_id, i); if (epr_equal_names(dataset_name, epr_get_dataset_name(dataset_id))) return dataset_id; } epr_set_err(e_err_invalid_band_name, "epr_get_dataset_id: dataset_id not found"); return NULL; } int epr_detect_meris_iodd_version(EPR_SProductId* product_id) { EPR_SDSD** elems; int size = 0; int rec_size = 0; int i, ioddFormat = 7; char* name; /* reflect L1b product format change from IODD5 to IODD6 */ if (strncmp("MER_RR__1P", product_id->id_string, 10) == 0 || strncmp("MER_FR__1P", product_id->id_string, 10) == 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 (strcmp("Flags MDS(16)", name) == 0) { rec_size = elems[i]->dsr_size; if (rec_size == 2255 || rec_size == 4495) { ioddFormat = 5; } break; } } } /* reflect L2 product format change from IODD6 to IODD7 */ else if (strncmp("MER_RR__2P", product_id->id_string, 10) == 0 || strncmp("MER_FR__2P", product_id->id_string, 10) == 0) { elems = (EPR_SDSD**)product_id->dsd_array->elems; size = product_id->dsd_array->length; for (i=0; ids_name; if (strcmp("Epsilon, OPT - MDS(19)", name) == 0) { ioddFormat = 6; break; } } } return ioddFormat; } /** * Release the memory allocated through a dataset ID. * * @param dsd the dataset description identifier, if NULL the function * immediately returns zero. * @return zero for success, an error code otherwise */ void epr_free_dsd(EPR_SDSD* dsd) { if (dsd == NULL) return; epr_free_string(dsd->ds_name); dsd->ds_name = NULL; epr_free_string(dsd->ds_type); dsd->ds_type = NULL; epr_free_string(dsd->filename); dsd->filename = NULL; dsd->index = 0; dsd->ds_offset = 0; dsd->ds_size = 0; dsd->num_dsr = 0; dsd->dsr_size = 0; free(dsd); } #define EPR_LENGTH_DS_NAME_IDENTIFIER 9 #define EPR_LENGTH_DS_TYPE_IDENTIFIER 8 #define EPR_LENGTH_FILENAME_IDENTIFIER 10 #define EPR_LENGTH_DS_OFFSEN_IDENTIFIER 11 #define EPR_LENGTH_DS_SIZE_IDENTIFIER 9 #define EPR_LENGTH_NUM_DSR_IDENTIFIER 9 #define EPR_LENGTH_DSR_SIZE_IDENTIFIER 10 #define EPR_LENGTH_DS_NAME_FIELD 39 #define EPR_LENGTH_DS_TYPE_FIELD 10 #define EPR_LENGTH_DS_FILENAME_FIELD 74 #define EPR_LENGTH_DS_OFFSEN_FIELD 39 #define EPR_LENGTH_DS_SIZE_FIELD 37 #define EPR_LENGTH_NUM_DSR_FIELD 20 #define EPR_LENGTH_DSR_SIZE_FIELD 28 #define EPR_LENGTH_EMPTY_FIELD 33 /** * Reads a dataset description from an ENVISAT product file. * * @param envisat_source_file the handle of the given ENVISAT product file, * must not be NULL * @param pos number of the dataset description in ENVISAT product file, * @return a new dataset description or NULL if an error occured. */ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos) { uint l; uint l_limit; char code_block[EPR_LINE_MAX_LENGTH]; EPR_SDSD* dsd; int ch = '"'; char* tmp; if (envisat_source_file == NULL) { epr_set_err(e_err_file_access_denied, "epr_read_each_dsd: the product file handle must not be NULL"); return NULL; } dsd = (EPR_SDSD*) calloc(1, sizeof (EPR_SDSD)); if (dsd == NULL) { epr_set_err(e_err_out_of_memory, "epr_read_each_dsd: out of memory"); return NULL; } if (* pos == 0) { l_limit = 9999; } else l_limit = 0; for (l = 0; l <= l_limit; l++) { fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "DS_NAME=\"", EPR_LENGTH_DS_NAME_IDENTIFIER) == 0) { /* DS_NAME to be searched for */ if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_NAME_FIELD)) || ((uint)(strrchr(code_block, ch) - code_block) != (uint)(strlen(code_block) - 2))) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dataset name format"); epr_free_dsd(dsd); return NULL; } dsd->ds_name = epr_sub_string(code_block, EPR_LENGTH_DS_NAME_IDENTIFIER, strlen(code_block) - EPR_LENGTH_DS_NAME_IDENTIFIER - 2); if (dsd->ds_name == NULL) { epr_set_err(e_err_invalid_value, "epr_read_each_dsd: invalid DS_NAME value"); epr_free_dsd(dsd); return NULL; } /* DS_TYPE to be searched for */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "DS_TYPE=", EPR_LENGTH_DS_TYPE_IDENTIFIER) == 0) { dsd->ds_type = epr_sub_string(code_block, EPR_LENGTH_DS_TYPE_IDENTIFIER, strlen(code_block) - EPR_LENGTH_DS_TYPE_IDENTIFIER - 1); if (dsd->ds_type == NULL) { epr_set_err(e_err_invalid_value, "epr_read_each_dsd: invalid DS_TYPE value"); epr_free_dsd(dsd); return NULL; } } /* FILENAME to be searched for */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "FILENAME=\"", EPR_LENGTH_FILENAME_IDENTIFIER) == 0) { if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_FILENAME_FIELD)) || ((uint)(strrchr(code_block, ch) - code_block) != (uint)(strlen(code_block) - 2))) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dataset filename format"); epr_free_dsd(dsd); return NULL; } dsd->filename = epr_sub_string(code_block, EPR_LENGTH_FILENAME_IDENTIFIER, strlen(code_block) - EPR_LENGTH_FILENAME_IDENTIFIER - 1); if (dsd->ds_name == NULL) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid file name"); epr_free_dsd(dsd); return NULL; } } /* DS_OFFSET to be searched for */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "DS_OFFSET=+", EPR_LENGTH_DS_OFFSEN_IDENTIFIER) == 0) { if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_OFFSEN_FIELD)) || (strncmp(code_block + strlen(code_block) - strlen("") - 1, "", strlen("")) != 0)) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dataset filename format"); epr_free_dsd(dsd); return NULL; } tmp = epr_sub_string(code_block, EPR_LENGTH_DS_OFFSEN_IDENTIFIER, strlen(code_block) - strlen("") - EPR_LENGTH_DS_OFFSEN_IDENTIFIER - 1); dsd->ds_offset = (uint)epr_str_to_number(tmp); epr_free_string(tmp); if (dsd->ds_offset == -1) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid OFFSET value"); epr_free_dsd(dsd); return NULL; } } /* DS_SIZE to be searched for */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "DS_SIZE=+", EPR_LENGTH_DS_SIZE_IDENTIFIER) == 0) { if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DS_SIZE_FIELD)) || (strncmp(code_block + strlen(code_block) - strlen("") - 1, "", strlen("")) != 0)) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dataset filename format"); epr_free_dsd(dsd); return NULL; } tmp = epr_sub_string(code_block, EPR_LENGTH_DS_SIZE_IDENTIFIER, strlen(code_block) - strlen("") - EPR_LENGTH_DS_SIZE_IDENTIFIER - 1); dsd->ds_size = (uint)epr_str_to_number(tmp); epr_free_string(tmp); if (dsd->ds_size == -1) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid OFFSET value"); epr_free_dsd(dsd); return NULL; } } /* NUM_DSR to be searched for */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "NUM_DSR=+", EPR_LENGTH_NUM_DSR_IDENTIFIER) == 0) { if ((uint)strlen(code_block) != (uint)(EPR_LENGTH_NUM_DSR_FIELD)) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dataset record number format"); epr_free_dsd(dsd); return NULL; } tmp = epr_sub_string(code_block, EPR_LENGTH_NUM_DSR_IDENTIFIER, strlen(code_block) - EPR_LENGTH_NUM_DSR_IDENTIFIER - 1); dsd->num_dsr = (uint)epr_str_to_number(tmp); epr_free_string(tmp); if (dsd->num_dsr == -1) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dsr number value"); epr_free_dsd(dsd); return NULL; } } /* DSR_SIZE to be searched for */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "DSR_SIZE=+", EPR_LENGTH_DSR_SIZE_IDENTIFIER) == 0) { if (((uint)strlen(code_block) != (uint)(EPR_LENGTH_DSR_SIZE_FIELD)) || (strncmp(code_block + strlen(code_block) - strlen("") - 1, "", strlen("")) != 0)) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid dataset record size format"); epr_free_dsd(dsd); return NULL; } tmp = epr_sub_string(code_block, EPR_LENGTH_DSR_SIZE_IDENTIFIER, strlen(code_block) - strlen("") - EPR_LENGTH_DSR_SIZE_IDENTIFIER - 1); dsd->dsr_size = (uint)epr_str_to_number(tmp); epr_free_string(tmp); if (dsd->dsr_size == -1) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid record size value"); epr_free_dsd(dsd); return NULL; } } /* EMPTY LINE BETWEEN DSD's */ fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if ((strlen(code_block) > 0) && (code_block[0] != ' ')) { epr_set_err(e_err_invalid_data_format, "epr_read_each_dsd: invalid code_block, must be empty"); epr_free_dsd(dsd); return NULL; } *pos = *pos + 1; return dsd; } } epr_free_dsd(dsd); return NULL; } /** * Finds the first dataset description from an ENVISAT product file. * * @param envisat_source_file the handle of the given ENVISAT product file, * must not be NULL * @param sph_length [bytes] the length of SPH part from the given ENVISAT product file, * must not be NULL * @return the offset to first searched for dsd or 0 if not found. */ uint epr_find_first_dsd(FILE* envisat_source_file, uint sph_length) { uint l; char code_block[EPR_LINE_MAX_LENGTH]; if (envisat_source_file == NULL) { epr_set_err(e_err_file_access_denied, "epr_find_first_dsd: the product file handle must not be NULL"); return 0; } l = 0; while (l < sph_length) { fgets(code_block, EPR_LINE_MAX_LENGTH, envisat_source_file); if (strncmp (code_block, "DS_NAME=\"", EPR_LENGTH_DS_NAME_IDENTIFIER) == 0) { return l; } else { l += strlen(code_block); } } return 0; } #define EPR_LENGTH_NUM_DSD_FIELD 20 /** * Reads all dataset descriptions from an ENVISAT product file. * * @param product_id the file identifier, if NULL the function * immediately returns NULL. * @return an array of dataset descriptions or NULL if an error occured. */ EPR_SPtrArray* epr_read_all_dsds(EPR_SProductId* product_id) { EPR_SPtrArray* dsds_array = NULL; EPR_SRecord* dsd_record = NULL; const EPR_SField* field; EPR_SDSD* dsd; uint sph_length; char* code_block; int numread; uint dsd_number = 0; uint dsd_begin = 0; uint dsd_index; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_read_all_dsds: product_id must not be NULL"); return NULL; } dsds_array = epr_create_ptr_array(32); field = epr_get_field(product_id->mph_record, "NUM_DSD"); dsd_number = ((uint*) field->elems)[0]; /*dsd_begin = epr_api.epr_head_size - dsd_number * EPR_DSD_SIZE;*/ if (fseek(product_id->istream, EPR_MPH_SIZE, SEEK_SET) != 0) { epr_set_err(e_err_file_access_denied, "epr_read_all_dsds: file seek failed"); if (dsds_array != NULL) { epr_free_ptr_array(dsds_array); } return NULL; } field = epr_get_field(product_id->mph_record, "SPH_SIZE"); sph_length = ((uint*) field->elems)[0]; dsd_begin = EPR_MPH_SIZE + (uint)epr_find_first_dsd(product_id->istream, sph_length); if (dsd_begin == EPR_MPH_SIZE) { epr_set_err(e_err_file_access_denied, "epr_read_all_dsds: no DS_NAME in SPH"); if (dsds_array != NULL) { epr_free_ptr_array(dsds_array); } return NULL; } for(dsd_index = 0; dsd_index < dsd_number; dsd_index ++) { if (fseek(product_id->istream, dsd_begin + dsd_index * EPR_DSD_SIZE, SEEK_SET) != 0) { epr_set_err(e_err_file_access_denied, "epr_read_all_dsds: file seek failed"); if (dsds_array != NULL) { epr_free_ptr_array(dsds_array); } return NULL; } code_block = epr_create_string(EPR_DSD_SIZE); numread = fread(code_block, 1, EPR_DSD_SIZE, product_id->istream); if ((uint)numread != EPR_DSD_SIZE) { epr_set_err(e_err_file_read_error, "epr_read_all_dsds: error in reading SPH from product data file"); if (code_block != NULL) { epr_free_string(code_block); code_block = NULL; } if (dsds_array != NULL) { epr_free_ptr_array(dsds_array); } return NULL; } /* If this is NOT an empty DSD (empty DSD's seem to be quite 'normal') */ if ((strlen(code_block) > 0) && (code_block[0] != ' ')) { dsd_record = epr_parse_header("dsd", code_block); dsd = epr_create_dsd(dsd_index); if (dsd == NULL) { epr_set_err(e_err_out_of_memory, "epr_read_all_dsds: out of memory"); if (code_block != NULL) { epr_free_string(code_block); code_block = NULL; } if (dsd_record != NULL) { epr_free_record_info(dsd_record->info); dsd_record->info = NULL; epr_free_record(dsd_record); dsd_record = NULL; } if (dsds_array != NULL) { epr_free_ptr_array(dsds_array); } return NULL; } field = epr_get_field(dsd_record, "DS_NAME"); dsd->ds_name = epr_clone_string((char*)field->elems); field = epr_get_field(dsd_record, "DS_TYPE"); dsd->ds_type = epr_sub_string((char*)field->elems, 0, sizeof(uchar)); field = epr_get_field(dsd_record, "FILENAME"); dsd->filename = epr_clone_string((char*)field->elems); field = epr_get_field(dsd_record, "DS_OFFSET"); dsd->ds_offset = (uint)((uint*) field->elems)[0]; field = epr_get_field(dsd_record, "DS_SIZE"); dsd->ds_size = (uint)((uint*) field->elems)[0]; field = epr_get_field(dsd_record, "NUM_DSR"); dsd->num_dsr = (uint)((uint*) field->elems)[0]; field = epr_get_field(dsd_record, "DSR_SIZE"); dsd->dsr_size = (uint)((uint*) field->elems)[0]; epr_add_ptr_array_elem(dsds_array, dsd); if (dsd_record != NULL) { /* NOTE:dsd_record->info is not a shared object, it is NOT used by * multiple instances of a DSD record, and thus, we free it here! */ epr_free_record_info(dsd_record->info); dsd_record->info = NULL; epr_free_record(dsd_record); dsd_record = NULL; } else { printf("%s\n", epr_get_last_err_message()); } } else { epr_log(e_log_debug, "empty DSD seen (don't worry)"); } epr_free_string(code_block); code_block = NULL; } rewind(product_id->istream); return dsds_array; } uint epr_get_num_dsds(const EPR_SProductId* product_id) { return product_id->dsd_array->length; } EPR_SDSD* epr_get_dsd_at(const EPR_SProductId* product_id, uint dsd_index) { EPR_SDSD* dsd = NULL; dsd = (EPR_SDSD*) epr_get_ptr_array_elem_at(product_id->dsd_array, dsd_index); return dsd; } bcdev-epr-api-a922482/src/epr_dsd.h000066400000000000000000000055421142554441000167730ustar00rootroot00000000000000/* * $Id: epr_dsd.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_DSD_H_INCL #define EPR_DSD_H_INCL #ifdef __cplusplus extern "C" { #endif #include "epr_ptrarray.h" #include /* just to get the ANSI-C type FILE */ /** * Opens dsd for a dataset description, * obtained from an ENVISAT product file. * * @param dsd_index the number of dsd (zero-based), emrty dsd inclusive * * @return the the pointer at the dsd information. */ EPR_SDSD* epr_create_dsd(int dsd_index); /** * Release the memory allocated through a dataset description, * obtained from an ENVISAT product file. * * @param dsd the file identifier, if NULL the function * immediately returns zero. * @return zero for success, an error code otherwise * @see epr_free_dsd_id */ void epr_free_dsd(EPR_SDSD* dsd); /** * Reads a dataset description from an ENVISAT product file. * * @param envisat_source_file the handle of the given ENVISAT product file, * must not be NULL * @param pos number of the dataset description in ENVISAT product file, * @return a new dataset description or NULL if an error occured. */ EPR_SDSD* epr_read_each_dsd(FILE* envisat_source_file, int* pos); /** * Reads all dataset descriptions from an ENVISAT product file. * * @param product_id the file identifier, if NULL the function * immediately returns NULL. * @return an array of dataset descriptions or NULL if an error occured. */ EPR_SPtrArray* epr_read_all_dsds(EPR_SProductId* product_id); /** * Finds the first dataset description from an ENVISAT product file. * * @param envisat_source_file the handle of the given ENVISAT product file, * must not be NULL * @param sph_length [bytes] the length of SPH part from the given ENVISAT product file, * must not be NULL * @return the offset to first founded dsd or 0 if not found. */ uint epr_find_first_dsd(FILE* envisat_source_file, uint sph_length); int epr_detect_meris_iodd_version(EPR_SProductId* product_id); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_DSD_H_INCL */ bcdev-epr-api-a922482/src/epr_dump.c000066400000000000000000000160731142554441000171620ustar00rootroot00000000000000/* * $Id: epr_dump.c,v 1.2 2009-03-27 10:25:54 sabine Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" /****************************** RESULTS OUTPUT ******************************/ /** * Dumps the record content to stdout. * * @param record the pointer to the record to be printed out. */ void epr_dump_record(const EPR_SRecord* record) { epr_print_record(record, stdout); } /** * Dumps the record content to an output FILE stream. * * @param record the pointer to the record to be printed out. * @param ostream the identifier of the output file. */ void epr_print_record(const EPR_SRecord* record, FILE* ostream) { uint field_index; EPR_SField* field = NULL; epr_clear_err(); for (field_index = 0; field_index < record->num_fields; field_index++) { field = record->fields[field_index]; epr_print_field(field, ostream); } } /** * Dumps the field content to stdout. * * @param field the pointer to the field to be printed out */ void epr_dump_field(const EPR_SField* field) { epr_print_field(field, stdout); } /** * Gets the field content to output FILE stream. * * @param field the pointer to the field to be printed out * @param ostream the identifier of the output file. */ void epr_print_field(const EPR_SField* field, FILE* ostream) { uint i; epr_clear_err(); fprintf(ostream, "%s = ", field->info->name); if (field->info->data_type_id == e_tid_string) { fprintf(ostream, "\"%s\"", (const char*) field->elems); /* fprintf(ostream, "\""); for (i = 0; i < field->info->num_elems; i++) { fprintf(ostream, "%c", ((char*) field->elems)[i]); } fprintf(ostream, "\""); */ } else if (field->info->data_type_id == e_tid_time) { EPR_STime* time = (EPR_STime*) field->elems; fprintf(ostream, "{d=%d, j=%d, m=%d}", time->days, time->seconds, time->microseconds); } else { if (field->info->num_elems > 1) { fprintf(ostream, "{"); } for (i = 0; i < field->info->num_elems; i++) { if (i > 0) fprintf(ostream, ", "); switch (field->info->data_type_id) { case e_tid_uchar: fprintf(ostream, "%u", ((uchar*) field->elems)[i]); break; case e_tid_char: fprintf(ostream, "%d", ((char*) field->elems)[i]); break; case e_tid_ushort: fprintf(ostream, "%u", ((ushort*) field->elems)[i]); break; case e_tid_short: fprintf(ostream, "%d", ((short*) field->elems)[i]); break; case e_tid_uint: fprintf(ostream, "%u", ((uint*) field->elems)[i]); break; case e_tid_int: fprintf(ostream, "%d", ((int*) field->elems)[i]); break; case e_tid_float: fprintf(ostream, "%f", ((float*) field->elems)[i]); break; case e_tid_double: fprintf(ostream, "%f", ((double*) field->elems)[i]); break; default: fprintf(ostream, "<>"); } } if (field->info->num_elems > 1) { fprintf(ostream, "}"); } } fprintf(ostream, "\n"); } /** * Dumps the element content to stdout. * * @param record the pointer to the element to be printed out. */ void epr_dump_element(const EPR_SRecord* record, uint field_index, uint element_index) { epr_print_element(record, field_index, element_index, stdout); } /** * Dumps the element content to an output FILE stream.. * * @param record the pointer to the element to be written out. */ void epr_print_element(const EPR_SRecord* record, uint field_index, uint element_index, FILE* ostream) { EPR_SField* field = NULL; epr_clear_err(); if (field_index >= record->num_fields) { epr_set_err(e_err_illegal_arg, "epr_print_element: element_index too large"); return; } field = record->fields[field_index]; if (element_index >= field->info->num_elems) { epr_set_err(e_err_illegal_arg, "epr_print_element: element_index too large"); return; } fprintf(ostream, "%s [%d][%d] = ", field->info->name, field_index, element_index); if (field->info->data_type_id == e_tid_string) { fprintf(ostream, "\""); fprintf(ostream, "%c", ((char*) field->elems)[element_index]); fprintf(ostream, "\""); } else if (field->info->data_type_id == e_tid_time) { EPR_STime* time = (EPR_STime*) field->elems; fprintf(ostream, "{d=%d, j=%d, m=%d}", time->days, time->seconds, time->microseconds); } else { fprintf(ostream, "{ "); switch (field->info->data_type_id) { case e_tid_uchar: fprintf(ostream, "%u", ((uchar*) field->elems)[element_index]); break; case e_tid_char: fprintf(ostream, "%d", ((char*) field->elems)[element_index]); break; case e_tid_ushort: fprintf(ostream, "%u", ((ushort*) field->elems)[element_index]); break; case e_tid_short: fprintf(ostream, "%d", ((short*) field->elems)[element_index]); break; case e_tid_uint: fprintf(ostream, "%u", ((uint*) field->elems)[element_index]); break; case e_tid_int: fprintf(ostream, "%d", ((int*) field->elems)[element_index]); break; case e_tid_float: fprintf(ostream, "%f", ((float*) field->elems)[element_index]); break; case e_tid_double: fprintf(ostream, "%f", ((double*) field->elems)[element_index]); break; default: fprintf(ostream, "<>"); } fprintf(ostream, " }"); } fprintf(ostream, " [%s]\n", field->info->unit); } bcdev-epr-api-a922482/src/epr_field.c000066400000000000000000000220421142554441000172710ustar00rootroot00000000000000/* * $Id: epr_field.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" /** * Creates the field information of the given record and returns the poiter at it. * * @param data_type_id the data type identifier * @param description the field description * @param field_name the field name * @param num_elems the number of field elements * @param num_bytes the number of bytes in each element * @param more_count the number of the element repetition * @param unit the unit descrimtion (name) * * @return the the pointer at the field information, or NULL if the file * it is not enough memory for some field_info element. */ EPR_SFieldInfo* epr_create_field_info(EPR_EDataTypeId data_type_id, char* description, char* field_name, uint num_elems, uint num_bytes, uint more_count, char* unit) { EPR_SFieldInfo* field_info = NULL; uint data_type_size; field_info = (EPR_SFieldInfo*) calloc(1, sizeof (EPR_SFieldInfo)); if (field_info == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_field_info: out of memory"); return NULL; } epr_assign_string(&field_info->name, field_name); if (field_info->name == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_field_info: out of memory"); return NULL; } if (description == NULL) { field_info->description = NULL; } else epr_assign_string(&field_info->description, description); if (unit == NULL) { field_info->unit = NULL; } else epr_assign_string(&field_info->unit, unit); data_type_size = epr_get_data_type_size(data_type_id); field_info->num_elems = num_elems; /* IMPORTANT !!!!it's one or the other !!!!*/ field_info->tot_size = num_elems * num_bytes * more_count; /*for the case data_type_size=num_bytes*/ /*this is not true for the case "spare" (1!=60)*/ /* field_info->tot_size = num_elems * data_type_size * more_count;*/ field_info->data_type_id = data_type_id; return field_info; } /** * Frees the memory allocated by the given 'field_info'. * *

After calling this function the give field_info pointer * should not be used anymore. * * @param field_info the field_info to be released */ void epr_free_field_info(EPR_SFieldInfo* field_info) { if (field_info == NULL) return; epr_free_string(field_info->name); field_info->name = NULL; epr_free_string(field_info->description); field_info->description = NULL; epr_free_string(field_info->unit); field_info->unit = NULL; field_info->num_elems = 0; field_info->tot_size = 0; field_info->data_type_id = 0; free(field_info); } /* Function: epr_create_field Access: public API Changelog: 2002/01/23 mp initial version */ /** * Creates a new field instance belongs to the given * record_info. * * @param the pointer at the field information. * must not be NULL * @return the new field instance * or NULL if an error occured. */ EPR_SField* epr_create_field(EPR_SFieldInfo* field_info) { EPR_SField* field = NULL; uint data_type_size = 0; field = (EPR_SField*) calloc(1, sizeof(EPR_SField)); if (field == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_field: out of memory"); return NULL; } field->magic = EPR_MAGIC_FIELD; data_type_size = epr_get_data_type_size(field_info->data_type_id); if (data_type_size == 0) { epr_set_err(e_err_illegal_data_type, "epr_create_field: illegal field_info data type identifier"); return NULL; } field->info = field_info; if (field_info->num_elems == 0) { free(field); epr_set_err(e_err_invalid_value, "epr_create_field: field_info->num_elems is zero"); return NULL; } if (field_info->data_type_id == e_tid_spare) { field->elems = calloc(field_info->tot_size, 1 /*byte*/); } else { if (field_info->data_type_id == e_tid_string) { /* Note that string always are considered as one single element, so we get the total number of characters from tot_size. Addidionally we reserve an extra character for the trailing zero (terminator), */ field->elems = calloc(field_info->tot_size + 1, sizeof (char)); } else { field->elems = calloc(field_info->num_elems, data_type_size); } } if (field->elems == NULL) { free(field); epr_set_err(e_err_out_of_memory, "epr_create_field: out of memory"); return NULL; } /* if (field->info->data_type_id == e_tid_string) { printf("string field: name=%s, num_elems=%d, tot_size=%d\n", field->info->name, field->info->num_elems, field->info->tot_size); } */ return field; } /** * Frees the memory allocated by the given 'field'. * *

After calling this function the give field pointer * should not be used anymore. * * @param field the field to be released */ void epr_free_field(EPR_SField* field) { if (field == NULL) return; /* Do NOT free field->info since many fields can share the same field->info! */ field->info = NULL; if (field->elems != NULL) { free(field->elems); field->elems = NULL; } free(field); } /** * Gets a full field from the given record. * *

The field is hier identified through the given name. *
It contains the field info and all corresponding values. * * @param record the record identifier, must not be NULL * @param field_name the the name of required field, must not be NULL. * * @return the field or NULL if an error occured. */ const EPR_SField* epr_get_field(const EPR_SRecord* record, const char* field_name) { EPR_SField* field; uint field_index; epr_clear_err(); if (record == NULL) { epr_set_err(e_err_invalid_record_name, "epr_get_field: record must not be NULL"); return NULL; } if (field_name == NULL) { epr_set_err(e_err_invalid_record_name, "epr_get_field: field_name must not be NULL"); return NULL; } for (field_index = 0; field_index < record->num_fields; field_index++) { field = record->fields[field_index]; if (strcmp(field_name, field->info->name) == 0) { return field; } } epr_set_err(e_err_illegal_arg, "epr_get_field: field not found"); return NULL; } uint epr_get_field_num_elems(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_num_elems: field-identifier must not be NULL"); return 0; } return field->info->num_elems; } const char* epr_get_field_name(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_name: field-identifier must not be NULL"); return NULL; } return field->info->name; } EPR_EDataTypeId epr_get_field_type(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_type: field-identifier must not be NULL"); return e_tid_unknown; } return field->info->data_type_id; } const char* epr_get_field_unit(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_unit: field-identifier must not be NULL"); return NULL; } return field->info->unit; } const char* epr_get_field_description(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_description: field-identifier must not be NULL"); return NULL; } return field->info->description; } bcdev-epr-api-a922482/src/epr_field.h000066400000000000000000000041141142554441000172760ustar00rootroot00000000000000/* * $Id: epr_field.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_FIELD_H_INCL #define EPR_FIELD_H_INCL #ifdef __cplusplus extern "C" { #endif #include /* just to get the ANSI-C type FILE */ /** * The EPR_FieldInfo structure contains meta information * about a particular record field. */ struct EPR_FieldInfo { /** * This field's name. */ char* name; /** * This field's internal data type. */ EPR_EDataTypeId data_type_id; /** * The number of data elements contained in this field (field-width). */ uint num_elems; /** * This field's unit. Optional, can be NULL. */ char* unit; /** * This field's description. Optional, can be NULL. */ char* description; /** * The total size in bytes of all data elements of a field. * tot_size is a derived variable, it is computed at * runtime and not stored in the DSD-DB. */ uint tot_size; }; EPR_SFieldInfo* epr_create_field_info(EPR_EDataTypeId data_type_id, char* description, char* field_name, uint num_elems, uint num_bytes, uint more_count, char* unit); EPR_SField* epr_create_field(EPR_SFieldInfo* field_info); void epr_free_field_info(EPR_SFieldInfo* field_info); void epr_free_field(EPR_SField* field); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_FIELD_H_INCL */ bcdev-epr-api-a922482/src/epr_msph.c000066400000000000000000000453711142554441000171670ustar00rootroot00000000000000/* * $Id: epr_msph.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" /** * Reads the full main product header (MPH) of the ENVISAT product file * by the given product identifier. * * @param product_id the product identifier, must not be NULL * @return a record representing the MPH of the specified product file * or NULL if an error occured. */ EPR_SRecord* epr_read_mph(EPR_SProductId* product_id) { EPR_SRecord* record = NULL; char* code_block; int numread; epr_clear_err(); code_block = epr_create_string(EPR_MPH_SIZE); if (code_block == NULL) { epr_set_err(e_err_out_of_memory, "epr_read_mph: out of memory"); return NULL; } rewind(product_id->istream); numread = fread(code_block, 1, EPR_MPH_SIZE, product_id->istream); if (numread != EPR_MPH_SIZE) { epr_set_err(e_err_file_read_error, "epr_read_mph: wrong reading MPH from product data file"); return NULL; } record = epr_parse_header("mph", code_block); if (record == NULL) { epr_set_err(e_err_invalid_record, "epr_read_mph: can not recognize the correct MPH from product data file"); } else { epr_add_ptr_array_elem(product_id->record_info_cache, record->info); } epr_free_string(code_block); return record; } /** * Reads the full specific product header (SPH) of the ENVISAT product file * by the given product identifier. * * @param product_id the product identifier, must not be NULL * @return a record representing the MPH of the specified product file * or NULL if an error occured. */ EPR_SRecord* epr_read_sph(EPR_SProductId* product_id) { EPR_SRecord* sph_record = NULL; const EPR_SField* field; char* code_block; int numread; uint sph_length = 0; uint sph_without_dsd_length = 0; uint dsd_number = 0; epr_clear_err(); if (product_id->mph_record == NULL) { product_id->mph_record = epr_read_mph(product_id); if (product_id->mph_record == NULL) { epr_set_err(e_err_file_read_error, "epr_read_sph: wrong MPH"); return NULL; } } field = epr_get_field(product_id->mph_record, "SPH_SIZE"); sph_length = ((uint*) field->elems)[0]; if (sph_length == 0) { epr_set_err(e_err_invalid_value, "epr_read_sph: wrong MPH: SPH_SIZE must be > 0"); return NULL; } field = epr_get_field(product_id->mph_record, "NUM_DSD"); dsd_number = ((uint*) field->elems)[0]; if (dsd_number == 0) { epr_set_err(e_err_invalid_value, "epr_read_sph: wrong MPH: NUM_DSD must be > 0"); return NULL; } epr_api.epr_head_size = sph_length + EPR_MPH_SIZE; if (fseek(product_id->istream, EPR_MPH_SIZE, SEEK_SET) != 0) { epr_set_err(e_err_file_access_denied, "epr_read_sph: file seek failed"); return NULL; } sph_without_dsd_length = sph_length - dsd_number * EPR_DSD_SIZE; code_block = epr_create_string(sph_without_dsd_length); numread = fread(code_block, 1, sph_without_dsd_length, product_id->istream); if ((uint)numread != sph_without_dsd_length) { epr_set_err(e_err_file_read_error, "epr_read_sph: wrong reading SPH from product data file"); return NULL; } sph_record = epr_parse_header("sph", code_block); if (sph_record == NULL) { epr_set_err(e_err_invalid_record, "epr_read_sph: can not recognize the correct SPH from product data file"); } else { epr_add_ptr_array_elem(product_id->record_info_cache, sph_record->info); } epr_free_string(code_block); return sph_record; } void epr_store_header(const char* header_name, const char* ascii_source) { FILE* os; char fname[1024]; sprintf(fname, "%s.txt", header_name); os=fopen(fname, "w"); fprintf(os,"%s", ascii_source); fclose(os); } /** * Parses the header ASCII information. * * @param header_name name of the header ascii information; * @param ascii_source the header ascii information was read; * @param record the identifier of header ascii information. */ EPR_SRecord* epr_parse_header(const char* header_name, const char* ascii_source) { EPR_SRecordInfo* record_info; EPR_SPtrArray* field_infos = NULL; EPR_SFieldInfo* field_info; EPR_SPtrArray* header_values = NULL; EPR_SRecord* record = NULL; EPR_EDataTypeId tp; char * code_block; char seps[] = EPR_HEADER_SEPARATOR_ARRAY; char * token_name; char * token_value; char * token_unit; char * h_name; int pos = 0; int pos_ascii = 0; uint num_bytes = 0; uint num_elems = 0; epr_clear_err(); /* uncomment for debugging purpose */ /* epr_store_header(header_name, ascii_source); */ header_values = epr_create_ptr_array(16); field_infos = epr_create_ptr_array(16); h_name = epr_clone_string(header_name); while ((code_block = epr_str_tok(ascii_source, "\n", &pos_ascii)) != NULL) { /*if EMPTY code_block*/ if ((strlen(code_block) > 0) && (code_block[0] == ' ')) { /* epr_log(e_log_info, "code_block is empty"); */ if (code_block != NULL) { epr_free_string(code_block); code_block = NULL; } continue; } /*if '=' separator*/ pos = 0; token_name = epr_str_tok(code_block, seps, &pos); if (pos == 1) { epr_set_err(e_err_invalid_keyword_name, "epr_parse_header: invalid ascii header: keyword is empty"); epr_free_string(token_name); if (code_block != NULL) { epr_free_string(code_block); code_block = NULL; } continue; } if (pos == (int)strlen(code_block) + 1) { epr_set_err(e_err_invalid_keyword_name, "epr_parse_header: invalid ascii header: keyword not found"); epr_free_string(token_name); if (code_block != NULL) { epr_free_string(code_block); code_block = NULL; } continue; } /*if STRING value*/ if (code_block[pos] == '\"') { pos ++; /* Note that strings always are considered as one single element, so we get the total number of characters from tot_size. Addidionally we reserve an extra character for the trailing zero (terminator), */ token_value = epr_strip_string_r(epr_str_tok(code_block, "\"", &pos)); token_unit = NULL; tp = e_tid_string; num_bytes = (uint)strlen(token_value); num_elems = 1; epr_add_ptr_array_elem(header_values, token_value); } else { token_value = epr_str_tok(code_block, seps, &pos); if (token_value == NULL) { epr_set_err(e_err_invalid_value, "epr_parse_header: invalid ascii header: value not found"); token_value = epr_clone_string(""); token_unit = NULL; tp = e_tid_uchar; num_bytes = 0; num_elems = 1; epr_add_ptr_array_elem(header_values, token_value); } else { /*if FLOAT-DOUBLE value*/ if (strchr(token_value, '.') != NULL || strchr(token_value, 'e') != NULL || strchr(token_value, 'E') != NULL) { epr_parse_double_token(header_values, token_value, &num_elems, &num_bytes, &tp); token_unit = epr_str_tok(code_block, seps, &pos); epr_free_string(token_value); token_value = NULL; /*if INTEGER_LONG value*/ } else if ((strlen(token_value) > 1)) { epr_parse_int_token(header_values, token_value, &num_elems, &num_bytes, &tp); epr_free_string(token_value); token_value = NULL; token_unit = epr_str_tok(code_block, seps, &pos); } else { /*if CHAR value*/ if (strlen(token_value) > 1) { epr_set_err(e_err_invalid_value, "epr_parse_header: invalid ascii header: illegal value"); token_value = epr_clone_string(""); token_unit = NULL; tp = e_tid_uchar; num_bytes = 0; num_elems = 1; epr_add_ptr_array_elem(header_values, token_value); epr_free_string(token_name); if (code_block != NULL) { epr_free_string(code_block); code_block = NULL; } continue; } else { token_unit = NULL; tp = e_tid_uchar; num_bytes = (uint)strlen(token_value); num_elems = 1; epr_add_ptr_array_elem(header_values, token_value); } } } } field_info = epr_create_field_info(tp, h_name, token_name, num_elems, num_bytes, 1, token_unit); epr_add_ptr_array_elem(field_infos, field_info); epr_free_string(token_name); epr_free_string(token_unit); epr_free_string(code_block); } if (field_infos->length > 0) { record_info = epr_create_record_info(h_name, field_infos); record = epr_create_record_from_info(record_info); epr_set_header_field_values(record, header_values); } epr_free_char_ptr_array(header_values); epr_free_string(h_name); return record; } void epr_parse_string_token(EPR_SPtrArray* header_values, char* token_value, uint* num_elems, uint* num_bytes, EPR_EDataTypeId* tp) { char exceptions[] = EPR_HEADER_EXCEPTIONS_ARRAY; char * token_value_o; char * tmp; uint pos_value = 0; int cyc = 0; pos_value = 0; *num_elems = 0; while ((tmp = epr_str_tok_tok(token_value + 1, "+-", exceptions, &pos_value)) != NULL) { cyc ++; token_value_o = epr_create_string(strlen(tmp) + 1); if (strlen(tmp) == strlen(token_value) - 1) { token_value_o[0] = token_value[0]; } else if (pos_value < (uint)strlen(token_value) - 1) { token_value_o[0] = token_value[pos_value - strlen(tmp) - 1]; } else { token_value_o[0] = token_value[pos_value - strlen(tmp)]; } strcat(token_value_o, tmp); epr_add_ptr_array_elem(header_values, token_value_o); epr_free_string(tmp); } *num_bytes = sizeof(double); *tp = e_tid_double; *num_elems = cyc; } void epr_parse_double_token(EPR_SPtrArray* header_values, char* token_value, uint* num_elems, uint* num_bytes, EPR_EDataTypeId* tp) { char exceptions[] = EPR_HEADER_EXCEPTIONS_ARRAY; char * token_value_o; char * tmp; uint pos_value = 0; int cyc = 0; pos_value = 0; *num_elems = 0; while ((tmp = epr_str_tok_tok(token_value + 1, "+-", exceptions, &pos_value)) != NULL) { cyc ++; token_value_o = epr_create_string(strlen(tmp) + 1); if (strlen(tmp) == strlen(token_value) - 1) { token_value_o[0] = token_value[0]; } else if (pos_value < (uint)strlen(token_value) - 1) { token_value_o[0] = token_value[pos_value - strlen(tmp) - 1]; } else { token_value_o[0] = token_value[pos_value - strlen(tmp)]; } strcat(token_value_o, tmp); epr_add_ptr_array_elem(header_values, token_value_o); epr_free_string(tmp); } *num_bytes = sizeof(double); *tp = e_tid_double; *num_elems = cyc; } void epr_parse_int_token(EPR_SPtrArray* header_values, char* token_value, uint* num_elems, uint* num_bytes, EPR_EDataTypeId* tp) { char * token_value_o; char * tmp; char * tmp_v; char * stopstring; int pos_value = 0; uint dlina; uint i; char value_buffer[32]; int lmp; uint ulmp; int flag_int = 0; int flag_negative = 0; int cyc = 0; pos_value = 0; *num_elems = 0; flag_int = 0; flag_negative = 0; if (strchr(token_value, '-') != NULL) { flag_int = 1; *num_bytes = sizeof(int); *tp = e_tid_int; } else { *num_bytes = sizeof(uint); *tp = e_tid_uint; } while ((tmp = epr_str_tok(token_value + 1, "+-", &pos_value)) != NULL) { if (epr_if_no_letters(tmp) == 0) { epr_set_err(e_err_invalid_value, "epr_parse_header: invalid ascii header: illegal value"); cyc ++; tmp = epr_clone_string("-999999"); *num_bytes = sizeof(int); *tp = e_tid_int; epr_add_ptr_array_elem(header_values, tmp); } else { cyc ++; token_value_o = epr_create_string(strlen(tmp) + 1); if (strlen(tmp) == strlen(token_value) - 1) { token_value_o[0] = token_value[0]; } else if (pos_value < (int)strlen(token_value) - 1) { token_value_o[0] = token_value[pos_value - strlen(tmp) - 1]; } else if (strlen(tmp) == 1) { if (cyc == 1) token_value_o[0] = token_value[pos_value]; else token_value_o[0] = token_value[pos_value - 1]; } else { token_value_o[0] = token_value[pos_value - strlen(tmp)]; } strcat(token_value_o, tmp); dlina = (uint)strlen(token_value_o); tmp_v = epr_create_string(dlina); /*if int*/ if (flag_int == 1) { lmp = strtol(token_value_o, &stopstring, 10); if (lmp != 0) { tmp_v[0] = token_value_o[0]; for (i = 1; i < dlina; i ++) if (token_value_o[i] != '0') break; if (token_value_o[0] == '+') strncpy(tmp_v + 0, token_value_o + i, dlina - i); if (token_value_o[0] == '-') strncpy(tmp_v + 1, token_value_o + i, dlina - i); sprintf(value_buffer, "%d", lmp); /*if int value too large*/ if (strcmp(tmp_v, value_buffer) != 0) epr_log(e_log_warning, "product header: int integer value out of range"); } } else if (flag_int == 0) { ulmp = strtoul(token_value_o, &stopstring, 10); if (ulmp != 0UL) { tmp_v[0] = token_value_o[0]; for (i = 1; i < dlina; i ++) if (token_value_o[i] != '0') break; strncpy(tmp_v, token_value_o + i, dlina - i); sprintf(value_buffer, "%u", ulmp); /*if uint value too large*/ if (strcmp(tmp_v, value_buffer) != 0) epr_log(e_log_warning, "product header: unsigned int integer value out of range"); } } epr_free_string(tmp_v); epr_add_ptr_array_elem(header_values, token_value_o); epr_free_string(tmp); } } *num_elems = cyc; } /** * Fills the record for the header ASCII information. * * @param record to fill; * @param header_values values from the given product file; * @param record beeng filling. */ void epr_set_header_field_values(EPR_SRecord* record, EPR_SPtrArray* header_values) { EPR_SFieldInfo* field_info; EPR_SField* field; uint ptr_index = 0; uint field_index; uint field_info_index; char * tmp; char * stopstring; assert(header_values != NULL); for (field_index = 0; field_index < record->num_fields; field_index++) { field = record->fields[field_index]; field_info = (EPR_SFieldInfo*)epr_get_ptr_array_elem_at(record->info->field_infos, field_index); for (field_info_index = 0; field_info_index < field->info->num_elems; field_info_index++) { tmp = (char*)epr_get_ptr_array_elem_at(header_values, ptr_index); switch (field_info->data_type_id) { case e_tid_uchar: *(((uchar*)field->elems) + field_info_index) = (uchar) tmp[field_info_index]; break; case e_tid_int: *(((int*)field->elems) + field_info_index) = strtol(tmp, &stopstring, 10); break; case e_tid_uint: *(((uint*)field->elems) + field_info_index) = strtoul(tmp, &stopstring, 10); break; case e_tid_string:; /*epr_assign_string(&(char*)field->elems, tmp);*/ strncpy((char*)field->elems, tmp, field->info->tot_size); break; case e_tid_double: *(((double*)field->elems) + field_info_index) = strtod(tmp, &stopstring); break; default: epr_set_err(e_err_invalid_value, "epr_set_header_field_values: internal error: illegal value type"); } ptr_index ++; } } } uint epr_compare_param(EPR_SProductId* product_id) { EPR_SDSD* dsd; uint of; epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_invalid_product_id, "epr_compare_param: invalid product identifier"); return 0UL; } of = epr_api.epr_head_size; dsd = (EPR_SDSD*)epr_get_ptr_array_elem_at(product_id->dsd_array, 0); if (dsd->ds_offset == epr_api.epr_head_size) return of; return 0UL; } bcdev-epr-api-a922482/src/epr_msph.h000066400000000000000000000027631142554441000171720ustar00rootroot00000000000000/* * $Id: epr_msph.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_MSPH_H_INCL #define EPR_MSPH_H_INCL #ifdef __cplusplus extern "C" { #endif #include /* just to get the ANSI-C type FILE */ /*void epr_read_mph(EPR_SProductId* product_id);*/ EPR_SRecord* epr_parse_header(const char* header_name, const char* ascii_source); void epr_set_header_field_values(EPR_SRecord* record, EPR_SPtrArray* header_values); uint epr_compare_param(EPR_SProductId* product_id); void epr_parse_double_token(EPR_SPtrArray* header_values, char* token_value, uint* value_number, uint* l, EPR_EDataTypeId* tp); void epr_parse_int_token(EPR_SPtrArray* header_values, char* token_value, uint* value_number, uint* l, EPR_EDataTypeId* tp); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* EPR_MSPH_H_INCL */ bcdev-epr-api-a922482/src/epr_param.c000066400000000000000000000140031142554441000173040ustar00rootroot00000000000000/* * $Id: epr_param.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" /** * Creates a new element (pair 'name-value') for the parameter table. * * @param param_name the name of the parameter, * @param param_value the value of this parameter, * @return the pointer at this element * or NULL if an error occured. */ EPR_SParamElem* epr_create_param_elem(const char* param_name, int param_value) { EPR_SParamElem* param_elem = NULL; /* LINE_LENGTH=+02241 -1 / LINES_PER_TIE_PT=+064 +1 = */ param_elem = (EPR_SParamElem*) calloc(1, sizeof (EPR_SParamElem)); if (param_elem == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_field_info: out of memory"); return NULL; } param_elem->param_name = epr_clone_string(param_name); param_elem->param_value = param_value; return param_elem; } EPR_SPtrArray* epr_create_param_table() { EPR_SPtrArray* param_table = NULL; param_table = epr_create_ptr_array(16); return param_table; } /** * Frees the memory allocated by the given param_table. * *

After calling this function the give record_info pointer gets * invalid and should not be used anymore. * * @param param_table the table to be released, if NULL * the function immediately returns */ void epr_free_param_table(EPR_SPtrArray* param_table) { EPR_SParamElem* param_elem = NULL; int param_index = 0; if (param_table == NULL) return; for (param_index = 0; param_index < (int)param_table->length; param_index++) { param_elem = (EPR_SParamElem*)epr_get_ptr_array_elem_at(param_table, param_index); epr_free_param_elem(param_elem); } epr_free_ptr_array(param_table); } /** * Frees the memory allocated by the given param_elem. * *

After calling this function the give record_info pointer gets * invalid and should not be used anymore. * * @param param_table the table to be released, if NULL * the function immediately returns */ void epr_free_param_elem(EPR_SParamElem* param_elem) { if (param_elem == NULL) return; epr_free_string(param_elem->param_name); param_elem->param_name = NULL; param_elem->param_value = 0; free(param_elem); return; } int epr_set_dyn_dddb_params(EPR_SProductId* product_id) { const EPR_SField* field; const EPR_SField* product_field; char* tmp; EPR_SParamElem* param_elem = NULL; uint line_length = 0; uint num_tie_points_across = 0; uint ntpa = 0; product_field = epr_get_field(product_id->mph_record, "PRODUCT"); tmp = epr_sub_string((char*)product_field->elems, 0, 3); /* MERIS */ if (strcmp(EPR_ENVISAT_PRODUCT_MERIS, tmp) == 0) { if (product_id->sph_record == NULL) { product_id->sph_record = epr_read_sph(product_id); if (product_id->sph_record == NULL) { epr_set_err(e_err_file_read_error, "epr_set_param: wrong SPH"); epr_free_string(tmp); return 0; } } field = epr_get_field(product_id->sph_record, "LINE_LENGTH"); line_length = ((uint*) field->elems)[0]; if (line_length == 0) { epr_set_err(e_err_invalid_value, "epr_set_param: wrong SPH: LINE_LENGTH must be > 0"); epr_free_string(tmp); return 0; } field = epr_get_field(product_id->sph_record, "LINES_PER_TIE_PT"); num_tie_points_across = ((uint*) field->elems)[0]; if (num_tie_points_across == 0) { epr_set_err(e_err_invalid_value, "epr_set_param: wrong SPH: LINES_PER_TIE_PT must be > 0"); epr_free_string(tmp); return 0; } param_elem = epr_create_param_elem("sceneRasterWidth", line_length); epr_add_ptr_array_elem(product_id->param_table, param_elem); ntpa = ((line_length - 1) / num_tie_points_across) + 1; param_elem = epr_create_param_elem("tiePointGridWidth", ntpa); epr_add_ptr_array_elem(product_id->param_table, param_elem); } /* 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) { field = epr_get_field(product_id->sph_record, "LINE_LENGTH"); line_length = ((uint*) field->elems)[0]; if (line_length == 0) { epr_set_err(e_err_invalid_value, "epr_set_param: wrong SPH: LINE_LENGTH must be > 0"); epr_free_string(tmp); return 0; } param_elem = epr_create_param_elem("sceneRasterWidth", line_length); epr_add_ptr_array_elem(product_id->param_table, param_elem); param_elem = epr_create_param_elem("tiePointGridWidth", EPR_ASAR_NUM_PER_POINT_ACROSS_LOCAT); epr_add_ptr_array_elem(product_id->param_table, param_elem); } epr_free_string(tmp); return 1; } bcdev-epr-api-a922482/src/epr_param.h000066400000000000000000000031501142554441000173120ustar00rootroot00000000000000/* * $Id: epr_param.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_PARAM_H_INCL #define EPR_PARAM_H_INCL #ifdef __cplusplus extern "C" { #endif #include /* just to get the ANSI-C type FILE */ /** * The EPR_ParamElem structure contains meta information * how many time is a correspondent parameter represents. */ struct EPR_ParamElem { /** * This is parameter name. */ char* param_name; /** * The number of data elements represented of this parameter. */ uint param_value; }; EPR_SPtrArray* epr_create_param_table(void); EPR_SParamElem* epr_create_param_elem(const char* param_name, int param_value); int epr_set_dyn_dddb_params(EPR_SProductId* product_id); void epr_free_param_table(EPR_SPtrArray* param_table); void epr_free_param_elem(EPR_SParamElem* param_elem); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_PARAM_H_INCL */ bcdev-epr-api-a922482/src/epr_product.c000066400000000000000000000360131142554441000176710ustar00rootroot00000000000000/* * $Id: epr_product.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_dataset.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" uint epr_compute_scene_width(const EPR_SProductId* product_id); uint epr_compute_scene_height(const EPR_SProductId* product_id); /*********************************** PRODUCT ***********************************/ /* Function: epr_open_product Access: public API Changelog: 2002/01/05 nf initial version */ /** * Opens the ENVISAT product file with the given file path */ EPR_SProductId* epr_open_product(const char* product_file_path) { EPR_SProductId* product_id = NULL; char message_buffer[80]; int s_par; uint compare_ok = 0; epr_clear_err(); if (!epr_check_api_init_flag()) { return NULL; } if (product_file_path == NULL) { epr_set_err(e_err_null_pointer, "epr_open_product: product file path must not be NULL"); return NULL; } product_id = (EPR_SProductId*) calloc(1, sizeof (EPR_SProductId)); if (product_id == NULL) { epr_set_err(e_err_out_of_memory, "epr_open_product: out of memory"); return NULL; } product_id->magic = EPR_MAGIC_PRODUCT_ID; epr_assign_string(&product_id->file_path, product_file_path); if (product_id->file_path == NULL) { epr_set_err(e_err_out_of_memory, "epr_open_product: out of memory"); return NULL; } /* Convert to OS compatible path */ epr_make_os_compatible_path(product_id->file_path); product_id->istream = fopen(epr_trim_string(product_id->file_path), "rb"); if (product_id->istream == NULL) { if (errno == ENOENT) { epr_set_err(e_err_file_not_found, "epr_open_product: file not found"); } else { epr_set_err(e_err_file_access_denied, "epr_open_product: file open failed"); } return NULL; } epr_log(e_log_debug, "product opened:"); epr_log(e_log_debug, epr_trim_string(product_id->file_path)); /* Set file pointer to start of product identifier */ if (fseek(product_id->istream, EPR_PRODUCT_ID_OFFSET, SEEK_SET) != 0) { epr_set_err(e_err_file_access_denied, "epr_open_product: file seek failed"); epr_close_product(product_id); return NULL; } if (fread(product_id->id_string, 1, EPR_PRODUCT_ID_STRLEN, product_id->istream) != (uint) EPR_PRODUCT_ID_STRLEN) { epr_set_err(e_err_file_access_denied, "epr_open_product: file read failed"); epr_close_product(product_id); return NULL; } /* 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_AATSR, product_id->id_string, 3) != 0)) { epr_set_err(e_err_invalid_product_id, "epr_open_product: invalid product identifier"); epr_close_product(product_id); return NULL; } if (product_id->id_string[9] != 'P') { char* ch = product_id->id_string + 9; if (*ch == 'C') { epr_log(e_log_info, "child product detected, mapping to 'P'"); } else { sprintf(message_buffer, "unknown product sub-type '%c', mapping to 'P'", *ch); epr_log(e_log_warning, message_buffer); } *ch = 'P'; } /* Set file to end of file in order to determine file size */ if (fseek(product_id->istream, 0, SEEK_END) != 0) { epr_set_err(e_err_file_access_denied, "epr_open_product: file seek failed"); epr_close_product(product_id); return NULL; } /* Get file size */ product_id->tot_size = (uint) ftell(product_id->istream); if (product_id->tot_size == (uint) -1) { epr_set_err(e_err_file_access_denied, "epr_open_product: failed to determine file size"); epr_close_product(product_id); return NULL; } sprintf(message_buffer, "product size: %u", product_id->tot_size); epr_log(e_log_debug, message_buffer); /* Set file pointer back to start */ if (fseek(product_id->istream, 0, SEEK_SET) != 0) { epr_set_err(e_err_file_access_denied, "epr_open_product: file seek failed"); epr_close_product(product_id); return NULL; } product_id->record_info_cache = epr_create_ptr_array(32); product_id->param_table = epr_create_param_table(); epr_log(e_log_info, "reading MPH"); product_id->mph_record = epr_read_mph(product_id); epr_log(e_log_info, "reading SPH"); product_id->sph_record = epr_read_sph(product_id); s_par = epr_set_dyn_dddb_params(product_id); epr_log(e_log_info, "reading all DSDs"); product_id->dsd_array = epr_read_all_dsds(product_id); compare_ok = epr_compare_param(product_id); if (compare_ok == 0) { epr_set_err(e_err_invalid_value, "epr_open_product: MPH_SIZE+SPH_SIZE must be equal to DSD[0].DS_OFFSET"); epr_close_product(product_id); return NULL; } if (strncmp(EPR_ENVISAT_PRODUCT_MERIS, product_id->id_string, 3) == 0) { product_id->meris_iodd_version = epr_detect_meris_iodd_version(product_id); sprintf(message_buffer, "product type %s (MERIS IODD%d)", product_id->id_string, product_id->meris_iodd_version); epr_log(e_log_info, message_buffer); } epr_log(e_log_info, "creating dataset identifiers"); product_id->dataset_ids = epr_create_dataset_ids(product_id); if (product_id->dataset_ids == NULL) { epr_close_product(product_id); return NULL; } epr_log(e_log_info, "creating band identifiers"); product_id->band_ids = epr_create_band_ids(product_id); if (product_id->band_ids == NULL) { epr_close_product(product_id); return NULL; } /* Get scene size */ product_id->scene_width = epr_compute_scene_width(product_id); product_id->scene_height = epr_compute_scene_height(product_id); sprintf(message_buffer, "product scene raster size: %u x %u", product_id->scene_width, product_id->scene_height); epr_log(e_log_debug, message_buffer); return product_id; } /* Function: epr_close_product Access: public API Changelog: 2002/01/05 nf initial version */ /** * Closes the ENVISAT product file determined by the gibven file identifier. */ int epr_close_product(EPR_SProductId* product_id) { /* Nothing to close, return */ if (product_id == NULL) { return e_err_none; } epr_clear_err(); if (!epr_check_api_init_flag()) { return epr_get_last_err_code(); } assert(product_id->istream != NULL); if (fclose(product_id->istream) != 0) { epr_set_err(e_err_file_close_failed, "epr_close_product: product file close failed"); return epr_get_last_err_code(); } product_id->istream = NULL; epr_log(e_log_info, "product closed: file path: "); epr_log(e_log_info, product_id->file_path); epr_free_product_id(product_id); return e_err_none; } /* Function: epr_free_product_id Access: private API implementation helper Changelog: 2002/01/05 nf initial version */ /** * Destructor for an EPR_SProductId structure instance. * * @param product_id the product file identifier to be destructed */ void epr_free_product_id(EPR_SProductId* product_id) { if (product_id == NULL) return; product_id->istream = NULL; epr_free_string(product_id->file_path); product_id->file_path = NULL; product_id->id_string[0] = '\0'; epr_free_param_table(product_id->param_table); product_id->param_table = NULL; if (product_id->record_info_cache != NULL) { EPR_SRecordInfo* record_info = NULL; uint record_info_index = 0; for (record_info_index = 0; record_info_index < product_id->record_info_cache->length; record_info_index++) { record_info = (EPR_SRecordInfo*)epr_get_ptr_array_elem_at(product_id->record_info_cache, record_info_index); epr_free_record_info(record_info); } epr_free_ptr_array(product_id->record_info_cache); product_id->record_info_cache = NULL; } if (product_id->dsd_array != NULL) { EPR_SDSD* dsd = NULL; uint dsd_index = 0; for (dsd_index = 0; dsd_index < product_id->dsd_array->length; dsd_index++) { dsd = (EPR_SDSD*)epr_get_ptr_array_elem_at(product_id->dsd_array, dsd_index); epr_free_dsd(dsd); } epr_free_ptr_array(product_id->dsd_array); product_id->dsd_array = NULL; } if (product_id->mph_record != NULL) { epr_free_record(product_id->mph_record); product_id->mph_record = NULL; } if (product_id->sph_record != NULL) { epr_free_record(product_id->sph_record); product_id->sph_record = NULL; } if (product_id->dataset_ids != NULL) { EPR_SDatasetId* dataset_id = NULL; uint d_index = 0; for (d_index = 0; d_index < product_id->dataset_ids->length; d_index++) { dataset_id = (EPR_SDatasetId*)epr_get_ptr_array_elem_at(product_id->dataset_ids, d_index); epr_free_dataset_id(dataset_id); } epr_free_ptr_array(product_id->dataset_ids); product_id->dataset_ids = NULL; } if (product_id->band_ids != NULL) { EPR_SBandId* band_id = NULL; uint b_index = 0; for (b_index = 0; b_index < product_id->band_ids->length; b_index++) { band_id = (EPR_SBandId*)epr_get_ptr_array_elem_at(product_id->band_ids, b_index); epr_free_band_id(band_id); } epr_free_ptr_array(product_id->band_ids); product_id->band_ids = NULL; } product_id->tot_size = 0; free(product_id); } /** * Gets the scene width in pixel. * * @param product_id the product identifier, must not be NULL * @return width pixel number, or 0 if an error occured. */ uint epr_get_scene_width(const EPR_SProductId* product_id) { epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_scene_width: product_id must not be NULL"); return (uint)0; } return product_id->scene_width; } /** * Gets the scene height in pixel. * * @param product_id the product identifier, must not be NULL * @return height pixel number, or 0 if an error occured. */ uint epr_get_scene_height(const EPR_SProductId* product_id) { epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_scene_height: product_id must not be NULL"); return (uint)0; } return product_id->scene_height; } /*********************************** RECORD ***********************************/ EPR_SRecord* epr_get_sph(const EPR_SProductId* product_id) { epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_sph: product-identifier must not be NULL"); return NULL; } return product_id->sph_record; } EPR_SRecord* epr_get_mph(const EPR_SProductId* product_id) { epr_clear_err(); if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_get_mph: product-identifier must not be NULL"); return NULL; } return product_id->mph_record; } /** * Gets the scene width in pixel. * * @param product_id the product identifier, must not be NULL * * @return width pixel number, or 0 if an error occured. */ uint epr_compute_scene_width(const EPR_SProductId* product_id) { EPR_SRecord* sph_record = NULL; uint scan_line_length; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_compute_scene_width: product ID must not be NULL"); return (uint)0; } sph_record = product_id->sph_record; if (strncmp(EPR_ENVISAT_PRODUCT_MERIS, 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_AATSR, product_id->id_string, 3) == 0) { scan_line_length = EPR_ATS_LINE_LENGTH; } 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 { epr_set_err(e_err_illegal_arg, "epr_compute_scene_width: unknown product type"); scan_line_length = (uint)0; } return scan_line_length; } /** * Computes the scene height in pixel of a product. The scene height is * the minimum number of records in all measurement datasets. * * @param product_id the product identifier, must not be NULL * @return height pixel number, or 0 if an error occured. */ uint epr_compute_scene_height(const EPR_SProductId* product_id) { EPR_SDSD* dsd = NULL; uint min_num_mds_recs = 0; uint dsd_index; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_compute_scene_height: product ID must not be NULL"); return (uint)0; } for (dsd_index = 0; dsd_index < product_id->dsd_array->length; dsd_index++) { dsd = (EPR_SDSD*)epr_get_ptr_array_elem_at(product_id->dsd_array, dsd_index); if (epr_equal_names(dsd->ds_type, "M")) { if (dsd->num_dsr > min_num_mds_recs) { min_num_mds_recs = dsd->num_dsr; } } } if (min_num_mds_recs == 0) { epr_set_err(e_err_invalid_data_format, "epr_compute_scene_height: product height was zero"); } return min_num_mds_recs; } bcdev-epr-api-a922482/src/epr_ptrarray.c000066400000000000000000000064341142554441000200610ustar00rootroot00000000000000/* * $Id: epr_ptrarray.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_ptrarray.h" #include "epr_string.h" EPR_SPtrArray* epr_create_ptr_array(unsigned int capacity) { EPR_SPtrArray* ptr_array = NULL; void** elems = NULL; elems = (void**) calloc(capacity, sizeof (void*)); if (elems == NULL) { return NULL; } ptr_array = (EPR_SPtrArray*) calloc(1, sizeof (EPR_SPtrArray)); if (ptr_array == NULL) { free(elems); return NULL; } ptr_array->capacity = capacity; ptr_array->length = 0; ptr_array->elems = elems; return ptr_array; } void epr_free_ptr_array(EPR_SPtrArray* ptr_array) { if (ptr_array == NULL) return; if (ptr_array->elems != NULL) free(ptr_array->elems); ptr_array->capacity = 0; ptr_array->length = 0; ptr_array->elems = NULL; free(ptr_array); } void epr_free_char_ptr_array(EPR_SPtrArray* char_ptr_array) { uint i; for (i = 0; i < char_ptr_array->length; i++) { epr_free_string((char*) char_ptr_array->elems[i]); } epr_free_ptr_array(char_ptr_array); } int epr_add_ptr_array_elem(EPR_SPtrArray* ptr_array, void* elem) { assert(ptr_array != NULL); assert(ptr_array->elems != NULL); if (ptr_array->length + 1 > ptr_array->capacity) { int status = epr_grow_ptr_array(ptr_array, 2 * ptr_array->capacity); if (status != 0) return status; } ptr_array->elems[ptr_array->length++] = elem; return e_err_none; } int epr_grow_ptr_array(EPR_SPtrArray* ptr_array, unsigned int capacity) { void* elems = NULL; assert(ptr_array != NULL); assert(capacity >= ptr_array->capacity); if (capacity == ptr_array->capacity) return e_err_none; elems = (void**) realloc(ptr_array->elems, capacity * sizeof (void*)); if (elems == NULL) return e_err_out_of_memory; memset(((char*)elems) + ptr_array->length * sizeof (void*), 0, (capacity - ptr_array->length) * sizeof (void*)); ptr_array->capacity = capacity; ptr_array->elems = elems; return e_err_none; } unsigned int epr_get_ptr_array_length(const EPR_SPtrArray* ptr_array) { assert(ptr_array != NULL); return ptr_array->length; } void* epr_get_ptr_array_elem_at(const EPR_SPtrArray* ptr_array, unsigned int index) { assert(ptr_array != NULL); assert(ptr_array->elems != NULL); assert(index < ptr_array->length); return ptr_array->elems[index]; } bcdev-epr-api-a922482/src/epr_ptrarray.h000066400000000000000000000075631142554441000200720ustar00rootroot00000000000000/* * $Id: epr_ptrarray.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_PTRARRAY_H_INCL #define EPR_PTRARRAY_H_INCL #ifdef __cplusplus extern "C" { #endif #include /** * The EPR_PtrArray structure represents a dynamic * array of pointers. */ struct EPR_PtrArray { /** The current capacity */ unsigned int capacity; /** The current length */ unsigned int length; /** The pointer elements */ void** elems; }; typedef struct EPR_PtrArray EPR_SPtrArray; /** * Creates a new dynamic pointer array instance. * * @param capacity the initial capacity * @return a new dynamic pointer array instance with the given capacity or * NULL if memory could not be allocated */ EPR_SPtrArray* epr_create_ptr_array(unsigned int capacity); /** * Frees the memory allocated through the given dynamic pointer array. * *

After calling this function the give record pointer array gets * invalid and should not be used anymore. * * @param ptr_array the pointer array to be released, if NULL * the function immediately returns */ void epr_free_ptr_array(EPR_SPtrArray* ptr_array); /** * Special application of the epr_free_ptr_array for * arrays that contain dynamically allocated strings (type char*). * *

For each element in the given array the epr_free_string * function is called. * * @param char_ptr_array an array containing strings */ void epr_free_char_ptr_array(EPR_SPtrArray* char_ptr_array); /** * Adds a new pointer to the given pointer array. * The function automatically grows the array if necessary. * * @param ptr_array the pointer array to which to add the new element, * must not be NULL. * @param elem the element to be added * @return zero for success, an error code otherwise */ int epr_add_ptr_array_elem(EPR_SPtrArray* ptr_array, void* elem); /** * Grows the given pointer array so that is has the given capacity. * The length of the array is not touched by this function. * * @param ptr_array the pointer array to which to add the new element, * must not be NULL. * @param capacity the new capacity * @return zero for success, an error code otherwise */ int epr_grow_ptr_array(EPR_SPtrArray* ptr_array, unsigned int capacity); /** * Returns the length of the given pointer array. * @param ptr_array the pointer array, must not be NULL. * @return the length of the given pointer array */ unsigned int epr_get_ptr_array_length(const EPR_SPtrArray* ptr_array); /** * Returns the capacity of the given pointer array. * @param ptr_array the pointer array, must not be NULL. * @return the capacity of the given pointer array */ unsigned int epr_get_ptr_array_capacity(const EPR_SPtrArray* ptr_array); /** * Gets the element with the specified index of the given pointer array. * @param ptr_array the pointer array, must not be NULL. * @param index the zero-based index, must be less than the array's length * @return the element at the given index */ void* epr_get_ptr_array_elem_at(const EPR_SPtrArray* ptr_array, unsigned int index); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_PTRARRAY_H_INCL */ bcdev-epr-api-a922482/src/epr_record.c000066400000000000000000000307341142554441000174730ustar00rootroot00000000000000/* * $Id: epr_record.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" #include "epr_ptrarray.h" #include "epr_swap.h" #include "epr_field.h" #include "epr_record.h" #include "epr_param.h" #include "epr_dsd.h" #include "epr_msph.h" #include "epr_band.h" #include "epr_bitmask.h" #include "epr_dddb.h" /* * ===================== Record Info Access ============================== */ /* Function: epr_create_record_info Access: public API Changelog: 2002/01/16 mp initial version */ /** * Creates a new record_info for the record by the given * dataset name. * * @param dataset_name the name of the dataset, to which the record * belongs to, must not be NULL * @param field_infos the pointer at the strucrure with information * of all fields wich belong to record, * must not be NULL * @return the new record instance * or NULL if an error occured. */ EPR_SRecordInfo* epr_create_record_info(const char* dataset_name, EPR_SPtrArray* field_infos) { EPR_SRecordInfo* record_info = NULL; EPR_SFieldInfo* field_info = NULL; int field_infos_index; int field_infos_length; uint tot_record_size = 0; record_info = (EPR_SRecordInfo*) calloc(1, sizeof (EPR_SRecordInfo)); if (record_info == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_record_info: out of memory"); return NULL; } epr_assign_string(&record_info->dataset_name, dataset_name); if (record_info->dataset_name == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_record_info: out of memory"); return NULL; } record_info->field_infos = field_infos; field_infos_length = (int)epr_get_ptr_array_length(field_infos); for (field_infos_index = 0; field_infos_index < field_infos_length; field_infos_index++) { field_info = (EPR_SFieldInfo*)epr_get_ptr_array_elem_at(field_infos, field_infos_index); tot_record_size += field_info->tot_size; } record_info->tot_size = tot_record_size; return record_info; } /** * Frees the memory allocated by the given record_info. * *

After calling this function the give record_info pointer gets * invalid and should not be used anymore. * * @param record_info the record to be released, if NULL * the function immediately returns */ void epr_free_record_info(EPR_SRecordInfo* record_info) { EPR_SFieldInfo* field_info = NULL; uint field_info_index = 0; if (record_info == NULL) return; if (record_info->field_infos != NULL) { for (field_info_index = 0; field_info_index < record_info->field_infos->length; field_info_index++) { field_info = (EPR_SFieldInfo*)epr_get_ptr_array_elem_at(record_info->field_infos, field_info_index); epr_free_field_info(field_info); } epr_free_ptr_array(record_info->field_infos); record_info->field_infos = NULL; } epr_free_string(record_info->dataset_name); record_info->dataset_name = NULL; record_info->field_infos = NULL; record_info->tot_size = 0; free(record_info); } /* Function: epr_get_record_info Access: private API implementation helper Changelog: 2002/01/05 mp initial version */ /** * Returns information about the structure of the records contained in * a dataset specified by the given dataset_id. * * @param dataset_id the the dataset identifier * * @return the the pointer for the record structure information. */ EPR_SRecordInfo* epr_get_record_info(EPR_SDatasetId* dataset_id) { EPR_SProductId* product_id; EPR_SRecordInfo* record_info; uint num_record_infos; uint record_index = 0; assert(dataset_id != NULL); product_id = dataset_id->product_id; assert(product_id != NULL); assert(product_id->record_info_cache != NULL); /* * checks, if 'record_info_cache' is not empty, then returns this cache, * not making moreover */ num_record_infos = product_id->record_info_cache->length; for (record_index = 0; record_index < num_record_infos; record_index++) { record_info = (EPR_SRecordInfo*) product_id->record_info_cache->elems[record_index]; if (epr_equal_names(record_info->dataset_name, dataset_id->dataset_name)) return record_info; } record_info = epr_read_record_info(product_id, dataset_id); if (record_info == NULL) { epr_set_err(e_err_file_access_denied, "epr_get_record_info: invalid DDDB resource path: missing any 'ASAR' files"); return NULL; } epr_add_ptr_array_elem(product_id->record_info_cache, record_info); return record_info; } EPR_SRecordInfo* epr_read_record_info(EPR_SProductId* product_id, EPR_SDatasetId* dataset_id) { EPR_SRecordInfo* record_info = NULL; EPR_SFieldInfo* field_info = NULL; EPR_SPtrArray* field_infos = NULL; EPR_EDataTypeId data_type_id = e_tid_unknown; uint num_elems = 0; uint num_bytes = 0; uint more_count = 0; char* field_name = NULL; char* data_type = NULL; char* unit = NULL; char* description = NULL; int i; int rt_index; const struct RecordDescriptorTable* r_tables; int num_descr; int num_r_tables; if (product_id == NULL) { epr_set_err(e_err_null_pointer, "epr_read_record_info: product_id must not be NULL"); return NULL; } /* @DDDB */ if (strncmp(product_id->id_string, "MER", 3) == 0) { r_tables = dddb_meris_rec_tables; num_r_tables = EPR_NUM_MERIS_REC_TABLES; } else if (strncmp(product_id->id_string, "ATS", 3) == 0) { 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 { epr_set_err(e_err_invalid_product_id, "epr_read_record_info: invalid product identifier"); return NULL; } rt_index = -1; for (i = 0; i < num_r_tables; i++) { if (dataset_id->record_descriptor == r_tables[i].descriptors) { rt_index = i; break; } } if (rt_index == -1) { epr_set_err(e_err_invalid_product_id, "epr_read_record_info: unknown record"); return NULL; } field_infos = epr_create_ptr_array(16); num_descr = r_tables[rt_index].num_descriptors; for (i = 0; i < num_descr; i++) { /* 1: field_name */ field_name = epr_clone_string(r_tables[rt_index].descriptors[i].id); /* 2: data_type_id */ data_type_id = r_tables[rt_index].descriptors[i].type; /* 3: unit */ unit = epr_clone_string(r_tables[rt_index].descriptors[i].unit); /* 4: num_elems */ num_bytes = r_tables[rt_index].descriptors[i].elem_size; /* 5: num_elems and more_count*/ /* @todo: check return value! and check epr_parse_value_count */ num_elems = epr_parse_value_count(product_id, r_tables[rt_index].descriptors[i].num_elem); more_count = 1; /* 6: description*/ description = epr_clone_string(r_tables[rt_index].descriptors[i].description); field_info = epr_create_field_info(data_type_id, description, field_name, num_elems, num_bytes, more_count, unit); epr_add_ptr_array_elem(field_infos, field_info); epr_free_string(field_name); epr_free_string(data_type); epr_free_string(unit); epr_free_string(description); } record_info = epr_create_record_info(dataset_id->dataset_name, field_infos); return record_info; } /* Function: epr_read_record_info Access: private API implementation helper Changelog: 2002/01/05 mp initial version */ /** * Reads the record information with the given file path and * returns the poiter at it. * * @param product_id the the product file identifier * @param dataset_name the name of the dataset * @param db_file_istream the DB-table file identifier * * @return the the pointer at the record information. */ /* EPR_SRecordInfo* epr_read_record_info(EPR_SProductId* product_id, EPR_SDatasetId* dataset_id, FILE* db_file_istream) } */ /* Function: epr_create_record Access: public API Changelog: 2002/01/23 mp initial version */ /** * Creates a new record instance from the dataset specified by the given * dataset name. * * @param the pointer at the record information. * must not be NULL * @return the new record instance * or NULL if an error occured. */ EPR_SRecord* epr_create_record_from_info(EPR_SRecordInfo* record_info) { EPR_SRecord* record = NULL; EPR_SFieldInfo* field_info = NULL; uint field_infos_index = 0; int field_infos_length; if (record_info == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_record_from_info: out of memory"); return NULL; } record = (EPR_SRecord*) calloc(1, sizeof(EPR_SRecord)); if (record == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_record: out of memory"); return NULL; } record->magic = EPR_MAGIC_RECORD; record->info = record_info; record->num_fields = record_info->field_infos->length; record->fields = (EPR_SField**) calloc(record->num_fields, sizeof(EPR_SField*)); if (record->fields == NULL) { epr_set_err(e_err_out_of_memory, "epr_create_record: out of memory"); return NULL; } field_infos_length = (int)epr_get_ptr_array_length(record_info->field_infos); for (field_infos_index = 0; field_infos_index < record_info->field_infos->length; field_infos_index++) { field_info = (EPR_SFieldInfo*)epr_get_ptr_array_elem_at(record_info->field_infos, field_infos_index); record->fields[field_infos_index] = epr_create_field(field_info); } return record; } const EPR_SField* epr_get_field_at(const EPR_SRecord* record, uint field_index){ EPR_SField* field = NULL; epr_clear_err(); if (record == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_at: record-identifier must not be NULL"); return NULL; } if ((field_index < 0) || (field_index >= record->num_fields)) { epr_set_err(e_err_index_out_of_range, "epr_get_field_at: field_index out of range"); return NULL; } field = record->fields[field_index]; return field; } uint epr_get_num_fields(const EPR_SRecord* record) { epr_clear_err(); if (record == NULL) { epr_set_err(e_err_null_pointer, "epr_get_field_at: record-identifier must not be NULL"); return (uint)-1; } return record->num_fields; } /** * Frees the memory allocated by the given record. * *

After calling this function the give record pointer gets * invalid and should not be used anymore. * * @param record the record to be released, if NULL * the function immediately returns */ void epr_free_record(EPR_SRecord* record) { EPR_SField* field = NULL; uint fields_index = 0; epr_clear_err(); if (record == NULL) return; if (record->fields != NULL) { for (fields_index = 0; fields_index < record->num_fields; fields_index++) { field = (EPR_SField*)record->fields[fields_index]; epr_free_field(field); } free(record->fields); record->fields = NULL; } /* Do NOT free record->info since many records can share the same record->info! */ record->info = NULL; record->num_fields = 0; free(record); } bcdev-epr-api-a922482/src/epr_record.h000066400000000000000000000046411142554441000174760ustar00rootroot00000000000000/* * $Id: epr_record.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_RECORD_H_INCL #define EPR_RECORD_H_INCL #ifdef __cplusplus extern "C" { #endif #include /* just to get the ANSI-C type FILE */ /** * The EPR_RecordInfo structure contains meta information * about a particular record. */ struct EPR_RecordInfo { /** * The name of the dataset to which this record belongs to. */ char* dataset_name; /** * The array of field info pointers. */ EPR_SPtrArray* field_infos; /** * The total size in bytes of all data elements of all fields * of a record in a product file. * tot_size is a derived variable, it is computed at * runtime and not stored in the DSD-DB. */ uint tot_size; }; /** * Returns information about the structure of the records contained in * a dataset specified by the given dataset_id. * * @param dataset_id the the dataset identifier * * @return the the pointer for the record structure information. */ EPR_SRecordInfo* epr_get_record_info(EPR_SDatasetId* dataset_id); EPR_SRecordInfo* epr_read_record_info(EPR_SProductId* product_id, EPR_SDatasetId* dataset_id); void epr_read_sub_record_info(EPR_SProductId* product_id, FILE* db_file_istream, const char* parent_name, EPR_SPtrArray* field_infos); EPR_SRecordInfo* epr_create_record_info(const char* dataset_name, EPR_SPtrArray* field_infos); EPR_SRecord* epr_create_record_from_info(EPR_SRecordInfo* record_info); char* epr_get_record_info_path(EPR_SProductId* product_id, const char* dataset_name); void epr_free_record_info(EPR_SRecordInfo* record_info); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_RECORD_H_INCL */ bcdev-epr-api-a922482/src/epr_string.c000066400000000000000000000211641142554441000175200ustar00rootroot00000000000000/* * $Id: epr_string.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_string.h" char* epr_assign_string(char** str_clone, const char* str) { assert(str_clone != NULL); epr_free_string(*str_clone); *str_clone = epr_clone_string(str); return *str_clone; } char* epr_create_string(unsigned int length) { return (char*) calloc(length + 1, sizeof (char)); } char* epr_clone_string(const char* str) { char* str_clone = NULL; if (str != NULL) { str_clone = epr_create_string(strlen(str)); strcpy(str_clone, str); } return str_clone; } void epr_cut_string(char** sub_str, const char* str, int start, int length) { *sub_str = epr_create_string(length); strncpy(*sub_str, str + start, length); *sub_str[length] = '\0'; } char* epr_sub_string(const char* str, int start, int length) { char* str_sub_string = NULL; if (str != NULL) { str_sub_string = epr_create_string(length); strncpy(str_sub_string, str + start, length); str_sub_string[length] = '\0'; } return str_sub_string; } /* Function: epr_get_last_err_code Access: private API implementation helper Changelog: 2002/01/05 nf initial version */ /** * Compares the two given names and returns TRUE if * they are equal ignoring the case of each letter. * *

This function is used to compare names throughout the * ENVISAT product reader API. * * @param name1 the first name, must not be NULL * @param name2 the second name, must not be NULL * @return TRUE if the names are equal, * FALSE otherwise */ epr_boolean epr_equal_names(const char* name1, const char* name2) { assert(name1 != NULL); assert(name2 != NULL); return stricmp(name1, name2) == 0; } void epr_free_string(char* str) { if (str == NULL) return; free(str); } /* Function: epr_str_tok Access: private API implementation helper Changelog: 2002/01/10 mp initial version */ /** * Findes substrings between separators. * * @param str the string to search * @param seps the separator simbols string * @param pos position with a search begin * * @return the next substring (or own string) of the found name or * (uint)NULL if an error occured. */ char* epr_str_tok(const char* str, const char* seps, int* pos) { char* token = NULL; int i, old_pos; int token_len = 0; assert(str != NULL); if (*pos >= (int)strlen(str)) return NULL; old_pos = *pos; for (i = *pos; str[i] != '\0'; i++) { if (strchr(seps, str[i]) != NULL) { token_len = i - *pos; token = epr_create_string(token_len); strncpy(token, str + *pos, token_len); token[token_len] = '\0'; *pos = i + 1; return token; } } if (strlen(str) > 0) { if (old_pos == 0) { *pos = i + 1; token = epr_clone_string(str); return token; } else if (old_pos > 0) { token_len = i - old_pos; token = epr_create_string(token_len); strncpy(token, str + *pos, token_len); token[token_len] = '\0'; *pos = (int)strlen(str); return token; } } return NULL; } /* Function: epr_str_tok_tok Access: private API implementation helper Changelog: 2002/01/10 mp initial version */ /** * Findes substrings between double separators. * * @param str the string to search * @param seps the separator simbols string * @param pos position with a search begin * * @return the next substring (or own string) of the found name or * (uint)NULL if an error occured. */ char* epr_str_tok_tok(const char* str, const char* seps, const char* exceptions, uint* pos) { char* token = NULL; uint i, old_pos; uint token_len = 0; assert(str != NULL); if (*pos >= (uint)strlen(str)) return NULL; old_pos = *pos; for (i = *pos; str[i] != '\0'; i++) { if (((strchr(seps, str[i]) != NULL) && (i == 0)) || ((strchr(seps, str[i]) != NULL) && (i > 0) && (strchr(exceptions, str[i - 1]) == NULL))) { token_len = i - *pos; token = epr_create_string(token_len); strncpy(token, str + *pos, token_len); token[token_len] = '\0'; *pos = i + 1; return token; } } if (strlen(str) > 0) { if (old_pos == 0) { *pos = i + 1; token = epr_clone_string(str); return token; } else if (old_pos > 0) { token_len = i - old_pos; token = epr_create_string(token_len); strncpy(token, str + *pos, token_len); token[token_len] = '\0'; *pos = (int)strlen(str); return token; } } return NULL; } int epr_find_first_not_white(const char* str) { int i; char white[] = {" "}; for (i = 0; i < (int)strlen(str); i ++) { if (strchr(white, str[i]) == NULL) return i; } return (int)strlen(str); } int epr_find_last_not_white(const char* str) { int i; char white[] = {" "}; if ((int)strlen(str) == 0) return -1; for (i = (int)strlen(str) - 1; i >= 0; i --) { if (strchr(white, str[i]) == NULL) return i; } return -1; } char* epr_trim_string(char* str) { int i, i1, i2, n; assert(str != NULL); n = strlen(str); if (n == 0) return str; i1 = -1; for (i = 0; str[i] != '\0'; i++) { if (!isspace(str[i])) { i1 = i; break; } } if (i1 == -1) { str[0] = '\0'; return str; } i2 = -1; for (i = n - 1; i >= 0; i--) { if (!isspace(str[i])) { i2 = i; break; } } assert(i1 > -1 && i2 > -1); if (i1 > 0) { int j = 0; for (i = i1; i <= i2; i++) { str[j] = str[i]; j++; } } str[i2 - i1 + 1] = '\0'; return str; } char* epr_strip_string_r(char* str) { int i, i1, n; assert(str != NULL); n = strlen(str); if (n == 0) { return str; } i1 = -1; for (i = n - 1; i >= 0; i--) { if (33 <= str[i] && str[i] <= 126) { i1 = i; break; } } if (i1 == -1) { str[0] = '\0'; } else { str[i1+1] = '\0'; } return str; } int epr_if_no_letters(const char* str) { int i; char ciffer[] = {"0123456789+- "}; for (i = 0; i < (int)strlen(str); i ++) { if (strchr(ciffer, str[i]) == NULL) return 0; } return 1; } int epr_get_positive_int(const char* str) { int i; char ciffer[] = {"0123456789 "}; for (i = 0; i < (int)strlen(str); i ++) { if (strchr(ciffer, str[i]) == NULL) return -1; } return atoi(str); } /*'Verdacht': if float-or-double*/ int epr_numeral_suspicion(const char* str) { int i; char ciffer[] = {"0123456789+- .eE"}; for (i = 0; i < (int)strlen(str); i ++) { if (strchr(ciffer, str[i]) == NULL) return 0; } /*if YES*/ return 1; } int epr_if_no_scaling(const char* str) { int result; result = strrchr(str, EPR_IRRELEVANCE_SYMBOL) - str + 1; if (result == 1) return 1; return 0; } void epr_free_and_null_string(char** str) { if (*str == NULL) return; epr_free_string(*str); *str = NULL; } int stricmp(const char* s1, const char* s2) { int d; assert(s1 != NULL); assert(s2 != NULL); while (*s1 != '\0' && *s2 != '\0') { d = tolower(*s1) - tolower(*s2); if (d != 0) { break; } s1++; s2++; } d = tolower(*s1) - tolower(*s2); return d; } bcdev-epr-api-a922482/src/epr_string.h000066400000000000000000000037561142554441000175340ustar00rootroot00000000000000/* * $Id: epr_string.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_STRING_H_INCL #define EPR_STRING_H_INCL #ifdef __cplusplus extern "C" { #endif #include #include #include char* epr_assign_string(char** str_clone, const char* str); char* epr_create_string(unsigned int length); char* epr_clone_string(const char* str); void epr_cut_string(char** sub_str, const char* str, int start, int length); char* epr_sub_string(const char* str, int start, int length); epr_boolean epr_equal_names(const char* name1, const char* name2); void epr_free_string(char* str); char* epr_str_tok(const char* str, const char* seps, int* pos); char* epr_str_tok_tok(const char* str, const char* seps, const char* exceptions, uint* pos); int epr_find_first_not_white(const char* str); int epr_find_last_not_white(const char* str); char* epr_trim_string(char* str); char* epr_strip_string_r(char* str); int epr_if_no_letters(const char* str); int epr_numeral_suspicion(const char* str); int epr_get_positive_int(const char* str); void epr_free_and_null_string(char** str); int epr_if_no_scaling(const char* str); /** * Non-ANSI string compare (ignores case). */ int stricmp(const char* s1, const char* s2); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* #ifndef EPR_STRING_H_INCL */ bcdev-epr-api-a922482/src/epr_swap.c000066400000000000000000000142621142554441000171650ustar00rootroot00000000000000/* * $Id: epr_swap.c,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_field.h" /* * Function: byte_swap_short.c */ /** * * Swaps bytes within NUMBER_OF_SWAPS two-byte words, * starting at address BUFFER. * * @param buffer the one element typed buffer * to convert for a little endian order machine * * @param number_of_swaps number of elements to convert * */ void byte_swap_short(short *buffer, uint number_of_swaps) { short* temp = buffer; uint swap_loop; for (swap_loop = 0, temp = buffer; swap_loop < number_of_swaps; swap_loop++, temp++) { *temp = (short)(((*temp & 0x00ff) << 8) | ((*temp & 0xff00) >> 8)); } } /* Function: byte_swap_int.c */ /** * * Swaps bytes within NUMBER_OF_SWAPS four-byte words, * starting at address BUFFER. * * */ void byte_swap_int(int *buffer, uint number_of_swaps) { int *temp = buffer; uint swap_loop; for (swap_loop = 0, temp = buffer; swap_loop < number_of_swaps; swap_loop++, temp++) { *temp = ((*temp & 0x000000ff) << 24) | ((*temp & 0x0000ff00) << 8) | ((*temp & 0x00ff0000) >> 8) | ((*temp & 0xff000000) >> 24); } } /* Function: byte_swap_short.c */ /** * * Swaps bytes within NUMBER_OF_SWAPS two-byte words, * starting at address BUFFER. * * @param buffer the one element typed buffer * to convert for a little endian order machine * * @param number_of_swaps number of elements to convert * */ void byte_swap_ushort(ushort* buffer, uint number_of_swaps) { byte_swap_short((short*) buffer, number_of_swaps); } /* * Function: byte_swap_uint.c */ /** * * Swaps bytes within NUMBER_OF_SWAPS four-byte words, * starting at address BUFFER. * * @param buffer the one element typed buffer * to convert for a little endian order machine * * @param number_of_swaps number of elements to convert * */ void byte_swap_uint(uint* buffer, uint number_of_swaps) { byte_swap_int((int*) buffer, number_of_swaps); } /* * Function: byte_swap_int.c */ /** * * Swaps bytes within NUMBER_OF_SWAPS four-byte words, * starting at address BUFFER. * * @param buffer the one element typed buffer * to convert for a little endian order machine * * @param number_of_swaps number of elements to convert * */ void byte_swap_float(float* buffer, uint number_of_swaps) { byte_swap_int((int*) buffer, number_of_swaps); } /** * A boolean value indicating whether this code run's on a * little endian order machine or not. *

1 stands for little endian (LE), * 0 stands for big endian (BE). */ /* Function: epr_is_little_endian_order Access: public API Changelog: 2002/02/04 nf nitial version */ /** * Returns a oolean value indicating whether this code run's on a * little endian order machine or not. *

1 stands for little endian (LE), 0/code> otherwise */ int epr_is_little_endian_order() { uint le_value = EPR_LE_MAGIC_NUMBER; return (((uchar*)(&le_value))[0] == EPR_LE_MAGIC_BYTE_0) && (((uchar*)(&le_value))[1] == EPR_LE_MAGIC_BYTE_1) && (((uchar*)(&le_value))[2] == EPR_LE_MAGIC_BYTE_2) && (((uchar*)(&le_value))[3] == EPR_LE_MAGIC_BYTE_3); } /* Function: epr_is_big_endian_order Access: public API Changelog: 2002/02/04 nf nitial version */ /** * Returns a oolean value indicating whether this code run's on a * little endian order machine or not. *

1 stands for little endian (BE), 0/code> otherwise */ int epr_is_big_endian_order() { uint be_value = EPR_BE_MAGIC_NUMBER; return (((uchar*)(&be_value))[0] == EPR_LE_MAGIC_BYTE_0) && (((uchar*)(&be_value))[1] == EPR_LE_MAGIC_BYTE_1) && (((uchar*)(&be_value))[2] == EPR_LE_MAGIC_BYTE_2) && (((uchar*)(&be_value))[3] == EPR_LE_MAGIC_BYTE_3); } /* Function: epr_swap_endian_order Access: public API Changelog: 2002/02/04 mp nitial version */ /** * Converts bytes for a little endian order machine * * @param field the pointer at data reading in * */ void epr_swap_endian_order(const EPR_SField* field) { switch (field->info->data_type_id) { case e_tid_uchar: case e_tid_char: case e_tid_string: /* no conversion required */ break; case e_tid_time: byte_swap_uint((uint*)field->elems, 3); break; case e_tid_spare: /* no conversion required */ break; case e_tid_ushort: byte_swap_ushort((ushort*) field->elems, field->info->num_elems); break; case e_tid_short: byte_swap_short((short*) field->elems, field->info->num_elems); break; case e_tid_uint: byte_swap_uint((uint*) field->elems, field->info->num_elems); break; case e_tid_int: byte_swap_int((int*) field->elems, field->info->num_elems); break; case e_tid_float: byte_swap_float((float*) field->elems, field->info->num_elems); break; case e_tid_double: epr_set_err(e_err_invalid_data_format, "epr_swap_endian_order: DOUBLE type was not yet processed"); break; default: epr_set_err(e_err_invalid_data_format, "epr_swap_endian_order: unknown data type"); } } bcdev-epr-api-a922482/src/epr_swap.h000066400000000000000000000025631142554441000171730ustar00rootroot00000000000000/* * $Id: epr_swap.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EPR_SWAP_H_INCL #define EPR_SWAP_H_INCL #include /* just to get the ANSI-C type FILE */ #ifdef __cplusplus extern "C" { #endif void byte_swap_short(short *buffer, uint number_of_swaps); void byte_swap_ushort(ushort* buffer, uint number_of_swaps); void byte_swap_long(int *buffer, uint number_of_swaps); void byte_swap_uint(uint* buffer, uint number_of_swaps); void byte_swap_float(float* buffer, uint number_of_swaps); void epr_swap_endian_order(const EPR_SField* field); int epr_is_big_endian_order(); int epr_is_little_endian_order(); #ifdef __cplusplus } #endif #endif /* EPR_SWAP_H_INCL */ bcdev-epr-api-a922482/src/epr_typconv.c000066400000000000000000000704301142554441000177140ustar00rootroot00000000000000/* * $Id: epr_typconv.c,v 1.2 2009-03-27 10:25:54 sabine Exp $ * * Copyright (C) 2002 by Brockmann Consult (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation. This program is distributed in the hope it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "epr_api.h" #include "epr_core.h" #include "epr_field.h" /*********************************** TYPE CONVERSION ***********************************/ /** * Interpretes a memory as a char value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the char typed element * or error_code if an error occured. */ char epr_get_field_elem_as_char(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_char: invalid field name"); return (char)0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_char: invalid elem_index parameter"); return (char)0; } if (field->info->data_type_id != e_tid_char) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_char: invalid type"); return (char)0; } return ((char*) field->elems)[elem_index]; } /** * Interpretes a memory data as a char data * * @param field the pointer at the array to convert * * @return the char typed element * or NULL if an error occured. */ const char* epr_get_field_elems_char(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_chars: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_char) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_chars: invalid type"); return NULL; } return (char*) field->elems; } /** * Interpretes a memory as a uchar value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the uchar typed element * or error_code if an error occured. */ uchar epr_get_field_elem_as_uchar(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_uchar: invalid field name"); return (uchar)0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_uchar: invalid elem_index parameter"); return (uchar)0; } if (field->info->data_type_id != e_tid_uchar) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_uchar: invalid type"); return (uchar)0; } return ((uchar*) field->elems)[elem_index]; } /** * Interpretes a memory data as a uchar data * * @param field the pointer at the array to convert * * @return the uchar typed element * or NULL if an error occured. */ const uchar* epr_get_field_elems_uchar(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_uchars: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_uchar) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_uchars: invalid type"); return NULL; } return (uchar*) field->elems; } /** * Interpretes a memory as a short value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the short typed element * or error_code if an error occured. */ short epr_get_field_elem_as_short(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_short: invalid field name"); return (short)0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_short: invalid elem_index parameter"); return (short)0; } if (field->info->data_type_id == e_tid_uchar) { return (short)((uchar*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_char) { return (short)((char*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_short) { return (short)((short*) field->elems)[elem_index]; } epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_short: invalid type"); return (short)0; } /** * Interpretes a memory data as a short data * * @param field the pointer at the array to convert * * @return the short typed element * or NULL if an error occured. */ const short* epr_get_field_elems_short(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_shorts: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_short) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_shorts: invalid type"); return NULL; } return (short*) field->elems; } /** * Interpretes a memory as a ushort value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the ushort typed element * or error_code if an error occured. */ ushort epr_get_field_elem_as_ushort(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_ushort: invalid field name"); return (ushort)0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_ushort: invalid elem_index parameter"); return (ushort)0; } if (field->info->data_type_id == e_tid_uchar) { return (ushort)((uchar*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_char) { return (ushort)((char*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_ushort) { return (ushort)((ushort*) field->elems)[elem_index]; } epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_ushort: invalid type"); return (ushort)0; } /** * Interpretes a memory data as a ushort data * * @param field the pointer at the array to convert * * @return the ushort typed element * or NULL if an error occured. */ const ushort* epr_get_field_elems_ushort(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_ushorts: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_ushort) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_ushorts: invalid type"); return NULL; } return (ushort*) field->elems; } /** * Interpretes a memory as a int value. * *

If an error occurs the method returns 0 (zero). * Whether an error really occured when zero is returned can by determined by * using the epr_get_last_err_code function. * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return a int value */ int epr_get_field_elem_as_int(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_long: invalid field name"); return (int)0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_long: invalid elem_index parameter"); return (int)0; } if (field->info->data_type_id == e_tid_uchar) { return (int)((uchar*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_char) { return (int)((char*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_ushort) { return (int)((ushort*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_short) { return (int)((short*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_int) { return (int)((int*) field->elems)[elem_index]; } epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_long: invalid type"); return (int)0; } /** * Interpretes a memory data as a int data * * @param field the pointer at the array to convert * * @return the int typed element * or NULL if an error occured. */ const int* epr_get_field_elems_int(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_longs: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_int) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_longs: invalid type"); return NULL; } return (int*) field->elems; } /** * Interpretes a memory as a uint value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the uint typed element * or error_code if an error occured. */ uint epr_get_field_elem_as_uint(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_uint: invalid field name"); return (uint)0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_uint: invalid elem_index parameter"); return (uint)0; } if (field->info->data_type_id == e_tid_uint) { return (uint)((uint*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_uchar) { return (uint)((uchar*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_char) { return (uint)((char*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_ushort) { return (uint)((ushort*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_short) { return (uint)((short*) field->elems)[elem_index]; } epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_uint: invalid type"); return (uint)0; } /** * Interpretes a memory data as a uint data * * @param field the pointer at the array to convert * * @return the uint typed element * or NULL if an error occured. */ const uint* epr_get_field_elems_uint(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_uints: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_uint) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_uints: invalid type"); return NULL; } return (uint*) field->elems; } /** * Interpretes a memory as a float value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the float typed element * or error_code if an error occured. */ float epr_get_field_elem_as_float(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_float: invalid field name"); return 0.0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elem_as_float: invalid elem_index parameter"); return 0.0; } if (field->info->data_type_id == e_tid_float) { return (float)((float*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_uchar) { return (float)((uchar*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_char) { return (float)((char*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_ushort) { return (float)((ushort*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_short) { return (float)((short*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_uint) { return (float)((uint*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_int) { return (float)((int*) field->elems)[elem_index]; } epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_float: invalid type"); return 0.0; } /** * Interpretes a memory data as a float data * * @param field the pointer at the array to convert * * @return the float typed element * or NULL if an error occured. */ const float* epr_get_field_elems_float(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_floats: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_float) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_floats: invalid type"); return NULL; } return (float*) field->elems; } /** * Interpretes a memory as a double value * * @param field the pointer at the array to convert * @param elem_index the index of the element * in the given array to convert * * @return the double typed element * or error_code if an error occured. */ double epr_get_field_elem_as_double(const EPR_SField* field, uint elem_index) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_double: invalid field name"); return 0.0; } if (elem_index >= field->info->num_elems) { epr_set_err(e_err_invalid_value, "epr_get_field_elems_as_double: invalid elem_index parameter"); return 0.0; } if (field->info->data_type_id == e_tid_double) { return (double)((double*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_float) { return (double)((float*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_uchar) { return (double)((uchar*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_char) { return (double)((char*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_ushort) { return (double)((ushort*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_short) { return (double)((short*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_uint) { return (double)((uint*) field->elems)[elem_index]; } if (field->info->data_type_id == e_tid_int) { return (double)((int*) field->elems)[elem_index]; } epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_double: invalid type"); return 0.0; } /** * Interpretes a memory data as a double data * * @param field the pointer at the array to convert * * @return the double typed element * or NULL if an error occured. */ const double* epr_get_field_elems_double(const EPR_SField* field) { epr_clear_err(); epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_doubles: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_double) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_doubles: invalid type"); return NULL; } return (double*) field->elems; } /** * Interpretes a memory data as a short data * * @param field the pointer at the array to convert * @param time the pointer at the time structure to get * * @return the time [days, seconds, microseconds] * or NULL if an error occured. */ const EPR_STime* epr_get_field_elem_as_mjd(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_mjd: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_time) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_mjd: invalid type"); return NULL; } return (const EPR_STime*) field->elems; } /** * Interpretes a memory data as a string. * * @param field the pointer at the array to convert * * @return the char typed element * or NULL if an error occured. */ const char* epr_get_field_elem_as_str(const EPR_SField* field) { epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elem_as_str: invalid field name"); return NULL; } if (field->info->data_type_id != e_tid_string) { epr_set_err(e_err_invalid_data_format, "epr_get_field_elem_as_str: invalid type"); return NULL; } return (const char*) field->elems; } /** * Copies the data of the given field into the given buffer of double * elements. The actual number of elements copied is the minimum of the given * number of elements (the buffer's size) and the actual number of elements contained * in the field. *

If the actual field data type is not double the function automatically * performs the conversion. * * @param field the field from which to copy the elements * @param buffer the buffer in which to copy the data * @param num_elems the number of elements in the given buffer * @return the actual number of elements copied */ uint epr_copy_field_elems_as_doubles(const EPR_SField* field, double* buffer, uint num_elems) { uint num_elems_min = 0; uint i; epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_get_field_elems_as_doubles: invalid field name"); return num_elems_min; } num_elems_min = num_elems; if (field->info->num_elems < num_elems_min) { num_elems_min = field->info->num_elems; } if (field->info->data_type_id == e_tid_uchar) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((uchar*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_char) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((char*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_ushort) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((ushort*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_short) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((short*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_uint) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((uint*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_int) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((int*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_float) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((float*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_double) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (double)((double*) field->elems)[i]; } } else { epr_set_err(e_err_invalid_data_format, "epr_get_field_elems_as_double: invalid type"); return 0; } return num_elems_min; } /** * Copies the data of the given field into the given buffer of float * elements. The actual number of elements copied is the minimum of the given * number of elements (the buffer's size) and the actual number of elements contained * in the field. *

If the actual field data type is not float the function automatically * performs the conversion. * * @param field the field from which to copy the elements * @param buffer the buffer in which to copy the data * @param num_elems the number of elements in the given buffer * @return the actual number of elements copied */ uint epr_copy_field_elems_as_floats(const EPR_SField* field, float* buffer, uint num_elems) { uint num_elems_min = 0; uint i; epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_copy_field_elems_as_floats: invalid field name"); return num_elems_min; } num_elems_min = num_elems; if (field->info->num_elems < num_elems_min) { num_elems_min = field->info->num_elems; } if (field->info->data_type_id == e_tid_uchar) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((uchar*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_char) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((char*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_ushort) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((ushort*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_short) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((short*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_uint) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((uint*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_int) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((int*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_float) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (float)((float*) field->elems)[i]; } } else { epr_set_err(e_err_invalid_data_format, "epr_copy_field_elems_as_floats: invalid type"); return 0; } return num_elems_min; } /** * Copies the data of the given field into the given buffer of int * elements. The actual number of elements copied is the minimum of the given * number of elements (the buffer's size) and the actual number of elements contained * in the field. *

If the actual field data type is not int the function automatically * performs the conversion. * * @param field the field from which to copy the elements * @param buffer the buffer in which to copy the data * @param num_elems the number of elements in the given buffer * @return the actual number of elements copied */ uint epr_copy_field_elems_as_longs(const EPR_SField* field, int* buffer, uint num_elems) { uint num_elems_min = 0; uint i; epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_copy_field_elems_as_longs: invalid field name"); return num_elems_min; } num_elems_min = num_elems; if (field->info->num_elems < num_elems_min) { num_elems_min = field->info->num_elems; } if (field->info->data_type_id == e_tid_uchar) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (int)((uchar*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_char) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (int)((char*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_ushort) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (int)((ushort*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_short) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (int)((short*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_int) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (int)((int*) field->elems)[i]; } } else { epr_set_err(e_err_invalid_data_format, "epr_copy_field_elems_as_longs: invalid type"); return 0; } return num_elems_min; } /** * Copies the data of the given field into the given buffer of uint * elements. The actual number of elements copied is the minimum of the given * number of elements (the buffer's size) and the actual number of elements contained * in the field. *

If the actual field data type is not uint the function automatically * performs the conversion. * * @param field the field from which to copy the elements * @param buffer the buffer in which to copy the data * @param num_elems the number of elements in the given buffer * @return the actual number of elements copied */ uint epr_copy_field_elems_as_uints(const EPR_SField* field, uint* buffer, uint num_elems) { uint num_elems_min = 0; uint i; epr_clear_err(); if (field == NULL) { epr_set_err(e_err_invalid_field_name, "epr_copy_field_elems_as_uints: invalid field name"); return num_elems_min; } num_elems_min = num_elems; if (field->info->num_elems < num_elems_min) { num_elems_min = field->info->num_elems; } if (field->info->data_type_id == e_tid_uchar) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (uint)((uchar*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_char) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (uint)((char*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_ushort) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (uint)((ushort*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_short) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (uint)((short*) field->elems)[i]; } } else if (field->info->data_type_id == e_tid_int) { for (i = 0; i < num_elems_min; i++) { buffer[i] = (uint)((uint*) field->elems)[i]; } } else { epr_set_err(e_err_invalid_data_format, "epr_copy_field_elems_as_uints: invalid type"); return 0; } return num_elems_min; } /***************************************************************************************/ bcdev-epr-api-a922482/src/examples/000077500000000000000000000000001142554441000170125ustar00rootroot00000000000000bcdev-epr-api-a922482/src/examples/tiff.h000066400000000000000000000573711142554441000201300ustar00rootroot00000000000000/* $Header: /usr/local/cvsroot/epr_api/src/examples/tiff.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFF_ #define _TIFF_ /* * Tag Image File Format (TIFF) * * Based on Rev 6.0 from: * Developer's Desk * Aldus Corporation * 411 First Ave. South * Suite 200 * Seattle, WA 98104 * 206-622-5500 */ #define TIFF_VERSION 42 #define TIFF_BIGENDIAN 0x4d4d #define TIFF_LITTLEENDIAN 0x4949 /* * The so called TIFF types conflict with definitions from inttypes.h * included from sys/types.h on AIX (at least using VisualAge compiler). * We try to work around this by detecting this case. Defining * _TIFF_DATA_TYPEDEFS_ short circuits the later definitions in tiff.h, and * we will in the holes not provided for by inttypes.h. * * See http://bugzilla.remotesensing.org/show_bug.cgi?id=39 */ #if defined(_H_INTTYPES) && defined(_ALL_SOURCE) #define _TIFF_DATA_TYPEDEFS_ typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; #endif /* * Intrinsic data types required by the file format: * * 8-bit quantities int8/uint8 * 16-bit quantities int16/uint16 * 32-bit quantities int32/uint32 * strings unsigned char* */ #ifndef _TIFF_DATA_TYPEDEFS_ #define _TIFF_DATA_TYPEDEFS_ #ifdef __STDC__ typedef signed char int8; /* NB: non-ANSI compilers may not grok */ #else typedef char int8; #endif typedef unsigned char uint8; typedef short int16; typedef unsigned short uint16; /* sizeof (uint16) must == 2 */ #if defined(__alpha) || (defined(_MIPS_SZLONG) && _MIPS_SZLONG == 64) || defined(__LP64__) typedef int int32; typedef unsigned int uint32; /* sizeof (uint32) must == 4 */ #else typedef long int32; typedef unsigned long uint32; /* sizeof (uint32) must == 4 */ #endif #endif /* _TIFF_DATA_TYPEDEFS_ */ /* For TIFFReassignTagToIgnore */ enum TIFFIgnoreSense /* IGNORE tag table */ { TIS_STORE, TIS_EXTRACT, TIS_EMPTY }; typedef struct { uint16 tiff_magic; /* magic number (defines byte order) */ uint16 tiff_version; /* TIFF version number */ uint32 tiff_diroff; /* byte offset to first directory */ } TIFFHeader; /* * TIFF Image File Directories are comprised of * a table of field descriptors of the form shown * below. The table is sorted in ascending order * by tag. The values associated with each entry * are disjoint and may appear anywhere in the file * (so long as they are placed on a word boundary). * * If the value is 4 bytes or less, then it is placed * in the offset field to save space. If the value * is less than 4 bytes, it is left-justified in the * offset field. */ typedef struct { uint16 tdir_tag; /* see below */ uint16 tdir_type; /* data type; see below */ uint32 tdir_count; /* number of items; length in spec */ uint32 tdir_offset; /* byte offset to field data */ } TIFFDirEntry; /* * NB: In the comments below, * - items marked with a + are obsoleted by revision 5.0, * - items marked with a ! are introduced in revision 6.0. * - items marked with a % are introduced post revision 6.0. * - items marked with a $ are obsoleted by revision 6.0. */ /* * Tag data type information. * * Note: RATIONALs are the ratio of two 32-bit integer values. */ typedef enum { TIFF_NOTYPE = 0, /* placeholder */ TIFF_BYTE = 1, /* 8-bit unsigned integer */ TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ TIFF_SHORT = 3, /* 16-bit unsigned integer */ TIFF_LONG = 4, /* 32-bit unsigned integer */ TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ TIFF_SBYTE = 6, /* !8-bit signed integer */ TIFF_UNDEFINED = 7, /* !8-bit untyped data */ TIFF_SSHORT = 8, /* !16-bit signed integer */ TIFF_SLONG = 9, /* !32-bit signed integer */ TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ TIFF_DOUBLE = 12 /* !64-bit IEEE floating point */ } TIFFDataType; /* * TIFF Tag Definitions. */ #define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ #define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ #define FILETYPE_PAGE 0x2 /* one page of many */ #define FILETYPE_MASK 0x4 /* transparency mask */ #define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ #define OFILETYPE_IMAGE 1 /* full resolution image data */ #define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ #define OFILETYPE_PAGE 3 /* one page of many */ #define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ #define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ #define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ #define TIFFTAG_COMPRESSION 259 /* data compression technique */ #define COMPRESSION_NONE 1 /* dump mode */ #define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ #define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ #define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ #define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ #define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ #define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ #define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ #define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ #define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ #define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ #define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ #define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ /* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT */ #define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ #define COMPRESSION_JBIG 34661 /* ISO JBIG */ #define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ #define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ #define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ #define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ #define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ #define PHOTOMETRIC_RGB 2 /* RGB color model */ #define PHOTOMETRIC_PALETTE 3 /* color map indexed */ #define PHOTOMETRIC_MASK 4 /* $holdout mask */ #define PHOTOMETRIC_SEPARATED 5 /* !color separations */ #define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ #define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ #define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ #define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ #define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ #define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ #define THRESHHOLD_BILEVEL 1 /* b&w art scan */ #define THRESHHOLD_HALFTONE 2 /* or dithered scan */ #define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ #define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ #define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ #define TIFFTAG_FILLORDER 266 /* data order within a byte */ #define FILLORDER_MSB2LSB 1 /* most significant -> least */ #define FILLORDER_LSB2MSB 2 /* least significant -> most */ #define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ #define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ #define TIFFTAG_MAKE 271 /* scanner manufacturer name */ #define TIFFTAG_MODEL 272 /* scanner model name/number */ #define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ #define TIFFTAG_ORIENTATION 274 /* +image orientation */ #define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ #define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ #define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ #define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ #define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ #define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ #define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ #define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ #define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ #define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ #define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ #define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ #define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ #define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ #define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ #define TIFFTAG_PLANARCONFIG 284 /* storage organization */ #define PLANARCONFIG_CONTIG 1 /* single image plane */ #define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ #define TIFFTAG_PAGENAME 285 /* page name image is from */ #define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ #define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ #define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ #define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ #define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ #define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ #define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ #define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ #define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ #define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ #define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ #define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ #define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ #define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ #define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ #define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ #define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ #define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ #define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ #define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ #define RESUNIT_NONE 1 /* no meaningful units */ #define RESUNIT_INCH 2 /* english */ #define RESUNIT_CENTIMETER 3 /* metric */ #define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ #define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ #define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ #define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ #define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ #define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ #define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ #define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ #define TIFFTAG_SOFTWARE 305 /* name & release */ #define TIFFTAG_DATETIME 306 /* creation date and time */ #define TIFFTAG_ARTIST 315 /* creator of image */ #define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ #define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ #define TIFFTAG_WHITEPOINT 318 /* image white point */ #define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ #define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ #define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ #define TIFFTAG_TILEWIDTH 322 /* !rows/data tile */ #define TIFFTAG_TILELENGTH 323 /* !cols/data tile */ #define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ #define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ #define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ #define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ #define CLEANFAXDATA_CLEAN 0 /* no errors detected */ #define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ #define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ #define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ #define TIFFTAG_SUBIFD 330 /* subimage descriptors */ #define TIFFTAG_INKSET 332 /* !inks in separated image */ #define INKSET_CMYK 1 /* !cyan-magenta-yellow-black */ #define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ #define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ #define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ #define TIFFTAG_TARGETPRINTER 337 /* !separation target */ #define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ #define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ #define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ #define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ #define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ #define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ #define SAMPLEFORMAT_INT 2 /* !signed integer data */ #define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ #define SAMPLEFORMAT_VOID 4 /* !untyped data */ #define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ #define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ #define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ #define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ #define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ /* * Tags 512-521 are obsoleted by Technical Note #2 * which specifies a revised JPEG-in-TIFF scheme. */ #define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ #define JPEGPROC_BASELINE 1 /* !baseline sequential */ #define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ #define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ #define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ #define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ #define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ #define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ #define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ #define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ #define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ #define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ #define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ #define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ #define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ #define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ #define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ /* tags 32952-32956 are private tags registered to Island Graphics */ #define TIFFTAG_REFPTS 32953 /* image reference points */ #define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ #define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ #define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ /* tags 32995-32999 are private tags registered to SGI */ #define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ #define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ #define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ #define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ /* tags 33300-33309 are private tags registered to Pixar */ /* * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH * are set when an image has been cropped out of a larger image. * They reflect the size of the original uncropped image. * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used * to determine the position of the smaller image in the larger one. */ #define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ #define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ /* Tags 33302-33306 are used to identify special image modes and data * used by Pixar's texture formats. */ #define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ #define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ #define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ #define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 #define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 /* tag 33405 is a private tag registered to Eastman Kodak */ #define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ /* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ #define TIFFTAG_COPYRIGHT 33432 /* copyright string */ /* IPTC TAG from RichTIFF specifications */ #define TIFFTAG_RICHTIFFIPTC 33723 /* 34016-34029 are reserved for ANSI IT8 TIFF/IT */ #define TIFFTAG_STONITS 37439 /* Sample value to Nits */ /* tag 34929 is a private tag registered to FedEx */ #define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ /* tag 65535 is an undefined tag used by Eastman Kodak */ #define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ /* * The following are ``pseudo tags'' that can be * used to control codec-specific functionality. * These tags are not written to file. Note that * these values start at 0xffff+1 so that they'll * never collide with Aldus-assigned tags. * * If you want your private pseudo tags ``registered'' * (i.e. added to this file), send mail to sam@sgi.com * with the appropriate C definitions to add. */ #define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ #define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ #define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ #define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ #define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ #define FAXMODE_WORDALIGN 0x0008 /* word align row */ #define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ #define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ /* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ #define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ #define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ #define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ #define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ #define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ #define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ /* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ #define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ #define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ #define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ #define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ #define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ #define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ #define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ #define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ /* 65550-65556 are allocated to Oceana Matrix */ #define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ #define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ #define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ #define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ #define DCSIMAGERFILTER_IR 0 /* infrared filter */ #define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ #define DCSIMAGERFILTER_CFA 2 /* color filter array */ #define DCSIMAGERFILTER_OTHER 3 /* other filter */ #define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ #define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ #define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ #define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ #define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ #define TIFFTAG_DCSGAMMA 65554 /* gamma value */ #define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ #define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ /* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ #define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ #define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ /* 65559 is allocated to Oceana Matrix */ #define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ #define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ #define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ #define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ #define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ #define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ #define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ #define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ #define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ #endif /* _TIFF_ */ bcdev-epr-api-a922482/src/examples/tiffio.h000066400000000000000000000333231142554441000204470ustar00rootroot00000000000000/* $Header: /usr/local/cvsroot/epr_api/src/examples/tiffio.h,v 1.1.1.1 2004-10-28 19:22:23 norman Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFIO_ #define _TIFFIO_ /* * TIFF I/O Library Definitions. */ #include "tiff.h" /* * TIFF is defined as an incomplete type to hide the * library's internal data structures from clients. */ typedef struct tiff TIFF; /* * The following typedefs define the intrinsic size of * data types used in the *exported* interfaces. These * definitions depend on the proper definition of types * in tiff.h. Note also that the varargs interface used * to pass tag types and values uses the types defined in * tiff.h directly. * * NB: ttag_t is unsigned int and not unsigned short because * ANSI C requires that the type before the ellipsis be a * promoted type (i.e. one of int, unsigned int, pointer, * or double) and because we defined pseudo-tags that are * outside the range of legal Aldus-assigned tags. * NB: tsize_t is int32 and not uint32 because some functions * return -1. * NB: toff_t is not off_t for many reasons; TIFFs max out at * 32-bit file offsets being the most important, and to ensure * that it is unsigned, rather than signed. */ typedef uint32 ttag_t; /* directory tag */ typedef uint16 tdir_t; /* directory index */ typedef uint16 tsample_t; /* sample number */ typedef uint32 tstrip_t; /* strip number */ typedef uint32 ttile_t; /* tile number */ typedef int32 tsize_t; /* i/o size in bytes */ typedef void* tdata_t; /* image data ref */ typedef uint32 toff_t; /* file offset */ #if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) #define __WIN32__ #endif /* * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). * * By default tif_win32.c is assumed on windows if not using the cygwin * environment. */ #if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) # if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILIO) # define USE_WIN32_FILEIO # endif #endif #if defined(USE_WIN32_FILEIO) #include #ifdef __WIN32__ DECLARE_HANDLE(thandle_t); /* Win32 file handle */ #else typedef HFILE thandle_t; /* client data handle */ #endif #else typedef void* thandle_t; /* client data handle */ #endif #ifndef NULL #define NULL 0 #endif /* * Flags to pass to TIFFPrintDirectory to control * printing of data structures that are potentially * very large. Bit-or these flags to enable printing * multiple items. */ #define TIFFPRINT_NONE 0x0 /* no extra info */ #define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ #define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ #define TIFFPRINT_COLORMAP 0x4 /* colormap */ #define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ #define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ #define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ /* * RGBA-style image support. */ typedef unsigned char TIFFRGBValue; /* 8-bit samples */ typedef struct _TIFFRGBAImage TIFFRGBAImage; /* * The image reading and conversion routines invoke * ``put routines'' to copy/image/whatever tiles of * raw image data. A default set of routines are * provided to convert/copy raw image data to 8-bit * packed ABGR format rasters. Applications can supply * alternate routines that unpack the data into a * different format or, for example, unpack the data * and draw the unpacked raster on the display. */ typedef void (*tileContigRoutine) (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, unsigned char*); typedef void (*tileSeparateRoutine) (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, unsigned char*, unsigned char*, unsigned char*, unsigned char*); /* * RGBA-reader state. */ typedef struct { /* YCbCr->RGB support */ TIFFRGBValue* clamptab; /* range clamping table */ int* Cr_r_tab; int* Cb_b_tab; int32* Cr_g_tab; int32* Cb_g_tab; float coeffs[3]; /* cached for repeated use */ } TIFFYCbCrToRGB; struct _TIFFRGBAImage { TIFF* tif; /* image handle */ int stoponerr; /* stop on read error */ int isContig; /* data is packed/separate */ int alpha; /* type of alpha data present */ uint32 width; /* image width */ uint32 height; /* image height */ uint16 bitspersample; /* image bits/sample */ uint16 samplesperpixel; /* image samples/pixel */ uint16 orientation; /* image orientation */ uint16 photometric; /* image photometric interp */ uint16* redcmap; /* colormap pallete */ uint16* greencmap; uint16* bluecmap; /* get image data routine */ int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); union { void (*any)(TIFFRGBAImage*); tileContigRoutine contig; tileSeparateRoutine separate; } put; /* put decoded strip/tile */ TIFFRGBValue* Map; /* sample mapping array */ uint32** BWmap; /* black&white map */ uint32** PALmap; /* palette image map */ TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ int row_offset; int col_offset; }; /* * Macros for extracting components from the * packed ABGR form returned by TIFFReadRGBAImage. */ #define TIFFGetR(abgr) ((abgr) & 0xff) #define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) #define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) #define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) /* * A CODEC is a software package that implements decoding, * encoding, or decoding+encoding of a compression algorithm. * The library provides a collection of builtin codecs. * More codecs may be registered through calls to the library * and/or the builtin implementations may be overridden. */ typedef int (*TIFFInitMethod)(TIFF*, int); typedef struct { char* name; uint16 scheme; TIFFInitMethod init; } TIFFCodec; #include #include /* share internal LogLuv conversion routines? */ #ifndef LOGLUV_PUBLIC #define LOGLUV_PUBLIC 1 #endif #if defined(__cplusplus) extern "C" { #endif typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t); typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); typedef int (*TIFFCloseProc)(thandle_t); typedef toff_t (*TIFFSizeProc)(thandle_t); typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*); typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t); typedef void (*TIFFExtendProc)(TIFF*); extern const char* TIFFGetVersion(void); extern const TIFFCodec* TIFFFindCODEC(uint16); extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); extern void TIFFUnRegisterCODEC(TIFFCodec*); extern tdata_t _TIFFmalloc(tsize_t); extern tdata_t _TIFFrealloc(tdata_t, tsize_t); extern void _TIFFmemset(tdata_t, int, tsize_t); extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t); extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t); extern void _TIFFfree(tdata_t); extern void TIFFClose(TIFF*); extern int TIFFFlush(TIFF*); extern int TIFFFlushData(TIFF*); extern int TIFFGetField(TIFF*, ttag_t, ...); extern int TIFFVGetField(TIFF*, ttag_t, va_list); extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...); extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list); extern int TIFFReadDirectory(TIFF*); extern tsize_t TIFFScanlineSize(TIFF*); extern tsize_t TIFFRasterScanlineSize(TIFF*); extern tsize_t TIFFStripSize(TIFF*); extern tsize_t TIFFVStripSize(TIFF*, uint32); extern tsize_t TIFFTileRowSize(TIFF*); extern tsize_t TIFFTileSize(TIFF*); extern tsize_t TIFFVTileSize(TIFF*, uint32); extern uint32 TIFFDefaultStripSize(TIFF*, uint32); extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); extern int TIFFFileno(TIFF*); extern int TIFFGetMode(TIFF*); extern int TIFFIsTiled(TIFF*); extern int TIFFIsByteSwapped(TIFF*); extern int TIFFIsUpSampled(TIFF*); extern int TIFFIsMSB2LSB(TIFF*); extern uint32 TIFFCurrentRow(TIFF*); extern tdir_t TIFFCurrentDirectory(TIFF*); extern tdir_t TIFFNumberOfDirectories(TIFF*); extern uint32 TIFFCurrentDirOffset(TIFF*); extern tstrip_t TIFFCurrentStrip(TIFF*); extern ttile_t TIFFCurrentTile(TIFF*); extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t); extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t); extern int TIFFWriteCheck(TIFF*, int, const char *); extern int TIFFCreateDirectory(TIFF*); extern int TIFFLastDirectory(TIFF*); extern int TIFFSetDirectory(TIFF*, tdir_t); extern int TIFFSetSubDirectory(TIFF*, uint32); extern int TIFFUnlinkDirectory(TIFF*, tdir_t); extern int TIFFSetField(TIFF*, ttag_t, ...); extern int TIFFVSetField(TIFF*, ttag_t, va_list); extern int TIFFWriteDirectory(TIFF *); extern int TIFFRewriteDirectory(TIFF *); extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int); #if defined(c_plusplus) || defined(__cplusplus) extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0); extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0); extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); #else extern void TIFFPrintDirectory(TIFF*, FILE*, long); extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t); extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t); extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); #endif extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * ); extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); extern int TIFFRGBAImageOK(TIFF*, char [1024]); extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); extern void TIFFRGBAImageEnd(TIFFRGBAImage*); extern TIFF* TIFFOpen(const char*, const char*); extern TIFF* TIFFFdOpen(int, const char*, const char*); extern TIFF* TIFFClientOpen(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc); extern const char* TIFFFileName(TIFF*); extern void TIFFError(const char*, const char*, ...); extern void TIFFWarning(const char*, const char*, ...); extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); extern ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t); extern int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t); extern ttile_t TIFFNumberOfTiles(TIFF*); extern tsize_t TIFFReadTile(TIFF*, tdata_t, uint32, uint32, uint32, tsample_t); extern tsize_t TIFFWriteTile(TIFF*, tdata_t, uint32, uint32, uint32, tsample_t); extern tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t); extern tstrip_t TIFFNumberOfStrips(TIFF*); extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t); extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t); extern void TIFFSetWriteOffset(TIFF*, toff_t); extern void TIFFSwabShort(uint16*); extern void TIFFSwabLong(uint32*); extern void TIFFSwabDouble(double*); extern void TIFFSwabArrayOfShort(uint16*, unsigned long); extern void TIFFSwabArrayOfLong(uint32*, unsigned long); extern void TIFFSwabArrayOfDouble(double*, unsigned long); extern void TIFFReverseBits(unsigned char *, unsigned long); extern const unsigned char* TIFFGetBitRevTable(int); #ifdef LOGLUV_PUBLIC #define U_NEU 0.210526316 #define V_NEU 0.473684211 #define UVSCALE 410. extern double LogL16toY(int); extern double LogL10toY(int); extern void XYZtoRGB24(float*, uint8*); extern int uv_decode(double*, double*, int); extern void LogLuv24toXYZ(uint32, float*); extern void LogLuv32toXYZ(uint32, float*); #if defined(c_plusplus) || defined(__cplusplus) extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); #else extern int LogL16fromY(double, int); extern int LogL10fromY(double, int); extern int uv_encode(double, double, int); extern uint32 LogLuv24fromXYZ(float*, int); extern uint32 LogLuv32fromXYZ(float*, int); #endif #endif /* LOGLUV_PUBLIC */ #if defined(__cplusplus) } #endif #endif /* _TIFFIO_ */ bcdev-epr-api-a922482/src/examples/write_bands.c000066400000000000000000000144621142554441000214660ustar00rootroot00000000000000#include #include #include #include #include #include #include #include "../epr_api.h" void get_meris_sun_spec_flux(EPR_SProductId* product_id, float sun_spec_flux[15]) { EPR_SDatasetId* dataset_id; EPR_SRecord* record; const EPR_SField* field; dataset_id = epr_get_dataset_id(product_id, "Scaling_Factor_GADS"); record = epr_read_record(dataset_id, 0, NULL); field = epr_get_field(record, "sun_spec_flux"); epr_copy_field_elems_as_floats(field, sun_spec_flux, 15); epr_free_record(record); } int write_raw_image(const char* output_dir, EPR_SProductId* product_id, const char* band_name); #if defined(WIN32) && defined(_DEBUG) #include #endif /* if defined(WIN32) && defined(_DEBUG) */ /** * A program for converting producing ENVI raster information from dataset. * * It generates as many raster as there are dataset entrance parameters. * * Call: write_bands * * * [ ... ] * * Example: * * write_bands * "d:/ENVISAT/data/MERIS/L1b/MER_RR__1PNPDK20020415_103725_000002702005_00094_00649_1059.N1" * "./" * "latitude" * ["longitude" "dem_alt" "dem_rough" "lat_corr" "lon_corr" "sun_zenith" "sun_azimuth" * "view_zenith" "view_azimuth" "zonal_wind" "merid_wind" "atm_press" "ozone" "rel_hum" * "radiance_1" "radiance_2" "radiance_3" "radiance_4" "radiance_5" "radiance_6" * "radiance_7" "radiance_8" "radiance_9" "radiance_10" "radiance_11" "radiance_12" * "radiance_13" "radiance_14" "radiance_15"] * OR * "data/MERIS/L2/MER_RR__2PNPDK20020329_092030_000002701003_00036_00405_0054.N1" * * OR * "data/AATSR/L1b/ATS_TOA_1PTRAL19950510_071649_00000000X000_00000_00000_0000.N1" * ATS_TOA_1PNETB20020411_074000_000049912005_00035_00590_0289.N1 * "./" * "latitude" * ["longitude" "lat_corr_nadir" "lon_corr_nadir" "lat_corr_fward" "lon_corr_fward" "altitude" * "sun_elev_nadir" "view_elev_nadir" "sun_azimuth_nadir" "view_azimuth_nadir" "sun_elev_fward" * "view_elev_fward" "sun_azimuth_fward" "view_azimuth_fward" * "btemp_nadir_1200" "btemp_nadir_1100" "btemp_nadir_0370" "reflec_nadir_1600" "reflec_nadir_0870" "reflec_nadir_0670" "reflec_nadir_0550" * "btemp_fward_1200" "btemp_fward_1100" "btemp_fward_0370" "reflec_fward_1600" "reflec_fward_0870" "reflec_fward_0670" "reflec_fward_0550" * "confid_flags_nadir" "confid_flags_fward" "cloud_flags_nadir" "cloud_flags_fward"] * */ int main(int argc, char** argv) { EPR_SProductId* product_id; int i; const char* product_file_path; const char* output_dir_path; if (argc <= 3) { printf("Usage: write_bands "); printf(" [ ... ]\n"); printf(" where envisat-product is the input filename\n"); printf(" and output-dir is the output directory\n"); printf(" and dataset-name-1 is the name of the first band to be extracted (mandatory)\n"); printf(" and dataset-name-2 ... dataset-name-N are the names of further bands to be extracted (optional)\n"); printf("Example:\n"); printf(" write_bands \"./MER_RR__2P_TEST.N1\" \".\\\" \"latitude\"\n\n"); exit(1); } product_file_path = argv[1]; output_dir_path = argv[2]; /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) */ epr_init_api(e_log_debug, epr_log_message, NULL); /* Open the product; an argument is a path to product data file */ product_id = epr_open_product(product_file_path); for (i = 3; i < argc; i ++) { write_raw_image(output_dir_path, product_id, argv[i]); } /* Close product_id and release rest of the allocated memory */ epr_close_product(product_id); /* Closes product reader API, release all allocated resources */ epr_close_api(); return 0; } /** * Generate the ENVI binary pattern image file for an actual DS. * * The first parameter is the output directory path. * * The function returns 1, if the file is generated, 0 otherwise. */ int write_raw_image(const char* output_dir, EPR_SProductId* product_id, const char* band_name) { FILE *out_stream; uint y, numwritten; char image_file_path[1024]; EPR_SBandId* band_id = NULL; int err_code; EPR_SRaster* raster = NULL; uint source_w, source_h; uint source_step_x, source_step_y; /* Build ENVI file path, DS name specifically */ #ifdef WIN32 sprintf(image_file_path, "%s\\%s.raw", output_dir, band_name); #else sprintf(image_file_path, "%s/%s.raw", output_dir, band_name); #endif band_id = epr_get_band_id(product_id, band_name); if (band_id == NULL) { printf("Error: band '%s' not found\n", band_name); return 1; } source_w = epr_get_scene_width(product_id); source_h = epr_get_scene_height(product_id); source_step_x = 1; source_step_y = 1; raster = epr_create_compatible_raster(band_id, source_w, source_h, source_step_x, source_step_y); printf("Reading band '%s'...\n", band_name); err_code = epr_read_band_raster(band_id, 0, 0, raster); if (err_code != 0) { printf("Error: can't read raster data from '%s'\n", band_name); return 2; } out_stream = fopen(image_file_path, "wb"); if (out_stream == NULL) { printf("Error: can't open '%s'\n", image_file_path); return 3; } for (y = 0; y < (uint)raster->raster_height; y ++) { numwritten = fwrite(epr_get_raster_line_addr(raster, y), raster->elem_size, raster->raster_width, out_stream); if (numwritten != raster->raster_width) { printf("Error: can't write to %s\n", image_file_path); return 4; } } fclose(out_stream); printf("Raw image data successfully written to '%s'.\n", image_file_path); printf("C data type is '%s', element size %u byte(s), raster size is %u x %u pixels.\n", epr_data_type_id_to_str(raster->data_type), raster->elem_size, raster->raster_width, raster->raster_height); epr_free_raster(raster); return 0; } bcdev-epr-api-a922482/src/examples/write_bitmask.c000066400000000000000000000060741142554441000220310ustar00rootroot00000000000000#include "../epr_api.h" /* * Generates bit mask from ENVISAT flags information as "raw" image for (e.g.) Photoshop * * Call: write_bitmask * * Example to call the main function. * "./MER_RR__2P_TEST.N1" "l2_flags.LAND and !l2_flags.BRIGHT" "./my_flags.raw" * */ #include #include int main(int argc, char* argv[]) { EPR_SProductId* product_id; EPR_SRaster* bm_raster; uint offset_x; uint offset_y; uint source_width; uint source_height; uint source_step_x; uint source_step_y; const char* product_file_path; const char* image_file_path; const char* bm_expr; FILE *out_stream; uint i, numwritten; int status; if (argc != 4) { printf("Usage: write_bitmask \n"); printf(" where envisat-product is the input filename\n"); printf(" and bitmask-expression is a string containing the bitmask logic\n"); printf(" and output-file is the output filename.\n"); printf("Example: \"./MER_RR__2P_TEST.N1\" \"l2_flags.LAND and !l2_flags.BRIGHT\" \"./my_flags.raw\"\n\n"); exit(1); } product_file_path = argv[1]; bm_expr = argv[2]; image_file_path = argv[3]; /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) */ epr_init_api(e_log_debug, epr_log_message, NULL); /* Open the product; an argument is a path to product data file */ product_id = epr_open_product(product_file_path); if (product_id == NULL) { printf("Error: failed to open product '%s'\n", product_file_path); return 1; } offset_x = 0; offset_y = 0; source_width = epr_get_scene_width(product_id); source_height = epr_get_scene_height(product_id); source_step_x = 1; source_step_y = 1; bm_raster = epr_create_raster(e_tid_uchar, source_width, source_height, source_step_x, source_step_y); status = epr_read_bitmask_raster(product_id, bm_expr, offset_x, offset_y, bm_raster); if (status != 0) { printf("Error: %s\n", epr_get_last_err_message()); return 1; } out_stream = fopen(image_file_path, "wb"); if (out_stream == NULL) { printf("Error: can't open '%s'\n", image_file_path); return 1; } for (i = 0; i < (uint)bm_raster->raster_height; i ++) { numwritten = fwrite(((uchar*) bm_raster->buffer) + bm_raster->raster_width * i, sizeof (uchar), bm_raster->raster_width, out_stream); if (numwritten != bm_raster->raster_width) { printf("Error: can't write to '%s'\n", image_file_path); fclose(out_stream); return 2; } } fclose(out_stream); printf("Raw image data successfully written to '%s'.\n", image_file_path); printf("Data type is 'byte', size is %d x %d pixels.\n", source_width, source_height); epr_free_raster(bm_raster); /* Close product_id and release rest of the allocated memory */ epr_close_product(product_id); /* Closes product reader API, release all allocated resources */ epr_close_api(); return 0; } bcdev-epr-api-a922482/src/examples/write_ndvi.c000066400000000000000000000123671142554441000213410ustar00rootroot00000000000000#include #include #include #include #include #include "../epr_api.h" /* * Example for using the epr-api * * Demonstrates how to open a MERIS L1b product and calculate the NDVI * * This example does not demonstrate how to write good and safe code. * It is reduced to the essentials for working with the epr-api. * * Calling sequence: ndvi * * for example: ndvi MER_RR__1P_test.N1 my_ndvi.raw * */ int main(int argc, char* argv[]) { FILE * out_stream; EPR_SProductId * product_id; EPR_SBandId * band_id1 = NULL; EPR_SBandId * band_id2 = NULL; EPR_SRaster * raster1; EPR_SRaster * raster2; char* band1_name; char* band2_name; char* log_buffer; uint i, j; int offset_x, offset_y, status; float rad1, rad2, ndvi; ulong width, height; uint subsampling_x, subsampling_y; if (argc != 3) { printf("Usage: write_ndvi \n"); printf(" where envisat-product is the input filename\n"); printf(" and output-file is the output filename.\n"); printf("Example: \"./MER_RR__1P_TEST.N1\" \"./my_ndvi.raw\"\n\n"); exit(1); } /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) e_log_debug is an enumeration defined in epr_api.h epr_log_message is a function defined in epr_api.h */ epr_init_api(e_log_debug, epr_log_message, NULL); /* Open the product; the name of the product is in the first argument of the program call we do not check here if the product is a valid L1b product to keep the code simple */ product_id = epr_open_product(argv[1]); /* The NDVI shall be calculated using bands 6 and 8. The names of these bands are "radiance_6" and "radiance_10". This can be found in the BEAM documentation or using VISAT. */ band1_name = "radiance_6"; band2_name = "radiance_10"; /* Now we have to obtain band identifier for these bands. This is a structure which we will use in the next step to read the calibrated radiances into the raster (i.e. the matrix with the radiance values). */ band_id1 = epr_get_band_id(product_id, band1_name); if (band_id1 == NULL) { printf("error: band '%s' not found (MERIS L1b product expected)\n", band1_name); return 0; } band_id2 = epr_get_band_id(product_id, band2_name); if (band_id2 == NULL) { printf("error: band '%s' not found (MERIS L1b product expected)\n", band2_name); return 0; } /* Before we can read the data into the raster, we have to allocate memory for the raster, i.e. we have to create the raster. We make it simple and define our raster of the same size as the whole product, and don't apply subsampling. */ width = epr_get_scene_width(product_id); height = epr_get_scene_height(product_id); subsampling_x = 1; subsampling_y = 1; raster1 = epr_create_compatible_raster(band_id1, width, height, subsampling_x, subsampling_y); raster2 = epr_create_compatible_raster(band_id2, width, height, subsampling_x, subsampling_y); /* Now we read the radiance into the raster. Because our raster matches the whole product, we start reading at offset (0,0) */ offset_x = 0; offset_y = 0; log_buffer = calloc(80, 1); sprintf(log_buffer, "read '%s' data", band1_name); epr_log_message(e_log_info, log_buffer); free(log_buffer); status = epr_read_band_raster(band_id1, offset_x, offset_y, raster1); log_buffer = calloc(80, 1); sprintf(log_buffer, "read '%s' data", band2_name); epr_log_message(e_log_info, log_buffer); free(log_buffer); status = epr_read_band_raster(band_id2, offset_x, offset_y, raster2); /* So, now we hold the two arrays totally in memory. I hope that enough memory is available. The rest is easy. We loop over all pixel and calculate the NDVI. We simply write each calculated pixel directly into the output image. Not elegant, but simple. */ log_buffer = calloc(80, 1); sprintf(log_buffer, "write ndvi to '%s'", argv[2]); epr_log_message(e_log_info, log_buffer); free(log_buffer); out_stream = fopen(argv[2], "wb"); for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { rad1 = epr_get_pixel_as_float(raster1, i, j); rad2 = epr_get_pixel_as_float(raster2, i, j); if ((rad1 + rad2) != 0.0) { ndvi = (rad2 - rad1) / (rad2 + rad1); } else { ndvi = -1.0; } status = fwrite( & ndvi, sizeof(float), 1, out_stream); } } epr_log_message(e_log_info, "ndvi was written success"); /* This was all. Now we have to close everything, release memory and say goodbye. If you want, you can open the written file an image processing program and look at the result. */ fclose(out_stream); epr_free_raster(raster1); epr_free_raster(raster2); epr_close_product(product_id); epr_close_api(); return 0; } bcdev-epr-api-a922482/src/examples/write_rgb.c000066400000000000000000000231421142554441000211440ustar00rootroot00000000000000/* * This is an example program for creating TIFF-RGB images from three ENVISAT data channels. * * To compile this file you will need a recent "libtiff" library (v3.5.7 or higher, * http://www.libtiff.org/) for writing TIFF files. Because of the "libtiff" library dependencies * you might also need "libjpeg" as well as "zlib" libraries. * * Note for MS-Windows users: make sure that "libtiff.dll", "libjpeg.dll" and "zlib.dll" can be * found via your system's PATH variable or place the DLLs next to this program. * * This program uses 3 channels of an ENVISAT product for the generation of the RGB image. * * The created TIF-image has the same name as a ENVISAT product data file * however - with the extention ".tif" * * Usage: create_RGB_image * [] * * Parameters: * - the file path to the ENVISAT product * - the dataset name for the R-channel * - the dataset name for the G-channel * - the dataset name for the B-channel * - sub-sampling in the both directions, optinal. Default:1. * * Example: * create_RGB_image * "d:/ENVISAT/data/MERIS/L1b/MER_RR__1PNPDK20020415_103725_000002702005_00094_00649_1059.N1" * radiance_13 radiance_5 radiance_1 6 * */ #include #include #include #include #include #include #include #include "../epr_api.h" #include "../epr_string.h" #include "tiffio.h" #if defined(WIN32) && defined(_DEBUG) #include #endif /* if defined(WIN32) && defined(_DEBUG) */ #define EPR_TIF_NAME "epr_tif" #define EPR_TIF_VERSION "1.0" /* HELPER STRUCTURES */ typedef struct Extrema { float min; float max; } SExtrema; #ifdef _MAX_PATH #define PATH_MAX _MAX_PATH #else #define PATH_MAX 1023 #endif /* HELPER FUNCTIONS */ EPR_SRaster* make_layer(EPR_SProductId* product_id, const char* ds_name, uint32 source_w, uint32 source_h, uint32 subsampl); SExtrema get_raster_minmax(EPR_SRaster* raster); uint32 prepare_image_properties(TIFF *out, uint32 width, uint32 height); void printVersion() { printf("%s, version %s (c) by Brockmann Consult\n", EPR_TIF_NAME, EPR_TIF_VERSION); } void printUsage() { printf("usage: %s []\n", EPR_TIF_NAME); } int main(int argc, char** argv) { EPR_SProductId* product_id; EPR_SRaster* r_raster_layer = NULL; EPR_SRaster* g_raster_layer = NULL; EPR_SRaster* b_raster_layer = NULL; float* r_sample_addr = NULL; float* g_sample_addr = NULL; float* b_sample_addr = NULL; uint32 col; char out_name[PATH_MAX+1]; int i; TIFF *out = NULL; uint32 width; uint32 height; uint32 scanlineLen = 0; uint32 row; int clip_dir = 0; unsigned char* buf = NULL; SExtrema r_layer; SExtrema g_layer; SExtrema b_layer; float r_factor; float g_factor; float b_factor; const char* product_name = NULL; const char* r_band_name = NULL; const char* g_band_name = NULL; const char* b_band_name = NULL; uint32 subsampl = 1; printVersion(); if (argc < 5) { printUsage(); exit(-1); } product_name = argv[1]; r_band_name = argv[2]; g_band_name = argv[3]; b_band_name = argv[4]; if (argc == 6) { /* manage the image size */ subsampl = atoi(argv[5]); } /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) */ epr_init_api(e_log_debug, epr_log_message, NULL);/*"../../dddb"*/ /* Open the product; an argument is a path to product data file */ product_id = epr_open_product(product_name); if (product_id == NULL) { printf("error: failed to open product '%s'\n", product_name); printf(" extended message: %s\n", epr_get_last_err_message()); exit(1); } width = (uint32) epr_get_scene_width(product_id); height = (uint32)epr_get_scene_height(product_id); printf("info: scene raster height: %d\n", height); printf("info: scene raster width: %d\n", width); if (subsampl > width){ printf("warning: subsampling too large; changed to %d\n", width); subsampl = width; } /* construct output image name */ clip_dir = 0; for (i = strlen(product_name)-1; i>=0; i --){ if (strrchr("/\\", product_name[i]) != NULL) { clip_dir = 1; break; } } if (clip_dir) { strncpy(out_name, product_name + i + 1, PATH_MAX); out_name[PATH_MAX] = '\0'; } else { strcpy(out_name, product_name); } strcat(out_name, ".tif"); out = TIFFOpen(out_name, "w"); if (out == NULL) { printf("error: failed to create TIFF file '%s'\n", out_name); exit(2); } /* build three layer for the RGB image */ r_raster_layer = make_layer(product_id, r_band_name, width, height, subsampl); if (r_raster_layer == NULL) { printf("error: failed to create R-band from '%s'\n", r_band_name); exit(3); } g_raster_layer = make_layer(product_id, g_band_name, width, height, subsampl); if (g_raster_layer == NULL) { printf("error: failed to create G-band from '%s'\n", g_band_name); exit(3); } b_raster_layer = make_layer(product_id, b_band_name, width, height, subsampl); if (b_raster_layer == NULL) { printf("error: failed to create B-band from '%s'\n", b_band_name); exit(3); } /* Makes settings for the TIFF-image will be created */ scanlineLen = prepare_image_properties(out, (uint32)r_raster_layer->raster_width, (uint32)r_raster_layer->raster_height); /* create RGB image */ buf = (unsigned char*)_TIFFmalloc(scanlineLen); if (buf == NULL) { printf("error: failed to allocate memory: req. size: %u bytes\n", scanlineLen); exit(4); } r_layer = get_raster_minmax(r_raster_layer); g_layer = get_raster_minmax(g_raster_layer); b_layer = get_raster_minmax(b_raster_layer); r_factor = 255.0F / (r_layer.max - r_layer.min); g_factor = 255.0F / (g_layer.max - g_layer.min); b_factor = 255.0F / (b_layer.max - b_layer.min); for (row = 0; row < r_raster_layer->raster_height; row++) { for (col = 0; col < r_raster_layer->raster_width; col++) { r_sample_addr = (float*)r_raster_layer->buffer + r_raster_layer->raster_width * row + col; g_sample_addr = (float*)g_raster_layer->buffer + g_raster_layer->raster_width * row + col; b_sample_addr = (float*)b_raster_layer->buffer + b_raster_layer->raster_width * row + col; buf[col*3 + 0] = (unsigned char)(*r_sample_addr * r_factor); buf[col*3 + 1] = (unsigned char)(*g_sample_addr * g_factor); buf[col*3 + 2] = (unsigned char)(*b_sample_addr * b_factor); } if (TIFFWriteScanline(out, buf, row, 0) < 0) { break; } } TIFFClose(out); printf("info: successfully created image file '%s'\n", out_name); /* releasing & closing */ /* Release the allocated memory for rasters */ epr_free_raster(r_raster_layer); epr_free_raster(g_raster_layer); epr_free_raster(b_raster_layer); /* Close product_id and release rest of the allocated memory */ epr_close_product(product_id); /* Closes product reader API, release all allocated resources */ epr_close_api(); return 0; } /** * Builds the raster for the given dataset name and given product * * @return the instance of the scaned data */ EPR_SRaster* make_layer(EPR_SProductId* product_id, const char* ds_name, uint32 source_w, uint32 source_h, uint32 subsampl) { EPR_SBandId* band_id = NULL; int is_written; EPR_SRaster* raster_buffer = NULL; uint source_step_x, source_step_y; band_id = epr_get_band_id(product_id, ds_name); if (band_id == NULL) { printf("BAND_ID = NULL\n"); return NULL; } /* INCREMENT_X = INCREMENT_Y */ source_step_x = subsampl; source_step_y = subsampl; raster_buffer = epr_create_compatible_raster(band_id, source_w, source_h, source_step_x, source_step_y); /* OFFSET_X = 0; OFFSET_Y = 0; */ is_written = epr_read_band_raster(band_id, 0, 0, raster_buffer); if (is_written != 0) { epr_free_raster(raster_buffer); return NULL; } return raster_buffer; } /** * Findes maximum-minimum values in the given raster * * @return SExtrema-structure */ SExtrema get_raster_minmax (EPR_SRaster* raster) { uint32 i; SExtrema extrema; extrema.max = ((float*)raster->buffer)[0]; extrema.min = ((float*)raster->buffer)[0]; for (i = 0; i < raster->raster_height * raster->raster_width; i++) { if (((float*)raster->buffer)[i] < extrema.min) { extrema.min = ((float*)raster->buffer)[i]; } if (((float*)raster->buffer)[i] > extrema.max) { extrema.max = ((float*)raster->buffer)[i]; } } return extrema; } /** * Makes settings for the TIFF-image will be created * * @return image line property */ uint32 prepare_image_properties(TIFF *out, uint32 width, uint32 height) { int config = PLANARCONFIG_CONTIG; int photometric = PHOTOMETRIC_RGB; TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) height); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); return TIFFScanlineSize(out); } bcdev-epr-api-a922482/src/test/000077500000000000000000000000001142554441000161535ustar00rootroot00000000000000bcdev-epr-api-a922482/src/test/api_unit_tests.c000066400000000000000000001023171142554441000213550ustar00rootroot00000000000000#include #include #include #include #include #include "../epr_api.h" #include "../epr_string.h" #include "../epr_field.h" /*#include "api_unit_tests.h"*/ #if defined(WIN32) && defined(_DEBUG) #include #endif /* if defined(WIN32) && defined(_DEBUG) */ static int num_errors = 0; static int num_failures = 0; static int num_tests = 0; const char* _prefix_in_p_p = "INPUT_PRODUCT_PATH"; const char* _prefix_assert = "assert"; const char* _prefix_product = "product."; const char* _type_ascii_str = "ascii"; const char* _type_int8_str = "int8"; const char* _type_int16_str = "int16"; const char* _type_int32_str = "int32"; const char* _type_uint8_str = "uint8"; const char* _type_uint16_str = "uint16"; const char* _type_uint32_str = "uint32"; const char* _type_float32_str = "float32"; const char* _type_float64_str = "float64"; const char* _type_date_str = "date"; const char* _type_char_str = "char"; const char* _pas_band_ids_length = "band_ids.length"; const char* _pas_dataset_ids_length = "dataset_ids.length"; const char* _pas_dsd_array_length = "dsd_array.length"; const char* _pas_file_path = "file_path"; const char* _pas_id_string = "id_string"; const char* _pas_meris_iodd_version = "meris_iodd_version"; const char* _pas_mph_record_num_fields = "mph_record.num_fields"; const char* _pas_sph_record_num_fields = "sph_record.num_fields"; const char* _pas_param_table_length = "param_table.length"; const char* _pas_record_info_cache_length = "record_info_cache.length"; const char* _pas_scene_height = "scene_height"; const char* _pas_scene_width = "scene_width"; const char* _pas_tot_size = "tot_size"; enum LineTypeID { line_type_syntax_error = -1, line_type_empty = 0, line_type_assert_product = 1, line_type_assert_field = 2, line_type_input_product_path = 3, line_type_comment = 4, line_type_ignored = 5 }; union Value { char c; short s; int i; uchar uc; ushort us; uint ui; float f; double d; char* str; }; struct TestDetail { int type; union Value expected; union Value actual; double precision; }; struct FieldAddress { char* name_rec; char* name_field; unsigned int index_rec; unsigned int index_field; }; typedef struct FieldAddress SFieldAddress; typedef struct TestDetail STestDetail; struct TestLine { int type; int line_no; char* line; char* value_ref; SFieldAddress* field_adress; STestDetail* test_detail; EPR_SProductId* product_id; char* msg; }; typedef struct TestLine STestLine; SFieldAddress* create_field_address(); void free_field_adress(SFieldAddress* fa); STestDetail* create_test_detail(const int type); void free_test_detail(STestDetail* test_detail); STestLine* create_test_line(const char* line, const int line_no); void free_test_line(STestLine* tl); void print_warning_ignored(const int line_no, const char* line); void print_failure_type(const STestLine* test_line, const int actual); void print_syntax_error(const STestLine* test_line); void print_field_adress_error(const STestLine* test_line); void print_error_msg(const int line_no, const char* msg); void print_failure_assert(const STestLine* test_line); void set_expected_and_actual(const STestDetail* test_detail, char* expected, char* actual); epr_boolean parse_index(char* str, int* idx); epr_boolean parse_expected(const char* s, STestDetail* test_detail); char* parse_input_product_path(const char* config_file); const char* get_type_str(const int type); void evaluate_product_assert(STestLine* test_line); void evaluate_field_assert(const STestLine* test_line); void test_api(const char*); int parse_type(const char* s); epr_boolean parse_field_adress(const char* line, SFieldAddress* fa); void parse_test_line(STestLine* test_line); epr_boolean get_field_value(const EPR_SField* field, const uint index, STestDetail* test_detail); epr_boolean starts_with(const char* s, const char* prefix); epr_boolean evaluate_test_detail(const STestDetail* test_detail); epr_boolean evaluate_equal_types(const STestLine* test_line, const int actual); epr_boolean equal_str(const char* expected, const char* actual); epr_boolean equal_f(const float expected, const float actual, const double precision); epr_boolean equal_d(const double expected, const double actual, const double precision); epr_boolean equal_type(const int expected, const int actual); int main(int argc, char** argv) { int i; #if defined(WIN32) && defined(_DEBUG) /* Aktuelles Attribut ermitteln */ int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); /* Speicherverlust-Pr�fbit aktivieren */ tmpFlag |= _CRTDBG_LEAK_CHECK_DF; /* CRT-Block-Pr�fbit deaktivieren */ tmpFlag &= ~_CRTDBG_CHECK_CRT_DF; /* Attribut auf neuen Wert setzen */ _CrtSetDbgFlag(tmpFlag); /*_CrtSetBreakAlloc(4694);*/ #endif /* if defined(WIN32) && defined(_DEBUG) */ /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) */ epr_init_api(e_log_debug, epr_log_message, NULL); for (i = 1; i < argc; i++) { printf("\n"); printf("\n"); test_api(argv[i]); } printf("\n"); printf("\n"); /* Closes product reader API, release all allocated resources */ epr_close_api(); return 0; } void test_api(const char* test_config_file) { FILE* stream; char line[1000]; int line_no; char* input_product_path = NULL; EPR_SProductId* product_id = NULL; STestLine* test_line = NULL; assert(test_config_file != NULL); num_errors = 0; num_failures = 0; num_tests = 0; printf("running tests in %s\n", test_config_file); input_product_path = parse_input_product_path(test_config_file); if (input_product_path != NULL) { product_id = epr_open_product(input_product_path); if (product_id != NULL) { stream = fopen(test_config_file, "r"); if (stream != NULL ) { for (line_no = 1; fgets(line, 1000, stream) != NULL; line_no ++) { epr_trim_string(line); test_line = create_test_line(line, line_no); parse_test_line(test_line); test_line->product_id = product_id; switch (test_line->type) { case line_type_assert_product: evaluate_product_assert(test_line); break; case line_type_assert_field: evaluate_field_assert(test_line); break; case line_type_syntax_error: print_syntax_error(test_line); num_errors++; break; case line_type_comment: case line_type_input_product_path: case line_type_empty: break; case line_type_ignored: default: print_warning_ignored(line_no, line); } free_test_line(test_line); } fclose(stream); } epr_close_product(product_id); printf("test summary for %s:\n", test_config_file); printf(" #tests: %6d\n", num_tests); printf(" #failures: %6d\n", num_failures); printf(" #errors: %6d\n", num_errors); } else { printf("error: failed to open input product\n"); } } else { printf("error: failed to run %s\n", test_config_file); } epr_free_string(input_product_path); } void evaluate_product_assert(STestLine* test_line) { STestDetail* detail = NULL; const char* value_ref = NULL; const EPR_SProductId* product_id = NULL; assert(test_line != NULL); assert(test_line->type == line_type_assert_product); assert(test_line->test_detail != NULL); assert(test_line->value_ref != NULL); assert(test_line->product_id != NULL); detail = test_line->test_detail; value_ref = test_line->value_ref; product_id = test_line->product_id; if (equal_str(value_ref, _pas_band_ids_length)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->band_ids->length; } else if (equal_str(value_ref, _pas_dataset_ids_length)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->dataset_ids->length; } else if (equal_str(value_ref, _pas_dsd_array_length)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->dsd_array->length; } else if (equal_str(value_ref, _pas_file_path)) { if (!evaluate_equal_types(test_line, e_tid_string)) goto failure; detail->actual.str = epr_clone_string(product_id->file_path); } else if (equal_str(value_ref, _pas_id_string)) { if (!evaluate_equal_types(test_line, e_tid_string)) goto failure; detail->actual.str = epr_clone_string(product_id->id_string); } else if (equal_str(value_ref, _pas_meris_iodd_version)) { if (!evaluate_equal_types(test_line, e_tid_int)) goto failure; detail->actual.i = product_id->meris_iodd_version; } else if (equal_str(value_ref, _pas_mph_record_num_fields)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->mph_record->num_fields; } else if (equal_str(value_ref, _pas_param_table_length)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->param_table->length; } else if (equal_str(value_ref, _pas_record_info_cache_length)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->record_info_cache->length; } else if (equal_str(value_ref, _pas_scene_height)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->scene_height; } else if (equal_str(value_ref, _pas_scene_width)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->scene_width; } else if (equal_str(value_ref, _pas_sph_record_num_fields)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->sph_record->num_fields; } else if (equal_str(value_ref, _pas_tot_size)) { if (!evaluate_equal_types(test_line, e_tid_uint)) goto failure; detail->actual.ui = product_id->tot_size; } else { test_line->msg = epr_clone_string("value reference not supported"); print_syntax_error(test_line); goto error; } if (!evaluate_test_detail(detail)) { print_failure_assert(test_line); goto failure; } return; failure: num_failures++; return; error: num_errors++; return; } void evaluate_field_assert(const STestLine* test_line) { SFieldAddress* field_adress = NULL; STestDetail* test_detail = NULL; const EPR_SField* field = NULL; EPR_SDatasetId* dataset_id = NULL; EPR_SRecord* record = NULL; epr_boolean is_mph_or_sph = FALSE; assert(test_line != NULL); assert(test_line->type == line_type_assert_field); assert(test_line->test_detail != NULL); assert(test_line->field_adress != NULL); assert(test_line->product_id != NULL); field_adress = test_line->field_adress; test_detail = test_line->test_detail; if (equal_str(field_adress->name_rec, "mph")) { record = epr_get_mph(test_line->product_id); is_mph_or_sph = TRUE; } else if (equal_str(field_adress->name_rec, "sph")) { record = epr_get_sph(test_line->product_id); is_mph_or_sph = TRUE; } else { dataset_id = epr_get_dataset_id(test_line->product_id, field_adress->name_rec); if (dataset_id == NULL) goto fin_inexistent; record = epr_read_record(dataset_id, field_adress->index_rec, NULL); } if (record == NULL) goto fin_inexistent; field = epr_get_field(record, field_adress->name_field); if (field == NULL) goto fin_inexistent; if (field_adress->index_field >= field->info->num_elems) goto fin_inexistent; if (!evaluate_equal_types(test_line, field->info->data_type_id)) goto failure; if (!get_field_value(field, field_adress->index_field, test_detail)) { print_error_msg(test_line->line_no, "can not get the field value to test"); goto error; } if (evaluate_test_detail(test_detail)) { goto finally; } else { print_failure_assert(test_line); goto failure; } failure: num_failures++; goto finally; fin_inexistent: print_field_adress_error(test_line); error: num_errors++; finally: if (!is_mph_or_sph) { epr_free_record(record); } } epr_boolean get_field_value(const EPR_SField* field, const uint index, STestDetail* test_detail) { char buffer[1000]; EPR_STime* time = NULL; assert(field != NULL); assert(field->info != NULL); assert(index < field->info->num_elems); assert(test_detail != NULL); assert(field->info->data_type_id == test_detail->type); buffer[0] = '\0'; switch (test_detail->type) { case e_tid_string: test_detail->actual.str = epr_clone_string((const char*) field->elems); return TRUE; case e_tid_time: time = (EPR_STime*) field->elems; sprintf(buffer, "d=%d s=%u ms=%u", time->days, time->seconds, time->microseconds); test_detail->actual.str = epr_clone_string(buffer); return TRUE; case e_tid_spare: /*todo*/ return FALSE; case e_tid_uchar: test_detail->actual.uc = ((uchar*) field->elems)[index]; return TRUE; case e_tid_char: test_detail->actual.c = ((char*) field->elems)[index]; return TRUE; case e_tid_ushort: test_detail->actual.us = ((ushort*) field->elems)[index]; return TRUE; case e_tid_short: test_detail->actual.s = ((short*) field->elems)[index]; return TRUE; case e_tid_uint: test_detail->actual.ui = ((uint*) field->elems)[index]; return TRUE; case e_tid_int: test_detail->actual.i = ((int*) field->elems)[index]; return TRUE; case e_tid_float: test_detail->actual.f = ((float*) field->elems)[index]; return TRUE; case e_tid_double: test_detail->actual.d = ((double*) field->elems)[index]; return TRUE; default: return FALSE; } } void parse_test_line(STestLine* test_line) { unsigned int pos_tok = 0; int i = 0; int len = 0; const int num_chars = 4; char* chars[] = {NULL, NULL, NULL, NULL}; SFieldAddress* field_adress = NULL; STestDetail* test_detail = NULL; assert(test_line != NULL); assert(test_line->line != NULL); chars[0] = epr_str_tok(test_line->line, " ", &pos_tok); chars[1] = epr_str_tok(test_line->line, " ", &pos_tok); chars[2] = epr_str_tok(test_line->line, "=", &pos_tok); chars[3] = epr_clone_string(test_line->line + pos_tok); for (i = 0; i < num_chars; i++) { if (chars[i] != NULL) { chars[i] = epr_trim_string(chars[i]); } } if (chars[0] == NULL || strlen(chars[0]) == 0) { test_line->type = line_type_empty; } else if (starts_with(chars[0], "#")) { test_line->type = line_type_comment; } else if (starts_with(chars[0], _prefix_in_p_p)) { test_line->type = line_type_input_product_path; } else if (equal_str(chars[0], _prefix_assert)) { num_tests++; if (chars[1] == NULL || strlen(chars[1]) == 0 || parse_type(chars[1]) == e_tid_unknown) { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("unknown value type"); } else if (chars[2] == NULL || strlen(chars[2]) == 0) { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("empty value reference"); } else if (chars[3] == NULL || strlen(chars[3]) == 0) { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("empty expected value"); } else if(starts_with(chars[2], _prefix_product)) { len = strlen(_prefix_product); for (i = 0; i < len; i++) { chars[2][i] = ' '; } epr_trim_string(chars[2]); if (strlen(chars[2]) == 0) { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("empty value reference"); } else { test_detail = create_test_detail(parse_type(chars[1])); if (parse_expected(chars[3], test_detail)) { test_line->test_detail = test_detail; test_line->type = line_type_assert_product; test_line->value_ref = epr_clone_string(chars[2]); } else { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("unknown expected value"); free_test_detail(test_detail); } } } else { field_adress = create_field_address(chars[2]); if (field_adress != NULL) { test_detail = create_test_detail(parse_type(chars[1])); if (parse_expected(chars[3], test_detail)) { test_line->test_detail = test_detail; test_line->type = line_type_assert_field; test_line->field_adress = field_adress; } else { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("unknown expected value"); free_test_detail(test_detail); } } else { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("can not read field identifier"); free_field_adress(field_adress); } } } else { test_line->type = line_type_syntax_error; test_line->msg = epr_clone_string("arguments not supported"); } for (i = 0; i < num_chars; i++) { epr_free_string(chars[i]); } } char* parse_input_product_path(const char* config_file) { FILE* stream; int ipp_length; char line[400]; char buffer[400]; char* pos_equal_sign; stream = fopen(config_file, "r"); if (stream != NULL ) { ipp_length = strlen(_prefix_in_p_p); while (fgets(line, 400, stream) != NULL) { if (strstr(line, _prefix_in_p_p) == NULL || strcmp(line, strstr(line, _prefix_in_p_p)) != 0) { continue; } pos_equal_sign = strstr(line, "="); if (pos_equal_sign == NULL) { continue; } epr_trim_string(pos_equal_sign); if (strlen(pos_equal_sign) < 2) { continue; } strcpy(buffer, pos_equal_sign + 1); if (strlen(buffer) == 0) { continue; } fclose(stream); printf("using input product %s\n", buffer); return epr_clone_string(buffer); } fclose(stream); printf("error: no input product defined in %s\n", config_file); return NULL; } else { printf("error: failed to open file %s\n", config_file); return NULL; } } STestDetail* create_test_detail(const int type) { STestDetail* test_detail = NULL; test_detail = (STestDetail*) calloc(1, sizeof (STestDetail)); test_detail->type = type; switch (type) { case e_tid_float: test_detail->precision = 10e-6; break; case e_tid_double: test_detail->precision = 10e-10; break; } return test_detail; } void free_test_detail(STestDetail* test_detail) { if (test_detail != NULL) { switch (test_detail->type) { case e_tid_time: case e_tid_spare: case e_tid_string: epr_free_string(test_detail->actual.str); epr_free_string(test_detail->expected.str); break; } free(test_detail); } } SFieldAddress* create_field_address(const char* s) { SFieldAddress* field_adress = NULL; field_adress = (SFieldAddress*) calloc(1, sizeof (SFieldAddress)); if (!parse_field_adress(s, field_adress)) { free_field_adress(field_adress); return NULL; } return field_adress; } void free_field_adress(SFieldAddress* fa) { if (fa != NULL) { epr_free_string(fa->name_field) ; epr_free_string(fa->name_rec); free(fa); } } STestLine* create_test_line(const char* line, const int line_no) { STestLine* test_line = NULL; assert(line != NULL); test_line = (STestLine*) calloc(1, sizeof(STestLine)); test_line->type = line_type_ignored; test_line->line = epr_clone_string(line); test_line->line_no = line_no; return test_line; } void free_test_line(STestLine* test_line) { if (test_line != NULL) { free_field_adress(test_line->field_adress); epr_free_string(test_line->line); free_test_detail(test_line->test_detail); epr_free_string(test_line->value_ref); epr_free_string(test_line->msg); free(test_line); } } epr_boolean starts_with(const char* s, const char* prefix) { assert(s != NULL); assert(prefix != NULL); if (strstr(s, prefix) != NULL && strcmp(strstr(s, prefix), s) == 0) { return TRUE; } return FALSE; } int parse_type(const char* s) { assert(s != NULL); if (equal_str(s, _type_ascii_str)) { return e_tid_string; } else if (equal_str(s, _type_int8_str)) { return e_tid_char; } else if (equal_str(s, _type_int16_str)) { return e_tid_short; } else if (equal_str(s, _type_int32_str)) { return e_tid_int; } else if (equal_str(s, _type_uint8_str)) { return e_tid_uchar; } else if (equal_str(s, _type_uint16_str)) { return e_tid_ushort; } else if (equal_str(s, _type_uint32_str)) { return e_tid_uint; } else if (equal_str(s, _type_float32_str)) { return e_tid_float; } else if (equal_str(s, _type_float64_str)) { return e_tid_double; } else if (equal_str(s, _type_date_str)) { return e_tid_time; } else if (equal_str(s, _type_char_str)) { return e_tid_spare; } else { return e_tid_unknown; } } const char* get_type_str(const int type) { switch (type) { case e_tid_string: return _type_ascii_str; case e_tid_char: return _type_int8_str; case e_tid_short: return _type_int16_str; case e_tid_int: return _type_int32_str; case e_tid_uchar: return _type_uint8_str; case e_tid_ushort: return _type_uint16_str; case e_tid_uint: return _type_uint32_str; case e_tid_float: return _type_float32_str; case e_tid_double: return _type_float64_str; case e_tid_time: return _type_date_str; case e_tid_spare: return _type_char_str; default: return "unknown type"; } } char* parse_string(const char* s) { int len, i; char buffer[1000]; assert(s != NULL); strcpy(buffer, s); epr_trim_string(buffer); len = strlen(buffer); if (len == 0) { return NULL; } else if (len == 1) { if (buffer[0] == '"') buffer[0] = ' '; } else { for (i = 0; i < len; i += len -1) { if (buffer[i] == '"') buffer[i] = ' '; } } epr_trim_string(buffer); if (strlen(buffer) == 0) return NULL; return epr_clone_string(buffer); } epr_boolean is_a_long(const char* s, int base) { char* end_pos = NULL; if (s != NULL && strlen(s) > 0) { strtol(s, &end_pos, base); if (end_pos[0] == '\0') { return TRUE; } } return FALSE; } epr_boolean is_an_ulong(const char* s, int base) { char* end_pos = NULL; if (s != NULL && strlen(s) > 0) { strtoul(s, &end_pos, base); if (end_pos[0] == '\0') { return TRUE; } } return FALSE; } epr_boolean is_a_double(const char* s) { char* end_pos = NULL; if (s != NULL && strlen(s) > 0) { strtod(s, &end_pos); if (end_pos[0] == '\0') { return TRUE; } } return FALSE; } epr_boolean parse_expected(const char* s, STestDetail* test_detail) { assert(s != NULL); assert(test_detail != NULL); switch (test_detail->type) { case e_tid_time: case e_tid_spare: case e_tid_string: test_detail->expected.str = parse_string(s); break; case e_tid_char: if (!is_a_long(s, 10)) return FALSE; test_detail->expected.c = (char) strtol(s, NULL, 10); break; case e_tid_short: if (!is_a_long(s, 10)) return FALSE; test_detail->expected.s = (short) strtol(s, NULL, 10); break; case e_tid_int: if (!is_a_long(s, 10)) return FALSE; test_detail->expected.i = strtol(s, NULL, 10); break; case e_tid_uchar: if (!is_an_ulong(s, 10)) return FALSE; test_detail->expected.uc = (unsigned char) strtoul(s, NULL, 10); break; case e_tid_ushort: if (!is_an_ulong(s, 10)) return FALSE; test_detail->expected.us = (unsigned short) strtoul(s, NULL, 10); break; case e_tid_uint: if (!is_an_ulong(s, 10)) return FALSE; test_detail->expected.ui = strtoul(s, NULL, 10); break; case e_tid_float: if (!is_a_double(s)) return FALSE; test_detail->expected.f = (float) strtod(s, NULL); break; case e_tid_double: if (!is_a_double(s)) return FALSE; test_detail->expected.d = strtod(s, NULL); break; default: return FALSE; } return TRUE; } epr_boolean parse_field_adress(const char* str, SFieldAddress* field_adress) { char* temp = NULL; int pos = 0; epr_boolean result = FALSE; assert(str != NULL); assert(field_adress != NULL); field_adress->name_rec = epr_str_tok(str, ".", &pos); field_adress->name_field = epr_str_tok(str, ".", &pos); temp = epr_str_tok(str, ".", &pos); if (temp != NULL || field_adress->name_rec == NULL || field_adress->name_field == NULL || strstr(field_adress->name_rec, "[") == field_adress->name_rec || strstr(field_adress->name_field, "[") == field_adress->name_field) goto finaly; if (!parse_index(field_adress->name_rec, &field_adress->index_rec)) goto finaly; if (!parse_index(field_adress->name_field, &field_adress->index_field)) goto finaly; result = TRUE; finaly: epr_free_string(temp); return result; } epr_boolean parse_index(char* str, int* idx) { int temp_idx = 0; char* idx_pars_start = NULL; char* idx_pars_end = NULL; if (str == NULL) return FALSE; idx_pars_start = strstr(str, "["); if (idx_pars_start != NULL) { temp_idx = strtol(idx_pars_start + 1, &idx_pars_end, 10); if (!equal_str("]", idx_pars_end)) return FALSE; idx_pars_start[0] = '\0'; } *idx = temp_idx; return TRUE; } epr_boolean evaluate_test_detail(const STestDetail* test_detail) { assert(test_detail != NULL); assert(test_detail->type != e_tid_unknown); switch (test_detail->type) { case e_tid_char: return test_detail->expected.c == test_detail->actual.c ? TRUE: FALSE; case e_tid_short: return test_detail->expected.s == test_detail->actual.s ? TRUE: FALSE; case e_tid_int: return test_detail->expected.i == test_detail->actual.i ? TRUE: FALSE; case e_tid_uchar: return test_detail->expected.uc == test_detail->actual.uc ? TRUE: FALSE; case e_tid_ushort: return test_detail->expected.us == test_detail->actual.us ? TRUE: FALSE; case e_tid_uint: return test_detail->expected.ui == test_detail->actual.ui ? TRUE: FALSE; case e_tid_float: return equal_f(test_detail->expected.f, test_detail->actual.f, test_detail->precision); case e_tid_double: return equal_d(test_detail->expected.d, test_detail->actual.d, test_detail->precision); case e_tid_time: case e_tid_spare: case e_tid_string: return equal_str(test_detail->expected.str, test_detail->actual.str); default: return FALSE; } } epr_boolean equal_str(const char* expected, const char* actual) { return strcmp(expected, actual)== 0? TRUE: FALSE; } epr_boolean equal_l(const long expected, const long actual) { return expected == actual? TRUE: FALSE; } epr_boolean equal_f(const float expected, const float actual, const double precision) { return fabs(expected - actual) < precision ? TRUE: FALSE;; } epr_boolean equal_d(const double expected, const double actual, const double precision) { return fabs(expected - actual) < precision ? TRUE: FALSE;; } epr_boolean equal_type(const int expected, const int actual) { return equal_l(expected, actual); } epr_boolean evaluate_equal_types(const STestLine* test_line, const int actual) { epr_boolean result = FALSE; assert(test_line != NULL); assert(test_line->test_detail != NULL); result = equal_type(test_line->test_detail->type, actual); if (!result) { print_failure_type(test_line, actual); } return result; } void print_warning_ignored(const int line_no, const char* line) { printf("warning: line %d: ignored\n", line_no); /* printf(" %s\n", line); */ } void print_failure_type(const STestLine* test_line, const int actual) { assert(test_line != NULL); assert(test_line->test_detail != NULL); printf("failure: line %d: type assertion failed: expected [%s], but was [%s]\n", test_line->line_no, get_type_str(test_line->test_detail->type), get_type_str(actual)); /* printf(" %s\n", test_line->line);*/ } void print_syntax_error(const STestLine* test_line) { printf("syntax error: line %d: %s\n", test_line->line_no, test_line->msg); /* printf(" %s\n", test_line->line);*/ } void print_error_msg(const int line_no, const char* msg) { assert(msg != NULL); printf("error: line %d: %s\n", line_no, msg); /* printf(" %s\n", test_line->line);*/ } void print_field_adress_error(const STestLine* test_line) { char buffer[500]; SFieldAddress* fa = NULL; assert(test_line != NULL); assert(test_line->field_adress != NULL); fa = test_line->field_adress; buffer[0] = '\0'; sprintf(buffer, "nonexistent field: %s[%d].%s[%d]", fa->name_rec, fa->index_rec, fa->name_field, fa->index_field); print_error_msg(test_line->line_no, buffer); } void print_failure_assert(const STestLine* test_line) { STestDetail* test_detail = NULL; char expected[1000]; char actual[1000]; assert(test_line != NULL); assert(test_line->test_detail != NULL); test_detail = test_line->test_detail; switch (test_detail->type) { case e_tid_string: set_expected_and_actual(test_detail, expected, actual); break; case e_tid_char: sprintf(expected, "%i", test_detail->expected.c); sprintf(actual, "%i", test_detail->actual.c); break; case e_tid_short: sprintf(expected, "%i", test_detail->expected.s); sprintf(actual, "%i", test_detail->actual.s); break; case e_tid_int: sprintf(expected, "%d", test_detail->expected.i); sprintf(actual, "%d", test_detail->actual.i); break; case e_tid_uchar: sprintf(expected, "%u", test_detail->expected.uc); sprintf(actual, "%u", test_detail->actual.uc); break; case e_tid_ushort: sprintf(expected, "%u", test_detail->expected.us); sprintf(actual, "%u", test_detail->actual.us); break; case e_tid_uint: sprintf(expected, "%u", test_detail->expected.ui); sprintf(actual, "%u", test_detail->actual.ui); break; case e_tid_float: sprintf(expected, "%G", test_detail->expected.f); sprintf(actual, "%G", test_detail->actual.f); break; case e_tid_double: sprintf(expected, "%G", test_detail->expected.d); sprintf(actual, "%G", test_detail->actual.d); break; case e_tid_time: set_expected_and_actual(test_detail, expected, actual); break; case e_tid_spare: set_expected_and_actual(test_detail, expected, actual); break; default:; } printf("failure: line %d: assertion failed:\n expected: %s\n but was : %s\n", test_line->line_no, expected, actual); /* printf(" %s\n", test_line->line);*/ } void set_expected_and_actual(const STestDetail* test_detail, char* expected, char* actual) { assert(test_detail != NULL); if (test_detail->expected.str == NULL) { sprintf(expected, "NULL"); } else { sprintf(expected, "%s", test_detail->expected.str); } if (test_detail->actual.str == NULL) { sprintf(actual, "NULL"); } else { sprintf(actual, "%s", test_detail->actual.str); } } bcdev-epr-api-a922482/src/test/epr_main_test.c000066400000000000000000000450531142554441000211570ustar00rootroot00000000000000#include #include #include /* #include */ #include #include #include #include "../epr_api.h" #include "../epr_core.h" #include "../epr_string.h" #include "../epr_ptrarray.h" #include "../epr_swap.h" #include "../epr_field.h" #include "../epr_record.h" #include "../epr_param.h" #include "../epr_dsd.h" #include "../epr_msph.h" #include "../epr_band.h" #include "../epr_bitmask.h" #include "../../bccunit/src/bccunit.h" #if defined(WIN32) && defined(_DEBUG) #include #endif /* if defined(WIN32) && defined(_DEBUG) */ static void loghandler(EPR_ELogLevel log_level, const char* log_message) { } char* init_test_data_path(int argc, char** argv); char ll = e_log_debug; BC_BEGIN_TEST(test_get_element_value) EPR_SProductId* product_id; EPR_SDatasetId* dataset_id = NULL; EPR_SRecord* record = NULL; EPR_SField* field = NULL; epr_init_api(ll, loghandler, NULL); product_id = epr_open_product("testdata\\MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); if (product_id == NULL) BC_ERROR("cannot open product"); dataset_id = epr_get_dataset_id(product_id, "Tie_points_ADS"); BC_ASSERT_NOT_NULL(dataset_id); record = epr_create_record(dataset_id); BC_ASSERT_NOT_NULL(record); record = epr_read_record(dataset_id, 2, record); BC_ASSERT_NOT_NULL(record); BC_ASSERT_NOT_NULL(record->fields); field = record->fields[4]; BC_ASSERT_SAME(182, ((uint*) field->elems)[3]); epr_free_record(record); epr_close_product(product_id); epr_close_api(); BC_END_TEST() void set_up_open_product_test() { epr_init_api(ll, loghandler, NULL); } void tear_down_open_product_test(EPR_SProductId* product_id) { if (product_id != NULL) { epr_close_product(product_id); } epr_close_api(); } EPR_SProductId* test_epr_open_product_with_NULL() { EPR_SProductId* product = NULL; product = epr_open_product(NULL); return product; } EPR_SProductId* test_epr_open_product_with_missing_file() { EPR_SProductId* product_id = NULL; product_id = epr_open_product("D:/sdkjhg.db"); return product_id; } EPR_SProductId* test_epr_open_product_with_bad_api_init_flag() { EPR_SProductId* product_id = NULL; epr_close_api(); product_id = epr_open_product("testdata\\MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); return product_id; } EPR_SProductId* test_epr_open_product_OK() { EPR_SProductId* product_id = NULL; product_id = epr_open_product("testdata\\MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); return product_id; } BC_BEGIN_TEST(test_epr_open_product) EPR_SProductId* product_id = NULL; set_up_open_product_test(); product_id = test_epr_open_product_with_NULL(); BC_ASSERT_NULL(product_id); tear_down_open_product_test(product_id); set_up_open_product_test(); product_id = test_epr_open_product_with_bad_api_init_flag(); BC_ASSERT_NULL(product_id); tear_down_open_product_test(product_id); set_up_open_product_test(); product_id = test_epr_open_product_with_missing_file(); BC_ASSERT_NULL(product_id); tear_down_open_product_test(product_id); set_up_open_product_test(); product_id = test_epr_open_product_OK(); BC_ASSERT_NOT_NULL(product_id); tear_down_open_product_test(product_id); BC_END_TEST() EPR_SDatasetId* test_epr_get_ds_id_without_product_id() { EPR_SDatasetId* dataset_id = NULL; dataset_id = epr_get_dataset_id(NULL, "Tie_points_ADS"); return dataset_id; } EPR_SDatasetId* test_epr_get_ds_id_without_dsn(EPR_SProductId* product_id) { EPR_SDatasetId* dataset_id = NULL; dataset_id = epr_get_dataset_id(product_id, NULL); return dataset_id; } BC_BEGIN_TEST(test_epr_get_dataset_id) EPR_SProductId* product_id = NULL; EPR_SDatasetId* dataset_id = NULL; dataset_id = test_epr_get_ds_id_without_product_id(); BC_ASSERT_NULL(dataset_id); epr_init_api(ll, loghandler, NULL); product_id = epr_open_product("testdata\\MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); if (product_id == NULL) BC_ERROR("cannot open product"); dataset_id = test_epr_get_ds_id_without_dsn(product_id); BC_ASSERT_NULL(dataset_id); epr_close_product(product_id); epr_close_api(); BC_END_TEST() BC_BEGIN_TEST(test_epr_read_record) EPR_SProductId* product_id; EPR_SDatasetId* dataset_id = NULL; EPR_SRecord* record = NULL; epr_init_api(ll, loghandler, NULL); product_id = epr_open_product("testdata\\MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); if (product_id == NULL) { BC_FAIL("cannot open product"); } dataset_id = epr_get_dataset_id(product_id, "Tie_points_ADS"); record = epr_create_record(dataset_id); record = epr_read_record(NULL, 1, record); BC_ASSERT_NULL(record); record = epr_read_record(dataset_id, -1, NULL); BC_ASSERT_NULL(record); record = epr_read_record(dataset_id, dataset_id->dsd->num_dsr + 2, NULL); BC_ASSERT_NULL(record); epr_free_record(record); epr_close_product(product_id); epr_close_api(); BC_END_TEST() BC_BEGIN_TEST(test_epr_get_data_type_size) BC_ASSERT_SAME(1,epr_get_data_type_size(e_tid_uchar)); BC_ASSERT_SAME(1,epr_get_data_type_size(e_tid_char)); BC_ASSERT_SAME(2,epr_get_data_type_size(e_tid_ushort)); BC_ASSERT_SAME(2,epr_get_data_type_size(e_tid_short)); BC_ASSERT_SAME(4,epr_get_data_type_size(e_tid_uint)); BC_ASSERT_SAME(4,epr_get_data_type_size(e_tid_int)); BC_ASSERT_SAME(4,epr_get_data_type_size(e_tid_float)); BC_ASSERT_SAME(8,epr_get_data_type_size(e_tid_double)); BC_ASSERT_SAME(12,epr_get_data_type_size(e_tid_time)); BC_ASSERT_SAME(1,epr_get_data_type_size(e_tid_string)); BC_ASSERT_SAME(0,epr_get_data_type_size(e_tid_unknown)); BC_END_TEST() BC_BEGIN_TEST(test_epr_str_to_data_type_id) BC_ASSERT_SAME(e_tid_uchar, epr_str_to_data_type_id("UChar")); BC_ASSERT_SAME(e_tid_char, epr_str_to_data_type_id("AChar")); BC_ASSERT_SAME(e_tid_spare, epr_str_to_data_type_id("Spare")); BC_ASSERT_SAME(e_tid_ushort, epr_str_to_data_type_id("UShort")); BC_ASSERT_SAME(e_tid_short, epr_str_to_data_type_id("SShort")); BC_ASSERT_SAME(e_tid_uint, epr_str_to_data_type_id("ULong")); BC_ASSERT_SAME(e_tid_int, epr_str_to_data_type_id("SLong")); BC_ASSERT_SAME(e_tid_float, epr_str_to_data_type_id("Float")); BC_ASSERT_SAME(e_tid_double, epr_str_to_data_type_id("Double")); BC_ASSERT_SAME(e_tid_time, epr_str_to_data_type_id("@/types/UTC.dd")); BC_ASSERT_SAME(e_tid_string, epr_str_to_data_type_id("String")); BC_ASSERT_SAME(e_tid_unknown, epr_str_to_data_type_id("any other String")); BC_END_TEST() BC_BEGIN_TEST(test_epr_parse_header) EPR_SRecord* record = NULL; EPR_SField* field; record = epr_parse_header("mph", "NEGATIVE_VALUE=-999999\n"); BC_ASSERT_NOT_NULL(record); field = record->fields[0]; BC_ASSERT_SAME(0, strcmp("NEGATIVE_VALUE",field->info->name)); BC_ASSERT_SAME(-999999, ((int*) field->elems)[0]); record = epr_parse_header("mph", "CLOCK_STEP=+3906250000\n"); BC_ASSERT_NOT_NULL(record); field = record->fields[0]; BC_ASSERT_SAME(0, strcmp("CLOCK_STEP",field->info->name)); BC_ASSERT_SAME(3906250000ul, ((ulong*) field->elems)[0]); record = epr_parse_header("mph", "SMALL_VALUES=+0000000000\n"); BC_ASSERT_NOT_NULL(record); field = record->fields[0]; BC_ASSERT_SAME(0, strcmp("SMALL_VALUES",field->info->name)); BC_ASSERT_SAME(0, ((ulong*) field->elems)[0]); record = epr_parse_header("mph", "FOR_VALUES=+00000000000189633123<10-3nm>\n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_uint,field->info->data_type_id); BC_ASSERT_SAME(4,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("FOR_VALUES",field->info->name)); BC_ASSERT_SAME(0, strcmp("10-3nm",field->info->unit)); BC_ASSERT_SAME(189633123, ((uint*) field->elems)[0]); record = epr_parse_header("mph", "UINT32_VALUES=+000000000004294967295\n"); BC_ASSERT_NOT_NULL(record); field = record->fields[0]; BC_ASSERT_SAME(0, strcmp("UINT32_VALUES",field->info->name)); BC_ASSERT_SAME(4294967295ul, ((ulong*) field->elems)[0]); record = epr_parse_header("mph", "UINT32_VALUES=-000002147483647\n"); BC_ASSERT_NOT_NULL(record); field = record->fields[0]; BC_ASSERT_SAME(e_tid_int,field->info->data_type_id); BC_ASSERT_SAME(0, strcmp("UINT32_VALUES",field->info->name)); BC_ASSERT_SAME(-2147483647L, ((int*) field->elems)[0]); record = epr_parse_header("mph", "Z_Velocity=-7377.4210000\n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_double,field->info->data_type_id); BC_ASSERT_SAME(8,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("Z_Velocity",field->info->name)); BC_ASSERT_SAME(0, strcmp("m/s",field->info->unit)); BC_ASSERT_SAME(-7377.421, ((double*) field->elems)[0]); record = epr_parse_header("mph", "STATE_VECTOR_TIME=\"20-JUN-2000 10:06:52.269120\"\n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_string,field->info->data_type_id); BC_ASSERT_SAME(27,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("STATE_VECTOR_TIME",field->info->name)); BC_ASSERT_SAME(NULL,field->info->unit); BC_ASSERT_SAME(0, strcmp("20-JUN-2000 10:06:52.269120", (char*) field->elems)); record = epr_parse_header("mph", "BAND_WAVELEN=+0000412500+0000442500+0000490000+0000510000+0000560000+0000620000+0000665000+0000681250+0000705000+0000753750+0000760625+0000775000+0000865000+0000885000+0000900000<10-3nm>\n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(15,field->info->num_elems); BC_ASSERT_SAME(e_tid_uint,field->info->data_type_id); BC_ASSERT_SAME(60,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("BAND_WAVELEN",field->info->name)); BC_ASSERT_SAME(0, strcmp("10-3nm",field->info->unit)); BC_ASSERT_SAME(412500, ((uint*) field->elems)[0]); BC_ASSERT_SAME(442500, ((uint*) field->elems)[1]); BC_ASSERT_SAME(490000, ((uint*) field->elems)[2]); BC_ASSERT_SAME(665000, ((uint*) field->elems)[6]); BC_ASSERT_SAME(760625, ((uint*) field->elems)[10]); BC_ASSERT_SAME(865000, ((uint*) field->elems)[12]); BC_ASSERT_SAME(900000, ((uint*) field->elems)[14]); record = epr_parse_header("mph", "FOR_VALUES=+0049633000-4963300100-0049633002<10-3nm>\n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(3,field->info->num_elems); BC_ASSERT_SAME(0, strcmp("FOR_VALUES",field->info->name)); BC_ASSERT_SAME(0, strcmp("10-3nm",field->info->unit)); BC_ASSERT_SAME(e_tid_int,field->info->data_type_id); BC_ASSERT_SAME(49633000, ((uint*) field->elems)[0]); BC_ASSERT_NOT_SAME(-4963300100, ((uint*) field->elems)[1]); BC_ASSERT_SAME(-49633002, ((uint*) field->elems)[2]); BC_ASSERT_SAME(12,record->info->tot_size); record = epr_parse_header("mph", "DS_TYPE=A\nNUM_DSR=+00000036 \n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(2,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_uchar,field->info->data_type_id); BC_ASSERT_SAME(1, field->info->tot_size); BC_ASSERT_SAME(0, strcmp("DS_TYPE",field->info->name)); BC_ASSERT_SAME(NULL,field->info->unit); BC_ASSERT_SAME('A', ((uchar*) field->elems)[0]); field = record->fields[1]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_uint,field->info->data_type_id); BC_ASSERT_SAME(4, field->info->tot_size); BC_ASSERT_SAME(0, strcmp("NUM_DSR",field->info->name)); BC_ASSERT_SAME(NULL, field->info->unit); BC_ASSERT_SAME(36,((uint*) field->elems)[0]); BC_ASSERT_SAME(5,record->info->tot_size); record = epr_parse_header("mph", "=\"20-JUN-2000\""); BC_ASSERT_NULL(record); record = epr_parse_header("mph", "20-JUN-2000"); BC_ASSERT_NULL(record); record = epr_parse_header("mph", "X-Achse="); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_uchar,field->info->data_type_id); BC_ASSERT_SAME(0,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("X-Achse",field->info->name)); record = epr_parse_header("mph", "X-Achse=XY"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_int,field->info->data_type_id); BC_ASSERT_SAME(4,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("X-Achse",field->info->name)); record = epr_parse_header("mph", "Y=+0+"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_uint,field->info->data_type_id); BC_ASSERT_SAME(4,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("Y",field->info->name)); BC_ASSERT_SAME(NULL,field->info->unit); BC_ASSERT_SAME(0, ((uint*) field->elems)[0]); record = epr_parse_header("mph", "X-Achse=+23-4XY"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(2,field->info->num_elems); BC_ASSERT_SAME(e_tid_int,field->info->data_type_id); BC_ASSERT_SAME(8,record->info->tot_size); BC_ASSERT_SAME(23, ((int*) field->elems)[0]); record = epr_parse_header("mph", "X=+ 23-4"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(1,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(2,field->info->num_elems); BC_ASSERT_SAME(e_tid_int,field->info->data_type_id); BC_ASSERT_SAME(8,record->info->tot_size); BC_ASSERT_SAME(0, strcmp("X",field->info->name)); record = epr_parse_header("mph", "PRODUCT=\"MER_FR__2PTACR20000620_104323_00000099X000_00000_00000_0000.N1\"\nPROC_STAGE=T\nREF_DOC=\"PO-RS-MDA-GS-2009_3/B \"\n \nACQUISITION_STATION=\"ENVISAT SampleData#3\"\nPROC_TIME=\"22-FEB-2000 19:41:46.000000\"\n \nPHASE=X\nREL_ORBIT=+00000\nDELTA_UT1=+.000000\nX_POSITION=-7162215.231\nVECTOR_SOURCE=\"00\"\nBANDWIDTH=+10001+10002+10003+10004+10005+10006<10-3nm>\nINST_FOV=+0000019151<10-6deg>\n"); BC_ASSERT_NOT_NULL(record); BC_ASSERT_SAME(12,record->num_fields); field = record->fields[0]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_string,field->info->data_type_id); BC_ASSERT_SAME(62,field->info->tot_size); BC_ASSERT_SAME(0, strcmp("PRODUCT",field->info->name)); field = record->fields[5]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(e_tid_uchar,field->info->data_type_id); BC_ASSERT_SAME(1,field->info->tot_size); BC_ASSERT_SAME(0, strcmp("PHASE",field->info->name)); BC_ASSERT_SAME('X', ((uchar*) field->elems)[0]); field = record->fields[8]; BC_ASSERT_SAME(1,field->info->num_elems); BC_ASSERT_SAME(8,field->info->tot_size); BC_ASSERT_SAME(0, strcmp("X_POSITION",field->info->name)); BC_ASSERT_SAME(0, strcmp("m",field->info->unit)); BC_ASSERT_SAME(e_tid_double,field->info->data_type_id); BC_ASSERT_SAME(-7162215.231, ((double*) field->elems)[0]); field = record->fields[10]; BC_ASSERT_SAME(6,field->info->num_elems); BC_ASSERT_SAME(24,field->info->tot_size); BC_ASSERT_SAME(0, strcmp("BANDWIDTH",field->info->name)); BC_ASSERT_SAME(0, strcmp("10-3nm",field->info->unit)); BC_ASSERT_SAME(e_tid_uint,field->info->data_type_id); BC_ASSERT_SAME(10001, ((uint*) field->elems)[0]); BC_ASSERT_SAME(10002, ((uint*) field->elems)[1]); BC_ASSERT_SAME(10003, ((uint*) field->elems)[2]); epr_free_record(record); BC_END_TEST() BC_BEGIN_TEST(test_epr_parse_band) EPR_SProductId* product_id = NULL; EPR_SBandId* band_id = NULL; epr_init_api(ll, epr_log_message, NULL); product_id = epr_open_product("testdata/MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); band_id = epr_get_band_id(product_id, "kapusta"); BC_ASSERT_NULL(band_id); BC_ASSERT_SAME(0.0, epr_interpolate2D(0.0, 0.0, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(0.5, epr_interpolate2D(0.5, 0.0, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(1.0, epr_interpolate2D(1.0, 0.0, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(0.5, epr_interpolate2D(0.0, 0.5, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(1.0, epr_interpolate2D(0.5, 0.5, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(1.5, epr_interpolate2D(1.0, 0.5, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(1.0, epr_interpolate2D(0.0, 1.0, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(1.5, epr_interpolate2D(0.5, 1.0, 0.0, 1.0, 1.0, 2.0)); BC_ASSERT_SAME(2.0, epr_interpolate2D(1.0, 1.0, 0.0, 1.0, 1.0, 2.0)); BC_END_TEST() BC_BEGIN_TEST(test_tie_points_ADS_4_4) epr_init_api(ll, loghandler, NULL); EPR_SProductId* product_id = epr_open_product("testdata/MER_RR__2PNMAP20080412_084905_000002422067_00365_31982_0001.N1"); EPR_SDatasetId* dataset_id = epr_get_dataset_id(product_id, "Tie_points_ADS"); EPR_SRecord* record = epr_create_record(dataset_id); record = epr_read_record(dataset_id, 2, record); EPR_SField* field = record->fields[4]; BC_ASSERT_SAME(182,((uint*) field->elems)[3]); epr_close_product(product_id); epr_close_api(); BC_END_TEST() int main(int argc, char** argv) { if (argc == 2 && epr_equal_names("nodebug", argv[1])) { ll = e_log_error; } BcTestSuite main_test_suite; BcTestSuite test_suite_epr_api; BcTestSuite test_suite_epr_core; BcTestSuite test_suite_epr_band; BcTestSuite test_suite_epr_header; BcTestResult result; main_test_suite = bc_create_test_suite("main_test_suite"); test_suite_epr_api = bc_create_test_suite("test_suite_epr_api"); bc_add_test_case(test_suite_epr_api,"test_get_element_value",test_get_element_value); bc_add_test_case(test_suite_epr_api,"test_epr_open_product",test_epr_open_product); bc_add_test_case(test_suite_epr_api,"test_epr_get_dataset_id",test_epr_get_dataset_id); bc_add_test_case(test_suite_epr_api,"test_epr_read_record",test_epr_read_record); bc_add_test_case(test_suite_epr_api,"test_tie_points_ADS_4_4",test_tie_points_ADS_4_4); test_suite_epr_core = bc_create_test_suite("test_suite_epr_core"); bc_add_test_case(test_suite_epr_core,"test_epr_get_data_type_size",test_epr_get_data_type_size); bc_add_test_case(test_suite_epr_core,"test_epr_str_to_data_type_id", test_epr_str_to_data_type_id); test_suite_epr_header = bc_create_test_suite("test_suite_epr_header"); bc_add_test_case(test_suite_epr_header,"test_epr_parse_header", test_epr_parse_header); test_suite_epr_band = bc_create_test_suite("test_suite_epr_band"); bc_add_test_case(test_suite_epr_band,"test_epr_parse_band", test_epr_parse_band); bc_add_test(main_test_suite,test_suite_epr_api); bc_add_test(main_test_suite,test_suite_epr_core); bc_add_test(main_test_suite,test_suite_epr_band); bc_add_test(main_test_suite,test_suite_epr_header); bc_run_test(main_test_suite, &result); return 0; } bcdev-epr-api-a922482/src/test/epr_subset_test.c000066400000000000000000000154421142554441000215370ustar00rootroot00000000000000#include #include #include #include #include #include #include "../epr_api.h" #define EPR_RAW_NAME "epr_subset_test" #define EPR_RAW_VERSION "1.0" #if defined(WIN32) && defined(_DEBUG) #include #endif /* if defined(WIN32) && defined(_DEBUG) */ /* HELPER STRUCTURES */ typedef struct Extrema { float min; float max; } SExtrema; #ifdef _MAX_PATH #define PATH_MAX _MAX_PATH #else #define PATH_MAX 1023 #endif /* HELPER FUNCTIONS */ EPR_SRaster* make_layer(EPR_SProductId* product_id, const char* ds_name, uint source_w, uint source_h, uint subsampl); SExtrema get_raster_minmax(EPR_SRaster* raster); void printVersion() { printf("%s, version %s (c) by Brockmann Consult\n", EPR_RAW_NAME, EPR_RAW_VERSION); } void printUsage() { printf("usage: %s []\n", EPR_RAW_NAME); } /** * * Call: epr_asar_test * * [] * * Example: * * epr_asar_test * "D:/ENVISAT/data/ASAR/ASA_IMG_1PXPDE20020730_095910_000000162008_00108_02166_0007.N1" * "proc_data" * "10" * * relevant parameters for corresponding products: * * ASA_IMG_1P - "proc_data" * ASA_IMP_1P - "proc_data" * ASA_IM__BP - "proc_data" * ASA_IMM_1P - "img_mod" * ASA_IMS_1P - "i" or "q" * ASA_APG_1P - "proc_data_1" or "proc_data_2" * ASA_APP_1P - "proc_data_1" or "proc_data_2" * ASA_APM_1P - "proc_data_1" or "proc_data_2" * ASA_AP__BP - "proc_data" * ASA_APS_1P - "i" or "q" * ASA_WSM_1P - "proc_data" * ASA_WS__BP - "proc_data" * * ATS_TOA_1P - "reflec_nadir_0870" * * MER_RR__1P - "Radiance_13" * */ /** Other allowed parameter * * "D:/ENVISAT/data/ASAR/ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1" * "proc_data" * 1 * * "D:\ENVISAT\data\MERIS\L2\MER_RR__2PNPDK20021109_095038_000002702011_00065_03626_0219.N1" * "reflec_1" * 10 * * "d:/ENVISAT/data/MERIS/L1b/MER_RR__1PNPDK20021211_115901_000002702012_00023_04085_0133.N1" "latitude" 1 */ int main(int argc, char** argv) { EPR_SProductId* product_id; EPR_SRaster* raster_layer = NULL; const char* product_name = NULL; const char* band_name = NULL; uint subsampl = 1; int clip_dir = 0; int i; char out_name[PATH_MAX+1]; uint width; uint height; SExtrema band_layer; float band_factor; FILE *out_stream; uint numwritten; uint col; uint row; unsigned char* buf = NULL; float* sample_addr = NULL; printVersion(); if (argc < 3) { printUsage(); exit(-1); } product_name = argv[1]; band_name = argv[2]; if (argc == 4) { /* manage the image size */ subsampl = atoi(argv[3]); } /* Initialize the API. Set log-level to DEBUG and use default log-output (stdout) */ epr_init_api(e_log_debug, epr_log_message, NULL); /* Open the product; an argument is a path to product data file */ product_id = epr_open_product(product_name); if (product_id == NULL) { printf("error: failed to open product '%s'\n", product_name); printf(" extended message: %s\n", epr_get_last_err_message()); exit(1); } width = (uint) epr_get_scene_width(product_id); height = (uint)epr_get_scene_height(product_id); printf("info: scene raster height: %u\n", height); printf("info: scene raster width: %u\n", width); if (subsampl > width){ printf("warning: subsampling too large; changed to %u\n", width); subsampl = width; } /* construct output image name */ clip_dir = 0; for (i = strlen(product_name)-1; i>=0; i --){ if (strrchr("/\\", product_name[i]) != NULL) { clip_dir = 1; break; } } if (clip_dir) { strncpy(out_name, product_name + i + 1, PATH_MAX); out_name[strlen(out_name)-2] = '\0'; } else { strcpy(out_name, product_name); } strcat(out_name, "raw"); /* build layer for the 'raw' image */ raster_layer = make_layer(product_id, band_name, width, height, subsampl); if (raster_layer == NULL) { printf("error: failed to create band from '%s'\n", band_name); exit(3); } band_layer = get_raster_minmax(raster_layer); band_factor = 255.0F / (band_layer.max - band_layer.min); buf = (unsigned char*)malloc(raster_layer->raster_width); if (buf == NULL) { printf("error: failed to allocate memory: req. size: %d bytes\n", width); exit(4); } out_stream = fopen (out_name, "wb"); for (row = 0; row < raster_layer->raster_height; row++) { for (col = 0; col < raster_layer->raster_width; col++) { sample_addr = (float*)raster_layer->buffer + raster_layer->raster_width * row + col; buf[col] = (unsigned char)(*sample_addr * band_factor); } numwritten = fwrite((unsigned char*)buf, sizeof (uchar), raster_layer->raster_width, out_stream); if (numwritten != raster_layer->raster_width) { printf("epr_make_image: file write failed\n"); break; } } fclose(out_stream); epr_close_product(product_id); epr_close_api(); return 0; } /** * Builds the raster for the given dataset name and given product * * @return the instance of the scaned data */ EPR_SRaster* make_layer(EPR_SProductId* product_id, const char* ds_name, uint source_w, uint source_h, uint subsampl) { EPR_SBandId* band_id = NULL; int is_written; EPR_SRaster* raster_buffer = NULL; uint source_step_x, source_step_y; band_id = epr_get_band_id(product_id, ds_name); if (band_id == NULL) { printf("BAND_ID = NULL\n"); return NULL; } /* INCREMENT_X = INCREMENT_Y */ source_step_x = subsampl; source_step_y = subsampl; raster_buffer = epr_create_compatible_raster(band_id, source_w, source_h, source_step_x, source_step_y); /* OFFSET_X = 0; OFFSET_Y = 0; */ is_written = epr_read_band_raster(band_id, 0, 0, raster_buffer); if (is_written != 0) { epr_free_raster(raster_buffer); return NULL; } return raster_buffer; } /** * Findes maximum-minimum values in the given raster * * @return SExtrema-structure */ SExtrema get_raster_minmax (EPR_SRaster* raster) { uint i; SExtrema extrema; extrema.max = ((float*)raster->buffer)[0]; extrema.min = ((float*)raster->buffer)[0]; for (i = 0; i < raster->raster_height * raster->raster_width; i++) { if (((float*)raster->buffer)[i] < extrema.min) { extrema.min = ((float*)raster->buffer)[i]; } if (((float*)raster->buffer)[i] > extrema.max) { extrema.max = ((float*)raster->buffer)[i]; } } return extrema; } bcdev-epr-api-a922482/src/test/epr_test_endian.c000066400000000000000000000017421142554441000214660ustar00rootroot00000000000000#include #include "../epr_api.h" #define BE_MAGIC_NUMBER 1162761801UL #define LE_MAGIC_NUMBER 1230392901UL #define LE_MAGIC_BYTE_0 'E' #define LE_MAGIC_BYTE_1 'N' #define LE_MAGIC_BYTE_2 'V' #define LE_MAGIC_BYTE_3 'I' int epr_is_little_endian_order() { ulong le_value = LE_MAGIC_NUMBER; return (((uchar*)(&le_value))[0] == LE_MAGIC_BYTE_0) && (((uchar*)(&le_value))[1] == LE_MAGIC_BYTE_1) && (((uchar*)(&le_value))[2] == LE_MAGIC_BYTE_2) && (((uchar*)(&le_value))[3] == LE_MAGIC_BYTE_3); } int epr_is_big_endian_order() { ulong be_value = BE_MAGIC_NUMBER; return (((uchar*)(&be_value))[0] == LE_MAGIC_BYTE_0) && (((uchar*)(&be_value))[1] == LE_MAGIC_BYTE_1) && (((uchar*)(&be_value))[2] == LE_MAGIC_BYTE_2) && (((uchar*)(&be_value))[3] == LE_MAGIC_BYTE_3); } int main(int argc, char** argv) { if (epr_is_little_endian_order()) { printf("LE\n"); } else if (epr_is_big_endian_order()) { printf("BE\n"); } else { printf("?\n"); } return 0; } bcdev-epr-api-a922482/src/utils/000077500000000000000000000000001142554441000163345ustar00rootroot00000000000000bcdev-epr-api-a922482/src/utils/swpeo.c000066400000000000000000000055161142554441000176440ustar00rootroot00000000000000#include #include #define ARG_ERROR 1 #define ELEMSIZE_ERROR 2 #define FILESIZE_ERROR 3 #define SETPOS_ERROR 4 #define WRITE_ERROR 5 #define READ_ERROR 6 #define OPEN_ERROR 7 void printUsage(); void error(int errno, const char* message); int checkCorrectElemSize(int size); int swapBytes(FILE *file, int filesize, int typesize); /** * swpeo: "Swap Endian Order": Utility to swap the endian order of given files * Usage: swpeo ... */ int main(int argc, char** argv) { const char* filePath; int fileSize; int modulo; int swapStatus = 0; FILE *file; int elemSize = 4; char message[1024]; int i; if (argc < 2) { printUsage(); return ARG_ERROR; } elemSize = atoi(argv[1]); if (checkCorrectElemSize(elemSize) == -1) { error(ELEMSIZE_ERROR, "element size must be 2, 4 or 8"); } for (i = 2; i < argc; i++) { filePath = argv[i]; file = fopen(filePath, "rb+"); if (file == NULL) { sprintf(message, "failed to open file '%s'", filePath); error(OPEN_ERROR, message); } fileSize = fseek(file, 0, SEEK_END); fileSize = ftell(file); modulo = fileSize % elemSize; if (modulo != 0) { sprintf(message, "file '%s': file size (%d) modulo element size (%d) should be zero, but was %d", filePath, fileSize, elemSize, modulo); error(FILESIZE_ERROR, message); } swapStatus = swapBytes(file, fileSize, elemSize); if (swapStatus != 0) { sprintf(message, "file '%s': I/O error", filePath); error(swapStatus, message); } fclose(file); } return swapStatus; } void printUsage() { fprintf(stdout, "Usage: swpeo ...\n"); } void error(int errno, const char* message) { fprintf(stderr, "Error: %s", message); exit(errno); } void warn(const char* message) { fprintf(stderr, "Warning: %s", message); } int checkCorrectElemSize(int elemSize) { if (elemSize == 2 || elemSize == 4 || elemSize == 8) { return 0; } return -1; } int swapBytes(FILE *file, int fileSize, int elemSize) { long i, numItems, swaps; char buffer[8], a; fpos_t pos = 0; int numSwaps = fileSize / elemSize; for (swaps = 0; swaps < numSwaps; swaps++) { if (fsetpos(file, &pos) != 0) { return SETPOS_ERROR; } numItems = fread(buffer, elemSize, 1, file); if (numItems != 1) { return READ_ERROR; } for (i = 0; i < elemSize / 2; i++) { a = buffer[i]; buffer[i] = buffer[elemSize -1 -i]; buffer[elemSize - 1 - i] = a; } if (fsetpos(file, &pos) != 0) { return SETPOS_ERROR; } numItems = fwrite(buffer, elemSize, 1, file); if (numItems != 1) { return WRITE_ERROR; } fflush(file); pos += elemSize; } return 0; } bcdev-epr-api-a922482/src/utils/test.txt000066400000000000000000000001011142554441000200440ustar00rootroot000000000000001234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef bcdev-epr-api-a922482/test-L1.cfg000066400000000000000000000000001142554441000163050ustar00rootroot00000000000000bcdev-epr-api-a922482/test-L2.cfg000066400000000000000000000000001142554441000163060ustar00rootroot00000000000000bcdev-epr-api-a922482/test-eoli.cfg000066400000000000000000000000001142554441000167610ustar00rootroot00000000000000bcdev-epr-api-a922482/test-iraq.cfg000066400000000000000000000000001142554441000167650ustar00rootroot00000000000000