CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_14/src/TopQuarkAnalysis/TopHitFit/src/Fit_Result_Vec.cc

Go to the documentation of this file.
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