Range.cxx

Go to the documentation of this file.
00001 
00012 #ifdef _MSC_VER
00013 // Include max() and min() missing from MicroSoft Visual C++.
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016 
00017 #include "Range.h"
00018 
00019 #include <algorithm>
00020 
00021 #include <cassert>
00022 #include <cmath>
00023 #include <ostream>
00024 
00025 #ifndef _MSC_VER
00026 using std::floor;
00027 #endif
00028 
00029 using std::ostream;
00030 using std::max;
00031 using std::min;
00032 using std::vector;
00033 
00034 using namespace hippodraw;
00035 
00036 Range::Range ( )
00037   : m_min( 0.0 ),
00038     m_max( 0.0 ),
00039     m_pos( DBL_MAX ),
00040     m_empty( true )
00041 {
00042 }
00043 
00044 Range::Range ( double x, double y, double p )
00045 {
00046 
00047   // x and y are being passed as 'nan' in some cases, leading to failure
00048   // of assertion below. I dont know why they are being passed as nan and
00049   // from where.
00050 
00051   if ( x > y ) {
00052     m_min = 0; 
00053     m_max = 0;
00054     m_pos = DBL_MAX;
00055     m_empty = true;
00056   }
00057   else{
00058     m_min = x; 
00059     m_max = y;
00060     m_pos = p;
00061     m_empty = false;
00062   }
00063 
00064   // This assertion is failing.
00065   //assert ( m_min <= m_max );
00066 
00067   //This is a dirty fix:
00068   if ( ! ( m_min <= m_max ) ){
00069     m_min = 0; 
00070     m_max = 0.1;
00071     m_pos = DBL_MAX;
00072     m_empty = true;
00073   }
00074 
00075   assert ( m_min <= m_max );
00076 
00077 }
00078 
00079 Range::
00080 Range ( const std::vector < double > & array )
00081 {
00082   setRange ( array.begin(), array.end () );
00083 }
00084 
00085 double
00086 Range::low() const
00087 {
00088   return m_min;
00089 }
00090 
00091 void
00092 Range::setLow ( double x )
00093 {
00094   m_min = x;
00095   assert ( m_min <= m_max );
00096 }
00097 
00098 double
00099 Range::high() const
00100 {
00101   return m_max;
00102 }
00103 
00104 void
00105 Range::setHigh ( double x )
00106 {
00107   m_max = x;
00108   assert ( m_min <= m_max );
00109 }
00110 
00111 double
00112 Range::pos() const
00113 {
00114   return m_pos;
00115 }
00116 
00117 void
00118 Range::setPos (double x)
00119 {
00120   m_pos = x;
00121   assert ( m_min <= m_max );
00122 }
00123 
00124 void 
00125 Range::setRange ( double low, double high, double pos )
00126 {
00127   m_min = low;
00128   m_max = high;
00129   m_pos = pos;
00130   assert ( m_min <= m_max );
00131 }
00132 
00133 void
00134 Range::setLength ( double val, bool high_hold )
00135 {
00136   if( high_hold ){
00137     m_min = m_max - val;
00138   } else {
00139     m_max = m_min + val;
00140   }
00141   assert ( m_min <= m_max );
00142 }
00143 
00144 bool
00145 Range::includes ( double val ) const
00146 {
00147   return val >= m_min && val <= m_max;
00148 }
00149 
00150 bool
00151 Range::
00152 excludes ( double value ) const
00153 {
00154   return value < m_min || value > m_max;
00155 }
00156 
00157 double
00158 Range::
00159 fraction ( double value ) const
00160 {
00161   return ( value - m_min ) / ( m_max - m_min );
00162 }
00163 
00164 void Range::setEmpty ( bool yes )
00165 {
00166   m_empty = yes;
00167 }
00168 
00169 void Range::setUnion ( const Range & range )
00170 {
00171   if ( m_empty ) {
00172     m_min = range.m_min;
00173     m_max = range.m_max;
00174     m_pos = range.m_pos;
00175     m_empty = false;
00176   }
00177   else {
00178     m_min = min ( m_min, range.m_min );
00179     m_max = max ( m_max, range.m_max );
00180     m_pos = min ( m_pos, range.m_pos );
00181   }
00182 
00183   assert ( m_min <= m_max );
00184 
00185 }
00186 
00187 void Range::setIntersect ( const Range & range )
00188 {
00189   if ( m_min > range.m_max || m_max < range.m_min ) return;
00190   m_min = max ( m_min, range.m_min );
00191   m_max = min ( m_max, range.m_max );
00192   m_pos = max ( m_pos, range.m_min );
00193   
00194   assert ( m_min <= m_max );
00195 }
00196 
00197 int
00198 Range::numberOfBins ( double width ) const
00199 {
00200   assert ( m_max > m_min );
00201   double number = (m_max - m_min) / width;
00202 
00203 #ifdef _MSC_VER
00204   return static_cast < int > ( number+0.5 );
00205 #else
00206   return static_cast < int > ( rint( number ) );
00207 #endif
00208 }

Generated for HippoDraw Class Library by doxygen