Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
/* *  \author Anna Cimmino*/
#include <DQM/RPCMonitorClient/interface/RPCDeadChannelTest.h>
#include <DQM/RPCMonitorClient/interface/utils.h>
#include <DQM/RPCMonitorClient/interface/RPCRollMapHisto.h>
// Framework
#include "FWCore/MessageLogger/interface/MessageLogger.h"
// Geometry
#include "Geometry/RPCGeometry/interface/RPCGeomServ.h"
#include "Geometry/RPCGeometry/interface/RPCGeometry.h"
#include "Geometry/Records/interface/MuonGeometryRecord.h"

RPCDeadChannelTest::RPCDeadChannelTest(const edm::ParameterSet& ps) {
  edm::LogVerbatim("rpcdeadchanneltest") << "[RPCDeadChannelTest]: Constructor";

  useRollInfo_ = ps.getUntrackedParameter<bool>("UseRollInfo", false);

  prescaleFactor_ = ps.getUntrackedParameter<int>("DiagnosticPrescale", 1);
  numberOfDisks_ = ps.getUntrackedParameter<int>("NumberOfEndcapDisks", 4);
  numberOfRings_ = ps.getUntrackedParameter<int>("NumberOfEndcapRings", 2);
}

void RPCDeadChannelTest::beginJob(std::string& workingFolder) {
  edm::LogVerbatim("rpcdeadchanneltest") << "[RPCDeadChannelTest]: Begin Job";
  globalFolder_ = workingFolder;
}

void RPCDeadChannelTest::getMonitorElements(std::vector<MonitorElement*>& meVector,
                                            std::vector<RPCDetId>& detIdVector,
                                            std::string& clientHistoName) {
  for (unsigned int i = 0; i < meVector.size(); i++) {
    std::string meName = meVector[i]->getName();

    if (meName.find(clientHistoName) != std::string::npos) {
      myOccupancyMe_.push_back(meVector[i]);
      myDetIds_.push_back(detIdVector[i]);
    }
  }
}

void RPCDeadChannelTest::clientOperation() {
  edm::LogVerbatim("rpcdeadchanneltest") << "[RPCDeadChannelTest]:Client Operation";

  MonitorElement* DEAD = nullptr;

  //Loop on chambers
  for (unsigned int i = 0; i < myOccupancyMe_.size(); i++) {
    RPCDetId& detId = myDetIds_[i];
    MonitorElement* myMe = myOccupancyMe_[i];

    if (!myMe)
      continue;

    const QReport* theOccupancyQReport = myMe->getQReport("DeadChannel_0");

    float deadFraction = 0.0;

    if (theOccupancyQReport) {
      float qtresult = theOccupancyQReport->getQTresult();
      // std::vector<dqm::me_util::Channel> badChannels = theOccupancyQReport->getBadChannels();
      deadFraction = 1.0 - qtresult;

    } else {
      int xBins = myMe->getNbinsX();
      float emptyBins = 0.0;
      for (int x = 1; x <= xBins; x++) {
        if (myMe->getBinContent(x) == 0) {
          emptyBins++;
        }
      }
      if (xBins != 0) {
        deadFraction = emptyBins / xBins;
      }
    }

    if (detId.region() == 0)
      DEAD = DEADWheel[detId.ring() + 2];
    else {
      if (-detId.station() + numberOfDisks_ >= 0) {
        if (detId.region() < 0) {
          DEAD = DEADDisk[-detId.station() + numberOfDisks_];
        } else {
          DEAD = DEADDisk[detId.station() + numberOfDisks_ - 1];
        }
      }
    }

    if (DEAD) {
      int xBin, yBin;
      if (detId.region() == 0) {  //Barrel
        xBin = detId.sector();
        rpcdqm::utils rollNumber;
        yBin = rollNumber.detId2RollNr(detId);
      } else {  //Endcap
        //get segment number
        RPCGeomServ RPCServ(detId);
        xBin = RPCServ.segment();
        (numberOfRings_ == 3 ? yBin = detId.ring() * 3 - detId.roll() + 1
                             : yBin = (detId.ring() - 1) * 3 - detId.roll() + 1);
      }
      DEAD->setBinContent(xBin, yBin, deadFraction);
    }

  }  //End loop on rolls in given chambers
}

void RPCDeadChannelTest::myBooker(DQMStore::IBooker& ibooker) {
  ibooker.setCurrentFolder(globalFolder_);

  std::stringstream histoName;

  int limit = numberOfDisks_;
  if (numberOfDisks_ < 2)
    limit = 2;

  for (int i = -1 * limit; i <= limit; i++) {  //loop on wheels and disks
    if (i > -3 && i < 3) {                     //wheels
      histoName.str("");
      histoName << "DeadChannelFraction_Roll_vs_Sector_Wheel" << i;
      auto me = RPCRollMapHisto::bookBarrel(ibooker, i, histoName.str(), histoName.str(), useRollInfo_);
      DEADWheel[i + 2] = dynamic_cast<MonitorElement*>(me);

      for (int x = 1; x <= 12; x++) {
        for (int y = 1; y <= 21; y++) {
          DEADWheel[i + 2]->setBinContent(x, y, -1);
        }
      }

    }  //end wheels

    if (i == 0 || i > numberOfDisks_ || i < (-1 * numberOfDisks_)) {
      continue;
    }

    int offset = numberOfDisks_;
    if (i > 0) {
      offset--;
    }  //used to skip case equale to zero

    histoName.str("");
    histoName << "DeadChannelFraction_Ring_vs_Segment_Disk" << i;
    auto me = RPCRollMapHisto::bookEndcap(ibooker, i, histoName.str(), histoName.str(), useRollInfo_);
    DEADDisk[i + offset] = dynamic_cast<MonitorElement*>(me);
  }  //end loop on wheels and disks
}