CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes
pat::PATElectronProducer Class Reference

Produces pat::Electron's. More...

#include "PhysicsTools/PatAlgos/interface/PATElectronProducer.h"

Inheritance diagram for pat::PATElectronProducer:
edm::EDProducer edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 PATElectronProducer (const edm::ParameterSet &iConfig)
 
virtual void produce (edm::Event &iEvent, const edm::EventSetup &iSetup) override
 
 ~PATElectronProducer ()
 
- Public Member Functions inherited from edm::EDProducer
 EDProducer ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducer ()
 
- Public Member Functions inherited from edm::ProducerBase
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription
const &)> 
registrationCallback () const
 used by the fwk to register list of products More...
 
virtual ~ProducerBase ()
 
- Public Member Functions inherited from edm::EDConsumerBase
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 
- Static Public Member Functions inherited from edm::EDProducer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 

Private Types

typedef edm::RefToBase
< reco::GsfElectron
ElectronBaseRef
 
typedef std::vector
< edm::Handle
< edm::Association
< reco::GenParticleCollection > > > 
GenAssociations
 
typedef std::vector
< edm::Handle< edm::ValueMap
< IsoDeposit > > > 
IsoDepositMaps
 
typedef std::pair
< pat::IsolationKeys,
edm::InputTag
IsolationLabel
 
typedef std::vector
< IsolationLabel
IsolationLabels
 
typedef std::vector
< edm::Handle< edm::ValueMap
< double > > > 
IsolationValueMaps
 
typedef std::pair< std::string,
edm::InputTag
NameTag
 

Private Member Functions

void embedHighLevel (pat::Electron &anElectron, reco::GsfTrackRef track, reco::TransientTrack &tt, reco::Vertex &primaryVertex, bool primaryVertexIsValid, reco::BeamSpot &beamspot, bool beamspotIsValid)
 
void fillElectron (Electron &aElectron, const ElectronBaseRef &electronRef, const reco::CandidateBaseRef &baseRef, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const bool pfId, const IsolationValueMaps &isolationValues, const IsolationValueMaps &isolationValuesNoPFId) const
 common electron filling, for both the standard and PF2PAT case More...
 
void fillElectron2 (Electron &anElectron, const reco::CandidatePtr &candPtrForIsolation, const reco::CandidatePtr &candPtrForGenMatch, const reco::CandidatePtr &candPtrForLoader, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const IsolationValueMaps &isolationValues) const
 
template<typename T >
void readIsolationLabels (const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T > > > &tokens)
 

Private Attributes

bool addEfficiencies_
 
bool addElecID_
 
bool addGenMatch_
 
bool addResolutions_
 
edm::EDGetTokenT< reco::BeamSpotbeamLineToken_
 
const CaloTopologyecalTopology_
 
pat::helper::EfficiencyLoader efficiencyLoader_
 
std::vector< NameTagelecIDSrcs_
 
std::vector< edm::EDGetTokenT
< edm::ValueMap< float > > > 
elecIDTokens_
 
edm::EDGetTokenT< edm::View
< reco::GsfElectron > > 
electronToken_
 
bool embedBasicClusters_
 
bool embedGenMatch_
 
bool embedGsfElectronCore_
 
bool embedGsfTrack_
 
bool embedHighLevelSelection_
 embed high level selection variables? More...
 
bool embedPFCandidate_
 
bool embedPflowBasicClusters_
 
bool embedPflowPreshowerClusters_
 
bool embedPflowSuperCluster_
 
bool embedPreshowerClusters_
 
bool embedRecHits_
 
bool embedSeedCluster_
 
bool embedSuperCluster_
 
bool embedTrack_
 
std::vector< edm::EDGetTokenT
< edm::Association
< reco::GenParticleCollection > > > 
genMatchTokens_
 
edm::EDGetTokenT
< reco::ConversionCollection
hConversionsToken_
 
IsolationLabels isoDepositLabels_
 
std::vector< edm::EDGetTokenT
< edm::ValueMap< IsoDeposit > > > 
isoDepositTokens_
 
IsolationLabels isolationValueLabels_
 
IsolationLabels isolationValueLabelsNoPFId_
 
std::vector< edm::EDGetTokenT
< edm::ValueMap< double > > > 
isolationValueNoPFIdTokens_
 
std::vector< edm::EDGetTokenT
< edm::ValueMap< double > > > 
isolationValueTokens_
 
pat::helper::MultiIsolator isolator_
 
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
 
edm::EDGetTokenT
< edm::ValueMap
< reco::PFCandidatePtr > > 
pfCandidateMapToken_
 
edm::EDGetTokenT
< reco::PFCandidateCollection
pfElecToken_
 
GreaterByPt< ElectronpTComparator_
 
edm::EDGetTokenT< std::vector
< reco::Vertex > > 
pvToken_
 
edm::InputTag reducedBarrelRecHitCollection_
 mva input variables More...
 
edm::EDGetTokenT
< EcalRecHitCollection
reducedBarrelRecHitCollectionToken_
 
edm::InputTag reducedEndcapRecHitCollection_
 
edm::EDGetTokenT
< EcalRecHitCollection
reducedEndcapRecHitCollectionToken_
 
pat::helper::KinResolutionsLoader resolutionLoader_
 
bool useParticleFlow_
 pflow specific More...
 
bool usePV_
 
pat::PATUserDataHelper
< pat::Electron
userDataHelper_
 
bool useUserData_
 

Additional Inherited Members

- Public Types inherited from edm::EDProducer
typedef EDProducer ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef
ProductRegistryHelper::TypeLabelList 
TypeLabelList
 
- Protected Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Produces pat::Electron's.

The PATElectronProducer produces analysis-level pat::Electron's starting from a collection of objects of reco::GsfElectron.

Author
Steven Lowette, James Lamb\
Version
Id:
PATElectronProducer.h,v 1.31 2013/02/27 23:26:56 wmtan Exp

Definition at line 54 of file PATElectronProducer.h.

Member Typedef Documentation

Definition at line 106 of file PATElectronProducer.h.

Definition at line 84 of file PATElectronProducer.h.

Definition at line 107 of file PATElectronProducer.h.

Definition at line 139 of file PATElectronProducer.h.

Definition at line 140 of file PATElectronProducer.h.

typedef std::vector< edm::Handle< edm::ValueMap<double> > > pat::PATElectronProducer::IsolationValueMaps
private

Definition at line 108 of file PATElectronProducer.h.

typedef std::pair<std::string, edm::InputTag> pat::PATElectronProducer::NameTag
private

Definition at line 150 of file PATElectronProducer.h.

Constructor & Destructor Documentation

PATElectronProducer::PATElectronProducer ( const edm::ParameterSet iConfig)
explicit

Definition at line 50 of file PATElectronProducer.cc.

References addGenMatch_, edm::EDConsumerBase::consumes(), electronToken_, embedBasicClusters_, embedGenMatch_, embedGsfElectronCore_, embedGsfTrack_, embedPFCandidate_, embedPflowBasicClusters_, embedPflowPreshowerClusters_, embedPflowSuperCluster_, embedPreshowerClusters_, embedRecHits_, embedSeedCluster_, embedSuperCluster_, embedTrack_, edm::ParameterSet::existsAs(), genMatchTokens_, edm::ParameterSet::getParameter(), hConversionsToken_, pfCandidateMapToken_, pfElecToken_, reducedBarrelRecHitCollection_, reducedBarrelRecHitCollectionToken_, reducedEndcapRecHitCollection_, reducedEndcapRecHitCollectionToken_, GlobalPosition_Frontier_DevDB_cff::tag, useParticleFlow_, and edm::vector_transform().

