From 86165938aba81d2d6c2a1f6678bfc7cf416cd714 Mon Sep 17 00:00:00 2001
From: pospelov <pospelov@fz-juelich.de>
Date: Mon, 1 Oct 2012 14:17:52 +0200
Subject: [PATCH] FresnelCoeff now takes roughness in the account

---
 App/src/TestFresnelCoeff.cpp                  |  8 ++--
 Core/Algorithms/inc/OpticalFresnel.h          |  4 +-
 Core/Algorithms/src/OpticalFresnel.cpp        | 14 +++++--
 Core/Tools/src/FitMultiParameter.cpp          |  5 ++-
 Core/Tools/src/FitParameter.cpp               |  3 +-
 .../ex02_fitspheres/edf_reader.py             | 40 ++++---------------
 6 files changed, 31 insertions(+), 43 deletions(-)

diff --git a/App/src/TestFresnelCoeff.cpp b/App/src/TestFresnelCoeff.cpp
index c1f4591b888..033228cd38b 100644
--- a/App/src/TestFresnelCoeff.cpp
+++ b/App/src/TestFresnelCoeff.cpp
@@ -240,8 +240,8 @@ void TestFresnelCoeff::draw_standard_samples()
 /* ************************************************************************* */
 void TestFresnelCoeff::test_roughness_set()
 {
-//    m_sample = dynamic_cast<MultiLayer *>(SampleFactory::createSample("MultilayerOffspecTestcase1a"));
-    m_sample = dynamic_cast<MultiLayer *>(SampleFactory::createSample("SubstrateOnSubstrate"));
+    m_sample = dynamic_cast<MultiLayer *>(SampleFactory::createSample("MultilayerOffspecTestcase1a"));
+//    m_sample = dynamic_cast<MultiLayer *>(SampleFactory::createSample("SubstrateOnSubstrate"));
 
     std::cout << *m_sample << std::endl;
     std::cout << "-----" << std::endl;
@@ -257,7 +257,7 @@ void TestFresnelCoeff::test_roughness_set()
 
 //    multipar.addMatchedParametersFromPool("/multilayer/interface0/roughness/sigma",newpool);
     multipar.addMatchedParametersFromPool("/*/*/*/sigma",newpool);
-    std::cout << multipar << std::endl;
+    std::cout << "multipar: " << multipar << std::endl;
 //    multipar.setValue(0.0);
 
     std::cout << *m_sample << std::endl;
@@ -275,7 +275,7 @@ void TestFresnelCoeff::test_roughness_set()
         kvec.setLambdaAlphaPhi(1.54*Units::angstrom, -alpha_i, 0.0);
         OpticalFresnel::MultiLayerCoeff_t coeffs;
         OpticalFresnel fresnelCalculator;
-        fresnelCalculator.execute(*m_sample, kvec, coeffs, true);
+        fresnelCalculator.execute(*m_sample, kvec, coeffs);
         m_coeffs->next() = coeffs;
         //std::cout << alpha_i << " " << roughness << " " << coeffs[0].R << std::endl;
     }
diff --git a/Core/Algorithms/inc/OpticalFresnel.h b/Core/Algorithms/inc/OpticalFresnel.h
index c92ddbbaf9e..9f2bbd1dd01 100644
--- a/Core/Algorithms/inc/OpticalFresnel.h
+++ b/Core/Algorithms/inc/OpticalFresnel.h
@@ -52,10 +52,10 @@ public:
         MultiLayerCoeff_t m_data;
     };
 
-    int execute(const MultiLayer &sample, const kvector_t &k, MultiLayerCoeff_t &coeff, bool useRoughness=false);
-    int execute(const MultiLayer &sample, const kvector_t &k, MultiLayerCoeff &coeff, bool useRoughness=false) { return execute(sample,k,coeff.m_data, useRoughness); }
+    int execute(const MultiLayer &sample, const kvector_t &k, MultiLayerCoeff_t &coeff);
 
 private:
+    bool m_use_roughness;
 
     void calculateKZ(const MultiLayer &sample, const kvector_t &k, MultiLayerCoeff_t &coeff);
     void calculateFresnelCoefficients(MultiLayerCoeff_t &coeff);
diff --git a/Core/Algorithms/src/OpticalFresnel.cpp b/Core/Algorithms/src/OpticalFresnel.cpp
index aa677f905ce..6849fc8ce35 100644
--- a/Core/Algorithms/src/OpticalFresnel.cpp
+++ b/Core/Algorithms/src/OpticalFresnel.cpp
@@ -5,19 +5,27 @@
 
 
 
-OpticalFresnel::OpticalFresnel()
+OpticalFresnel::OpticalFresnel() : m_use_roughness(false)
 {
 }
 
 
