15 #include <TLorentzVector.h>
21 using namespace ZCountingTrigger;
27 : fHLTObjTag(iConfig.getParameter<edm::
InputTag>(
"TriggerEvent")),
28 fHLTTag(iConfig.getParameter<edm::
InputTag>(
"TriggerResults")),
29 fPVName(iConfig.getUntrackedParameter<std::
string>(
"edmPVName",
"offlinePrimaryVertices")),
30 fMuonName(iConfig.getUntrackedParameter<std::
string>(
"edmName",
"muons")),
31 fTrackName(iConfig.getUntrackedParameter<std::
string>(
"edmTrackName",
"generalTracks")),
34 fElectronName(iConfig.getUntrackedParameter<std::
string>(
"edmGsfEleName",
"gedGsfElectrons")),
35 fSCName(iConfig.getUntrackedParameter<std::
string>(
"edmSCName",
"particleFlowEGamma")),
38 fRhoTag(iConfig.getParameter<edm::
InputTag>(
"rhoname")),
39 fBeamspotTag(iConfig.getParameter<edm::
InputTag>(
"beamspotName")),
40 fConversionTag(iConfig.getParameter<edm::
InputTag>(
"conversionsName")),
43 ELE_PT_CUT_TAG(iConfig.getUntrackedParameter<double>(
"PtCutEleTag")),
44 ELE_PT_CUT_PROBE(iConfig.getUntrackedParameter<double>(
"PtCutEleProbe")),
45 ELE_ETA_CUT_TAG(iConfig.getUntrackedParameter<double>(
"EtaCutEleTag")),
46 ELE_ETA_CUT_PROBE(iConfig.getUntrackedParameter<double>(
"EtaCutEleProbe")),
48 ELE_MASS_CUT_LOW(iConfig.getUntrackedParameter<double>(
"MassCutEleLow")),
49 ELE_MASS_CUT_HIGH(iConfig.getUntrackedParameter<double>(
"MassCutEleHigh")),
51 ELE_ID_WP(iConfig.getUntrackedParameter<std::
string>(
"ElectronIDType",
"TIGHT")),
53 edm::LogInfo(
"ZCounting") <<
"Constructor ZCounting::ZCounting " << std::endl;
65 if (fMuonHLTNames.size() != fMuonHLTObjectNames.size()) {
66 edm::LogError(
"ZCounting") <<
"List of MuonTriggerNames and MuonTriggerObjectNames has to be the same length"
82 if (IDTypestr_ ==
"Loose")
84 else if (IDTypestr_ ==
"Medium")
86 else if (IDTypestr_ ==
"Tight")
91 if (IsoTypestr_ ==
"Tracker-based")
93 else if (IsoTypestr_ ==
"PF-based")
132 edm::LogInfo(
"ZCounting") <<
"ZCounting::beginRun" << std::endl;
141 edm::LogInfo(
"ZCounting") <<
"ZCounting::bookHistograms" << std::endl;
147 "Muon HLT passing probes central",
155 "Muon HLT passing probes forward",
163 "Muon HLT failing probes central",
171 "Muon HLT failing probes forward",
180 "Muon SIT passing probes central",
188 "Muon SIT passing probes forward",
196 "Muon SIT_failing probes central",
204 "Muon SIT failing probes forward",
213 "Muon Glo passing probes central",
221 "Muon Glo passing probes forward",
229 "Muon Glo failing probes central",
237 "Muon Glo failing probes forward",
311 edm::LogInfo(
"ZCounting") <<
"ZCounting::analyze" << std::endl;
317 edm::LogInfo(
"ZCounting") <<
"ZCounting::analyzeMuons" << std::endl;
323 if (!hVertexProduct.
isValid()) {
324 edm::LogWarning(
"ZCounting") <<
"ZCounting::analyzeMuons - no valid primary vertex product found" << std::endl;
331 for (
auto const& itVtx : *hVertexProduct) {
367 bool config_changed =
false;
370 config_changed =
true;
372 if (config_changed) {
373 initHLT(*hTrgRes, triggerNames);
377 for (
unsigned int irec = 0; irec <
fTrigger->fRecords.size(); irec++) {
378 if (
fTrigger->fRecords[irec].hltPathIndex == (
unsigned int)-1)
380 if (hTrgRes->accept(
fTrigger->fRecords[irec].hltPathIndex)) {
381 triggerBits[
fTrigger->fRecords[irec].baconTrigBit] =
true;
403 TLorentzVector vTag(0., 0., 0., 0.);
404 TLorentzVector vProbe(0., 0., 0., 0.);
405 TLorentzVector vTrack(0., 0., 0., 0.);
408 for (
auto const& itMu1 : *hMuonProduct) {
409 float pt1 = itMu1.muonBestTrack()->pt();
410 float eta1 = itMu1.muonBestTrack()->eta();
411 float phi1 = itMu1.muonBestTrack()->phi();
412 float q1 = itMu1.muonBestTrack()->charge();
424 vTag.SetPtEtaPhiM(pt1, eta1, phi1,
MUON_MASS);
427 for (
auto const& itMu2 : *hMuonProduct) {
428 if (&itMu2 == &itMu1)
431 float pt2 = itMu2.muonBestTrack()->pt();
432 float eta2 = itMu2.muonBestTrack()->eta();
433 float phi2 = itMu2.muonBestTrack()->phi();
434 float q2 = itMu2.muonBestTrack()->charge();
444 vProbe.SetPtEtaPhiM(pt2, eta2, phi2,
MUON_MASS);
447 TLorentzVector vDilep = vTag + vProbe;
448 float dilepMass = vDilep.M();
452 bool isTagCentral =
false;
453 bool isProbeCentral =
false;
457 isProbeCentral =
true;
477 if (isProbeCentral) {
489 if (isProbeCentral) {
502 if (isTagCentral && isProbeCentral)
504 else if (!isTagCentral && !isProbeCentral)
506 }
else if (itMu2.isGlobalMuon()) {
508 if (isProbeCentral) {
515 }
else if (itMu2.isStandAloneMuon()) {
517 if (isProbeCentral) {
522 }
else if (itMu2.innerTrack()->hitPattern().trackerLayersWithMeasurement() >= 6 &&
523 itMu2.innerTrack()->hitPattern().numberOfValidPixelHits() >= 1) {
525 if (isProbeCentral) {
535 for (
auto const& itTrk : *hTrackProduct) {
538 for (
auto const& itMu : *hMuonProduct) {
539 if (itMu.innerTrack().isNonnull() && itMu.innerTrack().get() == &itTrk) {
547 float pt2 = itTrk.pt();
548 float eta2 = itTrk.eta();
549 float phi2 = itTrk.phi();
550 float q2 = itTrk.charge();
560 vTrack.SetPtEtaPhiM(pt2, eta2, phi2,
MUON_MASS);
562 TLorentzVector vDilep = vTag + vTrack;
563 float dilepMass = vDilep.M();
567 bool isTrackCentral =
false;
569 isTrackCentral =
true;
571 if (itTrk.hitPattern().trackerLayersWithMeasurement() >= 6 && itTrk.hitPattern().numberOfValidPixelHits() >= 1) {
583 edm::LogInfo(
"ZCounting") <<
"ZCounting::analyzeElectrons" << std::endl;
596 for (
auto const& vtx : *pvCol) {
627 Bool_t config_changed =
false;
630 config_changed =
true;
632 if (config_changed) {
633 initHLT(*hTrgRes, triggerNames);
637 for (
unsigned int irec = 0; irec <
fTrigger->fRecords.size(); irec++) {
638 if (
fTrigger->fRecords[irec].hltPathIndex == (
unsigned int)-1)
640 if (hTrgRes->accept(
fTrigger->fRecords[irec].hltPathIndex)) {
641 triggerBits[
fTrigger->fRecords[irec].baconTrigBit] =
true;
671 enum { eEleEle2HLT = 1, eEleEle1HLT1L1, eEleEle1HLT, eEleEleNoSel, eEleSC };
674 for (
size_t itag = 0; itag < electrons->size(); ++itag) {
675 const auto el1 = electrons->ptrAt(itag);
676 if (not
EleID_.
passID(el1, beamspotHandle, conversionsHandle))
679 float pt1 = el1->pt();
680 float eta1 = el1->eta();
681 float phi1 = el1->phi();
685 TLorentzVector vTag(0., 0., 0., 0.);
689 double tag_pt = vTag.Pt();
690 double tag_abseta = fabs(vTag.Eta());
695 if (not(tag_is_valid_tag
or tag_is_valid_probe))
699 for (
size_t iprobe = 0; iprobe < superclusters->size(); ++iprobe) {
701 const auto sc = superclusters->ptrAt(iprobe);
702 if (*sc == *(el1->superCluster())) {
707 for (
size_t iele = 0; iele < electrons->size(); ++iele) {
710 const auto ele = electrons->ptrAt(iele);
711 if (*sc == *(ele->superCluster())) {
718 TLorentzVector vProbe(0., 0., 0., 0.);
720 vProbe.SetPtEtaPhiM(eleProbe->pt(), eleProbe->eta(), eleProbe->phi(),
ELECTRON_MASS);
722 double pt = sc->energy() *
sqrt(1 -
pow(tanh(sc->eta()), 2));
723 vProbe.SetPtEtaPhiM(pt, sc->eta(), sc->phi(),
ELECTRON_MASS);
727 double probe_pt = vProbe.Pt();
728 double probe_abseta = fabs(sc->eta());
730 if (!probe_is_valid_probe)
736 TLorentzVector vDilep = vTag + vProbe;
740 if (eleProbe.
isNonnull() and (eleProbe->charge() != -el1->charge()))
747 *
fTrigger, TriggerTools::matchHLT(vProbe.Eta(), vProbe.Phi(),
fTrigger->fRecords, *hTrgEvt));
748 bool probe_pass_id = eleProbe.
isNonnull() and
EleID_.
passID(eleProbe, beamspotHandle, conversionsHandle);
755 if (probe_is_forward and tag_is_forward) {
757 }
else if (!probe_is_forward and !tag_is_forward) {
764 if (!tag_is_valid_tag)
769 if (probe_is_forward) {
775 if (probe_is_forward) {
783 if (probe_pass_id and probe_pass_trigger) {
784 if (probe_is_forward) {
789 }
else if (probe_pass_id) {
790 if (probe_is_forward) {
823 for (
unsigned int irec = 0; irec <
fTrigger->fRecords.size(); irec++) {
824 fTrigger->fRecords[irec].hltPathName =
"";
825 fTrigger->fRecords[irec].hltPathIndex = (
unsigned int)-1;
828 std::vector<std::vector<std::string>::const_iterator> matches =
830 if (matches.empty()) {
831 edm::LogWarning(
"ZCounting") <<
"requested pattern [" << pattern <<
"] does not match any HLT paths"
834 for (
auto const&
match : matches) {
839 fTrigger->fRecords[irec].hltPathName = pattern;
843 if (index < result.
size()) {
879 else if (idType ==
NoneID)
887 const float isoCut) {
891 else if (isoType ==
PFIso &&
906 return triggerMenu.
pass(
"HLT_Ele35_WPTight_Gsf_v*", hltBits);
910 return triggerMenu.
passObj(
"HLT_Ele35_WPTight_Gsf_v*",
"hltEle35noerWPTightGsfTrackIsoFilter", hltMatchBits);
ZCounting(const edm::ParameterSet &ps)
T getUntrackedParameter(std::string const &, T const &) const
MonitorElement * h_mass_Glo_pass_forward
MonitorElement * h_mass_Glo_fail_forward
bool isElectronTrigger(ZCountingTrigger::TTrigger triggerMenu, TriggerBits hltBits)
edm::InputTag fBeamspotTag
MonitorElement * h_mass_SIT_fail_central
float sumPt
sum-pt of tracks
bool isMuon(const Candidate &part)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
virtual void setCurrentFolder(std::string const &fullpath)
bool isMediumMuon(const reco::Muon &, bool run2016_hip_mitigation=false)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
bool passObj(const std::string &iName, const std::string &iObjName, const TriggerObjects &iTrigObj) const
#define DEFINE_FWK_MODULE(type)
MonitorElement * h_mass_SIT_pass_forward
bool is_glob(std::string const &pattern)
std::vector< std::string > fMuonHLTNames
unsigned int triggerIndex(std::string_view name) const
edm::LuminosityBlockNumber_t luminosityBlock() const
std::vector< Vertex > VertexCollection
collection of Vertex objects
bool passMuonID(const reco::Muon &muon, const reco::Vertex &vtx, const MuonIDTypes &idType)
edm::EDGetTokenT< edm::View< reco::GsfElectron > > fGsfElectronName_token
bool isElectronTriggerObj(ZCountingTrigger::TTrigger triggerMenu, TriggerObjects hltMatchBits)
edm::InputTag fConversionTag
MonitorElement * h_mass_HLT_pass_forward
Log< level::Error, false > LogError
float sumPhotonEt
sum pt of PF photons
ElectronIdentifier EleID_
const float ELE_ETA_CRACK_HIGH
const float ELE_ETA_CUT_TAG
MonitorElement * h_ee_mass_HLT_fail_central
Strings const & triggerNames() const
MonitorElement * h_mass_yield_Z
MonitorElement * h_mass_Glo_pass_central
std::bitset< kNTrigObjectBit > TriggerObjects
MonitorElement * h_ee_mass_HLT_pass_forward
bool isLooseMuon(const reco::Muon &)
float sumNeutralHadronEt
sum pt of neutral hadrons
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
ParameterSetID const & parameterSetID() const
edm::EDGetTokenT< reco::TrackCollection > fTrackName_token
edm::EDGetTokenT< reco::MuonCollection > fMuonName_token
void analyzeMuons(edm::Event const &e, edm::EventSetup const &eSetup)
float sumPUPt
sum pt of charged Particles not from PV (for Pu corrections)
edm::ParameterSetID fTriggerNamesID
const float ELE_MASS_CUT_HIGH
const std::string ELE_ID_WP
edm::EDGetTokenT< reco::VertexCollection > fPVName_token
unsigned int size() const
Get number of paths stored.
MonitorElement * h_yieldEE_Z
std::bitset< kNTrigBit > TriggerBits
const float ELE_PT_CUT_PROBE
MonitorElement * h_npv_yield_Z
bool passID(const reco::GsfElectronPtr &ele, edm::Handle< reco::BeamSpot > beamspot, edm::Handle< reco::ConversionCollection > conversions)
bool isMuonTrigger(const ZCountingTrigger::TTrigger &triggerMenu, const TriggerBits &hltBits)
void initHLT(const edm::TriggerResults &, const edm::TriggerNames &)
MonitorElement * h_ee_yield_Z_eeee
MonitorElement * h_ee_yield_Z_ebee
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
MonitorElement * h_ee_mass_HLT_fail_forward
bool ele_tag_selection(double pt, double abseta)
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
bool isNonnull() const
Checks for non-null.
const float ELE_MASS_CUT_LOW
const float ELE_ETA_CRACK_LOW
edm::EDGetTokenT< trigger::TriggerEvent > fHLTObjTag_token
MonitorElement * h_ee_mass_id_pass_forward
Log< level::Info, false > LogInfo
MonitorElement * h_ee_mass_HLT_pass_central
MonitorElement * h_mass_SIT_fail_forward
T const * product() const
MonitorElement * h_ee_yield_Z_ebeb
bool pass(const std::string &iName, const TriggerBits &iTrig) const
const MuonPFIsolation & pfIsolationR04() const
MonitorElement * h_mass_HLT_pass_central
const float ELE_ETA_CUT_PROBE
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
edm::EDGetTokenT< reco::ConversionCollection > fConversionToken
T getParameter(std::string const &) const
edm::EDGetTokenT< edm::TriggerResults > fHLTTag_token
bool ele_probe_selection(double pt, double abseta)
MonitorElement * h_ee_mass_id_pass_central
std::string fElectronName
MonitorElement * h_mass_HLT_fail_forward
std::vector< std::vector< std::string >::const_iterator > regexMatch(std::vector< std::string > const &strings, std::regex const ®exp)
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
bool passMuonIso(const reco::Muon &muon, const MuonIsoTypes &isoType, const float isoCut)
void setID(std::string ID)
MonitorElement * h_ee_mass_id_fail_forward
edm::EDGetTokenT< double > fRhoToken
MonitorElement * h_yieldBB_Z
std::vector< std::string > fMuonHLTObjectNames
MonitorElement * h_ee_mass_id_fail_central
void analyzeElectrons(edm::Event const &e, edm::EventSetup const &eSetup)
const float ELECTRON_MASS
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
MonitorElement * h_mass_Glo_fail_central
Log< level::Warning, false > LogWarning
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
edm::EDGetTokenT< reco::BeamSpot > fBeamspotToken
MonitorElement * h_mass_SIT_pass_central
const float ELE_PT_CUT_TAG
std::unique_ptr< ZCountingTrigger::TTrigger > fTrigger
edm::EDGetTokenT< edm::View< reco::SuperCluster > > fSCName_token
Power< A, B >::type pow(const A &a, const B &b)
MonitorElement * h_mass_HLT_fail_central
bool isMuonTriggerObj(const ZCountingTrigger::TTrigger &triggerMenu, const TriggerObjects &hltMatchBits)
const MuonIsolation & isolationR03() const
float sumChargedHadronPt
sum-pt of charged Hadron
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)