50 return (Ref_L1A->pt() > Ref_L1B->pt());
58 if (Ref_L1A->hwQual() > Ref_L1B->hwQual())
60 if (Ref_L1A->hwQual() < Ref_L1B->hwQual())
64 return (Ref_L1A->pt() > Ref_L1B->pt());
70 theL1GMTReadoutCollection(iConfig.getParameter<
InputTag>(
"GMTReadoutCollection")),
72 theL1MinPt(iConfig.getParameter<double>(
"L1MinPt")),
73 theL1MaxEta(iConfig.getParameter<double>(
"L1MaxEta")),
74 theL1MinQuality(iConfig.getParameter<unsigned int>(
"L1MinQuality")),
75 theMinPtBarrel(iConfig.getParameter<double>(
"SetMinPtBarrelTo")),
76 theMinPtEndcap(iConfig.getParameter<double>(
"SetMinPtEndcapTo")),
77 useOfflineSeed(iConfig.getUntrackedParameter<bool>(
"UseOfflineSeed",
false)),
78 useUnassociatedL1(iConfig.getParameter<bool>(
"UseUnassociatedL1")),
79 matchingDR(iConfig.getParameter<std::
vector<double>>(
"MatchDR")),
80 etaBins(iConfig.getParameter<std::
vector<double>>(
"EtaMatchingBins")),
81 centralBxOnly_(iConfig.getParameter<bool>(
"CentralBxOnly")),
82 matchType(iConfig.getParameter<unsigned int>(
"MatchType")),
83 sortType(iConfig.getParameter<unsigned int>(
"SortType")) {
93 <<
"does not match number of eta bins." << endl;
98 throw cms::Exception(
"Configuration") <<
"Wrong MatchType or SortType" << endl;
110 produces<L2MuonTrajectorySeedCollection>();
125 desc.
add<
string>(
"Propagator",
"");
126 desc.
add<
double>(
"L1MinPt", -1.);
127 desc.
add<
double>(
"L1MaxEta", 5.0);
128 desc.
add<
unsigned int>(
"L1MinQuality", 0);
129 desc.
add<
double>(
"SetMinPtBarrelTo", 3.5);
130 desc.
add<
double>(
"SetMinPtEndcapTo", 1.0);
132 desc.
add<
bool>(
"UseUnassociatedL1",
true);
133 desc.
add<std::vector<double>>(
"MatchDR", {0.3});
134 desc.
add<std::vector<double>>(
"EtaMatchingBins", {0., 2.5});
135 desc.
add<
bool>(
"CentralBxOnly",
true);
136 desc.
add<
unsigned int>(
"MatchType", 0)
138 "MatchType : 0 Old matching, 1 L1 Order(1to1), 2 Min dR(1to1), 3 Higher Q(1to1), 4 All matched L1");
139 desc.
add<
unsigned int>(
"SortType", 0)->setComment(
"SortType : 0 not sort, 1 Pt, 2 Q and Pt");
143 psd0.
addUntracked<std::vector<std::string>>(
"Propagators", {
"SteppingHelixPropagatorAny"});
144 psd0.add<
bool>(
"RPCLayers",
true);
145 psd0.addUntracked<
bool>(
"UseMuonNavigation",
true);
147 descriptions.
add(
"L2MuonSeedGeneratorFromL1T", desc);
154 auto output = std::make_unique<L2MuonTrajectorySeedCollection>();
158 LogDebug(metname) <<
"Number of muons " << muColl->size() << endl;
163 vector<int> offlineSeedMap;
166 LogDebug(metname) <<
"Number of offline seeds " << offlineSeedHandle->size() << endl;
167 offlineSeedMap = vector<int>(offlineSeedHandle->size(), 0);
170 for (
int ibx = muColl->getFirstBX(); ibx <= muColl->getLastBX(); ++ibx) {
173 for (
auto it = muColl->begin(ibx); it != muColl->end(ibx); it++) {
174 unsigned int quality = it->hwQual();
175 int valid_charge = it->hwChargeValid();
178 float eta = it->eta();
180 float phi = it->phi();
181 int charge = it->charge();
188 int link = 36 + (int)(it->tfMuonIndex() / 3.);
190 if ((link >= 36 && link <= 41) || (link >= 66 && link <= 71))
196 LogDebug(metname) <<
"New L2 Muon Seed";
197 LogDebug(metname) <<
"Pt = " << pt <<
" GeV/c";
199 LogDebug(metname) <<
"theta = " << theta <<
" rad";
200 LogDebug(metname) <<
"phi = " << phi <<
" rad";
214 CLHEP::Hep3Vector vec(0., 1., 0.);
221 LogDebug(metname) <<
"The seed is in the barrel";
225 detLayer =
theService->detLayerGeometry()->idToLayer(theid);
231 radius = fabs(bc->radius() /
sin(theta));
238 LogDebug(metname) <<
"The seed is in the endcap";
243 detLayer =
theService->detLayerGeometry()->idToLayer(theid);
261 mat[0][0] = (0.25 /
pt) * (0.25 / pt);
263 mat[0][0] = (0.4 /
pt) * (0.4 / pt);
267 mat[0][0] = (1. /
pt) * (1. / pt);
269 mat[1][1] = 0.05 * 0.05;
270 mat[2][2] = 0.2 * 0.2;
271 mat[3][3] = 20. * 20.;
272 mat[4][4] = 20. * 20.;
278 LogDebug(metname) <<
"Free trajectory State from the parameters";
285 LogDebug(metname) <<
"State after the propagation on the layer";
290 if (fabs(eta) <
etaBins.back()) {
302 if (assoOffseed !=
nullptr) {
304 for (
auto const &recHit : assoOffseed->
recHits()) {
325 std::vector<pair<const GeomDet *, TrajectoryStateOnSurface>> detsWithStates =
328 if (detsWithStates.empty() &&
barrel) {
339 if (!detsWithStates.empty()) {
341 const GeomDet *newTSOSDet = detsWithStates.front().first;
343 LogDebug(metname) <<
"Most compatible det";
357 if (assoOffseed !=
nullptr) {
359 for (
auto const &recHit : assoOffseed->
recHits()) {
395 unsigned int nMuColl = muColl->size();
397 vector<vector<double>> dRmtx;
398 vector<vector<const TrajectorySeed *>> selOffseeds;
403 unsigned int nOfflineSeed = offlineSeedHandle->size();
404 LogDebug(metname) <<
"Number of offline seeds " << nOfflineSeed << endl;
407 dRmtx = vector<vector<double>>(nMuColl, vector<double>(nOfflineSeed, 999.0));
409 vector<vector<const TrajectorySeed *>>(nMuColl, vector<const TrajectorySeed *>(nOfflineSeed,
nullptr));
416 for (
int ibx = muColl->getFirstBX(); ibx <= muColl->getLastBX(); ++ibx) {
419 for (
auto it = muColl->begin(ibx); it != muColl->end(ibx); it++) {
421 unsigned int imu =
distance(muColl->begin(muColl->getFirstBX()), it);
423 unsigned int quality = it->hwQual();
424 int valid_charge = it->hwChargeValid();
427 float eta = it->eta();
429 float phi = it->phi();
430 int charge = it->charge();
437 int link = 36 + (int)(it->tfMuonIndex() / 3.);
439 if ((link >= 36 && link <= 41) || (link >= 66 && link <= 71))
445 LogDebug(metname) <<
"New L2 Muon Seed";
446 LogDebug(metname) <<
"Pt = " << pt <<
" GeV/c";
448 LogDebug(metname) <<
"theta = " << theta <<
" rad";
449 LogDebug(metname) <<
"phi = " << phi <<
" rad";
463 CLHEP::Hep3Vector vec(0., 1., 0.);
470 LogDebug(metname) <<
"The seed is in the barrel";
474 detLayer =
theService->detLayerGeometry()->idToLayer(theid);
480 radius = fabs(bc->radius() /
sin(theta));
487 LogDebug(metname) <<
"The seed is in the endcap";
492 detLayer =
theService->detLayerGeometry()->idToLayer(theid);
510 mat[0][0] = (0.25 /
pt) * (0.25 / pt);
512 mat[0][0] = (0.4 /
pt) * (0.4 / pt);
516 mat[0][0] = (1. /
pt) * (1. / pt);
518 mat[1][1] = 0.05 * 0.05;
519 mat[2][2] = 0.2 * 0.2;
520 mat[3][3] = 20. * 20.;
521 mat[4][4] = 20. * 20.;
527 LogDebug(metname) <<
"Free trajectory State from the parameters";
534 LogDebug(metname) <<
"State after the propagation on the layer";
539 if (fabs(eta) <
etaBins.back()) {
548 if ((!valid_charge || charge == 0)) {
571 else if (valid_charge) {
573 std::vector<pair<const GeomDet *, TrajectoryStateOnSurface>> detsWithStates =
576 if (detsWithStates.empty() &&
barrel) {
587 if (!detsWithStates.empty()) {
589 const GeomDet *newTSOSDet = detsWithStates.front().first;
591 LogDebug(metname) <<
"Most compatible det";
639 unsigned int nOfflineSeed1 = offlineSeedHandle->size();
644 vector<bool> removed_col = vector<bool>(nOfflineSeed1,
false);
646 for (nL1 = 0; nL1 < nMuColl; ++nL1) {
648 unsigned int theOffs = 0;
650 for (j = 0; j < nOfflineSeed1; ++
j) {
653 if (tempDR > dRmtx[nL1][j]) {
654 tempDR = dRmtx[nL1][
j];
659 auto it = muColl->begin(muColl->getFirstBX()) + nL1;
662 if (fabs(it->eta()) <
etaBins.back()) {
667 if (!(tempDR < newDRcone))
671 removed_col[theOffs] =
true;
673 if (selOffseeds[nL1][theOffs] !=
nullptr) {
678 for (
auto const &recHit : selOffseeds[nL1][theOffs]->
recHits()) {
690 vector<bool> removed_row = vector<bool>(nMuColl,
false);
691 vector<bool> removed_col = vector<bool>(nOfflineSeed1,
false);
693 for (nL1 = 0; nL1 < nMuColl; ++nL1) {
695 unsigned int theL1 = 0;
696 unsigned int theOffs = 0;
698 for (i = 0; i < nMuColl; ++
i) {
701 for (j = 0; j < nOfflineSeed1; ++
j) {
704 if (tempDR > dRmtx[i][j]) {
705 tempDR = dRmtx[
i][
j];
712 auto it = muColl->begin(muColl->getFirstBX()) + theL1;
715 if (fabs(it->eta()) <
etaBins.back()) {
720 if (!(tempDR < newDRcone))
724 removed_col[theOffs] =
true;
725 removed_row[theL1] =
true;
727 if (selOffseeds[theL1][theOffs] !=
nullptr) {
732 for (
auto const &recHit : selOffseeds[theL1][theOffs]->
recHits()) {
744 vector<bool> removed_row = vector<bool>(nMuColl,
false);
745 vector<bool> removed_col = vector<bool>(nOfflineSeed1,
false);
747 for (nL1 = 0; nL1 < nMuColl; ++nL1) {
749 unsigned int theL1 = 0;
750 unsigned int theOffs = 0;
751 auto theit = muColl->begin(muColl->getFirstBX());
754 for (i = 0; i < nMuColl; ++
i) {
757 theit = muColl->begin(muColl->getFirstBX()) + i;
758 if (theit->hwQual() > 10) {
759 for (j = 0; j < nOfflineSeed1; ++
j) {
762 if (tempDR > dRmtx[i][j]) {
763 tempDR = dRmtx[
i][
j];
773 for (i = 0; i < nMuColl; ++
i) {
776 theit = muColl->begin(muColl->getFirstBX()) + i;
777 if ((theit->hwQual() <= 10) && (theit->hwQual() > 6)) {
778 for (j = 0; j < nOfflineSeed1; ++
j) {
781 if (tempDR > dRmtx[i][j]) {
782 tempDR = dRmtx[
i][
j];
793 for (i = 0; i < nMuColl; ++
i) {
796 theit = muColl->begin(muColl->getFirstBX()) + i;
797 if (theit->hwQual() <= 6) {
798 for (j = 0; j < nOfflineSeed1; ++
j) {
801 if (tempDR > dRmtx[i][j]) {
802 tempDR = dRmtx[
i][
j];
811 auto it = muColl->begin(muColl->getFirstBX()) + theL1;
814 if (fabs(it->eta()) <
etaBins.back()) {
819 if (!(tempDR < newDRcone))
823 removed_col[theOffs] =
true;
824 removed_row[theL1] =
true;
826 if (selOffseeds[theL1][theOffs] !=
nullptr) {
831 for (
auto const &recHit : selOffseeds[theL1][theOffs]->
recHits()) {
843 for (i = 0; i < nMuColl; ++
i) {
844 auto it = muColl->begin(muColl->getFirstBX()) + i;
847 unsigned int theOffs = 0;
850 if (fabs(it->eta()) <
etaBins.back()) {
855 for (j = 0; j < nOfflineSeed1; ++
j) {
856 if (tempDR > dRmtx[i][j]) {
857 tempDR = dRmtx[
i][
j];
862 if (!(tempDR < newDRcone))
865 if (selOffseeds[i][theOffs] !=
nullptr) {
870 for (
auto const &recHit : selOffseeds[i][theOffs]->
recHits()) {
901 std::vector<int> &offseedMap,
904 const std::string metlabel =
"Muon|RecoMuon|L2MuonSeedGeneratorFromL1T";
909 double bestDr = 99999.;
910 unsigned int nOffseed(0);
913 for (offseed = offseeds->
begin(); offseed != endOffseed; ++offseed, ++nOffseed) {
914 if (offseedMap[nOffseed] != 0)
917 ->idToDet(offseed->startingState().detId())
919 .toGlobal(offseed->startingState().parameters().position());
921 ->idToDet(offseed->startingState().detId())
923 .toGlobal(offseed->startingState().parameters().momentum());
931 glbPos, glbMom, offseed->startingState().parameters().charge(), &*
theService->magneticField());
934 LogDebug(metlabel) <<
"Offline seed info: Det and State" << std::endl;
935 LogDebug(metlabel) << debugtmp.
dumpMuonId(offseed->startingState().detId()) << std::endl;
936 LogDebug(metlabel) <<
"pos: (r=" << offseedFTS.position().mag() <<
", phi=" << offseedFTS.position().phi()
937 <<
", eta=" << offseedFTS.position().eta() <<
")" << std::endl;
938 LogDebug(metlabel) <<
"mom: (q*pt=" << offseedFTS.charge() * offseedFTS.momentum().perp()
939 <<
", phi=" << offseedFTS.momentum().phi() <<
", eta=" << offseedFTS.momentum().eta() <<
")"
943 if (offseedTsos.isValid()) {
944 LogDebug(metlabel) <<
"Offline seed info after propagation to L1 layer:" << std::endl;
945 LogDebug(metlabel) <<
"pos: (r=" << offseedTsos.globalPosition().mag()
946 <<
", phi=" << offseedTsos.globalPosition().phi()
947 <<
", eta=" << offseedTsos.globalPosition().eta() <<
")" << std::endl;
948 LogDebug(metlabel) <<
"mom: (q*pt=" << offseedTsos.charge() * offseedTsos.globalMomentum().perp()
949 <<
", phi=" << offseedTsos.globalMomentum().phi()
950 <<
", eta=" << offseedTsos.globalMomentum().eta() <<
")" << std::endl
954 offseedTsos.globalPosition().eta(),
955 offseedTsos.globalPosition().
phi());
956 LogDebug(metlabel) <<
" -- DR = " << newDr << std::endl;
957 if (newDr < dRcone && newDr < bestDr) {
958 LogDebug(metlabel) <<
" --> OK! " << newDr << std::endl << std::endl;
959 selOffseed = &*offseed;
961 offseedMap[nOffseed] = 1;
962 if (lastOffseed > -1)
963 offseedMap[lastOffseed] = 0;
964 lastOffseed = nOffseed;
966 LogDebug(metlabel) <<
" --> Rejected. " << newDr << std::endl << std::endl;
969 LogDebug(metlabel) <<
"Invalid offline seed TSOS after propagation!" << std::endl << std::endl;
981 std::vector<std::vector<const TrajectorySeed *>> &selOffseeds,
983 const std::string metlabel =
"Muon|RecoMuon|L2MuonSeedGeneratorFromL1T";
984 bool isAssociated =
false;
988 unsigned int nOffseed(0);
990 for (offseed = offseeds->
begin(); offseed != endOffseed; ++offseed, ++nOffseed) {
992 ->idToDet(offseed->startingState().detId())
994 .toGlobal(offseed->startingState().parameters().position());
996 ->idToDet(offseed->startingState().detId())
998 .toGlobal(offseed->startingState().parameters().momentum());
1006 glbPos, glbMom, offseed->startingState().parameters().charge(), &*
theService->magneticField());
1009 LogDebug(metlabel) <<
"Offline seed info: Det and State" << std::endl;
1010 LogDebug(metlabel) << debugtmp.
dumpMuonId(offseed->startingState().detId()) << std::endl;
1011 LogDebug(metlabel) <<
"pos: (r=" << offseedFTS.position().mag() <<
", phi=" << offseedFTS.position().phi()
1012 <<
", eta=" << offseedFTS.position().eta() <<
")" << std::endl;
1013 LogDebug(metlabel) <<
"mom: (q*pt=" << offseedFTS.charge() * offseedFTS.momentum().perp()
1014 <<
", phi=" << offseedFTS.momentum().phi() <<
", eta=" << offseedFTS.momentum().eta() <<
")"
1018 if (offseedTsos.isValid()) {
1019 LogDebug(metlabel) <<
"Offline seed info after propagation to L1 layer:" << std::endl;
1020 LogDebug(metlabel) <<
"pos: (r=" << offseedTsos.globalPosition().mag()
1021 <<
", phi=" << offseedTsos.globalPosition().phi()
1022 <<
", eta=" << offseedTsos.globalPosition().eta() <<
")" << std::endl;
1023 LogDebug(metlabel) <<
"mom: (q*pt=" << offseedTsos.charge() * offseedTsos.globalMomentum().perp()
1024 <<
", phi=" << offseedTsos.globalMomentum().phi()
1025 <<
", eta=" << offseedTsos.globalMomentum().eta() <<
")" << std::endl
1029 offseedTsos.globalPosition().eta(),
1030 offseedTsos.globalPosition().
phi());
1032 LogDebug(metlabel) <<
" -- DR = " << newDr << std::endl;
1033 if (newDr < dRcone) {
1034 LogDebug(metlabel) <<
" --> OK! " << newDr << std::endl << std::endl;
1036 dRmtx[imu][nOffseed] = newDr;
1037 selOffseeds[imu][nOffseed] = &*offseed;
1039 isAssociated =
true;
1041 LogDebug(metlabel) <<
" --> Rejected. " << newDr << std::endl << std::endl;
1044 LogDebug(metlabel) <<
"Invalid offline seed TSOS after propagation!" << std::endl << std::endl;
1048 return isAssociated;
edm::EDGetTokenT< edm::View< TrajectorySeed > > offlineSeedToken_
T getUntrackedParameter(std::string const &, T const &) const
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
TrackCharge charge() const
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
bool centralBxOnly_
use central bx only muons
std::string dumpLayer(const DetLayer *layer) const
const TrajectorySeed * associateOfflineSeedToL1(edm::Handle< edm::View< TrajectorySeed > > &, std::vector< int > &, TrajectoryStateOnSurface &, double)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
bool sortByL1Pt(L2MuonTrajectorySeed &A, L2MuonTrajectorySeed &B)
const std::string metname
uint32_t const *__restrict__ Quality * quality
const bool useOfflineSeed
Sin< T >::type sin(const T &t)
Geom::Phi< T > phi() const
constexpr uint32_t rawId() const
get the raw id
Geom::Theta< T > theta() const
l1t::MuonRef l1tParticle() const
__host__ __device__ constexpr RandomIt upper_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})
GlobalPoint globalPosition() const
L2MuonSeedGeneratorFromL1T(const edm::ParameterSet &)
Constructor.
Exp< T >::type exp(const T &t)
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
std::string dumpMuonId(const DetId &id) const
std::string dumpFTS(const FreeTrajectoryState &fts) const
~L2MuonSeedGeneratorFromL1T() override
Destructor.
std::string dumpTSOS(const TrajectoryStateOnSurface &tsos) const
const SurfaceType & surface() const
const_iterator begin() const
MuonServiceProxy * theService
the event setup proxy, it takes care the services update
const unsigned theL1MinQuality
Cos< T >::type cos(const T &t)
bool isAssociateOfflineSeedToL1(edm::Handle< edm::View< TrajectorySeed > > &, std::vector< std::vector< double > > &, TrajectoryStateOnSurface &, unsigned int, std::vector< std::vector< const TrajectorySeed * > > &, double)
DetId geographicalId() const
The label of this GeomDet.
bool sortByL1QandPt(L2MuonTrajectorySeed &A, L2MuonTrajectorySeed &B)
static const std::string B
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const bool useUnassociatedL1
RecHitRange recHits() const
PTrajectoryStateOnDet const & startingState() const
virtual const Surface::PositionType & position() const
Returns position of the surface.
T getParameter(std::string const &) const
edm::EDGetTokenT< l1t::MuonBxCollection > muCollToken_
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
thePropagatorName(iConfig.getParameter< std::string >("Propagator"))
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const double theMinPtBarrel
GlobalVector globalMomentum() const
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
MeasurementEstimator * theEstimator
void produce(edm::Event &, const edm::EventSetup &) override
std::string thePropagatorName
const double theMinPtEndcap
edm::InputTag theOfflineSeedLabel
edm::Ref< MuonBxCollection > MuonRef
std::vector< double > etaBins
std::vector< double > matchingDR
tuple Chi2MeasurementEstimator