File indexing completed on 2025-03-05 03:16:50
0001
0002
0003
0004 #include <memory>
0005 #include <string>
0006
0007 #include "DataFormats/Common/interface/Handle.h"
0008 #include "DataFormats/TrackReco/interface/Track.h"
0009 #include "DataFormats/TrackReco/interface/TrackExtra.h"
0010 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0011 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"
0012 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2DCollection.h"
0013 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2DCollection.h"
0014 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
0015 #include "FWCore/Framework/interface/ESHandle.h"
0016 #include "FWCore/Framework/interface/EventSetup.h"
0017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0018 #include "FWCore/Utilities/interface/InputTag.h"
0019 #include "RecoTracker/SingleTrackPattern/interface/CosmicTrackFinder.h"
0020 #include "RecoTracker/TransientTrackingRecHit/interface/Traj2TrackHits.h"
0021 #include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h"
0022 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
0023 #include "TrackingTools/PatternTools/interface/Trajectory.h"
0024
0025 namespace cms {
0026
0027 CosmicTrackFinder::CosmicTrackFinder(edm::ParameterSet const& conf)
0028 : cosmicTrajectoryBuilder_(conf, consumesCollector()), crackTrajectoryBuilder_(conf, consumesCollector()) {
0029 geometry = conf.getUntrackedParameter<std::string>("GeometricStructure", "STANDARD");
0030 useHitsSplitting_ = conf.getParameter<bool>("useHitsSplitting");
0031 matchedrecHitsToken_ =
0032 consumes<SiStripMatchedRecHit2DCollection>(conf.getParameter<edm::InputTag>("matchedRecHits"));
0033 rphirecHitsToken_ = consumes<SiStripRecHit2DCollection>(conf.getParameter<edm::InputTag>("rphirecHits"));
0034 stereorecHitsToken_ = consumes<SiStripRecHit2DCollection>(conf.getParameter<edm::InputTag>("stereorecHits"));
0035 pixelRecHitsToken_ = consumes<SiPixelRecHitCollection>(conf.getParameter<edm::InputTag>("pixelRecHits"));
0036 seedToken_ = consumes<TrajectorySeedCollection>(conf.getParameter<edm::InputTag>("cosmicSeeds"));
0037
0038 produces<TrackCandidateCollection>();
0039 }
0040
0041
0042 CosmicTrackFinder::~CosmicTrackFinder() {}
0043
0044
0045 void CosmicTrackFinder::produce(edm::Event& e, const edm::EventSetup& es) {
0046 using namespace std;
0047
0048
0049 edm::Handle<TrajectorySeedCollection> seed;
0050 e.getByToken(seedToken_, seed);
0051
0052
0053 static const SiPixelRecHitCollection s_empty;
0054 const SiPixelRecHitCollection* pixelHitCollection = &s_empty;
0055 edm::Handle<SiPixelRecHitCollection> pixelHits;
0056 if (geometry != "MTCC" && (geometry != "CRACK")) {
0057 if (e.getByToken(pixelRecHitsToken_, pixelHits)) {
0058 pixelHitCollection = pixelHits.product();
0059 } else {
0060 Labels l;
0061 labelsForToken(pixelRecHitsToken_, l);
0062 edm::LogWarning("CosmicTrackFinder") << "Collection SiPixelRecHitCollection with InputTag " << l.module
0063 << " cannot be found, using empty collection of same type.";
0064 }
0065 }
0066
0067
0068 edm::Handle<SiStripMatchedRecHit2DCollection> matchedrecHits;
0069 e.getByToken(matchedrecHitsToken_, matchedrecHits);
0070 edm::Handle<SiStripRecHit2DCollection> rphirecHits;
0071 e.getByToken(rphirecHitsToken_, rphirecHits);
0072 edm::Handle<SiStripRecHit2DCollection> stereorecHits;
0073 e.getByToken(stereorecHitsToken_, stereorecHits);
0074
0075
0076 auto output = std::make_unique<TrackCandidateCollection>();
0077
0078 edm::LogVerbatim("CosmicTrackFinder") << "========== Cosmic Track Finder Info ==========";
0079 edm::LogVerbatim("CosmicTrackFinder") << " Numbers of Seeds " << (*seed).size();
0080 if (!(*seed).empty()) {
0081 std::vector<Trajectory> trajoutput;
0082
0083 const TransientTrackingRecHitBuilder* hitBuilder = nullptr;
0084 if (geometry != "CRACK") {
0085 cosmicTrajectoryBuilder_.run(
0086 *seed, *stereorecHits, *rphirecHits, *matchedrecHits, *pixelHitCollection, es, e, trajoutput);
0087 hitBuilder = cosmicTrajectoryBuilder_.hitBuilder();
0088 } else {
0089 crackTrajectoryBuilder_.run(
0090 *seed, *stereorecHits, *rphirecHits, *matchedrecHits, *pixelHitCollection, es, e, trajoutput);
0091 hitBuilder = crackTrajectoryBuilder_.hitBuilder();
0092 }
0093 assert(hitBuilder);
0094 Traj2TrackHits t2t(hitBuilder, true);
0095
0096 edm::LogVerbatim("CosmicTrackFinder") << " Numbers of Temp Trajectories " << trajoutput.size();
0097 edm::LogVerbatim("CosmicTrackFinder") << "========== END Info ==========";
0098 if (!trajoutput.empty()) {
0099
0100 std::vector<Trajectory*> tmpTraj;
0101 std::vector<Trajectory>::iterator itr;
0102 for (itr = trajoutput.begin(); itr != trajoutput.end(); itr++)
0103 tmpTraj.push_back(&(*itr));
0104
0105
0106
0107
0108 if (geometry == "MTCC")
0109 stable_sort(tmpTraj.begin(), tmpTraj.end(), CompareTrajLay());
0110 else
0111 stable_sort(tmpTraj.begin(), tmpTraj.end(), CompareTrajChi());
0112
0113
0114
0115 const Trajectory theTraj = *(*tmpTraj.begin());
0116 bool seedplus = (theTraj.seed().direction() == alongMomentum);
0117
0118
0119 LogDebug("CosmicTrackFinder") << "Reconstruction " << (seedplus ? "along" : "opposite to") << " momentum";
0120
0121
0122
0123
0124
0125 edm::OwnVector<TrackingRecHit> recHits;
0126 if (theTraj.direction() == alongMomentum)
0127 std::cout << "cosmic: along momentum... " << std::endl;
0128 t2t(theTraj, recHits, useHitsSplitting_);
0129 recHits.reverse();
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 TSOS firstState;
0145 unsigned int firstId;
0146
0147
0148 firstState = theTraj.lastMeasurement().updatedState();
0149 firstId = theTraj.lastMeasurement().recHitR().rawId();
0150
0151
0152
0153
0154
0155
0156
0157
0158 AlgebraicSymMatrix55 C = AlgebraicMatrixID();
0159 TSOS startingState(
0160 firstState.localParameters(), LocalTrajectoryError(C), firstState.surface(), firstState.magneticField());
0161
0162
0163 if (!firstState.isValid()) {
0164 edm::LogWarning("CosmicTrackFinder") << "invalid innerState, will not make TrackCandidate";
0165 e.put(std::move(output));
0166 return;
0167 }
0168
0169
0170 if (firstId != recHits.front().rawId()) {
0171 edm::LogWarning("CosmicTrackFinder") << "Mismatch in DetID of first hit: firstID= " << firstId
0172 << " DetId= " << recHits.front().geographicalId().rawId();
0173 e.put(std::move(output));
0174 return;
0175 }
0176
0177 PTrajectoryStateOnDet const& state = trajectoryStateTransform::persistentState(startingState, firstId);
0178
0179 output->push_back(TrackCandidate(recHits, theTraj.seed(), state, theTraj.seedRef()));
0180 }
0181 }
0182 e.put(std::move(output));
0183 }
0184
0185 }