diff --git a/Core/Tools/inc/OutputDataFunctions.h b/Core/Tools/inc/OutputDataFunctions.h
index 10e4969612884952bfefddc8fba50a11d74f0c66..5ae6566de95a2b05f2abfc70a265c0a0ea76aa47 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 18ea7e13323fdc68f7b7767ab81a7ea64286b462..83678eb9141e10ba9a66a8dfa0141be9a24f80e5 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 25c5ee9b58316ea9a69f773daf0ceb5be319a709..56fa5f93737609b193e999a05023e8a7433e4fd9 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 d8516fee326ff637f1b899ce9ff5580e306fb906..57d8f4ce2441b13232f667c7e02e3dd654fa5aea 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 4d2479daa4e449ae648e7c9bd3a4e55bcde35564..dbf923becbf586cf350ea17300e9c3a848d76665 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 35d4cce9eed424f65b82846d3acfabe9119ba11c..4a019771877c31de269ce139ad9cb7153bdb9208 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 a73abde9b89470a8d4b10b465a0d5849d747f72c..b309783ce5243347e32287cf0ac19c32153feb33 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 8e4c868988438c264f7822339ab69dd9b2c07d6e..fe256e96147120eb7733dffd9784d9f49545373e 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 c9259141db9adc089e9e5ac1f5f5984e6391959f..622eafd92988e8ef8afe11d4df47b32f83f1ab0e 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 6cc0d3fadaeceab9dfd479add19623035d8cd295..1dadfbcae4efdfb30dc2c50cd233fed5e6e97210 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 56c0ab4bf6772f6c5ed1117062696ef20fdcdaa0..25edf329ae4929cfec1eb427f052e746a26801e4 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 72f9ab064765944445be227e18941e3c7dc918e0..cf34e6f5d4198e9795313a95a251e82ebc52dd3c 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 e540d38eeb5f22652a272569eab48fcf4b2159bc..46d107c925edbce65e827c6c4fca4d49814556c1 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 ddccf21bf50419194c07d22b1c267ad504a5cc21..83ae4af28314d258d87763c928dbc88f73b2a758 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 52c1f778f7d644a785ffe2e55228f18905135844..f9128facbb7da365620d467d62630fe05a23b11f 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 c8ed78222fb980af2ed0bc5c4c8ef7362e784ea0..6c68c27a1fda145101e12dd4eac70de0ee3f1c70 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 fd65882d1d95b3af2d6cc9fe825211ec713c20a8..e713372df69af9c55621d98d0c56b54291643e8c 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 fb1e0d6f250af2d0f3456f80c30d38fdc9980da4..151a71ecf29465733efbbb02d0c5a73ac765a2f3 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 da55cac7ae29951f2196fd28b0e2e8645db01ed4..6757e0fd36b2e99b5d10946736bb4e38d4032f34 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 84fbc01a416cc01de953eb21c5203a159d29c628..fbbb1008c54b9f2012fdd251afb7d203828e970a 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 17bdb4e26ec91198a2b3ffda6a579285d3857c70..052b78cfd01458266f3e243ec0de03644cdbad0f 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 722166fb6ef638adc72dcfc8143ce6c2655666ba..f76a130a8e5b5762ee19ef95028a088abc7a0ba3 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 << " " <<