Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

NTupleSorter.cxx

Go to the documentation of this file.
00001 
00012 #include "NTupleSorter.h"
00013 
00014 #include "NTuple.h"
00015 
00016 #include <algorithm>
00017 #include <functional>
00018 #include <iterator>
00019 
00020 using std::distance;
00021 using std::greater;
00022 using std::sort;
00023 using std::vector;
00024 using std::lower_bound;
00025 
00026 NTupleSorter::
00027 NTupleSorter ( NTuple * ntuple )
00028   : m_column ( 0 ),
00029     m_increasing ( true ),
00030     m_ntuple ( ntuple )
00031 {
00032 }
00033 
00034 NTupleSorter::
00035 NTupleSorter ( const NTupleSorter & sorter )
00036   : m_column ( sorter.m_column ),
00037     m_increasing ( sorter.m_increasing ),
00038     m_ntuple ( 0 )
00039 {
00040 }
00041 
00042 NTuple *
00043 NTupleSorter::
00044 getNTuple () const
00045 {
00046   return m_ntuple;
00047 }
00048 
00049 void
00050 NTupleSorter::
00051 setSorting ( int column )
00052 {
00053   if ( column == m_column ) {
00054     m_increasing = ! m_increasing;
00055     return;
00056   }
00057   m_column = column;
00058   m_increasing = true;
00059 }
00060 
00061 void
00062 NTupleSorter::
00063 rowwiseCopy ( std::vector < std::vector < double > * > & row_copy )
00064 {
00065   row_copy.clear();
00066   unsigned int rows = m_ntuple -> rows ();
00067 
00068   for ( unsigned int row = 0; row < rows; row++ ) {
00069     const vector < double > & v = m_ntuple -> getRow ( row );
00070     vector < double > * p = new vector < double > ( v );
00071     row_copy.push_back ( p );
00072   }
00073 }
00074 
00075 bool 
00076 NTupleSorter::
00077 operator () ( std::vector < double > * x,
00078               std::vector < double > * y ) const
00079 {
00080   double left = x -> operator[] ( m_column );
00081   double right = y -> operator[] ( m_column );
00082 
00083   return m_increasing ? left < right : right < left;
00084 }
00085 
00086 void
00087 NTupleSorter::
00088 sort ( )
00089 {
00090   vector < vector < double > * > table;
00091   rowwiseCopy ( table );
00092 
00093   std::sort ( table.begin(), table.end(), *this );
00094 
00095   m_ntuple -> clear ();
00096 
00097   vector < vector < double > * > :: iterator first = table.begin ();
00098   while ( first != table.end () ) {
00099     vector < double > * p = *first++;
00100     m_ntuple -> addRow ( *p );
00101     delete p;
00102   }
00103   m_ntuple ->notifyObservers();
00104 }
00105 
00106 void
00107 NTupleSorter::
00108 clear ()
00109 {
00110   m_ntuple->clear();
00111 }
00112 
00113 void
00114 NTupleSorter::
00115 addRow ( const std::vector < double > & row )
00116 {
00117   double sort_value = row[m_column];
00118 
00119   const vector < double > & column = m_ntuple ->getColumn ( m_column );
00120   vector < double > ::const_iterator first;
00121 
00122   if ( m_increasing ) {
00123     first = lower_bound ( column.begin(), column.end(), sort_value );
00124   }
00125   else {
00126     first = lower_bound ( column.begin(), column.end(),
00127                           sort_value, greater< double >() );
00128   }
00129   unsigned int index = distance ( column.begin(), first );
00130 
00131   m_ntuple->insertRow ( index, row );
00132 }
00133 
00134 void
00135 NTupleSorter::
00136 eraseRow ( unsigned int index )
00137 {
00138   m_ntuple -> eraseRow ( index );
00139 }
00140 
00141 unsigned int
00142 NTupleSorter::
00143 columns ( ) const
00144 {
00145   return m_ntuple->columns ();
00146 }
00147 
00148 unsigned int
00149 NTupleSorter::
00150 rows ( ) const
00151 {
00152   return m_ntuple->rows ();
00153 }
00154 
00155 const vector < double > &
00156 NTupleSorter::
00157 getRow ( unsigned int index ) const
00158 {
00159   return m_ntuple->getRow ( index );
00160 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3