25 numOfMaxSeedsParam_(iConfig.getParameter<uint32_t>(
"maxSeeds")),
26 numOfLayersToTry_(iConfig.getParameter<int32_t>(
"layersToTry")),
27 numOfHitsToTry_(iConfig.getParameter<int32_t>(
"hitsToTry")),
28 fixedErrorRescalingForHits_(iConfig.getParameter<double>(
"fixedErrorRescaleFactorForHits")),
29 fixedErrorRescalingForHitless_(iConfig.getParameter<double>(
"fixedErrorRescaleFactorForHitless")),
30 adjustErrorsDynamicallyForHits_(iConfig.getParameter<
bool>(
"adjustErrorsDynamicallyForHits")),
31 adjustErrorsDynamicallyForHitless_(iConfig.getParameter<
bool>(
"adjustErrorsDynamicallyForHitless")),
32 minEtaForTEC_(iConfig.getParameter<double>(
"minEtaForTEC")),
33 maxEtaForTOB_(iConfig.getParameter<double>(
"maxEtaForTOB")),
34 useHitLessSeeds_(iConfig.getParameter<
bool>(
"UseHitLessSeeds")),
35 useStereoLayersInTEC_(iConfig.getParameter<
bool>(
"UseStereoLayersInTEC")),
37 measurementTrackerTag_(
39 pT1_(iConfig.getParameter<double>(
"pT1")),
40 pT2_(iConfig.getParameter<double>(
"pT2")),
41 pT3_(iConfig.getParameter<double>(
"pT3")),
42 eta1_(iConfig.getParameter<double>(
"eta1")),
43 eta2_(iConfig.getParameter<double>(
"eta2")),
44 SF1_(iConfig.getParameter<double>(
"SF1")),
45 SF2_(iConfig.getParameter<double>(
"SF2")),
46 SF3_(iConfig.getParameter<double>(
"SF3")),
47 SF4_(iConfig.getParameter<double>(
"SF4")),
48 SF5_(iConfig.getParameter<double>(
"SF5")),
49 tsosDiff_(iConfig.getParameter<double>(
"tsosDiff")),
50 propagatorName_(iConfig.getParameter<
std::
string>(
"propagatorName")),
51 theCategory(
string(
"Muon|RecoMuon|TSGForOI")),
54 produces<std::vector<TrajectorySeed> >();
62 unsigned int numSeedsMade = 0;
63 bool analysedL2 =
false;
64 unsigned int layerCount = 0;
85 std::unique_ptr<std::vector<TrajectorySeed> >
result(
new std::vector<TrajectorySeed>());
88 std::vector<BarrelDetLayer const*>
const& tob = measurementTrackerH->geometricSearchTracker()->tobLayers();
89 std::vector<ForwardDetLayer const*>
const& tecPositive =
91 ? measurementTrackerH->geometricSearchTracker()->posTidLayers()
92 : measurementTrackerH->geometricSearchTracker()->posTecLayers();
93 std::vector<ForwardDetLayer const*>
const& tecNegative =
95 ? measurementTrackerH->geometricSearchTracker()->negTidLayers()
96 : measurementTrackerH->geometricSearchTracker()->negTecLayers();
108 for (
unsigned int l2TrackColIndex(0); l2TrackColIndex != l2TrackCol->size(); ++l2TrackColIndex) {
110 std::unique_ptr<std::vector<TrajectorySeed> >
out(
new std::vector<TrajectorySeed>());
111 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: L2 muon pT, eta, phi --> " << l2->pt() <<
" , " << l2->eta() <<
" , " 112 << l2->phi() << endl;
115 dummyPlane->move(fts.
position() - dummyPlane->position());
117 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: Created TSOSatIP: " << tsosAtIP << std::endl;
122 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: Created TSOSatMuonSystem: " << tsosAtMuonSystem << endl;
124 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: Check the error of the L2 parameter and use hit seeds if big errors" 135 bool useBoth =
false;
136 if (outerTkStateInside.isValid() && outerTkStateOutside.
isValid()) {
137 dist =
match_Chi2(outerTkStateInside, outerTkStateOutside);
151 for (
auto it = tob.rbegin(); it != tob.rend(); ++it) {
152 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: looping in TOB layer " << layerCount << endl;
169 for (
auto it = tob.rbegin(); it != tob.rend(); ++it) {
170 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: looping in TOB layer " << layerCount << endl;
196 for (
auto it = tecPositive.rbegin(); it != tecPositive.rend(); ++it) {
197 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: looping in TEC+ layer " << layerCount << endl;
214 for (
auto it = tecPositive.rbegin(); it != tecPositive.rend(); ++it) {
215 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: looping in TEC+ layer " << layerCount << endl;
236 for (
auto it = tecNegative.rbegin(); it != tecNegative.rend(); ++it) {
237 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: looping in TEC- layer " << layerCount << endl;
254 for (
auto it = tecNegative.rbegin(); it != tecNegative.rend(); ++it) {
255 LogTrace(
"TSGForOI") <<
"TSGForOI::produce: looping in TEC- layer " << layerCount << endl;
273 for (std::vector<TrajectorySeed>::iterator it =
out->begin(); it !=
out->end(); ++it) {
290 unsigned int& numSeedsMade,
291 unsigned int& numOfMaxSeeds,
292 unsigned int& layerCount,
295 if (numSeedsMade > numOfMaxSeeds)
297 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: numSeedsMade = " << numSeedsMade
298 <<
" , layerCount = " << layerCount << endl;
300 double errorSFHits = 1.0;
301 double errorSFHitless = 1.0;
311 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: Start hitless" << endl;
312 std::vector<GeometricSearchDet::DetWithState> dets;
315 auto const& detOnLayer = dets.front().first;
316 auto const& tsosOnLayer = dets.front().second;
317 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: tsosOnLayer " << tsosOnLayer << endl;
318 if (!tsosOnLayer.isValid()) {
327 dets.front().second.rescaleError(errorSFHitless);
332 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: TSOD (Hitless) done " << endl;
341 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: Start Hits" << endl;
347 *measurementTrackerH,
382 LogTrace(
theCategory) <<
"TSGForOI::calculateSFFromL2: SF has been calculated as: " << theSF;
389 std::vector<TrajectorySeed>&
out,
393 unsigned int& numSeedsMade,
394 const double errorSF,
395 const double l2Eta)
const {
400 std::vector<GeometricSearchDet::DetWithState> dets;
404 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: find measurements on each detWithState " << dets.size() << endl;
405 std::vector<TrajectoryMeasurement> meas;
406 for (std::vector<GeometricSearchDet::DetWithState>::iterator it = dets.begin(); it != dets.end(); ++it) {
411 if (!it->second.isValid())
414 std::vector<TrajectoryMeasurement> mymeas =
416 for (std::vector<TrajectoryMeasurement>::const_iterator it2 = mymeas.begin(), ed2 = mymeas.end(); it2 != ed2;
418 if (it2->recHit()->isValid())
419 meas.push_back(*it2);
425 <<
"TSGForOI::findSeedsOnLayer: Update TSOS using TMs after sorting, then create Trajectory Seed, number of TM = " 426 << meas.size() << endl;
427 unsigned int found = 0;
429 for (std::vector<TrajectoryMeasurement>::const_iterator it = meas.begin(); it != meas.end(); ++it) {
431 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: TSOS for TM " <<
found << endl;
437 DetId detid = ((*it).recHit()->hit())->geographicalId();
445 seedHits.
push_back(*it->recHit()->hit());
448 LogTrace(
"TSGForOI") <<
"TSGForOI::findSeedsOnLayer: number of seedHits: " << seedHits.
size() << endl;
469 bool ierr = !
m.Invert();
472 edm::LogInfo(
"TSGForOI") <<
"Error inverting covariance matrix";
476 double est = ROOT::Math::Similarity(
v,
m);
484 desc.add<
int>(
"layersToTry", 1);
485 desc.add<
double>(
"fixedErrorRescaleFactorForHitless", 2.0);
486 desc.add<
int>(
"hitsToTry", 1);
487 desc.add<
bool>(
"adjustErrorsDynamicallyForHits",
false);
488 desc.add<
bool>(
"adjustErrorsDynamicallyForHitless",
false);
490 desc.add<
bool>(
"UseHitLessSeeds",
true);
491 desc.add<
bool>(
"UseStereoLayersInTEC",
false);
492 desc.add<
std::string>(
"estimator",
"hltESPChi2MeasurementEstimator100");
493 desc.add<
double>(
"maxEtaForTOB", 1.2);
494 desc.add<
double>(
"minEtaForTEC", 0.8);
495 desc.addUntracked<
bool>(
"debug",
true);
496 desc.add<
double>(
"fixedErrorRescaleFactorForHits", 2.0);
497 desc.add<
unsigned int>(
"maxSeeds", 1);
498 desc.add<
double>(
"pT1", 13.0);
499 desc.add<
double>(
"pT2", 30.0);
500 desc.add<
double>(
"pT3", 70.0);
501 desc.add<
double>(
"eta1", 1.0);
502 desc.add<
double>(
"eta2", 1.4);
503 desc.add<
double>(
"SF1", 3.0);
504 desc.add<
double>(
"SF2", 4.0);
505 desc.add<
double>(
"SF3", 5.0);
506 desc.add<
double>(
"SF4", 7.0);
507 desc.add<
double>(
"SF5", 10.0);
508 desc.add<
double>(
"tsosDiff", 0.03);
510 descriptions.
add(
"TSGForOI",
desc);
void rescaleError(double factor)
static constexpr auto TEC
const LocalTrajectoryError & localError() const
int makeSeedsFromHits(const TrackerTopology *tTopo, const GeometricSearchDet &layer, const TrajectoryStateOnSurface &tsosAtIP, std::vector< TrajectorySeed > &out, const Propagator &propagatorAlong, const MeasurementTrackerEvent &measurementTracker, edm::ESHandle< Chi2MeasurementEstimatorBase > &estimator_, unsigned int &numSeedsMade, const double errorSF, const double l2Eta) const
Function to find hits on layers and create seeds from updated TSOS.
std::vector< TrajectoryMeasurement > fastMeasurements(const TrajectoryStateOnSurface &stateOnThisDet, const TrajectoryStateOnSurface &tsos2, const Propagator &prop, const MeasurementEstimator &est) const
const double tsosDiff_
Distance of TSOSs to trigger using hits or not.
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorOppositeToken_
std::vector< Track > TrackCollection
collection of Tracks
void produce(edm::StreamID sid, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const LocalTrajectoryParameters & localParameters() const
const edm::ESGetToken< Chi2MeasurementEstimatorBase, TrackingComponentsRecord > estimatorToken_
Estimator used to find dets and TrajectoryMeasurements.
std::unique_ptr< T, impl::DeviceDeleter > unique_ptr
const double maxEtaForTOB_
Maximum eta value to activate searching in the TOB.
void findSeedsOnLayer(const TrackerTopology *tTopo, const GeometricSearchDet &layer, const TrajectoryStateOnSurface &tsosAtIP, const Propagator &propagatorAlong, const Propagator &propagatorOpposite, const reco::TrackRef l2, edm::ESHandle< Chi2MeasurementEstimatorBase > &estimator_, edm::Handle< MeasurementTrackerEvent > &measurementTrackerH, unsigned int &numSeedsMade, unsigned int &numOfMaxSeeds, unsigned int &layerCount, bool &analysedL2, std::unique_ptr< std::vector< TrajectorySeed > > &out) const
Function to find seeds on a given layer.
constexpr std::array< uint8_t, layerIndexSize > layer
static PlanePointer build(Args &&... args)
GlobalPoint position() const
std::unique_ptr< Propagator > SetPropagationDirection(Propagator const &iprop, PropagationDirection dir)
const double minEtaForTEC_
Minimum eta value to activate searching in the TEC.
T const * product() const
const double fixedErrorRescalingForHits_
How much to rescale errors from the L2 (fixed error vs pT, eta)
const std::unique_ptr< TrajectoryStateUpdator > updator_
KFUpdator defined in constructor.
const edm::ESGetToken< Propagator, TrackingComponentsRecord > smartOppositeToken_
bool isThere(GeomDetEnumerators::SubDetector subdet) const
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
AlgebraicVector5 vector() const
const bool useHitLessSeeds_
const unsigned int numOfLayersToTry_
How many layers to try.
Abs< T >::type abs(const T &t)
ROOT::Math::SVector< double, 5 > AlgebraicVector5
#define DEFINE_FWK_MODULE(type)
const bool useStereoLayersInTEC_
Switch ON to use Stereo layers instead of using every layer in TEC.
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
bool getData(T &iHolder) const
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Create L3MuonTrajectorySeeds from L2 Muons updated at vertex in an outside in manner.
const bool adjustErrorsDynamicallyForHitless_
double match_Chi2(const TrajectoryStateOnSurface &tsos1, const TrajectoryStateOnSurface &tsos2) const
const double pT1_
pT, eta ranges and scale factor values
Log< level::Info, false > LogInfo
constexpr uint32_t rawId() const
get the raw id
double calculateSFFromL2(const reco::TrackRef track) const
Function used to calculate the dynamic error SF by analysing the L2.
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const edm::EDGetTokenT< reco::TrackCollection > src_
Labels for input collections.
bool tecIsStereo(const DetId &id) const
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magfieldToken_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tmpTkGeometryToken_
const bool adjustErrorsDynamicallyForHits_
Whether or not to use an automatically calculated scale-factor value.
const AlgebraicSymMatrix55 & matrix() const
TSGForOI(const edm::ParameterSet &iConfig)
const edm::EDGetTokenT< MeasurementTrackerEvent > measurementTrackerTag_
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorAlongToken_
const unsigned int numOfMaxSeedsParam_
Maximum number of seeds for each L2.
const std::string theCategory
const edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > geometryToken_
const unsigned int numOfHitsToTry_
How many hits to try per layer.
const edm::ESGetToken< Propagator, TrackingComponentsRecord > shpOppositeToken_
const double fixedErrorRescalingForHitless_