File indexing completed on 2023-03-17 11:16:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 #include "DataFormats/Common/interface/View.h"
0014 #include "FWCore/Utilities/interface/transform.h"
0015 #include "FWCore/Framework/interface/stream/EDProducer.h"
0016 #include "FWCore/Framework/interface/Event.h"
0017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0018 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
0019 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
0020 #include "DataFormats/Common/interface/Association.h"
0021 #include "DataFormats/Common/interface/ValueMap.h"
0022 #include "CommonTools/Utils/interface/EtComparator.h"
0023 #include "DataFormats/PatCandidates/interface/GenericParticle.h"
0024 #include "PhysicsTools/PatAlgos/interface/MultiIsolator.h"
0025 #include "PhysicsTools/PatAlgos/interface/EfficiencyLoader.h"
0026 #include "PhysicsTools/PatAlgos/interface/KinResolutionsLoader.h"
0027 #include "PhysicsTools/PatAlgos/interface/VertexingHelper.h"
0028 #include "DataFormats/PatCandidates/interface/UserData.h"
0029 #include "PhysicsTools/PatAlgos/interface/PATUserDataHelper.h"
0030
0031 #include <memory>
0032
0033 namespace pat {
0034
0035 class PATGenericParticleProducer : public edm::stream::EDProducer<> {
0036 public:
0037 explicit PATGenericParticleProducer(const edm::ParameterSet& iConfig);
0038 ~PATGenericParticleProducer() override;
0039
0040 void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0041
0042 private:
0043
0044 edm::EDGetTokenT<edm::View<reco::Candidate> > srcToken_;
0045
0046
0047 bool embedSuperCluster_, embedTrack_, embedTracks_, embedGsfTrack_, embedCaloTower_, embedStandalone_,
0048 embedCombined_;
0049
0050 bool addQuality_;
0051 edm::EDGetTokenT<edm::ValueMap<float> > qualitySrcToken_;
0052
0053 bool addGenMatch_;
0054 bool embedGenMatch_;
0055 std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection> > > genMatchTokens_;
0056
0057
0058 GreaterByEt<GenericParticle> eTComparator_;
0059
0060 pat::helper::MultiIsolator isolator_;
0061 pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_;
0062 std::vector<std::pair<pat::IsolationKeys, edm::InputTag> > isoDepositLabels_;
0063 std::vector<edm::EDGetTokenT<edm::ValueMap<IsoDeposit> > > isoDepositTokens_;
0064
0065 bool addEfficiencies_;
0066 pat::helper::EfficiencyLoader efficiencyLoader_;
0067
0068 bool addResolutions_;
0069 pat::helper::KinResolutionsLoader resolutionLoader_;
0070
0071 pat::helper::VertexingHelper vertexingHelper_;
0072
0073 bool useUserData_;
0074 pat::PATUserDataHelper<pat::GenericParticle> userDataHelper_;
0075 };
0076
0077 }
0078
0079 using namespace pat;
0080
0081 PATGenericParticleProducer::PATGenericParticleProducer(const edm::ParameterSet& iConfig)
0082 : isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation")
0083 : edm::ParameterSet(),
0084 consumesCollector(),
0085 false),
0086 userDataHelper_(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector()) {
0087
0088 srcToken_ = consumes<edm::View<reco::Candidate> >(iConfig.getParameter<edm::InputTag>("src"));
0089
0090
0091 embedTrack_ = iConfig.getParameter<bool>("embedTrack");
0092 embedGsfTrack_ = iConfig.getParameter<bool>("embedGsfTrack");
0093 embedStandalone_ = iConfig.getParameter<bool>("embedStandAloneMuon");
0094 embedCombined_ = iConfig.getParameter<bool>("embedCombinedMuon");
0095 embedSuperCluster_ = iConfig.getParameter<bool>("embedSuperCluster");
0096 embedTracks_ = iConfig.getParameter<bool>("embedMultipleTracks");
0097 embedCaloTower_ = iConfig.getParameter<bool>("embedCaloTower");
0098
0099
0100 addGenMatch_ = iConfig.getParameter<bool>("addGenMatch");
0101 if (addGenMatch_) {
0102 embedGenMatch_ = iConfig.getParameter<bool>("embedGenMatch");
0103 if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
0104 genMatchTokens_.push_back(consumes<edm::Association<reco::GenParticleCollection> >(
0105 iConfig.getParameter<edm::InputTag>("genParticleMatch")));
0106 } else {
0107 genMatchTokens_ = edm::vector_transform(
0108 iConfig.getParameter<std::vector<edm::InputTag> >("genParticleMatch"),
0109 [this](edm::InputTag const& tag) { return consumes<edm::Association<reco::GenParticleCollection> >(tag); });
0110 }
0111 }
0112
0113
0114 addQuality_ = iConfig.getParameter<bool>("addQuality");
0115 qualitySrcToken_ = mayConsume<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("qualitySource"));
0116
0117
0118 produces<std::vector<GenericParticle> >();
0119
0120 if (iConfig.exists("isoDeposits")) {
0121 edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
0122 if (depconf.exists("tracker"))
0123 isoDepositLabels_.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
0124 if (depconf.exists("ecal"))
0125 isoDepositLabels_.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
0126 if (depconf.exists("hcal"))
0127 isoDepositLabels_.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
0128 if (depconf.exists("user")) {
0129 std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
0130 std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
0131 int key = UserBaseIso;
0132 for (; it != ed; ++it, ++key) {
0133 isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
0134 }
0135 }
0136 }
0137 isoDepositTokens_ =
0138 edm::vector_transform(isoDepositLabels_, [this](std::pair<IsolationKeys, edm::InputTag> const& label) {
0139 return consumes<edm::ValueMap<IsoDeposit> >(label.second);
0140 });
0141
0142
0143 addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
0144 if (addEfficiencies_) {
0145 efficiencyLoader_ =
0146 pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
0147 }
0148
0149
0150 addResolutions_ = iConfig.getParameter<bool>("addResolutions");
0151 if (addResolutions_) {
0152 resolutionLoader_ =
0153 pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"), consumesCollector());
0154 }
0155
0156 if (iConfig.exists("vertexing")) {
0157 vertexingHelper_ =
0158 pat::helper::VertexingHelper(iConfig.getParameter<edm::ParameterSet>("vertexing"), consumesCollector());
0159 }
0160
0161
0162 useUserData_ = false;
0163 if (iConfig.exists("userData")) {
0164 useUserData_ = true;
0165 }
0166 }
0167
0168 PATGenericParticleProducer::~PATGenericParticleProducer() {}
0169
0170 void PATGenericParticleProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0171
0172 edm::Handle<edm::View<reco::Candidate> > cands;
0173 iEvent.getByToken(srcToken_, cands);
0174
0175
0176 if (isolator_.enabled())
0177 isolator_.beginEvent(iEvent, iSetup);
0178
0179 if (efficiencyLoader_.enabled())
0180 efficiencyLoader_.newEvent(iEvent);
0181 if (resolutionLoader_.enabled())
0182 resolutionLoader_.newEvent(iEvent, iSetup);
0183 if (vertexingHelper_.enabled())
0184 vertexingHelper_.newEvent(iEvent, iSetup);
0185
0186
0187 std::vector<edm::Handle<edm::ValueMap<IsoDeposit> > > deposits(isoDepositTokens_.size());
0188 for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
0189 iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
0190 }
0191
0192
0193 std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > > genMatches(genMatchTokens_.size());
0194 if (addGenMatch_) {
0195 for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
0196 iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
0197 }
0198 }
0199
0200
0201 edm::Handle<edm::ValueMap<float> > qualities;
0202 if (addQuality_)
0203 iEvent.getByToken(qualitySrcToken_, qualities);
0204
0205
0206 std::vector<GenericParticle>* PATGenericParticles = new std::vector<GenericParticle>();
0207 for (edm::View<reco::Candidate>::const_iterator itGenericParticle = cands->begin(); itGenericParticle != cands->end();
0208 itGenericParticle++) {
0209
0210 unsigned int idx = itGenericParticle - cands->begin();
0211 edm::RefToBase<reco::Candidate> candRef = cands->refAt(idx);
0212
0213 PATGenericParticles->push_back(GenericParticle(candRef));
0214 GenericParticle& aGenericParticle = PATGenericParticles->back();
0215
0216
0217 if (embedTrack_)
0218 aGenericParticle.embedTrack();
0219 if (embedGsfTrack_)
0220 aGenericParticle.embedGsfTrack();
0221 if (embedTracks_)
0222 aGenericParticle.embedTracks();
0223 if (embedStandalone_)
0224 aGenericParticle.embedStandalone();
0225 if (embedCombined_)
0226 aGenericParticle.embedCombined();
0227 if (embedSuperCluster_)
0228 aGenericParticle.embedSuperCluster();
0229 if (embedCaloTower_)
0230 aGenericParticle.embedCaloTower();
0231
0232
0233 if (isolator_.enabled()) {
0234 isolator_.fill(*cands, idx, isolatorTmpStorage_);
0235 typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
0236
0237 for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(),
0238 ed = isolatorTmpStorage_.rend();
0239 it != ed;
0240 ++it) {
0241 aGenericParticle.setIsolation(it->first, it->second);
0242 }
0243 }
0244
0245
0246 for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
0247 aGenericParticle.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[candRef]);
0248 }
0249
0250
0251 if (addGenMatch_) {
0252 for (size_t i = 0, n = genMatches.size(); i < n; ++i) {
0253 reco::GenParticleRef genGenericParticle = (*genMatches[i])[candRef];
0254 aGenericParticle.addGenParticleRef(genGenericParticle);
0255 }
0256 if (embedGenMatch_)
0257 aGenericParticle.embedGenParticle();
0258 }
0259
0260 if (addQuality_) {
0261 aGenericParticle.setQuality((*qualities)[candRef]);
0262 }
0263
0264 if (efficiencyLoader_.enabled()) {
0265 efficiencyLoader_.setEfficiencies(aGenericParticle, candRef);
0266 }
0267
0268 if (resolutionLoader_.enabled()) {
0269 resolutionLoader_.setResolutions(aGenericParticle);
0270 }
0271
0272 if (vertexingHelper_.enabled()) {
0273 aGenericParticle.setVertexAssociation(vertexingHelper_(candRef));
0274 }
0275
0276 if (useUserData_) {
0277 userDataHelper_.add(aGenericParticle, iEvent, iSetup);
0278 }
0279
0280
0281
0282
0283 }
0284
0285
0286 std::sort(PATGenericParticles->begin(), PATGenericParticles->end(), eTComparator_);
0287
0288
0289 std::unique_ptr<std::vector<GenericParticle> > myGenericParticles(PATGenericParticles);
0290 iEvent.put(std::move(myGenericParticles));
0291 if (isolator_.enabled())
0292 isolator_.endEvent();
0293 }
0294
0295 #include "FWCore/Framework/interface/MakerMacros.h"
0296 DEFINE_FWK_MODULE(PATGenericParticleProducer);