Novosibirsk.cxx
Go to the documentation of this file.
1 
12 #ifdef _MSC_VER
13 #include "msdevstudio/MSconfig.h"
14 #endif
15 
16 #include "Novosibirsk.h"
17 
18 #include "FunctionHelper.h"
19 
20 #include <cmath>
21 #include <cassert>
22 
23 using std::exp;
24 using std::vector;
25 
26 using namespace hippodraw;
27 
29 {
30  initialize ();
31 }
32 
33 Novosibirsk::Novosibirsk ( double n, double m, double s, double t )
34 {
35  initialize ();
36 
37  m_parms[norm] = n;
38  m_parms[mean] = m;
39  m_parms[sigma] = s;
40  m_parms[tail] = t;
41 }
42 
44 {
45  m_name = "Novosibirsk";
46 
47  m_parm_names.push_back ( "Norm" );
48  m_parm_names.push_back ( "Mean" );
49  m_parm_names.push_back ( "Sigma" );
50  m_parm_names.push_back ( "Tail" );
51 
52  resize ();
53 }
54 
56 {
57  return new Novosibirsk ( *this );
58 }
59 
60 double Novosibirsk::operator () ( double x ) const
61 {
62 //---- If tail is small then Gauss
63 
64  double qa=0,qb=0,qc=0,qx=0,qy=0;
65  double result=0;
66 
67  if(fabs(m_parms[tail]) < 1.e-7)
68  qc = 0.5*pow((( x -m_parms[mean])/m_parms[sigma]),2);
69  else {
70  qa = m_parms[tail]*sqrt(log(4.));
71  qb = sinh(qa)/qa;
72  qx = ( x - m_parms[mean])/m_parms[sigma]*qb;
73  qy = 1.+m_parms[tail]*qx;
74 
75  //---- Cutting curve from right side
76 
77  if( qy > 1.E-7)
78  qc = 0.5*(pow((log(qy)/m_parms[tail]),2) + m_parms[tail]*m_parms[tail]);
79  else
80  qc = 15.;
81  }
82  //----
83 
84  result = m_parms[norm] * exp(-qc);
85 
86  return result;
87 }
88 
89 void
92 {
93  double min_x = helper->minCoord ();
94  double max_x = helper->maxCoord ();
95  int size = helper->size();
96  double total = helper->getTotal ();
97 
98  m_parms[norm] = total * ( max_x - min_x ) / size;
99  m_parms[mean] = helper->meanCoord ();
100  m_parms[sigma] = helper->stdCoord ();
101  m_parms[tail] = 0.;
102 }
103 
104 double
106 derivByParm ( int , double ) const
107 {
108  assert ( false );
109  return 0.;
110 }
111 
112 bool
115 {
116  return false;
117 }

Generated for HippoDraw Class Library by doxygen