85 std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection>>>
genMatchTokens_;
105 template <
typename T>
107 const char* psetName,
118 typedef std::pair<std::string, edm::InputTag>
NameTag;
140 template <
typename T>
142 const char* psetName,
147 if (iConfig.
exists(psetName)) {
150 if (depconf.
exists(
"tracker"))
152 if (depconf.
exists(
"ecal"))
154 if (depconf.
exists(
"hcal"))
156 if (depconf.
exists(
"pfAllParticles")) {
159 if (depconf.
exists(
"pfChargedHadrons")) {
163 if (depconf.
exists(
"pfChargedAll")) {
166 if (depconf.
exists(
"pfPUChargedHadrons")) {
170 if (depconf.
exists(
"pfNeutralHadrons")) {
174 if (depconf.
exists(
"pfPhotons")) {
177 if (depconf.
exists(
"user")) {
178 std::vector<edm::InputTag> userdeps = depconf.
getParameter<std::vector<edm::InputTag>>(
"user");
179 std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
181 for (; it != ed; ++it, ++
key) {
187 labels, [
this](
IsolationLabel const&
label) {
return consumes<edm::ValueMap<T>>(label.second); });
190 labels, [
this](
IsolationLabel const&
label) {
return consumes<edm::ValueMap<T>>(label.second); });
198 ecalClusterToolsESGetTokens_{consumesCollector()},
203 useUserData_(
iConfig.exists(
"userData")),
207 photonToken_ = consumes<edm::View<reco::Photon>>(
iConfig.getParameter<
edm::InputTag>(
"photonSource"));
208 electronToken_ = consumes<reco::GsfElectronCollection>(
iConfig.getParameter<
edm::InputTag>(
"electronSource"));
209 hConversionsToken_ = consumes<reco::ConversionCollection>(
iConfig.getParameter<
edm::InputTag>(
"conversionSource"));
211 embedSuperCluster_ =
iConfig.getParameter<
bool>(
"embedSuperCluster");
212 embedSeedCluster_ =
iConfig.getParameter<
bool>(
"embedSeedCluster");
213 embedBasicClusters_ =
iConfig.getParameter<
bool>(
"embedBasicClusters");
214 embedPreshowerClusters_ =
iConfig.getParameter<
bool>(
"embedPreshowerClusters");
215 embedRecHits_ =
iConfig.getParameter<
bool>(
"embedRecHits");
216 reducedBarrelRecHitCollection_ =
iConfig.getParameter<
edm::InputTag>(
"reducedBarrelRecHitCollection");
217 reducedBarrelRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedBarrelRecHitCollection_);
218 reducedEndcapRecHitCollection_ =
iConfig.getParameter<
edm::InputTag>(
"reducedEndcapRecHitCollection");
219 reducedEndcapRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedEndcapRecHitCollection_);
221 addGenMatch_ =
iConfig.getParameter<
bool>(
"addGenMatch");
223 embedGenMatch_ =
iConfig.getParameter<
bool>(
"embedGenMatch");
229 iConfig.getParameter<std::vector<edm::InputTag>>(
"genParticleMatch"),
234 addEfficiencies_ =
iConfig.getParameter<
bool>(
"addEfficiencies");
235 if (addEfficiencies_) {
240 addPuppiIsolation_ =
iConfig.getParameter<
bool>(
"addPuppiIsolation");
241 if (addPuppiIsolation_) {
242 PUPPIIsolation_charged_hadrons_ =
243 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiIsolationChargedHadrons"));
244 PUPPIIsolation_neutral_hadrons_ =
245 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiIsolationNeutralHadrons"));
246 PUPPIIsolation_photons_ =
249 addPFClusterIso_ =
iConfig.getParameter<
bool>(
"addPFClusterIso");
250 if (addPFClusterIso_) {
251 ecalPFClusterIsoT_ = consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"ecalPFClusterIsoMap"));
253 if (not hcPFC.label().empty())
258 addPhotonID_ =
iConfig.getParameter<
bool>(
"addPhotonID");
267 if (!photIDSrcs_.empty()) {
269 <<
"PATPhotonProducer: you can't specify both 'photonIDSource' and 'photonIDSources'\n";
274 for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
279 if (photIDSrcs_.empty())
280 throw cms::Exception(
"Configuration") <<
"PATPhotonProducer: id addPhotonID is true, you must specify either:\n"
281 <<
"\tInputTag photonIDSource = <someTag>\n"
283 <<
"\tPSet photonIDSources = { \n"
284 <<
"\t\tInputTag <someName> = <someTag> // as many as you want \n "
288 photIDSrcs_, [
this](NameTag
const&
tag) {
return mayConsume<edm::ValueMap<Bool_t>>(tag.second); });
290 addResolutions_ =
iConfig.getParameter<
bool>(
"addResolutions");
291 if (addResolutions_) {
301 produces<std::vector<Photon>>();
304 readIsolationLabels(
iConfig,
"isoDeposits", isoDepositLabels_, isoDepositTokens_);
306 readIsolationLabels(
iConfig,
"isolationValues", isolationValueLabels_, isolationValueTokens_);
308 saveRegressionData_ =
iConfig.getParameter<
bool>(
"saveRegressionData");
311 PATPhotonProducer::~PATPhotonProducer() {}
345 std::vector<edm::Handle<edm::Association<reco::GenParticleCollection>>> genMatches(
genMatchTokens_.size());
371 std::vector<edm::Handle<edm::ValueMap<Bool_t>>> idhandles;
372 std::vector<pat::Photon::IdPair> ids;
393 std::vector<Photon>* PATPhotons =
new std::vector<Photon>();
396 unsigned int idx = itPhoton - photons->begin();
399 Photon aPhoton(photonRef);
400 auto phoPtr = photons->ptrAt(idx);
410 std::vector<DetId> selectedCells;
411 bool barrel = itPhoton->isEB();
415 clusIt != itPhoton->superCluster()->clustersEnd();
418 DetId seed = lazyTools.getMaximum(**clusIt).first;
420 std::vector<DetId> dets5x5 =
423 selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
426 for (
const std::pair<DetId, float>&
hit : (*clusIt)->hitsAndFractions()) {
427 selectedCells.push_back(
hit.first);
433 std::sort(selectedCells.begin(), selectedCells.end());
434 std::unique(selectedCells.begin(), selectedCells.end());
439 iEvent.
getByToken(reducedBarrelRecHitCollectionToken_, recHitsEBHandle);
441 iEvent.
getByToken(reducedEndcapRecHitCollectionToken_, recHitsEEHandle);
447 recHits = recHitsEBHandle.product();
449 recHits = recHitsEEHandle.
product();
453 unsigned nSelectedCells = selectedCells.
size();
454 for (
unsigned icell = 0; icell < nSelectedCells; ++icell) {
456 if (it != recHits->
end()) {
460 selectedRecHits.
sort();
466 for (
size_t i = 0,
n = genMatches.size();
i <
n; ++
i) {
495 for (
size_t j = 0, nd = deposits.size();
j < nd; ++
j) {
499 for (
size_t j = 0;
j < isolationValues.size(); ++
j) {
506 ids[
i].second = (*idhandles[
i])[photonRef];
516 bool passelectronveto =
false;
520 photonRef->
superCluster(), *hElectrons, *hConversions, beamSpotHandle->position());
534 recHitsEBHandle.product(),
606 (*PUPPIIsolation_neutral_hadrons)[phoPtr],
607 (*PUPPIIsolation_photons)[phoPtr]);
628 PATPhotons->push_back(aPhoton);
632 std::sort(PATPhotons->begin(), PATPhotons->end(),
eTComparator_);
635 std::unique_ptr<std::vector<Photon>> myPhotons(PATPhotons);
644 iDesc.
setComment(
"PAT photon producer module");
657 "ecalPFClusterIsoMap",
edm::InputTag(
"photonEcalPFClusterIsolationProducer"),
true) and
659 "hcalPFClusterIsoMap",
edm::InputTag(
"photonHcalPFClusterIsolationProducer"),
true))
or
666 "puppiIsolationChargedHadrons",
edm::InputTag(
"egmPhotonPUPPIIsolation",
"h+-DR030-"),
true) and
668 "puppiIsolationNeutralHadrons",
edm::InputTag(
"egmPhotonPUPPIIsolation",
"h0-DR030-"),
true) and
670 "puppiIsolationPhotons",
edm::InputTag(
"egmPhotonPUPPIIsolation",
"gamma-DR030-"),
true))
or
673 iDesc.
add<
bool>(
"embedSuperCluster",
true)->setComment(
"embed external super cluster");
674 iDesc.
add<
bool>(
"embedSeedCluster",
true)->setComment(
"embed external seed cluster");
675 iDesc.
add<
bool>(
"embedBasicClusters",
true)->setComment(
"embed external basic clusters");
676 iDesc.
add<
bool>(
"embedPreshowerClusters",
true)->setComment(
"embed external preshower clusters");
677 iDesc.
add<
bool>(
"embedRecHits",
true)->setComment(
"embed external RecHits");
680 iDesc.
add<
bool>(
"addGenMatch",
true)->setComment(
"add MC matching");
681 iDesc.
add<
bool>(
"embedGenMatch",
false)->setComment(
"embed MC matched MC information");
682 std::vector<edm::InputTag> emptySourceVector;
686 ->
setComment(
"input with MC match information");
691 iDesc.
add<
bool>(
"addPhotonID",
true)->setComment(
"add photon ID variables");
697 ->
setComment(
"input with photon ID variables");
710 isoDepositsPSet.
addOptional<std::vector<edm::InputTag>>(
"user");
724 isolationValuesPSet.
addOptional<std::vector<edm::InputTag>>(
"user");
725 iDesc.
addOptional(
"isolationValues", isolationValuesPSet);
730 iDesc.
add(
"efficiencies", efficienciesPSet);
731 iDesc.
add<
bool>(
"addEfficiencies",
false);
740 iDesc.
add(
"userIsolation", isolationPSet);
743 ->
setComment(
"input with high level selection");
745 iDesc.
add<
bool>(
"saveRegressionData",
true)->setComment(
"save regression input variables");
747 descriptions.
add(
"PATPhotonProducer", iDesc);
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
bool enabled() const
'true' if this there is at least one efficiency configured
float sigmaIPhiIPhi() const
bool embedPreshowerClusters_
void setPflowIsolationVariables(const PflowIsolationVariables &pfisol)
Set Particle Flow Isolation variables.
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
const std::vector< float > & subClusRawEnergy() const
Analysis-level Photon class.
pat::PATUserDataHelper< pat::Photon > userDataHelper_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
float maxSubClusDRRawEnergy() const
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
float maxSubClusDRDEta() const
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
void setSubClusDPhi3(float s)
std::pair< std::string, edm::InputTag > NameTag
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
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T >>> &tokens)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void setAllowAnything()
allow any parameter label/value pairs
std::vector< edm::EDGetTokenT< edm::ValueMap< Bool_t > > > photIDTokens_
void fill(const reco::SuperCluster &superClus, const EcalRecHitCollection *ebRecHits, const EcalRecHitCollection *eeRecHits, const CaloGeometry *geom, const CaloTopology *topology, const reco::VertexCollection *vertices)
#define DEFINE_FWK_MODULE(type)
void setMaxDRRawEnergy(float m)
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
void embedSeedCluster()
method to store the electron's seedcluster internally
constexpr bool isUninitialized() const noexcept
edm::EDGetTokenT< edm::View< reco::Photon > > photonToken_
std::vector< EcalRecHit >::const_iterator const_iterator
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void setSubClusDPhi2(float s)
edm::EDGetTokenT< edm::ValueMap< float > > ecalPFClusterIsoT_
void push_back(T const &t)
float seedCrysPhiOrY() const
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
void embedRecHits(const EcalRecHitCollection *rechits)
method to store the RecHits internally - can be called from the PATElectronProducer ...
void setIsolationPUPPI(float chargedhadrons_, float neutralhadrons_, float photons_)
Sets PUPPI isolation.
pat::helper::KinResolutionsLoader resolutionLoader_
float sigmaIEtaIEta() const
edm::EDGetTokenT< edm::ValueMap< float > > hcalPFClusterIsoT_
GreaterByEt< Photon > eTComparator_
IsolationKeys
Enum defining isolation keys.
const CaloGeometry * ecalGeometry_
float sigmaIEtaIPhi() const
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
const std::string names[nVars_]
edm::InputTag reducedEndcapRecHitCollection_
std::vector< IsolationLabel > IsolationLabels
bool enabled() const
'true' if this there is at least one efficiency configured
static void fillDescription(edm::ParameterSetDescription &iDesc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
bool getData(T &iHolder) const
bool enabled() const
True if it has a non null configuration.
IsolationLabels isoDepositLabels_
void setIsolation(IsolationKeys key, float value)
void setComment(std::string const &value)
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
const CaloTopology * ecalTopology_
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
float seedCrysIPhiOrIY() const
IsolationLabels isolationValueLabels_
void setMaxDRDEta(float m)
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
pat::helper::EfficiencyLoader efficiencyLoader_
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
float maxSubClusDR() const
void setPhotonIDs(const std::vector< IdPair > &ids)
float seedCrysIEtaOrIX() const
void embedBasicClusters()
method to store the electron's basic clusters
tuple key
prepare the HTCondor submission files and eventually submit them
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_photons_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void setPassElectronVeto(bool flag)
float maxSubClusDRDPhi() const
void setSeedEnergy(float e)
void setSubClusDPhi1(float s)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
~PATPhotonProducer() override
std::vector< NameTag > photIDSrcs_
void setSubClusDEta1(float s)
pat::helper::MultiIsolator isolator_
float seedCrysEtaOrX() const
void embedPreshowerClusters()
method to store the electron's preshower clusters
const_iterator end() const
void embedSuperCluster()
method to store the photon's supercluster internally
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
void addGenParticleRef(const reco::GenParticleRef &ref)
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
void setHasPixelSeed(bool flag)
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_charged_hadrons_
T const * product() const
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
void setSubClusDEta2(float s)
bool hasPixelSeed() const
Bool flagging photons having a non-zero size vector of Ref to electornPixel seeds.
T getParameter(std::string const &) const
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
void setSubClusRawE2(float s)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
const std::vector< float > & subClusDEta() const
void setMaxDRDPhi(float m)
iterator find(key_type k)
const std::vector< float > & subClusDPhi() const
const EcalClusterLazyTools::ESGetTokens ecalClusterToolsESGetTokens_
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
void setSubClusDEta3(float s)
const edm::ESGetToken< CaloTopology, CaloTopologyRecord > ecalTopologyToken_
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
void setSubClusRawE1(float s)
std::pair< pat::IsolationKeys, edm::InputTag > IsolationLabel
PATPhotonProducer(const edm::ParameterSet &iConfig)
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > ecalGeometryToken_
void setSubClusRawE3(float s)
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
const PflowIsolationVariables & getPflowIsolationVariables() const
Get Particle Flow Isolation variables block.
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
edm::InputTag reducedBarrelRecHitCollection_
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Produces the pat::Photon.
edm::EDGetTokenT< reco::GsfElectronCollection > electronToken_