From 06b4d739dedd218c94bd89fbe191d37bd2c47a00 Mon Sep 17 00:00:00 2001
From: Marina Ganeva <m.ganeva@fz-juelich.de>
Date: Tue, 3 Dec 2013 17:29:14 +0100
Subject: [PATCH] Function GetDifference is implemented.

---
 Core/Tools/inc/OutputDataFunctions.h          |  4 ++++
 Core/Tools/src/OutputDataFunctions.cpp        | 24 +++++++++++++++++++
 .../TestCore/IsGISAXS01/IsGISAXS01.cpp        | 14 ++++-------
 .../TestCore/IsGISAXS02/IsGISAXS02.cpp        | 12 +++-------
 .../TestCore/IsGISAXS03BA/IsGISAXS03BA.cpp    | 13 +++-------
 .../IsGISAXS03DWBA/IsGISAXS03DWBA.cpp         | 13 +++-------
 .../IsGISAXS041DDL/IsGISAXS041DDL.cpp         | 13 +++-------
 .../IsGISAXS042DDL/IsGISAXS042DDL.cpp         | 13 +++-------
 .../TestCore/IsGISAXS06L1/IsGISAXS06L1.cpp    | 13 +++-------
 .../TestCore/IsGISAXS06L2/IsGISAXS06L2.cpp    | 13 +++-------
 .../TestCore/IsGISAXS06L3/IsGISAXS06L3.cpp    | 13 +++-------
 .../TestCore/IsGISAXS06L4/IsGISAXS06L4.cpp    | 13 +++-------
 .../TestCore/IsGISAXS07/IsGISAXS07.cpp        | 12 +++-------
 .../IsGISAXS082DDL/IsGISAXS082DDL.cpp         | 13 +++-------
 .../IsGISAXS082DDL2/IsGISAXS082DDL2.cpp       | 13 +++-------
 .../TestCore/IsGISAXS09P/IsGISAXS09P.cpp      | 13 +++-------
 .../TestCore/IsGISAXS09R/IsGISAXS09R.cpp      | 13 +++-------
 .../TestCore/IsGISAXS10/IsGISAXS10.cpp        | 13 +++-------
 .../TestCore/IsGISAXS11/IsGISAXS11.cpp        | 13 +++-------
 .../TestCore/IsGISAXS15/IsGISAXS15.cpp        | 13 +++-------
 .../TestCore/MesoCrystal1/MesoCrystal1.cpp    | 13 +++-------
 .../PolarizedDWBAZeroMag.cpp                  | 13 +++-------
 22 files changed, 89 insertions(+), 198 deletions(-)

diff --git a/Core/Tools/inc/OutputDataFunctions.h b/Core/Tools/inc/OutputDataFunctions.h
index 10e49696128..5ae6566de95 100644
--- a/Core/Tools/inc/OutputDataFunctions.h
+++ b/Core/Tools/inc/OutputDataFunctions.h
@@ -93,6 +93,10 @@ namespace OutputDataFunctions
     BA_CORE_API_ Mask *CreateEllipticMask(
         const OutputData<double>& data,
         double xc, double yc, double rx, double ry);
+
+    // compare result with reference and return the difference
+    double GetDifference(const OutputData<double> &result,
+                         const OutputData<double> &reference);
 }
 
 #endif // OUTPUTDATAFUNCTIONS_H
diff --git a/Core/Tools/src/OutputDataFunctions.cpp b/Core/Tools/src/OutputDataFunctions.cpp
index 18ea7e13323..83678eb9141 100644
--- a/Core/Tools/src/OutputDataFunctions.cpp
+++ b/Core/Tools/src/OutputDataFunctions.cpp
@@ -482,3 +482,27 @@ Mask* OutputDataFunctions::CreateEllipticMask(
     return OutputDataFunctions::CreateEllipticMask(data, center, radii);
 }
 
