00001
00012 #include "LineProjector.h"
00013
00014 #include "axes/AxisModelBase.h"
00015 #include "datasrcs/NTuple.h"
00016
00017 using namespace hippodraw;
00018
00019 using std::string;
00020 using std::vector;
00021
00022 LineProjector::
00023 LineProjector ( hippodraw::Axes::Type axis, double value )
00024 : m_value ( value ),
00025 m_axis ( axis )
00026 {
00027 }
00028
00029 LineProjector::
00030 LineProjector ( const LineProjector & projector )
00031 : m_value ( projector.m_value ),
00032 m_axis ( projector.m_axis )
00033 {
00034 }
00035
00036 LineProjector::~LineProjector ()
00037 {
00038
00039 }
00040
00041 ProjectorBase * LineProjector::clone ()
00042 {
00043 return new LineProjector ( *this );
00044 }
00045
00046 void
00047 LineProjector::
00048 addPointReps()
00049 {
00050 }
00051 bool
00052 LineProjector::
00053 isEmpty () const
00054 {
00055 return false;
00056 }
00057
00058 Range
00059 LineProjector::
00060 dataRangeOn ( hippodraw::Axes::Type axis ) const
00061 {
00062 Range range;
00063 if ( m_axis == Axes::X ) {
00064 if ( axis == Axes::X ) {
00065 range.setRange ( m_value, m_value, m_value );
00066 }
00067 else if ( axis == Axes::Y ) {
00068 range = m_y_axis -> getRange ( false );
00069 }
00070 }
00071 else if ( m_axis == Axes::Y ) {
00072 if ( axis == Axes::X ) {
00073 range = m_x_axis -> getRange ( false );
00074 }
00075 else if ( axis == Axes::Y ) {
00076 range.setRange ( m_value, m_value, m_value );
00077 }
00078 }
00079
00080 return range;
00081 }
00082
00083 const std::string &
00084 LineProjector::
00085 getTitle() const
00086 {
00087 return m_title;
00088 }
00089
00090 Range
00091 LineProjector::
00092 valueRange () const
00093 {
00094 Range range;
00095 if ( m_axis == Axes::X ) {
00096 range = m_y_axis -> getRange ( false );
00097 }
00098 else {
00099 range = m_x_axis -> getRange ( false );
00100 }
00101
00102 return range;
00103 }
00104
00105 double
00106 LineProjector::
00107 getPosOn ( hippodraw::Axes::Type axis ) const
00108 {
00109 double pos = DBL_MIN;
00110 if ( m_axis == Axes::X ) {
00111 if ( axis == Axes::X ) {
00112 pos = std::max ( pos, m_value );
00113 }
00114 else if ( axis == Axes::Y ) {
00115 const Range & range = m_y_axis -> getRange ( false );
00116 pos = range.pos();
00117 }
00118 }
00119 else if ( m_axis == Axes::Y ) {
00120 if ( axis == Axes::X ) {
00121 const Range & range = m_x_axis -> getRange ( false );
00122 pos = range.pos();
00123 }
00124 else if ( axis == Axes::Y ) {
00125 pos = std::max ( pos, m_value );
00126 }
00127 }
00128
00129 return pos;
00130 }
00131
00132 const std::string &
00133 LineProjector::
00134 getXLabel() const
00135 {
00136 return m_title;
00137 }
00138
00139 const std::string &
00140 LineProjector::
00141 getYLabel( bool ) const
00142 {
00143 return m_title;
00144 }
00145
00146 int
00147 LineProjector::
00148 getNumberOfEntries () const
00149 {
00150 return 1;
00151 }
00152
00153 void LineProjector::prepareValues ()
00154 {
00155 m_proj_values = createNTuple ();
00156 fillProjectedValues ( m_proj_values );
00157
00158 setDirty ( false );
00159 }
00160
00161 namespace dp = hippodraw::DataPoint2DTuple;
00162
00163 DataSource *
00164 LineProjector::
00165 createNTuple () const
00166 {
00167 unsigned int columns = dp::SIZE;
00168 NTuple * ntuple = new NTuple ( columns );
00169 vector < string > labels;
00170
00171 labels.push_back ( "X" );
00172 labels.push_back ( "Y" );
00173 labels.push_back ( "nil" );
00174 labels.push_back ( "nil" );
00175
00176 ntuple -> setLabels ( labels );
00177
00178 fillProjectedValues ( ntuple );
00179
00180 return ntuple;
00181 }
00182
00183 void
00184 LineProjector::
00185 fillProjectedValues ( DataSource * ntuple, bool ) const
00186 {
00187 ntuple -> clear ();
00188
00189 vector < double > row ( dp::SIZE );
00190 row[dp::XERR] = 0.;
00191 row[dp::YERR] = 0.;
00192
00193 if ( m_axis == Axes::X ) {
00194 const Range & range = m_y_axis -> getRange ( false );
00195 row[dp::X] = m_value;
00196 row[dp::Y] = range.low ();
00197 ntuple -> addRow ( row );
00198 row[dp::Y] = range.high ();
00199 ntuple -> addRow ( row );
00200 }
00201 else {
00202 const Range & range = m_x_axis -> getRange ( false );
00203 row[dp::X] = range.low ();
00204 row[dp::Y] = m_value;
00205 ntuple -> addRow ( row );
00206 row[dp::X] = range.high ();
00207 ntuple -> addRow ( row );
00208 }
00209 }
00210
00211 void
00212 LineProjector::
00213 fillDataSource ( DataSource * ntuple, bool ) const
00214 {
00215 ntuple -> clear ();
00216
00217 vector < double > row ( dp::SIZE );
00218 row[dp::XERR] = 0.;
00219 row[dp::YERR] = 0.;
00220
00221 if ( m_axis == Axes::X ) {
00222 const Range & range = m_y_axis -> getRange ( false );
00223 row[dp::X] = m_value;
00224 row[dp::Y] = range.low ();
00225 ntuple -> addRow ( row );
00226 row[dp::Y] = range.high ();
00227 ntuple -> addRow ( row );
00228 }
00229 else {
00230 const Range & range = m_x_axis -> getRange ( false );
00231 row[dp::X] = range.low ();
00232 row[dp::Y] = m_value;
00233 ntuple -> addRow ( row );
00234 row[dp::X] = range.high ();
00235 ntuple -> addRow ( row );
00236 }
00237 }
00238
00239 void
00240 LineProjector::
00241 setValue ( double value )
00242 {
00243 m_value = value;
00244 }