32 isolator_(iConfig.exists(
"userIsolation") ? iConfig.getParameter<edm::
ParameterSet>(
"userIsolation") : edm::
ParameterSet(), consumesCollector(),
false) ,
33 useUserData_(iConfig.exists(
"userData"))
61 addEfficiencies_ = iConfig.getParameter<
bool>(
"addEfficiencies");
62 if (addEfficiencies_) {
66 addPFClusterIso_ = iConfig.getParameter<
bool>(
"addPFClusterIso");
67 ecalPFClusterIsoT_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<
edm::InputTag>(
"ecalPFClusterIsoMap"));
68 hcalPFClusterIsoT_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<
edm::InputTag>(
"hcalPFClusterIsoMap"));
70 addPhotonID_ = iConfig.getParameter<
bool>(
"addPhotonID" );
74 photIDSrcs_.push_back(NameTag(
"", iConfig.getParameter<
edm::InputTag>(
"photonIDSource")));
79 if (!photIDSrcs_.empty()){
80 throw cms::Exception(
"Configuration") <<
"PATPhotonProducer: you can't specify both 'photonIDSource' and 'photonIDSources'\n";
85 for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
91 "PATPhotonProducer: id addPhotonID is true, you must specify either:\n" <<
92 "\tInputTag photonIDSource = <someTag>\n" <<
"or\n" <<
93 "\tPSet photonIDSources = { \n" <<
94 "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
97 photIDTokens_ =
edm::vector_transform(photIDSrcs_, [
this](NameTag
const &
tag){
return mayConsume<edm::ValueMap<Bool_t> >(tag.second);});
99 addResolutions_ = iConfig.getParameter<
bool>(
"addResolutions");
100 if (addResolutions_) {
104 if ( useUserData_ ) {
108 produces<std::vector<Photon> >();
111 readIsolationLabels(iConfig,
"isoDeposits", isoDepositLabels_, isoDepositTokens_);
113 readIsolationLabels(iConfig,
"isolationValues", isolationValueLabels_, isolationValueTokens_);
117 PATPhotonProducer::~PATPhotonProducer() {
155 std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > >genMatches(
genMatchTokens_.size());
179 std::vector<edm::Handle<edm::ValueMap<Bool_t> > > idhandles;
180 std::vector<pat::Photon::IdPair> ids;
191 std::vector<Photon> * PATPhotons =
new std::vector<Photon>();
194 unsigned int idx = itPhoton - photons->begin();
197 Photon aPhoton(photonRef);
203 std::vector<DetId> selectedCells;
204 bool barrel = itPhoton->isEB();
207 for (
reco::CaloCluster_iterator clusIt = itPhoton->superCluster()->clustersBegin(); clusIt!=itPhoton->superCluster()->clustersEnd(); ++clusIt) {
209 DetId seed = lazyTools.getMaximum(**clusIt).first;
213 selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
216 for (
const std::pair<DetId, float> &
hit : (*clusIt)->hitsAndFractions()) {
217 selectedCells.push_back(
hit.first);
223 std::sort(selectedCells.begin(),selectedCells.end());
224 std::unique(selectedCells.begin(),selectedCells.end());
238 if(photonRef->
superCluster()->seed()->hitsAndFractions().at(0).first.subdetId()==
EcalBarrel ) recHits = recHitsEBHandle.product();
245 unsigned nSelectedCells = selectedCells.
size();
246 for (
unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
248 if ( it != recHits->
end() ) {
252 selectedRecHits.
sort();
257 for(
size_t i = 0,
n = genMatches.size();
i <
n; ++
i) {
282 for (
size_t j = 0, nd = deposits.size();
j < nd; ++
j) {
286 for (
size_t j = 0;
j<isolationValues.size(); ++
j) {
293 ids[
i].second = (*idhandles[
i])[photonRef];
304 bool passelectronveto =
false;
320 recHitsEBHandle.product(),recHitsEEHandle.
product(),
369 PATPhotons->push_back(aPhoton);
376 std::auto_ptr<std::vector<Photon> > myPhotons(PATPhotons);
377 iEvent.
put(myPhotons);
386 iDesc.
setComment(
"PAT photon producer module");
402 iDesc.
add<
bool>(
"embedSuperCluster",
true)->setComment(
"embed external super cluster");
403 iDesc.
add<
bool>(
"embedSeedCluster",
true)->setComment(
"embed external seed cluster");
404 iDesc.
add<
bool>(
"embedBasicClusters",
true)->setComment(
"embed external basic clusters");
405 iDesc.
add<
bool>(
"embedPreshowerClusters",
true)->setComment(
"embed external preshower clusters");
406 iDesc.
add<
bool>(
"embedRecHits",
true)->setComment(
"embed external RecHits");
409 iDesc.
add<
bool>(
"addGenMatch",
true)->setComment(
"add MC matching");
410 iDesc.
add<
bool>(
"embedGenMatch",
false)->setComment(
"embed MC matched MC information");
411 std::vector<edm::InputTag> emptySourceVector;
414 )->
setComment(
"input with MC match information");
419 iDesc.
add<
bool>(
"addPhotonID",
true)->setComment(
"add photon ID variables");
424 )->
setComment(
"input with photon ID variables");
437 isoDepositsPSet.
addOptional<std::vector<edm::InputTag> >(
"user");
451 isolationValuesPSet.
addOptional<std::vector<edm::InputTag> >(
"user");
452 iDesc.
addOptional(
"isolationValues", isolationValuesPSet);
457 iDesc.
add(
"efficiencies", efficienciesPSet);
458 iDesc.
add<
bool>(
"addEfficiencies",
false);
467 iDesc.
add(
"userIsolation", isolationPSet);
470 )->
setComment(
"input with high level selection");
472 descriptions.
add(
"PATPhotonProducer", iDesc);
virtual 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_
T getParameter(std::string const &) const
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
const std::vector< float > & subClusRawEnergy() const
Analysis-level Photon class.
pat::PATUserDataHelper< pat::Photon > userDataHelper_
float maxSubClusDRRawEnergy() const
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
float maxSubClusDRDEta() const
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
void setSubClusDPhi3(float s)
static const HistoName names[]
reco::SuperClusterRef superCluster() const
Ref to SuperCluster.
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
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void setAllowAnything()
allow any parameter label/value pairs
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
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
edm::EDGetTokenT< edm::View< reco::Photon > > photonToken_
std::vector< EcalRecHit >::const_iterator const_iterator
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 ...
pat::helper::KinResolutionsLoader resolutionLoader_
float sigmaIEtaIEta() const
edm::EDGetTokenT< edm::ValueMap< float > > hcalPFClusterIsoT_
GreaterByEt< Photon > eTComparator_
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.
edm::InputTag reducedEndcapRecHitCollection_
bool enabled() const
'true' if this there is at least one efficiency configured
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
static void fillDescription(edm::ParameterSetDescription &iDesc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) 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_
float seedCrysIPhiOrIY() const
IsolationLabels isolationValueLabels_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
void setMaxDRDEta(float m)
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
pat::helper::EfficiencyLoader efficiencyLoader_
float maxSubClusDR() const
void setPhotonIDs(const std::vector< IdPair > &ids)
float seedCrysIEtaOrIX() const
void embedBasicClusters()
method to store the electron's basic clusters
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)
std::vector< NameTag > photIDSrcs_
void setSubClusDEta1(float s)
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
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
void addGenParticleRef(const reco::GenParticleRef &ref)
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::auto_ptr< ParameterDescriptionCases< T > > cases)
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
void setHasPixelSeed(bool flag)
T const * product() const
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
void setSubClusDEta2(float s)
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
bool hasPixelSeed() const
Bool flagging photons having a non-zero size vector of Ref to electornPixel seeds.
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
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
void setMaxDRDPhi(float m)
iterator find(key_type k)
const std::vector< float > & subClusDPhi() const
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
void setSubClusDEta3(float s)
void setSubClusRawE1(float s)
PATPhotonProducer(const edm::ParameterSet &iConfig)
void setSubClusRawE3(float s)
volatile std::atomic< bool > shutdown_flag false
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
void newEvent(const edm::Event &event, const edm::EventSetup &setup) const
To be called for each new event, reads in the EventSetup object.
edm::InputTag reducedBarrelRecHitCollection_
void setHcalPFClusterIso(float hcalPFClus)
void newEvent(const edm::Event &event) const
To be called for each new event, reads in the ValueMaps for efficiencies.
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_
void setEcalPFClusterIso(float ecalPFClus)