CMS 3D CMS Logo

SiStripBadModuleConfigurableFakeESSource.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CalibTracker/SiStripESProducers
4 // Class: SiStripBadModuleConfigurableFakeESSource
5 //
14 // system include files
15 #include <memory>
16 
17 // user include files
20 
26 
28 
30 public:
33 
35  const edm::IOVSyncValue& iov,
36  edm::ValidityInterval& iValidity) override;
37 
38  typedef std::unique_ptr<SiStripBadStrip> ReturnType;
40 
41 private:
42  using Parameters = std::vector<edm::ParameterSet>;
46  bool m_doByAPVs;
49 
50  std::vector<uint32_t> selectDetectors(const TrackerTopology* tTopo, const std::vector<uint32_t>& detIds) const;
51  std::vector<std::pair<uint32_t, std::vector<uint32_t>>> selectAPVs() const;
52 };
53 
56 
58  : trackTopoToken_(setWhatProduced(this).consumes()) {
59  findingRecord<SiStripBadModuleRcd>();
60 
61  m_badComponentList = iConfig.getUntrackedParameter<Parameters>("BadComponentList");
62  m_doByAPVs = iConfig.getUntrackedParameter<bool>("doByAPVs", false);
63  m_badAPVsList = iConfig.getUntrackedParameter<Parameters>("BadAPVList");
64  m_printDebug = iConfig.getUntrackedParameter<bool>("printDebug", false);
66 }
67 
69 
71  const edm::IOVSyncValue& iov,
72  edm::ValidityInterval& iValidity) {
73  iValidity = edm::ValidityInterval{iov.beginOfTime(), iov.endOfTime()};
74 }
75 
76 // ------------ method called to produce the data ------------
78  const SiStripBadModuleRcd& iRecord) {
79  using namespace edm::es;
80 
81  TrackerTopology const& tTopo = iRecord.get(trackTopoToken_);
82 
83  auto quality = std::make_unique<SiStripQuality>(m_detInfo);
84 
85  if (!m_doByAPVs) {
86  std::vector<uint32_t> selDetIds{selectDetectors(&tTopo, m_detInfo.getAllDetIds())};
87  edm::LogInfo("SiStripQualityConfigurableFakeESSource")
88  << "[produce] number of selected dets to be removed " << selDetIds.size() << std::endl;
89 
90  std::stringstream ss;
91  for (const auto selId : selDetIds) {
92  SiStripQuality::InputVector theSiStripVector;
93 
94  unsigned short firstBadStrip{0};
95  unsigned short NconsecutiveBadStrips = m_detInfo.getNumberOfApvsAndStripLength(selId).first * 128;
96  unsigned int theBadStripRange{quality->encode(firstBadStrip, NconsecutiveBadStrips)};
97 
98  if (m_printDebug) {
99  ss << "detid " << selId << " \t"
100  << " firstBadStrip " << firstBadStrip << "\t "
101  << " NconsecutiveBadStrips " << NconsecutiveBadStrips << "\t "
102  << " packed integer " << std::hex << theBadStripRange << std::dec << std::endl;
103  }
104 
105  theSiStripVector.push_back(theBadStripRange);
106 
107  if (!quality->put(selId, SiStripBadStrip::Range{theSiStripVector.begin(), theSiStripVector.end()})) {
108  edm::LogError("SiStripQualityConfigurableFakeESSource") << "[produce] detid already exists";
109  }
110  }
111  if (m_printDebug) {
112  edm::LogInfo("SiStripQualityConfigurableFakeESSource") << ss.str();
113  }
114  quality->cleanUp();
115  //quality->fillBadComponents();
116  } else {
117  std::vector<std::pair<uint32_t, std::vector<uint32_t>>> selAPVs{selectAPVs()};
118  edm::LogInfo("SiStripQualityConfigurableFakeESSource")
119  << "[produce] number of selected dets to be removed " << selAPVs.size() << std::endl;
120 
121  std::stringstream ss;
122  for (const auto& selId : selAPVs) {
123  SiStripQuality::InputVector theSiStripVector;
124  auto the_detid = selId.first;
125 
126  for (const auto apv : selId.second) {
127  unsigned short firstBadStrip = apv * 128;
128  unsigned short NconsecutiveBadStrips = 128;
129  unsigned int theBadStripRange{quality->encode(firstBadStrip, NconsecutiveBadStrips)};
130 
131  if (m_printDebug) {
132  ss << "detid " << the_detid << " \t"
133  << " firstBadStrip " << firstBadStrip << "\t "
134  << " NconsecutiveBadStrips " << NconsecutiveBadStrips << "\t "
135  << " packed integer " << std::hex << theBadStripRange << std::dec << std::endl;
136  }
137 
138  theSiStripVector.push_back(theBadStripRange);
139  }
140 
141  if (!quality->put(the_detid, SiStripBadStrip::Range{theSiStripVector.begin(), theSiStripVector.end()})) {
142  edm::LogError("SiStripQualityConfigurableFakeESSource") << "[produce] detid already exists";
143  }
144  } // loop on the packed list of detid/apvs
145 
146  if (m_printDebug) {
147  edm::LogInfo("SiStripQualityConfigurableFakeESSource") << ss.str();
148  }
149  quality->cleanUp();
150 
151  } // do it by APVs
152 
153  if (m_printDebug) {
154  std::stringstream ss1;
155  for (const auto& badComp : quality->getBadComponentList()) {
156  ss1 << "bad module " << badComp.detid << " " << badComp.BadModule << "\n";
157  }
158  edm::LogInfo("SiStripQualityConfigurableFakeESSource") << ss1.str();
159  }
160 
161  return quality;
162 }
163 
164 namespace {
165  bool _isSel(uint32_t requested,
166  uint32_t i) { // internal helper: accept all i if requested is 0, otherwise require match
167  return (requested == 0) || (requested == i);
168  }
169 
170  SiStripDetId::SubDetector subDetFromString(const std::string& subDetStr) {
172  if (subDetStr == "TIB")
173  subDet = SiStripDetId::TIB;
174  else if (subDetStr == "TID")
175  subDet = SiStripDetId::TID;
176  else if (subDetStr == "TOB")
177  subDet = SiStripDetId::TOB;
178  else if (subDetStr == "TEC")
179  subDet = SiStripDetId::TEC;
180  return subDet;
181  }
182 } // namespace
183 
184 std::vector<std::pair<uint32_t, std::vector<uint32_t>>> SiStripBadModuleConfigurableFakeESSource::selectAPVs() const {
185  std::vector<std::pair<uint32_t, std::vector<uint32_t>>> selList;
186  selList.clear();
187 
188  for (const auto& badAPV : m_badAPVsList) {
189  const uint32_t det{badAPV.getParameter<uint32_t>("DetId")};
190  std::vector<uint32_t> apvs{badAPV.getParameter<std::vector<uint32_t>>("APVs")};
191  auto pair = std::make_pair(det, apvs);
192  selList.push_back(pair);
193  }
194  return selList;
195 }
196 
198  const TrackerTopology* tTopo, const std::vector<uint32_t>& detIds) const {
199  std::vector<uint32_t> selList;
200  std::stringstream ss;
201  for (const auto& badComp : m_badComponentList) {
202  const std::string subDetStr{badComp.getParameter<std::string>("SubDet")};
203  if (m_printDebug)
204  ss << "Bad SubDet " << subDetStr << " \t";
205  const SiStripDetId::SubDetector subDet = subDetFromString(subDetStr);
206 
207  const std::vector<uint32_t> genericBadDetIds{
208  badComp.getUntrackedParameter<std::vector<uint32_t>>("detidList", std::vector<uint32_t>())};
209  const bool anySubDet{!genericBadDetIds.empty()};
210 
211  std::cout << "genericBadDetIds.size() = " << genericBadDetIds.size() << std::endl;
212 
213  using DetIdIt = std::vector<uint32_t>::const_iterator;
214  const DetIdIt beginDetIt = std::lower_bound(
215  detIds.begin(), detIds.end(), DetId(DetId::Tracker, anySubDet ? SiStripDetId::TIB : subDet).rawId());
216  const DetIdIt endDetIt = std::lower_bound(
217  detIds.begin(), detIds.end(), DetId(DetId::Tracker, anySubDet ? SiStripDetId::TEC + 1 : subDet + 1).rawId());
218 
219  if (anySubDet) {
220  std::copy_if(beginDetIt, endDetIt, std::back_inserter(selList), [&genericBadDetIds](uint32_t detId) {
221  std::cout << "AnySubDet" << detId << std::endl;
222  return std::find(genericBadDetIds.begin(), genericBadDetIds.end(), detId) != genericBadDetIds.end();
223  });
224  } else {
225  switch (subDet) {
226  case SiStripDetId::TIB:
227  std::copy_if(beginDetIt, endDetIt, std::back_inserter(selList), [tTopo, &badComp](uint32_t detectorId) {
228  const DetId detId{detectorId};
229  return ((detId.subdetId() == SiStripDetId::TIB) &&
230  _isSel(badComp.getParameter<uint32_t>("layer"), tTopo->tibLayer(detId)) &&
231  _isSel(badComp.getParameter<uint32_t>("bkw_frw"), tTopo->tibIsZPlusSide(detId) ? 2 : 1) &&
232  _isSel(badComp.getParameter<uint32_t>("int_ext"), tTopo->tibIsInternalString(detId) ? 1 : 2) &&
233  _isSel(badComp.getParameter<uint32_t>("ster"),
234  tTopo->tibIsStereo(detId) ? 1 : (tTopo->tibIsRPhi(detId) ? 2 : -1)) &&
235  _isSel(badComp.getParameter<uint32_t>("string_"), tTopo->tibString(detId)) &&
236  _isSel(badComp.getParameter<uint32_t>("detid"), detId.rawId()));
237  });
238  break;
239  case SiStripDetId::TID:
240  std::copy_if(beginDetIt, endDetIt, std::back_inserter(selList), [tTopo, &badComp](uint32_t detectorId) {
241  const DetId detId{detectorId};
242  return ((detId.subdetId() == SiStripDetId::TID) &&
243  _isSel(badComp.getParameter<uint32_t>("wheel"), tTopo->tidWheel(detId)) &&
244  _isSel(badComp.getParameter<uint32_t>("side"), tTopo->tidIsZPlusSide(detId) ? 2 : 1) &&
245  _isSel(badComp.getParameter<uint32_t>("ster"),
246  tTopo->tidIsStereo(detId) ? 1 : (tTopo->tidIsRPhi(detId) ? 2 : -1)) &&
247  _isSel(badComp.getParameter<uint32_t>("ring"), tTopo->tidRing(detId)) &&
248  _isSel(badComp.getParameter<uint32_t>("detid"), detId.rawId()));
249  });
250  break;
251  case SiStripDetId::TOB:
252  std::copy_if(beginDetIt, endDetIt, std::back_inserter(selList), [tTopo, &badComp](uint32_t detectorId) {
253  const DetId detId{detectorId};
254  return ((detId.subdetId() == SiStripDetId::TOB) &&
255  _isSel(badComp.getParameter<uint32_t>("layer"), tTopo->tobLayer(detId)) &&
256  _isSel(badComp.getParameter<uint32_t>("bkw_frw"), tTopo->tobIsZPlusSide(detId) ? 2 : 1) &&
257  _isSel(badComp.getParameter<uint32_t>("ster"),
258  tTopo->tobIsStereo(detId) ? 1 : (tTopo->tobIsRPhi(detId) ? 2 : -1)) &&
259  _isSel(badComp.getParameter<uint32_t>("rod"), tTopo->tobRod(detId)) &&
260  _isSel(badComp.getParameter<uint32_t>("detid"), detId.rawId()));
261  });
262  break;
263  case SiStripDetId::TEC:
264  std::copy_if(beginDetIt, endDetIt, std::back_inserter(selList), [tTopo, &badComp](uint32_t detectorId) {
265  const DetId detId{detectorId};
266  return ((detId.subdetId() == SiStripDetId::TEC) &&
267  _isSel(badComp.getParameter<uint32_t>("wheel"), tTopo->tecWheel(detId)) &&
268  _isSel(badComp.getParameter<uint32_t>("side"), tTopo->tecIsZPlusSide(detId) ? 2 : 1) &&
269  _isSel(badComp.getParameter<uint32_t>("ster"), tTopo->tecIsStereo(detId) ? 1 : 2) &&
270  _isSel(badComp.getParameter<uint32_t>("petal_bkw_frw"), tTopo->tecIsFrontPetal(detId) ? 2 : 2) &&
271  _isSel(badComp.getParameter<uint32_t>("petal"), tTopo->tecPetalNumber(detId)) &&
272  _isSel(badComp.getParameter<uint32_t>("ring"), tTopo->tecRing(detId)) &&
273  _isSel(badComp.getParameter<uint32_t>("detid"), detId.rawId()));
274  });
275  break;
276  default:
277  break;
278  }
279  }
280  }
281  if (m_printDebug) {
282  edm::LogInfo("SiStripBadModuleGenerator") << ss.str();
283  }
284  return selList;
285 }
286 
287 //define this as a plug-in
unsigned int tecPetalNumber(const DetId &id) const
std::vector< std::pair< uint32_t, std::vector< uint32_t > > > selectAPVs() const
bool tidIsZPlusSide(const DetId &id) const
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
unsigned int tobLayer(const DetId &id) const
bool tibIsZPlusSide(const DetId &id) const
std::string fullPath() const
Definition: FileInPath.cc:161
bool tecIsFrontPetal(const DetId &id) const
static constexpr auto TID
Definition: SiStripDetId.h:38
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > trackTopoToken_
unsigned int tidWheel(const DetId &id) const
unsigned int tecWheel(const DetId &id) const
static const IOVSyncValue & endOfTime()
Definition: IOVSyncValue.cc:82
unsigned int tibString(const DetId &id) const
std::vector< uint32_t > selectDetectors(const TrackerTopology *tTopo, const std::vector< uint32_t > &detIds) const
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
unsigned int tecRing(const DetId &id) const
ring id
bool tibIsStereo(const DetId &id) const
T getUntrackedParameter(std::string const &, T const &) const
bool tobIsStereo(const DetId &id) const
bool tibIsRPhi(const DetId &id) const
string quality
static const IOVSyncValue & beginOfTime()
Definition: IOVSyncValue.cc:88
static constexpr auto UNKNOWN
Definition: SiStripDetId.h:36
SiStripDetInfo read(std::string filePath)
bool tobIsZPlusSide(const DetId &id) const
static constexpr auto TOB
Definition: SiStripDetId.h:39
bool tobIsRPhi(const DetId &id) const
bool tidIsRPhi(const DetId &id) const
void setIntervalFor(const edm::eventsetup::EventSetupRecordKey &, const edm::IOVSyncValue &iov, edm::ValidityInterval &iValidity) override
Log< level::Info, false > LogInfo
#define DEFINE_FWK_EVENTSETUP_SOURCE(type)
Definition: SourceFactory.h:92
Definition: DetId.h:17
const std::pair< unsigned short, double > getNumberOfApvsAndStripLength(uint32_t detId) const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
bool tecIsZPlusSide(const DetId &id) const
bool tecIsStereo(const DetId &id) const
bool tibIsInternalString(const DetId &id) const
unsigned int tobRod(const DetId &id) const
static constexpr auto TIB
Definition: SiStripDetId.h:37
bool tidIsStereo(const DetId &id) const
std::pair< ContainerIterator, ContainerIterator > Range
unsigned int tidRing(const DetId &id) const
unsigned int tibLayer(const DetId &id) const
ProductT const & get(ESGetToken< ProductT, DepRecordT > const &iToken) const
const std::vector< uint32_t > & getAllDetIds() const noexcept
static constexpr auto TEC
Definition: SiStripDetId.h:40
Container InputVector