CMS 3D CMS Logo

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<T>(conf.getParameter<edm::InputTag>(name))) {}
30  void setHandle(const edm::Event& iEvent) { iEvent.getByToken(token_, handle_); }
31  const edm::Handle<T>& handle() const { return handle_; }
32 
33  private:
36  };
37 
40 
41  void setEvent(const edm::Event&) final;
42  void setEventContent(const edm::EventSetup&) final;
43 
44  void modifyObject(reco::GsfElectron& ele) const final;
45  void modifyObject(reco::Photon& pho) const final;
46 
47  void modifyObject(pat::Electron& ele) const final { return modifyObject(static_cast<reco::GsfElectron&>(ele)); }
48  void modifyObject(pat::Photon& pho) const final { return modifyObject(static_cast<reco::Photon&>(pho)); }
49 
50 private:
51  template <typename ObjType>
52  static edm::Ptr<ObjType> getPtrForValueMap(const ObjType& obj,
53  const edm::Handle<edm::View<ObjType> >& objsVMIsKeyedTo);
54 
57 
62 
71  //there is a bug which GsfTracks are now allowed to be a match for conversions
72  //due to improper linking of references in the miniAOD since 94X
73  //this allows us to emulate it or not
74  //note: even if this enabled, it will do nothing on miniAOD produced with 94X, 102X
75  //till upto whenever this is fixed (11X?) as the GsfTrack references point to a different
76  //collection to the conversion track references
78  //this allows us to update the charged hadron PF PV isolation
79  //chargedHadPFPVIso is filled in iorules but when running on miniAOD, the value used in IDs
80  //is remade on the miniAOD packedcandidates which differs due to rounding
81  //its still the same variable but can have differences hence inorder to allow IDs calculated on miniAOD
82  //on the same file to be exactly reproduced, this option is set true
84 };
85 
87  : ModifyObjectValueBase(conf),
88  eleCollVMsAreKeyedTo_(conf, "eleCollVMsAreKeyedTo", cc),
89  phoCollVMsAreKeyedTo_(conf, "phoCollVMsAreKeyedTo", cc),
90  conversions_(conf, "conversions", cc),
91  beamspot_(conf, "beamspot", cc),
92  ecalRecHitsEB_(conf, "ecalRecHitsEB", cc),
93  ecalRecHitsEE_(conf, "ecalRecHitsEE", cc),
94  eleTrkIso_(conf, "eleTrkIso", cc),
95  eleTrkIso04_(conf, "eleTrkIso04", cc),
96  phoPhotonIso_(conf, "phoPhotonIso", cc),
97  phoNeutralHadIso_(conf, "phoNeutralHadIso", cc),
98  phoChargedHadIso_(conf, "phoChargedHadIso", cc),
99  phoChargedHadWorstVtxIso_(conf, "phoChargedHadWorstVtxIso", cc),
100  phoChargedHadWorstVtxConeVetoIso_(conf, "phoChargedHadWorstVtxConeVetoIso", cc),
101  phoChargedHadPFPVIso_(conf, "phoChargedHadPFPVIso", cc),
102  allowGsfTrkMatchForConvs_(conf.getParameter<bool>("allowGsfTrackForConvs")),
103  updateChargedHadPFPVIso_(conf.getParameter<bool>("updateChargedHadPFPVIso")) {}
104 
108  conversions_.setHandle(iEvent);
109  beamspot_.setHandle(iEvent);
110  ecalRecHitsEB_.setHandle(iEvent);
111  ecalRecHitsEE_.setHandle(iEvent);
112  eleTrkIso_.setHandle(iEvent);
113  eleTrkIso04_.setHandle(iEvent);
114  phoPhotonIso_.setHandle(iEvent);
121 }
122 
124 
127  if (ptrForVM.isNull()) {
128  throw cms::Exception("LogicError")
129  << " in EG9X105ObjectUpdateModifier, line " << __LINE__ << " electron " << ele.et() << " " << ele.eta() << " "
130  << ele.superCluster()->seed()->seed().rawId()
131  << " failed to match to the electrons the key map was keyed to, check the map collection is correct";
132  }
137  } else {
138  //its rather important to use the core function here to get the org trk ref
140  ele.core()->ctfTrack(), *conversions_.handle(), beamspot_.handle()->position(), 2.0, 1e-6, 0));
141  }
142  ele.setConversionRejectionVariables(convRejVars);
143 
145  isolVars03.tkSumPtHEEP = (*eleTrkIso_.handle())[ptrForVM];
146  ele.setDr03Isolation(isolVars03);
148  isolVars04.tkSumPtHEEP = (*eleTrkIso04_.handle())[ptrForVM];
149  ele.setDr04Isolation(isolVars04);
150 }
151 
154  if (ptrForVM.isNull()) {
155  throw cms::Exception("LogicError")
156  << " in EG9X105ObjectUpdateModifier, line " << __LINE__ << " photon " << pho.et() << " " << pho.eta() << " "
157  << pho.superCluster()->seed()->seed().rawId()
158  << " failed to match to the photons the key map was keyed to, check the map collection is correct";
159  }
160 
162  pfIso.photonIso = (*phoPhotonIso_.handle())[ptrForVM];
163  pfIso.neutralHadronIso = (*phoNeutralHadIso_.handle())[ptrForVM];
164  pfIso.chargedHadronIso = (*phoChargedHadIso_.handle())[ptrForVM];
168  pfIso.chargedHadronPFPVIso = (*phoChargedHadPFPVIso_.handle())[ptrForVM];
169  }
170  pho.setPflowIsolationVariables(pfIso);
171 
174 
175  const reco::CaloClusterPtr seedClus = pho.superCluster()->seed();
176  const bool isEB = seedClus->seed().subdetId() == EcalBarrel;
177  const auto& recHits = isEB ? *ecalRecHitsEB_.handle() : *ecalRecHitsEE_.handle();
178  Cluster2ndMoments clus2ndMomFrac = EcalClusterTools::cluster2ndMoments(*seedClus, recHits);
180  fracSS.smMajor = clus2ndMomFrac.sMaj;
181  fracSS.smMinor = clus2ndMomFrac.sMin;
182  fracSS.smAlpha = clus2ndMomFrac.alpha;
183  fullSS.smMajor = clus2ndMomFull.sMaj;
184  fullSS.smMinor = clus2ndMomFull.sMin;
185  fullSS.smAlpha = clus2ndMomFull.alpha;
186  pho.setShowerShapeVariables(fracSS);
188 }
189 
190 template <typename ObjType>
192  const ObjType& obj, const edm::Handle<edm::View<ObjType> >& objsVMIsKeyedTo) {
193  for (auto& objVMPtr : objsVMIsKeyedTo->ptrs()) {
194  if (obj.superCluster()->seed()->seed() == objVMPtr->superCluster()->seed()->seed())
195  return objVMPtr;
196  }
197  return edm::Ptr<ObjType>(objsVMIsKeyedTo.id()); //return null ptr if not found
198 }
199 
void setDr04Isolation(const IsolationVariables &dr04)
Definition: GsfElectron.h:546
void setPflowIsolationVariables(const PflowIsolationVariables &pfisol)
Set Particle Flow Isolation variables.
Definition: Photon.h:497
Analysis-level Photon class.
Definition: Photon.h:46
void modifyObject(pat::Photon &pho) const final
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_
double eta() const final
momentum pseudorapidity
TokenHandlePair< edm::ValueMap< float > > phoChargedHadWorstVtxIso_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
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:587
TokenHandlePair< EcalRecHitCollection > ecalRecHitsEB_
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
void setDr03Isolation(const IsolationVariables &dr03)
Definition: GsfElectron.h:545
const IsolationVariables & dr04IsolationVariables() const
Definition: GsfElectron.h:542
TokenHandlePair< edm::ValueMap< float > > phoChargedHadWorstVtxConeVetoIso_
void setEventContent(const edm::EventSetup &) final
static edm::Ptr< ObjType > getPtrForValueMap(const ObjType &obj, const edm::Handle< edm::View< ObjType > > &objsVMIsKeyedTo)
TokenHandlePair< edm::ValueMap< float > > eleTrkIso_
int iEvent
Definition: GenABIO.cc:224
static float getVtxFitProb(const reco::Conversion *conv)
const std::string & name() const
double et() const final
transverse energy
bool isNull() const
Checks for null.
Definition: Ptr.h:142
void setShowerShapeVariables(const ShowerShape &a)
Definition: Photon.h:204
static Cluster2ndMoments cluster2ndMoments(const reco::BasicCluster &basicCluster, const EcalRecHitCollection &recHits, double phiCorrectionFactor=0.8, double w0=4.7, bool useLogWeights=true)
void modifyObject(reco::GsfElectron &ele) const final
TokenHandlePair< reco::ConversionCollection > conversions_
Analysis-level electron class.
Definition: Electron.h:51
virtual GsfElectronCoreRef core() const
Definition: GsfElectron.cc:8
void full5x5_setShowerShapeVariables(const ShowerShape &a)
Definition: Photon.h:205
HLT enums.
const ShowerShape & full5x5_showerShapeVariables() const
Definition: Photon.h:202
TokenHandlePair< edm::ValueMap< float > > phoChargedHadPFPVIso_
const IsolationVariables & dr03IsolationVariables() const
Definition: GsfElectron.h:530
SuperClusterRef superCluster() const override
reference to a SuperCluster
Definition: GsfElectron.h:155
TokenHandlePair(const edm::ParameterSet &conf, const std::string &name, edm::ConsumesCollector &cc)
#define DEFINE_EDM_PLUGIN(factory, type, name)
const Point & position() const
position
Definition: BeamSpot.h:59
const ConversionRejection & conversionRejectionVariables() const
Definition: GsfElectron.h:586
const PflowIsolationVariables & getPflowIsolationVariables() const
Get Particle Flow Isolation variables block.
Definition: Photon.h:494
TokenHandlePair< edm::View< reco::GsfElectron > > eleCollVMsAreKeyedTo_
long double T
const ShowerShape & showerShapeVariables() const
Definition: Photon.h:201
EG9X105XObjectUpdateModifier(const edm::ParameterSet &conf, edm::ConsumesCollector &cc)
TokenHandlePair< edm::ValueMap< float > > phoNeutralHadIso_
TokenHandlePair< edm::ValueMap< float > > phoChargedHadIso_
void modifyObject(pat::Electron &ele) const final