1 #ifndef HLTrigger_Muon_HLTTriMuonIsolation_h 2 #define HLTrigger_Muon_HLTTriMuonIsolation_h 44 return cand_1.pt() > cand_2.pt();
74 Muon1PtCut_(iConfig.getParameter<double>(
"Muon1PtCut")),
75 Muon2PtCut_(iConfig.getParameter<double>(
"Muon2PtCut")),
76 Muon3PtCut_(iConfig.getParameter<double>(
"Muon3PtCut")),
81 IsoConeSize_(iConfig.getParameter<double>(
"IsoConeSize")),
87 MaxDZ_(iConfig.getParameter<double>(
"MaxDZ")),
91 produces<reco::CompositeCandidateCollection>(
"Taus");
92 produces<reco::CompositeCandidateCollection>(
"SelectedTaus");
120 if (AllMuCands->size() >= 3 && L3MuCands->size() >= 2) {
123 auto AllMuCands_end = AllMuCands->end();
124 for (
auto i = AllMuCands->begin();
i != AllMuCands_end - 2; ++
i) {
126 bool passingPreviousFilter_1 =
false;
127 for (
const auto& imu : PassedL3Muons) {
129 passingPreviousFilter_1 =
true;
131 for (
auto j =
i + 1;
j != AllMuCands_end - 1; ++
j) {
133 bool passingPreviousFilter_2 =
false;
134 for (
const auto& jmu : PassedL3Muons) {
136 passingPreviousFilter_2 =
true;
139 if (!(passingPreviousFilter_1 || passingPreviousFilter_2))
141 for (
auto k =
j + 1;
k != AllMuCands_end; ++
k) {
143 bool passingPreviousFilter_3 =
false;
144 for (
const auto& kmu : PassedL3Muons) {
146 passingPreviousFilter_3 =
true;
149 if (!((passingPreviousFilter_1 & passingPreviousFilter_2) ||
150 (passingPreviousFilter_1 & passingPreviousFilter_3) ||
151 (passingPreviousFilter_2 & passingPreviousFilter_3)))
159 daughters.reserve(3);
161 daughters.push_back(*
i);
162 daughters.push_back(*
j);
163 daughters.push_back(*
k);
165 std::sort(daughters.begin(), daughters.end(), ptComparer<reco::RecoChargedCandidate>);
181 int charge = daughters[0].charge() + daughters[1].charge() + daughters[2].charge();
183 int tauPdgId = charge > 0 ? 15 : -15;
199 bool collimated =
true;
200 for (
auto const& idau : daughters) {
233 Taus->push_back(tau);
239 std::sort(Taus->begin(), Taus->end(), ptComparer<reco::CompositeCandidate>);
242 for (
const auto& itau : *Taus) {
244 double sumPt = -itau.pt();
247 for (
const auto& itrk : *IsoTracks) {
259 if (!((sumPt < chAbsIsoCut) || (sumPt < chRelIsoCut)))
262 SelectedTaus->push_back(itau);
277 desc.
add<
double>(
"Muon1PtCut", 5.);
278 desc.
add<
double>(
"Muon2PtCut", 3.);
279 desc.
add<
double>(
"Muon3PtCut", 0.);
280 desc.
add<
double>(
"TriMuonPtCut", 8.);
281 desc.
add<
double>(
"TriMuonEtaCut", 2.5);
282 desc.
add<
double>(
"ChargedAbsIsoCut", 3.0);
283 desc.
add<
double>(
"ChargedRelIsoCut", 0.1);
284 desc.
add<
double>(
"IsoConeSize", 0.5);
285 desc.
add<
double>(
"MatchingConeSize", 0.03);
286 desc.
add<
double>(
"MinTriMuonMass", 0.5);
287 desc.
add<
double>(
"MaxTriMuonMass", 2.8);
288 desc.
add<
double>(
"MaxTriMuonRadius", 0.6);
289 desc.
add<
int>(
"TriMuonAbsCharge", -1);
290 desc.
add<
double>(
"MaxDZ", 0.3);
291 desc.
add<
bool>(
"EnableRelIso",
false);
292 desc.
add<
bool>(
"EnableAbsIso",
true);
293 descriptions.
add(
"hltTriMuonIsolationProducer", desc);
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
const edm::EDGetTokenT< reco::RecoChargedCandidateCollection > AllMuonsToken_
double eta() const final
momentum pseudorapidity
edm::Handle< reco::RecoChargedCandidateCollection > L3MuCands
edm::Handle< trigger::TriggerFilterObjectWithRefs > L3DiMuonsFilterCands
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
const double MaxTriMuonMass_
std::vector< CompositeCandidate > CompositeCandidateCollection
collection of Candidate objects
const double TriMuonPtCut_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const int TriMuonAbsCharge_
const double MinTriMuonMass_
std::vector< Track > TrackCollection
collection of Tracks
double pt() const final
transverse momentum
static bool ptComparer(const T &cand_1, const T &cand_2)
int charge() const final
electric charge
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
const double TriMuonEtaCut_
void setVertex(const Point &vertex) override
set vertex
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
const double TwiceMuonMass_
~HLTTriMuonIsolation() override
void setCharge(Charge q) final
set electric charge
const double ChargedAbsIsoCut_
const double IsoConeSize_
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
const double MatchingConeSize_
Abs< T >::type abs(const T &t)
const LorentzVector & p4() const final
four-momentum Lorentz vector
edm::Handle< reco::TrackCollection > IsoTracks
const Candidate * daughter(size_type) const override
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void addDaughter(const Candidate &, const std::string &s="")
add a clone of the passed candidate as daughter
double vz() const override
z coordinate of vertex position
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const double ChargedRelIsoCut_
const edm::EDGetTokenT< reco::RecoChargedCandidateCollection > L3MuonsToken_
edm::Handle< reco::RecoChargedCandidateCollection > AllMuCands
edm::Handle< reco::RecoChargedCandidateRef > PassedL3Muons
HLTTriMuonIsolation(const edm::ParameterSet &iConfig)
virtual double vz() const =0
z coordinate of vertex position
const double MaxTriMuonRadius_
void setPdgId(int pdgId) final
void setP4(const LorentzVector &p4) final
set 4-momentum
const edm::EDGetTokenT< reco::TrackCollection > IsoTracksToken_
double mass() const final
mass
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > L3DiMuonsFilterToken_