File indexing completed on 2024-04-06 12:28:44
0001 #include "RecoTracker/SpecialSeedGenerators/interface/CosmicSeedCreator.h"
0002 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h"
0003 #include "FWCore/Framework/interface/ConsumesCollector.h"
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0007 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
0008 #include "RecoTracker/TkSeedingLayers/interface/SeedComparitor.h"
0009 #include "RecoTracker/TkSeedingLayers/interface/SeedingHitSet.h"
0010
0011 namespace {
0012 template <class T>
0013 inline T sqr(T t) {
0014 return t * t;
0015 }
0016 }
0017
0018 CosmicSeedCreator::CosmicSeedCreator(const edm::ParameterSet& extra, edm::ConsumesCollector&& iC)
0019 : magneticFieldESToken_(iC.esConsumes()), maxseeds_(extra.getParameter<int>("maxseeds")) {}
0020
0021 void CosmicSeedCreator::init(const TrackingRegion& iregion, const edm::EventSetup& es, const SeedComparitor* ifilter) {
0022 region = &iregion;
0023 filter = ifilter;
0024
0025 bfield = &es.getData(magneticFieldESToken_);
0026 }
0027
0028 void CosmicSeedCreator::makeSeed(TrajectorySeedCollection& seedCollection, const SeedingHitSet& ordered) {
0029
0030
0031
0032
0033
0034
0035
0036 const SeedingHitSet& hits = ordered;
0037 if (hits.size() < 2)
0038 return;
0039
0040
0041
0042 SeedingHitSet::ConstRecHitPointer tth1 = hits[0];
0043 SeedingHitSet::ConstRecHitPointer tth2 = hits[1];
0044 assert(!trackerHitRTTI::isUndef(*tth1));
0045 assert(!trackerHitRTTI::isUndef(*tth2));
0046
0047 SeedingHitSet::ConstRecHitPointer usedHit;
0048
0049
0050
0051
0052 GlobalVector initialMomentum(region->direction());
0053
0054
0055
0056 LogDebug("CosmicSeedCreator") << "initial momentum = " << initialMomentum;
0057
0058
0059
0060
0061
0062
0063
0064
0065 bool reverseAll = false;
0066 if (fabs(tth1->globalPosition().perp()) < fabs(tth2->globalPosition().perp()))
0067
0068 {
0069 usedHit = tth1;
0070 reverseAll = true;
0071 }
0072
0073 else
0074 usedHit = tth2;
0075
0076
0077
0078
0079 bool bottomSeed = (usedHit->globalPosition().y() < 0);
0080
0081
0082
0083 edm::OwnVector<TrackingRecHit> seedHits;
0084
0085 if (reverseAll) {
0086 LogDebug("CosmicSeedCreator") << "Reverse all applied";
0087
0088 seedHits.push_back(tth2->clone());
0089 seedHits.push_back(tth1->clone());
0090 }
0091
0092 else {
0093 seedHits.push_back(tth1->clone());
0094 seedHits.push_back(tth2->clone());
0095 }
0096
0097
0098
0099
0100 PropagationDirection seedDirection = alongMomentum;
0101
0102 if (reverseAll)
0103 initialMomentum *= -1;
0104
0105 if (bottomSeed) {
0106
0107
0108 initialMomentum *= -1;
0109
0110 seedDirection = oppositeToMomentum;
0111 }
0112
0113 for (int charge = -1; charge <= 1; charge += 2) {
0114
0115
0116 FreeTrajectoryState freeState(
0117 GlobalTrajectoryParameters(usedHit->globalPosition(), initialMomentum, charge, bfield),
0118 CurvilinearTrajectoryError(ROOT::Math::SMatrixIdentity()));
0119
0120 LogDebug("CosmicSeedCreator") << "Position freeState: " << usedHit->globalPosition() << "\nCharge: " << charge
0121 << "\nInitial momentum :" << initialMomentum;
0122
0123 TrajectoryStateOnSurface tsos(freeState, *usedHit->surface());
0124
0125 PTrajectoryStateOnDet const& PTraj =
0126 trajectoryStateTransform::persistentState(tsos, usedHit->hit()->geographicalId().rawId());
0127 seedCollection.emplace_back(PTraj, seedHits, seedDirection);
0128
0129 }
0130
0131
0132
0133
0134
0135
0136 LogDebug("CosmicSeedCreator") << "Using SeedCreator---------->\n"
0137 << "seedCollections size = " << seedCollection.size();
0138
0139 if (seedCollection.size() > maxseeds_) {
0140 edm::LogError("TooManySeeds") << "Found too many seeds (" << seedCollection.size() << " > " << maxseeds_
0141 << "), bailing out.\n";
0142 seedCollection.clear();
0143 }
0144 }