CMS 3D CMS Logo

Public Member Functions | Private Attributes

HcalHotCellClient Class Reference

#include <HcalHotCellClient.h>

Inheritance diagram for HcalHotCellClient:
HcalBaseDQClient

List of all members.

Public Member Functions

void analyze (void)
void beginJob (void)
void beginRun (void)
void calculateProblems (void)
void cleanup (void)
void endJob (void)
void endRun (void)
bool hasErrors_Temp (void)
bool hasOther_Temp (void)
bool hasWarnings_Temp (void)
 HcalHotCellClient (std::string myname)
 HcalHotCellClient ()
 Constructors.
 HcalHotCellClient (std::string myname, const edm::ParameterSet &ps)
void setup (void)
bool test_enabled (void)
void updateChannelStatus (std::map< HcalDetId, unsigned int > &myqual)
 ~HcalHotCellClient ()
 Destructor.

Private Attributes

int nevts_

Detailed Description

Definition at line 8 of file HcalHotCellClient.h.


Constructor & Destructor Documentation

HcalHotCellClient::HcalHotCellClient ( ) [inline]

Constructors.

Definition at line 13 of file HcalHotCellClient.h.

References HcalBaseDQClient::name_.

{name_="";};
HcalHotCellClient::HcalHotCellClient ( std::string  myname)

Definition at line 20 of file HcalHotCellClient.cc.

References HcalBaseDQClient::name_.

{
  name_=myname;
}
HcalHotCellClient::HcalHotCellClient ( std::string  myname,
const edm::ParameterSet ps 
)

Definition at line 25 of file HcalHotCellClient.cc.

References HcalBaseDQClient::badChannelStatusMask_, HcalBaseDQClient::cloneME_, HcalBaseDQClient::debug_, HcalBaseDQClient::enableCleanup_, edm::ParameterSet::getUntrackedParameter(), HcalChannelStatus::HcalCellHot, HcalBaseDQClient::minerrorrate_, HcalBaseDQClient::minevents_, HcalBaseDQClient::name_, HcalBaseDQClient::Online_, HcalBaseDQClient::prefixME_, HcalBaseDQClient::ProblemCells, HcalBaseDQClient::ProblemCellsByDepth, HcalBaseDQClient::subdir_, and HcalBaseDQClient::validHtmlOutput_.

{
  name_=myname;
  enableCleanup_         = ps.getUntrackedParameter<bool>("enableCleanup",false);
  debug_                 = ps.getUntrackedParameter<int>("debug",0);
  prefixME_              = ps.getUntrackedParameter<std::string>("subSystemFolder","Hcal/");
  if (prefixME_.substr(prefixME_.size()-1,prefixME_.size())!="/")
    prefixME_.append("/");
  subdir_                = ps.getUntrackedParameter<std::string>("HotCellFolder","HotCellMonitor_Hcal/"); // HotCellMonitor_Hcal  
  if (subdir_.size()>0 && subdir_.substr(subdir_.size()-1,subdir_.size())!="/")
    subdir_.append("/");
  subdir_=prefixME_+subdir_;

  validHtmlOutput_       = ps.getUntrackedParameter<bool>("HotCell_validHtmlOutput",true);
  cloneME_ = ps.getUntrackedParameter<bool>("cloneME", true);
  badChannelStatusMask_   = ps.getUntrackedParameter<int>("HotCell_BadChannelStatusMask",
                                                          ps.getUntrackedParameter<int>("BadChannelStatusMask",
                                                                                        (1<<HcalChannelStatus::HcalCellHot))); // identify channel status values to mask
  // badChannelStatusMask_   = ps.getUntrackedParameter<int>("HotCell_BadChannelStatusMask", (1<<1)); // identify channel status values to mask

  minerrorrate_ = ps.getUntrackedParameter<double>("HotCell_minerrorrate",
                                                   ps.getUntrackedParameter<double>("minerrorrate",0.25));
  minevents_    = ps.getUntrackedParameter<int>("HotCell_minevents",
                                                ps.getUntrackedParameter<int>("minevents",100));
  Online_                = ps.getUntrackedParameter<bool>("online",false);

  ProblemCellsByDepth=0;
  ProblemCells=0;
}
HcalHotCellClient::~HcalHotCellClient ( )

