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