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, //< FWHM/2.36
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 //---- If tail is small then Gauss
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     //---- Cutting curve from right side
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 }

Generated for HippoDraw Class Library by doxygen