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
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
00057 for ( set < reco::TransientTrack >::const_iterator i=st.begin();
00058 i!=st.end() ; ++i )
00059 {
00060
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
00103
00104
00105
00106
00107
00108
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
00139
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
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 }