26 #include <boost/type_index.hpp> 27 #include <fmt/printf.h> 33 #include "TEfficiency.h" 34 #include "TGraphAsymmErrors.h" 40 #define LOGPRINT edm::LogPrint("SiStripHitEfficiencyHarvester") 70 std::unique_ptr<TrackerTopology>
tTopo_;
89 const std::array<long, bounds::k_END_OF_LAYERS>& layerTotal)
const;
92 unsigned int countTotalHits(
const std::vector<MonitorElement*>& maps);
100 : inputFolder_(conf.getParameter<
std::
string>(
"inputFolder")),
101 isAtPCL_(conf.getParameter<
bool>(
"isAtPCL")),
102 autoIneffModTagging_(conf.getUntrackedParameter<
bool>(
"AutoIneffModTagging",
false)),
103 doStoreOnDB_(conf.getParameter<
bool>(
"doStoreOnDB")),
104 doStoreOnTree_(conf.getUntrackedParameter<
bool>(
"doStoreOnTree")),
105 showRings_(conf.getUntrackedParameter<
bool>(
"ShowRings",
false)),
106 showEndcapSides_(conf.getUntrackedParameter<
bool>(
"ShowEndcapSides",
true)),
107 showTOB6TEC9_(conf.getUntrackedParameter<
bool>(
"ShowTOB6TEC9",
false)),
108 showOnlyGoodModules_(conf.getUntrackedParameter<
bool>(
"ShowOnlyGoodModules",
false)),
109 nTEClayers_(showRings_ ? 7 : 9),
110 threshold_(conf.getParameter<double>(
"Threshold")),
111 nModsMin_(conf.getParameter<
int>(
"nModsMin")),
112 effPlotMin_(conf.getUntrackedParameter<double>(
"EffPlotMin", 0.9)),
113 tkMapMin_(conf.getUntrackedParameter<double>(
"TkMapMin", 0.9)),
114 title_(conf.getParameter<
std::
string>(
"Title")),
115 record_(conf.getParameter<
std::
string>(
"Record")),
121 for (
int l = 0;
l < bounds::k_END_OF_LAYS_AND_RINGS;
l++) {
141 for (
const auto& det : tkGeom.detUnits()) {
142 if (dynamic_cast<const StripGeomDetUnit*>(det)) {
151 std::vector<bool> isThere;
152 isThere.reserve(maps.size());
153 std::transform(maps.begin() + 1, maps.end(), std::back_inserter(isThere), [](
auto&
x) {
return !(
x ==
nullptr); });
156 for (
const auto& it : isThere) {
158 LogDebug(
"SiStripHitEfficiencyHarvester") <<
" layer: " <<
count <<
" " << it << std::endl;
160 LogDebug(
"SiStripHitEfficiencyHarvester") <<
"resolving to " << maps[
count]->getName() << std::endl;
164 bool areMapsAvailable{
true};
166 for (
const auto& it : isThere) {
170 <<
type <<
" TkHistoMap for layer " << layerCount <<
" was not found.\n -> Aborting!";
171 areMapsAvailable =
false;
175 return areMapsAvailable;
187 if (!
fs.isAvailable()) {
189 <<
"please add it to config file";
194 tree =
fs->make<TTree>(
"ModEff",
"ModEff");
197 tree->Branch(
"FoundHits", &
t_found,
"FoundHits/i");
207 LOGPRINT <<
"A module is bad if the upper limit on the efficiency is < to the avg in the layer - " <<
threshold_ 208 <<
" and has at least " <<
nModsMin_ <<
" nModsMin.";
210 auto h_module_total = std::make_unique<TkHistoMap>(
tkDetMap_.get());
212 auto h_module_found = std::make_unique<TkHistoMap>(
tkDetMap_.get());
216 const auto& totalMaps = h_module_total->getAllMaps();
217 const auto& foundMaps = h_module_found->getAllMaps();
219 LogDebug(
"SiStripHitEfficiencyHarvester")
220 <<
"totalMaps.size(): " << totalMaps.size() <<
" foundMaps.size() " << foundMaps.size() << std::endl;
226 LogDebug(
"SiStripHitEfficiencyHarvester")
227 <<
"isTotalMapAvailable: " << isTotalMapAvailable <<
" isFoundMapAvailable " << isFoundMapAvailable << std::endl;
230 if (!isTotalMapAvailable
or !isFoundMapAvailable)
233 LogDebug(
"SiStripHitEfficiencyHarvester")
234 <<
"Entries in total TkHistoMap for layer 3: " << h_module_total->getMap(3)->getEntries() <<
", found " 235 << h_module_found->getMap(3)->getEntries();
241 for (
size_t i = 1;
i < totalMaps.size();
i++) {
242 h_module_total->getMap(
i)->setOption(
"colz");
243 h_module_found->getMap(
i)->setOption(
"colz");
249 std::vector<MonitorElement*> hEffInLayer(std::size_t(1),
nullptr);
250 hEffInLayer.reserve(bounds::k_END_OF_LAYERS);
251 for (std::size_t
i = 1;
i != bounds::k_END_OF_LAYERS; ++
i) {
253 hEffInLayer.push_back(booker.
book1D(
254 Form(
"eff_layer%i",
int(
i)), Form(
"Module efficiency in layer %s", lyrName.c_str()), 201, 0, 1.005));
256 std::array<long, bounds::k_END_OF_LAYERS> layerTotal{};
257 std::array<long, bounds::k_END_OF_LAYERS> layerFound{};
269 TrackerMap tkMapDen{
" Detector denominator "};
270 std::map<unsigned int, double> badModules;
277 "perModule_FEDErrors");
283 LogDebug(
"SiStripHitEfficiencyHarvester")
284 << __PRETTY_FUNCTION__ <<
" bad module from FEDError " << badId <<
"," <<
fraction << std::endl;
289 const auto num = h_module_found->getValue(det);
290 const auto denom = h_module_total->getValue(det);
295 hEffInLayer[
layer]->Fill(eff);
299 badModules[det] = eff;
300 tkMapBad.fillc(det, 255, 0, 0);
302 << det.rawId() <<
" efficiency: " << eff <<
" , " <<
num <<
"/" <<
denom;
305 tkMapBad.fillc(det, 255, 255, 255);
309 << det.rawId() <<
" efficiency: " << eff <<
" , " <<
num <<
"/" <<
denom;
313 << det.rawId() <<
" is under occupancy at " <<
denom;
328 tkMap.fill(det, 1. - eff);
329 tkMapEff.fill(det, eff);
330 tkMapNum.fill(det,
num);
331 tkMapDen.fill(det,
denom);
338 if (
layer <= bounds::k_LayersAtTOBEnd) {
341 }
else if (
layer > bounds::k_LayersAtTOBEnd &&
layer <= bounds::k_LayersAtTIDEnd) {
342 if (
tTopo_->tidSide(det) == 1) {
345 }
else if (
tTopo_->tidSide(det) == 2) {
349 }
else if (
layer > bounds::k_LayersAtTIDEnd &&
layer <= bounds::k_LayersAtTECEnd) {
350 if (
tTopo_->tecSide(det) == 1) {
353 }
else if (
tTopo_->tecSide(det) == 2) {
361 if (
layer <= bounds::k_LayersAtTOBEnd) {
364 }
else if (
layer > bounds::k_LayersAtTOBEnd &&
layer <= bounds::k_LayersAtTIDEnd) {
365 if (
tTopo_->tidSide(det) == 1) {
368 }
else if (
tTopo_->tidSide(det) == 2) {
372 }
else if (
layer > bounds::k_LayersAtTIDEnd &&
layer <= bounds::k_LayersAtTECEnd) {
373 if (
tTopo_->tecSide(det) == 1) {
376 }
else if (
tTopo_->tecSide(det) == 2) {
386 for (
unsigned int i = 1;
i <= k_LayersAtTECEnd;
i++) {
388 hEffInLayer[
i]->getTH1()->GetXaxis()->SetRange(
389 3, hEffInLayer[
i]->getNbinsX() + 1);
390 const double layer_min_eff = hEffInLayer[
i]->getMean() -
std::max(2.5 * hEffInLayer[
i]->getRMS(),
threshold_);
391 LOGPRINT <<
"Layer " <<
i <<
" threshold for bad modules: <" << layer_min_eff
392 <<
" (layer mean: " << hEffInLayer[
i]->getMean() <<
" rms: " << hEffInLayer[
i]->getRMS() <<
")";
394 hEffInLayer[
i]->getTH1()->GetXaxis()->SetRange(1, hEffInLayer[
i]->getNbinsX() + 1);
399 const auto layer = ::checkLayer(det,
tTopo_.get());
401 const auto num = h_module_found->getValue(det);
402 const auto denom = h_module_total->getValue(det);
406 const auto eff_up = TEfficiency::Bayesian(
denom,
num, .99, 1, 1,
true);
410 badModules[det] = eff;
411 tkMapBad.fillc(det, 255, 0, 0);
417 tkMapBad.fillc(det, 255, 255, 255);
422 if (eff_up < layer_min_eff + 0.08) {
425 << det.rawId() <<
" efficiency: " << eff <<
" , " <<
num <<
"/" <<
denom 426 <<
" , upper limit: " << eff_up;
430 << det.rawId() <<
" layer " <<
layer <<
" is under occupancy at " <<
denom;
448 tkMap.save(
true, 0, 0,
"SiStripHitEffTKMap_NEW.png");
449 tkMapBad.save(
true, 0, 0,
"SiStripHitEffTKMapBad_NEW.png");
450 tkMapEff.save(
true,
tkMapMin_, 1.,
"SiStripHitEffTKMapEff_NEW.png");
451 tkMapNum.save(
true, 0, 0,
"SiStripHitEffTKMapNum_NEW.png");
452 tkMapDen.save(
true, 0, 0,
"SiStripHitEffTKMapDen_NEW.png");
460 for (
const auto it : badModules) {
461 const auto det = it.first;
462 std::vector<unsigned int> badStripList;
467 badStripList.push_back(pQuality.encode(0,
nStrips, 0));
469 LOGPRINT <<
"ID1 should match list of modules above " << det;
470 pQuality.compact(det, badStripList);
473 pQuality.fillBadComponents();
475 if (totalHits > 0u) {
479 << __PRETTY_FUNCTION__ <<
" There are no SiStrip hits for a valid measurement, skipping!";
482 edm::LogInfo(
"SiStripHitEfficiencyHarvester") <<
"Will not produce payload!";
498 const std::array<long, bounds::k_END_OF_LAYERS>& layerFound,
499 const std::array<long, bounds::k_END_OF_LAYERS>& layerTotal)
const {
504 int subdetfound[5] = {0, 0, 0, 0, 0};
505 int subdettotal[5] = {0, 0, 0, 0, 0};
507 for (
unsigned int i = 1;
i <= bounds::k_LayersAtTECEnd;
i++) {
508 layereff = double(layerFound[
i]) / double(layerTotal[
i]);
510 << layereff <<
" " << layerFound[
i] <<
"/" << layerTotal[
i];
511 totalfound += layerFound[
i];
512 totaltotal += layerTotal[
i];
513 if (
i <= bounds::k_LayersAtTIBEnd) {
514 subdetfound[1] += layerFound[
i];
515 subdettotal[1] += layerTotal[
i];
517 if (
i > bounds::k_LayersAtTIBEnd &&
i <= bounds::k_LayersAtTOBEnd) {
518 subdetfound[2] += layerFound[
i];
519 subdettotal[2] += layerTotal[
i];
521 if (
i > bounds::k_LayersAtTOBEnd &&
i <= bounds::k_LayersAtTIDEnd) {
522 subdetfound[3] += layerFound[
i];
523 subdettotal[3] += layerTotal[
i];
525 if (
i > bounds::k_LayersAtTIDEnd) {
526 subdetfound[4] += layerFound[
i];
527 subdettotal[4] += layerTotal[
i];
531 LOGPRINT <<
"The total efficiency is " << double(totalfound) / double(totaltotal);
532 LOGPRINT <<
" TIB: " << double(subdetfound[1]) / subdettotal[1] <<
" " << subdetfound[1] <<
"/" 534 LOGPRINT <<
" TOB: " << double(subdetfound[2]) / subdettotal[2] <<
" " << subdetfound[2] <<
"/" 536 LOGPRINT <<
" TID: " << double(subdetfound[3]) / subdettotal[3] <<
" " << subdetfound[3] <<
"/" 538 LOGPRINT <<
" TEC: " << double(subdetfound[4]) / subdettotal[4] <<
" " << subdetfound[4] <<
"/" 544 const auto pQdvBegin =
quality.getDataVectorBegin();
545 for (
auto rIt =
quality.getRegistryVectorBegin(); rIt !=
quality.getRegistryVectorEnd(); ++rIt) {
547 if (!pBadStrip.put(rIt->detid,
range))
548 edm::LogError(
"SiStripHitEfficiencyHarvester") <<
"detid already exists in SiStripBadStrip";
560 bool doProfiles)
const {
580 found->setBinContent(0, -1);
581 all->setBinContent(0, 1);
584 for (
unsigned int i = 1;
i <
nLayers + 2; ++
i) {
586 all->setBinContent(
i, 1);
591 TCanvas* c7 =
new TCanvas(
"c7",
" test ", 10, 10, 800, 600);
595 unsigned int nLayers_max =
nLayers + 1;
598 for (
unsigned int i = 1;
i < nLayers_max; ++
i) {
615 for (
unsigned int i = 11;
i < 14; ++
i) {
630 LOGPRINT <<
"Fill only good modules layer " <<
i - 3
637 LOGPRINT <<
"Filling all modules layer " <<
i - 3
647 found->getTH1F()->Sumw2();
648 all->getTH1F()->Sumw2();
656 booker.
book1D(
"eff_good",
"Strip hit efficiency for good modules",
nLayers + 1, 0,
nLayers + 1);
660 TProfile* profile_all = ::computeEff(found2->
getTH1F(), all2->
getTH1F(),
"all");
662 profile_all->SetTitle(
"Strip hit efficiency for all modules");
663 booker.
bookProfile(profile_all->GetName(), profile_all);
665 TProfile* profile_good = ::computeEff(
found->getTH1F(),
all->getTH1F(),
"good");
667 profile_good->SetTitle(
"Strip hit efficiency for good modules");
668 booker.
bookProfile(profile_good->GetName(), profile_good);
675 for (
int i = 1;
i <
found->getNbinsX();
i++) {
678 const auto& den_good =
all->getBinContent(
i);
679 const auto& num_good =
found->getBinContent(
i);
688 const auto& effPair_all = ::computeCPEfficiency(num_all, den_all);
700 const auto& effPair_good = ::computeCPEfficiency(num_good, den_good);
715 if (!
fs.isAvailable()) {
717 <<
"please add it to config file";
720 TGraphAsymmErrors* gr = (*fs).make<TGraphAsymmErrors>(
nLayers + 1);
721 gr->SetName(
"eff_good");
722 gr->BayesDivide(
found->getTH1F(),
all->getTH1F());
724 TGraphAsymmErrors* gr2 = (*fs).make<TGraphAsymmErrors>(
nLayers + 1);
725 gr2->SetName(
"eff_all");
728 for (
unsigned int j = 0;
j <
nLayers + 1;
j++) {
729 gr->SetPointError(
j, 0., 0., gr->GetErrorYlow(
j), gr->GetErrorYhigh(
j));
730 gr2->SetPointError(
j, 0., 0., gr2->GetErrorYlow(
j), gr2->GetErrorYhigh(
j));
735 gr->GetXaxis()->SetLimits(0,
nLayers);
736 gr->SetMarkerColor(2);
737 gr->SetMarkerSize(1.2);
740 gr->SetMarkerStyle(20);
742 gr->SetMaximum(1.001);
743 gr->GetYaxis()->SetTitle(
"Efficiency");
744 gStyle->SetTitleFillColor(0);
745 gStyle->SetTitleBorderSize(0);
746 gr->SetTitle(
"SiStripHitEfficiency by Layer");
748 gr2->GetXaxis()->SetLimits(0,
nLayers);
749 gr2->SetMarkerColor(1);
750 gr2->SetMarkerSize(1.2);
751 gr2->SetLineColor(1);
752 gr2->SetLineWidth(4);
753 gr2->SetMarkerStyle(21);
755 gr2->SetMaximum(1.001);
756 gr2->GetYaxis()->SetTitle(
"Efficiency");
757 gr2->SetTitle(
"SiStripHitEfficiency by Layer");
760 gr->GetXaxis()->SetNdivisions(36);
763 TPad*
overlay =
new TPad(
"overlay",
"", 0, 0, 1, 1);
766 overlay->SetFrameFillStyle(4000);
772 TLegend* leg =
new TLegend(0.70, 0.27, 0.88, 0.40);
773 leg->AddEntry(gr,
"Good Modules",
"p");
775 leg->AddEntry(gr2,
"All Modules",
"p");
776 leg->SetTextSize(0.020);
777 leg->SetFillColor(0);
780 c7->SaveAs(
"Summary.png");
781 c7->SaveAs(
"Summary.root");
785 template <
typename T>
787 LogDebug(
"SiStripHitEfficiencyHarvester")
788 <<
"nLayers = " <<
nLayers <<
" number of bins, gr1: " << gr->GetXaxis()->GetNbins()
789 <<
" number of bins, gr2: " << gr2->GetXaxis()->GetNbins() <<
" showRings: " <<
showRings_ 791 << boost::typeindex::type_id<T>().pretty_name();
793 for (
unsigned int k = 1;
k <
nLayers + 1;
k++) {
809 if constexpr (std::is_same_v<T, TGraphAsymmErrors*>) {
811 <<
"class name: " << gr->ClassName() <<
" expected TGraphAsymErrors" << std::endl;
827 <<
"class name: " << gr->ClassName() <<
" expected TH1F" << std::endl;
830 gr->GetXaxis()->SetBinLabel(
bin,
label.data());
831 gr2->GetXaxis()->SetBinLabel(
bin,
label.data());
838 std::vector<MonitorElement*> effVsVariable;
841 const auto& folderString = ::projFolder[theProj];
842 const auto& foundHistoString = ::projFoundHisto[theProj];
843 const auto& totalHistoString = ::projTotalHisto[theProj];
844 const auto& titleString = ::projTitle[theProj];
845 const auto& titleXString = ::projXtitle[theProj];
847 LogDebug(
"SiStripHitEfficiencyHarvester")
848 <<
" inside" << __PRETTY_FUNCTION__ <<
" from " << ::projFolder[theProj] <<
" " << __LINE__ << std::endl;
850 for (
unsigned int iLayer = 1; iLayer != (
showRings_ ? 20 : 22); ++iLayer) {
851 LogDebug(
"SiStripHitEfficiencyHarvester")
852 <<
"iLayer " << iLayer <<
" " <<
fmt::format(
"{}/{}/{}{}",
inputFolder_, folderString, foundHistoString, iLayer)
859 if (hfound ==
nullptr or htotal ==
nullptr) {
860 if (hfound ==
nullptr)
863 if (htotal ==
nullptr)
871 if (!hfound->getTH1F()->GetSumw2())
872 hfound->getTH1F()->Sumw2();
873 if (!htotal->getTH1F()->GetSumw2())
874 htotal->getTH1F()->Sumw2();
877 for (
int i = 0;
i != hfound->getNbinsX() + 1; ++
i) {
878 if (hfound->getBinContent(
i) == 0)
879 hfound->setBinContent(
i, 1
e-6);
880 if (htotal->getBinContent(
i) == 0)
881 htotal->setBinContent(
i, 1);
883 LogDebug(
"SiStripHitEfficiencyHarvester") <<
"Total hits for layer " << iLayer <<
" (" << folderString
884 <<
"): " << htotal->getEntries() <<
", found " << hfound->getEntries();
887 effVsVariable[iLayer] = booker.
book1D(
888 fmt::sprintf(
"eff%sLayer%s", folderString, lyrName),
889 fmt::sprintf(
"Efficiency vs %s for layer %s;%s;SiStrip Hit efficiency", titleString, lyrName, titleXString),
891 hfound->getAxisMin(),
892 hfound->getAxisMax());
894 LogDebug(
"SiStripHitEfficiencyHarvester")
895 <<
" bin 0 " << hfound->getAxisMin() <<
" bin last: " << hfound->getAxisMax() << std::endl;
897 for (
int i = 0;
i != hfound->getNbinsX() + 1; ++
i) {
898 const auto& den = htotal->getBinContent(
i);
899 const auto&
num = hfound->getBinContent(
i);
903 const auto& effPair = ::computeCPEfficiency(
num, den);
904 effVsVariable[iLayer]->setBinContent(
i, effPair.value());
905 effVsVariable[iLayer]->setBinError(
i, effPair.error());
907 LogDebug(
"SiStripHitEfficiencyHarvester")
908 << __PRETTY_FUNCTION__ <<
" " << lyrName <<
" bin:" <<
i <<
" err:" << effPair.error() << std::endl;
913 effVsVariable[iLayer]->getTH1F()->SetMinimum(
tkMapMin_);
916 TProfile*
profile = ::computeEff(hfound->getTH1F(), htotal->getTH1F(), lyrName);
918 fmt::sprintf(
"Efficiency vs %s for layer %s;%s;SiStrip Hit efficiency", titleString, lyrName, titleXString);
932 std::stringstream ssV[4][19],
941 ssV[
i][
comp] <<
" \t " << ((bc.
BadApvs) & 0
x1) <<
" " << ((bc.BadApvs >> 1) & 0
x1) <<
" ";
943 ssV[
i][
comp] <<
"x x " << ((bc.BadApvs >> 2) & 0
x1) <<
" " << ((bc.BadApvs >> 3) & 0
x1);
945 ssV[
i][
comp] << ((bc.BadApvs >> 2) & 0
x1) <<
" " << ((bc.BadApvs >> 3) & 0
x1) <<
" " << ((bc.BadApvs >> 4) & 0
x1)
946 <<
" " << ((bc.BadApvs >> 5) & 0
x1) <<
" ";
949 nBad[
i][0][2] += ((bc.BadApvs >> 5) & 0
x1) + ((bc.BadApvs >> 4) & 0
x1) + ((bc.BadApvs >> 3) & 0
x1) +
950 ((bc.BadApvs >> 2) & 0
x1) + ((bc.BadApvs >> 1) & 0
x1) + ((bc.BadApvs) & 0
x1);
951 nBad[
i][
comp][2] += ((bc.BadApvs >> 5) & 0
x1) + ((bc.BadApvs >> 4) & 0
x1) + ((bc.BadApvs >> 3) & 0
x1) +
952 ((bc.BadApvs >> 2) & 0
x1) + ((bc.BadApvs >> 1) & 0
x1) + ((bc.BadApvs) & 0
x1);
955 nBad[
i][0][1] += ((bc.BadFibers >> 2) & 0
x1) + ((bc.BadFibers >> 1) & 0
x1) + ((bc.BadFibers) & 0
x1);
956 nBad[
i][
comp][1] += ((bc.BadFibers >> 2) & 0
x1) + ((bc.BadFibers >> 1) & 0
x1) + ((bc.BadFibers) & 0
x1);
971 int nBadComp[4][19][4];
975 std::stringstream ssV[4][19];
977 for (
int i = 0;
i < 4; ++
i) {
979 for (
int j = 0;
j < 19; ++
j) {
981 for (
int k = 0;
k < 4; ++
k)
982 nBadComp[
i][
j][
k] = 0;
986 for (
const auto& bc :
quality.getBadComponentList()) {
991 nTkBadComp[1] += ((bc.BadFibers >> 2) & 0
x1) + ((bc.BadFibers >> 1) & 0
x1) + ((bc.BadFibers) & 0
x1);
993 nTkBadComp[2] += ((bc.BadApvs >> 5) & 0
x1) + ((bc.BadApvs >> 4) & 0
x1) + ((bc.BadApvs >> 3) & 0
x1) +
994 ((bc.BadApvs >> 2) & 0
x1) + ((bc.BadApvs >> 1) & 0
x1) + ((bc.BadApvs) & 0
x1);
1028 for (
auto rp =
quality.getRegistryVectorBegin(); rp !=
quality.getRegistryVectorEnd(); ++rp) {
1029 DetId det{rp->detid};
1031 int component = -999;
1032 switch (det.subdetId()) {
1035 component =
tTopo_->tibLayer(det);
1039 component =
tTopo_->tidSide(det) == 2 ?
tTopo_->tidWheel(det) :
tTopo_->tidWheel(det) + 3;
1043 component =
tTopo_->tobLayer(det);
1047 component =
tTopo_->tecSide(det) == 2 ?
tTopo_->tecWheel(det) :
tTopo_->tecWheel(det) + 9;
1053 const auto pQdvBegin =
quality.getDataVectorBegin();
1055 float percentage = 0;
1056 for (
int it = 0; it < sqrange.second - sqrange.first; it++) {
1057 unsigned int range =
quality.decode(*(sqrange.first + it)).range;
1058 nTkBadComp[3] +=
range;
1059 nBadComp[subdet][0][3] +=
range;
1060 nBadComp[subdet][component][3] +=
range;
1061 percentage +=
range;
1063 if (percentage != 0)
1066 edm::LogError(
"SiStripHitEfficiencyHarvester") <<
"PROBLEM detid " << det.rawId() <<
" value " << percentage;
1070 std::ostringstream
ss;
1071 ss <<
"\n-----------------\nGlobal Info\n-----------------";
1072 ss <<
"\nBadComp \t Modules \tFibers " 1073 "\tApvs\tStrips\n----------------------------------------------------------------";
1074 ss <<
"\nTracker:\t\t" << nTkBadComp[0] <<
"\t" << nTkBadComp[1] <<
"\t" << nTkBadComp[2] <<
"\t" << nTkBadComp[3];
1075 ss <<
"\nTIB:\t\t\t" << nBadComp[0][0][0] <<
"\t" << nBadComp[0][0][1] <<
"\t" << nBadComp[0][0][2] <<
"\t" 1076 << nBadComp[0][0][3];
1077 ss <<
"\nTID:\t\t\t" << nBadComp[1][0][0] <<
"\t" << nBadComp[1][0][1] <<
"\t" << nBadComp[1][0][2] <<
"\t" 1078 << nBadComp[1][0][3];
1079 ss <<
"\nTOB:\t\t\t" << nBadComp[2][0][0] <<
"\t" << nBadComp[2][0][1] <<
"\t" << nBadComp[2][0][2] <<
"\t" 1080 << nBadComp[2][0][3];
1081 ss <<
"\nTEC:\t\t\t" << nBadComp[3][0][0] <<
"\t" << nBadComp[3][0][1] <<
"\t" << nBadComp[3][0][2] <<
"\t" 1082 << nBadComp[3][0][3];
1085 for (
int i = 1;
i < 5; ++
i)
1086 ss <<
"\nTIB Layer " <<
i <<
" :\t\t" << nBadComp[0][
i][0] <<
"\t" << nBadComp[0][
i][1] <<
"\t" << nBadComp[0][
i][2]
1087 <<
"\t" << nBadComp[0][
i][3];
1089 for (
int i = 1;
i < 4; ++
i)
1090 ss <<
"\nTID+ Disk " <<
i <<
" :\t\t" << nBadComp[1][
i][0] <<
"\t" << nBadComp[1][
i][1] <<
"\t" << nBadComp[1][
i][2]
1091 <<
"\t" << nBadComp[1][
i][3];
1092 for (
int i = 4;
i < 7; ++
i)
1093 ss <<
"\nTID- Disk " <<
i - 3 <<
" :\t\t" << nBadComp[1][
i][0] <<
"\t" << nBadComp[1][
i][1] <<
"\t" 1094 << nBadComp[1][
i][2] <<
"\t" << nBadComp[1][
i][3];
1096 for (
int i = 1;
i < 7; ++
i)
1097 ss <<
"\nTOB Layer " <<
i <<
" :\t\t" << nBadComp[2][
i][0] <<
"\t" << nBadComp[2][
i][1] <<
"\t" << nBadComp[2][
i][2]
1098 <<
"\t" << nBadComp[2][
i][3];
1100 for (
int i = 1;
i < 10; ++
i)
1101 ss <<
"\nTEC+ Disk " <<
i <<
" :\t\t" << nBadComp[3][
i][0] <<
"\t" << nBadComp[3][
i][1] <<
"\t" << nBadComp[3][
i][2]
1102 <<
"\t" << nBadComp[3][
i][3];
1103 for (
int i = 10;
i < 19; ++
i)
1104 ss <<
"\nTEC- Disk " <<
i - 9 <<
" :\t\t" << nBadComp[3][
i][0] <<
"\t" << nBadComp[3][
i][1] <<
"\t" 1105 << nBadComp[3][
i][2] <<
"\t" << nBadComp[3][
i][3];
1108 ss <<
"\n----------------------------------------------------------------\n\t\t Detid \tModules Fibers " 1109 "Apvs\n----------------------------------------------------------------";
1110 for (
int i = 1;
i < 5; ++
i)
1111 ss <<
"\nTIB Layer " <<
i <<
" :" << ssV[0][
i].
str();
1113 for (
int i = 1;
i < 4; ++
i)
1114 ss <<
"\nTID+ Disk " <<
i <<
" :" << ssV[1][
i].
str();
1115 for (
int i = 4;
i < 7; ++
i)
1116 ss <<
"\nTID- Disk " <<
i - 3 <<
" :" << ssV[1][
i].
str();
1118 for (
int i = 1;
i < 7; ++
i)
1119 ss <<
"\nTOB Layer " <<
i <<
" :" << ssV[2][
i].
str();
1121 for (
int i = 1;
i < 10; ++
i)
1122 ss <<
"\nTEC+ Disk " <<
i <<
" :" << ssV[3][
i].
str();
1123 for (
int i = 10;
i < 19; ++
i)
1124 ss <<
"\nTEC- Disk " <<
i - 9 <<
" :" << ssV[3][
i].
str();
1129 std::ofstream badModules;
1130 badModules.open(
"BadModules_NEW.log");
1131 badModules <<
"\n----------------------------------------------------------------\n\t\t Detid \tModules Fibers " 1132 "Apvs\n----------------------------------------------------------------";
1133 for (
int i = 1;
i < 5; ++
i)
1134 badModules <<
"\nTIB Layer " <<
i <<
" :" << ssV[0][
i].
str();
1136 for (
int i = 1;
i < 4; ++
i)
1137 badModules <<
"\nTID+ Disk " <<
i <<
" :" << ssV[1][
i].
str();
1138 for (
int i = 4;
i < 7; ++
i)
1139 badModules <<
"\nTID- Disk " <<
i - 3 <<
" :" << ssV[1][
i].
str();
1141 for (
int i = 1;
i < 7; ++
i)
1142 badModules <<
"\nTOB Layer " <<
i <<
" :" << ssV[2][
i].
str();
1144 for (
int i = 1;
i < 10; ++
i)
1145 badModules <<
"\nTEC+ Disk " <<
i <<
" :" << ssV[3][
i].
str();
1146 for (
int i = 10;
i < 19; ++
i)
1147 badModules <<
"\nTEC- Disk " <<
i - 9 <<
" :" << ssV[3][
i].
str();
1153 desc.add<
std::string>(
"inputFolder",
"AlCaReco/SiStripHitEfficiency");
1154 desc.add<
bool>(
"isAtPCL",
false);
1155 desc.add<
bool>(
"doStoreOnDB",
false);
1157 desc.add<
double>(
"Threshold", 0.1);
1159 desc.add<
int>(
"nModsMin", 5);
1160 desc.addUntracked<
bool>(
"doStoreOnTree",
false);
1161 desc.addUntracked<
bool>(
"AutoIneffModTagging",
false);
1162 desc.addUntracked<
double>(
"TkMapMin", 0.9);
1163 desc.addUntracked<
double>(
"EffPlotMin", 0.9);
1164 desc.addUntracked<
bool>(
"ShowRings",
false);
1165 desc.addUntracked<
bool>(
"ShowEndcapSides",
true);
1166 desc.addUntracked<
bool>(
"ShowTOB6TEC9",
false);
1167 desc.addUntracked<
bool>(
"ShowOnlyGoodModules",
false);
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
const bool doStoreOnTree_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
void setEffBinLabels(const T gr, const T gr2, const unsigned int nLayers) const
void makeSummary(DQMStore::IGetter &getter, DQMStore::IBooker &booker, bool doProfiles=false) const
int goodlayerfound[bounds::k_END_OF_LAYS_AND_RINGS]
int goodlayertotal[bounds::k_END_OF_LAYS_AND_RINGS]
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
int alllayertotal[bounds::k_END_OF_LAYS_AND_RINGS]
void printAndWriteBadModules(const SiStripQuality &quality, const SiStripDetInfo &detInfo) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const bool autoIneffModTagging_
Log< level::Error, false > LogError
std::unordered_map< uint32_t, int > fedErrorCounts
const bool showEndcapSides_
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...
std::unique_ptr< TkHistoMap > FEDErrorOccupancy
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tkGeomToken_
def overlay(hists, ytitle, header, addon)
std::unique_ptr< TkDetMap > tkDetMap_
cond::Time_t currentTime() const
std::vector< DetId > stripDetIds_
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
const bool checkFedError(const DetId det)
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
unsigned int countTotalHits(const std::vector< MonitorElement *> &maps)
void writeBadStripPayload(const SiStripQuality &quality) const
Hash writeOneIOV(const T &payload, Time_t time, const std::string &recordName)
#define DEFINE_FWK_MODULE(type)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
SiStripDetInfo read(std::string filePath)
Log< level::Warning, true > LogPrint
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
void fillMapFromTkMap(const int nevents, const float threshold, const std::vector< DetId > &stripDetIds)
const std::pair< unsigned short, double > getNumberOfApvsAndStripLength(uint32_t detId) const
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
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_
const bool showOnlyGoodModules_
static const uint16_t STRIPS_PER_APV
std::pair< ContainerIterator, ContainerIterator > Range
std::unique_ptr< SiStripQuality > stripQuality_
int alllayerfound[bounds::k_END_OF_LAYS_AND_RINGS]
static constexpr char const *const kDefaultFile
virtual void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
void makeSummaryVsVariable(DQMStore::IGetter &getter, DQMStore::IBooker &booker, ::projections theProj) const
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
const std::string record_
virtual double getBinContent(int binx) const
get content of bin (1-D)
SiStripHitEffData calibData_