+double OutputDataFunctions::GetDifference(const OutputData<double> &result,
+                     const OutputData<double> &reference)
+{
+    OutputData<double> *c_result = result.clone();
+    OutputData<double> *c_reference = reference.clone();
+
+    // Calculating average relative difference.
+    *c_result -= *c_reference;
+    *c_result /= *c_reference;
+
+    double diff(0);
+    for(OutputData<double>::const_iterator it =
+            c_result->begin(); it!=c_result->end(); ++it) {
+        diff+= std::fabs(*it);
+    }
+    diff /= c_result->getAllocatedSize();
+
+    if (std::isnan(diff)) throw RuntimeErrorException("diff=NaN!");
+
+    delete c_result;
+    delete c_reference;
+
+    return diff;
+}
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS01/IsGISAXS01.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS01/IsGISAXS01.cpp
index 25c5ee9b583..56fa5f93737 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS01/IsGISAXS01.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS01/IsGISAXS01.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -40,19 +41,12 @@ int FunctionalTests::IsGISAXS01::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
+
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS02/IsGISAXS02.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS02/IsGISAXS02.cpp
index d8516fee326..57d8f4ce244 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS02/IsGISAXS02.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS02/IsGISAXS02.cpp
@@ -6,6 +6,7 @@
 #include "SampleBuilderFactory.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -40,18 +41,11 @@ int FunctionalTests::IsGISAXS02::analyseResults()
     const double threshold(2e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 	
 	// Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.cpp
index 4d2479daa4e..dbf923becbf 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS03BA/IsGISAXS03BA.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -40,19 +41,11 @@ int FunctionalTests::IsGISAXS03BA::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.cpp
index 35d4cce9eed..4a019771877 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS03DWBA/IsGISAXS03DWBA.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -40,19 +41,11 @@ int FunctionalTests::IsGISAXS03DWBA::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp
index a73abde9b89..b309783ce52 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS041DDL/IsGISAXS041DDL.cpp
@@ -6,6 +6,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 #include <gsl/gsl_errno.h>
@@ -40,19 +41,11 @@ int FunctionalTests::IsGISAXS041DDL::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp
index 8e4c8689884..fe256e96147 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS042DDL/IsGISAXS042DDL.cpp
@@ -6,6 +6,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 #include <gsl/gsl_errno.h>
@@ -40,19 +41,11 @@ int FunctionalTests::IsGISAXS042DDL::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS06L1/IsGISAXS06L1.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS06L1/IsGISAXS06L1.cpp
index c9259141db9..622eafd9298 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS06L1/IsGISAXS06L1.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS06L1/IsGISAXS06L1.cpp
@@ -15,6 +15,7 @@
 #include "IsGISAXS06Builder.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 #include <iostream>
 #include <cmath>
@@ -49,19 +50,11 @@ int FunctionalTests::IsGISAXS06L1::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS06L2/IsGISAXS06L2.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS06L2/IsGISAXS06L2.cpp
index 6cc0d3fadae..1dadfbcae4e 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS06L2/IsGISAXS06L2.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS06L2/IsGISAXS06L2.cpp
@@ -15,6 +15,7 @@
 #include "IsGISAXS06Builder.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 #include <iostream>
 #include <cmath>
@@ -49,19 +50,11 @@ int FunctionalTests::IsGISAXS06L2::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS06L3/IsGISAXS06L3.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS06L3/IsGISAXS06L3.cpp
index 56c0ab4bf67..25edf329ae4 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS06L3/IsGISAXS06L3.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS06L3/IsGISAXS06L3.cpp
@@ -15,6 +15,7 @@
 #include "IsGISAXS06Builder.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 #include <iostream>
 #include <cmath>
@@ -49,19 +50,11 @@ int FunctionalTests::IsGISAXS06L3::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS06L4/IsGISAXS06L4.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS06L4/IsGISAXS06L4.cpp
index 72f9ab06476..cf34e6f5d41 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS06L4/IsGISAXS06L4.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS06L4/IsGISAXS06L4.cpp
@@ -15,6 +15,7 @@
 #include "IsGISAXS06Builder.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 #include <iostream>
 #include <cmath>
@@ -69,19 +70,11 @@ int FunctionalTests::IsGISAXS06L4::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp
index e540d38eeb5..46d107c925e 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp
@@ -11,6 +11,7 @@
 #include "Units.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -42,17 +43,10 @@ int FunctionalTests::IsGISAXS07::analyseResults()
     const double threshold(2e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << m_name << " " << m_description << " " << (status_ok ? "[OK]" : "[FAILED]") << std::endl;
     return (status_ok ? 0 : 1);
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS082DDL/IsGISAXS082DDL.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS082DDL/IsGISAXS082DDL.cpp
index ddccf21bf50..83ae4af2831 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS082DDL/IsGISAXS082DDL.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS082DDL/IsGISAXS082DDL.cpp
@@ -6,6 +6,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -39,19 +40,11 @@ int FunctionalTests::IsGISAXS082DDL::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS082DDL2/IsGISAXS082DDL2.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS082DDL2/IsGISAXS082DDL2.cpp
index 52c1f778f7d..f9128facbb7 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS082DDL2/IsGISAXS082DDL2.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS082DDL2/IsGISAXS082DDL2.cpp
@@ -6,6 +6,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -39,19 +40,11 @@ int FunctionalTests::IsGISAXS082DDL2::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS09P/IsGISAXS09P.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS09P/IsGISAXS09P.cpp
index c8ed78222fb..6c68c27a1fd 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS09P/IsGISAXS09P.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS09P/IsGISAXS09P.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -40,19 +41,11 @@ int FunctionalTests::IsGISAXS09::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS09R/IsGISAXS09R.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS09R/IsGISAXS09R.cpp
index fd65882d1d9..e713372df69 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS09R/IsGISAXS09R.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS09R/IsGISAXS09R.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -40,19 +41,11 @@ int FunctionalTests::IsGISAXS09R::analyseResults()
     const double threshold(2e-10);
 
     // Calculating average relative difference.
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it =
-            m_result->begin(); it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     // Assess result.
 	bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp
index fb1e0d6f250..151a71ecf29 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp
@@ -10,6 +10,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 #include <iostream>
 #include <cmath>
@@ -44,18 +45,10 @@ int FunctionalTests::IsGISAXS10::analyseResults()
     const double threshold(2e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin();
-            it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     bool status_ok(true);
-    if( diff > threshold || MathFunctions::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << m_name << " " << m_description << " " <<
             (status_ok ? "[OK]" : "[FAILED]") << std::endl;
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS11/IsGISAXS11.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS11/IsGISAXS11.cpp
index da55cac7ae2..6757e0fd36b 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS11/IsGISAXS11.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS11/IsGISAXS11.cpp
@@ -12,6 +12,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -47,18 +48,10 @@ int FunctionalTests::IsGISAXS11::analyseResults()
     const double threshold(2e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin();
-            it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     bool status_ok(true);
-    if( diff > threshold || MathFunctions::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << m_name << " " << m_description << " " <<
             (status_ok ? "[OK]" : "[FAILED]") << std::endl;
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp
index 84fbc01a416..fbbb1008c54 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp
@@ -13,6 +13,7 @@
 #include "Utils.h"
 #include "MathFunctions.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 #include <iostream>
 #include <cmath>
 
@@ -46,18 +47,10 @@ int FunctionalTests::IsGISAXS15::analyseResults()
     const double threshold(2e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin();
-            it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     bool status_ok(true);
-    if( diff > threshold || MathFunctions::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << m_name << " " << m_description << " " <<
             (status_ok ? "[OK]" : "[FAILED]") << std::endl;
diff --git a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
index 17bdb4e26ec..052b78cfd01 100644
--- a/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
+++ b/Tests/FunctionalTests/TestCore/MesoCrystal1/MesoCrystal1.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "Types.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 using namespace FunctionalTests;
 
@@ -45,18 +46,10 @@ int MesoCrystal1::analyseResults()
     const double threshold(1e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin();
-            it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
diff --git a/Tests/FunctionalTests/TestCore/PolarizedDWBAZeroMag/PolarizedDWBAZeroMag.cpp b/Tests/FunctionalTests/TestCore/PolarizedDWBAZeroMag/PolarizedDWBAZeroMag.cpp
index 722166fb6ef..f76a130a8e5 100644
--- a/Tests/FunctionalTests/TestCore/PolarizedDWBAZeroMag/PolarizedDWBAZeroMag.cpp
+++ b/Tests/FunctionalTests/TestCore/PolarizedDWBAZeroMag/PolarizedDWBAZeroMag.cpp
@@ -6,6 +6,7 @@
 #include "Units.h"
 #include "Types.h"
 #include "SimulationRegistry.h"
+#include "OutputDataFunctions.h"
 
 using namespace FunctionalTests;
 
@@ -42,18 +43,10 @@ int PolarizedDWBAZeroMag::analyseResults()
     const double threshold(1e-10);
 
     // calculating average relative difference
-    *m_result -= *m_reference;
-    *m_result /= *m_reference;
-
-    double diff(0);
-    for(OutputData<double>::const_iterator it=m_result->begin();
-            it!=m_result->end(); ++it) {
-        diff+= std::fabs(*it);
-    }
-    diff /= m_result->getAllocatedSize();
+    double diff = OutputDataFunctions::GetDifference(*m_result,*m_reference);
 
     bool status_ok(true);
-    if( diff > threshold || std::isnan(diff)) status_ok=false;
+    if( diff > threshold ) status_ok=false;
 
     std::cout << " diff " << diff << std::endl;
     std::cout << m_name << " " << m_description << " " <<
-- 
GitLab