50  :
51  isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
52  useUserData_(iConfig.exists("userData"))
53 {
54  // general configurables
55  electronToken_ = consumes<edm::View<reco::GsfElectron> >(iConfig.getParameter<edm::InputTag>( "electronSource" ));
56  hConversionsToken_ = consumes<reco::ConversionCollection>(edm::InputTag("allConversions"));
57  embedGsfElectronCore_ = iConfig.getParameter<bool>( "embedGsfElectronCore" );
58  embedGsfTrack_ = iConfig.getParameter<bool>( "embedGsfTrack" );
59  embedSuperCluster_ = iConfig.getParameter<bool> ( "embedSuperCluster" );
60  embedPflowSuperCluster_ = iConfig.getParameter<bool> ( "embedPflowSuperCluster" );
61  embedSeedCluster_ = iConfig.getParameter<bool>( "embedSeedCluster" );
62  embedBasicClusters_ = iConfig.getParameter<bool>( "embedBasicClusters" );
63  embedPreshowerClusters_ = iConfig.getParameter<bool>( "embedPreshowerClusters" );
64  embedPflowBasicClusters_ = iConfig.getParameter<bool>( "embedPflowBasicClusters" );
65  embedPflowPreshowerClusters_ = iConfig.getParameter<bool>( "embedPflowPreshowerClusters" );
66  embedTrack_ = iConfig.getParameter<bool>( "embedTrack" );
67  embedRecHits_ = iConfig.getParameter<bool>( "embedRecHits" );
68  // pflow configurables
69  pfElecToken_ = consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>( "pfElectronSource" ));
70  pfCandidateMapToken_ = mayConsume<edm::ValueMap<reco::PFCandidatePtr> >(iConfig.getParameter<edm::InputTag>( "pfCandidateMap" ));
71  useParticleFlow_ = iConfig.getParameter<bool>( "useParticleFlow" );
72  embedPFCandidate_ = iConfig.getParameter<bool>( "embedPFCandidate" );
73  // mva input variables
74  reducedBarrelRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection");
75  reducedBarrelRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedBarrelRecHitCollection_);
76  reducedEndcapRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection");
77  reducedEndcapRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedEndcapRecHitCollection_);
78  // MC matching configurables (scheduled mode)
79  addGenMatch_ = iConfig.getParameter<bool>( "addGenMatch" );
80  if (addGenMatch_) {
81  embedGenMatch_ = iConfig.getParameter<bool>( "embedGenMatch" );
82  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
84  }
85  else {
86  genMatchTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" ), [this](edm::InputTag const & tag){return consumes<edm::Association<reco::GenParticleCollection> >(tag);});
87  }
88  }
89  // resolution configurables
90  addResolutions_ = iConfig.getParameter<bool>( "addResolutions" );
91  if (addResolutions_) {
93  }
94  // electron ID configurables
95  addElecID_ = iConfig.getParameter<bool>( "addElectronID" );
96  if (addElecID_) {
97  // it might be a single electron ID
98  if (iConfig.existsAs<edm::InputTag>("electronIDSource")) {
99  elecIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("electronIDSource")));
100  }
101  // or there might be many of them
102  if (iConfig.existsAs<edm::ParameterSet>("electronIDSources")) {
103  // please don't configure me twice
104  if (!elecIDSrcs_.empty()){
105  throw cms::Exception("Configuration") << "PATElectronProducer: you can't specify both 'electronIDSource' and 'electronIDSources'\n";
106  }
107  // read the different electron ID names
108  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("electronIDSources");
109  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
110  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
111  elecIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
112  }
113  }
114  // but in any case at least once
115  if (elecIDSrcs_.empty()){
116  throw cms::Exception("Configuration") <<
117  "PATElectronProducer: id addElectronID is true, you must specify either:\n" <<
118  "\tInputTag electronIDSource = <someTag>\n" << "or\n" <<
119  "\tPSet electronIDSources = { \n" <<
120  "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
121  "\t}\n";
122  }
123  }
124  elecIDTokens_ = edm::vector_transform(elecIDSrcs_, [this](NameTag const & tag){return mayConsume<edm::ValueMap<float> >(tag.second);});
125  // construct resolution calculator
126 
127  // // IsoDeposit configurables
128  // if (iConfig.exists("isoDeposits")) {
129  // edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
130  // if (depconf.exists("tracker")) isoDepositLabels_.push_back(std::make_pair(TrackerIso, depconf.getParameter<edm::InputTag>("tracker")));
131  // if (depconf.exists("ecal")) isoDepositLabels_.push_back(std::make_pair(ECalIso, depconf.getParameter<edm::InputTag>("ecal")));
132  // if (depconf.exists("hcal")) isoDepositLabels_.push_back(std::make_pair(HCalIso, depconf.getParameter<edm::InputTag>("hcal")));
133 
134 
135  // if (depconf.exists("user")) {
136  // std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
137  // std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
138  // int key = UserBaseIso;
139  // for ( ; it != ed; ++it, ++key) {
140  // isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
141  // }
142  // }
143  // }
144  // isoDepositTokens_ = edm::vector_transform(isoDepositLabels_, [this](std::pair<IsolationKeys,edm::InputTag> const & label){return consumes<edm::ValueMap<IsoDeposit> >(label.second);});
145 
146  // read isoDeposit labels, for direct embedding
147  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
148  // read isolation value labels, for direct embedding
150  // read isolation value labels for non PF identified electron, for direct embedding
152  // Efficiency configurables
153  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
154  if (addEfficiencies_) {
156  }
157  // Check to see if the user wants to add user data
158  if ( useUserData_ ) {
160  }
161  // embed high level selection variables?
162  embedHighLevelSelection_ = iConfig.getParameter<bool>("embedHighLevelSelection");
163  beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"));
164  if ( embedHighLevelSelection_ ) {
165  usePV_ = iConfig.getParameter<bool>("usePV");
166  pvToken_ = consumes<std::vector<reco::Vertex> >(iConfig.getParameter<edm::InputTag>("pvSrc"));
167  }
168  // produces vector of muons
169  produces<std::vector<Electron> >();
170  }
T getParameter(std::string const &) const
Assists in assimilating all pat::UserData into pat objects.
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
static const HistoName names[]
edm::EDGetTokenT< edm::View< reco::GsfElectron > > electronToken_
bool exists(std::string const &parameterName) const
checks if a parameter exists
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 >
Definition: transform.h:11
std::vector< edm::EDGetTokenT< edm::ValueMap< float > > > elecIDTokens_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:192
pat::helper::MultiIsolator isolator_
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
edm::InputTag reducedEndcapRecHitCollection_
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
edm::InputTag reducedBarrelRecHitCollection_
mva input variables
edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
bool embedHighLevelSelection_
embed high level selection variables?
std::pair< std::string, edm::InputTag > NameTag
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueNoPFIdTokens_
pat::helper::EfficiencyLoader efficiencyLoader_
pat::PATUserDataHelper< pat::Electron > userDataHelper_
bool useParticleFlow_
pflow specific
IsolationLabels isolationValueLabelsNoPFId_
edm::EDGetTokenT< edm::ValueMap< reco::PFCandidatePtr > > pfCandidateMapToken_
IsolationLabels isolationValueLabels_
pat::helper::KinResolutionsLoader resolutionLoader_
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T > > > &tokens)
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
edm::EDGetTokenT< reco::PFCandidateCollection > pfElecToken_
edm::EDGetTokenT< std::vector< reco::Vertex > > pvToken_
std::vector< NameTag > elecIDSrcs_
PATElectronProducer::~PATElectronProducer ( )

Definition at line 173 of file PATElectronProducer.cc.

174 {
175 }

Member Function Documentation

void PATElectronProducer::embedHighLevel ( pat::Electron anElectron,
reco::GsfTrackRef  track,
reco::TransientTrack tt,
reco::Vertex primaryVertex,
bool  primaryVertexIsValid,
reco::BeamSpot beamspot,
bool  beamspotIsValid 
)
private

Definition at line 1021 of file PATElectronProducer.cc.

References pat::Electron::BS2D, pat::Electron::BS3D, reco::BeamSpot::covariance3D(), reco::BeamSpot::position(), pat::Electron::PV2D, pat::Electron::PV3D, query::result, pat::Electron::setDB(), IPTools::signedImpactParameter3D(), and IPTools::signedTransverseImpactParameter().

Referenced by produce().