-int OpticalFresnel::execute(const MultiLayer &sample, const kvector_t &kvec, MultiLayerCoeff_t &coeff, bool useRoughness)
+int OpticalFresnel::execute(const MultiLayer &sample, const kvector_t &kvec, MultiLayerCoeff_t &coeff)
 {
     coeff.clear();
     coeff.resize(sample.getNumberOfLayers());
 
     calculateKZ(sample, kvec, coeff);
 
-    if(useRoughness) {
+    // check if there is a roughness
+    for (size_t i=0; i<sample.getNumberOfInterfaces(); ++i) {
+        if(sample.getLayerInterface(i)->getRoughness() ) {
+            m_use_roughness = true;
+            break;
+        }
+    }
+
+    if(m_use_roughness) {
         calculateFresnelCoefficientsWithRoughness(sample, coeff);
     } else{
         calculateFresnelCoefficients(coeff);
diff --git a/Core/Tools/src/FitMultiParameter.cpp b/Core/Tools/src/FitMultiParameter.cpp
index 93267732b22..709ca7f07ec 100644
--- a/Core/Tools/src/FitMultiParameter.cpp
+++ b/Core/Tools/src/FitMultiParameter.cpp
@@ -3,7 +3,7 @@
 
 FitMultiParameter::FitMultiParameter()
 {
-
+    setName("FitMultiParameter");
 }
 
 /* ************************************************************************* */
@@ -34,13 +34,16 @@ void FitMultiParameter::addParameterFromPool(std::string parkey, const Parameter
 void FitMultiParameter::addMatchedParametersFromPool(std::string wildcards, const ParameterPool *pool)
 {
     // loop over all parameters in the pool
+    int n_added_pars(0);
     for(ParameterPool::const_iterator_t it=pool->begin(); it!= pool->end(); it++) {
         // (*it).first - parameter key, (*it).second - parameter itself
         // parameters whose key match pattern is added to the FitMultiParameter container
         if( Utils::StringMatchText::WildcardPattern( (*it).first, wildcards ) ) {
             addParameter((*it).second);
+            n_added_pars++;
         }
     }
+    if(n_added_pars==0) std::cout << "FitMultiParameter::addMatchedParametersFromPool() -> Warning! No parameters satisfying  criteria'" << wildcards << "' have been found" << std::endl;
 }
 
 
diff --git a/Core/Tools/src/FitParameter.cpp b/Core/Tools/src/FitParameter.cpp
index ab122f0b1ed..c2aa5581af8 100644
--- a/Core/Tools/src/FitParameter.cpp
+++ b/Core/Tools/src/FitParameter.cpp
@@ -4,12 +4,13 @@
 
 FitParameter::FitParameter() : m_value(0), m_error(0), m_lower_limit(0), m_upper_limit(0)
 {
-
+    setName("FitParameter");
 }
 
 
 FitParameter::FitParameter(const FitParameter &other) : INamed(other)
 {
+    setName("FitParameter");
     m_value = other.m_value;
     m_error = other.m_error;
     m_lower_limit = other.m_lower_limit;
diff --git a/Examples/MesoCrystals/ex02_fitspheres/edf_reader.py b/Examples/MesoCrystals/ex02_fitspheres/edf_reader.py
index a87922917e8..48317f83665 100644
--- a/Examples/MesoCrystals/ex02_fitspheres/edf_reader.py
+++ b/Examples/MesoCrystals/ex02_fitspheres/edf_reader.py
@@ -1,9 +1,8 @@
 #-*- coding: utf8 -*-
-import os
-import sys
 from numpy import *
 
-h_c=1.23984193*1e-6/1e-10
+h_c=1.239842E4 #eV⋅Å
+
 
 def read_edf_header(file_handler):
   '''
@@ -19,7 +18,7 @@ def read_edf_header(file_handler):
       key=key.strip()
       value=value.strip().rstrip(';').strip()
       settings[key]=value
-    #header_lines.append(line)
+    header_lines.append(line)
     line=file_handler.readline()
   header_lines.append(line)
   # Read some settings
@@ -33,14 +32,13 @@ def read_edf_header(file_handler):
     settings['SampleDistance']=float(settings['SampleDistance'].rstrip('m'))*1000.
   if 'Monochromator_energy' in settings:
     energy=float(settings['Monochromator_energy'].rstrip('keV'))*1000.
-    print "XXX",energy
     settings['lambda']=h_c/energy
   if  'WaveLength' in settings:
     settings['lambda']=float(settings['WaveLength'].rstrip('m'))*1e10
-  if 'Exposure_time' in settings:
-    settings['Exposure_time']=float(settings['Exposure_time'].rstrip('ms'))/1000.
   if 'ExposureTime' in settings:
     settings['ExposureTime']=float(settings['ExposureTime'].rstrip('s (Seconds)'))
+  if 'Exposure_time' in settings:
+    settings['ExposureTime']=float(settings['Exposure_time'].rstrip('ms'))/1000.
   if 'NormalizationFactor' in settings:
     settings['NormalizationFactor']=float(settings['NormalizationFactor'])
   if 'Center_1' in settings:
@@ -71,11 +69,11 @@ def import_edf_file(file_name):
     input_array=array_module.array('H')
     input_array=fromstring(file_handler.read(header_settings['xdim']*header_settings['ydim']*2), 
                            uint16).astype(float)
-    input_array-=-200
+    input_array-=200
   elif header_settings['DataType']=='SignedInteger':
     # load data as binary integer values
-    input_array=fromstring(file_handler.read(header_settings['xdim']*header_settings['ydim']*2), 
-                           int16).astype(float)
+    input_array=fromstring(file_handler.read(header_settings['xdim']*header_settings['ydim']*4), 
+                           int32).astype(float)
   elif header_settings['DataType']=='FloatValue':
     # load data as binary integer values
     input_array=fromstring(file_handler.read(header_settings['xdim']*header_settings['ydim']*4), 
@@ -85,25 +83,3 @@ def import_edf_file(file_name):
     raise IOError, 'Unknown data format in header: %s'%header_settings['DataType']
   file_handler.close()
   return input_array.reshape(header_settings['ydim'], header_settings['xdim']), header_settings
-
-
-def main():
-  if len(sys.argv)!=2:
-    print "Usage: 'python edf_reader.py FileName' "
-    print " "
-
-  else:
-    data=import_edf_file( sys.argv[1] )
-    print data[1]
-    print data[0].shape
-    #savetxt("foo.csv.gz", data[0], fmt='%1.10e', delimiter=" ")
-
-
-
-
-#-------------------------------------------------------------
-# main()
-#-------------------------------------------------------------
-if __name__ == '__main__':
-  main()
-
-- 
GitLab