From cda23d690b55db7391b2b56721b08e319d729fbe Mon Sep 17 00:00:00 2001 From: Amy Stamile <74275278+amystamile-usgs@users.noreply.github.com> Date: Thu, 31 Oct 2024 10:54:01 -0700 Subject: [PATCH] Adds archive information to chandrayaan2 template (#5651) * Adds chandrayaan2 to isisimport * Adds archive info to chandrayaan2 * fixes to template * removed debugging from tests * remove xmltojson changes * small fixes --- isis/appdata/import/PDS4/Chandrayaan2TMC2.tpl | 33 +++- isis/appdata/import/fileTemplate.tpl | 2 +- isis/src/base/apps/isisimport/isisimport.cpp | 12 -- isis/src/base/objs/XmlToJson/XmlToJson.cpp | 3 +- .../FunctionalTestsIsisImportChandrayaan2.cpp | 170 +++++++++++++++++- isis/tests/XmlToJsonTests.cpp | 1 + ..._tmc_ncn_20240808T0532596974_d_img_d18.xml | 141 +++++++++++++++ 7 files changed, 344 insertions(+), 18 deletions(-) create mode 100644 isis/tests/data/isisimport/chan2/ch2_tmc_ncn_20240808T0532596974_d_img_d18.xml diff --git a/isis/appdata/import/PDS4/Chandrayaan2TMC2.tpl b/isis/appdata/import/PDS4/Chandrayaan2TMC2.tpl index dd05ce68a7..102a7faca9 100644 --- a/isis/appdata/import/PDS4/Chandrayaan2TMC2.tpl +++ b/isis/appdata/import/PDS4/Chandrayaan2TMC2.tpl @@ -1,5 +1,5 @@ {% set file_name = Product_Observational.File_Area_Observational.File.file_name %} -{% set sensor = FindCH2Sensor(file_name) %} +{% set sensor = CharAt(file_name, 10) %} {% set ImageArray = Product_Observational.File_Area_Observational.Array_2D_Image %} @@ -67,7 +67,7 @@ Object = IsisCube End_Object Group = Instrument - SpacecraftName = {{ Product_Observational.Observation_Area.Investigation_Area.name }} + SpacecraftName = {{ capitalize(Product_Observational.Observation_Area.Investigation_Area.name) }} {% set inst_name = Product_Observational.Observation_Area.Observing_System.Observing_System_Component.1.name %} {% if inst_name == "terrain mapping camera" %} InstrumentId = TMC-2 @@ -75,7 +75,36 @@ Object = IsisCube TargetName = {{ Product_Observational.Observation_Area.Target_Identification.name }} StartTime = {{ RemoveStartTimeZ(Product_Observational.Observation_Area.Time_Coordinates.start_date_time) }} StopTime = {{ RemoveStartTimeZ(Product_Observational.Observation_Area.Time_Coordinates.stop_date_time) }} + {% if exists("Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_line_exposure_duration") %} + LineExposureDuration = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_line_exposure_duration._text }} <ms> + {% else %} + LineExposureDuration = 3.236 <ms> + {% endif %} + End_Group + + {% if exists("Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters") %} + Group = Archive + JobId = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_job_id }} + OrbitNumber = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_imaging_orbit_number }} + GainType = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_gain }} + ExposureType = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_exposure }} + DetectorPixelWidth = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_detector_pixel_width._text }} <micrometers> + FocalLength = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_focal_length._text }} <mm> + ReferenceData = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_reference_data_used }} + OrbitLimbDirection = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_orbit_limb_direction }} + SpacecraftYawDirection = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_spacecraft_yaw_direction }} + SpacecraftAltitude = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_spacecraft_altitude._text }} <km> + PixelResolution = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_pixel_resolution._text }} <meters/pixel> + Roll = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_roll._text }} <degrees> + Pitch = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_pitch._text }} <degrees> + Yaw = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_yaw._text }} <degrees> + SunAzimuth = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_sun_azimuth._text }} <degrees> + SunElevation = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_sun_elevation._text }} <degrees> + SolarIncidence = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_solar_incidence._text }} <degrees> + Projection = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_projection }} + Area = {{ Product_Observational.Observation_Area.Mission_Area.isda_Product_Parameters.isda_area }} End_Group + {% endif %} Group = BandBin Center = 675 diff --git a/isis/appdata/import/fileTemplate.tpl b/isis/appdata/import/fileTemplate.tpl index 61db724210..6137b41300 100644 --- a/isis/appdata/import/fileTemplate.tpl +++ b/isis/appdata/import/fileTemplate.tpl @@ -93,7 +93,7 @@ {%- if InstrumentId == "OSINAC" or InstrumentId == "OSIWAC"-%} {%- set InstrumentId="Osiris" -%} {%- endif -%} -{%- else if SpacecraftName == "Chandrayaan-2"-%} +{%- else if SpacecraftName == "Chandrayaan-2" or SpacecraftName == "chandrayaan-2"-%} {%- set SpacecraftId="Chandrayaan2" -%} {%- if InstrumentId == "terrain mapping camera"-%} {%- set InstrumentId="TMC2" -%} diff --git a/isis/src/base/apps/isisimport/isisimport.cpp b/isis/src/base/apps/isisimport/isisimport.cpp index 71f20d1b05..2c6f2bfb60 100644 --- a/isis/src/base/apps/isisimport/isisimport.cpp +++ b/isis/src/base/apps/isisimport/isisimport.cpp @@ -341,18 +341,6 @@ namespace Isis { return inputString.substr(index, 1); }); - - - /** - * Find sensor type from Chandrayaan2 label's file_name - */ - env.add_callback("FindCH2Sensor", 1, [](Arguments& args) { - std::string fileName = args.at(0)->get<string>(); - - char sensor = fileName[10]; - - return std::string(1, sensor); - }); // end of inja callbacks diff --git a/isis/src/base/objs/XmlToJson/XmlToJson.cpp b/isis/src/base/objs/XmlToJson/XmlToJson.cpp index 88471305be..f41bc9afc1 100644 --- a/isis/src/base/objs/XmlToJson/XmlToJson.cpp +++ b/isis/src/base/objs/XmlToJson/XmlToJson.cpp @@ -207,5 +207,4 @@ namespace Isis { } return output; } -} - +} \ No newline at end of file diff --git a/isis/tests/FunctionalTestsIsisImportChandrayaan2.cpp b/isis/tests/FunctionalTestsIsisImportChandrayaan2.cpp index b95d506d43..26f6cb34e5 100644 --- a/isis/tests/FunctionalTestsIsisImportChandrayaan2.cpp +++ b/isis/tests/FunctionalTestsIsisImportChandrayaan2.cpp @@ -28,7 +28,7 @@ using json = nlohmann::json; static QString APP_XML = FileName("$ISISROOT/bin/xml/isisimport.xml").expanded(); -TEST_F(TempTestingFiles, FunctionalTestIsisImportChandrayaan2){ +TEST_F(TempTestingFiles, FunctionalTestIsisImportChandrayaan2MinimalLabel){ std::istringstream PvlInput(R"( Object = IsisCube Object = Core @@ -57,6 +57,7 @@ TEST_F(TempTestingFiles, FunctionalTestIsisImportChandrayaan2){ TargetName = Moon StartTime = 2019-11-28T00:35:38.9755 StopTime = 2019-11-28T00:45:17.9161 + LineExposureDuration = 3.236 <ms> End_Group Group = BandBin @@ -172,4 +173,171 @@ TEST_F(TempTestingFiles, FunctionalTestIsisImportChandrayaan2){ outGroup = outLabel->findGroup("Kernels", Pvl::Traverse); EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); +} + +TEST_F(TempTestingFiles, FunctionalTestIsisImportChandrayaan2FullLabel){ + std::istringstream PvlInput(R"( + Object = IsisCube + Object = Core + StartByte = 65537 + Format = Tile + TileSamples = 519 + TileLines = 1000 + + Group = Dimensions + Samples = 180093 + Lines = 4000 + Bands = 1 + End_Group + + Group = Pixels + Type = UnsignedWord + ByteOrder = Lsb + Base = 0.0 + Multiplier = 1.0 + End_Group + End_Object + + Group = Instrument + SpacecraftName = Chandrayaan-2 + InstrumentId = TMC-2 + TargetName = Moon + StartTime = 2024-08-08T05:32:59.6974 + StopTime = 2024-08-08T05:42:42.4783 + LineExposureDuration = 3.236 <ms> + End_Group + + Group = Archive + JobId = TMCXXD18CHO2210300NNNN24221055326097_V2_1 + OrbitNumber = 22103 + GainType = g1 + ExposureType = e1 + DetectorPixelWidth = 7 <micrometers> + FocalLength = 140 <mm> + ReferenceData = SELENE + OrbitLimbDirection = Descending + SpacecraftYawDirection = False + SpacecraftAltitude = 89.53 <km> + PixelResolution = 4.48 <meters/pixel> + Roll = 0.009365 <degrees> + Pitch = 0.066417 <degrees> + Yaw = -0.017284 <degrees> + SunAzimuth = 116.737463 <degrees> + SunElevation = 39.932493 <degrees> + SolarIncidence = 50.067507 <degrees> + Projection = Selenographic + Area = Equatorial + End_Group + + Group = BandBin + Center = 675 + Width = 175 + End_Group + + Group = Kernels + NaifFrameCode = -152210 + End_Group + End_Object + + Object = Label + Bytes = 65536 + End_Object + + Object = OriginalXmlLabel + Name = IsisCube + StartByte = 1440809537 + Bytes = 7625 + ByteOrder = Lsb + End_Object + End + )"); + QString dataFilePath= "data/isisimport/chan2/ch2_tmc_ncn_20240808T0532596974_d_img_d18.xml"; + QString dataFileName = "ch2_tmc_ncn_20240808T0532596974_d_img_d18.xml"; + QString imageFileName = "ch2_tmc_ncn_20240808T0532596974_d_img_d18.img"; + QString cubeFileName = tempDir.path() + "/output.cub"; + + int samples = 4000; + int lines = 180093; + int bytes = 2; + + // create a temp img file and write data to it + QFile tempImgFile(tempDir.path() + "/" + imageFileName); + + if(!tempImgFile.open(QFile::WriteOnly | QFile::Text)){ + FAIL() << " Could not open file for writing"; + } + QDataStream out(&tempImgFile); + + // generate lines + QByteArray writeToFile = QByteArray(); + short int fill = 0; + for(int i=-1; i<(samples * bytes); i++){ + writeToFile.append(fill); + } + + // write the lines to the temp file + for(int i=0; i<lines; i++){ + QDataStream out(&tempImgFile); + out << writeToFile; + } + tempImgFile.flush(); + tempImgFile.close(); + + // create a temp data file and copy the contents of the xml in to it + QFile tempDataFile(tempDir.path() + "/" + dataFileName); + + if(!tempDataFile.open(QFile::ReadWrite | QFile::Text)){ + FAIL() << " Could not open file for writing"; + } + + // open xml to get data + QFile realXmlFile(dataFilePath); + if (!realXmlFile.open(QIODevice::ReadOnly | QIODevice::Text)) + { + FAIL() << "Failed to open file"; + } + + QTextStream xmlData(&tempDataFile); + xmlData << realXmlFile.readAll(); + + tempDataFile.close(); + realXmlFile.close(); + + QFileInfo fileInfo(tempDataFile); + + // testing with template + QVector<QString> args = {"from=" + fileInfo.absoluteFilePath(), "to=" + cubeFileName}; + UserInterface options(APP_XML, args); + isisimport(options); + + Pvl truthLabel; + PvlInput >> truthLabel; + + Cube outCube(cubeFileName); + Pvl *outLabel = outCube.label(); + + PvlGroup truthGroup = truthLabel.findGroup("Dimensions", Pvl::Traverse); + PvlGroup &outGroup = outLabel->findGroup("Dimensions", Pvl::Traverse); + EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); + + truthGroup = truthLabel.findGroup("Pixels", Pvl::Traverse); + outGroup = outLabel->findGroup("Pixels", Pvl::Traverse); + EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); + + truthGroup = truthLabel.findGroup("Instrument", Pvl::Traverse); + outGroup = outLabel->findGroup("Instrument", Pvl::Traverse); + EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); + + truthGroup = truthLabel.findGroup("BandBin", Pvl::Traverse); + outGroup = outLabel->findGroup("BandBin", Pvl::Traverse); + EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); + + truthGroup = truthLabel.findGroup("Kernels", Pvl::Traverse); + outGroup = outLabel->findGroup("Kernels", Pvl::Traverse); + EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); + + truthGroup = truthLabel.findGroup("Archive", Pvl::Traverse); + outGroup = outLabel->findGroup("Archive", Pvl::Traverse); + EXPECT_PRED_FORMAT2(AssertPvlGroupEqual, outGroup, truthGroup); + } \ No newline at end of file diff --git a/isis/tests/XmlToJsonTests.cpp b/isis/tests/XmlToJsonTests.cpp index b20f60ffa1..7db3e03eeb 100644 --- a/isis/tests/XmlToJsonTests.cpp +++ b/isis/tests/XmlToJsonTests.cpp @@ -293,3 +293,4 @@ TEST(XmlToJson, TestXMLWithNamespace) { } + diff --git a/isis/tests/data/isisimport/chan2/ch2_tmc_ncn_20240808T0532596974_d_img_d18.xml b/isis/tests/data/isisimport/chan2/ch2_tmc_ncn_20240808T0532596974_d_img_d18.xml new file mode 100644 index 0000000000..5a6aa1c85e --- /dev/null +++ b/isis/tests/data/isisimport/chan2/ch2_tmc_ncn_20240808T0532596974_d_img_d18.xml @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-model href="https://isda.issdc.gov.in/pds4/isda/v1/ch2_ldd_ISDA_1000.sch" schematypens="http://purl.oclc.org/dsdl/schematron" ?><Product_Observational xmlns="http://pds.nasa.gov/pds4/pds/v1" xmlns:disp="http://pds.nasa.gov/pds4/disp/v1" xmlns:isda="https://isda.issdc.gov.in/pds4/isda/v1" xmlns:pds="http://pds.nasa.gov/pds4/pds/v1" xmlns:sp="http://pds.nasa.gov/pds4/sp/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pds.nasa.gov/pds4/pds/v1 http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B00.xsd http://pds.nasa.gov/pds4/disp/v1 http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1301.xsd http://pds.nasa.gov/pds4/sp/v1 http://pds.nasa.gov/pds4/sp/v1/PDS4_SP_1100.xsd https://isda.issdc.gov.in/pds4/isda/v1 https://isda.issdc.gov.in/pds4/isda/v1/ch2_ldd_ISDA_1000.xsd"> + + <Identification_Area> + <logical_identifier>urn:isro:isda:ch2_cho.tmc:data_calibrated:ch2_tmc_ncn_20240808t0532596974_d_img_d18</logical_identifier> + <version_id>1.0</version_id> + <title>Chandrayaan-2 Orbiter TMC2 Experiment</title> + <information_model_version>1.11.0.0</information_model_version> + <product_class>Product_Observational</product_class> + <Modification_History> + <Modification_Detail> + <modification_date>2019-05-07</modification_date> + <version_id>1.0</version_id> + <description>PDS4 product label created by SAC Optical DP Team</description> + </Modification_Detail> + </Modification_History> + </Identification_Area> + <Observation_Area> + <Time_Coordinates> + <start_date_time>2024-08-08T05:32:59.6974Z</start_date_time> + <stop_date_time>2024-08-08T05:42:42.4783Z</stop_date_time> + </Time_Coordinates> + <Primary_Result_Summary> + <purpose>Science</purpose> + <processing_level>Calibrated</processing_level> + <description>Calibrated Processing Level describes the radiometric correction (look up table) applied to the raw data</description> + </Primary_Result_Summary> + <Investigation_Area> + <name>chandrayaan-2</name> + <type>Mission</type> + <Internal_Reference> + <lidvid_reference>urn:isro:isda:context:investigation:mission.chandrayaan2::1.0</lidvid_reference> + <reference_type>data_to_investigation</reference_type> + </Internal_Reference> + </Investigation_Area> + <Observing_System> + <Observing_System_Component> + <name>Chandrayaan 2 Orbiter</name> + <type>Spacecraft</type> + <description> + Chandrayaan-2 Orbiter is an Orbiter craft under the Chandrayaan-2 Spacecraft + consists of various scientific instruments. + </description> + </Observing_System_Component> + <Observing_System_Component> + <name>terrain mapping camera</name> + <type>Instrument</type> + <description> + TMC-2 (Terrain Mapping Camera) is one of the scientific instrument hosted + on the Chandrayaan-2 Orbiter. The instrument is passive electro-optical + imaging camera operating in visible-panchromatic band (500-800nm), + comprising three optical sensors Fore, Nadir and Aft placed with angles + of +25 deg, 0 deg and -25 deg to have three stereo views of the same target + as spacecraft moves along the track. + </description> + </Observing_System_Component> + </Observing_System> + <Target_Identification> + <name>Moon</name> + <type>Satellite</type> + <description>Moon is a natural satellite of Earth</description> + </Target_Identification> + <Mission_Area> + <isda:Product_Parameters> + <isda:job_id>TMCXXD18CHO2210300NNNN24221055326097_V2_1</isda:job_id> + <isda:level0_dir_name>TMCXXD18CHO2210300NNNN24221055326097_V2_1</isda:level0_dir_name> + <isda:imaging_orbit_number>22103</isda:imaging_orbit_number> + <isda:dumping_orbit_number>22103</isda:dumping_orbit_number> + <isda:line_exposure_duration unit="ms">3.236</isda:line_exposure_duration> + <isda:gain>g1</isda:gain> + <isda:exposure>e1</isda:exposure> + <isda:detector_pixel_width unit="micrometer">7</isda:detector_pixel_width> + <isda:focal_length unit="mm">140</isda:focal_length> + <isda:reference_data_used>SELENE</isda:reference_data_used> + <isda:orbit_limb_direction>Descending</isda:orbit_limb_direction> + <isda:spacecraft_yaw_direction>False</isda:spacecraft_yaw_direction> + <isda:spacecraft_altitude unit="km">89.53</isda:spacecraft_altitude> + <isda:pixel_resolution unit="m/pixel">4.48</isda:pixel_resolution> + <isda:roll unit="deg">0.009365</isda:roll> + <isda:pitch unit="deg">0.066417</isda:pitch> + <isda:yaw unit="deg">-0.017284</isda:yaw> + <isda:sun_azimuth unit="deg">116.737463</isda:sun_azimuth> + <isda:sun_elevation unit="deg">39.932493</isda:sun_elevation> + <isda:solar_incidence unit="deg">50.067507</isda:solar_incidence> + <isda:projection>Selenographic</isda:projection> + <isda:area>Equatorial</isda:area> + </isda:Product_Parameters> + <isda:Geometry_Parameters> + <isda:System_Level_Coordinates> + <isda:upper_left_latitude unit="deg">45.054183</isda:upper_left_latitude> + <isda:upper_left_longitude unit="deg">95.360662</isda:upper_left_longitude> + <isda:upper_right_latitude unit="deg">45.050300</isda:upper_right_latitude> + <isda:upper_right_longitude unit="deg">96.171919</isda:upper_right_longitude> + <isda:lower_left_latitude unit="deg">15.105121</isda:lower_left_latitude> + <isda:lower_left_longitude unit="deg">95.128359</isda:lower_left_longitude> + <isda:lower_right_latitude unit="deg">15.102485</isda:lower_right_latitude> + <isda:lower_right_longitude unit="deg">95.740193</isda:lower_right_longitude> + </isda:System_Level_Coordinates> + <isda:Refined_Corner_Coordinates> + <isda:upper_left_latitude unit="deg">45.158521</isda:upper_left_latitude> + <isda:upper_left_longitude unit="deg">95.350390</isda:upper_left_longitude> + <isda:upper_right_latitude unit="deg">45.155106</isda:upper_right_latitude> + <isda:upper_right_longitude unit="deg">96.174856</isda:upper_right_longitude> + <isda:lower_left_latitude unit="deg">15.209056</isda:lower_left_latitude> + <isda:lower_left_longitude unit="deg">95.155738</isda:lower_left_longitude> + <isda:lower_right_latitude unit="deg">15.206454</isda:lower_right_latitude> + <isda:lower_right_longitude unit="deg">95.776465</isda:lower_right_longitude> + </isda:Refined_Corner_Coordinates> + </isda:Geometry_Parameters> + </Mission_Area> + </Observation_Area> + <File_Area_Observational> + <File> + <file_name>ch2_tmc_ncn_20240808T0532596974_d_img_d18.img</file_name> + <creation_date_time>2024-08-25T12:10:25</creation_date_time> + <file_size unit="byte">1440744000</file_size> + <md5_checksum>bccc88b8394260ae5791ddecd2ebca90</md5_checksum> + <comment> + This File contains the count calibrated image. + md5_checksum is provided for ensuring data integrity when users are downloading the data. + </comment> + </File> + <Array_2D_Image> + <offset unit="byte">0</offset> + <axes>2</axes> + <axis_index_order>Last Index Fastest</axis_index_order> + <Element_Array> + <data_type>UnsignedLSB2</data_type> + </Element_Array> + <Axis_Array> + <axis_name>Line</axis_name> + <elements>180093</elements> + <sequence_number>1</sequence_number> + </Axis_Array> + <Axis_Array> + <axis_name>Sample</axis_name> + <elements>4000</elements> + <sequence_number>2</sequence_number> + </Axis_Array> + </Array_2D_Image> + </File_Area_Observational> +</Product_Observational> \ No newline at end of file -- GitLab