CMS 3D CMS Logo

Classes | Public Member Functions | Private Member Functions | Private Attributes

DQMGenericClient Class Reference

#include <DQMGenericClient.h>

Inheritance diagram for DQMGenericClient:
edm::EDAnalyzer edm::EDConsumerBase

List of all members.

Classes

struct  CDOption
struct  EfficOption
struct  NormOption
struct  ResolOption

Public Member Functions

void analyze (const edm::Event &event, const edm::EventSetup &eventSetup)
void computeEfficiency (const std::string &startDir, const std::string &efficMEName, const std::string &efficMETitle, const std::string &recoMEName, const std::string &simMEName, const int type=1, const bool makeProfile=false)
void computeResolution (const std::string &startDir, const std::string &fitMEPrefix, const std::string &fitMETitlePrefix, const std::string &srcMEName)
 DQMGenericClient (const edm::ParameterSet &pset)
void endJob ()
void endRun (const edm::Run &r, const edm::EventSetup &c)
 EndRun.
void limitedFit (MonitorElement *srcME, MonitorElement *meanME, MonitorElement *sigmaME)
void makeCumulativeDist (const std::string &startDir, const std::string &cdName)
void normalizeToEntries (const std::string &startDir, const std::string &histName, const std::string &normHistName)
 ~DQMGenericClient ()

Private Member Functions

void findAllSubdirectories (std::string dir, std::set< std::string > *myList, const TString &pattern)
void generic_eff (TH1 *denom, TH1 *numer, MonitorElement *efficiencyHist, const int type=1)

Private Attributes

std::vector< CDOptioncdOptions_
std::vector< EfficOptionefficOptions_
bool isWildcardUsed_
std::vector< NormOptionnormOptions_
std::string outputFileName_
bool resLimitedFit_
std::vector< ResolOptionresolOptions_
std::vector< std::string > subDirs_
DQMStoretheDQM
unsigned int verbose_

Detailed Description

Definition at line 31 of file DQMGenericClient.h.


Constructor & Destructor Documentation

DQMGenericClient::DQMGenericClient ( const edm::ParameterSet pset)

Definition at line 36 of file DQMGenericClient.cc.

References harvestRelVal::args, DQMGenericClient::EfficOption::denominator, genericClientPSetHelper_cff::efficSet(), edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), DQMGenericClient::EfficOption::isProfile, DQMGenericClient::EfficOption::name, DQMGenericClient::NormOption::name, DQMGenericClient::CDOption::name, DQMGenericClient::ResolOption::namePrefix, DQMGenericClient::NormOption::normHistName, DQMGenericClient::EfficOption::numerator, DQMGenericClient::ResolOption::srcName, DQMGenericClient::EfficOption::title, DQMGenericClient::ResolOption::titlePrefix, and DQMGenericClient::EfficOption::type.

