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

Generated for HippoDraw Class Library by doxygen