28 #include "TEfficiency.h" 31 #define LOGPRINT edm::LogPrint("SiStripHitEfficiencyHarvester") 57 std::unique_ptr<TrackerTopology>
tTopo_;
64 const std::array<long, bounds::k_END_OF_LAYERS>& layerTotal)
const;
74 : inputFolder_(conf.getParameter<
std::
string>(
"inputFolder")),
75 isAtPCL_(conf.getParameter<
bool>(
"isAtPCL")),
76 showRings_(conf.getUntrackedParameter<
bool>(
"ShowRings",
false)),
77 autoIneffModTagging_(conf.getUntrackedParameter<
bool>(
"AutoIneffModTagging",
false)),
78 doStoreOnDB_(conf.getParameter<
bool>(
"doStoreOnDB")),
79 nTEClayers_(showRings_ ? 7 : 9),
80 threshold_(conf.getParameter<double>(
"Threshold")),
81 nModsMin_(conf.getParameter<
int>(
"nModsMin")),
82 tkMapMin_(conf.getUntrackedParameter<double>(
"TkMapMin", 0.9)),
83 title_(conf.getParameter<
std::
string>(
"Title")),
84 record_(conf.getParameter<
std::
string>(
"Record")),
102 for (
const auto& det : tkGeom.detUnits()) {
103 if (dynamic_cast<const StripGeomDetUnit*>(det)) {
112 std::vector<bool> isAvailable;
113 isAvailable.reserve(maps.size());
115 maps.begin() + 1, maps.end(), std::back_inserter(isAvailable), [](
auto&
x) {
return !(
x ==
nullptr); });
118 for (
const auto& it : isAvailable) {
120 LogDebug(
"SiStripHitEfficiencyHarvester") <<
" layer: " <<
count <<
" " << it << std::endl;
122 LogDebug(
"SiStripHitEfficiencyHarvester") <<
"resolving to " << maps[
count]->getName() << std::endl;
126 bool areMapsAvailable{
true};
128 for (
const auto& it : isAvailable) {
132 <<
type <<
" TkHistoMap for layer " << layerCount <<
" was not found.\n -> Aborting!";
133 areMapsAvailable =
false;
137 return areMapsAvailable;
144 LOGPRINT <<
"A module is bad if the upper limit on the efficiency is < to the avg in the layer - " <<
threshold_ 145 <<
" and has at least " <<
nModsMin_ <<
" nModsMin.";
147 auto h_module_total = std::make_unique<TkHistoMap>(
tkDetMap_.get());
149 auto h_module_found = std::make_unique<TkHistoMap>(
tkDetMap_.get());
153 const auto& totalMaps = h_module_total->getAllMaps();
154 const auto& foundMaps = h_module_found->getAllMaps();
156 LogDebug(
"SiStripHitEfficiencyHarvester")
157 <<
"totalMaps.size(): " << totalMaps.size() <<
" foundMaps.size() " << foundMaps.size() << std::endl;
163 LogDebug(
"SiStripHitEfficiencyHarvester")
164 <<
"isTotalMapAvailable: " << isTotalMapAvailable <<
" isFoundMapAvailable " << isFoundMapAvailable << std::endl;
167 if (!isTotalMapAvailable
or !isFoundMapAvailable)
170 LogDebug(
"SiStripHitEfficiencyHarvester")
171 <<
"Entries in total TkHistoMap for layer 3: " << h_module_total->getMap(3)->getEntries() <<
", found " 172 << h_module_found->getMap(3)->getEntries();
177 std::vector<MonitorElement*> hEffInLayer(std::size_t(1),
nullptr);
178 hEffInLayer.reserve(bounds::k_END_OF_LAYERS);
179 for (std::size_t
i = 1;
i != bounds::k_END_OF_LAYERS; ++
i) {
181 hEffInLayer.push_back(booker.
book1D(
182 Form(
"eff_layer%i",
int(
i)), Form(
"Module efficiency in layer %s", lyrName.c_str()), 201, 0, 1.005));
184 std::array<long, bounds::k_END_OF_LAYERS> layerTotal{};
185 std::array<long, bounds::k_END_OF_LAYERS> layerFound{};
197 TrackerMap tkMapDen{
" Detector denominator "};
198 std::map<unsigned int, double> badModules;
202 const auto num = h_module_found->getValue(det);
203 const auto denom = h_module_total->getValue(det);
206 hEffInLayer[
layer]->Fill(eff);
210 badModules[det] = eff;
211 tkMapBad.fillc(det, 255, 0, 0);
213 << det.rawId() <<
" efficiency: " << eff <<
" , " <<
num <<
"/" <<
denom;
216 tkMapBad.fillc(det, 255, 255, 255);
220 << det.rawId() <<
" efficiency: " << eff <<
" , " <<
num <<
"/" <<
denom;
224 << det.rawId() <<
" is under occupancy at " <<
denom;
228 tkMap.fill(det, 1. - eff);
229 tkMapEff.fill(det, eff);
230 tkMapNum.fill(det,
num);
231 tkMapDen.fill(det,
denom);
239 for (Long_t
i = 1;
i <= k_LayersAtTECEnd;
i++) {
241 hEffInLayer[
i]->getTH1()->GetXaxis()->SetRange(
242 3, hEffInLayer[
i]->getNbinsX() + 1);
243 const double layer_min_eff = hEffInLayer[
i]->getMean() -
std::max(2.5 * hEffInLayer[
i]->getRMS(),
threshold_);
244 LOGPRINT <<
"Layer " <<
i <<
" threshold for bad modules: <" << layer_min_eff
245 <<
" (layer mean: " << hEffInLayer[
i]->getMean() <<
" rms: " << hEffInLayer[
i]->getRMS() <<
")";
247 hEffInLayer[
i]->getTH1()->GetXaxis()->SetRange(1, hEffInLayer[
i]->getNbinsX() + 1);
250 const auto layer = ::checkLayer(det,
tTopo_.get());
252 const auto num = h_module_found->getValue(det);
253 const auto denom = h_module_total->getValue(det);
256 const auto eff_up = TEfficiency::Bayesian(
denom,
num, .99, 1, 1,
true);
260 badModules[det] = eff;
261 tkMapBad.fillc(det, 255, 0, 0);
264 tkMapBad.fillc(det, 255, 255, 255);
266 if (eff_up < layer_min_eff + 0.08)
269 << det.rawId() <<
" efficiency: " << eff <<
" , " <<
num <<
"/" <<
denom 270 <<
" , upper limit: " << eff_up;
273 << det.rawId() <<
" layer " <<
layer <<
" is under occupancy at " <<
denom;
281 tkMap.save(
true, 0, 0,
"SiStripHitEffTKMap_NEW.png");
282 tkMapBad.save(
true, 0, 0,
"SiStripHitEffTKMapBad_NEW.png");
283 tkMapEff.save(
true,
tkMapMin_, 1.,
"SiStripHitEffTKMapEff_NEW.png");
284 tkMapNum.save(
true, 0, 0,
"SiStripHitEffTKMapNum_NEW.png");
285 tkMapDen.save(
true, 0, 0,
"SiStripHitEffTKMapDen_NEW.png");
293 for (
const auto it : badModules) {
294 const auto det = it.first;
295 std::vector<unsigned int> badStripList;
300 badStripList.push_back(pQuality.encode(0,
nStrips, 0));
302 LOGPRINT <<
"ID1 shoudl match list of modules above " << det;
303 pQuality.compact(det, badStripList);
306 pQuality.fillBadComponents();
310 edm::LogInfo(
"SiStripHitEfficiencyHarvester") <<
"Will not produce payload!";
329 const std::array<long, bounds::k_END_OF_LAYERS>& layerFound,
330 const std::array<long, bounds::k_END_OF_LAYERS>& layerTotal)
const {
338 for (Long_t
i = 1;
i < 5;
i++) {
343 for (Long_t
i = 1;
i <= bounds::k_LayersAtTECEnd;
i++) {
344 layereff = double(layerFound[
i]) / double(layerTotal[
i]);
346 << layereff <<
" " << layerFound[
i] <<
"/" << layerTotal[
i];
347 totalfound += layerFound[
i];
348 totaltotal += layerTotal[
i];
349 if (
i <= bounds::k_LayersAtTIBEnd) {
350 subdetfound[1] += layerFound[
i];
351 subdettotal[1] += layerTotal[
i];
353 if (
i > bounds::k_LayersAtTIBEnd &&
i <= bounds::k_LayersAtTOBEnd) {
354 subdetfound[2] += layerFound[
i];
355 subdettotal[2] += layerTotal[
i];
357 if (
i > bounds::k_LayersAtTOBEnd &&
i <= bounds::k_LayersAtTIDEnd) {
358 subdetfound[3] += layerFound[
i];
359 subdettotal[3] += layerTotal[
i];
361 if (
i > bounds::k_LayersAtTIDEnd) {
362 subdetfound[4] += layerFound[
i];
363 subdettotal[4] += layerTotal[
i];
367 LOGPRINT <<
"The total efficiency is " << double(totalfound) / double(totaltotal);
368 LOGPRINT <<
" TIB: " << double(subdetfound[1]) / subdettotal[1] <<
" " << subdetfound[1] <<
"/" 370 LOGPRINT <<
" TOB: " << double(subdetfound[2]) / subdettotal[2] <<
" " << subdetfound[2] <<
"/" 372 LOGPRINT <<
" TID: " << double(subdetfound[3]) / subdettotal[3] <<
" " << subdetfound[3] <<
"/" 374 LOGPRINT <<
" TEC: " << double(subdetfound[4]) / subdettotal[4] <<
" " << subdetfound[4] <<
"/" 380 const auto pQdvBegin =
quality.getDataVectorBegin();
381 for (
auto rIt =
quality.getRegistryVectorBegin(); rIt !=
quality.getRegistryVectorEnd(); ++rIt) {
383 if (!pBadStrip.put(rIt->detid,
range))
384 edm::LogError(
"SiStripHitEfficiencyHarvester") <<
"detid already exists in SiStripBadStrip";
403 for (
unsigned int iLayer = 1; iLayer != (
showRings_ ? 20 : 22); ++iLayer) {
407 if (hfound ==
nullptr or htotal ==
nullptr) {
408 if (hfound ==
nullptr)
411 if (htotal ==
nullptr)
418 if (!hfound->GetSumw2())
420 if (!htotal->GetSumw2())
422 for (Long_t
i = 0;
i != hfound->GetNbinsX() + 1; ++
i) {
423 if (hfound->GetBinContent(
i) == 0)
424 hfound->SetBinContent(
i, 1
e-6);
425 if (htotal->GetBinContent(
i) == 0)
426 htotal->SetBinContent(
i, 1);
428 LogDebug(
"SiStripHitEfficiencyHarvester")
429 <<
"Total hits for layer " << iLayer <<
" (vs lumi): " << htotal->GetEntries() <<
", found " 430 << hfound->GetEntries();
441 std::stringstream ssV[4][19],
450 ssV[
i][
comp] <<
" \t " << ((bc.
BadApvs) & 0
x1) <<
" " << ((bc.BadApvs >> 1) & 0
x1) <<
" ";
452 ssV[
i][
comp] <<
"x x " << ((bc.BadApvs >> 2) & 0
x1) <<
" " << ((bc.BadApvs >> 3) & 0
x1);
454 ssV[
i][
comp] << ((bc.BadApvs >> 2) & 0
x1) <<
" " << ((bc.BadApvs >> 3) & 0
x1) <<
" " << ((bc.BadApvs >> 4) & 0
x1)
455 <<
" " << ((bc.BadApvs >> 5) & 0
x1) <<
" ";
458 nBad[
i][0][2] += ((bc.BadApvs >> 5) & 0
x1) + ((bc.BadApvs >> 4) & 0
x1) + ((bc.BadApvs >> 3) & 0
x1) +
459 ((bc.BadApvs >> 2) & 0
x1) + ((bc.BadApvs >> 1) & 0
x1) + ((bc.BadApvs) & 0
x1);
460 nBad[
i][
comp][2] += ((bc.BadApvs >> 5) & 0
x1) + ((bc.BadApvs >> 4) & 0
x1) + ((bc.BadApvs >> 3) & 0
x1) +
461 ((bc.BadApvs >> 2) & 0
x1) + ((bc.BadApvs >> 1) & 0
x1) + ((bc.BadApvs) & 0
x1);
464 nBad[
i][0][1] += ((bc.BadFibers >> 2) & 0
x1) + ((bc.BadFibers >> 1) & 0
x1) + ((bc.BadFibers) & 0
x1);
465 nBad[
i][
comp][1] += ((bc.BadFibers >> 2) & 0
x1) + ((bc.BadFibers >> 1) & 0
x1) + ((bc.BadFibers) & 0
x1);
480 int nBadComp[4][19][4];
484 std::stringstream ssV[4][19];
486 for (
int i = 0;
i < 4; ++
i) {
488 for (
int j = 0;
j < 19; ++
j) {
490 for (
int k = 0;
k < 4; ++
k)
491 nBadComp[
i][
j][
k] = 0;
495 for (
const auto& bc :
quality.getBadComponentList()) {
500 nTkBadComp[1] += ((bc.BadFibers >> 2) & 0
x1) + ((bc.BadFibers >> 1) & 0
x1) + ((bc.BadFibers) & 0
x1);
502 nTkBadComp[2] += ((bc.BadApvs >> 5) & 0
x1) + ((bc.BadApvs >> 4) & 0
x1) + ((bc.BadApvs >> 3) & 0
x1) +
503 ((bc.BadApvs >> 2) & 0
x1) + ((bc.BadApvs >> 1) & 0
x1) + ((bc.BadApvs) & 0
x1);
537 for (
auto rp =
quality.getRegistryVectorBegin(); rp !=
quality.getRegistryVectorEnd(); ++rp) {
538 DetId det{rp->detid};
540 int component = -999;
541 switch (det.subdetId()) {
544 component =
tTopo_->tibLayer(det);
548 component =
tTopo_->tidSide(det) == 2 ?
tTopo_->tidWheel(det) :
tTopo_->tidWheel(det) + 3;
552 component =
tTopo_->tobLayer(det);
556 component =
tTopo_->tecSide(det) == 2 ?
tTopo_->tecWheel(det) :
tTopo_->tecWheel(det) + 9;
562 const auto pQdvBegin =
quality.getDataVectorBegin();
564 float percentage = 0;
565 for (
int it = 0; it < sqrange.second - sqrange.first; it++) {
566 unsigned int range =
quality.decode(*(sqrange.first + it)).range;
567 nTkBadComp[3] +=
range;
568 nBadComp[subdet][0][3] +=
range;
569 nBadComp[subdet][component][3] +=
range;
575 edm::LogError(
"SiStripHitEfficiencyHarvester") <<
"PROBLEM detid " << det.rawId() <<
" value " << percentage;
579 std::ostringstream
ss;
580 ss <<
"\n-----------------\nGlobal Info\n-----------------";
581 ss <<
"\nBadComp \t Modules \tFibers " 582 "\tApvs\tStrips\n----------------------------------------------------------------";
583 ss <<
"\nTracker:\t\t" << nTkBadComp[0] <<
"\t" << nTkBadComp[1] <<
"\t" << nTkBadComp[2] <<
"\t" << nTkBadComp[3];
584 ss <<
"\nTIB:\t\t\t" << nBadComp[0][0][0] <<
"\t" << nBadComp[0][0][1] <<
"\t" << nBadComp[0][0][2] <<
"\t" 585 << nBadComp[0][0][3];
586 ss <<
"\nTID:\t\t\t" << nBadComp[1][0][0] <<
"\t" << nBadComp[1][0][1] <<
"\t" << nBadComp[1][0][2] <<
"\t" 587 << nBadComp[1][0][3];
588 ss <<
"\nTOB:\t\t\t" << nBadComp[2][0][0] <<
"\t" << nBadComp[2][0][1] <<
"\t" << nBadComp[2][0][2] <<
"\t" 589 << nBadComp[2][0][3];
590 ss <<
"\nTEC:\t\t\t" << nBadComp[3][0][0] <<
"\t" << nBadComp[3][0][1] <<
"\t" << nBadComp[3][0][2] <<
"\t" 591 << nBadComp[3][0][3];
594 for (
int i = 1;
i < 5; ++
i)
595 ss <<
"\nTIB Layer " <<
i <<
" :\t\t" << nBadComp[0][
i][0] <<
"\t" << nBadComp[0][
i][1] <<
"\t" << nBadComp[0][
i][2]
596 <<
"\t" << nBadComp[0][
i][3];
598 for (
int i = 1;
i < 4; ++
i)
599 ss <<
"\nTID+ Disk " <<
i <<
" :\t\t" << nBadComp[1][
i][0] <<
"\t" << nBadComp[1][
i][1] <<
"\t" << nBadComp[1][
i][2]
600 <<
"\t" << nBadComp[1][
i][3];
601 for (
int i = 4;
i < 7; ++
i)
602 ss <<
"\nTID- Disk " <<
i - 3 <<
" :\t\t" << nBadComp[1][
i][0] <<
"\t" << nBadComp[1][
i][1] <<
"\t" 603 << nBadComp[1][
i][2] <<
"\t" << nBadComp[1][
i][3];
605 for (
int i = 1;
i < 7; ++
i)
606 ss <<
"\nTOB Layer " <<
i <<
" :\t\t" << nBadComp[2][
i][0] <<
"\t" << nBadComp[2][
i][1] <<
"\t" << nBadComp[2][
i][2]
607 <<
"\t" << nBadComp[2][
i][3];
609 for (
int i = 1;
i < 10; ++
i)
610 ss <<
"\nTEC+ Disk " <<
i <<
" :\t\t" << nBadComp[3][
i][0] <<
"\t" << nBadComp[3][
i][1] <<
"\t" << nBadComp[3][
i][2]
611 <<
"\t" << nBadComp[3][
i][3];
612 for (
int i = 10;
i < 19; ++
i)
613 ss <<
"\nTEC- Disk " <<
i - 9 <<
" :\t\t" << nBadComp[3][
i][0] <<
"\t" << nBadComp[3][
i][1] <<
"\t" 614 << nBadComp[3][
i][2] <<
"\t" << nBadComp[3][
i][3];
617 ss <<
"\n----------------------------------------------------------------\n\t\t Detid \tModules Fibers " 618 "Apvs\n----------------------------------------------------------------";
619 for (
int i = 1;
i < 5; ++
i)
620 ss <<
"\nTIB Layer " <<
i <<
" :" << ssV[0][
i].
str();
622 for (
int i = 1;
i < 4; ++
i)
623 ss <<
"\nTID+ Disk " <<
i <<
" :" << ssV[1][
i].
str();
624 for (
int i = 4;
i < 7; ++
i)
625 ss <<
"\nTID- Disk " <<
i - 3 <<
" :" << ssV[1][
i].
str();
627 for (
int i = 1;
i < 7; ++
i)
628 ss <<
"\nTOB Layer " <<
i <<
" :" << ssV[2][
i].
str();
630 for (
int i = 1;
i < 10; ++
i)
631 ss <<
"\nTEC+ Disk " <<
i <<
" :" << ssV[3][
i].
str();
632 for (
int i = 10;
i < 19; ++
i)
633 ss <<
"\nTEC- Disk " <<
i - 9 <<
" :" << ssV[3][
i].
str();
638 std::ofstream badModules;
639 badModules.open(
"BadModules_NEW.log");
640 badModules <<
"\n----------------------------------------------------------------\n\t\t Detid \tModules Fibers " 641 "Apvs\n----------------------------------------------------------------";
642 for (
int i = 1;
i < 5; ++
i)
643 badModules <<
"\nTIB Layer " <<
i <<
" :" << ssV[0][
i].
str();
645 for (
int i = 1;
i < 4; ++
i)
646 badModules <<
"\nTID+ Disk " <<
i <<
" :" << ssV[1][
i].
str();
647 for (
int i = 4;
i < 7; ++
i)
648 badModules <<
"\nTID- Disk " <<
i - 3 <<
" :" << ssV[1][
i].
str();
650 for (
int i = 1;
i < 7; ++
i)
651 badModules <<
"\nTOB Layer " <<
i <<
" :" << ssV[2][
i].
str();
653 for (
int i = 1;
i < 10; ++
i)
654 badModules <<
"\nTEC+ Disk " <<
i <<
" :" << ssV[3][
i].
str();
655 for (
int i = 10;
i < 19; ++
i)
656 badModules <<
"\nTEC- Disk " <<
i - 9 <<
" :" << ssV[3][
i].
str();
663 desc.add<
bool>(
"isAtPCL",
false);
664 desc.add<
bool>(
"doStoreOnDB",
false);
666 desc.add<
double>(
"Threshold", 0.1);
668 desc.add<
int>(
"nModsMin", 5);
669 desc.addUntracked<
bool>(
"AutoIneffModTagging",
false);
670 desc.addUntracked<
double>(
"TkMapMin", 0.9);
671 desc.addUntracked<
bool>(
"ShowRings",
false);
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
constexpr char const * layerName[numberOfLayers]
virtual void setCurrentFolder(std::string const &fullpath)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
std::unique_ptr< TrackerTopology > tTopo_
void endRun(edm::Run const &, edm::EventSetup const &) override
#define DEFINE_FWK_MODULE(type)
void printAndWriteBadModules(const SiStripQuality &quality, const SiStripDetInfo &detInfo) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void makeSummaryVsLumi(DQMStore::IGetter &getter) const
const bool autoIneffModTagging_
Log< level::Error, false > LogError
const edm::ESGetToken< SiStripQuality, SiStripQualityRcd > stripQualityToken_
nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
constexpr std::array< uint8_t, layerIndexSize > layer
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tkGeomToken_
std::unique_ptr< TkDetMap > tkDetMap_
cond::Time_t currentTime() const
std::vector< DetId > stripDetIds_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
void printTotalStatistics(const std::array< long, bounds::k_END_OF_LAYERS > &layerFound, const std::array< long, bounds::k_END_OF_LAYERS > &layerTotal) const
void writeBadStripPayload(const SiStripQuality &quality) const
Hash writeOneIOV(const T &payload, Time_t time, const std::string &recordName)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
void makeSummaryVsBX(DQMStore::IGetter &getter, TFileService &fs) const
SiStripDetInfo read(std::string filePath)
bool getData(T &iHolder) const
void makeSummaryVsCM(DQMStore::IGetter &getter, TFileService &fs) const
SiStripHitEfficiencyHarvester(const edm::ParameterSet &)
Log< level::Info, false > LogInfo
void setBadComponents(int i, int component, const SiStripQuality::BadComponent &BC, int NBadComponent[4][19][4])
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
const std::pair< unsigned short, double > getNumberOfApvsAndStripLength(uint32_t detId) const
Constants and enumerated types for FED/FEC systems.
virtual TH1F * getTH1F() const
virtual MonitorElement * get(std::string const &fullpath) const
~SiStripHitEfficiencyHarvester() override=default
const unsigned int nTEClayers_
const std::string inputFolder_
static const uint16_t STRIPS_PER_APV
std::pair< ContainerIterator, ContainerIterator > Range
std::unique_ptr< SiStripQuality > stripQuality_
static constexpr char const *const kDefaultFile
const edm::ESGetToken< TkDetMap, TrackerTopologyRcd > tkDetMapToken_
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
bool checkMapsValidity(const std::vector< MonitorElement *> &maps, const std::string &type) const
void makeSummary(DQMStore::IGetter &getter, TFileService &fs) const
const std::string record_