32 theLockedHits.clear();
33 TempTrajectory startingTrajectory(theFullPropagator.propagationDirection());
37 vector<TMG> measGroups =
38 theLayerMeasurements->groupedMeasurements(theLayer,startingState,theFullPropagator,theEstimator);
42 cout <<
"TSB: number of measurement groups = " << measGroups.size() << endl;
51 for (vector<TMG>::const_iterator ig=measGroups.begin();
52 ig!=measGroups.end(); ++ig) {
54 const vector<TM>& measurements = ig->measurements();
55 for ( vector<TM>::const_iterator im=measurements.begin();
56 im!=measurements.end(); ++im ) {
57 if ( im->recHit()->isValid() ) ngrp++;
60 if ( ngrp>0 ) ntot *= ngrp;
63 cout <<
"TrajectorySegmentBuilder::partialTrajectories:: det ids & hit types / group" << endl;
64 for (vector<TMG>::const_iterator ig=measGroups.begin();
65 ig!=measGroups.end(); ++ig) {
66 const vector<TM>& measurements = ig->measurements();
67 for ( vector<TM>::const_iterator im=measurements.begin();
68 im!=measurements.end(); ++im ) {
69 if ( im!=measurements.begin() )
cout <<
" / ";
70 if ( im->recHit()->det() )
71 cout << im->recHit()->det()->geographicalId().rawId() <<
" "
72 << im->recHit()->getType();
82 cout <<
typeid(theLayer).
name() << endl;
100 addGroup(startingTrajectory,measGroups.begin(),measGroups.end());
102 if (theDbgFlg)
cout <<
"TSB: back with " << candidates.size() <<
" candidates" << endl;
109 updateWithInvalidHit(startingTrajectory,measGroups,candidates);
110 if (theDbgFlg)
cout <<
"TSB: " << candidates.size() <<
" candidates after invalid hit" << endl;
120 if ( hit->isValid()) {
121 traj.
push(
TM( predictedState, theUpdator.
update( predictedState, *hit),
137 traj.
push(
TM( predictedState, hit,0, tm.
layer()));
144 vector<TMG>::const_iterator
begin,
145 vector<TMG>::const_iterator
end)
147 vector<TempTrajectory>
ret;
150 if (theDbgFlg)
cout <<
"TSB::addGroup : no groups left" << endl;
157 <<
" first group at " << &(*begin)
164 vector<TM> firstMeasurements = unlockedMeasurements(begin->measurements());
165 if ( theBestHitOnly )
166 updateCandidatesWithBestHit(traj,firstMeasurements,updatedTrajectories);
168 updateCandidates(traj,begin->
measurements(),updatedTrajectories);
169 if (theDbgFlg)
cout <<
"TSB::addGroup : updating with first group - "
170 << updatedTrajectories.size() <<
" trajectories" << endl;
173 if ( theBestHitOnly )
174 updateCandidatesWithBestHit(traj,redoMeasurements(traj,begin->detGroup()),
175 updatedTrajectories);
177 updateCandidates(traj,redoMeasurements(traj,begin->detGroup()),
178 updatedTrajectories);
179 if (theDbgFlg)
cout <<
"TSB::addGroup : updating"
180 << updatedTrajectories.size() <<
" trajectories" << endl;
183 if (begin+1 != end) {
185 for ( TempTrajectoryContainer::iterator it=updatedTrajectories.begin();
186 it!=updatedTrajectories.end(); ++it ) {
187 if (theDbgFlg)
cout <<
"TSB::addGroup : trying to extend candidate at "
188 << &(*it) <<
" size " << it->measurements().size() << endl;
189 vector<TempTrajectory> finalTrajectories = addGroup(*it,begin+1,end);
190 if (theDbgFlg)
cout <<
"TSB::addGroup : " << finalTrajectories.size()
191 <<
" finalised candidates before cleaning" << endl;
193 cleanCandidates(finalTrajectories);
195 if (theDbgFlg)
cout <<
"TSB::addGroup : got " << finalTrajectories.size()
196 <<
" finalised candidates" << endl;
197 ret.insert(ret.end(),finalTrajectories.begin(),
198 finalTrajectories.end());
201 ret.reserve(updatedTrajectories.size());
202 for (TempTrajectoryContainer::iterator it=updatedTrajectories.begin();
203 it!=updatedTrajectories.end(); ++it ) {
204 if (!it->empty()) ret.push_back(*it);
218 const vector<TM>& measurements,
224 for ( vector<TM>::const_iterator im=measurements.begin();
225 im!=measurements.end(); ++im ) {
226 if ( im->recHit()->isValid() ) {
227 candidates.push_back(traj);
228 updateTrajectory(candidates.back(),*im);
229 if ( theLockHits ) lockMeasurement(*im);
235 candidates.push_back(traj);
240 const vector<TM>& measurements,
243 vector<TM>::const_iterator ibest = measurements.end();
244 bool bestIsValid =
false;
245 for ( vector<TM>::const_iterator im=measurements.begin();
246 im!=measurements.end(); ++im ) {
247 if ( im->recHit()->isValid() ) {
248 if (!bestIsValid || (ibest==measurements.end()) || (im->estimate()<ibest->estimate()) ) {
257 if ( ibest!=measurements.end() ) {
258 if ( theLockHits ) lockMeasurement(*ibest);
259 candidates.push_back(traj);
260 updateTrajectory(candidates.back(),*ibest);
263 cout <<
"TSB: found best measurement at "
264 << ibest->recHit()->globalPosition().perp() <<
" "
265 << ibest->recHit()->globalPosition().phi() <<
" "
266 << ibest->recHit()->globalPosition().z() << endl;
268 cout <<
"TSB: found best measurement at invalid hit on det " << ibest->recHit()->geographicalId().rawId() << endl;
275 candidates.push_back(traj);
278 vector<TrajectoryMeasurement>
283 vector<TM> tmpResult;
287 if (theDbgFlg)
cout <<
"TSB::redoMeasurements : nr. of measurements / group =";
289 for (DetGroup::const_iterator idet=detGroup.begin();
290 idet!=detGroup.end(); ++idet) {
296 pair<bool, TrajectoryStateOnSurface> compat =
299 theGeomPropagator,theEstimator);
303 const MeasurementDet* mdet = theMeasurementTracker->idToDet(idet->det()->geographicalId());
304 tmp = mdet->
fastMeasurements( compat.second, idet->trajectoryState(), theGeomPropagator, theEstimator);
313 if ( tmp.empty() )
continue;
318 if (theDbgFlg)
cout <<
" " << tmp.size();
319 tmpResult.insert(tmpResult.end(),tmp.begin(),
end);
321 if (theDbgFlg)
cout << endl;
325 for(vector<TM>::const_iterator tmpIt=tmpResult.begin();tmpIt!=tmpResult.end();++tmpIt){
326 if ( tmpIt->recHit()->isValid() )
327 result.push_back(
TrajectoryMeasurement(tmpIt->predictedState(),tmpIt->recHit(),tmpIt->estimate(),&theLayer) );
335 const vector<TMG>& groups,
344 for ( vector<TMG>::const_iterator ig=groups.begin(); ig!=groups.end(); ++ig) {
346 const vector<TM>& measurements = ig->measurements();
347 for ( vector<TM>::const_reverse_iterator im=measurements.rbegin();
348 im!=measurements.rend(); ++im ) {
357 TSOS predState(im->predictedState());
359 (predState.isValid() &&
360 hit->det()->surface().bounds().inside(predState.localPosition())) ) {
365 candidates.push_back(traj);
366 updateTrajectory(candidates.back(), *im);
367 if ( theDbgFlg )
cout <<
"TrajectorySegmentBuilder::updateWithInvalidHit "
368 <<
"added inactive hit" << endl;
383 for ( vector<TMG>::const_iterator ig=groups.begin();
384 ig!=groups.end(); ++ig) {
385 const vector<TM>& measurements = ig->measurements();
386 for ( vector<TM>::const_reverse_iterator im=measurements.rbegin();
387 im!=measurements.rend(); ++im ) {
392 if ( hit->isValid() )
continue;
397 TSOS predState(im->predictedState());
399 if (
iteration>0 || (predState.isValid() &&
400 hit->det()->surface().bounds().inside(predState.localPosition())) ) {
405 candidates.push_back(traj);
406 updateTrajectory(candidates.back(), *im);
412 if (
iteration>0 || (predState.isValid() &&
413 im->layer()->surface().bounds().inside(predState.localPosition())) ){
418 candidates.push_back(traj);
419 updateTrajectory(candidates.back(), *im);
427 if ( theDbgFlg && !found )
cout <<
"TrajectorySegmentBuilder::updateWithInvalidHit: "
428 <<
" did not find invalid hit on 1st iteration" << endl;
432 if (theDbgFlg)
cout <<
"TrajectorySegmentBuilder::updateWithInvalidHit: "
433 <<
" did not find invalid hit" << endl;
437 vector<TrajectoryMeasurement>
444 result.reserve(measurements.size());
448 for ( vector<TM>::const_iterator im=measurements.begin();
449 im!=measurements.end(); ++im ) {
451 if ( !testHit->isValid() )
continue;
454 for ( ConstRecHitContainer::const_iterator ih=theLockedHits.begin();
455 ih!=theLockedHits.end(); ++ih ) {
462 if ( !found ) result.push_back(*im);
472 theLockedHits.push_back(measurement.
recHit());
485 if ( candidates.size()<=1 )
return;
488 vector<TempTrajectory> sortedCandidates(candidates);
496 for ( vector<TempTrajectory>::iterator i1=sortedCandidates.begin();
497 i1!=sortedCandidates.end()-1; ++i1 ) {
500 for ( vector<TempTrajectory>::iterator i2=i1+1;
501 i2!=sortedCandidates.end(); ++i2 ) {
503 if ( i2->foundHits()==i1->foundHits() )
continue;
513 im1!=im1end; --im1 ) {
515 if ( !im1->recHit()->isValid() )
continue;
518 im2!=im2end; --im2 ) {
520 if ( !im2->recHit()->isValid() )
continue;
523 from2 = im2; --from2;
532 if ( allFound ) i1->invalidate();
542 candidates.erase(std::remove_if( candidates.begin(),candidates.end(),
547 cout <<
"TSB: cleanCandidates: reduced from " << sortedCandidates.size()
548 <<
" to " << candidates.size() <<
" candidates" << endl;
const_iterator rend() const
void updateCandidatesWithBestHit(TempTrajectory &traj, const std::vector< TM > &measurements, TempTrajectoryContainer &candidates)
creation of a new candidate from a segment and the best hit out of a collection
bool empty() const
True if trajectory has no measurements.
void update(const LocalTrajectoryParameters &p, const Surface &aSurface, const MagneticField *field, const SurfaceSide side=SurfaceSideDefinition::atCenterOfSurface)
std::vector< TempTrajectory > TempTrajectoryContainer
void cleanCandidates(std::vector< TempTrajectory > &candidates) const
clean a set of candidates
void updateCandidates(TempTrajectory &traj, const std::vector< TM > &measurements, TempTrajectoryContainer &candidates)
creation of new candidates from a segment and a collection of hits
const DataContainer & measurements() const
std::vector< TrajectoryMeasurement > unlockedMeasurements(const std::vector< TM > &measurements) const
get list of unused hits
ConstRecHitPointer recHit() const
static std::pair< bool, TrajectoryStateOnSurface > isCompatible(const GeomDet *theDet, const TrajectoryStateOnSurface &ts, const Propagator &prop, const MeasurementEstimator &est)
TempTrajectoryContainer segments(const TSOS startingState)
new segments within layer
const TrajectoryMeasurement & lastMeasurement() const
void lockMeasurement(const TM &measurement)
mark a hit as used
std::vector< TrajectoryMeasurement > redoMeasurements(const TempTrajectory &traj, const DetGroup &detGroup) const
retrieve compatible hits from a DetGroup
virtual std::vector< TrajectoryMeasurement > fastMeasurements(const TrajectoryStateOnSurface &stateOnThisDet, const TrajectoryStateOnSurface &startingState, const Propagator &, const MeasurementEstimator &) const =0
const DetLayer * layer() const
TrajectoryStateOnSurface updatedState() const
const AlgebraicSymMatrix55 & matrix() const
TrajectoryStateOnSurface predictedState() const
const LocalTrajectoryError & localError() const
std::vector< TempTrajectory > addGroup(TempTrajectory &traj, std::vector< TrajectoryMeasurementGroup >::const_iterator begin, std::vector< TrajectoryMeasurementGroup >::const_iterator end)
std::vector< std::vector< double > > tmp
void updateTrajectory(TempTrajectory &traj, const TM &tm) const
update of a trajectory with a hit
void push(const TrajectoryMeasurement &tm)
void updateWithInvalidHit(TempTrajectory &traj, const std::vector< TMG > &groups, TempTrajectoryContainer &candidates) const