CMS 3D CMS Logo

MultiVertexReconstructor.cc

Go to the documentation of this file.
00001 #include "RecoVertex/MultiVertexFit/interface/MultiVertexReconstructor.h"
00002 
00003 using namespace std;
00004 
00005 namespace {
00006   typedef MultiVertexFitter::TrackAndWeight TrackAndWeight;
00007 
00008   int verbose()
00009   {
00010     return 0;
00011   }
00012 
00013   void remove ( vector < TransientVertex > & vtces,
00014                 const vector < reco::TransientTrack > & trks )
00015   {
00016     cout << "[MultiVertexReconstructor] fixme remove not yet implemented" << endl;
00017     // remove trks from vtces
00018   }
00019 
00020   vector < vector < TrackAndWeight > > recover (
00021       const vector < TransientVertex > & vtces, const vector < reco::TransientTrack > & trks )
00022   {
00023     set < reco::TransientTrack > st;
00024     for ( vector< reco::TransientTrack >::const_iterator i=trks.begin(); 
00025           i!=trks.end() ; ++i )
00026     {
00027       st.insert ( *i );
00028     }
00029     
00030     vector < vector < TrackAndWeight > > bundles;
00031     for ( vector< TransientVertex >::const_iterator vtx=vtces.begin();
00032           vtx!=vtces.end() ; ++vtx )
00033     {
00034       vector < reco::TransientTrack > trks = vtx->originalTracks();
00035       vector < TrackAndWeight > tnws;
00036       for ( vector< reco::TransientTrack >::const_iterator trk=trks.begin(); 
00037             trk!=trks.end() ; ++trk )
00038       {
00039         float w = vtx->trackWeight ( *trk ); 
00040         if ( w > 1e-5 )
00041         {
00042           TrackAndWeight tmp ( *trk, w );
00043           set < reco::TransientTrack >::iterator pos = st.find( *trk );
00044           if ( pos != st.end() )
00045           {
00046             st.erase ( pos  );
00047           }
00048           tnws.push_back ( tmp );
00049         };
00050       };
00051       bundles.push_back ( tnws );
00052     };
00053 
00054     if ( bundles.size() == 0 ) return bundles;
00055 
00056     // now add not-yet assigned tracks
00057     for ( set < reco::TransientTrack >::const_iterator i=st.begin(); 
00058           i!=st.end() ; ++i )
00059     {
00060       // cout << "[MultiVertexReconstructor] recovering " << i->id() << endl;
00061       TrackAndWeight tmp ( *i, 0. );
00062       bundles[0].push_back ( tmp );
00063     }
00064     return bundles;
00065   }
00066 }
00067 
00068 MultiVertexReconstructor::MultiVertexReconstructor ( 
00069     const VertexReconstructor & o, const AnnealingSchedule & s, float revive  ) : 
00070     theOldReconstructor ( o.clone() ), theFitter ( 
00071         MultiVertexFitter ( s, DefaultLinearizationPointFinder(), revive ) )
00072 {
00073 }
00074 
00075 MultiVertexReconstructor::~MultiVertexReconstructor()
00076 {
00077   delete theOldReconstructor;
00078 }
00079 
00080 MultiVertexReconstructor * MultiVertexReconstructor::clone() const
00081 {
00082   return new MultiVertexReconstructor ( * this );
00083 }
00084 
00085 MultiVertexReconstructor::MultiVertexReconstructor ( 
00086     const MultiVertexReconstructor & o ) :
00087   theOldReconstructor ( o.theOldReconstructor->clone() ),
00088   theFitter ( o.theFitter )
00089 {}
00090 
00091 vector < TransientVertex > MultiVertexReconstructor::vertices ( 
00092     const vector < reco::TransientTrack > & trks,
00093     const reco::BeamSpot & s ) const
00094 {
00095   return vertices ( trks );
00096 }
00097 
00098 vector < TransientVertex > MultiVertexReconstructor::vertices ( 
00099     const vector < reco::TransientTrack > & trks ) const
00100 {
00101   /*
00102   cout << "[MultiVertexReconstructor] input trks: ";
00103   for ( vector< reco::TransientTrack >::const_iterator i=trks.begin(); 
00104         i!=trks.end() ; ++i )
00105   {
00106     cout << i->id() << "  ";
00107   }
00108   cout << endl;*/
00109   vector < TransientVertex > tmp = theOldReconstructor->vertices ( trks );
00110   if ( verbose() )
00111   {
00112     cout << "[MultiVertexReconstructor] non-freezing seeder found " << tmp.size()
00113          << " vertices from " << trks.size() << " tracks." << endl;
00114   }
00115   vector < vector < TrackAndWeight > > rc = recover ( tmp, trks );
00116   vector < CachingVertex<5> > cvts = theFitter.vertices ( rc );
00117   vector < TransientVertex > ret;
00118   for ( vector< CachingVertex<5> >::const_iterator i=cvts.begin(); 
00119         i!=cvts.end() ; ++i )
00120   {
00121     ret.push_back ( *i );
00122   };
00123 
00124   if ( verbose() )
00125   {
00126     cout << "[MultiVertexReconstructor] input " << tmp.size()
00127          << " vertices, output " << ret.size() << " vertices."
00128          << endl;
00129   };
00130   return ret;
00131 }
00132 
00133 vector < TransientVertex > MultiVertexReconstructor::vertices ( 
00134     const vector < reco::TransientTrack > & trks,
00135     const vector < reco::TransientTrack > & primaries ) const
00136 {
00137   /*
00138   cout << "[MultiVertexReconstructor] with " << primaries.size()
00139        << " primaries!" << endl;
00140        */
00141   
00142   map < reco::TransientTrack, bool > st;
00143   
00144   vector < reco::TransientTrack > total = trks;
00145   for ( vector< reco::TransientTrack >::const_iterator i=trks.begin(); 
00146         i!=trks.end() ; ++i )
00147   {
00148     st[(*i)]=true;
00149   }
00150 
00151   // cout << "[MultiVertexReconstructor] FIXME dont just add up tracks. superpose" << endl;
00152   for ( vector< reco::TransientTrack >::const_iterator i=primaries.begin(); 
00153         i!=primaries.end() ; ++i )
00154   {
00155     if (!(st[(*i)]))
00156     {
00157       total.push_back ( *i );
00158     }
00159   }
00160 
00161   vector < TransientVertex > tmp = theOldReconstructor->vertices ( total );
00162 
00163   if ( verbose() )
00164   {
00165     cout << "[MultiVertexReconstructor] freezing seeder found " << tmp.size()
00166          << " vertices from " << total.size() << " tracks." << endl;
00167   }
00168   vector < vector < TrackAndWeight > > rc = recover ( tmp, trks );
00169   vector < CachingVertex<5> > cvts = theFitter.vertices ( rc, primaries );
00170    
00171   vector < TransientVertex > ret;
00172   for ( vector< CachingVertex<5> >::const_iterator i=cvts.begin(); 
00173         i!=cvts.end() ; ++i )
00174   {
00175     ret.push_back ( *i );
00176   };
00177   if ( verbose() )
00178   {
00179     cout << "[MultiVertexReconstructor] input " << tmp.size()
00180          << " vertices, output " << ret.size() << " vertices."
00181          << endl;
00182   };
00183   return ret;
00184 }
00185 
00186 VertexReconstructor * MultiVertexReconstructor::reconstructor() const
00187 {
00188   return theOldReconstructor;
00189 }

Generated on Tue Jun 9 17:46:11 2009 for CMSSW by  doxygen 1.5.4