CMS 3D CMS Logo

PFBadHcalPseudoClusterProducer.cc
Go to the documentation of this file.
1 // system include files
2 #include <iostream>
3 #include <memory>
4 
5 // user include files
8 
12 
16 
20 
22 
31 
33 
34 
35 using namespace std;
36 using namespace edm;
37 
38 //
39 // class declaration
40 //
41 
43  public:
46 
47  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
48 
49  private:
50  virtual void init(const EventSetup& c) ;
51  void produce(edm::Event&, const edm::EventSetup&) override;
52 
53  bool enabled_;
54  bool debug_;
55 
58  unsigned long long cacheId_quality_, cacheId_geom_;
59  std::vector<reco::PFCluster> badAreasC_;
60  std::vector<reco::PFRecHit> badAreasRH_;
61 };
62 
63 
65  enabled_(ps.getParameter<bool>("enable")),
66  debug_(ps.getUntrackedParameter<bool>("debug",false)),
67  cacheId_quality_(0), cacheId_geom_(0)
68 {
69  produces<std::vector<reco::PFCluster>>();
70  produces<std::vector<reco::PFRecHit>>("hits");
71 }
72 
73 
75 {
76 }
77 
79 {
80  badAreasC_.clear();
81  badAreasRH_.clear();
82 
84  iSetup.get<HcalChannelQualityRcd>().get("withTopo",hQuality_);
85  const HcalChannelQuality & chanquality = *hQuality_;
86 
88  iSetup.get<CaloGeometryRecord>().get(hGeom_);
89  const CaloGeometry& caloGeom = *hGeom_;
92 
94  // histogram the number of bad depths at each ieta, iphi
95  std::map<std::pair<int,int>, int> good, bads;
96  std::map<std::pair<int,int>, std::pair<int,HcalSubdetector>> minDepths;
97  for (const DetId & i : chanquality.getAllChannels()) {
98  if (i.det()!=DetId::Hcal) continue; // not an hcal cell
99  HcalDetId id = HcalDetId(i);
100  if (id.subdet() != HcalBarrel && id.subdet() != HcalEndcap) continue; // we don't deal with HO and HF here
101  int status = chanquality.getValues(id)->getValue();
102  auto tower = std::make_pair(id.ieta(), id.iphi());
103  if (status & statusMask) {
104  bads[tower]++;
105  if (debug_) std::cout << "Channel " << i() << " (subdet " << id.subdet() << ", zside " << id.zside() << ", ieta " << id.ieta() << ", iphi " << id.iphi() << " depth " << id.depth() << " has status " << status << " masked " << (status & statusMask) << std::endl;
106  } else {
107  good[tower]++;
108  }
109  auto & minD = minDepths[tower];
110  if (minD.second == HcalEmpty || minD.first > id.depth()) {
111  minD.first = id.depth();
112  minD.second = id.subdet();
113  }
114  }
115 
116  const float dummyEnergy = 1e-5; // non-zero, but small (even if it shouldn't ever be used)
117  for (const auto & rec : bads) {
118  int ieta = rec.first.first, iphi = rec.first.second, nbad = rec.second, ngood = good[rec.first];
119  auto minDepth = minDepths[rec.first];
120  bool barrel = minDepth.second == HcalBarrel;
121  HcalDetId id(minDepth.second, ieta, iphi, minDepth.first);
122  bool isBad = (nbad > 0 && nbad >= ngood);
123  if (debug_) std::cout << "At ieta " << id.ieta() << ", iphi " << id.iphi() << " I have " << nbad << " bad depths, " << ngood << " good depths. First depth is in " << (barrel ? "HB" : "HE") << " depth " << minDepth.first <<"; " << (isBad ? " MARK BAD": " ignore") << std::endl;
124  if (!isBad) continue;
126  // make a PF RecHit
127  std::shared_ptr<const CaloCellGeometry> thisCell = (barrel ? hbGeom : heGeom)->getGeometry(id);
128  const GlobalPoint & pos = thisCell->getPosition();
129  badAreasRH_.emplace_back( thisCell, id(), layer, dummyEnergy );
130  // make a PF cluster (but can't add the rechit, as for that I need an edm::Ref)
131  badAreasC_.emplace_back( layer, dummyEnergy, pos.x(), pos.y(), pos.z() );
133  }
134 
135  cacheId_quality_ = iSetup.get<HcalChannelQualityRcd>().cacheIdentifier();
136  cacheId_geom_ = iSetup.get<CaloGeometryRecord>().cacheIdentifier();
137 }
138 
139 // ------------ method called to produce the data ------------
140  void
142 {
143  if (enabled_) {
145  cacheId_geom_ != iSetup.get<CaloGeometryRecord>().cacheIdentifier()) {
146  init(iSetup);
147  }
148  }
149 
150 
151  auto outRH = std::make_unique<std::vector<reco::PFRecHit>>(badAreasRH_);
152  auto rhHandle = iEvent.put(std::move(outRH), "hits");
153 
154  auto outC = std::make_unique<std::vector<reco::PFCluster>>(badAreasC_);
155 
156  // now we go set references
157  for (unsigned int i = 0, n = rhHandle->size(); i < n; ++i) {
158  (*outC)[i].addRecHitFraction( reco::PFRecHitFraction(reco::PFRecHitRef(rhHandle,i), 1.0) );
159  }
160 
161  iEvent.put(std::move(outC));
162 }
163 
166  desc.add<bool>("enable", false)->setComment("activate the module (if false, it doesn't check the DB and produces an empty collection)");
167  desc.addUntracked<bool>("debug", false);
168  descriptions.add("particleFlowBadHcalPseudoCluster", desc);
169 }
170 
171 //define this as a plug-in
173 
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:49
unsigned long long cacheIdentifier() const
std::vector< reco::PFCluster > badAreasC_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
int init
Definition: HydjetWrapper.h:67
T y() const
Definition: PV3DBase.h:63
Fraction of a PFRecHit (rechits can be shared between several PFCluster&#39;s)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const Item * getValues(DetId fId, bool throwOnFail=true) const
CaloGeometry const * getGeometry()
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< DetId > getAllChannels() const
T z() const
Definition: PV3DBase.h:64
edm::ESHandle< HcalChannelQuality > hQuality_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void produce(edm::Event &, const edm::EventSetup &) override
PFBadHcalPseudoClusterProducer(const edm::ParameterSet &)
Layer
layer definition
Definition: PFLayer.h:31
Definition: DetId.h:18
std::vector< reco::PFRecHit > badAreasRH_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HLT enums.
T get() const
Definition: EventSetup.h:71
virtual void init(const EventSetup &c)
uint32_t getValue() const
T x() const
Definition: PV3DBase.h:62
def move(src, dest)
Definition: eostools.py:511