{
  typedef std::vector<edm::ParameterSet> VPSet;
  typedef std::vector<std::string> vstring;
  typedef boost::escaped_list_separator<char> elsc;

  elsc commonEscapes("\\", " \t", "\'");

  verbose_ = pset.getUntrackedParameter<unsigned int>("verbose", 0);

  // Parse efficiency commands
  vstring effCmds = pset.getParameter<vstring>("efficiency");
  for ( vstring::const_iterator effCmd = effCmds.begin();
        effCmd != effCmds.end(); ++effCmd )
  {
    if ( effCmd->empty() ) continue;

    boost::tokenizer<elsc> tokens(*effCmd, commonEscapes);

    vector<string> args;
    for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
        iToken != tokens.end(); ++iToken) {
      if ( iToken->empty() ) continue;
      args.push_back(*iToken);
    }

    if ( args.size() < 4 ) {
      LogInfo("DQMGenericClient") << "Wrong input to effCmds\n";
      continue;
    }

    EfficOption opt;
    opt.name = args[0];
    opt.title = args[1];
    opt.numerator = args[2];
    opt.denominator = args[3];
    opt.isProfile = false;

    const string typeName = args.size() == 4 ? "eff" : args[4];
    if ( typeName == "eff" ) opt.type = 1;
    else if ( typeName == "fake" ) opt.type = 2;
    else opt.type = 0;
 
    efficOptions_.push_back(opt);
  }
  
  VPSet efficSets = pset.getUntrackedParameter<VPSet>("efficiencySets", VPSet());
  for ( VPSet::const_iterator efficSet = efficSets.begin();
        efficSet != efficSets.end(); ++efficSet )
  {
    EfficOption opt;
    opt.name = efficSet->getUntrackedParameter<string>("name");
    opt.title = efficSet->getUntrackedParameter<string>("title");
    opt.numerator = efficSet->getUntrackedParameter<string>("numerator");
    opt.denominator = efficSet->getUntrackedParameter<string>("denominator");
    opt.isProfile = false;

    const string typeName = efficSet->getUntrackedParameter<string>("typeName", "eff");
    if ( typeName == "eff" ) opt.type = 1;
    else if ( typeName == "fake" ) opt.type = 2;
    else opt.type = 0;

    efficOptions_.push_back(opt);
  }

  // Parse profiles
  vstring profileCmds = pset.getUntrackedParameter<vstring>("efficiencyProfile", vstring());
  for ( vstring::const_iterator profileCmd = profileCmds.begin();
        profileCmd != profileCmds.end(); ++profileCmd )
  {
    if ( profileCmd->empty() ) continue;

    boost::tokenizer<elsc> tokens(*profileCmd, commonEscapes);

    vector<string> args;
    for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
        iToken != tokens.end(); ++iToken) {
      if ( iToken->empty() ) continue;
      args.push_back(*iToken);
    }

    if ( args.size() < 4 ) {
      LogInfo("DQMGenericClient") << "Wrong input to profileCmds\n";
      continue;
    }

    EfficOption opt;
    opt.name = args[0];
    opt.title = args[1];
    opt.numerator = args[2];
    opt.denominator = args[3];
    opt.isProfile = true;

    const string typeName = args.size() == 4 ? "eff" : args[4];
    if ( typeName == "eff" ) opt.type = 1;
    else if ( typeName == "fake" ) opt.type = 2;
    else opt.type = 0;
 
    efficOptions_.push_back(opt);
  }

  VPSet profileSets = pset.getUntrackedParameter<VPSet>("efficiencyProfileSets", VPSet());
  for ( VPSet::const_iterator profileSet = profileSets.begin();
        profileSet != profileSets.end(); ++profileSet )
  {
    EfficOption opt;
    opt.name = profileSet->getUntrackedParameter<string>("name");
    opt.title = profileSet->getUntrackedParameter<string>("title");
    opt.numerator = profileSet->getUntrackedParameter<string>("numerator");
    opt.denominator = profileSet->getUntrackedParameter<string>("denominator");
    opt.isProfile = true;

    const string typeName = profileSet->getUntrackedParameter<string>("typeName", "eff");
    if ( typeName == "eff" ) opt.type = 1;
    else if ( typeName == "fake" ) opt.type = 2;
    else opt.type = 0;

    efficOptions_.push_back(opt);
  }

  // Parse resolution commands
  vstring resCmds = pset.getParameter<vstring>("resolution");
  for ( vstring::const_iterator resCmd = resCmds.begin();
        resCmd != resCmds.end(); ++resCmd )
  {
    if ( resCmd->empty() ) continue;
    boost::tokenizer<elsc> tokens(*resCmd, commonEscapes);

    vector<string> args;
    for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
        iToken != tokens.end(); ++iToken) {
      if ( iToken->empty() ) continue;
      args.push_back(*iToken);
    }

    if ( args.size() != 3 ) {
      LogInfo("DQMGenericClient") << "Wrong input to resCmds\n";
      continue;
    }

    ResolOption opt;
    opt.namePrefix = args[0];
    opt.titlePrefix = args[1];
    opt.srcName = args[2];

    resolOptions_.push_back(opt);
  }

  VPSet resolSets = pset.getUntrackedParameter<VPSet>("resolutionSets", VPSet());
  for ( VPSet::const_iterator resolSet = resolSets.begin();
        resolSet != resolSets.end(); ++resolSet )
  {
    ResolOption opt;
    opt.namePrefix = resolSet->getUntrackedParameter<string>("namePrefix");
    opt.titlePrefix = resolSet->getUntrackedParameter<string>("titlePrefix");
    opt.srcName = resolSet->getUntrackedParameter<string>("srcName");

    resolOptions_.push_back(opt);
  }

  // Parse Normalization commands
  vstring normCmds = pset.getUntrackedParameter<vstring>("normalization", vstring());
  for ( vstring::const_iterator normCmd = normCmds.begin();
        normCmd != normCmds.end(); ++normCmd )
  {
    if ( normCmd->empty() ) continue;
    boost::tokenizer<elsc> tokens(*normCmd, commonEscapes);

    vector<string> args;
    for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
        iToken != tokens.end(); ++iToken) {
      if ( iToken->empty() ) continue;
      args.push_back(*iToken);
    }

    if ( args.empty() or args.size() > 2 ) {
      LogInfo("DQMGenericClient") << "Wrong input to normCmds\n";
      continue;
    }

    NormOption opt;
    opt.name = args[0];
    opt.normHistName = args.size() == 2 ? args[1] : args[0];

    normOptions_.push_back(opt);
  }

  VPSet normSets = pset.getUntrackedParameter<VPSet>("normalizationSets", VPSet());
  for ( VPSet::const_iterator normSet = normSets.begin();
        normSet != normSets.end(); ++normSet )
  {
    NormOption opt;
    opt.name = normSet->getUntrackedParameter<string>("name");
    opt.normHistName = normSet->getUntrackedParameter<string>("normalizedTo", opt.name);

    normOptions_.push_back(opt);
  }

  // Cumulative distributions
  vstring cdCmds = pset.getUntrackedParameter<vstring>("cumulativeDists", vstring());
  for ( vstring::const_iterator cdCmd = cdCmds.begin();
        cdCmd != cdCmds.end(); ++cdCmd )
  {
    if ( cdCmd->empty() ) continue;
    boost::tokenizer<elsc> tokens(*cdCmd, commonEscapes);

    vector<string> args;
    for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
        iToken != tokens.end(); ++iToken) {
      if ( iToken->empty() ) continue;
      args.push_back(*iToken);
    }

    if ( args.size() != 1 ) {
      LogInfo("DQMGenericClient") << "Wrong input to cdCmds\n";
      continue;
    }

    CDOption opt;
    opt.name = args[0];

    cdOptions_.push_back(opt);
  }

  VPSet cdSets = pset.getUntrackedParameter<VPSet>("cumulativeDistSets", VPSet());
  for ( VPSet::const_iterator cdSet = cdSets.begin();
        cdSet != cdSets.end(); ++cdSet )
  {
    CDOption opt;
    opt.name = cdSet->getUntrackedParameter<string>("name");

    cdOptions_.push_back(opt);
  }

  outputFileName_ = pset.getUntrackedParameter<string>("outputFileName", "");
  subDirs_ = pset.getUntrackedParameter<vstring>("subDirs");

  resLimitedFit_ = pset.getUntrackedParameter<bool>("resolutionLimitedFit",false);
  isWildcardUsed_ = false;
}
DQMGenericClient::~DQMGenericClient ( ) [inline]