Destructor.


Member Function Documentation

void HcalHotCellClient::analyze ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 55 of file HcalHotCellClient.cc.

References calculateProblems(), gather_cfg::cout, and HcalBaseDQClient::debug_.

Referenced by endRun().

{
  if (debug_>2) std::cout <<"\tHcalHotCellClient::analyze()"<<std::endl;
  calculateProblems();
}
void HcalHotCellClient::beginJob ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 218 of file HcalHotCellClient.cc.

References gather_cfg::cout, HcalBaseDQClient::debug_, HcalBaseDQClient::dqmStore_, cmsCodeRules::cppFunctionSkipper::operator, and DQMStore::showDirStructure().

{
  dqmStore_ = edm::Service<DQMStore>().operator->();
  if (debug_>0) 
    {
      std::cout <<"<HcalHotCellClient::beginJob()>  Displaying dqmStore directory structure:"<<std::endl;
      dqmStore_->showDirStructure();
    }
}
void HcalHotCellClient::beginRun ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 230 of file HcalHotCellClient.cc.

References DQMStore::book2D(), gather_cfg::cout, HcalBaseDQClient::debug_, EtaPhiHists::depth, HcalBaseDQClient::dqmStore_, HcalBaseDQClient::enoughevents_, MonitorElement::getName(), i, nevts_, HcalBaseDQClient::ProblemCells, HcalBaseDQClient::ProblemCellsByDepth, HcalBaseDQClient::problemnames_, DQMStore::setCurrentFolder(), EtaPhiHists::setup(), and HcalBaseDQClient::subdir_.

{
  enoughevents_=false;
  if (!dqmStore_) 
    {
      if (debug_>0) std::cout <<"<HcalHotCellClient::beginRun> dqmStore does not exist!"<<std::endl;
      return;
    }
  dqmStore_->setCurrentFolder(subdir_);
  problemnames_.clear();
  ProblemCells=dqmStore_->book2D(" ProblemHotCells",
                                 " Problem Hot Cell Rate for all HCAL;ieta;iphi",
                                 85,-42.5,42.5,
                                 72,0.5,72.5);
  problemnames_.push_back(ProblemCells->getName());
  if (debug_>1)
    std::cout << "Tried to create ProblemCells Monitor Element in directory "<<subdir_<<"  \t  Failed?  "<<(ProblemCells==0)<<std::endl;
  dqmStore_->setCurrentFolder(subdir_+"problem_hotcells");
  ProblemCellsByDepth=new EtaPhiHists();
  ProblemCellsByDepth->setup(dqmStore_," Problem Hot Cell Rate");
  for (unsigned int i=0; i<ProblemCellsByDepth->depth.size();++i)
    problemnames_.push_back(ProblemCellsByDepth->depth[i]->getName());

  nevts_=0;
}
void HcalHotCellClient::calculateProblems ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 61 of file HcalHotCellClient.cc.

References HcalBaseDQClient::badstatusmap, HcalObjRepresent::CalcIeta(), HcalBaseDQClient::cloneME_, gather_cfg::cout, HcalBaseDQClient::debug_, EtaPhiHists::depth, HcalBaseDQClient::dqmStore_, HcalBaseDQClient::enoughevents_, eta(), MonitorElement::Fill(), HcalObjRepresent::FillUnphysicalHEHFBins(), DQMStore::get(), MonitorElement::getBinContent(), MonitorElement::getTH2F(), HcalBarrel, HcalEmpty, HcalEndcap, HcalEtaPhiHistNames(), HcalForward, HcalOuter, i, isHB(), isHE(), isHF(), isHO(), max(), min, HcalBaseDQClient::minerrorrate_, HcalBaseDQClient::minevents_, HcalBaseDQClient::name(), phi, HcalBaseDQClient::ProblemCells, HcalBaseDQClient::ProblemCellsByDepth, MonitorElement::Reset(), alignCSCRings::s, MonitorElement::setBinContent(), and HcalBaseDQClient::subdir_.