1029 {
1030  // Correct to PV
1031 
1032  // PV2D
1033  std::pair<bool,Measurement1D> result =
1035  GlobalVector(track->px(),
1036  track->py(),
1037  track->pz()),
1038  primaryVertex);
1039  double d0_corr = result.second.value();
1040  double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1041  anElectron.setDB( d0_corr, d0_err, pat::Electron::PV2D);
1042 
1043 
1044  // PV3D
1045  result =
1047  GlobalVector(track->px(),
1048  track->py(),
1049  track->pz()),
1050  primaryVertex);
1051  d0_corr = result.second.value();
1052  d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1053  anElectron.setDB( d0_corr, d0_err, pat::Electron::PV3D);
1054 
1055 
1056  // Correct to beam spot
1057  // make a fake vertex out of beam spot
1058  reco::Vertex vBeamspot(beamspot.position(), beamspot.covariance3D());
1059 
1060  // BS2D
1061  result =
1063  GlobalVector(track->px(),
1064  track->py(),
1065  track->pz()),
1066  vBeamspot);
1067  d0_corr = result.second.value();
1068  d0_err = beamspotIsValid ? result.second.error() : -1.0;
1069  anElectron.setDB( d0_corr, d0_err, pat::Electron::BS2D);
1070 
1071  // BS3D
1072  result =
1074  GlobalVector(track->px(),
1075  track->py(),
1076  track->pz()),
1077  vBeamspot);
1078  d0_corr = result.second.value();
1079  d0_err = beamspotIsValid ? result.second.error() : -1.0;
1080  anElectron.setDB( d0_corr, d0_err, pat::Electron::BS3D);
1081 }
Covariance3DMatrix covariance3D() const
return only 3D position covariance matrix
Definition: BeamSpot.h:118
void setDB(double dB, double edB, IpType type=None)
Set impact parameter of a certain type and its uncertainty.
Definition: Electron.cc:460
std::pair< bool, Measurement1D > signedTransverseImpactParameter(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:50
std::pair< bool, Measurement1D > signedImpactParameter3D(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:71
tuple result
Definition: query.py:137
const Point & position() const
position
Definition: BeamSpot.h:62
Global3DVector GlobalVector
Definition: GlobalVector.h:10
void PATElectronProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 895 of file PATElectronProducer.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), edm::ParameterSetDescription::addNode(), edm::ParameterSetDescription::addOptional(), pat::helper::KinResolutionsLoader::fillDescription(), pat::PATUserDataHelper< ObjectType >::fillDescription(), edm::ParameterSetDescription::setAllowAnything(), edm::ParameterSetDescription::setComment(), and edm::ParameterDescriptionNode::setComment().

896 {
898  iDesc.setComment("PAT electron producer module");
899 
900  // input source
901  iDesc.add<edm::InputTag>("pfCandidateMap", edm::InputTag("no default"))->setComment("input collection");
902  iDesc.add<edm::InputTag>("electronSource", edm::InputTag("no default"))->setComment("input collection");
903 
904  // embedding
905  iDesc.add<bool>("embedGsfElectronCore", true)->setComment("embed external gsf electron core");
906  iDesc.add<bool>("embedGsfTrack", true)->setComment("embed external gsf track");
907  iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
908  iDesc.add<bool>("embedPflowSuperCluster", true)->setComment("embed external super cluster");
909  iDesc.add<bool>("embedSeedCluster", true)->setComment("embed external seed cluster");
910  iDesc.add<bool>("embedBasicClusters", true)->setComment("embed external basic clusters");
911  iDesc.add<bool>("embedPreshowerClusters", true)->setComment("embed external preshower clusters");
912  iDesc.add<bool>("embedPflowBasicClusters", true)->setComment("embed external pflow basic clusters");
913  iDesc.add<bool>("embedPflowPreshowerClusters", true)->setComment("embed external pflow preshower clusters");
914  iDesc.add<bool>("embedTrack", false)->setComment("embed external track");
915  iDesc.add<bool>("embedRecHits", true)->setComment("embed external RecHits");
916 
917  // pf specific parameters
918  iDesc.add<edm::InputTag>("pfElectronSource", edm::InputTag("pfElectrons"))->setComment("particle flow input collection");
919  iDesc.add<bool>("useParticleFlow", false)->setComment("whether to use particle flow or not");
920  iDesc.add<bool>("embedPFCandidate", false)->setComment("embed external particle flow object");
921 
922  // MC matching configurables
923  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
924  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
925  std::vector<edm::InputTag> emptySourceVector;
926  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
927  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
928  )->setComment("input with MC match information");
929 
930  // electron ID configurables
931  iDesc.add<bool>("addElectronID",true)->setComment("add electron ID variables");
932  edm::ParameterSetDescription electronIDSourcesPSet;
933  electronIDSourcesPSet.setAllowAnything();
934  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("electronIDSource", edm::InputTag(), true) xor
935  edm::ParameterDescription<edm::ParameterSetDescription>("electronIDSources", electronIDSourcesPSet, true)
936  )->setComment("input with electron ID variables");
937 
938 
939  // IsoDeposit configurables
940  edm::ParameterSetDescription isoDepositsPSet;
941  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
942  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
943  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
944  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
945  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
946  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
947  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
948  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
949  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
950  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
951  iDesc.addOptional("isoDeposits", isoDepositsPSet);
952 
953  // isolation values configurables
954  edm::ParameterSetDescription isolationValuesPSet;
955  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
956  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
957  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
958  isolationValuesPSet.addOptional<edm::InputTag>("pfAllParticles");
959  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
960  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
961  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
962  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
963  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
964  isolationValuesPSet.addOptional<std::vector<edm::InputTag> >("user");
965  iDesc.addOptional("isolationValues", isolationValuesPSet);
966 
967  // isolation values configurables
968  edm::ParameterSetDescription isolationValuesNoPFIdPSet;
969  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("tracker");
970  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("ecal");
971  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("hcal");
972  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfAllParticles");
973  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfChargedHadrons");
974  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfChargedAll");
975  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
976  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
977  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfPhotons");
978  isolationValuesNoPFIdPSet.addOptional<std::vector<edm::InputTag> >("user");
979  iDesc.addOptional("isolationValuesNoPFId", isolationValuesNoPFIdPSet);
980 
981  // Efficiency configurables
982  edm::ParameterSetDescription efficienciesPSet;
983  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
984  iDesc.add("efficiencies", efficienciesPSet);
985  iDesc.add<bool>("addEfficiencies", false);
986 
987  // Check to see if the user wants to add user data
988  edm::ParameterSetDescription userDataPSet;
990  iDesc.addOptional("userData", userDataPSet);
991 
992  // electron shapes
993  iDesc.add<bool>("addElectronShapes", true);
994  iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
995  iDesc.add<edm::InputTag>("reducedEndcapRecHitCollection", edm::InputTag("reducedEcalRecHitsEE"));
996 
997  edm::ParameterSetDescription isolationPSet;
998  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
999  iDesc.add("userIsolation", isolationPSet);
1000 
1001  // Resolution configurables
1003 
1004  iDesc.add<bool>("embedHighLevelSelection", true)->setComment("embed high level selection");
1005  edm::ParameterSetDescription highLevelPSet;
1006  highLevelPSet.setAllowAnything();
1007  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true)
1008  )->setComment("input with high level selection");
1010  )->setComment("input with high level selection");
1011  iDesc.addNode( edm::ParameterDescription<bool>("usePV", bool(), true)
1012  )->setComment("input with high level selection, use primary vertex (true) or beam line (false)");
1013 
1014  descriptions.add("PATElectronProducer", iDesc);
1015 
1016 }
void setComment(std::string const &value)
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
void setAllowAnything()
allow any parameter label/value pairs
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
static void fillDescription(edm::ParameterSetDescription &iDesc)
void setComment(std::string const &value)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void PATElectronProducer::fillElectron ( Electron aElectron,
const ElectronBaseRef electronRef,
const reco::CandidateBaseRef baseRef,
const GenAssociations genMatches,
const IsoDepositMaps deposits,
const bool  pfId,
const IsolationValueMaps isolationValues,
const IsolationValueMaps isolationValuesNoPFId 
) const
private

common electron filling, for both the standard and PF2PAT case

Definition at line 714 of file PATElectronProducer.cc.

References addGenMatch_, pat::PATObject< ObjectType >::addGenParticleRef(), efficiencyLoader_, pat::Electron::embedBasicClusters(), embedBasicClusters_, embedGenMatch_, pat::PATObject< ObjectType >::embedGenParticle(), pat::Electron::embedGsfElectronCore(), embedGsfElectronCore_, pat::Electron::embedGsfTrack(), embedGsfTrack_, pat::Electron::embedPflowBasicClusters(), embedPflowBasicClusters_, pat::Electron::embedPflowPreshowerClusters(), embedPflowPreshowerClusters_, pat::Electron::embedPflowSuperCluster(), embedPflowSuperCluster_, pat::Electron::embedPreshowerClusters(), embedPreshowerClusters_, pat::Electron::embedSeedCluster(), embedSeedCluster_, pat::Electron::embedSuperCluster(), embedSuperCluster_, pat::Electron::embedTrack(), embedTrack_, pat::helper::EfficiencyLoader::enabled(), pat::helper::KinResolutionsLoader::enabled(), first, i, edm::Ref< C, T, F >::isNull(), isoDepositLabels_, isolationValueLabels_, isolationValueLabelsNoPFId_, j, n, pat::Electron::pfCandidateRef(), resolutionLoader_, pat::helper::EfficiencyLoader::setEfficiencies(), pat::Lepton< LeptonType >::setIsoDeposit(), pat::Lepton< LeptonType >::setIsolation(), pat::helper::KinResolutionsLoader::setResolutions(), source, and useParticleFlow_.

Referenced by produce().