Definition at line 35 of file DQMGenericClient.h.

{};

Member Function Documentation

void DQMGenericClient::analyze ( const edm::Event event,
const edm::EventSetup eventSetup 
) [inline, virtual]

Implements edm::EDAnalyzer.

Definition at line 37 of file DQMGenericClient.h.

{};
void DQMGenericClient::computeEfficiency ( const std::string &  startDir,
const std::string &  efficMEName,
const std::string &  efficMETitle,
const std::string &  recoMEName,
const std::string &  simMEName,
const int  type = 1,
const bool  makeProfile = false 
)
void DQMGenericClient::computeResolution ( const std::string &  startDir,
const std::string &  fitMEPrefix,
const std::string &  fitMETitlePrefix,
const std::string &  srcMEName 
)
void DQMGenericClient::endJob ( void  ) [virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 361 of file DQMGenericClient.cc.

References LogTrace.

{

  // Update 2009-09-23
  // Migrated all code from here to endRun

  LogTrace ("DQMGenericClient") << "inside of DQMGenericClient::endJob()"
                                << endl;

}
void DQMGenericClient::endRun ( const edm::Run r,
const edm::EventSetup c 
) [virtual]

EndRun.

Reimplemented from edm::EDAnalyzer.

Definition at line 277 of file DQMGenericClient.cc.

References TrackerOfflineValidation_Dqm_cff::dirName, metacharacters(), cppFunctionSkipper::operator, and listBenchmarks::pattern.

                                                                     {

  typedef vector<string> vstring;

  // Update 2009-09-23
  // Migrated all code from endJob to this function
  // endJob is not necessarily called in the proper sequence
  // and does not necessarily book histograms produced in
  // that step.
  // It more robust to do the histogram manipulation in
  // this endRun function


  
  theDQM = 0;
  theDQM = Service<DQMStore>().operator->();

  if ( ! theDQM ) {
    LogInfo("DQMGenericClient") << "Cannot create DQMStore instance\n";
    return;
  }

  // Process wildcard in the sub-directory
  set<string> subDirSet;

  for(vstring::const_iterator iSubDir = subDirs_.begin();
      iSubDir != subDirs_.end(); ++iSubDir) {
    string subDir = *iSubDir;

    if ( subDir[subDir.size()-1] == '/' ) subDir.erase(subDir.size()-1);

    if ( TString(subDir).Contains(metacharacters) ) {
      isWildcardUsed_ = true;

      const string::size_type shiftPos = subDir.rfind('/');
      const string searchPath = subDir.substr(0, shiftPos);
      const string pattern    = subDir.substr(shiftPos + 1, subDir.length());
      //std::cout << "\n\n\n\nLooking for all subdirs of " << subDir << std::endl;
      
      findAllSubdirectories (searchPath, &subDirSet, pattern);

    }
    else {
      subDirSet.insert(subDir);
    }
  }

  for(set<string>::const_iterator iSubDir = subDirSet.begin();
      iSubDir != subDirSet.end(); ++iSubDir) {
    const string& dirName = *iSubDir;

    for ( vector<EfficOption>::const_iterator efficOption = efficOptions_.begin();
          efficOption != efficOptions_.end(); ++efficOption )
    {
      computeEfficiency(dirName, efficOption->name, efficOption->title, 
                        efficOption->numerator, efficOption->denominator,
                        efficOption->type, efficOption->isProfile);
    }

    for ( vector<ResolOption>::const_iterator resolOption = resolOptions_.begin();
          resolOption != resolOptions_.end(); ++resolOption )
    {
      computeResolution(dirName, resolOption->namePrefix, resolOption->titlePrefix, resolOption->srcName);
    }

    for ( vector<NormOption>::const_iterator normOption = normOptions_.begin();
          normOption != normOptions_.end(); ++normOption )
    {
      normalizeToEntries(dirName, normOption->name, normOption->normHistName);
    }

    for ( vector<CDOption>::const_iterator cdOption = cdOptions_.begin();
          cdOption != cdOptions_.end(); ++cdOption )
    {
      makeCumulativeDist(dirName, cdOption->name);
    }
  }

  //if ( verbose_ > 0 ) theDQM->showDirStructure();

  if ( ! outputFileName_.empty() ) theDQM->save(outputFileName_);
  
}
void DQMGenericClient::findAllSubdirectories ( std::string  dir,
std::set< std::string > *  myList,
const TString &  pattern = TString("") 
) [private]

Definition at line 785 of file DQMGenericClient.cc.

References TrackerOfflineValidation_Dqm_cff::dirName, nonPerlWildcard(), and listBenchmarks::pattern.

                                                                                                                              {
  TString pattern = _pattern;
  if (!theDQM->dirExists(dir)) {
    LogError("DQMGenericClient") << " DQMGenericClient::findAllSubdirectories ==> Missing folder " << dir << " !!!"; 
    return;
  }
  if (pattern != "") {
    if (pattern.Contains(nonPerlWildcard)) pattern.ReplaceAll("*",".*");
    TPRegexp regexp(pattern);
    theDQM->cd(dir);
    vector <string> foundDirs = theDQM->getSubdirs();
    for(vector<string>::const_iterator iDir = foundDirs.begin();
        iDir != foundDirs.end(); ++iDir) {
      TString dirName = iDir->substr(iDir->rfind('/') + 1, iDir->length());
      if (dirName.Contains(regexp))
        findAllSubdirectories ( *iDir, myList);
    }
  }
  //std::cout << "Looking for directory " << dir ;
  else if (theDQM->dirExists(dir)){
    //std::cout << "... it exists! Inserting it into the list ";
    myList->insert(dir);
    //std::cout << "... now list has size " << myList->size() << std::endl;
    theDQM->cd(dir);
    findAllSubdirectories (dir, myList, "*");
  } else {
    //std::cout << "... DOES NOT EXIST!!! Skip bogus dir" << std::endl;
    
    LogInfo ("DQMGenericClient") << "Trying to find sub-directories of " << dir
                                 << " failed because " << dir  << " does not exist";
                                 
  }
  return;
}
void DQMGenericClient::generic_eff ( TH1 *  denom,
TH1 *  numer,
MonitorElement efficiencyHist,
const int  type = 1 
) [private]

Definition at line 821 of file DQMGenericClient.cc.

References LogDebug, MonitorElement::setBinContent(), MonitorElement::setBinError(), MonitorElement::setEfficiencyFlag(), and mathSSE::sqrt().

                                                                                                          {
  for (int iBinX = 1; iBinX < denom->GetNbinsX()+1; iBinX++){
    for (int iBinY = 1; iBinY < denom->GetNbinsY()+1; iBinY++){
      for (int iBinZ = 1; iBinZ < denom->GetNbinsZ()+1; iBinZ++){

        int globalBinNum = denom->GetBin(iBinX, iBinY, iBinZ);
        
        float numerVal = numer->GetBinContent(globalBinNum);
        float denomVal = denom->GetBinContent(globalBinNum);

        float effVal = 0;

        // fake eff is in use
        if (type == 2 ) {          
          effVal = denomVal ? (1 - numerVal / denomVal) : 0;
        } else {
          effVal = denomVal ? numerVal / denomVal : 0;
        }

        float errVal = (denomVal && (effVal <=1)) ? sqrt(effVal*(1-effVal)/denomVal) : 0;

        LogDebug ("DQMGenericClient") << "(iBinX, iBinY, iBinZ)  = "
             << iBinX << ", "
             << iBinY << ", "
             << iBinZ << "), global bin =  "  << globalBinNum
             << "eff = " << numerVal << "  /  " << denomVal
             << " =  " << effVal 
             << " ... setting the error for that bin ... " << endl
             << endl;

        
        efficiencyHist->setBinContent(globalBinNum, effVal);
        efficiencyHist->setBinError(globalBinNum, errVal);
        efficiencyHist->setEfficiencyFlag();
      }
    }
  }

  //efficiencyHist->setMinimum(0.0);
  //efficiencyHist->setMaximum(1.0);
}
void DQMGenericClient::limitedFit ( MonitorElement srcME,
MonitorElement meanME,
MonitorElement sigmaME 
)

Definition at line 733 of file DQMGenericClient.cc.

References cont, MonitorElement::getTH2F(), timingPdfMaker::histo, i, MonitorElement::setBinContent(), and MonitorElement::setBinError().

{
  TH2F * histo = srcME->getTH2F();

  static int i = 0;
  i++;

  // Fit slices projected along Y from bins in X 
  double cont_min = 100;    //Minimum number of entries
  Int_t binx =  histo->GetXaxis()->GetNbins();

  for (int i = 1; i <= binx ; i++) {
    TString iString(i);
    TH1 *histoY =  histo->ProjectionY(" ", i, i);
    double cont = histoY->GetEntries();

    if (cont >= cont_min) {
      float minfit = histoY->GetMean() - histoY->GetRMS();
      float maxfit = histoY->GetMean() + histoY->GetRMS();
      
      TF1 *fitFcn = new TF1(TString("g")+histo->GetName()+iString,"gaus",minfit,maxfit);
      double x1,x2;
      fitFcn->GetRange(x1,x2);

      histoY->Fit(fitFcn,"QR0","",x1,x2);

//      histoY->Fit(fitFcn->GetName(),"RME");
      double *par = fitFcn->GetParameters();
      double *err = fitFcn->GetParErrors();

      meanME->setBinContent(i, par[1]);
      meanME->setBinError(i, err[1]);
//       meanME->setBinEntries(i, 1.);
//       meanME->setBinError(i,sqrt(err[1]*err[1]+par[1]*par[1]));

      sigmaME->setBinContent(i, par[2]);
      sigmaME->setBinError(i, err[2]);
//       sigmaME->setBinEntries(i, 1.);
//       sigmaME->setBinError(i,sqrt(err[2]*err[2]+par[2]*par[2]));

      if(fitFcn) delete fitFcn;
      if(histoY) delete histoY;
    }
    else {
      if(histoY) delete histoY;
      continue;
    }
  }
}
void DQMGenericClient::makeCumulativeDist ( const std::string &  startDir,
const std::string &  cdName 
)

Definition at line 692 of file DQMGenericClient.cc.

References i.

{
  if ( ! theDQM->dirExists(startDir) ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "makeCumulativeDist() : "
                                     << "Cannot find sub-directory " << startDir << endl;
    }
    return;
  }

  theDQM->cd();

  ME* element_cd = theDQM->get(startDir+"/"+cdName);

  if ( !element_cd ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "makeCumulativeDist() : "
                                     << "No such element '" << cdName << "' found\n";
    }
    return;
  }

  TH1F* cd  = element_cd->getTH1F();

  if ( !cd ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "makeCumulativeDist() : "
                                     << "Cannot create TH1F from ME\n";
    }
    return;
  }

  int n_bins = cd->GetNbinsX() + 1;

  for (int i = 1; i <= n_bins; i++) {
    cd->SetBinContent(i,cd->GetBinContent(i) + cd->GetBinContent(i-1));
  }

  return;
}
void DQMGenericClient::normalizeToEntries ( const std::string &  startDir,
const std::string &  histName,
const std::string &  normHistName 
)