Referenced by analyze().

{
  if (debug_>2) std::cout <<"\t\tHcalHotCellClient::calculateProblems()"<<std::endl;
  if(!dqmStore_) return;
  double totalevents=0;
  int etabins=0, phibins=0, zside=0;
  double problemvalue=0;

  // Clear away old problems
  if (ProblemCells!=0)
    {
      ProblemCells->Reset();
      (ProblemCells->getTH2F())->SetMaximum(1.05);
      (ProblemCells->getTH2F())->SetMinimum(0.);
    }
  for  (unsigned int d=0;ProblemCellsByDepth!=0 && d<ProblemCellsByDepth->depth.size();++d)
    {
      if (ProblemCellsByDepth->depth[d]!=0) 
        {
          ProblemCellsByDepth->depth[d]->Reset();
          (ProblemCellsByDepth->depth[d]->getTH2F())->SetMaximum(1.05);
          (ProblemCellsByDepth->depth[d]->getTH2F())->SetMinimum(0.);
        }
    }
  
  // Get histograms that are used in testing
  TH2F* HotAboveThresholdByDepth[4];
  TH2F* HotAlwaysAboveThresholdByDepth[4];
  TH2F* HotAboveETThresholdByDepth[4];
  TH2F* HotAlwaysAboveETThresholdByDepth[4];
  TH2F* HotNeighborsByDepth[4];

  std::vector<std::string> name = HcalEtaPhiHistNames();

  bool neighbortest=false;

  MonitorElement* me;
  for (int i=0;i<4;++i)
    {
      // Assume histograms aren't found by default
      HotAboveThresholdByDepth[i]=0;
      HotAlwaysAboveThresholdByDepth[i]=0;
      HotAboveETThresholdByDepth[i]=0;
      HotAlwaysAboveETThresholdByDepth[i]=0;
      HotNeighborsByDepth[i]=0;

      std::string s=subdir_+"hot_rechit_above_threshold/"+name[i]+"Hot Cells Above ET Threshold";
      me=dqmStore_->get(s.c_str());
      if (me!=0)HotAboveETThresholdByDepth[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, HotAboveETThresholdByDepth[i], debug_);

      s=subdir_+"hot_rechit_always_above_threshold/"+name[i]+"Hot Cells Persistently Above ET Threshold";
      me=dqmStore_->get(s.c_str());
      if (me!=0)HotAlwaysAboveETThresholdByDepth[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, HotAlwaysAboveETThresholdByDepth[i], debug_);

      s=subdir_+"hot_rechit_above_threshold/"+name[i]+"Hot Cells Above Energy Threshold";
      me=dqmStore_->get(s.c_str());
      if (me!=0)HotAboveThresholdByDepth[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, HotAboveThresholdByDepth[i], debug_);

      s=subdir_+"hot_rechit_always_above_threshold/"+name[i]+"Hot Cells Persistently Above Energy Threshold";
      me=dqmStore_->get(s.c_str());
      if (me!=0)HotAlwaysAboveThresholdByDepth[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, HotAlwaysAboveThresholdByDepth[i], debug_);

      s=subdir_+"hot_neighbortest/"+name[i]+"Hot Cells Failing Neighbor Test";
      me=dqmStore_->get(s.c_str());
      if (me!=0)HotNeighborsByDepth[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, HotNeighborsByDepth[i], debug_);
      s=subdir_+"hot_neighbortest/NeighborTestEnabled";
      me=dqmStore_->get(s.c_str());
      if (me!=0 && me->getIntValue()==1)
        neighbortest=true;
    }


  // Because we're clearing and re-forming the problem cell histogram here, we don't need to do any cute
  // setting of the underflow bin to 0, and we can plot results as a raw rate between 0-1.

  for (unsigned int d=0;ProblemCellsByDepth!=0 && d<ProblemCellsByDepth->depth.size();++d)
    {
      if (ProblemCellsByDepth->depth[d]==0) continue;

      if (HotAboveETThresholdByDepth[d]) totalevents = std::max(totalevents, HotAboveETThresholdByDepth[d]->GetBinContent(0));
      else if (HotAlwaysAboveETThresholdByDepth[d]) totalevents = std::max(totalevents, HotAlwaysAboveETThresholdByDepth[d]->GetBinContent(0));
      else if (HotAboveThresholdByDepth[d]) totalevents = std::max(totalevents, HotAboveThresholdByDepth[d]->GetBinContent(0));
      else if (HotAlwaysAboveThresholdByDepth[d]) totalevents = std::max(totalevents, HotAlwaysAboveThresholdByDepth[d]->GetBinContent(0));
      else if (neighbortest==true && HotNeighborsByDepth[d]) totalevents = std::max(totalevents, HotNeighborsByDepth[d]->GetBinContent(0));
      else if (debug_>0) std::cout <<"<HcalHotCellClient::calculateProblems> No evaluation histograms found; no valid hot tests enabled?" << std::endl;
      if (totalevents==0 || totalevents<minevents_) continue;
      enoughevents_=true; // kind of a hack here
      etabins=(ProblemCellsByDepth->depth[d]->getTH2F())->GetNbinsX();
      phibins=(ProblemCellsByDepth->depth[d]->getTH2F())->GetNbinsY();
      problemvalue=0;
      for (int eta=0;eta<etabins;++eta)
        {
          int ieta=CalcIeta(eta,d+1);
          if (ieta==-9999) continue;
          for (int phi=0;phi<phibins;++phi)
            {
              problemvalue=0; // problem fraction sums over all three tests
              // If cell is never-present in all runs, then problemvalue = event
              if (HotAboveETThresholdByDepth[d]!=0)
                problemvalue+=HotAboveETThresholdByDepth[d]->GetBinContent(eta+1,phi+1);
              if (HotAboveThresholdByDepth[d]!=0)
                problemvalue+=HotAboveThresholdByDepth[d]->GetBinContent(eta+1,phi+1);
              if (HotAlwaysAboveThresholdByDepth[d]!=0)
                problemvalue+=HotAlwaysAboveThresholdByDepth[d]->GetBinContent(eta+1,phi+1);
              if (neighbortest==true && HotNeighborsByDepth[d]!=0)
                problemvalue+=HotNeighborsByDepth[d]->GetBinContent(eta+1,phi+1);
              if (problemvalue==0) continue;
              problemvalue/=totalevents; // problem value is a rate; should be between 0 and 1
              problemvalue = std::min(1.,problemvalue);
              
              zside=0;
              if (isHF(eta,d+1)) // shift ieta by 1 for HF
                ieta<0 ? zside = -1 : zside = 1;
              
              // For problem cells that exceed our allowed rate,
              // set the values to -1 if the cells are already marked in the status database
              if (problemvalue>minerrorrate_)
                {
                  HcalSubdetector subdet=HcalEmpty;
                  if (isHB(eta,d+1))subdet=HcalBarrel;
                  else if (isHE(eta,d+1)) subdet=HcalEndcap;
                  else if (isHF(eta,d+1)) subdet=HcalForward;
                  else if (isHO(eta,d+1)) subdet=HcalOuter;
                  HcalDetId hcalid(subdet, ieta, phi+1, (int)(d+1));
                  if (badstatusmap.find(hcalid)!=badstatusmap.end())
                    problemvalue=999;
                }
              ProblemCellsByDepth->depth[d]->setBinContent(eta+1,phi+1,problemvalue);
              if (ProblemCells!=0) ProblemCells->Fill(ieta+zside,phi+1,problemvalue);
            } // loop on phi
        } // loop on eta
    } // loop on depth
   
  if (ProblemCells==0)
    {
      if (debug_>0) std::cout <<"<HcalHotCellClient::analyze> ProblemCells histogram does not exist!"<<std::endl;
      return;
    }
   
  // Normalization of ProblemCell plot, in the case where there are errors in multiple depths
  etabins=(ProblemCells->getTH2F())->GetNbinsX();
  phibins=(ProblemCells->getTH2F())->GetNbinsY();
  for (int eta=0;eta<etabins;++eta)
    {
      for (int phi=0;phi<phibins;++phi)
        {
          if (ProblemCells->getBinContent(eta+1,phi+1)>1. && ProblemCells->getBinContent(eta+1,phi+1)<999)
            ProblemCells->setBinContent(eta+1,phi+1,1.);
        }
    }

  FillUnphysicalHEHFBins(*ProblemCellsByDepth);
  FillUnphysicalHEHFBins(ProblemCells);
  return;
}
void HcalHotCellClient::cleanup ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 259 of file HcalHotCellClient.cc.

