00001
00012 #ifdef HAVE_CONFIG_H
00013 #include "config.h"
00014 #else
00015 #ifdef _MSC_VER
00016 #include "msdevstudio/MSconfig.h"
00017 #endif
00018 #endif
00019
00020 #include "ProjectorHelper.h"
00021 #include "datasrcs/DataPointTuple.h"
00022 #include "datasrcs/DataSource.h"
00023
00024 #include <algorithm>
00025 #include <numeric>
00026 #include <iterator>
00027
00028 #include <cmath>
00029
00030 using std::sqrt;
00031 using std::vector;
00032
00033 namespace dp = hippodraw::DataPoint2DTuple;
00034
00035 ProjectorHelper::
00036 ProjectorHelper ( const DataSource *ntuple )
00037 : m_ntuple ( ntuple )
00038 {
00039 }
00040
00041 int
00042 ProjectorHelper::
00043 size () const
00044 {
00045 return m_ntuple -> rows ();
00046 }
00047
00048 double
00049 ProjectorHelper::
00050 getTotal () const
00051 {
00052 return m_ntuple -> sum ( dp::Y );
00053 }
00054
00055 double
00056 ProjectorHelper::
00057 minCoord () const
00058 {
00059 const vector< double >& colCoord = m_ntuple -> getColumn( dp::X );
00060
00061 return *std::min_element( colCoord.begin(), colCoord.end() );
00062 }
00063
00064 double
00065 ProjectorHelper::
00066 maxCoord () const
00067 {
00068 const vector< double >& colCoord = m_ntuple -> getColumn( dp::X );
00069
00070 return *std::max_element( colCoord.begin(), colCoord.end() );
00071 }
00072
00073 double
00074 ProjectorHelper::
00075 minValue () const
00076 {
00077 const vector< double >& colValue = m_ntuple -> getColumn( dp::Y );
00078
00079 return *std::min_element( colValue.begin(), colValue.end() );
00080 }
00081
00082 double
00083 ProjectorHelper::
00084 maxValue () const
00085 {
00086 const vector< double >& colValue = m_ntuple -> getColumn( dp::Y );
00087
00088 return *std::max_element( colValue.begin(), colValue.end() );
00089 }
00090
00091 double
00092 ProjectorHelper::
00093 meanValue () const
00094 {
00095 const vector< double >& colValue = m_ntuple -> getColumn( dp::Y );
00096 double sum = 0.0;
00097 sum = std::accumulate( colValue.begin(), colValue.end(), sum );
00098
00099 return sum / colValue.size();
00100 }
00101
00102
00103 double
00104 ProjectorHelper::
00105 meanCoord () const
00106 {
00107 const vector<double>& colCoord = m_ntuple -> getColumn( dp::X );
00108 const vector<double>& colValue = m_ntuple -> getColumn( dp::Y );
00109
00110 double sumXY = 0.0;
00111 sumXY = std::inner_product( colCoord.begin(), colCoord.end(),
00112 colValue.begin(), sumXY );
00113 double sumY = 0.0;
00114 sumY = std::accumulate( colValue.begin(), colValue.end(), sumY );
00115
00116 return sumXY / sumY;
00117 }
00118
00119 double
00120 ProjectorHelper::
00121 stdCoord () const
00122 {
00123 const vector<double>& x = m_ntuple -> getColumn( dp::X );
00124 const vector<double>& y = m_ntuple -> getColumn( dp::Y );
00125
00126 double sumY = getTotal();
00127 double mean = meanCoord();
00128 double sumXXY = 0.0;
00129
00130 for( unsigned int i = 0; i < x.size(); i++)
00131 sumXXY += ( x[i] * x[i] * y[i] );
00132
00133 return sqrt ( sumXXY / sumY - mean * mean );
00134 }
00135
00136 double
00137 ProjectorHelper::
00138 valueAt( double x ) const
00139 {
00140 const vector<double>& colValue = m_ntuple -> getColumn( dp::Y );
00141 const vector<double>& colCoord = m_ntuple -> getColumn( dp::X );
00142
00143 double value = 0.0;
00144 bool is_set = false;
00145
00146 for ( unsigned int i = 1; i < colValue.size(); i++) {
00147 if ( colCoord[i-1] <= x && x <= colCoord[i] ) {
00148 value = colValue[i-1];
00149 is_set = true;
00150 }
00151 }
00152 if ( is_set == false ) {
00153 throw std::string("valueAt: x lies outside valid range.");
00154 }
00155
00156 return value;
00157 }