CMS 3D CMS Logo

PFCandidateRecalibrator.cc
Go to the documentation of this file.
1 // - a PF candidate collection (which uses bugged HCAL respcorrs)
3 // - respCorrs values from fixed GT and bugged GT
4 // Produce:
5 // - a new PFCandidate collection containing the recalibrated PFCandidates in HF and where the neutral had pointing to problematic cells are removed
6 // - a second PFCandidate collection with just those discarded hadrons
7 // - a ValueMap<reco::PFCandidateRef> that maps the old to the new, and vice-versa
8 
17 
19 
28 
31 
34 #include <iostream>
35 
36 struct HEChannel {
37  float eta;
38  float phi;
39  float ratio;
40  HEChannel(float eta, float phi, float ratio) : eta(eta), phi(phi), ratio(ratio) {}
41 };
42 struct HFChannel {
43  int ieta;
44  int iphi;
45  int depth;
46  float ratio;
47  HFChannel(int ieta, int iphi, int depth, float ratio) : ieta(ieta), iphi(iphi), depth(depth), ratio(ratio) {}
48 };
49 
51 public:
54 
55  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
56 
57 private:
58  void beginRun(const edm::Run& iRun, edm::EventSetup const& iSetup) override;
59  void endRun(const edm::Run& iRun, edm::EventSetup const& iSetup) override;
60  void produce(edm::Event&, const edm::EventSetup&) override;
61 
64 
66 
67  std::vector<HEChannel> badChHE_;
68  std::vector<HFChannel> badChHF_;
69 
72 };
73 
75  : pfcandidates_(consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfcandidates"))),
76  shortFibreThr_(iConfig.getParameter<double>("shortFibreThr")),
77  longFibreThr_(iConfig.getParameter<double>("longFibreThr")) {
78  produces<reco::PFCandidateCollection>();
79  produces<reco::PFCandidateCollection>("discarded");
80  produces<edm::ValueMap<reco::PFCandidateRef>>();
81 }
82 
84  if (hcalDbWatcher_.check(iSetup) || hcalRCWatcher_.check(iSetup)) {
85  //Get Calib Constants from current GT
87  iSetup.get<HcalDbRecord>().get(gtCond);
88 
89  //Get Calib Constants from bugged tag
91  iSetup.get<HcalRecNumberingRecord>().get(htopo);
92  const HcalTopology* theHBHETopology = htopo.product();
93 
95  iSetup.get<HcalRespCorrsRcd>().get("bugged", buggedCond);
96  HcalRespCorrs buggedRespCorrs(*buggedCond.product());
97  buggedRespCorrs.setTopo(theHBHETopology);
98 
99  //access calogeometry
101  iSetup.get<CaloGeometryRecord>().get(calogeom);
102  const CaloGeometry* cgeo = calogeom.product();
103  const HcalGeometry* hgeom =
104  static_cast<const HcalGeometry*>(cgeo->getSubdetectorGeometry(DetId::Hcal, HcalForward));
105 
106  //reset the bad channel containers
107  badChHE_.clear();
108  badChHF_.clear();
109 
110  //fill bad cells HE (use eta, phi)
111  const std::vector<DetId>& cellsHE = hgeom->getValidDetIds(DetId::Detector::Hcal, HcalEndcap);
112  for (auto id : cellsHE) {
113  float currentRespCorr = gtCond->getHcalRespCorr(id)->getValue();
114  float buggedRespCorr = buggedRespCorrs.getValues(id)->getValue();
115  if (buggedRespCorr == 0.)
116  continue;
117 
118  float ratio = currentRespCorr / buggedRespCorr;
119  if (std::abs(ratio - 1.f) > 0.001) {
120  GlobalPoint pos = hgeom->getPosition(id);
121  badChHE_.push_back(HEChannel(pos.eta(), pos.phi(), ratio));
122  }
123  }
124 
125  //fill bad cells HF (use ieta, iphi)
126  auto const& cellsHF = hgeom->getValidDetIds(DetId::Detector::Hcal, HcalForward);
127  for (auto id : cellsHF) {
128  float currentRespCorr = gtCond->getHcalRespCorr(id)->getValue();
129  float buggedRespCorr = buggedRespCorrs.getValues(id)->getValue();
130  if (buggedRespCorr == 0.)
131  continue;
132 
133  float ratio = currentRespCorr / buggedRespCorr;
134  if (std::abs(ratio - 1.f) > 0.001) {
135  HcalDetId dummyId(id);
136  badChHF_.push_back(HFChannel(dummyId.ieta(), dummyId.iphi(), dummyId.depth(), ratio));
137  }
138  }
139  }
140 }
141 
142 void PFCandidateRecalibrator::endRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {}
143 
145  //access calogeometry
147  iSetup.get<CaloGeometryRecord>().get(calogeom);
148  const CaloGeometry* cgeo = calogeom.product();
149  const HcalGeometry* hgeom = static_cast<const HcalGeometry*>(cgeo->getSubdetectorGeometry(DetId::Hcal, HcalForward));
150 
151  //access PFCandidates
153  iEvent.getByToken(pfcandidates_, pfcandidates);
154 
155  int nPfCand = pfcandidates->size();
156  std::unique_ptr<reco::PFCandidateCollection> copy(new reco::PFCandidateCollection());
157  std::unique_ptr<reco::PFCandidateCollection> discarded(new reco::PFCandidateCollection());
158  copy->reserve(nPfCand);
159  std::vector<int> oldToNew(nPfCand), newToOld, badToOld;
160  newToOld.reserve(nPfCand);
161 
162  LogDebug("PFCandidateRecalibrator") << "NEW EV:";
163 
164  //loop over PFCandidates
165  int i = -1;
166  for (const reco::PFCandidate& pf : *pfcandidates) {
167  ++i;
168  float absEta = std::abs(pf.eta());
169 
170  //deal with HE
171  if (pf.particleId() == reco::PFCandidate::ParticleType::h0 &&
172  !badChHE_.empty() && //don't touch if no miscalibration is found
173  absEta > 1.4 && absEta < 3.) {
174  bool toKill = false;
175  for (auto const& badIt : badChHE_)
176  if (reco::deltaR2(pf.eta(), pf.phi(), badIt.eta, badIt.phi) < 0.07)
177  toKill = true;
178 
179  if (toKill) {
180  discarded->push_back(pf);
181  oldToNew[i] = (-discarded->size());
182  badToOld.push_back(i);
183  continue;
184  } else {
185  copy->push_back(pf);
186  oldToNew[i] = (copy->size());
187  newToOld.push_back(i);
188  }
189  }
190  //deal with HF
191  else if ((pf.particleId() == reco::PFCandidate::ParticleType::h_HF ||
192  pf.particleId() == reco::PFCandidate::ParticleType::egamma_HF) &&
193  !badChHF_.empty() && //don't touch if no miscalibration is found
194  absEta >= 3.) {
195  const math::XYZPointF& ecalPoint = pf.positionAtECALEntrance();
196  GlobalPoint ecalGPoint(ecalPoint.X(), ecalPoint.Y(), ecalPoint.Z());
197  HcalDetId closestDetId(hgeom->getClosestCell(ecalGPoint));
198 
199  if (closestDetId.subdet() == HcalForward) {
200  HcalDetId hDetId(closestDetId.subdet(), closestDetId.ieta(), closestDetId.iphi(), 1); //depth1
201 
202  //raw*calEnergy() is the same as *calEnergy() - no corrections are done for HF
203  float longE = pf.rawEcalEnergy() + pf.rawHcalEnergy() / 2.; //depth1
204  float shortE = pf.rawHcalEnergy() / 2.; //depth2
205 
206  float ecalEnergy = pf.rawEcalEnergy();
207  float hcalEnergy = pf.rawHcalEnergy();
208  float totEnergy = ecalEnergy + hcalEnergy;
209  float totEnergyOrig = totEnergy;
210 
211  bool toKill = false;
212 
213  for (auto const& badIt : badChHF_) {
214  if (hDetId.ieta() == badIt.ieta && hDetId.iphi() == badIt.iphi) {
215  LogDebug("PFCandidateRecalibrator")
216  << "==> orig en (tot,H,E): " << pf.energy() << " " << pf.rawHcalEnergy() << " " << pf.rawEcalEnergy();
217  if (badIt.depth == 1) //depth1
218  {
219  longE *= badIt.ratio;
220  ecalEnergy = ((longE - shortE) > 0.) ? (longE - shortE) : 0.;
221  totEnergy = ecalEnergy + hcalEnergy;
222  } else //depth2
223  {
224  shortE *= badIt.ratio;
225  hcalEnergy = 2 * shortE;
226  ecalEnergy = ((longE - shortE) > 0.) ? (longE - shortE) : 0.;
227  totEnergy = ecalEnergy + hcalEnergy;
228  }
229  //kill candidate if goes below thr
230  if ((pf.particleId() == reco::PFCandidate::ParticleType::h_HF && shortE < shortFibreThr_) ||
231  (pf.particleId() == reco::PFCandidate::ParticleType::egamma_HF && longE < longFibreThr_))
232  toKill = true;
233 
234  LogDebug("PFCandidateRecalibrator") << "====> ieta,iphi,depth: " << badIt.ieta << " " << badIt.iphi << " "
235  << badIt.depth << " corr: " << badIt.ratio;
236  LogDebug("PFCandidateRecalibrator")
237  << "====> recal en (tot,H,E): " << totEnergy << " " << hcalEnergy << " " << ecalEnergy;
238  }
239  }
240 
241  if (toKill) {
242  discarded->push_back(pf);
243  oldToNew[i] = (-discarded->size());
244  badToOld.push_back(i);
245 
246  LogDebug("PFCandidateRecalibrator") << "==> KILLED ";
247  } else {
248  copy->push_back(pf);
249  oldToNew[i] = (copy->size());
250  newToOld.push_back(i);
251 
252  copy->back().setHcalEnergy(hcalEnergy, hcalEnergy);
253  copy->back().setEcalEnergy(ecalEnergy, ecalEnergy);
254 
255  float scalingFactor = totEnergy / totEnergyOrig;
256  math::XYZTLorentzVector recalibP4 = pf.p4() * scalingFactor;
257  copy->back().setP4(recalibP4);
258 
259  LogDebug("PFCandidateRecalibrator") << "====> stored en (tot,H,E): " << copy->back().energy() << " "
260  << copy->back().hcalEnergy() << " " << copy->back().ecalEnergy();
261  }
262  } else {
263  copy->push_back(pf);
264  oldToNew[i] = (copy->size());
265  newToOld.push_back(i);
266  }
267  } else {
268  copy->push_back(pf);
269  oldToNew[i] = (copy->size());
270  newToOld.push_back(i);
271  }
272  }
273 
274  // Now we put things in the event
276  edm::OrphanHandle<reco::PFCandidateCollection> badpf = iEvent.put(std::move(discarded), "discarded");
277 
278  std::unique_ptr<edm::ValueMap<reco::PFCandidateRef>> pf2pf(new edm::ValueMap<reco::PFCandidateRef>());
280  std::vector<reco::PFCandidateRef> refs;
281  refs.reserve(nPfCand);
282 
283  // old to new
284  for (auto iOldToNew : oldToNew) {
285  if (iOldToNew > 0) {
286  refs.push_back(reco::PFCandidateRef(newpf, iOldToNew - 1));
287  } else {
288  refs.push_back(reco::PFCandidateRef(badpf, -iOldToNew - 1));
289  }
290  }
291  filler.insert(pfcandidates, refs.begin(), refs.end());
292  // new good to old
293  refs.clear();
294  for (int i : newToOld) {
295  refs.push_back(reco::PFCandidateRef(pfcandidates, i));
296  }
297  filler.insert(newpf, refs.begin(), refs.end());
298  // new bad to old
299  refs.clear();
300  for (int i : badToOld) {
301  refs.push_back(reco::PFCandidateRef(pfcandidates, i));
302  }
303  filler.insert(badpf, refs.begin(), refs.end());
304  // done
305  filler.fill();
306  iEvent.put(std::move(pf2pf));
307 }
308 
311 
312  desc.add<edm::InputTag>("pfcandidates", edm::InputTag("particleFlow"));
313  desc.add<double>("shortFibreThr", 1.4);
314  desc.add<double>("longFibreThr", 1.4);
315 
316  descriptions.add("pfCandidateRecalibrator", desc);
317 }
318 
ConfigurationDescriptions.h
edm::ESWatcher::check
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
edm::ESHandle::product
T const * product() const
Definition: ESHandle.h:86
HcalRespCorrs
Definition: HcalRespCorrs.h:17
HcalCalibrations.h
mps_fire.i
i
Definition: mps_fire.py:428
MessageLogger.h
HcalCondObjectContainerBase::setTopo
void setTopo(const HcalTopology *topo)
Definition: HcalCondObjectContainerBase.cc:17
edm::ESWatcher< HcalRecNumberingRecord >
filterCSVwithJSON.copy
copy
Definition: filterCSVwithJSON.py:36
ESHandle.h
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
HFChannel::HFChannel
HFChannel(int ieta, int iphi, int depth, float ratio)
Definition: PFCandidateRecalibrator.cc:47
HcalDetId::iphi
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
PFCandidate.h
edm::Run
Definition: Run.h:45
edm::EDGetTokenT< reco::PFCandidateCollection >
CaloGeometryRecord
Definition: CaloGeometryRecord.h:30
edm
HLT enums.
Definition: AlignableModifier.h:19
HEChannel::ratio
float ratio
Definition: PFCandidateRecalibrator.cc:39
PFCandidateRecalibrator::endRun
void endRun(const edm::Run &iRun, edm::EventSetup const &iSetup) override
Definition: PFCandidateRecalibrator.cc:142
pos
Definition: PixelAliasList.h:18
HcalTopology
Definition: HcalTopology.h:26
DetId::Hcal
Definition: DetId.h:28
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
CaloGeometry::getSubdetectorGeometry
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:34
EDProducer.h
HcalDetId::depth
constexpr int depth() const
get the tower depth
Definition: HcalDetId.h:164
PFCandidateRecalibrator::hcalDbWatcher_
edm::ESWatcher< HcalRecNumberingRecord > hcalDbWatcher_
Definition: PFCandidateRecalibrator.cc:62
HFChannel
Definition: PFCandidateRecalibrator.cc:42
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:46
Association.h
PFCandidateRecalibrator::badChHE_
std::vector< HEChannel > badChHE_
Definition: PFCandidateRecalibrator.cc:67
edm::Handle
Definition: AssociativeIterator.h:50
HcalGeometry.h
HcalGeometry::getValidDetIds
const std::vector< DetId > & getValidDetIds(DetId::Detector det=DetId::Detector(0), int subdet=0) const override
Get a list of valid detector ids (for the given subdetector)
Definition: HcalGeometry.cc:76
edm::Ref< PFCandidateCollection >
MakerMacros.h
CaloGeometry
Definition: CaloGeometry.h:21
edm::EventSetup::get
T get() const
Definition: EventSetup.h:87
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
PFCandidateRecalibrator::PFCandidateRecalibrator
PFCandidateRecalibrator(const edm::ParameterSet &)
Definition: PFCandidateRecalibrator.cc:74
HEChannel::eta
float eta
Definition: PFCandidateRecalibrator.cc:37
PFCandidateRecalibrator::shortFibreThr_
float shortFibreThr_
Definition: PFCandidateRecalibrator.cc:70
edm::ESHandle< HcalDbService >
packedPFCandidateRefMixer_cfi.pf2pf
pf2pf
Definition: packedPFCandidateRefMixer_cfi.py:5
PFCandidateRecalibrator::~PFCandidateRecalibrator
~PFCandidateRecalibrator() override
Definition: PFCandidateRecalibrator.cc:53
PFCandidateRecalibrator::hcalRCWatcher_
edm::ESWatcher< HcalRespCorrsRcd > hcalRCWatcher_
Definition: PFCandidateRecalibrator.cc:63
HcalDbRecord.h
Point3DBase< float, GlobalTag >
ParameterSetDescription.h
HcalRecNumberingRecord
Definition: HcalRecNumberingRecord.h:23
particleFlowDisplacedVertex_cfi.ratio
ratio
Definition: particleFlowDisplacedVertex_cfi.py:93
CaloGeometryRecord.h
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
HcalRespCorr::getValue
float getValue() const
Definition: HcalRespCorr.h:19
CaloSubdetectorGeometry.h
HcalDetId::ieta
constexpr int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
edm::ParameterSet
Definition: ParameterSet.h:47
HcalGeometry::getPosition
GlobalPoint getPosition(const DetId &id) const
Definition: HcalGeometry.cc:179
Event.h
PFCandidateRecalibrator::badChHF_
std::vector< HFChannel > badChHF_
Definition: PFCandidateRecalibrator.cc:68
trigObjTnPSource_cfi.filler
filler
Definition: trigObjTnPSource_cfi.py:21
reco::deltaR2
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
HcalDbService::getHcalRespCorr
const HcalRespCorr * getHcalRespCorr(const HcalGenericDetId &fId) const
Definition: HcalDbService.cc:270
HcalDetId
Definition: HcalDetId.h:12
iEvent
int iEvent
Definition: GenABIO.cc:224
HEChannel::HEChannel
HEChannel(float eta, float phi, float ratio)
Definition: PFCandidateRecalibrator.cc:40
HEChannel::phi
float phi
Definition: PFCandidateRecalibrator.cc:38
HFChannel::iphi
int iphi
Definition: PFCandidateRecalibrator.cc:44
edm::stream::EDProducer
Definition: EDProducer.h:36
edm::EventSetup
Definition: EventSetup.h:58
HcalRespCorrsRcd
Definition: HcalRespCorrsRcd.h:27
get
#define get
l1t::PFCandidateCollection
std::vector< l1t::PFCandidate > PFCandidateCollection
Definition: PFCandidate.h:57
HEChannel
Take:
Definition: PFCandidateRecalibrator.cc:36
HFChannel::ieta
int ieta
Definition: PFCandidateRecalibrator.cc:43
PFCandidateRecalibrator::pfcandidates_
edm::EDGetTokenT< reco::PFCandidateCollection > pfcandidates_
Definition: PFCandidateRecalibrator.cc:65
HFChannel::depth
int depth
Definition: PFCandidateRecalibrator.cc:45
HcalForward
Definition: HcalAssistant.h:36
HcalTopology.h
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::OrphanHandle
Definition: EDProductfwd.h:39
HcalEndcap
Definition: HcalAssistant.h:34
Frameworkfwd.h
packedPFCandidateRefMixer_cfi.pf
pf
Definition: packedPFCandidateRefMixer_cfi.py:4
ESWatcher.h
math::XYZTLorentzVector
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
edm::ValueMap
Definition: ValueMap.h:107
CaloGeometry.h
reco::PFCandidateCollection
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
Definition: PFCandidateFwd.h:12
OniaPhotonConversionProducer_cfi.pfcandidates
pfcandidates
Definition: OniaPhotonConversionProducer_cfi.py:29
PFCandidateRecalibrator::beginRun
void beginRun(const edm::Run &iRun, edm::EventSetup const &iSetup) override
Definition: PFCandidateRecalibrator.cc:83
PFCandidateRecalibrator::longFibreThr_
float longFibreThr_
Definition: PFCandidateRecalibrator.cc:71
PFCandidateRecalibrator::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: PFCandidateRecalibrator.cc:309
HcalDbService.h
HFChannel::ratio
float ratio
Definition: PFCandidateRecalibrator.cc:46
reco::PFCandidate
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
PFCandidateRecalibrator::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: PFCandidateRecalibrator.cc:144
edm::helper::Filler
Definition: ValueMap.h:22
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HcalDbRecord
Definition: HcalDbRecord.h:30
View.h
ParameterSet.h
math::XYZPointF
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float > > XYZPointF
point in space with cartesian internal representation
Definition: Point3D.h:10
edm::Event
Definition: Event.h:73
HcalGeometry
Definition: HcalGeometry.h:17
PFCandidateRecalibrator
Definition: PFCandidateRecalibrator.cc:50
edm::InputTag
Definition: InputTag.h:15
PFCandidateFwd.h
HcalGeometry::getClosestCell
DetId getClosestCell(const GlobalPoint &r) const override
Definition: HcalGeometry.cc:107