Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-05 03:16:50

0001 // Package:    RecoTracker/SingleTrackPattern
0002 // Class:      CosmicTrackFinder
0003 // Original Author:  Michele Pioppi-INFN perugia
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   // Virtual destructor needed.
0042   CosmicTrackFinder::~CosmicTrackFinder() {}
0043 
0044   // Functions that gets called by framework every event
0045   void CosmicTrackFinder::produce(edm::Event& e, const edm::EventSetup& es) {
0046     using namespace std;
0047 
0048     // retrieve seeds
0049     edm::Handle<TrajectorySeedCollection> seed;
0050     e.getByToken(seedToken_, seed);
0051 
0052     //retrieve PixelRecHits
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     //retrieve StripRecHits
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     // Step B: create empty output collection
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         // crazyness...
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         //The best track is selected
0106         //FOR MTCC the criteria are:
0107         //1)# of layers,2) # of Hits,3)Chi2
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         // std::cout << "CosmicTrackFinder " <<"Reconstruction " <<  (seedplus ? "along" : "opposite to") << " momentum" << std::endl;
0119         LogDebug("CosmicTrackFinder") << "Reconstruction " << (seedplus ? "along" : "opposite to") << " momentum";
0120 
0121         /*
0122     // === the convention is to save always final tracks with hits sorted *along* momentum
0123         // --- this is NOT what was necessaraly happening before and not consistent with what done in standard CKF (this is a candidate not a track)    
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();  // according to original code
0130 
0131         /*
0132     Trajectory::RecHitContainer thits;
0133     //it->recHitsV(thits);
0134         theTraj.recHitsV(thits,useHitsSplitting_);
0135     edm::OwnVector<TrackingRecHit> recHits;
0136     recHits.reserve(thits.size());
0137     // reverse hit order
0138     for (Trajectory::RecHitContainer::const_iterator hitIt = thits.end()-1;
0139          hitIt >= thits.begin(); hitIt--) {
0140       recHits.push_back( (**hitIt).hit()->clone());
0141     }
0142        */
0143 
0144         TSOS firstState;
0145         unsigned int firstId;
0146 
0147         // assume not along momentum....
0148         firstState = theTraj.lastMeasurement().updatedState();
0149         firstId = theTraj.lastMeasurement().recHitR().rawId();
0150         //firstId = recHits.front().rawId();
0151 
0152         /*
0153     cout << "firstState y, z: " << firstState.globalPosition().y() 
0154          << " , " << firstState.globalPosition().z() <<  endl;
0155 
0156     */
0157 
0158         AlgebraicSymMatrix55 C = AlgebraicMatrixID();
0159         TSOS startingState(
0160             firstState.localParameters(), LocalTrajectoryError(C), firstState.surface(), firstState.magneticField());
0161 
0162         // protection againt invalid initial states
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         // FIXME in case of slitting this can happen see CkfTrackCandidateMakerBase
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 }  // namespace cms