722  {
723 
724  //COLIN: might want to use the PFCandidate 4-mom. Which one is in use now?
725  // if (useParticleFlow_)
726  // aMuon.setP4( aMuon.pfCandidateRef()->p4() );
727 
728  //COLIN:
729  //In the embedding case, the reference cannot be used to look into a value map.
730  //therefore, one has to had the PFCandidateRef to this function, which becomes a bit
731  //too much specific.
732 
733  // in fact, this function needs a baseref or ptr for genmatch
734  // and a baseref or ptr for isodeposits and isolationvalues.
735  // baseref is not needed
736  // the ptrForIsolation and ptrForMatching should be defined upstream.
737 
738  // is the concrete elecRef needed for the efficiency loader? what is this loader?
739  // how can we make it compatible with the particle flow electrons?
740 
741  if (embedGsfElectronCore_) anElectron.embedGsfElectronCore();
742  if (embedGsfTrack_) anElectron.embedGsfTrack();
743  if (embedSuperCluster_) anElectron.embedSuperCluster();
744  if (embedPflowSuperCluster_) anElectron.embedPflowSuperCluster();
745  if (embedSeedCluster_) anElectron.embedSeedCluster();
746  if (embedBasicClusters_) anElectron.embedBasicClusters();
747  if (embedPreshowerClusters_) anElectron.embedPreshowerClusters();
748  if (embedPflowBasicClusters_ ) anElectron.embedPflowBasicClusters();
749  if (embedPflowPreshowerClusters_ ) anElectron.embedPflowPreshowerClusters();
750  if (embedTrack_) anElectron.embedTrack();
751 
752  // store the match to the generated final state muons
753  if (addGenMatch_) {
754  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
755  if(useParticleFlow_) {
756  reco::GenParticleRef genElectron = (*genMatches[i])[anElectron.pfCandidateRef()];
757  anElectron.addGenParticleRef(genElectron);
758  }
759  else {
760  reco::GenParticleRef genElectron = (*genMatches[i])[elecRef];
761  anElectron.addGenParticleRef(genElectron);
762  }
763  }
764  if (embedGenMatch_) anElectron.embedGenParticle();
765  }
766 
767  if (efficiencyLoader_.enabled()) {
768  efficiencyLoader_.setEfficiencies( anElectron, elecRef );
769  }
770 
771  if (resolutionLoader_.enabled()) {
772  resolutionLoader_.setResolutions(anElectron);
773  }
774 
775  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
776  if(useParticleFlow_) {
777 
778  reco::PFCandidateRef pfcandref = anElectron.pfCandidateRef();
779  assert(!pfcandref.isNull());
780  reco::CandidatePtr source = pfcandref->sourceCandidatePtr(0);
781  anElectron.setIsoDeposit(isoDepositLabels_[j].first,
782  (*deposits[j])[source]);
783  }
784  else
785  anElectron.setIsoDeposit(isoDepositLabels_[j].first,
786  (*deposits[j])[elecRef]);
787  }
788 
789  for (size_t j = 0; j<isolationValues.size(); ++j) {
790  if(useParticleFlow_) {
791  reco::CandidatePtr source = anElectron.pfCandidateRef()->sourceCandidatePtr(0);
792  anElectron.setIsolation(isolationValueLabels_[j].first,
793  (*isolationValues[j])[source]);
794  }
795  else
796  if(pfId){
797  anElectron.setIsolation(isolationValueLabels_[j].first,(*isolationValues[j])[elecRef]);
798  }
799  }
800 
801  //for electrons not identified as PF electrons
802  for (size_t j = 0; j<isolationValuesNoPFId.size(); ++j) {
803  if( !pfId) {
804  anElectron.setIsolation(isolationValueLabelsNoPFId_[j].first,(*isolationValuesNoPFId[j])[elecRef]);
805  }
806  }
807 
808 }
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
int i
Definition: DBlmapReader.cc:9
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
bool isNull() const
Checks for null.
Definition: Ref.h:247
int j
Definition: DBlmapReader.cc:9
bool first
Definition: L1TdeRCT.cc:79
pat::helper::EfficiencyLoader efficiencyLoader_
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
bool useParticleFlow_
pflow specific
IsolationLabels isolationValueLabelsNoPFId_
IsolationLabels isolationValueLabels_
pat::helper::KinResolutionsLoader resolutionLoader_
static std::string const source
Definition: EdmProvDump.cc:43
void PATElectronProducer::fillElectron2 ( Electron anElectron,
const reco::CandidatePtr candPtrForIsolation,
const reco::CandidatePtr candPtrForGenMatch,
const reco::CandidatePtr candPtrForLoader,
const GenAssociations genMatches,
const IsoDepositMaps deposits,
const IsolationValueMaps isolationValues 
) const
private

Definition at line 810 of file PATElectronProducer.cc.

References addGenMatch_, pat::PATObject< ObjectType >::addGenParticleRef(), edm::contains(), pat::EcalIso, efficiencyLoader_, pat::Electron::embedBasicClusters(), embedBasicClusters_, embedGenMatch_, pat::PATObject< ObjectType >::embedGenParticle(), pat::Electron::embedGsfElectronCore(), embedGsfElectronCore_, pat::Electron::embedGsfTrack(), embedGsfTrack_, pat::Electron::embedPflowBasicClusters(), embedPflowBasicClusters_, pat::Electron::embedPflowPreshowerClusters(), embedPflowPreshowerClusters_, pat::Electron::embedPflowSuperCluster(), embedPflowSuperCluster_, pat::Electron::embedPreshowerClusters(), embedPreshowerClusters_, pat::Electron::embedSeedCluster(), embedSeedCluster_, pat::Electron::embedSuperCluster(), embedSuperCluster_, pat::Electron::embedTrack(), embedTrack_, pat::helper::EfficiencyLoader::enabled(), pat::helper::KinResolutionsLoader::enabled(), first, pat::HcalIso, i, edm::Ptr< T >::id(), isoDepositLabels_, isolationValueLabels_, j, n, reco::GsfElectron::p4(), pat::Electron::pfCandidateRef(), resolutionLoader_, pat::Electron::setEcalDrivenMomentum(), pat::helper::EfficiencyLoader::setEfficiencies(), pat::Lepton< LeptonType >::setIsoDeposit(), pat::Lepton< LeptonType >::setIsolation(), reco::GsfElectron::setP4(), pat::helper::KinResolutionsLoader::setResolutions(), and pat::TrackIso.

Referenced by produce().

816  {
817 
818  //COLIN/Florian: use the PFCandidate 4-mom.
819  anElectron.setEcalDrivenMomentum(anElectron.p4()) ;
820  anElectron.setP4( anElectron.pfCandidateRef()->p4() );
821 
822 
823  // is the concrete elecRef needed for the efficiency loader? what is this loader?
824  // how can we make it compatible with the particle flow electrons?
825 
827  if (embedGsfTrack_) anElectron.embedGsfTrack();
828  if (embedSuperCluster_) anElectron.embedSuperCluster();
830  if (embedSeedCluster_) anElectron.embedSeedCluster();
831  if (embedBasicClusters_) anElectron.embedBasicClusters();
835  if (embedTrack_) anElectron.embedTrack();
836 
837  // store the match to the generated final state muons
838 
839  if (addGenMatch_) {
840  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
841  reco::GenParticleRef genElectron = (*genMatches[i])[candPtrForGenMatch];
842  anElectron.addGenParticleRef(genElectron);
843  }
844  if (embedGenMatch_) anElectron.embedGenParticle();
845  }
846 
847  //COLIN what's this? does it have to be GsfElectron specific?
848  if (efficiencyLoader_.enabled()) {
849  efficiencyLoader_.setEfficiencies( anElectron, candPtrForLoader );
850  }
851 
852  if (resolutionLoader_.enabled()) {
853  resolutionLoader_.setResolutions(anElectron);
854  }
855 
856  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
860  deposits[j]->contains(candPtrForGenMatch.id())) {
862  (*deposits[j])[candPtrForGenMatch]);
863  }
864  else if (deposits[j]->contains(candPtrForIsolation.id())) {
865  anElectron.setIsoDeposit(isoDepositLabels_[j].first,
866  (*deposits[j])[candPtrForIsolation]);
867  }
868  else {
869  anElectron.setIsoDeposit(isoDepositLabels_[j].first,
870  (*deposits[j])[candPtrForIsolation->sourceCandidatePtr(0)]);
871  }
872  }
873 
874  for (size_t j = 0; j<isolationValues.size(); ++j) {
875  if( isolationValueLabels_[j].first==pat::TrackIso ||
878  isolationValues[j]->contains(candPtrForGenMatch.id())) {
879  anElectron.setIsolation(isolationValueLabels_[j].first,
880  (*isolationValues[j])[candPtrForGenMatch]);
881  }
882  else if (isolationValues[j]->contains(candPtrForIsolation.id())) {
883  anElectron.setIsolation(isolationValueLabels_[j].first,
884  (*isolationValues[j])[candPtrForIsolation]);
885  }
886  else {
887  anElectron.setIsolation(isolationValueLabels_[j].first,
888  (*isolationValues[j])[candPtrForIsolation->sourceCandidatePtr(0)]);
889  }
890  }
891 }
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
int i
Definition: DBlmapReader.cc:9
void setP4(P4Kind kind, const LorentzVector &p4, float p4Error, bool setCandidate)
Definition: GsfElectron.cc:178
void embedTrack()
method to store the electron&#39;s Track internally
Definition: Electron.cc:314
void embedSeedCluster()
method to store the electron&#39;s seedcluster internally
Definition: Electron.cc:257
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:98
void embedGsfElectronCore()
method to store the electron&#39;s core internally
Definition: Electron.cc:220
bool contains(EventRange const &lh, EventID const &rh)
Definition: EventRange.cc:38
void embedPflowBasicClusters()
method to store the electron&#39;s pflow basic clusters
Definition: Electron.cc:290
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:204
void embedSuperCluster()
method to store the electron&#39;s SuperCluster internally
Definition: Electron.cc:239
void setEcalDrivenMomentum(const Candidate::LorentzVector &mom)
Definition: Electron.h:188
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
void embedPreshowerClusters()
method to store the electron&#39;s preshower clusters
Definition: Electron.cc:278
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
Definition: Lepton.h:175
void embedBasicClusters()
method to store the electron&#39;s basic clusters
Definition: Electron.cc:266
void embedGenParticle()
Definition: PATObject.h:677
ProductID id() const
Accessor for product ID.
Definition: Ptr.h:164
int j
Definition: DBlmapReader.cc:9
reco::PFCandidateRef pfCandidateRef() const
reference to the source PFCandidates; null if this has been built from a standard electron ...
Definition: Electron.cc:368
bool first
Definition: L1TdeRCT.cc:79
void embedGsfTrack()
method to store the electron&#39;s GsfTrack internally
Definition: Electron.cc:229
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:661
pat::helper::EfficiencyLoader efficiencyLoader_
void embedPflowSuperCluster()
method to store the electron&#39;s PflowSuperCluster internally
Definition: Electron.cc:248
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
IsolationLabels isolationValueLabels_
pat::helper::KinResolutionsLoader resolutionLoader_
void embedPflowPreshowerClusters()
method to store the electron&#39;s pflow preshower clusters
Definition: Electron.cc:302
void PATElectronProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overridevirtual

