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 }