File indexing completed on 2023-10-25 10:02:54
0001 #include "RecoTracker/SiTrackerMRHTools/interface/GroupedDAFHitCollector.h"
0002 #include "RecoTracker/SiTrackerMRHTools/interface/SiTrackerMultiRecHitUpdator.h"
0003 #include "RecoTracker/SiTrackerMRHTools/interface/MeasurementByLayerGrouper.h"
0004 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
0005 #include "TrackingTools/DetLayers/interface/MeasurementEstimator.h"
0006 #include "TrackingTools/DetLayers/interface/DetLayer.h"
0007 #include "TrackingTools/PatternTools/interface/Trajectory.h"
0008 #include "TrackingTools/MeasurementDet/interface/TrajectoryMeasurementGroup.h"
0009 #include "TrackingTools/TransientTrackingRecHit/interface/InvalidTransientRecHit.h"
0010 #include "RecoTracker/MeasurementDet/interface/MeasurementTrackerEvent.h"
0011 #include "TrackingTools/PatternTools/interface/TrajMeasLessEstim.h"
0012
0013 #include <vector>
0014 #include <map>
0015
0016 using namespace std;
0017
0018 vector<TrajectoryMeasurement> GroupedDAFHitCollector::recHits(const Trajectory& traj,
0019 const MeasurementTrackerEvent* theMTE) const {
0020 LayerMeasurements theLM(theMTE->measurementTracker(), *theMTE);
0021
0022
0023 const vector<TrajectoryMeasurement>& meas = traj.measurements();
0024 const Propagator* forwardPropagator = getPropagator();
0025 const Propagator* backwardPropagator = getReversePropagator();
0026 if (traj.direction() == alongMomentum) {
0027 forwardPropagator = getReversePropagator();
0028 backwardPropagator = getPropagator();
0029 }
0030 if (meas.empty())
0031 return vector<TrajectoryMeasurement>();
0032
0033
0034 vector<pair<const DetLayer*, vector<TrajectoryMeasurement> > > mol;
0035 mol = MeasurementByLayerGrouper(getMeasurementTracker()->geometricSearchTracker())(meas);
0036
0037 vector<TrajectoryMeasurement> result;
0038
0039
0040 if (mol.size() < 2)
0041 return vector<TrajectoryMeasurement>();
0042
0043
0044
0045 TrajectoryStateOnSurface current = (*(mol.rbegin() + 1)).second.back().updatedState();
0046
0047
0048
0049
0050
0051
0052
0053 LogDebug("MultiRecHitCollector") << "Layer " << mol.back().first << " has " << mol.back().second.size()
0054 << " measurements";
0055 LogTrace("MultiRecHitCollector") << "Original measurements are:";
0056 for (unsigned int iLay = 0; iLay < mol.size(); iLay++) {
0057 LogTrace("MultiRecHitCollector") << " Layer " << mol.at(iLay).first << " has " << mol.at(iLay).second.size()
0058 << " measurements:";
0059 vector<TrajectoryMeasurement>::const_iterator ibeg = (mol.at(iLay)).second.begin();
0060 vector<TrajectoryMeasurement>::const_iterator iend = (mol.at(iLay)).second.end();
0061 for (vector<TrajectoryMeasurement>::const_iterator imeas = ibeg; imeas != iend; ++imeas) {
0062 if (imeas->recHit()->isValid()) {
0063 LogTrace("MultiRecHitCollector") << " Valid Hit with DetId " << imeas->recHit()->geographicalId().rawId()
0064 << " local position " << imeas->recHit()->hit()->localPosition()
0065 << " global position " << imeas->recHit()->hit()->globalPosition();
0066 } else {
0067 LogTrace("MultiRecHitCollector") << " Invalid Hit with DetId " << imeas->recHit()->geographicalId().rawId();
0068 }
0069 }
0070 }
0071
0072
0073 vector<TrajectoryMeasurementGroup> groupedMeas;
0074 if (mol.back().first)
0075 groupedMeas = theLM.groupedMeasurements(*(mol.back().first), current, *backwardPropagator, *(getEstimator()));
0076
0077
0078
0079 vector<TrajectoryMeasurementGroup> sortedgroupedMeas;
0080 for (vector<TrajectoryMeasurementGroup>::reverse_iterator iter = groupedMeas.rbegin(); iter != groupedMeas.rend();
0081 iter++) {
0082 sortedgroupedMeas.push_back(*iter);
0083 }
0084
0085
0086 buildMultiRecHits(sortedgroupedMeas, result, theMTE);
0087
0088
0089 current = mol.back().second.front().updatedState();
0090
0091
0092 for (vector<pair<const DetLayer*, vector<TrajectoryMeasurement> > >::reverse_iterator imol = mol.rbegin() + 1;
0093 imol != mol.rend();
0094 imol++) {
0095 const DetLayer* lay = (*imol).first;
0096 LogDebug("MultiRecHitCollector") << "Layer " << lay << " has " << (*imol).second.size() << " measurements";
0097
0098 vector<TrajectoryMeasurementGroup> currentLayerMeas;
0099 if (lay) {
0100 currentLayerMeas = theLM.groupedMeasurements(*lay, current, *forwardPropagator, *(getEstimator()));
0101 }
0102
0103 buildMultiRecHits(currentLayerMeas, result, theMTE);
0104 current = (*imol).second.front().updatedState();
0105
0106 }
0107
0108 LogTrace("MultiRecHitCollector") << " Ending GroupedDAFHitCollector::recHits >> Original Measurement size "
0109 << meas.size()
0110 << "\n >> GroupedDAFHitCollector returned "
0111 << result.size() << " measurements";
0112
0113
0114
0115 if (result.size() > 2) {
0116 int hitcounter = 0;
0117
0118 for (vector<TrajectoryMeasurement>::const_iterator iimeas = result.begin(); iimeas != result.end(); ++iimeas) {
0119 if (iimeas->recHit()->isValid())
0120 hitcounter++;
0121 }
0122
0123 if (hitcounter > 2) {
0124 return result;
0125 }
0126
0127 else
0128 return vector<TrajectoryMeasurement>();
0129 }
0130
0131 else {
0132 return vector<TrajectoryMeasurement>();
0133 }
0134 }
0135
0136 void GroupedDAFHitCollector::buildMultiRecHits(const vector<TrajectoryMeasurementGroup>& measgroup,
0137 vector<TrajectoryMeasurement>& result,
0138 const MeasurementTrackerEvent*& theMTE) const {
0139 unsigned int initial_size = result.size();
0140
0141
0142 if (measgroup.empty()) {
0143 LogTrace("MultiRecHitCollector") << "No TrajectoryMeasurementGroups found for this layer\n";
0144
0145
0146 return;
0147 }
0148
0149
0150
0151
0152 LogTrace("MultiRecHitCollector") << "Found " << measgroup.size() << " groups for this layer";
0153
0154
0155
0156 for (vector<TrajectoryMeasurementGroup>::const_iterator igroup = measgroup.begin(); igroup != measgroup.end();
0157 igroup++) {
0158
0159 TrajectoryStateOnSurface state = igroup->measurements().front().predictedState();
0160 if (!state.isValid()) {
0161 LogTrace("MultiRecHitCollector") << "Something wrong! no valid TSOS found in current group ";
0162 continue;
0163 }
0164
0165 LogTrace("MultiRecHitCollector") << "This group has " << igroup->measurements().size() << " measurements";
0166 LogTrace("MultiRecHitCollector") << "This group has the following " << igroup->detGroup().size()
0167 << " detector ids: " << endl;
0168 for (DetGroup::const_iterator idet = igroup->detGroup().begin(); idet != igroup->detGroup().end(); ++idet) {
0169 LogTrace("MultiRecHitCollector") << idet->det()->geographicalId().rawId();
0170 }
0171
0172 vector<const TrackingRecHit*> hits;
0173 for (vector<TrajectoryMeasurement>::const_iterator imeas = igroup->measurements().begin();
0174 imeas != igroup->measurements().end();
0175 imeas++) {
0176
0177
0178
0179
0180
0181
0182 if (imeas->recHit()->getType() != TrackingRecHit::missing) {
0183 LogTrace("MultiRecHitCollector") << "This hit is valid ";
0184 hits.push_back(imeas->recHit()->hit());
0185 } else {
0186 LogTrace("MultiRecHitCollector") << " This hit is not valid and will not enter in the MRH. ";
0187 }
0188 }
0189
0190 if (hits.empty()) {
0191 LogTrace("MultiRecHitCollector") << "No valid hits found in current group ";
0192 continue;
0193 }
0194
0195 LogTrace("MultiRecHitCollector") << "The best TSOS in this group is " << state << " it lays on surface located at "
0196 << state.surface().position();
0197
0198 LogTrace("MultiRecHitCollector") << "For the MRH on this group the following hits will be used";
0199 for (vector<const TrackingRecHit*>::iterator iter = hits.begin(); iter != hits.end(); iter++) {
0200 string validity = "valid";
0201 if ((*iter)->getType() == TrackingRecHit::missing)
0202 validity = "missing !should not happen!";
0203 else if ((*iter)->getType() == TrackingRecHit::inactive)
0204 validity = "inactive";
0205 else if ((*iter)->getType() == TrackingRecHit::bad)
0206 validity = "bad";
0207 LogTrace("MultiRecHitCollector")
0208 << "DetId " << (*iter)->geographicalId().rawId() << " validity: " << validity << " surface position "
0209 << getMeasurementTracker()->geomTracker()->idToDet((*iter)->geographicalId())->position()
0210 << " hit local position " << (*iter)->localPosition();
0211 }
0212
0213
0214 }
0215
0216
0217 if (result.size() == initial_size) {
0218 LogTrace("MultiRecHitCollector") << "no valid measuremnt or no valid TSOS in none of the groups";
0219
0220 if (!measgroup.back().measurements().empty()) {
0221 result.push_back(measgroup.back().measurements().back());
0222 }
0223 }
0224 }