Implements edm::EDProducer.

Definition at line 178 of file PATElectronProducer.cc.

References IPTools::absoluteImpactParameter3D(), IPTools::absoluteTransverseImpactParameter(), addElecID_, addGenMatch_, Reference_intrackfit_cff::barrel, beamLineToken_, SiPixelRawToDigiRegional_cfi::beamSpot, pat::helper::MultiIsolator::beginEvent(), reco::PFCandidate::e, EcalClusterLazyTools::e3x3(), DetId::Ecal, EcalBarrel, EcalEndcap, ecalTopology_, efficiencyLoader_, elecIDSrcs_, elecIDTokens_, HI_PhotonSkim_cff::electrons, electronToken_, embedBasicClusters_, embedGenMatch_, embedHighLevel(), embedHighLevelSelection_, pat::Electron::embedPFCandidate(), embedPFCandidate_, embedPflowBasicClusters_, pat::Electron::embedRecHits(), embedRecHits_, pat::helper::EfficiencyLoader::enabled(), pat::helper::KinResolutionsLoader::enabled(), pat::helper::MultiIsolator::enabled(), edm::SortedCollection< T, SORT >::end(), pat::helper::MultiIsolator::endEvent(), pat::helper::MultiIsolator::fill(), fillElectron(), fillElectron2(), edm::SortedCollection< T, SORT >::find(), first, genMatchTokens_, edm::EventSetup::get(), edm::Event::getByToken(), EcalClusterLazyTools::getMaximum(), CaloTopology::getSubdetectorTopology(), CaloSubdetectorTopology::getWindow(), ConversionTools::hasMatchedConversion(), hConversionsToken_, i, customizeTrackingMonitorSeedNumber::idx, getHLTprescales::index, edm::Ref< C, T, F >::isAvailable(), edm::Ptr< T >::isNonnull(), edm::Ref< C, T, F >::isNonnull(), edm::isNotFinite(), isoDepositLabels_, isoDepositTokens_, isolationValueNoPFIdTokens_, isolationValueTokens_, isolator_, isolatorTmpStorage_, edm::EventBase::isRealData(), edm::HandleBase::isValid(), j, EcalClusterLazyTools::localCovariances(), reco::Matched, pat::helper::EfficiencyLoader::newEvent(), pat::helper::KinResolutionsLoader::newEvent(), electronProducer_cfi::patElectrons, pfCandidateMapToken_, pfElecToken_, pfElectrons_cff::pfElectrons, pTComparator_, edm::SortedCollection< T, SORT >::push_back(), edm::Event::put(), pvToken_, reducedBarrelRecHitCollection_, reducedBarrelRecHitCollectionToken_, reducedEndcapRecHitCollection_, reducedEndcapRecHitCollectionToken_, resolutionLoader_, query::result, pat::Electron::setDB(), pat::Electron::setElectronIDs(), pat::Lepton< LeptonType >::setIsoDeposit(), pat::Lepton< LeptonType >::setIsolation(), pat::Electron::setIsPF(), pat::Electron::setMvaVariables(), pat::Electron::setPassConversionVeto(), pat::Electron::setPFCandidateRef(), edm::SortedCollection< T, SORT >::size(), edm::SortedCollection< T, SORT >::sort(), python.multivaluedict::sort(), mathSSE::sqrt(), groupFilesInBlocks::tt, useParticleFlow_, usePV_, userDataHelper_, useUserData_, reco::BeamSpot::x0(), reco::BeamSpot::y0(), and reco::BeamSpot::z0().

