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 using namespace hippodraw;
00027 
00028 Novosibirsk::Novosibirsk ( )
00029 {
00030   initialize ();
00031 }
00032 
00033 Novosibirsk::Novosibirsk ( double n, double m, double s, double t )
00034 {
00035   initialize ();
00036   
00037   m_parms[norm] = n;
00038   m_parms[mean] = m;
00039   m_parms[sigma] = s;
00040   m_parms[tail] = t;
00041 }
00042 
00043 void Novosibirsk::initialize ()
00044 {
00045   m_name = "Novosibirsk";
00046 
00047   m_parm_names.push_back ( "Norm" );
00048   m_parm_names.push_back ( "Mean" );
00049   m_parm_names.push_back ( "Sigma" );
00050   m_parm_names.push_back ( "Tail" );
00051 
00052   resize ();
00053 }
00054 
00055 FunctionBase * Novosibirsk::clone () const
00056 {
00057   return new Novosibirsk ( *this );
00058 }
00059 
00060 double Novosibirsk::operator () ( double x ) const
00061 {
00062 //---- If tail is small then Gauss
00063 
00064   double  qa=0,qb=0,qc=0,qx=0,qy=0;
00065   double result=0;
00066 
00067   if(fabs(m_parms[tail]) < 1.e-7)
00068     qc = 0.5*pow((( x -m_parms[mean])/m_parms[sigma]),2);
00069   else {
00070     qa = m_parms[tail]*sqrt(log(4.));
00071     qb = sinh(qa)/qa;
00072     qx = ( x - m_parms[mean])/m_parms[sigma]*qb;
00073     qy = 1.+m_parms[tail]*qx;
00074 
00075     //---- Cutting curve from right side
00076 
00077     if( qy > 1.E-7)
00078       qc = 0.5*(pow((log(qy)/m_parms[tail]),2) + m_parms[tail]*m_parms[tail]);
00079     else
00080       qc = 15.;
00081   }
00082   //----
00083 
00084   result =  m_parms[norm] * exp(-qc);
00085 
00086   return result;
00087 }
00088 
00089 void 
00090 Novosibirsk::
00091 initialParameters ( const FunctionHelper * helper )
00092 {
00093   double min_x = helper->minCoord ();
00094   double max_x = helper->maxCoord ();
00095   int size = helper->size();
00096   double total = helper->getTotal ();
00097 
00098   m_parms[norm] = total * ( max_x - min_x ) / size;
00099   m_parms[mean] = helper->meanCoord ();
00100   m_parms[sigma] = helper->stdCoord ();
00101   m_parms[tail] = 0.;
00102 }
00103 
00104 double
00105 Novosibirsk::
00106 derivByParm ( int , double ) const
00107 {
00108   assert ( false );
00109   return 0.;
00110 }
00111 
00112 bool
00113 Novosibirsk::
00114 hasDerivatives () const
00115 {
00116   return false;
00117 }

Generated for HippoDraw Class Library by doxygen