File indexing completed on 2024-04-06 12:21:17
0001
0002
0003
0004
0005
0006
0007 #include <algorithm>
0008 #include <memory>
0009
0010
0011 #include "FWCore/Framework/interface/Frameworkfwd.h"
0012 #include "FWCore/Framework/interface/Event.h"
0013 #include "FWCore/Framework/interface/MakerMacros.h"
0014 #include "DataFormats/L1TCorrelator/interface/TkEtMiss.h"
0015 #include "DataFormats/L1TCorrelator/interface/TkEtMissFwd.h"
0016 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0017 #include "DataFormats/Math/interface/LorentzVector.h"
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/Framework/interface/EventSetup.h"
0020 #include "FWCore/Framework/interface/Frameworkfwd.h"
0021 #include "FWCore/Framework/interface/MakerMacros.h"
0022 #include "FWCore/Framework/interface/global/EDProducer.h"
0023 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0024
0025 using namespace l1t;
0026
0027 class L1TrackerEtMissProducer : public edm::global::EDProducer<> {
0028 public:
0029 typedef TTTrack<Ref_Phase2TrackerDigi_> L1TTTrackType;
0030 typedef std::vector<L1TTTrackType> L1TTTrackCollectionType;
0031 typedef edm::RefVector<L1TTTrackCollectionType> L1TTTrackRefCollectionType;
0032
0033 explicit L1TrackerEtMissProducer(const edm::ParameterSet&);
0034 ~L1TrackerEtMissProducer() override = default;
0035
0036 private:
0037 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0038
0039
0040 const edm::EDGetTokenT<L1TTTrackRefCollectionType> trackToken_;
0041 const edm::EDGetTokenT<L1TTTrackRefCollectionType> vtxAssocTrackToken_;
0042 const std::string L1MetCollectionName;
0043 const float maxPt_;
0044 const int highPtTracks_;
0045 const bool debug_;
0046 };
0047
0048
0049 L1TrackerEtMissProducer::L1TrackerEtMissProducer(const edm::ParameterSet& iConfig)
0050 : trackToken_(consumes<L1TTTrackRefCollectionType>(iConfig.getParameter<edm::InputTag>("L1TrackInputTag"))),
0051 vtxAssocTrackToken_(
0052 consumes<L1TTTrackRefCollectionType>(iConfig.getParameter<edm::InputTag>("L1TrackAssociatedInputTag"))),
0053 L1MetCollectionName(iConfig.getParameter<std::string>("L1MetCollectionName")),
0054 maxPt_(iConfig.getParameter<double>("maxPt")),
0055 highPtTracks_(iConfig.getParameter<int>("highPtTracks")),
0056 debug_(iConfig.getParameter<bool>("debug")) {
0057 produces<TkEtMissCollection>(L1MetCollectionName);
0058 }
0059
0060 void L1TrackerEtMissProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0061 using namespace edm;
0062
0063 std::unique_ptr<TkEtMissCollection> METCollection(new TkEtMissCollection);
0064
0065 edm::Handle<L1TTTrackRefCollectionType> L1TTTrackHandle;
0066 iEvent.getByToken(trackToken_, L1TTTrackHandle);
0067
0068 edm::Handle<L1TTTrackRefCollectionType> L1TTTrackAssociatedHandle;
0069 iEvent.getByToken(vtxAssocTrackToken_, L1TTTrackAssociatedHandle);
0070
0071 if (!L1TTTrackHandle.isValid()) {
0072 LogError("L1TrackerEtMissProducer") << "\nWarning: L1TTTrackCollection not found in the event. Exit\n";
0073 return;
0074 }
0075
0076 if (!L1TTTrackAssociatedHandle.isValid()) {
0077 LogError("L1TrackerEtMissProducer") << "\nWarning: L1TTTrackAssociatedCollection not found in the event. Exit\n";
0078 return;
0079 }
0080
0081 float sumPx = 0;
0082 float sumPy = 0;
0083
0084 int numqualitytracks = 0;
0085 int numassoctracks = 0;
0086
0087 for (const auto& track : *L1TTTrackHandle) {
0088 float pt = track->momentum().perp();
0089 float phi = track->momentum().phi();
0090
0091 if (maxPt_ > 0 && pt > maxPt_) {
0092 if (highPtTracks_ == 0)
0093 continue;
0094 if (highPtTracks_ == 1)
0095 pt = maxPt_;
0096 }
0097
0098 numqualitytracks++;
0099
0100 if (std::find(L1TTTrackAssociatedHandle->begin(), L1TTTrackAssociatedHandle->end(), track) !=
0101 L1TTTrackAssociatedHandle->end()) {
0102 numassoctracks++;
0103 sumPx += pt * cos(phi);
0104 sumPy += pt * sin(phi);
0105 }
0106 }
0107
0108 float et = sqrt(sumPx * sumPx + sumPy * sumPy);
0109 double etphi = atan2(sumPy, sumPx);
0110
0111 math::XYZTLorentzVector missingEt(-sumPx, -sumPy, 0, et);
0112
0113 if (debug_) {
0114 edm::LogVerbatim("L1TrackerEtMissProducer") << "====Global Pt===="
0115 << "\n"
0116 << "Px: " << sumPx << "| Py: " << sumPy << "\n"
0117 << "====MET==="
0118 << "\n"
0119 << "MET: " << et << "| Phi: " << etphi << "\n"
0120
0121 << "# Tracks after quality cuts: " << L1TTTrackHandle->size() << "\n"
0122 << "# Tacks after additional highPt Cuts: " << numqualitytracks << "\n"
0123 << "# Tracks associated to vertex: " << numassoctracks << "\n"
0124 << "========================================================"
0125 << "\n";
0126 }
0127
0128 int ibx = 0;
0129 METCollection->push_back(TkEtMiss(missingEt, TkEtMiss::kMET, etphi, numassoctracks, ibx));
0130
0131 iEvent.put(std::move(METCollection), L1MetCollectionName);
0132 }
0133
0134 DEFINE_FWK_MODULE(L1TrackerEtMissProducer);