179 {
180  // switch off embedding (in unschedules mode)
181  if (iEvent.isRealData()){
182  addGenMatch_ = false;
183  embedGenMatch_ = false;
184  }
185 
186  edm::ESHandle<CaloTopology> theCaloTopology;
187  iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
188  ecalTopology_ = & (*theCaloTopology);
189 
190  // Get the collection of electrons from the event
192  iEvent.getByToken(electronToken_, electrons);
193 
194  // for additional mva variables
195  edm::InputTag reducedEBRecHitCollection(string("reducedEcalRecHitsEB"));
196  edm::InputTag reducedEERecHitCollection(string("reducedEcalRecHitsEE"));
197  //EcalClusterLazyTools lazyTools(iEvent, iSetup, reducedEBRecHitCollection, reducedEERecHitCollection);
199 
200  // for conversion veto selection
202  iEvent.getByToken(hConversionsToken_, hConversions);
203 
204  // Get the ESHandle for the transient track builder, if needed for
205  // high level selection embedding
207 
208  if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
209 
211  if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
212 
213  IsoDepositMaps deposits(isoDepositTokens_.size());
214  for (size_t j = 0, nd = isoDepositTokens_.size(); j < nd; ++j) {
215  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
216  }
217 
218  IsolationValueMaps isolationValues(isolationValueTokens_.size());
219  for (size_t j = 0; j<isolationValueTokens_.size(); ++j) {
220  iEvent.getByToken(isolationValueTokens_[j], isolationValues[j]);
221  }
222 
223  IsolationValueMaps isolationValuesNoPFId(isolationValueNoPFIdTokens_.size());
224  for (size_t j = 0; j<isolationValueNoPFIdTokens_.size(); ++j) {
225  iEvent.getByToken(isolationValueNoPFIdTokens_[j], isolationValuesNoPFId[j]);
226  }
227 
228  // prepare the MC matching
229  GenAssociations genMatches(genMatchTokens_.size());
230  if (addGenMatch_) {
231  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
232  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
233  }
234  }
235 
236  // prepare ID extraction
237  std::vector<edm::Handle<edm::ValueMap<float> > > idhandles;
238  std::vector<pat::Electron::IdPair> ids;
239  if (addElecID_) {
240  idhandles.resize(elecIDSrcs_.size());
241  ids.resize(elecIDSrcs_.size());
242  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
243  iEvent.getByToken(elecIDTokens_[i], idhandles[i]);
244  ids[i].first = elecIDSrcs_[i].first;
245  }
246  }
247 
248 
249  // prepare the high level selection:
250  // needs beamline
251  reco::TrackBase::Point beamPoint(0,0,0);
252  reco::Vertex primaryVertex;
254  bool beamSpotIsValid = false;
255  bool primaryVertexIsValid = false;
256 
257  // Get the beamspot
258  edm::Handle<reco::BeamSpot> beamSpotHandle;
259  iEvent.getByToken(beamLineToken_, beamSpotHandle);
260 
261  if ( embedHighLevelSelection_ ) {
262  // Get the primary vertex
264  iEvent.getByToken( pvToken_, pvHandle );
265 
266  // This is needed by the IPTools methods from the tracking group
267  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", trackBuilder);
268 
269  if ( ! usePV_ ) {
270 
271  if ( beamSpotHandle.isValid() ){
272  beamSpot = *beamSpotHandle;
273  beamSpotIsValid = true;
274  } else{
275  edm::LogError("DataNotAvailable")
276  << "No beam spot available from EventSetup, not adding high level selection \n";
277  }
278 
279  double x0 = beamSpot.x0();
280  double y0 = beamSpot.y0();
281  double z0 = beamSpot.z0();
282 
283  beamPoint = reco::TrackBase::Point ( x0, y0, z0 );
284  } else {
285  if ( pvHandle.isValid() && !pvHandle->empty() ) {
286  primaryVertex = pvHandle->at(0);
287  primaryVertexIsValid = true;
288  } else {
289  edm::LogError("DataNotAvailable")
290  << "No primary vertex available from EventSetup, not adding high level selection \n";
291  }
292  }
293  }
294 
295  std::vector<Electron> * patElectrons = new std::vector<Electron>();
296 
297  if( useParticleFlow_ ) {
299  iEvent.getByToken(pfElecToken_, pfElectrons);
300  unsigned index=0;
301 
302  for( reco::PFCandidateConstIterator i = pfElectrons->begin();
303  i != pfElectrons->end(); ++i, ++index) {
304 
305  reco::PFCandidateRef pfRef(pfElectrons, index);
306  reco::PFCandidatePtr ptrToPFElectron(pfElectrons,index);
307 // reco::CandidateBaseRef pfBaseRef( pfRef );
308 
309  reco::GsfTrackRef PfTk= i->gsfTrackRef();
310 
311  bool Matched=false;
312  bool MatchedToAmbiguousGsfTrack=false;
313  for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end(); ++itElectron) {
314  unsigned int idx = itElectron - electrons->begin();
315  if (Matched || MatchedToAmbiguousGsfTrack) continue;
316 
317  reco::GsfTrackRef EgTk= itElectron->gsfTrack();
318 
319  if (itElectron->gsfTrack()==i->gsfTrackRef()){
320  Matched=true;
321  }
322  else {
323  for( reco::GsfTrackRefVector::const_iterator it = itElectron->ambiguousGsfTracksBegin() ;
324  it!=itElectron->ambiguousGsfTracksEnd(); it++ ){
325  MatchedToAmbiguousGsfTrack |= (bool)(i->gsfTrackRef()==(*it));
326  }
327  }
328 
329  if (Matched || MatchedToAmbiguousGsfTrack){
330 
331  // ptr needed for finding the matched gen particle
332  reco::CandidatePtr ptrToGsfElectron(electrons,idx);
333 
334  // ref to base needed for the construction of the pat object
335  const edm::RefToBase<reco::GsfElectron>& elecsRef = electrons->refAt(idx);
336  Electron anElectron(elecsRef);
337  anElectron.setPFCandidateRef( pfRef );
338 
339  //it should be always true when particleFlow electrons are used.
340  anElectron.setIsPF( true );
341 
342  if( embedPFCandidate_ ) anElectron.embedPFCandidate();
343 
344  if ( useUserData_ ) {
345  userDataHelper_.add( anElectron, iEvent, iSetup );
346  }
347 
348  double ip3d = -999; // for mva variable
349 
350  // embed high level selection
351  if ( embedHighLevelSelection_ ) {
352  // get the global track
353  reco::GsfTrackRef track = PfTk;
354 
355  // Make sure the collection it points to is there
356  if ( track.isNonnull() && track.isAvailable() ) {
357 
358  reco::TransientTrack tt = trackBuilder->build(track);
359  embedHighLevel( anElectron,
360  track,
361  tt,
362  primaryVertex,
363  primaryVertexIsValid,
364  beamSpot,
365  beamSpotIsValid );
366 
367  std::pair<bool,Measurement1D> ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex);
368  ip3d = ip3dpv.second.value(); // for mva variable
369 
370  if ( !usePV_ ) {
371  double corr_d0 = track->dxy( beamPoint );
372  anElectron.setDB( corr_d0, -1.0 );
373  } else {
374  std::pair<bool,Measurement1D> result = IPTools::absoluteTransverseImpactParameter(tt, primaryVertex);
375  double d0_corr = result.second.value();
376  double d0_err = result.second.error();
377  anElectron.setDB( d0_corr, d0_err );
378  }
379  }
380  }
381 
382  //Electron Id
383 
384  if (addElecID_) {
385  //STANDARD EL ID
386  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
387  ids[i].second = (*idhandles[i])[elecsRef];
388  }
389  //SPECIFIC PF ID
390  ids.push_back(std::make_pair("pf_evspi",pfRef->mva_e_pi()));
391  ids.push_back(std::make_pair("pf_evsmu",pfRef->mva_e_mu()));
392  anElectron.setElectronIDs(ids);
393  }
394 
395  // add missing mva variables
396  double r9 = lazyTools.e3x3( *( itElectron->superCluster()->seed())) / itElectron->superCluster()->rawEnergy() ;
397  double sigmaIphiIphi;
398  double sigmaIetaIphi;
399  std::vector<float> vCov = lazyTools.localCovariances(*( itElectron->superCluster()->seed()));
400  if( !edm::isNotFinite(vCov[2])) sigmaIphiIphi = sqrt(vCov[2]);
401  else sigmaIphiIphi = 0;
402  sigmaIetaIphi = vCov[1];
403  anElectron.setMvaVariables( r9, sigmaIphiIphi, sigmaIetaIphi, ip3d);
404 
405  std::vector<DetId> selectedCells;
406  bool barrel = itElectron->isEB();
407  //loop over sub clusters
408  if (embedBasicClusters_) {
409  for (reco::CaloCluster_iterator clusIt = itElectron->superCluster()->clustersBegin(); clusIt!=itElectron->superCluster()->clustersEnd(); ++clusIt) {
410  //get seed (max energy xtal)
411  DetId seed = lazyTools.getMaximum(**clusIt).first;
412  //get all xtals in 5x5 window around the seed
413  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
415  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
416 
417  //get all xtals belonging to cluster
418  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
419  selectedCells.push_back(hit.first);
420  }
421  }
422  }
423 
424  if (embedPflowBasicClusters_ && itElectron->parentSuperCluster().isNonnull()) {
425  for (reco::CaloCluster_iterator clusIt = itElectron->parentSuperCluster()->clustersBegin(); clusIt!=itElectron->parentSuperCluster()->clustersEnd(); ++clusIt) {
426  //get seed (max energy xtal)
427  DetId seed = lazyTools.getMaximum(**clusIt).first;
428  //get all xtals in 5x5 window around the seed
429  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
431  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
432 
433  //get all xtals belonging to cluster
434  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
435  selectedCells.push_back(hit.first);
436  }
437  }
438  }
439 
440  //remove duplicates
441  std::sort(selectedCells.begin(),selectedCells.end());
442  std::unique(selectedCells.begin(),selectedCells.end());
443 
444 
445  // Retrieve the corresponding RecHits
446 
448  if(barrel)
450  else
452 
453  EcalRecHitCollection selectedRecHits;
454  const EcalRecHitCollection *recHits = rechitsH.product();
455 
456  unsigned nSelectedCells = selectedCells.size();
457  for (unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
458  EcalRecHitCollection::const_iterator it = recHits->find( selectedCells[icell] );
459  if ( it != recHits->end() ) {
460  selectedRecHits.push_back(*it);
461  }
462  }
463  selectedRecHits.sort();
464  if (embedRecHits_) anElectron.embedRecHits(& selectedRecHits);
465 
466  // set conversion veto selection
467  bool passconversionveto = false;
468  if( hConversions.isValid()){
469  // this is recommended method
470  passconversionveto = !ConversionTools::hasMatchedConversion( *itElectron, hConversions, beamSpotHandle->position());
471  }else{
472  // use missing hits without vertex fit method
473  passconversionveto = itElectron->gsfTrack()->trackerExpectedHitsInner().numberOfLostHits() < 1;
474  }
475 
476  anElectron.setPassConversionVeto( passconversionveto );
477 
478 
479 // fillElectron(anElectron,elecsRef,pfBaseRef,
480 // genMatches, deposits, isolationValues);
481 
482  //COLIN small warning !
483  // we are currently choosing to take the 4-momentum of the PFCandidate;
484  // the momentum of the GsfElectron is saved though
485  // we must therefore match the GsfElectron.
486  // because of this, we should not change the source of the electron matcher
487  // to the collection of PFElectrons in the python configuration
488  // I don't know what to do with the efficiencyLoader, since I don't know
489  // what this class is for.
490  fillElectron2( anElectron,
491  ptrToPFElectron,
492  ptrToGsfElectron,
493  ptrToGsfElectron,
494  genMatches, deposits, isolationValues );
495 
496  //COLIN need to use fillElectron2 in the non-pflow case as well, and to test it.
497 
498  patElectrons->push_back(anElectron);
499  }
500  }
501  //if( !Matched && !MatchedToAmbiguousGsfTrack) std::cout << "!!!!A pf electron could not be matched to a gsf!!!!" << std::endl;
502  }
503  }
504 
505  else{
506  // Try to access PF electron collection
508  bool valMapPresent = iEvent.getByToken(pfCandidateMapToken_,ValMapH);
509  // Try to access a PFCandidate collection, as supplied by the user
511  bool pfCandsPresent = iEvent.getByToken(pfElecToken_, pfElectrons);
512 
513  for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end(); ++itElectron) {
514  // construct the Electron from the ref -> save ref to original object
515  //FIXME: looks like a lot of instances could be turned into const refs
516  unsigned int idx = itElectron - electrons->begin();
517  edm::RefToBase<reco::GsfElectron> elecsRef = electrons->refAt(idx);
518  reco::CandidateBaseRef elecBaseRef(elecsRef);
519  Electron anElectron(elecsRef);
520 
521  // Is this GsfElectron also identified as an e- in the particle flow?
522  bool pfId = false;
523 
524  if ( pfCandsPresent ) {
525  // PF electron collection not available.
526  const reco::GsfTrackRef& trkRef = itElectron->gsfTrack();
527  int index = 0;
528  for( reco::PFCandidateConstIterator ie = pfElectrons->begin();
529  ie != pfElectrons->end(); ++ie, ++index) {
530  if(ie->particleId()!=reco::PFCandidate::e) continue;
531  const reco::GsfTrackRef& pfTrkRef= ie->gsfTrackRef();
532  if( trkRef == pfTrkRef ) {
533  pfId = true;
534  reco::PFCandidateRef pfRef(pfElectrons, index);
535  anElectron.setPFCandidateRef( pfRef );
536  break;
537  }
538  }
539  }
540  else if( valMapPresent ) {
541  // use value map if PF collection not available
542  const edm::ValueMap<reco::PFCandidatePtr> & myValMap(*ValMapH);
543  // Get the PFCandidate
544  const reco::PFCandidatePtr& pfElePtr(myValMap[elecsRef]);
545  pfId= pfElePtr.isNonnull();
546  }
547  // set PFId function
548  anElectron.setIsPF( pfId );
549 
550  // add resolution info
551 
552  // Isolation
553  if (isolator_.enabled()) {
554  isolator_.fill(*electrons, idx, isolatorTmpStorage_);
555  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
556  // better to loop backwards, so the vector is resized less times
557  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(), ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
558  anElectron.setIsolation(it->first, it->second);
559  }
560  }
561 
562  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
563  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[elecsRef]);
564  }
565 
566  // add electron ID info
567  if (addElecID_) {
568  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
569  ids[i].second = (*idhandles[i])[elecsRef];
570  }
571  anElectron.setElectronIDs(ids);
572  }
573 
574 
575  if ( useUserData_ ) {
576  userDataHelper_.add( anElectron, iEvent, iSetup );
577  }
578 
579 
580  double ip3d = -999; //for mva variable
581 
582  // embed high level selection
583  if ( embedHighLevelSelection_ ) {
584  // get the global track
585  reco::GsfTrackRef track = itElectron->gsfTrack();
586 
587  // Make sure the collection it points to is there
588  if ( track.isNonnull() && track.isAvailable() ) {
589 
590  reco::TransientTrack tt = trackBuilder->build(track);
591  embedHighLevel( anElectron,
592  track,
593  tt,
594  primaryVertex,
595  primaryVertexIsValid,
596  beamSpot,
597  beamSpotIsValid );
598 
599  std::pair<bool,Measurement1D> ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex);
600  ip3d = ip3dpv.second.value(); // for mva variable
601 
602  if ( !usePV_ ) {
603  double corr_d0 = track->dxy( beamPoint );
604  anElectron.setDB( corr_d0, -1.0 );
605  } else {
606  std::pair<bool,Measurement1D> result = IPTools::absoluteTransverseImpactParameter(tt, primaryVertex);
607  double d0_corr = result.second.value();
608  double d0_err = result.second.error();
609  anElectron.setDB( d0_corr, d0_err );
610  }
611  }
612  }
613 
614  // add mva variables
615  double r9 = lazyTools.e3x3( *( itElectron->superCluster()->seed())) / itElectron->superCluster()->rawEnergy() ;
616  double sigmaIphiIphi;
617  double sigmaIetaIphi;
618  std::vector<float> vCov = lazyTools.localCovariances(*( itElectron->superCluster()->seed()));
619  if( !edm::isNotFinite(vCov[2])) sigmaIphiIphi = sqrt(vCov[2]);
620  else sigmaIphiIphi = 0;
621  sigmaIetaIphi = vCov[1];
622  anElectron.setMvaVariables( r9, sigmaIphiIphi, sigmaIetaIphi, ip3d);
623 
624  std::vector<DetId> selectedCells;
625  bool barrel = itElectron->isEB();
626  //loop over sub clusters
627  if (embedBasicClusters_) {
628  for (reco::CaloCluster_iterator clusIt = itElectron->superCluster()->clustersBegin(); clusIt!=itElectron->superCluster()->clustersEnd(); ++clusIt) {
629  //get seed (max energy xtal)
630  DetId seed = lazyTools.getMaximum(**clusIt).first;
631  //get all xtals in 5x5 window around the seed
632  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
634  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
635 
636  //get all xtals belonging to cluster
637  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
638  selectedCells.push_back(hit.first);
639  }
640  }
641  }
642 
643  if (embedPflowBasicClusters_ && itElectron->parentSuperCluster().isNonnull()) {
644  for (reco::CaloCluster_iterator clusIt = itElectron->parentSuperCluster()->clustersBegin(); clusIt!=itElectron->parentSuperCluster()->clustersEnd(); ++clusIt) {
645  //get seed (max energy xtal)
646  DetId seed = lazyTools.getMaximum(**clusIt).first;
647  //get all xtals in 5x5 window around the seed
648  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
650  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
651 
652  //get all xtals belonging to cluster
653  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
654  selectedCells.push_back(hit.first);
655  }
656  }
657  }
658 
659  //remove duplicates
660  std::sort(selectedCells.begin(),selectedCells.end());
661  std::unique(selectedCells.begin(),selectedCells.end());
662 
663  // Retrieve the corresponding RecHits
664 
666  if(barrel)
668  else
670 
671  EcalRecHitCollection selectedRecHits;
672  const EcalRecHitCollection *recHits = rechitsH.product();
673 
674  unsigned nSelectedCells = selectedCells.size();
675  for (unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
676  EcalRecHitCollection::const_iterator it = recHits->find( selectedCells[icell] );
677  if ( it != recHits->end() ) {
678  selectedRecHits.push_back(*it);
679  }
680  }
681  selectedRecHits.sort();
682  if (embedRecHits_) anElectron.embedRecHits(& selectedRecHits);
683 
684  // set conversion veto selection
685  bool passconversionveto = false;
686  if( hConversions.isValid()){
687  // this is recommended method
688  passconversionveto = !ConversionTools::hasMatchedConversion( *itElectron, hConversions, beamSpotHandle->position());
689  }else{
690  // use missing hits without vertex fit method
691  passconversionveto = itElectron->gsfTrack()->trackerExpectedHitsInner().numberOfLostHits() < 1;
692  }
693  anElectron.setPassConversionVeto( passconversionveto );
694 
695  // add sel to selected
696  fillElectron( anElectron, elecsRef,elecBaseRef,
697  genMatches, deposits, pfId, isolationValues, isolationValuesNoPFId);
698  patElectrons->push_back(anElectron);
699  }
700  }
701 
702  // sort electrons in pt
703  std::sort(patElectrons->begin(), patElectrons->end(), pTComparator_);
704 
705  // add the electrons to the event output
706  std::auto_ptr<std::vector<Electron> > ptr(patElectrons);
707  iEvent.put(ptr);
708 
709  // clean up
711 
712 }
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
double z0() const
z coordinate
Definition: BeamSpot.h:68
int i
Definition: DBlmapReader.cc:9
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
edm::EDGetTokenT< edm::View< reco::GsfElectron > > electronToken_
void embedHighLevel(pat::Electron &anElectron, reco::GsfTrackRef track, reco::TransientTrack &tt, reco::Vertex &primaryVertex, bool primaryVertexIsValid, reco::BeamSpot &beamspot, bool beamspotIsValid)
std::vector< EcalRecHit >::const_iterator const_iterator
std::pair< bool, Measurement1D > absoluteImpactParameter3D(const reco::TransientTrack &transientTrack, const reco::Vertex &vertex)
Definition: IPTools.cc:37
void fillElectron(Electron &aElectron, const ElectronBaseRef &electronRef, const reco::CandidateBaseRef &baseRef, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const bool pfId, const IsolationValueMaps &isolationValues, const IsolationValueMaps &isolationValuesNoPFId) const
common electron filling, for both the standard and PF2PAT case
void push_back(T const &t)
bool isAvailable() const
Definition: Ref.h:276
PFCandidateCollection::const_iterator PFCandidateConstIterator
iterator
std::vector< edm::EDGetTokenT< edm::ValueMap< float > > > elecIDTokens_
bool isRealData() const
Definition: EventBase.h:60
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:50
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
GreaterByPt< Electron > pTComparator_
pat::helper::MultiIsolator isolator_
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
bool isNotFinite(T x)
Definition: isFinite.h:10
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
T sqrt(T t)
Definition: SSEVec.h:48
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
tuple result
Definition: query.py:137
edm::InputTag reducedEndcapRecHitCollection_
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
int j
Definition: DBlmapReader.cc:9
edm::InputTag reducedBarrelRecHitCollection_
mva input variables
edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
math::XYZPoint Point
point in the space
Definition: TrackBase.h:74
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
bool embedHighLevelSelection_
embed high level selection variables?
bool first
Definition: L1TdeRCT.cc:79
bool isValid() const
Definition: HandleBase.h:76
static bool hasMatchedConversion(const reco::GsfElectron &ele, const edm::Handle< reco::ConversionCollection > &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
const_iterator end() const
Definition: DetId.h:18
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
void fillElectron2(Electron &anElectron, const reco::CandidatePtr &candPtrForIsolation, const reco::CandidatePtr &candPtrForGenMatch, const reco::CandidatePtr &candPtrForLoader, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const IsolationValueMaps &isolationValues) const
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueNoPFIdTokens_
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
pat::helper::EfficiencyLoader efficiencyLoader_
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
const T & get() const
Definition: EventSetup.h:55
pat::PATUserDataHelper< pat::Electron > userDataHelper_
bool useParticleFlow_
pflow specific
Analysis-level electron class.
Definition: Electron.h:52
const CaloTopology * ecalTopology_
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
Definition: CaloTopology.cc:26
edm::EDGetTokenT< edm::ValueMap< reco::PFCandidatePtr > > pfCandidateMapToken_
std::pair< bool, Measurement1D > absoluteTransverseImpactParameter(const reco::TransientTrack &transientTrack, const reco::Vertex &vertex)
Definition: IPTools.cc:43
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:16
iterator find(key_type k)
size_type size() const
double y0() const
y coordinate
Definition: BeamSpot.h:66
pat::helper::KinResolutionsLoader resolutionLoader_
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
void newEvent(const edm::Event &event, const edm::EventSetup &setup) const
To be called for each new event, reads in the EventSetup object.
edm::EDGetTokenT< reco::PFCandidateCollection > pfElecToken_
void newEvent(const edm::Event &event) const
To be called for each new event, reads in the ValueMaps for efficiencies.
edm::EDGetTokenT< std::vector< reco::Vertex > > pvToken_
std::vector< NameTag > elecIDSrcs_
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:82
double x0() const
x coordinate
Definition: BeamSpot.h:64
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
template<typename T >
void PATElectronProducer::readIsolationLabels ( const edm::ParameterSet iConfig,
const char *  psetName,
IsolationLabels labels,
std::vector< edm::EDGetTokenT< edm::ValueMap< T > > > &  tokens 
)
private

fill the labels vector from the contents of the parameter set, for the isodeposit or isolation values embedding

Definition at line 187 of file PATElectronProducer.h.

References pat::EcalIso, edm::ParameterSet::exists(), edm::ParameterSet::getParameter(), pat::HcalIso, combine::key, diffTwoXMLs::label, pat::PfAllParticleIso, pat::PfChargedAllIso, pat::PfChargedHadronIso, pat::PfGammaIso, pat::PfNeutralHadronIso, pat::PfPUChargedHadronIso, pat::TrackIso, pat::UserBaseIso, and edm::vector_transform().

190  {
191 
192  labels.clear();
193 
194  if (iConfig.exists( psetName )) {
195  edm::ParameterSet depconf
196  = iConfig.getParameter<edm::ParameterSet>(psetName);
197 
198  if (depconf.exists("tracker")) labels.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
199  if (depconf.exists("ecal")) labels.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
200  if (depconf.exists("hcal")) labels.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
201  if (depconf.exists("pfAllParticles")) {
202  labels.push_back(std::make_pair(pat::PfAllParticleIso, depconf.getParameter<edm::InputTag>("pfAllParticles")));
203  }
204  if (depconf.exists("pfChargedHadrons")) {
205  labels.push_back(std::make_pair(pat::PfChargedHadronIso, depconf.getParameter<edm::InputTag>("pfChargedHadrons")));
206  }
207  if (depconf.exists("pfChargedAll")) {
208  labels.push_back(std::make_pair(pat::PfChargedAllIso, depconf.getParameter<edm::InputTag>("pfChargedAll")));
209  }
210  if (depconf.exists("pfPUChargedHadrons")) {
211  labels.push_back(std::make_pair(pat::PfPUChargedHadronIso, depconf.getParameter<edm::InputTag>("pfPUChargedHadrons")));
212  }
213  if (depconf.exists("pfNeutralHadrons")) {
214  labels.push_back(std::make_pair(pat::PfNeutralHadronIso, depconf.getParameter<edm::InputTag>("pfNeutralHadrons")));
215  }
216  if (depconf.exists("pfPhotons")) {
217  labels.push_back(std::make_pair(pat::PfGammaIso, depconf.getParameter<edm::InputTag>("pfPhotons")));
218  }
219  if (depconf.exists("user")) {
220  std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
221  std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
222  int key = UserBaseIso;
223  for ( ; it != ed; ++it, ++key) {
224  labels.push_back(std::make_pair(IsolationKeys(key), *it));
225  }
226  }
227  }
228  tokens = edm::vector_transform(labels, [this](IsolationLabel const & label){return consumes<edm::ValueMap<T> >(label.second);});
229 
230 
231 }
T getParameter(std::string const &) const
bool exists(std::string const &parameterName) const
checks if a parameter exists
IsolationKeys
Enum defining isolation keys.
Definition: Isolation.h:9
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 >
Definition: transform.h:11
std::pair< pat::IsolationKeys, edm::InputTag > IsolationLabel
list key
Definition: combine.py:13

Member Data Documentation

bool pat::PATElectronProducer::addEfficiencies_
private

Definition at line 166 of file PATElectronProducer.h.

bool pat::PATElectronProducer::addElecID_
private

Definition at line 149 of file PATElectronProducer.h.

Referenced by produce().

bool pat::PATElectronProducer::addGenMatch_
private

Definition at line 80 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), PATElectronProducer(), and produce().

