From 1e3b36c951307c862b3f6ccc2a517446f5d56f1d Mon Sep 17 00:00:00 2001
From: Walter Van Herck <w.van.herck@fz-juelich.de>
Date: Mon, 5 Nov 2012 17:10:34 +0100
Subject: [PATCH] Added ChiSquaredFrequency (with dummy implementation)

---
 Core/Algorithms/inc/ChiSquaredFrequency.h   | 32 ++++++++++++++
 Core/Algorithms/src/ChiSquaredFrequency.cpp | 49 +++++++++++++++++++++
 Core/Core.pro                               |  2 +
 3 files changed, 83 insertions(+)
 create mode 100644 Core/Algorithms/inc/ChiSquaredFrequency.h
 create mode 100644 Core/Algorithms/src/ChiSquaredFrequency.cpp

diff --git a/Core/Algorithms/inc/ChiSquaredFrequency.h b/Core/Algorithms/inc/ChiSquaredFrequency.h
new file mode 100644
index 00000000000..877dd77ee1b
--- /dev/null
+++ b/Core/Algorithms/inc/ChiSquaredFrequency.h
@@ -0,0 +1,32 @@
+#ifndef CHISQUAREDFREQUENCY_H_
+#define CHISQUAREDFREQUENCY_H_
+// ********************************************************************
+// * The BornAgain project                                            *
+// * Simulation of neutron and x-ray scattering at grazing incidence  *
+// *                                                                  *
+// * LICENSE AND DISCLAIMER                                           *
+// * Lorem ipsum dolor sit amet, consectetur adipiscing elit.  Mauris *
+// * eget quam orci. Quisque  porta  varius  dui,  quis  posuere nibh *
+// * mollis quis. Mauris commodo rhoncus porttitor.                   *
+// ********************************************************************
+//! @file   ChiSquaredFrequency.h
+//! @brief  Definition of ChiSquaredFrequency class
+//! @author Scientific Computing Group at FRM II
+//! @date   Nov 5, 2012
+
+#include "IChiSquaredModule.h"
+
+class ChiSquaredFrequency : public IChiSquaredModule
+{
+public:
+    ChiSquaredFrequency(const OutputData<double> &real_data);
+    virtual ~ChiSquaredFrequency();
+
+    virtual double calculateChiSquared(const OutputData<double> *p_simulation_data=0);
+
+    //! return output data which contains chi^2 values
+    virtual OutputData<double > *createChi2DifferenceMap() const;
+};
+
+
+#endif /* CHISQUAREDFREQUENCY_H_ */
diff --git a/Core/Algorithms/src/ChiSquaredFrequency.cpp b/Core/Algorithms/src/ChiSquaredFrequency.cpp
new file mode 100644
index 00000000000..9a04212884f
--- /dev/null
+++ b/Core/Algorithms/src/ChiSquaredFrequency.cpp
@@ -0,0 +1,49 @@
+#include "ChiSquaredFrequency.h"
+
+ChiSquaredFrequency::ChiSquaredFrequency(const OutputData<double>& real_data)
+: IChiSquaredModule(real_data)
+{
+}
+
+ChiSquaredFrequency::~ChiSquaredFrequency()
+{
+}
+
+double ChiSquaredFrequency::calculateChiSquared(
+        const OutputData<double>* p_simulation_data)
+{
+    if (p_simulation_data!=0) {
+        setSimulationData(*p_simulation_data);
+    }
+    if (mp_simulation_data==0) {
+        throw LogicErrorException("No simulation data present for calculating chi squared.");
+    }
+    double result = 0.0;
+    size_t data_size = mp_real_data->getAllocatedSize();
+    initWeights();
+    OutputData<double> *p_difference = createChi2DifferenceMap();
+    mp_weights->resetIndex();
+    p_difference->resetIndex();
+    while(p_difference->hasNext()) {
+        result += p_difference->next()*mp_weights->next();
+    }
+    delete p_difference;
+    m_chi2_value = result/data_size;
+    return m_chi2_value;}
+
+OutputData<double>* ChiSquaredFrequency::createChi2DifferenceMap() const
+{
+    OutputData<double > *p_difference = mp_simulation_data->clone();
+    p_difference->setAllTo(0.0);
+
+    mp_simulation_data->resetIndex();
+    mp_real_data->resetIndex();
+    p_difference->resetIndex();
+    while (mp_real_data->hasNext()) {
+        double value_simu = mp_simulation_data->next();
+        double value_real = mp_real_data->next();
+        double squared_difference = mp_squared_function->calculateSquaredDifference(value_real, value_simu);
+        p_difference->next() = squared_difference;
+    }
+
+    return p_difference;}
diff --git a/Core/Core.pro b/Core/Core.pro
index 3fbc0073f47..47fab78f04c 100644
--- a/Core/Core.pro
+++ b/Core/Core.pro
@@ -18,6 +18,7 @@ QMAKE_EXTENSION_SHLIB = so
 # -----------------------------------------------------------------------------
 SOURCES += \
     Algorithms/src/Beam.cpp \
+    Algorithms/src/ChiSquaredFrequency.cpp \
     Algorithms/src/ChiSquaredModule.cpp \
     Algorithms/src/ConvolutionDetectorResolution.cpp \
     Algorithms/src/DecouplingApproximationStrategy.cpp \
@@ -120,6 +121,7 @@ SOURCES += \
 
 HEADERS += \
     Algorithms/inc/Beam.h \
+    Algorithms/inc/ChiSquaredFrequency.h \
     Algorithms/inc/ChiSquaredModule.h \
     Algorithms/inc/ConvolutionDetectorResolution.h \
     Algorithms/inc/DecouplingApproximationStrategy.h \
-- 
GitLab