Definition at line 631 of file DQMGenericClient.cc.

References python::tagInventory::entries, and estimatePileup::hist.

{
  if ( ! theDQM->dirExists(startDir) ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "normalizeToEntries() : "
                                     << "Cannot find sub-directory " << startDir << endl;
    }
    return;
  }

  theDQM->cd();

  ME* element = theDQM->get(startDir+"/"+histName);
  ME* normME = theDQM->get(startDir+"/"+normHistName);

  if ( !element ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "normalizeToEntries() : "
                                     << "No such element '" << histName << "' found\n";
    }
    return;
  }

  if ( !normME ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "normalizeToEntries() : "
                                     << "No such element '" << normHistName << "' found\n";
    }
    return;
  }

  TH1F* hist  = element->getTH1F();
  if ( !hist) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "normalizeToEntries() : "
                                     << "Cannot create TH1F from ME\n";
    }
    return;
  }

  TH1F* normHist = normME->getTH1F();
  if ( !normHist ) {
    if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
      LogInfo("DQMGenericClient") << "normalizeToEntries() : "
                                     << "Cannot create TH1F from ME\n";
    }
    return;
  }

  const double entries = normHist->GetEntries();
  if ( entries != 0 ) {
    hist->Scale(1./entries);
  }
  else {
    LogInfo("DQMGenericClient") << "normalizeToEntries() : " 
                                   << "Zero entries in histogram\n";
  }

  return;
}

Member Data Documentation

std::vector<CDOption> DQMGenericClient::cdOptions_ [private]

Definition at line 95 of file DQMGenericClient.h.

Definition at line 92 of file DQMGenericClient.h.

Definition at line 85 of file DQMGenericClient.h.

Definition at line 94 of file DQMGenericClient.h.

std::string DQMGenericClient::outputFileName_ [private]

Definition at line 90 of file DQMGenericClient.h.

Definition at line 86 of file DQMGenericClient.h.

Definition at line 93 of file DQMGenericClient.h.

std::vector<std::string> DQMGenericClient::subDirs_ [private]

Definition at line 89 of file DQMGenericClient.h.

Definition at line 88 of file DQMGenericClient.h.

unsigned int DQMGenericClient::verbose_ [private]

Definition at line 84 of file DQMGenericClient.h.