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