From 0b1582385a59f94c5e44dfade861f093ef193536 Mon Sep 17 00:00:00 2001
From: Thomas Feuvrier <thomas.feuvrier@c-s.fr>
Date: Fri, 18 Sep 2009 18:30:27 +0200
Subject: [PATCH] ENH: Improve reading TerraSarX keywordlist

---
 Testing/Code/IO/CMakeLists.txt                |  56 +++-
 Testing/Code/IO/otbImageKeywordlist.cxx       |  59 +++-
 .../ossim/ossimTerraSarModel.cpp              | 217 +++++++++++++-
 .../ossim/ossimTerraSarModel.h                |  64 ++++
 .../ossim/ossimTerraSarProductDoc.cpp         | 216 +++++++++++++-
 .../ossim/ossimTerraSarProductDoc.h           |  37 +++
 .../otbossimplugins/ossim/otb/ImageNoise.cpp  | 281 ++++++++++++++++++
 .../otbossimplugins/ossim/otb/ImageNoise.h    | 124 ++++++++
 Utilities/otbossimplugins/ossim/otb/Noise.cpp | 136 +++++++++
 Utilities/otbossimplugins/ossim/otb/Noise.h   |  95 ++++++
 10 files changed, 1261 insertions(+), 24 deletions(-)
 create mode 100644 Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp
 create mode 100644 Utilities/otbossimplugins/ossim/otb/ImageNoise.h
 create mode 100644 Utilities/otbossimplugins/ossim/otb/Noise.cpp
 create mode 100644 Utilities/otbossimplugins/ossim/otb/Noise.h

diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt
index 9eb0a44ea7..5de06e836a 100755
--- a/Testing/Code/IO/CMakeLists.txt
+++ b/Testing/Code/IO/CMakeLists.txt
@@ -1982,102 +1982,135 @@ ADD_TEST(ioTvTerraSarImageMetadataInterface ${IO_TESTS18}
 
 
 ADD_TEST(ioTvImageKeywordlistSpot5 ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistSpot5.txt
          ${TEMP}/ioTvImageKeywordlistSpot5.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistSpot5.txt
+         ${TEMP}/ioTvImageKeywordlistSpot5_saveState_loadState.txt
 --ignore-lines-with 1 support_data.metadata_file
     otbImageKeywordlist
          ${LARGEDATA}/SPOT5/TEHERAN/IMAGERY.TIF
          ${TEMP}/ioTvImageKeywordlistSpot5.txt
+         ${TEMP}/ioTvImageKeywordlistSpot5_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistQuickbird ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistQuickbird.txt
          ${TEMP}/ioTvImageKeywordlistQuickbird.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistQuickbird.txt
+         ${TEMP}/ioTvImageKeywordlistQuickbird_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF
          ${TEMP}/ioTvImageKeywordlistQuickbird.txt
+         ${TEMP}/ioTvImageKeywordlistQuickbird_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistIkonos ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistIkonos.txt
          ${TEMP}/ioTvImageKeywordlistIkonos.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistIkonos.txt
+         ${TEMP}/ioTvImageKeywordlistIkonos_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/IKONOS/BLOSSEVILLE/po_2619900_pan_0000000.tif
          ${TEMP}/ioTvImageKeywordlistIkonos.txt
+         ${TEMP}/ioTvImageKeywordlistIkonos_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistRapidEye ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistRapidEye.txt
          ${TEMP}/ioTvImageKeywordlistRapidEye.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistRapidEye.txt
+         ${TEMP}/ioTvImageKeywordlistRapidEye_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf
          ${TEMP}/ioTvImageKeywordlistRapidEye.txt
+         ${TEMP}/ioTvImageKeywordlistRapidEye_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistEnvisatAsar ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistEnvisatAsar.txt
          ${TEMP}/ioTvImageKeywordlistEnvisatAsar.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistEnvisatAsar.txt
+         ${TEMP}/ioTvImageKeywordlistEnvisatAsar_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/ENVISAT_ASAR_SCENE01/ASA_APS_1PNDPA20030821_7713.N1
          ${TEMP}/ioTvImageKeywordlistEnvisatAsar.txt
+         ${TEMP}/ioTvImageKeywordlistEnvisatAsar_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistAlosPalsar ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistAlosPalsar.txt
          ${TEMP}/ioTvImageKeywordlistAlosPalsar.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistAlosPalsar.txt
+         ${TEMP}/ioTvImageKeywordlistAlosPalsar_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/PALSAR/200801280007/l1data/VOL-ALPSRP037120700-H1.1__A
          ${TEMP}/ioTvImageKeywordlistAlosPalsar.txt
+         ${TEMP}/ioTvImageKeywordlistAlosPalsar_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistRadarSat1 ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat1.txt
          ${TEMP}/ioTvImageKeywordlistRadarSat1.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat1.txt
+         ${TEMP}/ioTvImageKeywordlistRadarSat1_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/RADARSAT1/GOMA/SCENE01/DAT_01.001
          ${TEMP}/ioTvImageKeywordlistRadarSat1.txt
+         ${TEMP}/ioTvImageKeywordlistRadarSat1_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistRadarSat2 ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat2.txt
          ${TEMP}/ioTvImageKeywordlistRadarSat2.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistRadarSat2.txt
+         ${TEMP}/ioTvImageKeywordlistRadarSat2_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/RADARSAT2/ALTONA/Fine_Quad-Pol_Dataset/PK6621_DK406_FQ9_20080405_124900_HH_VV_HV_VH_SLC_Altona/product.xml
          ${TEMP}/ioTvImageKeywordlistRadarSat2.txt
+         ${TEMP}/ioTvImageKeywordlistRadarSat2_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistTerraSarX ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX.txt
          ${TEMP}/ioTvImageKeywordlistTerraSarX.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX.txt
+         ${TEMP}/ioTvImageKeywordlistTerraSarX_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/TERRASARX/dims/TSX-1.SAR.L1B/TSX1_SAR__SSC/TSX1_SAR__SSC.xml
          ${TEMP}/ioTvImageKeywordlistTerraSarX.txt
+         ${TEMP}/ioTvImageKeywordlistTerraSarX_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistTerraSarX_Upsala ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Upsala.txt
          ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Upsala.txt
+         ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/TERRASARX/UPSALA_GLACIER/TSX1_SAR__MGD/TSX1_SAR__MGD.xml
          ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala.txt
+         ${TEMP}/ioTvImageKeywordlistTerraSarX_Upsala_saveState_loadState.txt
 )
 ADD_TEST(ioTvImageKeywordlistTerraSarX_Toronto ${IO_TESTS18}
-  --compare-ascii ${NOTOL}
+  --compare-n-ascii ${NOTOL} 2
          ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Toronto.txt
          ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto.txt
+         ${BASELINE_FILES}/ioTvImageKeywordlistTerraSarX_Toronto.txt
+         ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto_saveState_loadState.txt
     otbImageKeywordlist
          ${LARGEDATA}/TERRASARX/TORONTO/TSX1_SAR__SSC/TSX1_SAR__SSC.xml
          ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto.txt
+         ${TEMP}/ioTvImageKeywordlistTerraSarX_Toronto_saveState_loadState.txt
 )
 
 ADD_TEST(ioTvImageKeywordlistErs ${IO_TESTS18}
@@ -2087,6 +2120,7 @@ ADD_TEST(ioTvImageKeywordlistErs ${IO_TESTS18}
     otbImageKeywordlist
          ${LARGEDATA}/SAR_ERS2_SLCI_SCENE1/DAT_01.001
          ${TEMP}/ioTvImageKeywordlistErs.txt
+         ${TEMP}/ioTvImageKeywordlistErs_saveState_loadState.txt
 )
 
 ENDIF(OTB_DATA_USE_LARGEINPUT)
diff --git a/Testing/Code/IO/otbImageKeywordlist.cxx b/Testing/Code/IO/otbImageKeywordlist.cxx
index bed32d9594..2afa51f9d2 100644
--- a/Testing/Code/IO/otbImageKeywordlist.cxx
+++ b/Testing/Code/IO/otbImageKeywordlist.cxx
@@ -20,14 +20,22 @@ PURPOSE.  See the above copyright notices for more information.
 #endif
 
 #include <iostream>
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#
+#include <iomanip>
+#include <fstream>
+#include "otbMacro.h"
+#include "otbImageKeywordlist.h"
+
+#include "base/ossimKeywordlist.h"
+#include "projection/ossimProjection.h"
+#include "projection/ossimProjectionFactoryRegistry.h"
+#include "ossim/ossimPluginProjectionFactory.h"
+
+
 int otbImageKeywordlist( int argc, char* argv[] )
 {
-  if (argc!=3)
+  if (argc!=4)
   {
-    std::cout << argv[0] <<" <input filename> <output filename>"
+    std::cout << argv[0] <<" <input filename> <output filename> <output filename2>"
     << std::endl;
 
     return EXIT_FAILURE;
@@ -35,21 +43,50 @@ int otbImageKeywordlist( int argc, char* argv[] )
 
   char * filename = argv[1];
   char * outFilename = argv[2];
+  char * outFilename2 = argv[3];
 
   std::ofstream file;
   file.open(outFilename);
   file << std::setprecision(15);
+  std::ofstream file2;
+  file2.open(outFilename2);
+  file2 << std::setprecision(15);
+
+  bool hasMetaData = false;
+  ossimKeywordlist geom_kwl, geom_kwl2, geom_kwl3;
+
+  ossimProjectionFactoryRegistry::instance()->registerFactory(ossimplugins::ossimPluginProjectionFactory::instance());
+    ossimProjection * projection = ossimProjectionFactoryRegistry::instance()
+    ->createProjection(ossimFilename(filename),0);
+    if (!projection)
+    {
+      otbMsgDevMacro( <<"OSSIM Instanciate projection FAILED ! ");
+      return EXIT_FAILURE;
+    }
 
+    hasMetaData = projection->saveState(geom_kwl);
+std::cout << "geom_kwl:"<<geom_kwl<<std::endl;
+    otb::ImageKeywordlist otb_kwl;
+    otb_kwl.SetKeywordlist( geom_kwl );
 
-  typedef otb::VectorImage<double, 2> ImageType;
-  typedef otb::ImageFileReader<ImageType> ReaderType;
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(filename);
-  reader->UpdateOutputInformation();
+    otb_kwl.convertToOSSIMKeywordlist( geom_kwl2 ); 
+std::cout << "geom_kwl2:"<<geom_kwl2<<std::endl;
+
+    hasMetaData = projection->loadState(geom_kwl2);
+    hasMetaData = projection->saveState(geom_kwl3);
+    otb::ImageKeywordlist otb_kwl2;
+    otb_kwl2.SetKeywordlist( geom_kwl3 );
+std::cout << "geom_kwl3:"<<geom_kwl3<<std::endl;
 
   file << "*** KEYWORD LIST ***\n";
-  file << reader->GetOutput()->GetImageKeywordlist();
+  file << otb_kwl;
+  file2 << "*** KEYWORD LIST ***\n";
+  file2 << otb_kwl2;
+
   file.close();
+  file2.close();
+
+
   return EXIT_SUCCESS;
 }
 
diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp
index 66c6cc30a5..5af80985e7 100644
--- a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp
+++ b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.cpp
@@ -37,6 +37,18 @@ static const char SR_GR_SF_KW[] = "sc_gr_sf";
 static const char ALT_SR_GR_COEFFICIENT0_KW[] = "alt_sr_gr_coeff0";
 static const char ALT_SR_GR_COEFFICIENT1_KW[] = "alt_sr_gr_coeff1";
 static const char ALT_SR_GR_COEFFICIENT2_KW[] = "alt_sr_gr_coeff2";
+static const char PRODUCT_TYPE[] = "product_type";
+static const char RADIOMETRIC_CORRECTION[] = "radiometricCorrection";
+
+static const char ACQUISITION_INFO[] = "acquisitionInfo.";
+static const char IMAGING_MODE[] = "imagingMode";
+static const char SENSOR[] = "sensor";
+static const char LOOK_DIRECTION[] = "lookDirection";
+static const char POLARISATION_MODE[] = "polarisationMode";
+static const char POL_LAYER[] = "polLayer";
+
+
+static const char CALIBRATION_CALFACTOR[] = "calibration.calibrationConstant.calFactor";
 
 using ::ossimString;
 using ::ossimXmlDocument;
@@ -59,6 +71,15 @@ ossimplugins::ossimTerraSarModel::ossimTerraSarModel()
      _sceneCenterRangeTime(0.0),
      _SrToGr_scaling_factor(0.0),
      _alt_srgr_coefset(3),
+     _productType(),
+     _radiometricCorrection(),
+     _imagingMode(),
+     _acquisitionSensor(),
+     _lookDirection(),
+     _polarisationMode(),
+     _polLayer(),
+     _noise(0),
+     _calFactor(0.),
      theProductXmlFile()
 {
 }
@@ -72,12 +93,26 @@ ossimplugins::ossimTerraSarModel::ossimTerraSarModel(
      _sceneCenterRangeTime(rhs._sceneCenterRangeTime),
      _SrToGr_scaling_factor(rhs._SrToGr_scaling_factor),
      _alt_srgr_coefset(rhs._alt_srgr_coefset),
+     _productType(rhs._productType),
+     _radiometricCorrection(rhs._radiometricCorrection),
+     _imagingMode(rhs._imagingMode),
+     _acquisitionSensor(rhs._acquisitionSensor),
+     _lookDirection(rhs._lookDirection),
+     _polarisationMode(rhs._polarisationMode),
+     _polLayer(rhs._polLayer),
+     _noise(rhs._noise),
+     _calFactor(rhs._calFactor),
      theProductXmlFile(rhs.theProductXmlFile)
 {
 }
 
 ossimplugins::ossimTerraSarModel::~ossimTerraSarModel()
 {
+   if (_noise != 0)
+   {
+      delete _noise;
+   }
+
 }
 
 ossimString ossimplugins::ossimTerraSarModel::getClassName() const
@@ -184,11 +219,39 @@ bool ossimplugins::ossimTerraSarModel::open(const ossimFilename& file)
                      if (result)
                      {
                         result = initRefPoint(xdoc, tsDoc);
+
+                        if (result)
+                        {
+                            result = tsDoc.getProductType(xdoc, _productType);
+
+                            if (result)
+                            {
+                              result = tsDoc.getRadiometricCorrection(xdoc, _radiometricCorrection);
+                              if (result)
+                              {
+                                result = initAcquisitionInfo(xdoc, tsDoc);
+                                if (result)
+                                {
+                                  result = initNoise(xdoc, tsDoc);
+                                  if (result)
+                                  {
+                                    ossimString s;
+                                    result = tsDoc.getCalFactor(xdoc, s);
+                                    _calFactor = s.toFloat64();
+                                  }
+                                }
+                              }
+                            }
+
+                        }
+
+
                      }
                   }
                }
             }
          }
