682 std::vector<int>
GetDeadTubes(TH1F* h_tube,
int& validity, std::vector<int>& deadML_v, std::vector<int>& deadLayer_v,
683 std::vector<int>& deadMezz_v) {
685 TString chamber = ((TString) h_tube->GetName())(0, 7);
686 int totalTubes = h_tube->GetNbinsX();
688 std::vector<int> non_empty, non_empty_non_noisy, no_betweens, no_betweens_middle, no_betweens_lowmiddle,
689 no_betweens_middle_aggressive, no_betweens_lowmiddle_aggressive, deadlist, surelydeadlist,
690 betweenlist, inefflist,
692 std::vector<int> all_tubes_DeadRegionsRemoved;
696 getNotInDeadML(all_tubes_DeadRegionsRemoved, deadML_v, chamber, totalTubes);
697 getNotInDeadLayer(all_tubes_DeadRegionsRemoved, deadLayer_v, chamber, totalTubes);
698 getNotInDeadMezz(all_tubes_DeadRegionsRemoved, deadMezz_v, chamber, totalTubes);
702 getBins(h_tube, all_tubes_DeadRegionsRemoved, no_betweens);
711 getIneffList2(all_tubes_DeadRegionsRemoved, h_tube, no_betweens_middle, no_betweens_lowmiddle_aggressive, 10.0,
722 return std::vector<int>();
728 TString hardware_name = ((TString) h_tube->GetName())(0, 7);
731 if (hardware_name(0, 4) ==
"BMS4" || hardware_name(0, 4) ==
"BMS6") {
732 if (numLayers <= 3) {
734 41, 42, 43, 44, 45, 46, 47, 48, 89, 90, 91, 92, 93, 94, 95, 96, 137, 138, 139, 140, 141, 142, 143, 144
736 return std::vector<int>(cutouts, cutouts + 24);
739 if (hardware_name(0, 3) ==
"BIR" && numLayers <= 4) {
740 if (hardware_name(5, 2) ==
"11" || hardware_name(5, 2) ==
"15") {
741 if (hardware_name(3, 1) ==
"1") {
743 1, 2, 3, 4, 5, 6, 31, 32, 33, 34, 35, 36, 61, 62, 63, 64, 65, 66, 91, 92, 93, 94, 95, 96
745 return std::vector<int>(cutouts, cutouts + 24);
747 if (hardware_name(3, 1) ==
"2") {
749 28, 29, 30, 58, 59, 60, 88, 89, 90, 118, 119, 120
751 return std::vector<int>(cutouts, cutouts + 12);
753 if (hardware_name(3, 1) ==
"4") {
755 1, 2, 3, 31, 32, 33, 61, 62, 63, 91, 92, 93
757 return std::vector<int>(cutouts, cutouts + 12);
759 if (hardware_name(3, 1) ==
"5") {
761 22, 23, 24, 46, 47, 48, 70, 71, 72, 94, 95, 96
763 return std::vector<int>(cutouts, cutouts + 12);
767 if (hardware_name(0, 3) ==
"BIR" && hardware_name(3, 1) ==
"3") {
769 34, 35, 36, 70, 71, 72, 106, 107, 108, 142, 143, 144, 178, 179, 180, 214, 215, 216, 250, 251, 252, 286, 287, 288
771 return std::vector<int>(cutouts, cutouts + 24);
774 return std::vector<int>();
1314 FindDeadMezz(TH1F* h_tube,
const TString& hardware_name, std::vector<int>& deadML_v) {
1317 int totalTubes = h_tube->GetNbinsX();
1319 int numML =
GetNumML(hardware_name);
1321 std::vector<TubeRange> tubeRange =
getMezzRanges(hardware_name, totalTubes, groupsPerLayer);
1322 int numMezz = groupsPerLayer * numML;
1323 std::vector<double> means;
1324 std::vector<int> valuesAll;
1326 sort(valuesAll.begin(), valuesAll.end());
1327 int crustSize = (valuesAll.size()) / 3;
1328 int crustCutoff = 0;
1329 if (valuesAll.size() > 0) crustCutoff = valuesAll.at(valuesAll.size() - 1 - crustSize);
1330 for (
unsigned int i = 0; i < tubeRange.size(); i++) {
1331 std::vector<int> valuesInRange_crusted;
1333 i).x1, tubeRange.at(i).x2);
1336 if (valuesInRange_crusted.size() > 0) {
1337 means.push_back(
getMean(valuesInRange_crusted));
1338 }
else means.push_back(crustCutoff);
1344 std::vector<std::vector<double> > mezz_means(numMezz);
1347 for (
unsigned int k = 0; k < means.size(); k++) {
1348 if (numML == 2 && k >= means.size() / 2) {
1351 mezz_means.at((k % groupsPerLayer) + groupsPerLayer).push_back(means.at(k));
1355 mezz_means.at((k % groupsPerLayer)).push_back(means.at(k));
1359 double mean_of_means =
getMean(means);
1360 std::vector<int> deviant_mezz;
1361 for (
unsigned int i = 0; i < mezz_means.size(); ++i) {
1363 bool deviant =
true;
1364 for (
unsigned int j = 0; j < mezz_means.at(i).size(); j++) {
1367 if (!(mezz_means.at(i).at(j) < 0.25 * mean_of_means)) deviant =
false;
1369 if (deviant && !
AinB(
Get_ML_of_Mezz(mezz, hardware_name, totalTubes), deadML_v)) deviant_mezz.push_back(mezz);
1375 return deviant_mezz;
1470 void FillPDF(
const std::string& inFilename, TH1F* hDead, TH1F* hNoise, TCanvas* c,
1471 const vector<int>* deadTubes,
const vector<int>* deadASD,
const vector<int>* deadMEZZ,
1472 const vector<int>* deadLayer,
const vector<int>* deadML,
1473 const vector<int>* noisyTubes,
const vector<int>* noisyASD,
const vector<int>* noisyMEZZ,
1474 const vector<int>* noisyLayer,
const vector<int>* noisyML,
1475 int deadTubesChamberValidity,
int noisyTubesChamberValidity,
1476 bool draw_Mezz_L_ML_guidlines,
bool draw_mean,
bool draw_masked_tubes,
bool separate_dead_noisy_histos,
1477 bool draw_validity_message,
bool draw_histo_if_nothing_to_report) {
1478 if (!noisyML)
return;
1480 if (!noisyLayer)
return;
1482 if (!noisyMEZZ)
return;
1484 if (!noisyASD)
return;
1486 if (!deadASD)
return;
1488 if (!draw_histo_if_nothing_to_report && deadTubes->size() == 0 && noisyTubes->size() == 0 && deadML->size() == 0 &&
1489 deadLayer->size() == 0 && deadMEZZ->size() == 0)
return;
1493 if (!hNoise)
return;
1496 if (separate_dead_noisy_histos) c->Divide(2, 1);
1497 TString chamberName = ((TString) hDead->GetName())(0, 7);
1498 c->SetTitle(chamberName);
1501 TH1F* hOnlyDead =
new TH1F(hDead->GetName(), hDead->GetTitle(), hDead->GetNbinsX(), 1, hDead->GetNbinsX());
1502 TH1F* hOnlyNoise =
new TH1F(hNoise->GetName(), hNoise->GetTitle(), hNoise->GetNbinsX(), 1, hNoise->GetNbinsX());
1504 TString maskedStr = hDead->GetName();
1505 maskedStr +=
"_masked";
1506 TH1F* hOnlyMaskedDead =
new TH1F(maskedStr, hDead->GetTitle(), hDead->GetNbinsX(), 1, hDead->GetNbinsX());
1509 std::vector<TLine> rangeLines;
1510 std::vector<TLine> rangeLines_onlyMLLMezz;
1511 std::vector<TubeRange> tubeRange =
getLayerRanges(chamberName, hDead->GetNbinsX());
1512 for (
unsigned int i = 0; i < tubeRange.size(); i++) {
1513 TLine l(hDead->GetBinLowEdge(tubeRange.at(i).x1) + hDead->GetBinWidth(tubeRange.at(
1514 i).x1) / 2.0,
LAYER_POS, hDead->GetBinLowEdge(tubeRange.at(
1515 i).x2) + hDead->GetBinWidth(tubeRange.at(
1518 if (i % 2 == 0) l.SetLineColor(kViolet);
1519 else l.SetLineColor(kViolet + 6);
1522 rangeLines_onlyMLLMezz.push_back(l);
1523 if (
AinB(layer, deadLayer)) {
1524 l.SetLineColor(kRed);
1526 rangeLines.push_back(l);
1527 }
else if (draw_Mezz_L_ML_guidlines) {
1528 rangeLines.push_back(l);
1532 tubeRange =
getMLRanges(chamberName, hDead->GetNbinsX());
1533 for (
unsigned int i = 0; i < tubeRange.size(); i++) {
1534 TLine l(hDead->GetBinLowEdge(tubeRange.at(i).x1) + hDead->GetBinWidth(tubeRange.at(
1535 i).x1) / 2.0,
ML_POS, hDead->GetBinLowEdge(tubeRange.at(
1536 i).x2) + hDead->GetBinWidth(tubeRange.at(
1539 if (i % 2 == 0) l.SetLineColor(kViolet);
1540 else l.SetLineColor(kViolet + 6);
1541 int multilayer = i + 1;
1543 rangeLines_onlyMLLMezz.push_back(l);
1544 if (
AinB(multilayer, deadML)) {
1545 l.SetLineColor(kRed);
1547 rangeLines.push_back(l);
1548 }
else if (draw_Mezz_L_ML_guidlines) {
1550 rangeLines.push_back(l);
1555 tubeRange =
getMezzRanges(chamberName, hDead->GetNbinsX(), groupsPerLayer);
1556 for (
unsigned int i = 0; i < tubeRange.size(); i++) {
1557 TLine l(hDead->GetBinLowEdge(tubeRange.at(i).x1) + hDead->GetBinWidth(tubeRange.at(
1558 i).x1) / 2.0,
MEZZ_POS, hDead->GetBinLowEdge(tubeRange.at(
1559 i).x2) + hDead->GetBinWidth(tubeRange.at(
1562 l.SetLineColor(kViolet + (i % groupsPerLayer));
1563 int mezz = i % groupsPerLayer + 1;
1565 if (numML == 2 && i >= tubeRange.size() / 2) {
1566 mezz += groupsPerLayer;
1569 rangeLines_onlyMLLMezz.push_back(l);
1570 if (
AinB(mezz, deadMEZZ)) {
1571 l.SetLineColor(kRed);
1573 rangeLines.push_back(l);
1574 }
else if (draw_Mezz_L_ML_guidlines) {
1576 rangeLines.push_back(l);
1581 std::vector<TLine> rangeLines_dead;
1584 double dev_low =
mean - stddev;
1585 double dev_high =
mean + stddev;
1587 if (dev_high > 2. * hDead->GetMaximum()) dev_high = 2. * hDead->GetMaximum() - 1.;
1589 TLine l_mean(hDead->GetBinLowEdge(1),
mean, hDead->GetBinLowEdge(hDead->GetNbinsX()),
mean);
1590 l_mean.SetLineColor(kGreen + 3);
1591 l_mean.SetLineWidth(2);
1592 rangeLines_dead.push_back(l_mean);
1593 TLine l_dev_low(hDead->GetBinLowEdge(1), dev_low, hDead->GetBinLowEdge(hDead->GetNbinsX()), dev_low);
1594 l_dev_low.SetLineColor(kGreen);
1595 l_dev_low.SetLineWidth(2);
1596 rangeLines_dead.push_back(l_dev_low);
1597 TLine l_dev_high(hDead->GetBinLowEdge(1), dev_high, hDead->GetBinLowEdge(hDead->GetNbinsX()), dev_high);
1598 l_dev_high.SetLineColor(kGreen);
1599 l_dev_high.SetLineWidth(2);
1600 rangeLines_dead.push_back(l_dev_high);
1602 std::vector<TLine> rangeLines_noise;
1605 dev_low =
mean - stddev;
1606 dev_high =
mean + stddev;
1608 if (dev_high > 2. * hNoise->GetMaximum()) dev_high = 2. * hNoise->GetMaximum() - 1.;
1610 TLine l_mean(hNoise->GetBinLowEdge(1),
mean, hNoise->GetBinLowEdge(hNoise->GetNbinsX()),
mean);
1611 l_mean.SetLineColor(kGreen + 3);
1612 l_mean.SetLineWidth(2);
1613 rangeLines_noise.push_back(l_mean);
1614 TLine l_dev_low(hNoise->GetBinLowEdge(1), dev_low, hNoise->GetBinLowEdge(hNoise->GetNbinsX()), dev_low);
1615 l_dev_low.SetLineColor(kGreen);
1616 l_dev_low.SetLineWidth(2);
1617 rangeLines_noise.push_back(l_dev_low);
1618 TLine l_dev_high(hNoise->GetBinLowEdge(1), dev_high, hNoise->GetBinLowEdge(hNoise->GetNbinsX()), dev_high);
1619 l_dev_high.SetLineColor(kGreen);
1620 l_dev_high.SetLineWidth(2);
1621 rangeLines_noise.push_back(l_dev_high);
1625 for (
unsigned i = 0; i != noisyTubes->size(); ++i) {
1626 int TubeId = noisyTubes->at(i);
1627 if (hNoise->At(TubeId) < 1.) {
1629 hOnlyNoise->SetBinError(TubeId, 0.001);
1631 if (separate_dead_noisy_histos) hOnlyNoise->SetBinContent(TubeId, hNoise->GetBinContent(TubeId));
1632 else hOnlyNoise->SetBinContent(TubeId, hDead->GetBinContent(TubeId));
1633 hOnlyNoise->SetBinError(TubeId, 0.001);
1637 for (
unsigned i = 0; i != deadTubes->size(); ++i) {
1638 int TubeId = deadTubes->at(i);
1639 if (hDead->At(TubeId) < 1.) {
1641 hOnlyDead->SetBinError(TubeId, 0.001);
1643 hOnlyDead->SetBinContent(TubeId, hDead->GetBinContent(TubeId));
1644 hOnlyDead->SetBinError(TubeId, 0.001);
1648 for (
unsigned i = 0; i != maskedTubesForDead.size(); ++i) {
1649 int TubeId = maskedTubesForDead.at(i);
1650 if (hDead->At(TubeId) < 1.) {
1652 hOnlyMaskedDead->SetBinError(TubeId, 0.001);
1654 hOnlyMaskedDead->SetBinContent(TubeId, hDead->GetBinContent(TubeId));
1655 hOnlyMaskedDead->SetBinError(TubeId, 0.001);
1671 double maxy_dead = hDead->GetMaximum() + 1.1;
1672 hDead->SetAxisRange(0.1, 2 * maxy_dead,
"y");
1673 hOnlyDead->SetMarkerColor(kRed);
1674 hOnlyDead->SetMarkerStyle(22);
1675 hOnlyDead->SetMarkerSize(1);
1676 hOnlyDead->SetAxisRange(0.1, 2 * maxy_dead,
"y");
1677 hOnlyMaskedDead->SetMarkerColor(kBlue);
1678 hOnlyMaskedDead->SetMarkerStyle(21);
1679 hOnlyMaskedDead->SetMarkerSize(.5);
1680 hOnlyMaskedDead->SetAxisRange(0.1, 2 * maxy_dead,
"y");
1682 double maxy_noise = hNoise->GetMaximum() + 1.1;
1683 hNoise->SetAxisRange(0.1, 2 * maxy_noise,
"y");
1684 hOnlyNoise->SetMarkerColor(kRed);
1685 hOnlyNoise->SetMarkerStyle(22);
1686 hOnlyNoise->SetMarkerSize(1);
1687 hOnlyNoise->SetAxisRange(0.1, 2 * maxy_noise,
"y");
1691 TText validityFailAll(1, 1,
"FAILED VALIDITY CHECKS");
1692 TText validityFailDead(1, 1,
"FAILED VALIDITY CHECKS FOR DEAD TUBES");
1693 TText validityFailNoise(2, 2,
"FAILED VALIDITY CHECKS FOR NOISY TUBES");
1694 TText validityFailNoiseRetry(1, 1,
"VALIDITY: USING ALL HITS HISTO");
1699 if (draw_masked_tubes) hOnlyMaskedDead->Draw(
"same");
1700 hOnlyDead->Draw(
"same");
1701 for (
unsigned int i = 0; i < rangeLines.size(); i++) rangeLines.at(i).Draw(
"same");
1703 for (
unsigned int i = 0; i < rangeLines_dead.size(); i++) rangeLines_dead.at(i).Draw(
"same");
1705 if (deadTubesChamberValidity != 1 && draw_validity_message) validityFailDead.Draw(
"same");
1706 if (separate_dead_noisy_histos) {
1710 hOnlyNoise->Draw(
"same");
1712 for (
unsigned int i = 0; i < rangeLines.size(); i++) rangeLines_onlyMLLMezz.at(i).Draw(
"same");
1714 for (
unsigned int i = 0; i < rangeLines_dead.size(); i++) rangeLines_noise.at(i).Draw(
"same");
1716 if (draw_validity_message) {
1717 if (noisyTubesChamberValidity == 2) validityFailNoiseRetry.Draw(
"same");
1718 else if (noisyTubesChamberValidity != 1) validityFailAll.Draw(
"same");
1721 if (noisyTubesChamberValidity != 1 && draw_validity_message) validityFailNoise.Draw(
"same");
1722 hOnlyNoise->Draw(
"same");
1725 std::ostringstream Out;
1727 TString ecapStr =
"MDTBADead";
1728 if (chamberName(0, 1) ==
"B" && chamberName(4, 1) ==
"C") ecapStr =
"MDTBCDead";
1729 else if (chamberName(0, 1) ==
"E" && chamberName(4, 1) ==
"A") ecapStr =
"MDTEADead";
1730 else if (chamberName(0, 1) ==
"E" && chamberName(4, 1) ==
"C") ecapStr =
"MDTECDead";
1732 Out << inFilename <<
"." << ecapStr <<
".pdf";
1734 c->Print(Out.str().c_str(),
"pdf");
1737 delete hOnlyMaskedDead;