bool pat::PATElectronProducer::addResolutions_
private

Definition at line 169 of file PATElectronProducer.h.

edm::EDGetTokenT<reco::BeamSpot> pat::PATElectronProducer::beamLineToken_
private

Definition at line 102 of file PATElectronProducer.h.

Referenced by produce().

const CaloTopology* pat::PATElectronProducer::ecalTopology_
private

Definition at line 175 of file PATElectronProducer.h.

Referenced by produce().

pat::helper::EfficiencyLoader pat::PATElectronProducer::efficiencyLoader_
private

Definition at line 167 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and produce().

std::vector<NameTag> pat::PATElectronProducer::elecIDSrcs_
private

Definition at line 151 of file PATElectronProducer.h.

Referenced by produce().

std::vector<edm::EDGetTokenT<edm::ValueMap<float> > > pat::PATElectronProducer::elecIDTokens_
private

Definition at line 152 of file PATElectronProducer.h.

Referenced by produce().

edm::EDGetTokenT<edm::View<reco::GsfElectron> > pat::PATElectronProducer::electronToken_
private

Definition at line 68 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

bool pat::PATElectronProducer::embedBasicClusters_
private

Definition at line 75 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), PATElectronProducer(), and produce().

bool pat::PATElectronProducer::embedGenMatch_
private