+  
          
       } // matches: if ( xdoc->openFile(file) )
       
@@ -282,7 +345,26 @@ bool ossimplugins::ossimTerraSarModel::saveState(ossimKeywordlist& kwl,
    {
       // kwl.add(prefix, LOAD_FROM_PRODUCT_FILE_KW, "true");
    }
-   
+
+   kwl.add(prefix, PRODUCT_TYPE, _productType.c_str());
+   kwl.add(prefix, RADIOMETRIC_CORRECTION, _radiometricCorrection.c_str());
+
+   ossimString kw = ACQUISITION_INFO;
+   ossimString kw2 = kw + IMAGING_MODE;
+   kwl.add(prefix, kw2, _imagingMode.c_str());
+   kw2 = kw + SENSOR;
+   kwl.add(prefix, kw2, _acquisitionSensor.c_str());
+   kw2 = kw + LOOK_DIRECTION;
+   kwl.add(prefix, kw2, _lookDirection.c_str());
+   kw2 = kw + POLARISATION_MODE;
+   kwl.add(prefix, kw2, _polarisationMode.c_str());
+   kw2 = kw + POL_LAYER;
+   kwl.add(prefix, kw2, _polLayer.c_str());
+
+
+   _noise->saveState(kwl,prefix);
+
+   kwl.add(prefix, CALIBRATION_CALFACTOR, ossimString::toString(_calFactor).c_str());
    if (traceDebug())
    {
       ossimNotify(ossimNotifyLevel_DEBUG)
@@ -554,6 +636,40 @@ bool ossimplugins::ossimTerraSarModel::loadState (const ossimKeywordlist &kwl,
       
    } // matches: if (result)
 
+   // Load the base class.
+   if ( !_noise)
+   {
+      _noise = new Noise();
+   }
+   if ( _noise->loadState(kwl, prefix) == false )
+   {
+      if (traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_WARN)
+            << MODULE
+            << "\n_noise->loadState failed!\n";
+      }
+      result = false;
+   }
+      lookup = kwl.find(prefix, CALIBRATION_CALFACTOR);
+      if (lookup)
+      {
+          s = lookup;
+         _calFactor = s.toDouble();
+      }
+      else
+      {
+         if (traceDebug())
+         {
+            ossimNotify(ossimNotifyLevel_WARN)
+               << MODULE
+               << "\nRequired keyword not found: "
+               << CALIBRATION_CALFACTOR << "\n";
+         } 
+         result = false;
+      }
+
+
    if (traceDebug())
    {
       ossimNotify(ossimNotifyLevel_DEBUG)
@@ -566,6 +682,7 @@ bool ossimplugins::ossimTerraSarModel::loadState (const ossimKeywordlist &kwl,
 
 std::ostream& ossimplugins::ossimTerraSarModel::print(std::ostream& out) const
 {
+   static const char MODULE[] = "ossimplugins::ossimTerraSarModel::print";
    // Capture the original flags.
    std::ios_base::fmtflags f = out.flags();
    
@@ -604,7 +721,34 @@ std::ostream& ossimplugins::ossimTerraSarModel::print(std::ostream& out) const
    
    ossimGeometricSarSensorModel::print(out);
    
+   if ( _noise->print(out) == false )
+   {
+      if (traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_WARN)
+            << MODULE
+            << "\n_noise->print failed!\n";
+      }
+   }
+
+   out << CALIBRATION_CALFACTOR <<  ": " << _calFactor << "\n";
    // Reset flags.
+
+
+   ossimString kw = ACQUISITION_INFO;
+   ossimString kw2 = kw + IMAGING_MODE;
+   out << kw2 <<  ": " << _imagingMode.c_str()<< "\n";
+   kw2 = kw + SENSOR;
+   out << kw2<<  ": " <<  _acquisitionSensor.c_str()<< "\n";
+   kw2 = kw + LOOK_DIRECTION;
+   out << kw2<<  ": " <<  _lookDirection.c_str()<< "\n";
+   kw2 = kw + POLARISATION_MODE;
+   out << kw2<<  ": " <<  _polarisationMode.c_str()<< "\n";
+   kw2 = kw + POL_LAYER;
+   out << kw2<<  ": " <<  _polLayer.c_str()<< "\n";
+
+
+
    out.setf(f);
 
    return out;
@@ -1407,5 +1551,76 @@ bool ossimplugins::ossimTerraSarModel::initRefPoint(
    return true;
 }
 
+bool ossimplugins::ossimTerraSarModel::initAcquisitionInfo(
+   const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& tsDoc)
+{
+  static const char MODULE[] = "ossimplugins::ossimTerraSarModel::initAcquisitionInfo";
+
+  if (traceDebug())
+  {
+      ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n";
+  }   
    
    
+  bool result = tsDoc.getImagingMode(xdoc, _imagingMode);
+
+  if( result )
+  {
+    result = tsDoc.getAcquisitionSensor(xdoc, _acquisitionSensor);
+    if( result )
+    {
+      result = tsDoc.getLookDirection(xdoc, _lookDirection);
+      if( result )
+      {
+        result = tsDoc.getPolarisationMode(xdoc, _polarisationMode);
+        if( result )
+        {
+          result = tsDoc.getPolLayer(xdoc, _polLayer);
+        }
+      }
+    }
+  }
+
+
+  if (traceDebug())
+  {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << MODULE << " exit status = " << (result?"true":"false\n")
+         << std::endl;
+  }
+
+   return result;
+}
+
+bool ossimplugins::ossimTerraSarModel::initNoise(
+   const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& tsDoc)
+{
+   static const char MODULE[] = "ossimplugins::ossimTerraSarModel::initNoise";
+
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n";
+   }   
+   
+   // Initialize the platform position interpolator.
+   if (_noise)
+   {
+      delete _noise;
+   }
+   
+   _noise = new Noise();
+   
+   bool result = tsDoc.initNoise(xdoc, _noise);
+
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << MODULE << " exit status = " << (result?"true":"false\n")
+         << std::endl;
+   }
+
+   return result;
+}
+
+
+
diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h
index 49d8a992fb..b6ad8b6af7 100644
--- a/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h
+++ b/Utilities/otbossimplugins/ossim/ossimTerraSarModel.h
@@ -24,6 +24,7 @@
 #include <list>
 
 #include <otb/CivilDateTime.h>
+#include <otb/Noise.h>
 
 // Forward class declarations outside of namespace ossimplugins.
 class ossimXmlDocument;
@@ -137,6 +138,24 @@ namespace ossimplugins
        */
       bool initRefPoint(const ossimXmlDocument* xdoc,
                         const ossimTerraSarProductDoc& rsDoc);
+      /**
+       * @brief Method to initialize AcquisitionInfo parameters from
+       * TerraSAR product xml file.
+       * @param xdoc Opened product xml file.
+       * @return true on success, false on error.
+       */
+      bool initAcquisitionInfo( const ossimXmlDocument* xdoc, 
+                        const ossimTerraSarProductDoc& tsDoc);
+
+      /**
+       * @brief Method to initialize ImageNoise parameters from
+       * TerraSAR product xml file.
+       * @param xdoc Opened product xml file.
+       * @return true on success, false on error.
+       */
+      bool initNoise(
+                        const ossimXmlDocument* xdoc, const ossimTerraSarProductDoc& tsDoc);
+
 
       /**
        * @brief Slant Range TO Ground Range Projection reference point
@@ -167,6 +186,51 @@ namespace ossimplugins
        */
       std::vector<double> _alt_srgr_coefset;
 
+      /**
+       * @brief ProductType.
+       */
+      ossimString _productType;
+
+      /**
+       * @brief RadiometricCorrection.
+       */
+      ossimString _radiometricCorrection;
+
+      /**
+       * @brief ImagingMode (AcquisitionInfo node).
+       */
+      ossimString _imagingMode;
+
+      /**
+       * @brief Sensor (AcquisitionInfo node).
+       */
+      ossimString _acquisitionSensor;
+
+      /**
+       * @brief LookDirection (AcquisitionInfo node).
+       */
+      ossimString _lookDirection;
+
+      /**
+       * @brief PolarisationMode (AcquisitionInfo node).
+       */
+      ossimString _polarisationMode;
+
+      /**
+       * @brief PolLayer (AcquisitionInfo node).
+       */
+      ossimString _polLayer;
+
+      /**
+       * @brief Noise (Noise node).
+       */
+      Noise *_noise;
+      
+      /**
+       * @brief CalFactor (Calibration node).
+       */
+      double _calFactor;
+
       ossimFilename theProductXmlFile;
 
       TYPE_DATA
diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp
index eba3cd8c07..ccec450c49 100644
--- a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp
+++ b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.cpp
@@ -14,14 +14,16 @@
 
 #include <ossimTerraSarProductDoc.h>
 #include <ossimPluginCommon.h>
-#include <otb/CivilDateTime.h>
 #include <otb/Ephemeris.h>
 #include <otb/GeographicEphemeris.h>
 #include <otb/JSDDateTime.h>
+#include <otb/CivilDateTime.h>
 #include <otb/PlatformPosition.h>
 #include <otb/SarSensor.h>
 #include <otb/SensorParams.h>
 #include <otb/RefPoint.h>
+#include <otb/Noise.h>
+#include <otb/ImageNoise.h>
 #include <ossim/base/ossimDpt.h>
 #include <ossim/base/ossimFilename.h>
 #include <ossim/base/ossimGpt.h>
@@ -704,6 +706,20 @@ bool ossimplugins::ossimTerraSarProductDoc::getProjection(
    return ossim::getPath(path, xdoc, s);
 }
 
+bool ossimplugins::ossimTerraSarProductDoc::getProductType(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path = "/level1Product/productInfo/productVariantInfo/productType";
+   return ossim::getPath(path, xdoc, s);
+}
+bool ossimplugins::ossimTerraSarProductDoc::getRadiometricCorrection(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path = "/level1Product/productInfo/productVariantInfo/radiometricCorrection";
+   return ossim::getPath(path, xdoc, s);
+}
+
+
 bool ossimplugins::ossimTerraSarProductDoc::getReferencePoint(
    const ossimXmlDocument* xdoc, ossimString& s) const
 {
@@ -893,3 +909,201 @@ bool ossimplugins::ossimTerraSarProductDoc::getRowSpacing(
       "/level1Product/productInfo/imageDataInfo/imageRaster/rowSpacing";
    return ossim::getPath(path, xdoc, s);
 }
+
+bool ossimplugins::ossimTerraSarProductDoc::getImagingMode(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path =
+      "/level1Product/productInfo/acquisitionInfo/imagingMode";
+   return ossim::getPath(path, xdoc, s);
+}
+bool ossimplugins::ossimTerraSarProductDoc::getAcquisitionSensor(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path =
+      "/level1Product/productInfo/acquisitionInfo/sensor";
+   return ossim::getPath(path, xdoc, s);
+}
+bool ossimplugins::ossimTerraSarProductDoc::getPolarisationMode(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path =
+      "/level1Product/productInfo/acquisitionInfo/polarisationMode";
+   return ossim::getPath(path, xdoc, s);
+}
+bool ossimplugins::ossimTerraSarProductDoc::getPolLayer(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path =
+      "/level1Product/productInfo/acquisitionInfo/polarisationList/polLayer";
+   return ossim::getPath(path, xdoc, s);
+}
+bool ossimplugins::ossimTerraSarProductDoc::getCalFactor(
+   const ossimXmlDocument* xdoc, ossimString& s) const
+{
+   ossimString path =
+      "/level1Product/calibration/calibrationConstant/calFactor";
+   return ossim::getPath(path, xdoc, s);
+}
+
+bool ossimplugins::ossimTerraSarProductDoc::initNoise(
+   const ossimXmlDocument* xdoc, ossimplugins::Noise* noise) const
+{
+   static const char MODULE[] =
+      "ossimplugins::ossimTerraSarProductDoc::initImageNoise";
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)<< MODULE << " entered...\n";
+   }  
+
+   bool result = true;
+
+   if ( xdoc && noise )
+   {
+      ossimString path =
+      "/level1Product/noise/numberOfNoiseRecords";
+      ossimString s;
+      ossim::getPath(path, xdoc, s);
+      std::vector<ImageNoise> tabImageNoise;
+      tabImageNoise.clear();
+      noise->set_numberOfNoiseRecords(s.toInt32());
+
+      // Get all the stateVector nodes.
+      path =
+         "/level1Product/noise/imageNoise";
+      std::vector<ossimRefPtr<ossimXmlNode> > xnodes;
+      xdoc->findNodes(path, xnodes);
+      if ( xnodes.size() )
+      {
+         const std::vector<ossimRefPtr<ossimXmlNode> >::size_type COUNT =
+            xnodes.size();
+//         ossim::iso8601TimeStringToCivilDate(
+         
+         int nbrData = 0; // to keep track of good stateVector count.
+
+         ossimRefPtr<ossimXmlNode> svNode = 0; // stateVector node
+
+         for (ossim_uint32 i = 0 ; i < COUNT; ++i)
+         { 
+            ImageNoise ev;
+            svNode = xnodes[i];
+            if ( !svNode )
+            {
+               result = false;
+               break;
+            }
+
+            ossimString s;
+
+               path = "timeUTC";
+               result = ossim::findFirstNode(path, svNode, s);
+               if (result)
+               {
+                  ev.set_timeUTC(s);
+               }
+               else
+               {
+                  result = false;
+                  ossimNotify(ossimNotifyLevel_WARN)
+                     << MODULE << " ERROR:\nNode not found: " << path
+                     << std::endl;
+                  break;
+               }
+
+               path = "noiseEstimate/validityRangeMin";
+               result = ossim::findFirstNode(path, svNode, s);
+               if (result)
+               {
+                  ev.set_validityRangeMin( s.toDouble() );
+               }
+               else
+               {
+                  result = false;
+                  ossimNotify(ossimNotifyLevel_WARN)
+                     << MODULE << " ERROR:\nNode not found: " << path
+                     << std::endl;
+                  break;
+               }
+               path = "noiseEstimate/validityRangeMax";
+               result = ossim::findFirstNode(path, svNode, s);
+               if (result)
+               {
+                  ev.set_validityRangeMax( s.toDouble() );
+               }
+               else
+               {
+                  result = false;
+                  ossimNotify(ossimNotifyLevel_WARN)
+                     << MODULE << " ERROR:\nNode not found: " << path
+                     << std::endl;
+                  break;
+               }
+               path = "noiseEstimate/referencePoint";
+               result = ossim::findFirstNode(path, svNode, s);
+               if (result)
+               {
+                  ev.set_referencePoint( s.toDouble() );
+               }
+               else
+               {
+                  result = false;
+                  ossimNotify(ossimNotifyLevel_WARN)
+                     << MODULE << " ERROR:\nNode not found: " << path
+                     << std::endl;
+                  break;
+               }
+               path = "noiseEstimate/polynomialDegree";
+               result = ossim::findFirstNode(path, svNode, s);
+               if (result)
+               {
+                  ev.set_polynomialDegree( s.toInt32() );
+               }
+               else
+               {
+                  result = false;
+                  ossimNotify(ossimNotifyLevel_WARN)
+                     << MODULE << " ERROR:\nNode not found: " << path
+                     << std::endl;
+                  break;
+               }
+               //Read Coefficient
+
+               ossimXmlNode::ChildListType nodelist;
+               svNode->findChildNodes("noiseEstimate/coefficient",nodelist);
+
+               ossimXmlNode::ChildListType::const_iterator child_iter = nodelist.begin();
+               std::vector<double> polynomialCoefficients;
+               while(child_iter != nodelist.end())
+               {
+                  double coefficient = ((*child_iter)->getText()).toDouble() ;
+                  polynomialCoefficients.push_back(coefficient);
+                  ++child_iter;
+               }                  
+               ev.set_polynomialCoefficients( polynomialCoefficients );
+
+              tabImageNoise.push_back(ev);
+               ++nbrData;
+
+               
+         } // matches: for (ossim_uint32 i = 0 ; i < COUNT; ++i)
+
+        noise->set_imageNoise(tabImageNoise);
+         
+      } // matches: if ( xnodes.size() )
+      
+   } // matches: if (xdoc && pos)
+   else
+   {
+      result = false;
+   }
+
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << MODULE << " exit status = " << (result?"true\n":"false\n");
+   } 
+
+   return result;
+}
+
+
diff --git a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h
index dd36e6aa41..8beecec796 100644
--- a/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h
+++ b/Utilities/otbossimplugins/ossim/ossimTerraSarProductDoc.h
@@ -35,6 +35,7 @@ namespace ossimplugins
    class PlatformPosition;
    class RefPoint;
    class SensorParams;
