32 long long totLockHits;
36 totGroup=totSeg=totLockHits=totInvCand=
trunc=0;
38 void incr(
long long g,
long long s,
long long l) {
43 void truncated() { ++
trunc;}
46 std::cout <<
"TrajectorySegmentBuilder stat\nGroup/Seg/Lock/Inv/Trunc "
47 << totGroup<<
'/'<<totSeg<<
'/'<<totLockHits<<
'/'<<totInvCand<<
'/'<<
trunc
50 StatCount() {
zero();}
51 ~StatCount() {
print();}
56 void incr(
long long,
long long,
long long){}
75 theLockedHits.clear();
76 TempTrajectory startingTrajectory(theFullPropagator.propagationDirection());
81 vector<TMG> measGroups =
83 vector<TMG>
const & measGroups =
85 theLayerMeasurements->groupedMeasurements(theLayer,startingState,theFullPropagator,theEstimator);
88 cout <<
"TSB: number of measurement groups = " << measGroups.size() << endl;
105 bool truncate(
false);
106 for (
auto const & gr : measGroups) {
109 for (
auto const &
m : gr.measurements())
if likely(
m.recHitR().isValid() ) nhit++;
111 if ( nhit>1 ) ncomb *= nhit;
113 edm::LogInfo(
"TrajectorySegmentBuilder") <<
" found " << measGroups.size()
114 <<
" groups and more than " <<
static_cast<unsigned int>(MAXCOMB)
115 <<
" combinations - limiting to "
116 << (ngrp-1) <<
" groups";
119 statCount.truncated();
125 if unlikely( truncate && ngrp>0 ) measGroups.resize(ngrp-1);
133 for (vector<TMG>::const_iterator ig=measGroups.begin();
134 ig!=measGroups.end(); ++ig) {
136 const vector<TM>& measurements = ig->measurements();
137 for ( vector<TM>::const_iterator im=measurements.begin();
138 im!=measurements.end(); ++im ) {
139 if ( im->recHit()->isValid() ) ngrp++;
142 if ( ngrp>0 ) ntot *= ngrp;
145 cout <<
"TrajectorySegmentBuilder::partialTrajectories:: det ids & hit types / group" << endl;
146 for (vector<TMG>::const_iterator ig=measGroups.begin();
147 ig!=measGroups.end(); ++ig) {
148 const vector<TM>& measurements = ig->measurements();
149 for ( vector<TM>::const_iterator im=measurements.begin();
150 im!=measurements.end(); ++im ) {
151 if ( im!=measurements.begin() )
cout <<
" / ";
152 if ( im->recHit()->det() )
153 cout << im->recHit()->det()->geographicalId().rawId() <<
" "
154 << im->recHit()->getType();
163 cout <<
typeid(theLayer).
name() << endl;
182 addGroup(startingTrajectory,measGroups.begin(),measGroups.end());
184 if unlikely(theDbgFlg)
cout <<
"TSB: back with " << candidates.size() <<
" candidates" << endl;
190 updateWithInvalidHit(startingTrajectory,measGroups,candidates);
192 if unlikely(theDbgFlg)
cout <<
"TSB: " << candidates.size() <<
" candidates after invalid hit" << endl;
194 statCount.incr(measGroups.size(), candidates.size(), theLockedHits.size());
197 theLockedHits.clear();
208 if ( hit->isValid()) {
209 traj.
emplace(predictedState, theUpdator.
update( predictedState, *hit),
233 vector<TMG>::const_iterator
begin,
234 vector<TMG>::const_iterator
end)
236 vector<TempTrajectory>
ret;
239 if unlikely(theDbgFlg)
cout <<
"TSB::addGroup : no groups left" << endl;
246 <<
" first group at " << &(*begin)
253 vector<TM>
const & firstMeasurements = unlockedMeasurements(begin->measurements());
254 if ( theBestHitOnly )
255 updateCandidatesWithBestHit(traj,firstMeasurements,updatedTrajectories);
257 updateCandidates(traj,begin->
measurements(),updatedTrajectories);
258 if unlikely(theDbgFlg)
cout <<
"TSB::addGroup : updating with first group - "
259 << updatedTrajectories.size() <<
" trajectories" << endl;
262 if ( theBestHitOnly )
263 updateCandidatesWithBestHit(traj,redoMeasurements(traj,begin->detGroup()),
264 updatedTrajectories);
266 updateCandidates(traj,redoMeasurements(traj,begin->detGroup()),
267 updatedTrajectories);
268 if unlikely(theDbgFlg)
cout <<
"TSB::addGroup : updating"
269 << updatedTrajectories.size() <<
" trajectories" << endl;
272 if (begin+1 != end) {
274 for (
auto const & ut : updatedTrajectories) {
275 if unlikely(theDbgFlg)
cout <<
"TSB::addGroup : trying to extend candidate at "
276 << &ut <<
" size " << ut.measurements().size() << endl;
277 vector<TempTrajectory> finalTrajectories = addGroup(ut,begin+1,end);
278 if unlikely(theDbgFlg)
cout <<
"TSB::addGroup : " << finalTrajectories.size()
279 <<
" finalised candidates before cleaning" << endl;
282 cleanCandidates(finalTrajectories);
285 int ntf=0;
for (
auto const &
t : finalTrajectories)
if (
t.isValid()) ++ntf;
286 cout <<
"TSB::addGroup : got " << ntf
287 <<
" finalised candidates" << endl;
290 for (
auto &
t : finalTrajectories)
291 if (
t.isValid()) ret.push_back(std::move(
t));
297 ret.reserve(updatedTrajectories.size());
298 for (
auto &
t : updatedTrajectories)
299 if (!
t.empty()) ret.push_back(std::move(
t));
312 const vector<TM>& measurements,
318 for ( vector<TM>::const_iterator im=measurements.begin();
319 im!=measurements.end(); ++im ) {
320 if ( im->recHit()->isValid() ) {
321 candidates.push_back(traj);
322 updateTrajectory(candidates.back(),*im);
323 if ( theLockHits ) lockMeasurement(*im);
329 candidates.push_back(traj);
334 const vector<TM>& measurements,
340 auto ibest = measurements.begin();
344 while(ibest!=measurements.end() && !ibest->recHit()->isValid()) ++ibest;
345 if ( ibest!=measurements.end() ) {
347 for (
auto im=ibest+1;
348 im!=measurements.end(); ++im ) {
349 if ( im->recHitR().isValid() &&
350 im->estimate()<ibest->estimate()
355 cout <<
"TSB: found best measurement at "
356 << ibest->recHit()->globalPosition().perp() <<
" "
357 << ibest->recHit()->globalPosition().phi() <<
" "
358 << ibest->recHit()->globalPosition().z() << endl;
360 assert(ibest==measurements.begin());
364 if (!measurements.empty()) {
365 if ( theLockHits ) lockMeasurement(*ibest);
366 candidates.push_back(traj);
367 updateTrajectory(candidates.back(),*ibest);
371 candidates.push_back(traj);
374 vector<TrajectoryMeasurement>
382 if unlikely(theDbgFlg)
cout <<
"TSB::redoMeasurements : nr. of measurements / group =";
386 for (
auto const & det : detGroup) {
388 pair<bool, TrajectoryStateOnSurface> compat =
391 theGeomPropagator,theEstimator);
395 if(!compat.first)
continue;
397 const MeasurementDet* mdet = theMeasurementTracker->idToDet(det.det()->geographicalId());
399 if (mdet->
measurements(compat.second, theEstimator,tmps) && tmps.
hits[0]->isValid() )
400 for (std::size_t
i=0;
i!=tmps.
size(); ++
i)
401 result.emplace_back(compat.second,std::move(tmps.
hits[
i]),tmps.
distances[
i],&theLayer);
417 const vector<TMG>& groups,
426 for ( vector<TMG>::const_iterator ig=groups.begin(); ig!=groups.end(); ++ig) {
428 const vector<TM>& measurements = ig->measurements();
429 for ( vector<TM>::const_reverse_iterator im=measurements.rbegin();
430 im!=measurements.rend(); ++im ) {
431 auto const &
hit = im->recHitR();
439 auto const & predState = im->predictedState();
441 (predState.isValid() &&
442 hit.det()->surface().bounds().inside(predState.localPosition())) ) {
447 candidates.push_back(traj);
448 updateTrajectory(candidates.back(), *im);
449 if unlikely( theDbgFlg )
cout <<
"TrajectorySegmentBuilder::updateWithInvalidHit "
450 <<
"added inactive hit" << endl;
465 for ( vector<TMG>::const_iterator ig=groups.begin();
466 ig!=groups.end(); ++ig) {
467 const vector<TM>& measurements = ig->measurements();
468 for ( vector<TM>::const_reverse_iterator im=measurements.rbegin();
469 im!=measurements.rend(); ++im ) {
473 auto const &
hit = im->recHitR();
479 auto const & predState = im->predictedState();
481 if (
iteration>0 || (predState.isValid() &&
482 hit.det()->surface().bounds().inside(predState.localPosition())) ) {
487 candidates.push_back(traj);
488 updateTrajectory(candidates.back(), *im);
494 if (
iteration>0 || (predState.isValid() &&
495 im->layer()->surface().bounds().inside(predState.localPosition())) ){
500 candidates.push_back(traj);
501 updateTrajectory(candidates.back(), *im);
509 if unlikely( theDbgFlg && !found )
cout <<
"TrajectorySegmentBuilder::updateWithInvalidHit: "
510 <<
" did not find invalid hit on 1st iteration" << endl;
514 if unlikely( theDbgFlg && (!found) )
515 cout <<
"TrajectorySegmentBuilder::updateWithInvalidHit: "
516 <<
" did not find invalid hit" << endl;
519 vector<TrajectoryMeasurement>
525 result.reserve(measurements.size());
529 for (
auto const &
m : measurements) {
530 auto const & testHit =
m.recHitR();
531 if unlikely( !testHit.isValid() )
continue;
533 if likely( theLockHits ) {
534 for (
auto const &
h : theLockedHits) {
541 if likely( !found ) result.push_back(
m);
549 theLockedHits.push_back(measurement.
recHit());
562 if ( candidates.size()<=1 )
return;
565 const int NC = candidates.size();
566 int index[NC];
for (
int i=0;
i!=NC; ++
i) index[
i]=
i;
573 for (
auto i1 = index; i1!=index+NC-1; ++i1) {
576 for (
auto i2=i1+1; i2!=index+NC; ++i2 ) {
578 if ( candidates[*i2].foundHits()==candidates[*i1].foundHits() )
continue;
588 im1!=im1end; --im1 ) {
597 from2 = im2; --from2;
606 if ( allFound ) { candidates[*i1].invalidate(); statCount.invalid();}
const_iterator rend() const
TrajectoryStateOnSurface const & predictedState() const
void updateCandidatesWithBestHit(TempTrajectory const &traj, const std::vector< TM > &measurements, TempTrajectoryContainer &candidates)
creation of a new candidate from a segment and the best hit out of a collection
ConstRecHitPointer const & recHit() const
bool empty() const
True if trajectory has no measurements.
std::vector< TempTrajectory > TempTrajectoryContainer
void cleanCandidates(std::vector< TempTrajectory > &candidates) const
clean a set of candidates
bool lessByFoundHits(const Trajectory &a, const Trajectory &b)
std::string print(const Track &, edm::Verbosity=edm::Concise)
Track print utility.
const DataContainer & measurements() const
std::vector< TrajectoryMeasurement > unlockedMeasurements(const std::vector< TM > &measurements) const
get list of unused hits
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
std::vector< TempTrajectory > addGroup(TempTrajectory const &traj, std::vector< TrajectoryMeasurementGroup >::const_iterator begin, std::vector< TrajectoryMeasurementGroup >::const_iterator end)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
const TrajectoryMeasurement & lastMeasurement() const
void lockMeasurement(const TM &measurement)
mark a hit as used
void update(const LocalTrajectoryParameters &p, const SurfaceType &aSurface, const MagneticField *field, const SurfaceSide side=SurfaceSideDefinition::atCenterOfSurface)
std::vector< TrajectoryMeasurement > redoMeasurements(const TempTrajectory &traj, const DetGroup &detGroup) const
retrieve compatible hits from a DetGroup
const DetLayer * layer() const
const AlgebraicSymMatrix55 & matrix() const
const LocalTrajectoryError & localError() const
const_iterator rbegin() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
void emplace(Args &&...args)
void updateCandidates(TempTrajectory const &traj, const std::vector< TM > &measurements, TempTrajectoryContainer &candidates)
creation of new candidates from a segment and a collection of hits
TrajectoryStateOnSurface const & updatedState() const
void updateTrajectory(TempTrajectory &traj, const TM &tm) const
update of a trajectory with a hit
virtual bool measurements(const TrajectoryStateOnSurface &stateOnThisDet, const MeasurementEstimator &est, TempMeasurements &result) const =0
void updateWithInvalidHit(TempTrajectory &traj, const std::vector< TMG > &groups, TempTrajectoryContainer &candidates) const