CMS 3D CMS Logo

SiStripCondVisualizer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CondTools/SiStrip
4 // Class: SiStripNoiseVisualizer
5 //
14 //
15 // Original Author: Marco Musich
16 // Created: Thu, 05 Apr 2018 15:32:25 GMT
17 //
18 //
19 
20 // system include files
21 #include <map>
22 #include <memory>
23 #include <string>
24 #include <unordered_map>
25 #include <vector>
26 
27 // user include files
55 #define LOGERROR(x) edm::LogError(x)
56 #define LOGWARNING(x) edm::LogWarning(x)
57 #define LOGINFO(x) edm::LogInfo(x)
58 #define LOGVERBATIM(x) edm::LogVerbatim(x)
59 #define LOGDEBUG(x) LogDebug(x)
60 
61 // ROOT includes
62 #include "TNamed.h"
63 #include "TObjString.h"
64 #include "TText.h"
65 #include "TTree.h"
66 
67 //
68 // Auxiliary enum to enumerate the conditions types
69 //
70 namespace SiStripCondTypes {
71  enum condformat { Noise = 0, Pedestals = 1, G1Gain = 2, G2Gain = 3, Quality = 4, EndOfTypes = 99 };
72  static const std::array<std::string, 5> titles = {{"noise", "pedestals", "G1 gain", "G2 gain", "Quality"}};
73  static const std::array<std::string, 5> units = {{"[ADC counts]", "[ADC counts]", "", "", ""}};
74 
75  // some magic from https://stackoverflow.com/questions/47801709/best-way-to-set-a-bitset-with-boolean-values
76  template <typename... Args>
77  std::bitset<sizeof...(Args)> makeBitSet(Args... as) {
78  using unused = bool[];
79  std::bitset<sizeof...(Args)> ret;
80  std::size_t ui{ret.size()};
81  (void)unused{true, (ret.set(--ui, as), true)...};
82  return ret;
83  }
84 
85 } // namespace SiStripCondTypes
86 
87 //
88 // class declaration
89 //
90 
91 using HistoMap = std::map<uint32_t, TH1F*>;
92 
93 class SiStripCondVisualizer : public edm::one::EDAnalyzer<edm::one::SharedResources, edm::one::WatchRuns> {
94 public:
96  ~SiStripCondVisualizer() override = default;
97 
98  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
99 
100 private:
101  void beginRun(edm::Run const&, edm::EventSetup const&) override;
102  void endRun(edm::Run const&, edm::EventSetup const&) override{};
103  bool isDetIdSelected(const uint32_t detid);
105  std::tuple<std::string, int, int, int> setTopoInfo(uint32_t detId, const TrackerTopology* tTopo);
106  std::string module_location_type(const unsigned int& mod);
107  void fillTheQualityMap(const SiStripQuality* obj, HistoMap& theMap);
108  template <class Payload>
109  void fillTheHistoMap(const Payload* obj, HistoMap& theMap);
110  void analyze(const edm::Event&, const edm::EventSetup&) override;
111 
112  // ----------member data ---------------------------
119 
120  const bool doNoise_;
121  const bool doPeds_;
122  const bool doG1_;
123  const bool doG2_;
124  const bool doBadComps_;
125 
126  std::vector<DetIdSelector> detidsels_;
129  std::map<std::string, TFileDirectory> outputFolders_;
131  std::bitset<5> plottedConditions_;
132 };
133 
134 //
135 // constructors and destructor
136 //
138  : topoToken_(esConsumes<edm::Transition::BeginRun>()),
139  doNoise_(iConfig.getParameter<bool>("doNoise")),
140  doPeds_(iConfig.getParameter<bool>("doPeds")),
141  doG1_(iConfig.getParameter<bool>("doG1")),
142  doG2_(iConfig.getParameter<bool>("doG2")),
143  doBadComps_(iConfig.getParameter<bool>("doBadComps")),
144  detidsels_() {
145  usesResource(TFileService::kSharedResource);
146  // now do what ever initialization is needed
148 
150 
151  // now do the consumes
152  if (doNoise_)
154  if (doPeds_)
155  pedToken_ = esConsumes();
156  if (doG1_)
157  g1Token_ = esConsumes();
158  if (doG2_)
159  g2Token_ = esConsumes();
160  if (doBadComps_)
161  qualToken_ = esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("StripQualityLabel")));
162 
163  // detid selection
164  std::vector<edm::ParameterSet> selconfigs = iConfig.getParameter<std::vector<edm::ParameterSet>>("selections");
165  for (std::vector<edm::ParameterSet>::const_iterator selconfig = selconfigs.begin(); selconfig != selconfigs.end();
166  ++selconfig) {
167  DetIdSelector selection(*selconfig);
168  detidsels_.push_back(selection);
169  }
170 }
171 
172 //
173 // member functions
174 //
175 
176 /*
177  * special case for the SiStripQuality
178  */
180  const auto& badComponentsList = obj->getBadComponentList();
181 
182  for (const auto& bc : badComponentsList) {
183  LogDebug("SiStripCondVisualizer") << "Det:" << bc.detid << " location: " << this->module_location_type(bc.detid)
184  << " bad APVs:" << bc.BadApvs << " bad Fibers:" << bc.BadFibers
185  << " bad Module:" << bc.BadModule;
186  }
187 
188  // now get the detids
189  std::vector<uint32_t> activeDetIds;
190  std::transform(badComponentsList.begin(),
191  badComponentsList.end(),
192  std::back_inserter(activeDetIds),
193  [](const SiStripQuality::BadComponent& bc) { return bc.detid; });
194 
195  for (const uint32_t& detid : activeDetIds) {
196  if (!this->isDetIdSelected(detid))
197  continue;
198 
199  unsigned int nStrip = detInfo_.getNumberOfApvsAndStripLength(detid).first * sistrip::STRIPS_PER_APV;
200 
201  for (unsigned int istrip_ = 0; istrip_ < nStrip; ++istrip_) {
202  bool isStripBad = obj->IsStripBad(detid, istrip_);
203  float quant_ = isStripBad ? 1.f : 0.f;
204  if (!theMap.count(detid)) {
205  LOGWARNING("SiStripCondVisualizer")
206  << "@SUB=SiStripCondVisualizer::analyze(): " << detid << " was not found in the quality histogram map!!!";
207  } else {
208  theMap[detid]->SetBinContent(istrip_, quant_);
209  }
210  } // loop on the strips
211  } // loop on the active detids
212  return;
213 }
214 
215 /*
216  * Payload functor based method for all the other cases
217  */
218 template <class Payload>
219 void SiStripCondVisualizer::fillTheHistoMap(const Payload* obj, HistoMap& theMap) {
220  std::function<float(unsigned int, typename Payload::Range)> payloadFunctor = [&obj](unsigned int istrip,
221  typename Payload::Range range) {
222  if constexpr (std::is_same_v<Payload, SiStripNoises>) {
223  return obj->getNoise(istrip, range);
224  } else if constexpr (std::is_same_v<Payload, SiStripPedestals>) {
225  return obj->getPed(istrip, range);
226  } else if constexpr (std::is_same_v<Payload, SiStripApvGain>) {
227  return obj->getStripGain(istrip, range);
228  }
229  };
230 
231  std::vector<uint32_t> activeDetIds;
232  obj->getDetIds(activeDetIds);
233 
234  for (const uint32_t& detid : activeDetIds) {
235  if (!this->isDetIdSelected(detid))
236  continue;
237 
238  typename Payload::Range condRange = obj->getRange(detid);
239  unsigned int nStrip = detInfo_.getNumberOfApvsAndStripLength(detid).first * sistrip::STRIPS_PER_APV;
240 
241  for (unsigned int istrip_ = 0; istrip_ < nStrip; ++istrip_) {
242  float quant_ = payloadFunctor(istrip_, condRange);
243 
244  if (!theMap.count(detid)) {
245  LOGWARNING("SiStripCondVisualizer")
246  << "@SUB=SiStripCondVisualizer::analyze(): " << detid << " was not found in the histogram map!!!";
247  } else {
248  theMap[detid]->SetBinContent(istrip_, quant_);
249  }
250  } // loop on the strips
251  } // loop on the active detids
252 }
253 
254 // ------------ method called for each event ------------
256  using namespace edm;
257 
258  if (doNoise_) {
259  const SiStripNoises* noiseObj = &iSetup.getData(noiseToken_);
260  this->fillTheHistoMap<SiStripNoises>(noiseObj, NoiseMap_);
261  }
262  if (doPeds_) {
263  const SiStripPedestals* pedestalObj = &iSetup.getData(pedToken_);
264  this->fillTheHistoMap<SiStripPedestals>(pedestalObj, PedMap_);
265  }
266  if (doG1_) {
267  const SiStripApvGain* g1Obj = &iSetup.getData(g1Token_);
268  this->fillTheHistoMap<SiStripApvGain>(g1Obj, G1Map_);
269  }
270  if (doG2_) {
271  const SiStripApvGain* g2Obj = &iSetup.getData(g2Token_);
272  this->fillTheHistoMap<SiStripApvGain>(g2Obj, G2Map_);
273  }
274  if (doBadComps_) { /* special case for the SiStripQuality */
275  const SiStripQuality* siStripQualityObj = &iSetup.getData(qualToken_);
276  this->fillTheQualityMap(siStripQualityObj, QualMap_);
277  }
278 }
279 
280 // ------------ method called for each run ------------
281 void SiStripCondVisualizer::beginRun(const edm::Run& iRun, edm::EventSetup const& iSetup) {
282  const TrackerTopology* tTopo_ = &iSetup.getData(topoToken_);
283  const std::map<uint32_t, SiStripDetInfo::DetInfo> DetInfos = detInfo_.getAllData();
284 
285  for (const auto& it : DetInfos) {
286  LogDebug("SiStripCondVisualizer") << "detid " << it.first << "isSelected " << this->isDetIdSelected(it.first);
287 
288  if (!this->isDetIdSelected(it.first))
289  continue;
290 
291  auto topolInfo = setTopoInfo(it.first, tTopo_);
292  std::string thePart = std::get<0>(topolInfo);
293 
294  for (std::size_t i = 0; i < plottedConditions_.size(); ++i) {
295  if (plottedConditions_.test(i)) {
296  const std::string fname = Form("%s_%s", SiStripCondTypes::titles[i].c_str(), thePart.c_str());
297 
298  // book the TFileDirectory if it's not already done
299  if (!outputFolders_.count(fname)) {
301  }
302  }
303  } // loop on the bitset of plotted conditions
304  } // loop on modules
305 
306  if (doNoise_) {
307  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n Before booking NoisMap_.size(): "
308  << NoiseMap_.size();
310  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n After booking NoisMap_.size(): "
311  << NoiseMap_.size();
312  }
313  if (doPeds_) {
314  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n Before booking PedMap_.size(): "
315  << PedMap_.size();
317  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n After booking PedMap_.size(): "
318  << PedMap_.size();
319  }
320  if (doG1_) {
321  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n Before booking G1Map_.size(): "
322  << G1Map_.size();
324  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n After booking G1Map_.size(): "
325  << G1Map_.size();
326  }
327  if (doG2_) {
328  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n Before booking G2Map_.size(): "
329  << G2Map_.size();
331  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n After booking G2Map_.size(): "
332  << G2Map_.size();
333  }
334  if (doBadComps_) {
335  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n Before booking QualMap_.size(): "
336  << QualMap_.size();
338  LOGINFO("SiStripCondVisualizer") << "@SUB=SiStripCondVisualizer::beginRun() \n After booking QualMap_.size(): "
339  << QualMap_.size();
340  }
341 }
342 
343 // ------------ method called to determine the topology ------------
344 std::tuple<std::string, int, int, int> SiStripCondVisualizer::setTopoInfo(uint32_t detId,
345  const TrackerTopology* tTopo) {
346  int subdetId_(-999), layer_(-999), side_(-999);
347  std::string ret = "";
348  std::tuple<std::string, int, int, int> def_tuple{ret, subdetId_, layer_, side_};
349 
350  subdetId_ = DetId(detId).subdetId();
351  switch (subdetId_) {
352  case SiStripSubdetector::TIB: // TIB
353  layer_ = tTopo->tibLayer(detId);
354  side_ = 0;
355  ret += Form("TIB_Layer%i", layer_);
356  break;
357  case SiStripSubdetector::TID: // TID
358  side_ = tTopo->tidSide(detId);
359  layer_ = tTopo->tidWheel(detId);
360  ret += ("TID_");
361  ret += (side_ == 1) ? Form("P_disk%i", layer_) : Form("M_disk%i", layer_);
362  break;
363  case SiStripSubdetector::TOB: // TOB
364  layer_ = tTopo->tobLayer(detId);
365  side_ = 0;
366  ret += Form("TOB_Layer%i", layer_);
367  break;
368  case SiStripSubdetector::TEC: // TEC
369  side_ = tTopo->tecSide(detId);
370  layer_ = tTopo->tecWheel(detId);
371  ret += ("TEC_");
372  ret += (side_ == 1) ? Form("P_disk%i", layer_) : Form("M_disk%i", layer_);
373  break;
374  default:
375  edm::LogError("SiStripCondVisualizer") << "SUB=SiStripCondVisualizer::setTopoInfo() \n unrecognizer partition.";
376  return def_tuple;
377  }
378 
379  return std::make_tuple(ret, subdetId_, layer_, side_);
380 }
381 
382 // name of the location of a given module and its type,
383 // e.g. TIB_L1s: stereo module at TIB layer 1
385  const SiStripDetId detid(mod);
386  std::string subdet = "";
387  if (detid.subDetector() == SiStripDetId::TIB)
388  subdet = "TIB";
389  if (detid.subDetector() == SiStripDetId::TOB)
390  subdet = "TOB";
391  if (detid.subDetector() == SiStripDetId::TID)
392  subdet = "TID";
393  if (detid.subDetector() == SiStripDetId::TEC)
394  subdet = "TEC";
395 
396  // Barrel
397  int layer = int((mod >> 14) & 0x7);
398  std::string type = (detid.stereo() ? "s" : "a");
399  std::string d_l_t = Form("%s_L%d%s", subdet.c_str(), layer, type.c_str());
400 
401  // Endcaps
402  if (subdet == "TID" || subdet == "TEC") {
403  unsigned int sideStartBit_{0};
404  unsigned int wheelStartBit_{0};
405  unsigned int ringStartBit_{0};
406  unsigned int sideMask_{0};
407  unsigned int wheelMask_{0};
408  unsigned int ringMask_{0};
409 
410  // TEC
411  if (subdet == "TEC") {
412  sideStartBit_ = 18;
413  wheelStartBit_ = 14;
414  ringStartBit_ = 5;
415  sideMask_ = 0x3;
416  wheelMask_ = 0xF;
417  ringMask_ = 0x7;
418  }
419 
420  // TID
421  if (subdet == "TID") {
422  sideStartBit_ = 13;
423  wheelStartBit_ = 11;
424  ringStartBit_ = 9;
425  sideMask_ = 0x3;
426  wheelMask_ = 0x3;
427  ringMask_ = 0x3;
428  }
429 
430  // TEC+-, TID+- (see also at the bottom of this file
431  int side = int((mod >> sideStartBit_) & sideMask_);
432  int wheel = int((mod >> wheelStartBit_) & wheelMask_);
433  int ring = int((mod >> ringStartBit_) & ringMask_);
434 
435  std::string s_side = (side == 1 ? "Plus" : "Minus");
436 
437  d_l_t = Form("%s%s_W%dR%d", subdet.c_str(), s_side.c_str(), wheel, ring);
438  }
439  return d_l_t;
440 }
441 
442 // ------------ method called to determine if the detid is selected
443 bool SiStripCondVisualizer::isDetIdSelected(const uint32_t detid) {
444  bool isSelected{false};
445  for (std::vector<DetIdSelector>::const_iterator detidsel = detidsels_.begin(); detidsel != detidsels_.end();
446  ++detidsel) {
447  if (detidsel->isSelected(detid)) {
448  isSelected = true;
449  break;
450  }
451  }
452  return isSelected;
453 }
454 
455 // ------------ method called once to book all the module level histograms
458  TH1F::SetDefaultSumw2(kTRUE);
459  HistoMap h;
460 
461  const std::map<uint32_t, SiStripDetInfo::DetInfo> DetInfos = detInfo_.getAllData();
462 
463  for (const auto& it : DetInfos) {
464  // check if det id is correct and if it is actually cabled in the detector
465  if (it.first == 0 || it.first == 0xFFFFFFFF) {
466  edm::LogError("DetIdNotGood") << "@SUB=analyze"
467  << "Wrong det id: " << it.first << " ... neglecting!";
468  continue;
469  }
470 
471  if (!this->isDetIdSelected(it.first))
472  continue;
473 
474  auto topolInfo = setTopoInfo(it.first, tTopo_);
475  const std::string thePart = std::get<0>(topolInfo);
476  const std::string fname = Form("%s_%s", SiStripCondTypes::titles[type].c_str(), thePart.c_str());
477 
478  unsigned int nStrip = detInfo_.getNumberOfApvsAndStripLength(it.first).first * sistrip::STRIPS_PER_APV;
479 
480  h[it.first] =
481  outputFolders_[fname].make<TH1F>(Form("%sProfile_%i", SiStripCondTypes::titles[type].c_str(), it.first),
482  Form("%s for module %i (%s);n. strip; %s %s",
484  it.first,
485  thePart.c_str(),
487  SiStripCondTypes::units[type].c_str()),
488  nStrip,
489  -0.5,
490  nStrip + 0.5);
491  }
492  return h;
493 }
494 
495 // ------------ method fills 'descriptions' with the allowed parameters for the module
498  desc.setComment("Creates a ROOT file with the per-moudle profiles of different SiStrip Database tag contents.");
499  desc.add<bool>("doNoise", false);
500  desc.add<bool>("doPeds", false);
501  desc.add<bool>("doG1", false);
502  desc.add<bool>("doG2", false);
503  desc.add<bool>("doBadComps", false);
504  desc.add<std::string>("StripQualityLabel", "MergedBadComponent");
505 
506  // for the DetId selection
507  edm::ParameterSetDescription desc_detIdSelection;
508  desc_detIdSelection.add<unsigned int>("detSelection");
509  desc_detIdSelection.add<std::string>("detLabel");
510  desc_detIdSelection.addUntracked<std::vector<std::string>>("selection");
511  std::vector<edm::ParameterSet> default_detIdSelectionVector;
512  edm::ParameterSet default_detIdSelector;
513  default_detIdSelector.addParameter<unsigned int>("detSelection", 1);
514  default_detIdSelector.addParameter<std::string>("detLabel", "Tracker");
515  default_detIdSelector.addUntrackedParameter<std::vector<std::string>>("selection",
516  {"0x1e000000-0x16000000",
517  "0x1e006000-0x18002000",
518  "0x1e006000-0x18004000",
519  "0x1e000000-0x1a000000",
520  "0x1e0c0000-0x1c040000",
521  "0x1e0c0000-0x1c080000"});
522  default_detIdSelectionVector.push_back(default_detIdSelector);
523  desc.addVPSet("selections", desc_detIdSelection, default_detIdSelectionVector);
524 
525  descriptions.addWithDefaultLabel(desc);
526 }
527 
528 // define this as a plug-in
static const std::string kSharedResource
Definition: TFileService.h:76
static const std::array< std::string, 5 > titles
static const std::array< std::string, 5 > units
SiStripCondVisualizer(const edm::ParameterSet &)
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
static const char layer_[]
unsigned int tobLayer(const DetId &id) const
std::string module_location_type(const unsigned int &mod)
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::Service< TFileService > fs_
std::bitset< 5 > plottedConditions_
PixelRecoRange< float > Range
static constexpr auto TID
Definition: SiStripDetId.h:38
ret
prodAgent to be discontinued
unsigned int tidSide(const DetId &id) const
std::tuple< std::string, int, int, int > setTopoInfo(uint32_t detId, const TrackerTopology *tTopo)
unsigned int tidWheel(const DetId &id) const
unsigned int tecWheel(const DetId &id) const
selection
main part
Definition: corrVsCorr.py:100
SubDetector subDetector() const
Definition: SiStripDetId.h:105
#define LOGINFO(x)
edm::ESGetToken< SiStripQuality, SiStripQualityRcd > qualToken_
Log< level::Error, false > LogError
HistoMap bookModuleHistograms(const TrackerTopology *tTopo, const SiStripCondTypes::condformat &type)
TEMPL(T2) struct Divides void
Definition: Factorize.h:24
std::bitset< sizeof...(Args)> makeBitSet(Args... as)
std::map< uint32_t, TH1F * > HistoMap
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
edm::ESGetToken< SiStripPedestals, SiStripPedestalsRcd > pedToken_
constexpr std::array< uint8_t, layerIndexSize< TrackerTraits > > layer
int iEvent
Definition: GenABIO.cc:224
unsigned int tecSide(const DetId &id) const
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:135
uint32_t stereo() const
Definition: SiStripDetId.h:168
Transition
Definition: Transition.h:12
void fillTheQualityMap(const SiStripQuality *obj, HistoMap &theMap)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
SiStripDetInfo read(std::string filePath)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static constexpr auto TOB
Definition: SiStripDetId.h:39
edm::ESGetToken< SiStripApvGain, SiStripApvGainRcd > g1Token_
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:18
Definition: DetId.h:17
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
Definition: TFileService.h:69
~SiStripCondVisualizer() override=default
const std::pair< unsigned short, double > getNumberOfApvsAndStripLength(uint32_t detId) const
void addUntrackedParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:192
Constants and enumerated types for FED/FEC systems.
bool isSelected(const std::vector< L1HPSPFTauQualityCut > &qualityCuts, const l1t::PFCandidate &pfCand, float_t primaryVertexZ)
#define LOGWARNING(x)
std::vector< DetIdSelector > detidsels_
static constexpr auto TIB
Definition: SiStripDetId.h:37
string fname
main script
HLT enums.
bool isDetIdSelected(const uint32_t detid)
const std::map< uint32_t, DetInfo > & getAllData() const noexcept
static const uint16_t STRIPS_PER_APV
void beginRun(edm::Run const &, edm::EventSetup const &) override
void fillTheHistoMap(const Payload *obj, HistoMap &theMap)
edm::ESGetToken< SiStripNoises, SiStripNoisesRcd > noiseToken_
static constexpr char const *const kDefaultFile
unsigned int tibLayer(const DetId &id) const
void endRun(edm::Run const &, edm::EventSetup const &) override
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
void analyze(const edm::Event &, const edm::EventSetup &) override
T mod(const T &a, const T &b)
Definition: ecalDccMap.h:4
edm::ESGetToken< SiStripApvGain, SiStripApvGain2Rcd > g2Token_
static constexpr auto TEC
Definition: SiStripDetId.h:40
std::map< std::string, TFileDirectory > outputFolders_
Definition: Run.h:45
#define LogDebug(id)
unsigned transform(const HcalDetId &id, unsigned transformCode)