37 #include "CLHEP/Vector/ThreeVector.h"
88 static constexpr
float etaBoundary_{1.1};
89 static constexpr
float distMB2_{550.};
90 static constexpr
float distME2_{850.};
91 static constexpr
float phiCorr0_{1.464};
92 static constexpr
float phiCorr1_{1.7};
93 static constexpr
float phiCorr2_{144.};
107 : source_(iConfig.getParameter<
InputTag>(
"InputObjects")),
109 propagatorName_(iConfig.getParameter<
string>(
"Propagator")),
110 l1MinPt_(iConfig.getParameter<double>(
"L1MinPt")),
111 l1MaxEta_(iConfig.getParameter<double>(
"L1MaxEta")),
112 minPtBarrel_(iConfig.getParameter<double>(
"SetMinPtBarrelTo")),
113 minPtEndcap_(iConfig.getParameter<double>(
"SetMinPtEndcapTo")),
114 minPL1Tk_(iConfig.getParameter<double>(
"MinPL1Tk")),
115 minPtL1TkBarrel_(iConfig.getParameter<double>(
"MinPtL1TkBarrel")),
116 useOfflineSeed_(iConfig.getUntrackedParameter<
bool>(
"UseOfflineSeed",
false)),
117 useUnassociatedL1_(iConfig.getParameter<
bool>(
"UseUnassociatedL1")),
118 matchingDR_(iConfig.getParameter<
std::vector<double>>(
"MatchDR")),
119 etaBins_(iConfig.getParameter<
std::vector<double>>(
"EtaMatchingBins")) {
127 <<
"does not match number of eta bins." << endl;
135 service_ = std::make_unique<MuonServiceProxy>(serviceParameters, consumesCollector());
138 estimator_ = std::make_unique<Chi2MeasurementEstimator>(10000.);
140 produces<L2MuonTrajectorySeedCollection>();
146 desc.
add<
string>(
"Propagator",
"");
147 desc.
add<
double>(
"L1MinPt", -1.);
148 desc.
add<
double>(
"L1MaxEta", 5.0);
149 desc.
add<
double>(
"SetMinPtBarrelTo", 3.5);
150 desc.
add<
double>(
"SetMinPtEndcapTo", 1.0);
151 desc.
add<
double>(
"MinPL1Tk", 3.5);
152 desc.
add<
double>(
"MinPtL1TkBarrel", 3.5);
154 desc.
add<
bool>(
"UseUnassociatedL1",
true);
155 desc.
add<std::vector<double>>(
"MatchDR", {0.3});
156 desc.
add<std::vector<double>>(
"EtaMatchingBins", {0., 2.5});
160 psd0.
addUntracked<std::vector<std::string>>(
"Propagators", {
"SteppingHelixPropagatorAny"});
161 psd0.add<
bool>(
"RPCLayers",
true);
162 psd0.addUntracked<
bool>(
"UseMuonNavigation",
true);
164 descriptions.
add(
"L2MuonSeedGeneratorFromL1TkMu", desc);
171 auto output = std::make_unique<L2MuonTrajectorySeedCollection>();
178 vector<int> offlineSeedMap;
181 offlineSeedMap = vector<int>(offlineSeedHandle->size(), 0);
184 for (
auto const &tkmu : *muColl) {
186 auto const &it = tkmu.trkPtr();
189 auto p3 = it->momentum();
191 float tk_p =
p3.mag();
195 float tk_pt =
p3.perp();
196 float tk_eta =
p3.eta();
203 float tk_phi =
p3.phi();
204 float tk_q = it->rInv() > 0 ? 1. : -1.;
205 float tk_z = it->POCA().z();
207 float dzCorrPhi = 1.;
209 float etaProp = tk_aeta;
213 deta = tk_z /
distMB2_ / cosh(tk_aeta);
218 dzCorrPhi = 1. +
delta;
222 deta = zOzs / (1. - zOzs);
224 deta = zOzs / (1. + zOzs);
225 deta = deta * tanh(tk_eta);
231 float eta = tk_eta + deta;
234 int charge = it->rInv() > 0 ? 1 : -1;
253 CLHEP::Hep3Vector vec(0., 1., 0.);
264 detLayer =
service_->detLayerGeometry()->idToLayer(theid);
268 const BoundCylinder *bc = dynamic_cast<const BoundCylinder *>(sur);
282 detLayer =
service_->detLayerGeometry()->idToLayer(theid);
300 mat[0][0] = (0.25 /
pt) * (0.25 /
pt);
302 mat[0][0] = (0.4 /
pt) * (0.4 /
pt);
304 mat[1][1] = 0.05 * 0.05;
305 mat[2][2] = 0.2 * 0.2;
306 mat[3][3] = 20. * 20.;
307 mat[4][4] = 20. * 20.;
334 std::vector<pair<const GeomDet *, TrajectoryStateOnSurface>> detsWithStates =
337 if (detsWithStates.empty() &&
barrel) {
341 const DetLayer *ME2DetLayer =
service_->detLayerGeometry()->idToLayer(fallback_id);
347 if (!detsWithStates.empty()) {
349 const GeomDet *newTSOSDet = detsWithStates.front().first;
365 if (assoOffseed !=
nullptr) {
368 for (; tsci != tscie; ++tsci) {
399 std::vector<int> &offseedMap,
405 const std::string metlabel =
"Muon|RecoMuon|L2MuonSeedGeneratorFromL1TkMu";
410 double bestDr2 = 99999.;
411 unsigned int nOffseed(0);
414 for (offseed = offseeds->
begin(); offseed != endOffseed; ++offseed, ++nOffseed) {
415 if (offseedMap[nOffseed] != 0)
418 ->idToDet(offseed->startingState().detId())
420 .toGlobal(offseed->startingState().parameters().position());
422 ->idToDet(offseed->startingState().detId())
424 .toGlobal(offseed->startingState().parameters().momentum());
432 glbPos, glbMom, offseed->startingState().parameters().charge(), &*
service_->magneticField());
435 LogDebug(metlabel) <<
"Offline seed info: Det and State" << std::endl;
436 LogDebug(metlabel) << debugtmp.
dumpMuonId(offseed->startingState().detId()) << std::endl;
437 LogDebug(metlabel) <<
"pos: (r=" << offseedFTS.position().mag() <<
", phi=" << offseedFTS.position().phi()
438 <<
", eta=" << offseedFTS.position().eta() <<
")" << std::endl;
439 LogDebug(metlabel) <<
"mom: (q*pt=" << offseedFTS.charge() * offseedFTS.momentum().perp()
440 <<
", phi=" << offseedFTS.momentum().phi() <<
", eta=" << offseedFTS.momentum().eta() <<
")"
444 if (offseedTsos.isValid()) {
445 LogDebug(metlabel) <<
"Offline seed info after propagation to L1 layer:" << std::endl;
446 LogDebug(metlabel) <<
"pos: (r=" << offseedTsos.globalPosition().mag()
447 <<
", phi=" << offseedTsos.globalPosition().phi()
448 <<
", eta=" << offseedTsos.globalPosition().eta() <<
")" << std::endl;
449 LogDebug(metlabel) <<
"mom: (q*pt=" << offseedTsos.charge() * offseedTsos.globalMomentum().perp()
450 <<
", phi=" << offseedTsos.globalMomentum().phi()
451 <<
", eta=" << offseedTsos.globalMomentum().eta() <<
")" << std::endl
455 offseedTsos.globalPosition().eta(),
456 offseedTsos.globalPosition().
phi());
457 LogDebug(metlabel) <<
" -- DR = " << newDr2 << std::endl;
459 LogDebug(metlabel) <<
" --> OK! " << newDr2 << std::endl << std::endl;
460 selOffseed = &*offseed;
462 offseedMap[nOffseed] = 1;
463 if (lastOffseed > -1)
464 offseedMap[lastOffseed] = 0;
465 lastOffseed = nOffseed;
467 LogDebug(metlabel) <<
" --> Rejected. " << newDr2 << std::endl << std::endl;
470 LogDebug(metlabel) <<
"Invalid offline seed TSOS after propagation!" << std::endl << std::endl;