28 const std::vector<Trajectory>& theTrajectoryCollection,
37 edm::LogInfo(
"MTFTrackProducer") <<
"Number of Trajectories: " << theTrajectoryCollection.size() <<
"\n";
42 std::vector<Trajectory> mvtraj=theTrajectoryCollection;
47 std::map<int, std::vector<TrajectoryMeasurement> > mvtm;
50 for(std::vector<Trajectory>::iterator imvtraj=mvtraj.begin(); imvtraj!=mvtraj.end(); imvtraj++)
59 LogDebug(
"MTFTrackProducerAlgorithm") <<
"after the cicle found " << mvtraj.size() <<
" trajectories" << std::endl;
60 LogDebug(
"MTFTrackProducerAlgorithm") <<
"built a map of " << mvtm.size() <<
" elements (trajectories, yeah)" << std::endl;
63 std::vector<std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface> > vecmrhits;
64 std::vector<Trajectory> transientmvtraj;
66 for(std::vector<Trajectory>::const_iterator im=mvtraj.begin(); im!=mvtraj.end(); im++)
70 LogDebug(
"MTFTrackProducerAlgorithm") <<
"about to collect hits for the trajectory number " << b << std::endl;
73 std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface> hits =
collectHits(mvtm, measurementCollector, b);
74 vecmrhits.push_back(hits);
76 LogDebug(
"MTFTrackProducerAlgorithm") <<
"hits collected";
79 std::vector<Trajectory> vtraj(1,(*im));
82 bool fitresult =
fit(hits, theFitter, vtraj);
83 LogDebug(
"MTFTrackProducerAlgorithm") <<
"fit done";
88 LogDebug(
"MTFTrackProducerAlgorithm") <<
"fit was good for trajectory number" << b <<
"\n"
89 <<
"the trajectory has size" << vtraj.size() <<
"\n"
90 <<
"and its number of measurements is: " << vtraj.front().measurements().size() <<
"\n";
94 transientmvtraj.push_back(thetraj);
106 LogDebug(
"MTFTrackProducerAlgorithm") <<
"cicle finished";
109 mvtraj.swap(transientmvtraj);
110 LogDebug(
"MTFTrackProducerAlgorithm") <<
" with " << mvtraj.size() <<
"trajectories\n";
121 std::map<int, std::vector<TrajectoryMeasurement> > transientmvtm1;
124 for(std::vector<Trajectory>::iterator imv=mvtraj.begin(); imv!=mvtraj.end(); imv++)
127 transientmvtm1.insert( make_pair(b,traj->
measurements()) );
132 mvtm.swap(transientmvtm1);
138 for (
unsigned int d=0; d<mvtraj.size(); d++)
141 std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface>
142 curiterationhits =
updateHits(mvtm, measurementCollector, updator, *ian, builder, d);
144 vecmrhits.push_back(curiterationhits);
150 LogDebug(
"MTFTrackProducerAlgorithm") <<
"vector vecmrhits has size "
151 << vecmrhits.size() << std::endl;
158 std::vector<Trajectory> transientmvtrajone;
162 for(std::vector<Trajectory>::const_iterator
j=mvtraj.begin();
j!=mvtraj.end();
j++)
166 std::vector<Trajectory> vtraj(1,(*
j));
170 LogDebug(
"MTFTrackProducerAlgorithm") <<
"Seed direction is " << vtraj.front().seed().direction()
171 <<
"Traj direction is " << vtraj.front().direction();
180 fit(vecmrhits[n], theFitter, vtraj);
191 LogDebug(
"MTFTrackProducerAlgorithm") <<
"in map making skipping trajectory number: " << n <<
"\n";
204 transientmvtrajone.push_back(thetraj);
217 mvtraj.swap(transientmvtrajone);
221 LogDebug(
"MTFTrackProducerAlgorithm") <<
"number of trajectories after annealing value "
223 <<
" annealing step "
224 << mvtraj.size() << std::endl;
230 LogDebug(
"MTFTrackProducerAlgorithm") <<
"Ended annealing program with " << mvtraj.size() <<
" trajectories" << std::endl;
237 for(std::vector<Trajectory>::iterator it=mvtraj.begin(); it!=mvtraj.end();it++){
239 std::vector<Trajectory> vtraj(1,(*it));
256 edm::LogInfo(
"TrackProducer") <<
"Number of Tracks found: " << cont <<
"\n";
265 std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface>
273 std::vector<TrajectoryMeasurement> collectedmeas = measurementCollector->
recHits(vtm,i,1.);
274 LogDebug(
"MTFTrackProducerAlgorithm") <<
"hits collected by the MTF Measurement Collector " << std::endl
275 <<
"trajectory number " << i <<
"has measurements" << collectedmeas.size();
277 if (collectedmeas.empty()) {
278 LogDebug(
"MTFTrackProducerAlgorithm") <<
"In method collectHits, we had a problem and no measurements were collected "
279 <<
"for trajectory number " << i << std::endl;
283 for (std::vector<TrajectoryMeasurement>::const_iterator iter = collectedmeas.begin(); iter!=collectedmeas.end(); iter++){
284 hits.push_back(iter->recHit());
285 if(iter->recHit()->isValid())
286 LogDebug(
"MTFTrackProducerAlgorithm") <<
"this MultiRecHit has size: " << iter->recHit()->recHits().size();
293 std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface>
302 std::map< int, std::vector<TrajectoryMeasurement> >::const_iterator itmeas = mapvtm.find(i);
303 LogDebug(
"SimpleMTFHitCollector") <<
"found the element "<< i
304 <<
"in the map" << std::endl;
306 std::vector<TrajectoryMeasurement> meas = itmeas->second;
309 if (meas.empty()) {
LogDebug(
"MTFTrackProducerAlgorithm::updateHits") <<
"Warning!!!The trajectory measurement vector is empty" <<
"\n";}
311 for(vector<TrajectoryMeasurement>::reverse_iterator imeas = meas.rbegin(); imeas != meas.rend(); imeas++)
314 if( imeas->recHit()->isValid() )
319 std::vector<const TrackingRecHit*> trechit = imeas->recHit()->recHits();
324 LogDebug(
"MTFTrackProducerAlgorithm::updateHits") <<
"multirechit vector size: " << trechit.size() <<
"\n";
328 for (vector<const TrackingRecHit*>::iterator itrechit=trechit.begin(); itrechit!=trechit.end(); itrechit++)
331 hits.push_back( builder->
build(*itrechit));
349 multirechits.push_back(mrh);
356 multirechits.push_back(imeas->recHit());
372 std::vector<Trajectory>& vtraj)
const {
376 vtraj.
front().seed().direction()),
383 vtraj.reserve(newVec.size());
385 LogDebug(
"MTFTrackProducerAlgorithm") <<
"swapped!" << std::endl;
391 LogDebug(
"MTFTrackProducerAlgorithm") <<
" somewhwere, something went terribly wrong...in fitting or smoothing trajectory with measurements:"
392 << vtraj.front().measurements().size()
393 <<
" was broken\n. We keep the old trajectory"
415 LogDebug(
"MTFTrackProducerAlgorithm") <<
" FITTER FOUND "<< vtraj.size() <<
" TRAJECTORIES" << std::endl;;
418 if (vtraj.size() != 0){
433 if (tscbl.
isValid()==
false)
return false;
440 LogDebug(
"TrackProducer") <<v<<p<<std::endl;
447 LogDebug(
"TrackProducer") <<
"track done\n";
450 LogDebug(
"TrackProducer") <<
"track done1\n";
451 algoResults.push_back(aProduct);
452 LogDebug(
"TrackProducer") <<
"track done2\n";
460 std::vector<Trajectory>&
input,
462 std::vector<Trajectory>&
output)
const {
463 if (input.empty())
return;
467 std::vector<TrajectoryMeasurement> vtm = input[0].measurements();
472 for (std::vector<TrajectoryMeasurement>::reverse_iterator tm=vtm.rbegin(); tm!=vtm.rend();tm++){
474 if (tm->recHit()->isValid()) {
477 for (TransientTrackingRecHit::ConstRecHitContainer::iterator rechit = components.begin(); rechit != components.end(); rechit++){
479 if ((*rechit)->weight()>1
e-6) {ngoodhits++; isGood =
true;
break;}
481 if (isGood) hits.push_back(tm->recHit()->clone(tm->updatedState()));
484 hits.push_back(tm->recHit()->clone(tm->updatedState()));
489 LogDebug(
"DAFTrackProducerAlgorithm") <<
"Original number of valid hits " << input[0].foundHits() <<
"; after filtering " << ngoodhits;
491 if (ngoodhits>input[0].foundHits())
edm::LogError(
"DAFTrackProducerAlgorithm") <<
"Something wrong: the number of good hits from DAFTrackProducerAlgorithm::filter " << ngoodhits <<
" is higher than the original one " << input[0].foundHits();
493 if (ngoodhits < minhits)
return;
496 LogDebug(
"DAFTrackProducerAlgorithm") <<
"starting tsos for final refitting " << curstartingTSOS ;
501 input.
front().seed().direction()),
504 LogDebug(
"DAFTrackProducerAlgorithm") <<
"After filtering " << output.size() <<
" trajectories";
509 if (vtraj.empty())
return 0;
512 const std::vector<TrajectoryMeasurement>& meas = vtraj.front().measurements();
513 for (std::vector<TrajectoryMeasurement>::const_iterator iter = meas.begin(); iter != meas.end(); iter++){
514 if (iter->recHit()->isValid()){
516 TransientTrackingRecHit::ConstRecHitContainer::const_iterator iter2;
517 for (iter2 = components.begin(); iter2 != components.end(); iter2++){
518 if ((*iter2)->isValid()){ndof+=((*iter2)->dimension())*(*iter2)->weight();
519 LogDebug(
"DAFTrackProducerAlgorithm") <<
"hit dimension: "<<(*iter2)->dimension()
520 <<
" and weight: "<<(*iter2)->weight();
527 LogDebug(
"DAFTrackProducerAlgorithm") <<
"nhits: "<<nhits<<
" ndof: "<<ndof-5;
static RecHitPointer build(const GeomDet *geom, Type type=TrackingRecHit::missing, const DetLayer *layer=0)
const std::vector< double > & getAnnealingProgram() const
TSOS combine(const TSOS &pTsos1, const TSOS &pTsos2) const
float calculateNdof(const std::vector< Trajectory > &vtraj) const
virtual std::vector< TrajectoryMeasurement > recHits(const std::map< int, std::vector< TrajectoryMeasurement > > &, int, double) const =0
std::pair< Trajectory *, std::pair< reco::Track *, PropagationDirection > > AlgoProduct
TrackCharge charge() const
const CurvilinearTrajectoryError & curvilinearError() const
std::vector< ConstRecHitPointer > RecHitContainer
PropagationDirection const & direction() const
DataContainer const & measurements() const
void runWithCandidate(const TrackingGeometry *, const MagneticField *, const std::vector< Trajectory > &, const TrajectoryFitter *, const TransientTrackingRecHitBuilder *, const MultiTrackFilterHitCollector *measurementTracker, const SiTrackerMultiRecHitUpdatorMTF *, const reco::BeamSpot &, AlgoProductCollection &) const
Run the Final Fit taking TrackCandidates as input.
FreeTrajectoryState * freeState(bool withErrors=true) const
virtual TransientTrackingRecHit::RecHitPointer buildMultiRecHit(TrajectoryStateOnSurface &tsos, TransientTrackingRecHit::ConstRecHitContainer &hits, MultiTrajectoryMeasurement *mtm, float annealing=1.) const
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
TrajectoryMeasurement const & lastMeasurement() const
std::vector< AlgoProduct > AlgoProductCollection
TrajectoryStateOnSurface updatedState() const
std::pair< TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface > updateHits(const std::map< int, std::vector< TrajectoryMeasurement > > &mapvtm, const MultiTrackFilterHitCollector *measurementCollector, const SiTrackerMultiRecHitUpdatorMTF *updator, double annealing, const TransientTrackingRecHitBuilder *builder, int i) const
GlobalVector momentum() const
FTS const & trackStateAtPCA() const
std::vector< ConstRecHitPointer > ConstRecHitContainer
GlobalPoint position() const
std::pair< TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface > collectHits(const std::map< int, std::vector< TrajectoryMeasurement > > &mapvtm, const MultiTrackFilterHitCollector *measurementCollector, int i) const
TrajectoryMeasurement const & firstMeasurement() const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
XYZPointD XYZPoint
point in space with cartesian internal representation
bool buildTrack(const std::vector< Trajectory > &, AlgoProductCollection &algoResults, float, const reco::BeamSpot &) const
Construct Tracks to be put in the event.
bool fit(const std::pair< TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface > &hits, const TrajectoryFitter *theFitter, std::vector< Trajectory > &vtraj) const
accomplishes the fitting-smoothing step for each annealing value
virtual std::vector< Trajectory > fit(const Trajectory &) const =0
virtual MultiTrajectoryMeasurement TSOSfinder(const std::map< int, std::vector< TrajectoryMeasurement > > &tmmap, TrajectoryMeasurement &pmeas, int i) const =0
void filter(const TrajectoryFitter *fitter, std::vector< Trajectory > &input, int minhits, std::vector< Trajectory > &output) const
double chiSquared() const