{}
void HcalHotCellClient::endJob ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 228 of file HcalHotCellClient.cc.

{}
void HcalHotCellClient::endRun ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 256 of file HcalHotCellClient.cc.

References analyze().

{analyze();}
bool HcalHotCellClient::hasErrors_Temp ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 261 of file HcalHotCellClient.cc.

References HcalObjRepresent::CalcIeta(), gather_cfg::cout, HcalBaseDQClient::debug_, EtaPhiHists::depth, MonitorElement::getTH2F(), HcalBaseDQClient::minerrorrate_, HcalBaseDQClient::ProblemCells, and HcalBaseDQClient::ProblemCellsByDepth.

{
  if (!ProblemCells)
    {
      if (debug_>1) std::cout <<"<HcalHotCellClient::hasErrors_Temp>  ProblemCells histogram does not exist!"<<std::endl;
      return false;
    }
  int problemcount=0;
  int ieta=-9999;

  for (int depth=0;depth<4; ++depth)
    {
      int etabins  = (ProblemCells->getTH2F())->GetNbinsX();
      int phibins  = (ProblemCells->getTH2F())->GetNbinsY();
      for (int hist_eta=0;hist_eta<etabins;++hist_eta)
        {
          for (int hist_phi=0; hist_phi<phibins;++hist_phi)
            {
              ieta=CalcIeta(hist_eta,depth+1);
              if (ieta==-9999) continue;
              if (ProblemCellsByDepth->depth[depth]==0)
                continue;
              if (ProblemCellsByDepth->depth[depth]->getBinContent(hist_eta,hist_phi)>minerrorrate_)
                ++problemcount;
            } // for (int hist_phi=1;...)
        } // for (int hist_eta=1;...)
    } // for (int depth=0;...)

  if (problemcount>0) return true;
  return false;
}
bool HcalHotCellClient::hasOther_Temp ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 294 of file HcalHotCellClient.cc.