+   class Noise;
 
    /** @brief Class to encapsulate parsing TerraSAR product xml file. */
    class ossimTerraSarProductDoc
@@ -201,6 +202,42 @@ namespace ossimplugins
       
       bool getGeodeticTerrainHeight(const ossimXmlDocument* xdoc,
                                     ossimString& s) const;
+
+      bool getProductType(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+
+      bool getRadiometricCorrection(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+      bool getImagingMode(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+      bool getAcquisitionSensor(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+      bool getPolarisationMode(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+      bool getPolLayer(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+      bool getCalFactor(const ossimXmlDocument* xdoc,
+                                    ossimString& s) const;
+
+      /**
+       * @brief Method to initialize Noise object from
+       * TerraSAR  product xml file.
+       * @param xdoc Opened product xml file.
+       * @param pos Pointer to PlatformPosition object.
+       * @return true on success, false on error.
+       */
+      bool initNoise(const ossimXmlDocument* xdoc,
+                                Noise* pos) const;
+
+/*
+      bool getImageNoiseTimeUTC(const ossimXmlDocument* xdoc, ossimString& s) const;
+      bool getImageNoiseValidityRangeMin(const ossimXmlDocument* xdoc, ossimString& s) const;
+      bool getImageNoiseValidityRangeMax(const ossimXmlDocument* xdoc, ossimString& s) const;
+      bool getImageNoiseReferencePoint(const ossimXmlDocument* xdoc, ossimString& s) const;
+      bool getImageNoisePolynomialCoefficient( const ossimXmlDocument* xdoc, std::vector<double>& polynomialCoefficient) const;
+
+*/
+
    };
 
 } // End: namespace ossimplugins
diff --git a/Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp b/Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp
new file mode 100644
index 0000000000..b4cfd6a6dc
--- /dev/null
+++ b/Utilities/otbossimplugins/ossim/otb/ImageNoise.cpp
@@ -0,0 +1,281 @@
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#include <ImageNoise.h>
+#include <ossim/base/ossimDpt3d.h>
+#include <ossim/base/ossimKeywordlist.h>
+#include <ossim/base/ossimNotify.h>
+#include <ossim/base/ossimString.h>
+
+namespace ossimplugins
+{
+
+
+static const char PREFIX[]          = "imageNoise.";
+static const char TIME_UTC[] = "timeUTC";
+static const char NOISE_ESTIMATE[] = "noiseEstimate.";
+static const char REFERENCE_POINT[] = "referencePoint";
+static const char VALIDITY_RANGE_MIN[] = "validityRangeMin";
+static const char VALIDITY_RANGE_MAX[] = "validityRangeMax";
+static const char POLYNOMIAL_DEGREE[] = "polynomialDegree";
+static const char COEFFICIENT[] = "coefficient";
+static const char NOISE_ESTIMATE_CONFIDENCE[] = "noiseEstimateConfidence";
+
+ImageNoise::ImageNoise():
+     _timeUTC(),
+     _validityRangeMin(0.),
+     _validityRangeMax(0.),
+     _referencePoint(0.),
+     _polynomialDegree(0),
+     _polynomialCoefficients(0)
+{
+}
+
+ImageNoise::~ImageNoise()
+{
+}
+
+
+ImageNoise::ImageNoise(const ImageNoise& rhs):
+     _timeUTC(rhs._timeUTC),
+     _validityRangeMin(rhs._validityRangeMin),
+     _validityRangeMax(rhs._validityRangeMax),
+     _referencePoint(rhs._referencePoint),
+     _polynomialDegree(rhs._polynomialDegree),
+     _polynomialCoefficients(rhs._polynomialCoefficients)
+{
+}
+
+ImageNoise& ImageNoise::operator=(const ImageNoise& rhs)
+{
+     _timeUTC = rhs._timeUTC;
+     _validityRangeMin = rhs._validityRangeMin;
+     _validityRangeMax = rhs._validityRangeMax;
+     _referencePoint = rhs._referencePoint;
+     _polynomialDegree = rhs._polynomialDegree;
+    _polynomialCoefficients = rhs._polynomialCoefficients;
+  return *this;
+}
+
+bool ImageNoise::saveState(ossimKeywordlist& kwl, const char* prefix) const
+{
+   std::string pfx;
+   std::string pfx2;
+   if (prefix)
+   {
+      pfx = prefix;
+   }
+  pfx += PREFIX;
+  kwl.add(pfx.c_str(), TIME_UTC,  _timeUTC);
+
+  pfx2 = pfx + NOISE_ESTIMATE;
+  kwl.add(pfx2.c_str(), VALIDITY_RANGE_MIN,  _validityRangeMin);
+  kwl.add(pfx2.c_str(), VALIDITY_RANGE_MAX,  _validityRangeMax);
+  kwl.add(pfx2.c_str(), REFERENCE_POINT,  _referencePoint);
+  kwl.add(pfx2.c_str(), POLYNOMIAL_DEGREE,  _polynomialDegree);
+
+  for(unsigned int i=0 ; i<_polynomialCoefficients.size();i++)
+  {
+         ossimString iStr = ossimString::toString(i);
+         ossimString kw = ossimString(COEFFICIENT) + "["+iStr+ "]";
+         kwl.add(pfx2.c_str(), kw.c_str(), _polynomialCoefficients[i]);
+  }
+
+   return true;
+}
+
+bool ImageNoise::loadState(const ossimKeywordlist& kwl, const char* prefix)
+{
+  static const char MODULE[] = "ImageNoise::loadState";
+  bool result = true;
+  std::string pfx;
+  std::string pfx2;
+  if (prefix)
+  {
+    pfx = prefix;
+  }
+   ossimString s;
+   const char* lookup = 0;
+
+  pfx += PREFIX;
+  lookup = kwl.find(pfx.c_str(), TIME_UTC);
+  if (lookup)
+  {
+    s = lookup;
+    _timeUTC = s;
+  }
+  else
+  {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << TIME_UTC << " in "<<pfx.c_str()<<" path.\n";
+    result = false;
+  }
+  pfx2 = pfx + NOISE_ESTIMATE;
+  lookup = kwl.find(pfx2.c_str(), VALIDITY_RANGE_MIN);
+  if (lookup)
+  {
+    s = lookup;
+    _validityRangeMin = s.toDouble();
+  }
+  else
+  {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << VALIDITY_RANGE_MIN << " in "<<pfx2.c_str()<<" path.\n";
+    result = false;
+  }
+  lookup = kwl.find(pfx2.c_str(), VALIDITY_RANGE_MAX);
+  if (lookup)
+  {
+    s = lookup;
+    _validityRangeMax = s.toDouble();
+  }
+  else
+  {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << VALIDITY_RANGE_MAX << " in "<<pfx2.c_str()<<" path\n";
+    result = false;
+  }
+  lookup = kwl.find(pfx2.c_str(), REFERENCE_POINT);
+  if (lookup)
+  {
+    s = lookup;
+    _referencePoint = s.toDouble();
+  }
+  else
+  {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << REFERENCE_POINT << " in "<<pfx2.c_str()<<" path\n";
+    result = false;
+  }
+  lookup = kwl.find(pfx2.c_str(), POLYNOMIAL_DEGREE);
+  if (lookup)
+  {
+    s = lookup;
+    _polynomialDegree = s.toInt32();
+  }
+  else
+  {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << POLYNOMIAL_DEGREE << " in "<<pfx2.c_str()<<" path\n";
+    result = false;
+  }
+
+  for(unsigned int i=0 ; i<_polynomialDegree+1;i++)
+  {
+      ossimString iStr = ossimString::toString(i);
+      ossimString kw = ossimString(COEFFICIENT) + "["+iStr+ "]";
+      lookup = kwl.find(pfx2.c_str(), kw.c_str());
+      if (lookup)
+      {
+        s = lookup;
+        _polynomialCoefficients.push_back( s.toDouble() );
+      }
+      else
+      {
+        ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << kw.c_str() << " in "<<pfx2.c_str()<<" path\n";
+        result = false;
+      }
+  }
+
+
+/*
+   pfx += "ImageNoise.";
+
+   const char* lookup = 0;
+   ossimString s;
+   double d;
+
+   lookup = kwl.find(pfx.c_str(), DATE_JULIAN_KW);
+   if (lookup)
+   {
+      s = lookup;
+      d = s.toDouble();
+      JulianDate jd(d);
+      _date.set_day0hTU(jd);
+   }
+   else
+   {
+      ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << DATE_JULIAN_KW << "\n";
+
+      result = false;
+   }
+
+   lookup = kwl.find(pfx.c_str(), DATE_SECOND_KW);
+   if (lookup)
+   {
+      s = lookup;
+      d = s.toDouble();
+      _date.set_second(d);
+   }
+   else
+   {
+      ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << DATE_SECOND_KW << "\n";
+      result = false;
+   }
+
+   lookup = kwl.find(pfx.c_str(), DATE_DECIMAL_KW);
+   if (lookup)
+   {
+      s = lookup;
+      d = s.toDouble();
+      _date.set_decimal(d);
+   }
+   else
+   {
+      ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << DATE_DECIMAL_KW << "\n";
+      result = false;
+   }
+
+   lookup = kwl.find(pfx.c_str(), POSITION_KW);
+   if (lookup)
+   {
+      std::string ps = lookup;
+
+      ossimDpt3d pt;
+      pt.toPoint(ps);
+
+      _position[0] = pt.x;
+      _position[1] = pt.y;
+      _position[2] = pt.z;
+   }
+   else
+   {
+      ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << POSITION_KW << "\n";
+      result = false;
+   }
+
+   lookup = kwl.find(pfx.c_str(), VELOCITY_KW);
+   if (lookup)
+   {
+      std::string ps = lookup;
+
+      ossimDpt3d pt;
+      pt.toPoint(ps);
+
+      _vitesse[0] = pt.x;
+      _vitesse[1] = pt.y;
+      _vitesse[2] = pt.z;
+   }
+   else
+   {
+      ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << VELOCITY_KW << "\n";
+      result = false;
+   }
+*/
+   return result;
+}
+}
diff --git a/Utilities/otbossimplugins/ossim/otb/ImageNoise.h b/Utilities/otbossimplugins/ossim/otb/ImageNoise.h
new file mode 100644
index 0000000000..29729a8c89
--- /dev/null
+++ b/Utilities/otbossimplugins/ossim/otb/ImageNoise.h
@@ -0,0 +1,124 @@
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#ifndef ImageNoise_h
+#define ImageNoise_h
+
+#include <vector>
+#include <ossim/base/ossimString.h>
+
+class ossimKeywordlist;
+
+namespace ossimplugins
+{
+
+
+/**
+ * @ingroup ImageNoise
+ * @brief This class represents an ImageNoise
+ */
+class ImageNoise
+{
+public:
+   /**
+    * @brief Constructor
+    */
+   ImageNoise();
+
+   /**
+    * @brief Destructor
+    */
+   virtual ~ImageNoise();
+
+   /**
+    * @brief Copy constructor
+    */
+   ImageNoise(const ImageNoise& rhs);
+
+   /**
+    * @brief Affectation operator
+    */
+   ImageNoise& operator=(const ImageNoise& rhs);
+
+   /**
+    * @brief Method to save object state to a keyword list.
+    * @param kwl Keyword list to save to.
+    * @param prefix added to keys when saved.
+    * @return true on success, false on error.
+    */
+   bool saveState(ossimKeywordlist& kwl, const char* prefix=0) const;
+
+   /**
+    * @brief Method to the load (recreate) the state of the object from a
+    * keyword list. Return true if ok or false on error.
+    * @return true if load OK, false on error
+    */
+   bool loadState (const ossimKeywordlist &kwl, const char *prefix=0);
+
+   void set_timeUTC(const ossimString& value)
+   {
+      _timeUTC = value;
+   }
+   void set_validityRangeMin(double value)
+   {
+      _validityRangeMin = value;
+   }
+   void set_validityRangeMax(double value)
+   {
+      _validityRangeMax = value;
+   }
+   void set_referencePoint(double value)
+   {
+      _referencePoint = value;
+   }
+   void set_polynomialDegree(unsigned int value)
+   {
+      _polynomialDegree = value;
+   }
+   void set_polynomialCoefficients(const std::vector<double>& value)
+   {
+      _polynomialCoefficients = value;
+   }
+
+protected:
+
+      /**
+       * @brief TimeUTC (Noise/ImageNoise node).
+       */
+      ossimString _timeUTC;
+
+      /**
+       * @brief ValidityRangeMin (Noise/ImageNoise node).
+       */
+      double _validityRangeMin;
+      /**
+       * @brief ValidityRangeMax (Noise/ImageNoise node).
+       */
+      double _validityRangeMax;
+      /**
+       * @brief Reference point (Noise/ImageNoise node).
+       */
+      double _referencePoint;
+
+      /**
+       * @brief Polynomial degree (Noise/ImageNoise node).
+       */
+      unsigned int _polynomialDegree;
+      /**
+       * @brief Polynomial coefficients (Noise/ImageNoise node).
+       */
+      std::vector<double> _polynomialCoefficients;
+
+private:
+};
+}
+
+#endif
diff --git a/Utilities/otbossimplugins/ossim/otb/Noise.cpp b/Utilities/otbossimplugins/ossim/otb/Noise.cpp
new file mode 100644
index 0000000000..ea12fa0d26
--- /dev/null
+++ b/Utilities/otbossimplugins/ossim/otb/Noise.cpp
@@ -0,0 +1,136 @@
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#include <Noise.h>
+#include <ossim/base/ossimDpt3d.h>
+#include <ossim/base/ossimKeywordlist.h>
+#include <ossim/base/ossimNotify.h>
+#include <ossim/base/ossimString.h>
+
+
+namespace ossimplugins
+{
+static const char NOISE[] = "noise";
+static const char NUMBER_OF_NOISE_RECORDS_KW[] = "numberOfNoiseRecords"; 
+
+Noise::Noise():
+  _numberOfNoiseRecords(0),
+  _tabImageNoise()
+{
+}
+
+Noise::~Noise()
+{
+}
+
+
+Noise::Noise(const Noise& rhs):
+  _numberOfNoiseRecords(rhs._numberOfNoiseRecords),
+  _tabImageNoise(rhs._tabImageNoise)
+{
+}
+
+Noise& Noise::operator=(const Noise& rhs)
+{
+  _numberOfNoiseRecords = rhs._numberOfNoiseRecords;
+  _tabImageNoise = rhs._tabImageNoise;
+  return *this;
+}
+
+bool Noise::saveState(ossimKeywordlist& kwl, const char* prefix) const
+{
+   std::string pfx;
+   if (prefix)
+   {
+      pfx = prefix;
+   }
+   pfx += NOISE;
+   std::string s = pfx + "." + NUMBER_OF_NOISE_RECORDS_KW;
+   kwl.add(prefix, s.c_str(), _numberOfNoiseRecords);
+   for (unsigned int i = 0; i < _tabImageNoise.size(); ++i)
+   {
+      std::string s2 = pfx + "[" + ossimString::toString(i) + "]";
+      _tabImageNoise[i].saveState(kwl, s2.c_str());
+   }
+
+   return true;
+}
+
+bool Noise::loadState(const ossimKeywordlist& kwl, const char* prefix)
+{
+   static const char MODULE[] = "Noise::loadState";
+
+   bool result = true;
+
+   std::string pfx("");
+   if (prefix)
+   {
+      pfx = prefix;
+   }
+   pfx += NOISE;
+
+   ossimString s;
+   const char* lookup = 0;
+   std::string s1 = pfx + ".";
+
+  lookup = kwl.find(s1.c_str(), NUMBER_OF_NOISE_RECORDS_KW);
+  if (lookup)
+  {
+    s = lookup;
+    _numberOfNoiseRecords = s.toUInt32();
+  }
+  else
+  {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword not found: " << NUMBER_OF_NOISE_RECORDS_KW << "\n";
+    result = false;
+  }
+
+   _tabImageNoise.clear();
+   for (unsigned int i = 0; i < _numberOfNoiseRecords; ++i)
+   {
+      std::string s2 = pfx + "[" + ossimString::toString(i) + "]";
+      ImageNoise in;
+      result = in.loadState(kwl, s2.c_str());
+      _tabImageNoise.push_back(in);
+   }
+   if( _numberOfNoiseRecords != _tabImageNoise.size() )
+   {
+    ossimNotify(ossimNotifyLevel_WARN)
+         << MODULE << " Keyword " << NUMBER_OF_NOISE_RECORDS_KW << " is different with the number of ImageNoise nodes \n";
+   }
+   return result;
+}
+
+
+std::ostream& Noise::print(std::ostream& out) const
+{
+   out << setprecision(15) << setiosflags(ios::fixed)
+       << "\n Noise class data members:\n";
+
+   const char* prefix = 0;
+   ossimKeywordlist kwl;
+   ossimString pfx;
+   pfx += NOISE;
+   std::string s = pfx + "." + NUMBER_OF_NOISE_RECORDS_KW;
+   kwl.add(prefix, s.c_str(), _numberOfNoiseRecords);
+   for (unsigned int i = 0; i < _tabImageNoise.size(); ++i)
+   {
+      std::string s2 = pfx + "[" + ossimString::toString(i) + "]";
+      _tabImageNoise[i].saveState(kwl, s2.c_str());
+   }
+
+   out << kwl;
+
+   return out;
+}
+
+}
diff --git a/Utilities/otbossimplugins/ossim/otb/Noise.h b/Utilities/otbossimplugins/ossim/otb/Noise.h
new file mode 100644
index 0000000000..ddedea5c06
--- /dev/null
+++ b/Utilities/otbossimplugins/ossim/otb/Noise.h
@@ -0,0 +1,95 @@
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#ifndef Noise_h
+#define Noise_h
+
+#include <JSDDateTime.h>
+#include <otb/ImageNoise.h>
+#include <ossim/base/ossimConstants.h>
+
+class ossimKeywordlist;
+
+namespace ossimplugins
+{
+
+/**
+ * @ingroup Noise
+ * @brief This class represents an Noise
+ */
+class Noise
+{
+public:
+   /**
+    * @brief Constructor
+    */
+   Noise();
+
+   /**
+    * @brief Destructor
+    */
+   virtual ~Noise();
+
+   /**
+    * @brief Copy constructor
+    */
+   Noise(const Noise& rhs);
+
+   /**
+    * @brief Affectation operator
+    */
+   Noise& operator=(const Noise& rhs);
+
+   /**
+    * @brief Method to save object state to a keyword list.
+    * @param kwl Keyword list to save to.
+    * @param prefix added to keys when saved.
+    * @return true on success, false on error.
+    */
+   bool saveState(ossimKeywordlist& kwl, const char* prefix=0) const;
+
+   /**
+    * @brief Method to the load (recreate) the state of the object from a
+    * keyword list. Return true if ok or false on error.
+    * @return true if load OK, false on error
+    */
+   bool loadState (const ossimKeywordlist &kwl, const char *prefix=0);
+   /*!
+    * METHOD: print()
+    * Fulfills base-class pure virtual. Dumps contents of object to ostream.
+    */
+   virtual std::ostream& print(std::ostream& out) const;
+
+  void set_numberOfNoiseRecords(const ossim_int32&  numberOfNoiseRecords)
+  {
+    _numberOfNoiseRecords = numberOfNoiseRecords;
+  }
+  void set_imageNoise(const std::vector<ImageNoise>& image_noise)
+  {
+    _tabImageNoise = image_noise;
+  }
+
+protected:
+
+      /**
+       * @brief Image Noise.
+       */
+      ossim_uint32 _numberOfNoiseRecords;
+      /**
+       * @brief Image Noise.
+       */
+      std::vector<ImageNoise> _tabImageNoise;
+  
+private:
+};
+}
+
+#endif
-- 
GitLab