Go to the documentation of this file.00001
00012 #ifdef _MSC_VER
00013 #include "msdevstudio/MSconfig.h"
00014 #endif
00015
00016 #include "Landau.h"
00017
00018 #include "FunctionHelper.h"
00019
00020 #include <cmath>
00021 #include <cassert>
00022
00023 using std::distance;
00024
00025 #ifdef ITERATOR_MEMBER_DEFECT
00026 using namespace std;
00027 #else
00028 using std::exp;
00029 using std::vector;
00030 #endif
00031
00032 namespace hippodraw {
00033
00034 Landau::Landau ( )
00035 {
00036 initialize ();
00037 }
00038
00039 Landau::Landau ( double p, double c, double s )
00040 {
00041 initialize ();
00042
00043 m_parms[peak] = p;
00044 m_parms[norm] = c;
00045 m_parms[sigma] = s;
00046 }
00047
00048 void Landau::initialize ()
00049 {
00050 m_name = "Landau";
00051
00052 m_parm_names.push_back ( "Peak" );
00053 m_parm_names.push_back ( "Normalization" );
00054 m_parm_names.push_back ( "Sigma" );
00055
00056 resize ();
00057 }
00058
00059 FunctionBase * Landau::clone () const
00060 {
00061 return new Landau ( *this );
00062 }
00063
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 double Landau::operator () ( double x ) const
00082 {
00083 double y = calcY ( x );
00084 double t = exp ( -0.5 * ( y + exp ( -1.0 * y ) ) )
00085 / sqrt ( 2.0 * M_PI );
00086
00087 return m_parms[norm] * t;
00088 }
00089
00090
00091 void
00092 Landau::
00093 initialParameters ( const FunctionHelper * helper )
00094 {
00095 m_parms[norm] = helper->maxValue () * sqrt ( 2.0 * M_PI * M_E );
00096 m_parms[peak] = helper->meanCoord ();
00097 m_parms[sigma] = helper->stdCoord ();
00098 }
00099
00100 double Landau::derivByParm ( int i, double x ) const
00101 {
00102 switch ( i ) {
00103 case peak :
00104 return derivByPeak ( x );
00105 break;
00106
00107 case norm :
00108 return derivByNorm ( x );
00109 break;
00110
00111 case sigma :
00112 return derivBySigma ( x );
00113 break;
00114
00115 default :
00116 assert ( false );
00117 break;
00118 }
00119 return 0.0;
00120 }
00121
00122 double Landau::derivByNorm ( double x ) const
00123 {
00124 double norm_aux = 0.0001;
00125 if(m_parms[norm] != 0) norm_aux = m_parms[norm];
00126 return operator () (x) / norm_aux;
00127 }
00128
00129 double Landau::derivByPeak ( double x ) const
00130 {
00131 return operator () ( x ) * calcZ ( x ) * ( ( -1.0 ) / m_parms[sigma] );
00132 }
00133
00134 double Landau::derivBySigma ( double x ) const
00135 {
00136 return operator () ( x ) * calcZ ( x )
00137 * ( - ( x - m_parms[peak] ) / ( m_parms[sigma] * m_parms[sigma] ) );
00138 }
00139
00140 }
00141