{return false;}
bool HcalHotCellClient::hasWarnings_Temp ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 293 of file HcalHotCellClient.cc.

{return false;}
void HcalHotCellClient::setup ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 258 of file HcalHotCellClient.cc.

{}
bool HcalHotCellClient::test_enabled ( void  ) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 295 of file HcalHotCellClient.cc.

{return true;}
void HcalHotCellClient::updateChannelStatus ( std::map< HcalDetId, unsigned int > &  myqual) [virtual]

Reimplemented from HcalBaseDQClient.

Definition at line 298 of file HcalHotCellClient.cc.

References HcalObjRepresent::CalcIeta(), gather_cfg::cout, HcalBaseDQClient::debug_, EtaPhiHists::depth, HcalBarrel, HcalChannelStatus::HcalCellHot, HcalEndcap, HcalForward, HcalOuter, isHB(), isHE(), isHF(), HcalBaseDQClient::minerrorrate_, HcalBaseDQClient::minevents_, nevts_, HcalBaseDQClient::ProblemCellsByDepth, and validDetId().

{
  // This gets called by HcalMonitorClient
  if (nevts_<minevents_) return; // not enough events to make judgment; don't create new status file

  float binval;
  int ieta=0;
  int iphi=0;
  int etabins=0;
  int phibins=0;
  
  int subdet=0;
  if (debug_>1)
    {
      std::cout <<"<HcalHotCellClient>  Summary of Hot Cells in Run: "<<std::endl;
      std::cout <<"(Error rate must be >= "<<minerrorrate_*100.<<"% )"<<std::endl;  
    }
  for (int d=0;d<4;++d)
    {
      etabins=(ProblemCellsByDepth->depth[d]->getTH2F())->GetNbinsX();
      phibins=(ProblemCellsByDepth->depth[d]->getTH2F())->GetNbinsY();
      for (int hist_eta=0;hist_eta<etabins;++hist_eta)
        {
          ieta=CalcIeta(hist_eta,d+1);
          if (ieta==-9999) continue;
          for (int hist_phi=0;hist_phi<phibins;++hist_phi)
            {
              iphi=hist_phi+1;
              
              // ProblemCells have already been normalized
              binval=ProblemCellsByDepth->depth[d]->getBinContent(hist_eta+1,hist_phi+1);
              
              // Set subdetector labels for output
              if (d<2)
                {
                  if (isHB(hist_eta,d+1)) 
                    subdet=HcalBarrel;
                  else if (isHE(hist_eta,d+1)) 
                    subdet=HcalEndcap;
                  else if (isHF(hist_eta,d+1)) 
                    subdet=HcalForward;
                }
              else if (d==2) 
                subdet=HcalEndcap;
              else if (d==3) 
                subdet=HcalOuter;
              // Set correct depth label
              
              HcalDetId myid((HcalSubdetector)(subdet), ieta, iphi, d+1);
              // Need this to keep from flagging non-existent HE/HF cells
              if (!validDetId((HcalSubdetector)(subdet), ieta, iphi, d+1))
                continue;
              
              int hotcell=0;
              if (binval>minerrorrate_)
                hotcell=1;
              if (hotcell==1 && debug_>0)
                std::cout <<"Hot Cell :  subdetector = "<<subdet<<" (eta,phi,depth) = ("<<ieta<<", "<<iphi<<", "<<d+1<<"):  "<<binval*100.<<"%"<<std::endl;
              
              // DetID not found in quality list; add it.  (This shouldn't happen!)
              if (myqual.find(myid)==myqual.end())
                {
                  myqual[myid]=(hotcell<<HcalChannelStatus::HcalCellHot);  // 
                }
              else
                {
                  int mask=(1<<HcalChannelStatus::HcalCellHot);
                  // hot cell found; 'or' the hot cell mask with existing ID
                  if (hotcell==1)
                    myqual[myid] |=mask;
                  // cell is not found, 'and' the inverse of the mask with the existing ID.
                  // Does this work correctly?  I think so, but need to verify.
                  // Also, do we want to allow the client to turn off hot cell masks, or only add them?
                  else
                    myqual[myid] &=~mask;
                }
            } // for (int hist_phi=1;hist_phi<=phibins;++hist_phi)
        } // for (int hist_eta=1;hist_eta<=etabins;++hist_eta)
    } // for (int d=0;d<4;++d)


} //void HcalHotCellClient::updateChannelStatus

Member Data Documentation

Definition at line 36 of file HcalHotCellClient.h.

Referenced by beginRun(), and updateChannelStatus().