CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
EG9X105XObjectUpdateModifier.cc
Go to the documentation of this file.
15 
16 #include <vdt/vdtMath.h>
17 
18 //this modifier fills variables where not present in CMSSW_92X to CMSSW_105X
19 //use case is when reading older new samples in newer releases, aka legacy
20 //note we suffer from the problem of needing to use the electrons/photons the valuemaps
21 //are keyed to (something that is thankfully going away in 11X!) so we have to take
22 //those collections in and figure out which ele/pho matches to them
24 public:
25  template <typename T>
27  public:
29  : token_(cc.consumes(conf.getParameter<edm::InputTag>(name))) {}
30  void setHandle(const edm::Event& iEvent) { handle_ = iEvent.getHandle(token_); }
31  const edm::Handle<T>& handle() const { return handle_; }
32 
33  private:
36  };
37 
40 
41  void setEvent(const edm::Event&) final;
42 
43  void modifyObject(reco::GsfElectron& ele) const final;
44  void modifyObject(reco::Photon& pho) const final;
45 
46  void modifyObject(pat::Electron& ele) const final { return modifyObject(static_cast<reco::GsfElectron&>(ele)); }
47  void modifyObject(pat::Photon& pho) const final { return modifyObject(static_cast<reco::Photon&>(pho)); }
48 
49 private:
50  template <typename ObjType>
51  static edm::Ptr<ObjType> getPtrForValueMap(const ObjType& obj,
52  const edm::Handle<edm::View<ObjType> >& objsVMIsKeyedTo);
53 
56 
61 
70  //there is a bug which GsfTracks are now allowed to be a match for conversions
71  //due to improper linking of references in the miniAOD since 94X
72  //this allows us to emulate it or not
73  //note: even if this enabled, it will do nothing on miniAOD produced with 94X, 102X
74  //till upto whenever this is fixed (11X?) as the GsfTrack references point to a different
75  //collection to the conversion track references
77  //this allows us to update the charged hadron PF PV isolation
78  //chargedHadPFPVIso is filled in iorules but when running on miniAOD, the value used in IDs
79  //is remade on the miniAOD packedcandidates which differs due to rounding
80  //its still the same variable but can have differences hence inorder to allow IDs calculated on miniAOD
81  //on the same file to be exactly reproduced, this option is set true
83 };
84 
86  : ModifyObjectValueBase(conf),
87  eleCollVMsAreKeyedTo_(conf, "eleCollVMsAreKeyedTo", cc),
88  phoCollVMsAreKeyedTo_(conf, "phoCollVMsAreKeyedTo", cc),
89  conversions_(conf, "conversions", cc),
90  beamspot_(conf, "beamspot", cc),
91  ecalRecHitsEB_(conf, "ecalRecHitsEB", cc),
92  ecalRecHitsEE_(conf, "ecalRecHitsEE", cc),
93  eleTrkIso_(conf, "eleTrkIso", cc),
94  eleTrkIso04_(conf, "eleTrkIso04", cc),
95  phoPhotonIso_(conf, "phoPhotonIso", cc),
96  phoNeutralHadIso_(conf, "phoNeutralHadIso", cc),
97  phoChargedHadIso_(conf, "phoChargedHadIso", cc),
98  phoChargedHadWorstVtxIso_(conf, "phoChargedHadWorstVtxIso", cc),
99  phoChargedHadWorstVtxConeVetoIso_(conf, "phoChargedHadWorstVtxConeVetoIso", cc),
100  phoChargedHadPFPVIso_(conf, "phoChargedHadPFPVIso", cc),
101  allowGsfTrkMatchForConvs_(conf.getParameter<bool>("allowGsfTrackForConvs")),
102  updateChargedHadPFPVIso_(conf.getParameter<bool>("updateChargedHadPFPVIso")) {}
103 
107  conversions_.setHandle(iEvent);
108  beamspot_.setHandle(iEvent);
109  ecalRecHitsEB_.setHandle(iEvent);
110  ecalRecHitsEE_.setHandle(iEvent);
111  eleTrkIso_.setHandle(iEvent);
112  eleTrkIso04_.setHandle(iEvent);
113  phoPhotonIso_.setHandle(iEvent);
120 }
121 
124  if (ptrForVM.isNull()) {
125  throw cms::Exception("LogicError")
126  << " in EG9X105ObjectUpdateModifier, line " << __LINE__ << " electron " << ele.et() << " " << ele.eta() << " "
127  << ele.superCluster()->seed()->seed().rawId()
128  << " failed to match to the electrons the key map was keyed to, check the map collection is correct";
129  }
134  } else {
135  //its rather important to use the core function here to get the org trk ref
137  ele.core()->ctfTrack(), *conversions_.handle(), beamspot_.handle()->position(), 2.0, 1e-6, 0));
138  }
139  ele.setConversionRejectionVariables(convRejVars);
140 
142  isolVars03.tkSumPtHEEP = (*eleTrkIso_.handle())[ptrForVM];
143  ele.setDr03Isolation(isolVars03);
145  isolVars04.tkSumPtHEEP = (*eleTrkIso04_.handle())[ptrForVM];
146  ele.setDr04Isolation(isolVars04);
147 }
148 
151  if (ptrForVM.isNull()) {
152  throw cms::Exception("LogicError")
153  << " in EG9X105ObjectUpdateModifier, line " << __LINE__ << " photon " << pho.et() << " " << pho.eta() << " "
154  << pho.superCluster()->seed()->seed().rawId()
155  << " failed to match to the photons the key map was keyed to, check the map collection is correct";
156  }
157 
159  pfIso.photonIso = (*phoPhotonIso_.handle())[ptrForVM];
160  pfIso.neutralHadronIso = (*phoNeutralHadIso_.handle())[ptrForVM];
161  pfIso.chargedHadronIso = (*phoChargedHadIso_.handle())[ptrForVM];
165  pfIso.chargedHadronPFPVIso = (*phoChargedHadPFPVIso_.handle())[ptrForVM];
166  }
167  pho.setPflowIsolationVariables(pfIso);
168 
171 
172  const reco::CaloClusterPtr seedClus = pho.superCluster()->seed();
173  const bool isEB = seedClus->seed().subdetId() == EcalBarrel;
174  const auto& recHits = isEB ? *ecalRecHitsEB_.handle() : *ecalRecHitsEE_.handle();
175  Cluster2ndMoments clus2ndMomFrac = EcalClusterTools::cluster2ndMoments(*seedClus, recHits);
177  fracSS.smMajor = clus2ndMomFrac.sMaj;
178  fracSS.smMinor = clus2ndMomFrac.sMin;
179  fracSS.smAlpha = clus2ndMomFrac.alpha;
180  fullSS.smMajor = clus2ndMomFull.sMaj;
181  fullSS.smMinor = clus2ndMomFull.sMin;
182  fullSS.smAlpha = clus2ndMomFull.alpha;
183  pho.setShowerShapeVariables(fracSS);
185 }
186 
187 template <typename ObjType>
189  const ObjType& obj, const edm::Handle<edm::View<ObjType> >& objsVMIsKeyedTo) {
190  for (auto& objVMPtr : objsVMIsKeyedTo->ptrs()) {
191  if (obj.superCluster()->seed()->seed() == objVMPtr->superCluster()->seed()->seed())
192  return objVMPtr;
193  }
194  return edm::Ptr<ObjType>(objsVMIsKeyedTo.id()); //return null ptr if not found
195 }
196 
void setDr04Isolation(const IsolationVariables &dr04)
Definition: GsfElectron.h:606
void setPflowIsolationVariables(const PflowIsolationVariables &pfisol)
Set Particle Flow Isolation variables.
Definition: Photon.h:560
Analysis-level Photon class.
Definition: Photon.h:46
static reco::Conversion const * matchedConversion(const reco::GsfElectron &ele, const reco::ConversionCollection &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
TokenHandlePair< edm::ValueMap< float > > eleTrkIso04_
TokenHandlePair< edm::ValueMap< float > > phoPhotonIso_
constexpr char Photon[]
Definition: modules.cc:14
TokenHandlePair< edm::ValueMap< float > > phoChargedHadWorstVtxIso_
TokenHandlePair< edm::View< reco::Photon > > phoCollVMsAreKeyedTo_
void setEvent(const edm::Event &) final
TokenHandlePair< reco::BeamSpot > beamspot_
TokenHandlePair< EcalRecHitCollection > ecalRecHitsEE_
void setConversionRejectionVariables(const ConversionRejection &convRej)
Definition: GsfElectron.h:650
TokenHandlePair< EcalRecHitCollection > ecalRecHitsEB_
void setDr03Isolation(const IsolationVariables &dr03)
Definition: GsfElectron.h:605
const IsolationVariables & dr04IsolationVariables() const
Definition: GsfElectron.h:602
TokenHandlePair< edm::ValueMap< float > > phoChargedHadWorstVtxConeVetoIso_
static edm::Ptr< ObjType > getPtrForValueMap(const ObjType &obj, const edm::Handle< edm::View< ObjType > > &objsVMIsKeyedTo)
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Definition: Event.h:563
TokenHandlePair< edm::ValueMap< float > > eleTrkIso_
int iEvent
Definition: GenABIO.cc:224
static float getVtxFitProb(const reco::Conversion *conv)
const std::string & name() const
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
void modifyObject(pat::Photon &pho) const final
bool isNull() const
Checks for null.
Definition: Ptr.h:142
void setShowerShapeVariables(const ShowerShape &a)
Definition: Photon.h:215
static Cluster2ndMoments cluster2ndMoments(const reco::BasicCluster &basicCluster, const EcalRecHitCollection &recHits, double phiCorrectionFactor=0.8, double w0=4.7, bool useLogWeights=true)
TokenHandlePair< reco::ConversionCollection > conversions_
void modifyObject(pat::Electron &ele) const final
virtual GsfElectronCoreRef core() const
Definition: GsfElectron.cc:8
void full5x5_setShowerShapeVariables(const ShowerShape &a)
Definition: Photon.h:216
double et() const final
transverse energy
const ShowerShape & full5x5_showerShapeVariables() const
Definition: Photon.h:213
TokenHandlePair< edm::ValueMap< float > > phoChargedHadPFPVIso_
const IsolationVariables & dr03IsolationVariables() const
Definition: GsfElectron.h:594
TokenHandlePair(const edm::ParameterSet &conf, const std::string &name, edm::ConsumesCollector &cc)
#define DEFINE_EDM_PLUGIN(factory, type, name)
const ConversionRejection & conversionRejectionVariables() const
Definition: GsfElectron.h:649
void modifyObject(reco::GsfElectron &ele) const final
constexpr char Electron[]
Definition: modules.cc:12
const PflowIsolationVariables & getPflowIsolationVariables() const
Get Particle Flow Isolation variables block.
Definition: Photon.h:557
TokenHandlePair< edm::View< reco::GsfElectron > > eleCollVMsAreKeyedTo_
const ShowerShape & showerShapeVariables() const
Definition: Photon.h:212
EG9X105XObjectUpdateModifier(const edm::ParameterSet &conf, edm::ConsumesCollector &cc)
TokenHandlePair< edm::ValueMap< float > > phoNeutralHadIso_
SuperClusterRef superCluster() const override
reference to a SuperCluster
Definition: GsfElectron.h:155
TokenHandlePair< edm::ValueMap< float > > phoChargedHadIso_
double eta() const final
momentum pseudorapidity