Novosibirsk.cxx
Go to the documentation of this file.00001
00012 #ifdef _MSC_VER
00013 #include "msdevstudio/MSconfig.h"
00014 #endif
00015
00016 #include "Novosibirsk.h"
00017
00018 #include "FunctionHelper.h"
00019
00020 #include <cmath>
00021 #include <cassert>
00022
00023 using std::exp;
00024 using std::vector;
00025
00026 namespace {
00029 enum { norm = 0, mean = 1, sigma = 2,
00030 tail = 3 };
00031 }
00032
00033 using namespace hippodraw;
00034
00035 Novosibirsk::Novosibirsk ( )
00036 {
00037 initialize ();
00038 }
00039
00040 Novosibirsk::Novosibirsk ( double n, double m, double s, double t )
00041 {
00042 initialize ();
00043
00044 m_parms[norm] = n;
00045 m_parms[mean] = m;
00046 m_parms[sigma] = s;
00047 m_parms[tail] = t;
00048 }
00049
00050 void Novosibirsk::initialize ()
00051 {
00052 m_name = "Novosibirsk";
00053
00054 m_parm_names.push_back ( "Norm" );
00055 m_parm_names.push_back ( "Mean" );
00056 m_parm_names.push_back ( "Sigma" );
00057 m_parm_names.push_back ( "Tail" );
00058
00059 resize ();
00060 }
00061
00062 FunctionBase * Novosibirsk::clone () const
00063 {
00064 return new Novosibirsk ( *this );
00065 }
00066
00067 double Novosibirsk::operator () ( double x ) const
00068 {
00069
00070
00071 double qa=0,qb=0,qc=0,qx=0,qy=0;
00072 double result=0;
00073
00074 if(fabs(m_parms[tail]) < 1.e-7)
00075 qc = 0.5*pow((( x -m_parms[mean])/m_parms[sigma]),2);
00076 else {
00077 qa = m_parms[tail]*sqrt(log(4.));
00078 qb = sinh(qa)/qa;
00079 qx = ( x - m_parms[mean])/m_parms[sigma]*qb;
00080 qy = 1.+m_parms[tail]*qx;
00081
00082
00083
00084 if( qy > 1.E-7)
00085 qc = 0.5*(pow((log(qy)/m_parms[tail]),2) + m_parms[tail]*m_parms[tail]);
00086 else
00087 qc = 15.;
00088 }
00089
00090
00091 result = m_parms[norm] * exp(-qc);
00092
00093 return result;
00094 }
00095
00096 void
00097 Novosibirsk::
00098 initialParameters ( const FunctionHelper * helper )
00099 {
00100 double min_x = helper->minCoord ();
00101 double max_x = helper->maxCoord ();
00102 int size = helper->size();
00103 double total = helper->getTotal ();
00104
00105 m_parms[norm] = total * ( max_x - min_x ) / size;
00106 m_parms[mean] = helper->meanCoord ();
00107 m_parms[sigma] = helper->stdCoord ();
00108 m_parms[tail] = 0.;
00109 }
00110
00111 double
00112 Novosibirsk::
00113 derivByParm ( int , double ) const
00114 {
00115 assert ( false );
00116 return 0.;
00117 }
00118
00119 bool
00120 Novosibirsk::
00121 hasDerivatives () const
00122 {
00123 return false;
00124 }