Definition at line 81 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), PATElectronProducer(), and produce().

bool pat::PATElectronProducer::embedGsfElectronCore_
private

Definition at line 70 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedGsfTrack_
private

Definition at line 71 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedHighLevelSelection_
private

embed high level selection variables?

Definition at line 101 of file PATElectronProducer.h.

Referenced by produce().

bool pat::PATElectronProducer::embedPFCandidate_
private

Definition at line 92 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

bool pat::PATElectronProducer::embedPflowBasicClusters_
private

Definition at line 77 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), PATElectronProducer(), and produce().

bool pat::PATElectronProducer::embedPflowPreshowerClusters_
private

Definition at line 78 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedPflowSuperCluster_
private

Definition at line 73 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedPreshowerClusters_
private

Definition at line 76 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedRecHits_
private

Definition at line 82 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

bool pat::PATElectronProducer::embedSeedCluster_
private

Definition at line 74 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedSuperCluster_
private

Definition at line 72 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

bool pat::PATElectronProducer::embedTrack_
private

Definition at line 79 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and PATElectronProducer().

std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection> > > pat::PATElectronProducer::genMatchTokens_
private

Definition at line 86 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

edm::EDGetTokenT<reco::ConversionCollection> pat::PATElectronProducer::hConversionsToken_
private

Definition at line 69 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

IsolationLabels pat::PATElectronProducer::isoDepositLabels_
private

Definition at line 159 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and produce().

std::vector<edm::EDGetTokenT<edm::ValueMap<IsoDeposit> > > pat::PATElectronProducer::isoDepositTokens_
private

Definition at line 160 of file PATElectronProducer.h.

Referenced by produce().

IsolationLabels pat::PATElectronProducer::isolationValueLabels_
private

Definition at line 161 of file PATElectronProducer.h.

Referenced by fillElectron(), and fillElectron2().

IsolationLabels pat::PATElectronProducer::isolationValueLabelsNoPFId_
private

Definition at line 163 of file PATElectronProducer.h.

Referenced by fillElectron().

std::vector<edm::EDGetTokenT<edm::ValueMap<double> > > pat::PATElectronProducer::isolationValueNoPFIdTokens_
private

Definition at line 164 of file PATElectronProducer.h.

Referenced by produce().

std::vector<edm::EDGetTokenT<edm::ValueMap<double> > > pat::PATElectronProducer::isolationValueTokens_
private

Definition at line 162 of file PATElectronProducer.h.

Referenced by produce().

pat::helper::MultiIsolator pat::PATElectronProducer::isolator_
private

Definition at line 157 of file PATElectronProducer.h.

Referenced by produce().

pat::helper::MultiIsolator::IsolationValuePairs pat::PATElectronProducer::isolatorTmpStorage_
private

Definition at line 158 of file PATElectronProducer.h.

Referenced by produce().

edm::EDGetTokenT<edm::ValueMap<reco::PFCandidatePtr> > pat::PATElectronProducer::pfCandidateMapToken_
private

Definition at line 91 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

edm::EDGetTokenT<reco::PFCandidateCollection> pat::PATElectronProducer::pfElecToken_
private

Definition at line 90 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

GreaterByPt<Electron> pat::PATElectronProducer::pTComparator_
private

Definition at line 155 of file PATElectronProducer.h.

Referenced by produce().

edm::EDGetTokenT<std::vector<reco::Vertex> > pat::PATElectronProducer::pvToken_
private

Definition at line 104 of file PATElectronProducer.h.

Referenced by produce().

edm::InputTag pat::PATElectronProducer::reducedBarrelRecHitCollection_
private

mva input variables

Definition at line 95 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> pat::PATElectronProducer::reducedBarrelRecHitCollectionToken_
private

Definition at line 96 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

edm::InputTag pat::PATElectronProducer::reducedEndcapRecHitCollection_
private

Definition at line 97 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> pat::PATElectronProducer::reducedEndcapRecHitCollectionToken_
private

Definition at line 98 of file PATElectronProducer.h.

Referenced by PATElectronProducer(), and produce().

pat::helper::KinResolutionsLoader pat::PATElectronProducer::resolutionLoader_
private

Definition at line 170 of file PATElectronProducer.h.

Referenced by fillElectron(), fillElectron2(), and produce().

bool pat::PATElectronProducer::useParticleFlow_
private

pflow specific

Definition at line 89 of file PATElectronProducer.h.

Referenced by fillElectron(), PATElectronProducer(), and produce().

bool pat::PATElectronProducer::usePV_
private

Definition at line 103 of file PATElectronProducer.h.

Referenced by produce().

pat::PATUserDataHelper<pat::Electron> pat::PATElectronProducer::userDataHelper_
private

Definition at line 173 of file PATElectronProducer.h.

Referenced by produce().

bool pat::PATElectronProducer::useUserData_
private

Definition at line 172 of file PATElectronProducer.h.

Referenced by produce().