File indexing completed on 2024-04-06 12:06:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include "DPGAnalysis/Skims/interface/TagProbeMassProducer.h"
0022
0023 #include "DataFormats/Candidate/interface/Candidate.h"
0024 #include "DataFormats/Candidate/interface/CandidateFwd.h"
0025 #include "DataFormats/Common/interface/AssociationMap.h"
0026
0027 #include "DataFormats/Math/interface/deltaR.h"
0028
0029
0030
0031 #include "FWCore/Framework/interface/MakerMacros.h"
0032 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0033
0034 #include "Math/GenVector/VectorUtil.h"
0035
0036 TagProbeMassProducer::TagProbeMassProducer(const edm::ParameterSet& iConfig) {
0037 tagCollection_ = iConfig.getParameter<edm::InputTag>("TagCollection");
0038 probeCollection_ = iConfig.getParameter<edm::InputTag>("ProbeCollection");
0039 passingProbeCollection_ = iConfig.getParameter<edm::InputTag>("PassingProbeCollection");
0040
0041 massMinCut_ = iConfig.getUntrackedParameter<double>("MassMinCut", 50.0);
0042 massMaxCut_ = iConfig.getUntrackedParameter<double>("MassMaxCut", 120.0);
0043 delRMinCut_ = iConfig.getUntrackedParameter<double>("DelRMinCut", 0.0);
0044 delRMaxCut_ = iConfig.getUntrackedParameter<double>("DelRMaxCut", 10000.0);
0045
0046 requireOS_ = iConfig.getUntrackedParameter<bool>("RequireOS", true);
0047
0048 produces<std::vector<float> >("TPmass");
0049 }
0050
0051 TagProbeMassProducer::~TagProbeMassProducer() {}
0052
0053
0054
0055
0056
0057
0058 void TagProbeMassProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0059
0060 std::unique_ptr<std::vector<float> > TPmass(new std::vector<float>);
0061
0062 if (!iEvent.getByLabel(tagCollection_, tags)) {
0063 edm::LogWarning("TagProbe") << "Could not extract tag muons with input tag " << tagCollection_;
0064 }
0065
0066 if (!iEvent.getByLabel(probeCollection_, probes)) {
0067 edm::LogWarning("TagProbe") << "Could not extract probe muons with input tag " << probeCollection_;
0068 }
0069
0070 if (!iEvent.getByLabel(passingProbeCollection_, passingProbes)) {
0071 edm::LogWarning("TagProbe") << "Could not extract passing probe muons with input tag " << passingProbeCollection_;
0072 }
0073
0074
0075 if (tags.isValid() && probes.isValid()) {
0076 edm::RefToBaseVector<reco::Candidate> vtags;
0077 for (size_t i = 0; i < tags->size(); ++i) {
0078 vtags.push_back(tags->refAt(i));
0079 }
0080 edm::RefToBaseVector<reco::Candidate> vprobes;
0081 for (size_t i = 0; i < probes->size(); ++i) {
0082 vprobes.push_back(probes->refAt(i));
0083 }
0084
0085 int itag = 0;
0086 edm::RefToBaseVector<reco::Candidate>::const_iterator tag = vtags.begin();
0087 for (; tag != vtags.end(); ++tag, ++itag) {
0088 int iprobe = 0;
0089 edm::RefToBaseVector<reco::Candidate>::const_iterator probe = vprobes.begin();
0090 for (; probe != vprobes.end(); ++probe, ++iprobe) {
0091
0092 double invMass = ROOT::Math::VectorUtil::InvariantMass((*tag)->p4(), (*probe)->p4());
0093 if (invMass < massMinCut_)
0094 continue;
0095 if (invMass > massMaxCut_)
0096 continue;
0097
0098
0099 double delR = reco::deltaR<double>((*tag)->eta(), (*tag)->phi(), (*probe)->eta(), (*probe)->phi());
0100 if (delR < delRMinCut_)
0101 continue;
0102 if (delR > delRMaxCut_)
0103 continue;
0104
0105
0106 int sign = (*tag)->charge() * (*probe)->charge();
0107 if (requireOS_ && sign > 0)
0108 continue;
0109
0110 bool isPassing = isPassingProbe(iprobe);
0111
0112 if (isPassing)
0113 TPmass->push_back(invMass);
0114 }
0115 }
0116 }
0117
0118
0119 iEvent.put(std::move(TPmass), "TPmass");
0120 }
0121
0122 bool TagProbeMassProducer::isPassingProbe(const unsigned int iProbe) const {
0123 if (iProbe > probes->size())
0124 return false;
0125
0126 edm::RefToBase<reco::Candidate> probeRef = probes->refAt(iProbe);
0127 edm::RefToBase<reco::Candidate> passingProbeRef;
0128
0129 unsigned int numPassingProbes = passingProbes->size();
0130
0131 for (unsigned int iPassProbe = 0; iPassProbe < numPassingProbes; ++iPassProbe) {
0132 passingProbeRef = passingProbes->refAt(iPassProbe);
0133 if (passingProbeRef == probeRef) {
0134 return true;
0135 }
0136 }
0137 return false;
0138 }
0139
0140
0141 DEFINE_FWK_MODULE(TagProbeMassProducer);