00001 // 00002 // $Id: Fit_Result_Vec.cc,v 1.1 2011/05/26 09:47:00 mseidel Exp $ 00003 // 00004 // File: src/Fit_Result_Vec.cc 00005 // Purpose: Hold a set of Fit_Result structures. 00006 // Created: Jul, 2000, sss, based on run 1 mass analysis code. 00007 // 00008 // CMSSW File : src/Fit_Result_Vec.cc 00009 // Original Author : Scott Stuart Snyder <snyder@bnl.gov> for D0 00010 // Imported to CMSSW by Haryo Sumowidagdo <Suharyo.Sumowidagdo@cern.ch> 00011 // 00012 00037 #include "TopQuarkAnalysis/TopHitFit/interface/Fit_Result_Vec.h" 00038 #include "TopQuarkAnalysis/TopHitFit/interface/Fit_Result.h" 00039 #include <cassert> 00040 #include <ostream> 00041 #include <algorithm> 00042 00043 00044 using std::ostream; 00045 using std::vector; 00046 using std::lower_bound; 00047 00048 00049 namespace hitfit { 00050 00051 00052 Fit_Result_Vec::Fit_Result_Vec (std::vector<Fit_Result*>::size_type max_len) 00053 // 00054 // Purpose Constructor. 00055 // 00056 // Inputs: 00057 // max_len - The maximum length of the vector. 00058 // 00059 : _max_len (max_len) 00060 { 00061 assert (max_len > 0); 00062 _v.reserve (max_len + 1); 00063 } 00064 00065 00066 Fit_Result_Vec::Fit_Result_Vec (const Fit_Result_Vec& vec) 00067 // 00068 // Purpose: Copy constructor. 00069 // 00070 // Inputs: 00071 // vec - The vector to copy. 00072 // 00073 : _v (vec._v), 00074 _max_len (vec._max_len) 00075 { 00076 // Gotta increase the reference count on the contents. 00077 for (std::vector<Fit_Result*>::size_type i=0; i < _v.size(); i++) 00078 _v[i]->incref (); 00079 } 00080 00081 00082 Fit_Result_Vec::~Fit_Result_Vec () 00083 // 00084 // Purpose: Destructor. 00085 // 00086 { 00087 for (std::vector<Fit_Result*>::size_type i=0; i < _v.size(); i++) 00088 _v[i]->decref (); 00089 } 00090 00091 00092 Fit_Result_Vec& Fit_Result_Vec::operator= (const Fit_Result_Vec& vec) 00093 // 00094 // Purpose: Assignment. 00095 // 00096 // Inputs: 00097 // vec - The vector to copy. 00098 // 00099 // Returns: 00100 // This object. 00101 // 00102 { 00103 for (std::vector<Fit_Result*>::size_type i=0; i < _v.size(); i++) 00104 _v[i]->decref (); 00105 _v = vec._v; 00106 _max_len = vec._max_len; 00107 for (std::vector<Fit_Result*>::size_type i=0; i < _v.size(); i++) 00108 _v[i]->incref (); 00109 return *this; 00110 } 00111 00112 00113 std::vector<Fit_Result*>::size_type Fit_Result_Vec::size () const 00114 // 00115 // Purpose: Get back the number of results in the vector. 00116 // 00117 // Returns: 00118 // The number of results in the vector. 00119 // 00120 { 00121 return _v.size (); 00122 } 00123 00124 00125 const Fit_Result& Fit_Result_Vec::operator[] (std::vector<Fit_Result*>::size_type i) const 00126 // 00127 // Purpose: Get back the Ith result in the vector. 00128 // 00129 // Inputs: 00130 // i - The index of the desired result. 00131 // 00132 // Returns: 00133 // The Ith result. 00134 // 00135 { 00136 assert (i < _v.size()); 00137 return *_v[i]; 00138 } 00139 00140 00141 namespace { 00142 00143 00144 struct Compare_Fitresptr 00145 // 00146 // Purpose: Helper for push(). 00147 // 00148 { 00149 bool operator() (const Fit_Result* a, const Fit_Result* b) const 00150 { 00151 return *a < *b; 00152 } 00153 }; 00154 00155 00156 } // unnamed namespace 00157 00158 00159 void Fit_Result_Vec::push (Fit_Result* res) 00160 // 00161 // Purpose: Add a new result to the vector. 00162 // 00163 // Inputs: 00164 // res - The result to add. 00165 // 00166 { 00167 // Find where to add it. 00168 vector<Fit_Result*>::iterator it = lower_bound (_v.begin(), 00169 _v.end(), 00170 res, 00171 Compare_Fitresptr()); 00172 00173 // Insert it. 00174 _v.insert (it, res); 00175 res->incref (); 00176 00177 // Knock off the guy at the end if we've exceeded our maximum size. 00178 if (_v.size() > _max_len) { 00179 _v.back()->decref (); 00180 _v.erase (_v.end()-1); 00181 } 00182 } 00183 00184 00193 std::ostream& operator<< (std::ostream& s, const Fit_Result_Vec& resvec) 00194 // 00195 // Purpose: Print the object to S. 00196 // 00197 // Inputs: 00198 // s - The stream to which to write. 00199 // resvec - The object to write. 00200 // 00201 // Returns: 00202 // The stream S. 00203 // 00204 { 00205 for (std::vector<Fit_Result*>::size_type i=0; i < resvec._v.size(); i++) 00206 s << "Entry " << i << "\n" << *resvec._v[i]; 00207 return s; 00208 } 00209 00210 00211 } // namespace hitfit