CMS 3D CMS Logo

AntiElectronDeadECAL.cc
Go to the documentation of this file.
2 
17 
19  : minStatus_(cfg.getParameter<uint32_t>("minStatus")),
20  dR2_(std::pow(cfg.getParameter<double>("dR"), 2)),
21  extrapolateToECalEntrance_(cfg.getParameter<bool>("extrapolateToECalEntrance")),
22  verbosity_(cfg.getParameter<int>("verbosity")),
23  isFirstEvent_(true) {}
24 
26 
28  updateBadTowers(es);
30 }
31 
32 namespace {
33  template <class Id>
34  void loopXtals(std::map<uint32_t, unsigned>& nBadCrystals,
35  std::map<uint32_t, unsigned>& maxStatus,
36  std::map<uint32_t, double>& sumEta,
37  std::map<uint32_t, double>& sumPhi,
38  const EcalChannelStatus* channelStatus,
39  const CaloGeometry* caloGeometry,
40  const EcalTrigTowerConstituentsMap* ttMap,
41  unsigned minStatus,
42  const uint16_t statusMask) {
43  // NOTE: modified version of SUSY CAF code
44  // UserCode/SusyCAF/plugins/SusyCAF_EcalDeadChannels.cc
45  for (int i = 0; i < Id::kSizeForDenseIndexing; ++i) {
46  Id id = Id::unhashIndex(i);
47  if (id == Id(0))
48  continue;
49  EcalChannelStatusMap::const_iterator it = channelStatus->getMap().find(id.rawId());
50  unsigned status = (it == channelStatus->end()) ? 0 : (it->getStatusCode() & statusMask);
51  if (status >= minStatus) {
52  const GlobalPoint& point = caloGeometry->getPosition(id);
53  uint32_t key = ttMap->towerOf(id);
54  maxStatus[key] = std::max(status, maxStatus[key]);
55  ++nBadCrystals[key];
56  sumEta[key] += point.eta();
57  sumPhi[key] += point.phi();
58  }
59  }
60  }
61 } // namespace
62 
64  // NOTE: modified version of SUSY CAF code
65  // UserCode/SusyCAF/plugins/SusyCAF_EcalDeadChannels.cc
66 
69  return;
70 
72  es.get<EcalChannelStatusRcd>().get(channelStatus);
73 
74  edm::ESHandle<CaloGeometry> caloGeometry;
75  es.get<CaloGeometryRecord>().get(caloGeometry);
76 
78  es.get<IdealGeometryRecord>().get(ttMap);
79 
80  std::map<uint32_t, unsigned> nBadCrystals, maxStatus;
81  std::map<uint32_t, double> sumEta, sumPhi;
82 
83  loopXtals<EBDetId>(nBadCrystals,
84  maxStatus,
85  sumEta,
86  sumPhi,
87  channelStatus.product(),
88  caloGeometry.product(),
89  ttMap.product(),
90  minStatus_,
91  statusMask_);
92  loopXtals<EEDetId>(nBadCrystals,
93  maxStatus,
94  sumEta,
95  sumPhi,
96  channelStatus.product(),
97  caloGeometry.product(),
98  ttMap.product(),
99  minStatus_,
100  statusMask_);
101 
102  badTowers_.clear();
103  for (auto it : nBadCrystals) {
104  uint32_t key = it.first;
105  badTowers_.push_back(TowerInfo(key, it.second, maxStatus[key], sumEta[key] / it.second, sumPhi[key] / it.second));
106  }
107 
108  isFirstEvent_ = false;
109 }
110 
112  bool isNearBadTower = false;
113  double tau_eta = tau->eta();
114  double tau_phi = tau->phi();
115  const reco::Candidate* leadChargedHadron = nullptr;
117  const reco::PFTau* pfTau = dynamic_cast<const reco::PFTau*>(tau);
118  if (pfTau != nullptr) {
119  leadChargedHadron = pfTau->leadChargedHadrCand().isNonnull() ? pfTau->leadChargedHadrCand().get() : nullptr;
120  } else {
121  const pat::Tau* patTau = dynamic_cast<const pat::Tau*>(tau);
122  if (patTau != nullptr) {
123  leadChargedHadron = patTau->leadChargedHadrCand().isNonnull() ? patTau->leadChargedHadrCand().get() : nullptr;
124  }
125  }
126  }
127  if (leadChargedHadron != nullptr) {
128  bool success = false;
129  reco::Candidate::Point positionAtECalEntrance = positionAtECalEntrance_(leadChargedHadron, success);
130  if (success) {
131  tau_eta = positionAtECalEntrance.eta();
132  tau_phi = positionAtECalEntrance.phi();
133  }
134  }
135  if (verbosity_) {
136  edm::LogPrint("TauAgainstEleDeadECAL") << "<AntiElectronDeadECal::operator()>:";
137  edm::LogPrint("TauAgainstEleDeadECAL") << " #badTowers = " << badTowers_.size();
138  if (leadChargedHadron != nullptr) {
139  edm::LogPrint("TauAgainstEleDeadECAL")
140  << " leadChargedHadron (" << leadChargedHadron->pdgId() << "): Pt = " << leadChargedHadron->pt()
141  << ", eta at ECAL (vtx) = " << tau_eta << " (" << leadChargedHadron->eta() << ")"
142  << ", phi at ECAL (vtx) = " << tau_phi << " (" << leadChargedHadron->phi() << ")";
143  } else {
144  edm::LogPrint("TauAgainstEleDeadECAL")
145  << " tau: Pt = " << tau->pt() << ", eta at vtx = " << tau_eta << ", phi at vtx = " << tau_phi;
146  }
147  }
148  for (auto const& badTower : badTowers_) {
149  if (deltaR2(badTower.eta_, badTower.phi_, tau_eta, tau_phi) < dR2_) {
150  if (verbosity_) {
151  edm::LogPrint("TauAgainstEleDeadECAL")
152  << " matches badTower: eta = " << badTower.eta_ << ", phi = " << badTower.phi_;
153  }
154  isNearBadTower = true;
155  break;
156  }
157  }
158  return isNearBadTower;
159 }
PositionAtECalEntranceComputer positionAtECalEntrance_
edm::ESWatcher< CaloGeometryRecord > caloGeometryWatcher_
void beginEvent(const edm::EventSetup &)
const self & getMap() const
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:159
const bool extrapolateToECalEntrance_
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
bool operator()(const reco::Candidate *tau) const
edm::ESWatcher< IdealGeometryRecord > idealGeometryWatcher_
void beginEvent(const edm::EventSetup &)
EcalTrigTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
std::vector< TowerInfo > badTowers_
edm::ESWatcher< EcalChannelStatusRcd > channelStatusWatcher_
const CandidatePtr & leadChargedHadrCand() const
Definition: PFTau.cc:67
virtual int pdgId() const =0
PDG identifier.
void updateBadTowers(const edm::EventSetup &)
GlobalPoint getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:74
const reco::CandidatePtr leadChargedHadrCand() const
Analysis-level tau class.
Definition: Tau.h:56
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:168
AntiElectronDeadECAL(const edm::ParameterSet &)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
virtual double eta() const =0
momentum pseudorapidity
virtual double pt() const =0
transverse momentum
std::vector< Item >::const_iterator const_iterator
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:52
T eta() const
Definition: PV3DBase.h:76
static const uint16_t statusMask_
T get() const
Definition: EventSetup.h:71
const_iterator find(uint32_t rawId) const
math::XYZPoint Point
point in the space
Definition: Candidate.h:41
const_iterator end() const
T const * product() const
Definition: ESHandle.h:86
virtual double phi() const =0
momentum azimuthal angle
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5