00001
00002
00003
00004
00005 #include "PhysicsTools/PatAlgos/plugins/PATPhotonProducer.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007 #include "DataFormats/Common/interface/View.h"
00008 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
00009 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00010
00011 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00012 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00013
00014 #include <memory>
00015
00016 using namespace pat;
00017
00018 PATPhotonProducer::PATPhotonProducer(const edm::ParameterSet & iConfig) :
00019 isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), false) ,
00020 useUserData_(iConfig.exists("userData"))
00021 {
00022
00023 photonSrc_ = iConfig.getParameter<edm::InputTag>("photonSource");
00024 embedSuperCluster_ = iConfig.getParameter<bool> ("embedSuperCluster");
00025
00026
00027 addGenMatch_ = iConfig.getParameter<bool> ( "addGenMatch" );
00028 if (addGenMatch_) {
00029 embedGenMatch_ = iConfig.getParameter<bool> ( "embedGenMatch" );
00030 if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
00031 genMatchSrc_.push_back(iConfig.getParameter<edm::InputTag>( "genParticleMatch" ));
00032 } else {
00033 genMatchSrc_ = iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" );
00034 }
00035 }
00036
00037
00038 addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
00039 if (addEfficiencies_) {
00040 efficiencyLoader_ = pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"));
00041 }
00042
00043
00044 addPhotonID_ = iConfig.getParameter<bool> ( "addPhotonID" );
00045 if (addPhotonID_) {
00046
00047 if (iConfig.existsAs<edm::InputTag>("photonIDSource")) {
00048 photIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("photonIDSource")));
00049 }
00050
00051 if (iConfig.existsAs<edm::ParameterSet>("photonIDSources")) {
00052
00053 if (!photIDSrcs_.empty()) throw cms::Exception("Configuration") <<
00054 "PATPhotonProducer: you can't specify both 'photonIDSource' and 'photonIDSources'\n";
00055
00056 edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("photonIDSources");
00057 std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
00058 for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
00059 photIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
00060 }
00061 }
00062
00063 if (photIDSrcs_.empty()) throw cms::Exception("Configuration") <<
00064 "PATPhotonProducer: id addPhotonID is true, you must specify either:\n" <<
00065 "\tInputTag photonIDSource = <someTag>\n" << "or\n" <<
00066 "\tPSet photonIDSources = { \n" <<
00067 "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
00068 "\t}\n";
00069 }
00070
00071
00072
00073
00074 addResolutions_ = iConfig.getParameter<bool>("addResolutions");
00075 if (addResolutions_) {
00076 resolutionLoader_ = pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"));
00077 }
00078
00079
00080 if ( useUserData_ ) {
00081 userDataHelper_ = PATUserDataHelper<Photon>(iConfig.getParameter<edm::ParameterSet>("userData"));
00082 }
00083
00084
00085
00086 produces<std::vector<Photon> >();
00087
00088 if (iConfig.exists("isoDeposits")) {
00089 edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
00090 if (depconf.exists("tracker")) isoDepositLabels_.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
00091 if (depconf.exists("ecal")) isoDepositLabels_.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
00092 if (depconf.exists("hcal")) isoDepositLabels_.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
00093 if (depconf.exists("user")) {
00094 std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
00095 std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
00096 int key = UserBaseIso;
00097 for ( ; it != ed; ++it, ++key) {
00098 isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
00099 }
00100 }
00101 }
00102 }
00103
00104 PATPhotonProducer::~PATPhotonProducer() {
00105 }
00106
00107 void PATPhotonProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSetup) {
00108
00109
00110 edm::Handle<edm::View<reco::Photon> > photons;
00111 iEvent.getByLabel(photonSrc_, photons);
00112
00113 if (iEvent.isRealData()){
00114 addGenMatch_ = false;
00115 embedGenMatch_ = false;
00116 }
00117
00118
00119 std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > > genMatches(genMatchSrc_.size());
00120 if (addGenMatch_) {
00121 for (size_t j = 0, nd = genMatchSrc_.size(); j < nd; ++j) {
00122 iEvent.getByLabel(genMatchSrc_[j], genMatches[j]);
00123 }
00124 }
00125
00126 if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
00127
00128 if (efficiencyLoader_.enabled()) efficiencyLoader_.newEvent(iEvent);
00129 if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
00130
00131 std::vector<edm::Handle<edm::ValueMap<IsoDeposit> > > deposits(isoDepositLabels_.size());
00132 for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
00133 iEvent.getByLabel(isoDepositLabels_[j].second, deposits[j]);
00134 }
00135
00136
00137 std::vector<edm::Handle<edm::ValueMap<Bool_t> > > idhandles;
00138 std::vector<pat::Photon::IdPair> ids;
00139 if (addPhotonID_) {
00140 idhandles.resize(photIDSrcs_.size());
00141 ids.resize(photIDSrcs_.size());
00142 for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
00143 iEvent.getByLabel(photIDSrcs_[i].second, idhandles[i]);
00144 ids[i].first = photIDSrcs_[i].first;
00145 }
00146 }
00147
00148
00149 std::vector<Photon> * PATPhotons = new std::vector<Photon>();
00150 for (edm::View<reco::Photon>::const_iterator itPhoton = photons->begin(); itPhoton != photons->end(); itPhoton++) {
00151
00152 unsigned int idx = itPhoton - photons->begin();
00153 edm::RefToBase<reco::Photon> photonRef = photons->refAt(idx);
00154 edm::Ptr<reco::Photon> photonPtr = photons->ptrAt(idx);
00155 Photon aPhoton(photonRef);
00156 if (embedSuperCluster_) aPhoton.embedSuperCluster();
00157
00158
00159 if (addGenMatch_) {
00160 for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
00161 reco::GenParticleRef genPhoton = (*genMatches[i])[photonRef];
00162 aPhoton.addGenParticleRef(genPhoton);
00163 }
00164 if (embedGenMatch_) aPhoton.embedGenParticle();
00165 }
00166
00167 if (efficiencyLoader_.enabled()) {
00168 efficiencyLoader_.setEfficiencies( aPhoton, photonRef );
00169 }
00170
00171 if (resolutionLoader_.enabled()) {
00172 resolutionLoader_.setResolutions(aPhoton);
00173 }
00174
00175
00176 if (isolator_.enabled()) {
00177 isolator_.fill(*photons, idx, isolatorTmpStorage_);
00178 typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
00179
00180 for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(), ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
00181 aPhoton.setIsolation(it->first, it->second);
00182 }
00183 }
00184
00185 for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
00186 aPhoton.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[photonRef]);
00187 }
00188
00189
00190
00191 if (addPhotonID_) {
00192 for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
00193 ids[i].second = (*idhandles[i])[photonRef];
00194 }
00195 aPhoton.setPhotonIDs(ids);
00196 }
00197
00198 if ( useUserData_ ) {
00199 userDataHelper_.add( aPhoton, iEvent, iSetup );
00200 }
00201
00202
00203
00204 PATPhotons->push_back(aPhoton);
00205 }
00206
00207
00208 std::sort(PATPhotons->begin(), PATPhotons->end(), eTComparator_);
00209
00210
00211 std::auto_ptr<std::vector<Photon> > myPhotons(PATPhotons);
00212 iEvent.put(myPhotons);
00213 if (isolator_.enabled()) isolator_.endEvent();
00214
00215 }
00216
00217
00218 void PATPhotonProducer::fillDescriptions(edm::ConfigurationDescriptions & descriptions)
00219 {
00220 edm::ParameterSetDescription iDesc;
00221 iDesc.setComment("PAT photon producer module");
00222
00223
00224 iDesc.add<edm::InputTag>("photonSource", edm::InputTag("no default"))->setComment("input collection");
00225
00226 iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
00227
00228
00229 iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
00230 iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
00231 std::vector<edm::InputTag> emptySourceVector;
00232 iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
00233 edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
00234 )->setComment("input with MC match information");
00235
00236 pat::helper::KinResolutionsLoader::fillDescription(iDesc);
00237
00238
00239 iDesc.add<bool>("addPhotonID",true)->setComment("add photon ID variables");
00240 edm::ParameterSetDescription photonIDSourcesPSet;
00241 photonIDSourcesPSet.setAllowAnything();
00242 iDesc.addNode( edm::ParameterDescription<edm::InputTag>("photonIDSource", edm::InputTag(), true) xor
00243 edm::ParameterDescription<edm::ParameterSetDescription>("photonIDSources", photonIDSourcesPSet, true)
00244 )->setComment("input with photon ID variables");
00245
00246
00247 edm::ParameterSetDescription isoDepositsPSet;
00248 isoDepositsPSet.addOptional<edm::InputTag>("tracker");
00249 isoDepositsPSet.addOptional<edm::InputTag>("ecal");
00250 isoDepositsPSet.addOptional<edm::InputTag>("hcal");
00251 isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
00252 iDesc.addOptional("isoDeposits", isoDepositsPSet);
00253
00254
00255 edm::ParameterSetDescription efficienciesPSet;
00256 efficienciesPSet.setAllowAnything();
00257 iDesc.add("efficiencies", efficienciesPSet);
00258 iDesc.add<bool>("addEfficiencies", false);
00259
00260
00261 edm::ParameterSetDescription userDataPSet;
00262 PATUserDataHelper<Photon>::fillDescription(userDataPSet);
00263 iDesc.addOptional("userData", userDataPSet);
00264
00265 edm::ParameterSetDescription isolationPSet;
00266 isolationPSet.setAllowAnything();
00267 iDesc.add("userIsolation", isolationPSet);
00268
00269 descriptions.add("PATPhotonProducer", iDesc);
00270
00271 }
00272
00273 #include "FWCore/Framework/interface/MakerMacros.h"
00274
00275 DEFINE_FWK_MODULE(PATPhotonProducer);