CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

MEtoMEComparitor Class Reference

#include <DQMOffline/MEtoMEComparitor/src/MEtoMEComparitor.cc>

Inheritance diagram for MEtoMEComparitor:
edm::EDAnalyzer

List of all members.

Public Member Functions

 MEtoMEComparitor (const edm::ParameterSet &)
 ~MEtoMEComparitor ()

Private Member Functions

virtual void analyze (const edm::Event &, const edm::EventSetup &)
virtual void beginJob ()
template<class T >
void book (const std::string &directory, const std::string &type, const T *h)
template<class W , class T >
void compare (const W &where, const std::string &instance)
virtual void endJob ()
virtual void endLuminosityBlock (const edm::LuminosityBlock &, const edm::EventSetup &)
virtual void endRun (const edm::Run &iRun, const edm::EventSetup &iSetup)
template<class T >
void keepBadHistograms (const std::string &directory, const T *h_new, const T *h_ref)
template<class T , class where >
void product ()

Private Attributes

DQMStore_dbe
double _diffgoodness
unsigned int _dirDepth
double _KSgoodness
std::string _lumiInstance
std::string _moduleLabel
double _overallgoodness
std::string _process_new
std::string _process_ref
std::string _runInstance

Detailed Description

Description: [one line class summary]

Implementation: [Notes on implementation]

Definition at line 52 of file MEtoMEComparitor.h.


Constructor & Destructor Documentation

MEtoMEComparitor::MEtoMEComparitor ( const edm::ParameterSet iConfig) [explicit]

Definition at line 26 of file MEtoMEComparitor.cc.

References _dbe, _diffgoodness, _dirDepth, _KSgoodness, _lumiInstance, _moduleLabel, _overallgoodness, _process_new, _process_ref, _runInstance, edm::ParameterSet::getParameter(), and cmsCodeRules::cppFunctionSkipper::operator.

{
  _moduleLabel = iConfig.getParameter<std::string>("MEtoEDMLabel");
  
  _lumiInstance = iConfig.getParameter<std::string>("lumiInstance");
  _runInstance = iConfig.getParameter<std::string>("runInstance");

  _process_ref = iConfig.getParameter<std::string>("processRef");
  _process_new = iConfig.getParameter<std::string>("processNew");

  if (iConfig.getParameter<bool>("autoProcess")){
    //get the last two process from the provenance

  }
  _KSgoodness = iConfig.getParameter<double>("KSgoodness");
  _diffgoodness = iConfig.getParameter<double>("Diffgoodness");
  _dirDepth = iConfig.getParameter<unsigned int>("dirDepth");
  _overallgoodness = iConfig.getParameter<double>("OverAllgoodness");
  
  _dbe = edm::Service<DQMStore>().operator->();


  /*
    produces<MEtoEDM<TH1F>, edm::InLumi>("name");

    product<TH1S,edm::InLumi>();
    product<TH1F,edm::InLumi>();
    product<TH1D,edm::InLumi>();

    product<TH1S,edm::InRun>();
    product<TH1F,edm::InRun>();
    product<TH1D,edm::InRun>();
  */
}
MEtoMEComparitor::~MEtoMEComparitor ( )

Definition at line 73 of file MEtoMEComparitor.cc.

{

}

Member Function Documentation

virtual void MEtoMEComparitor::analyze ( const edm::Event ,
const edm::EventSetup  
) [inline, private, virtual]

Implements edm::EDAnalyzer.

Definition at line 60 of file MEtoMEComparitor.h.

{}
void MEtoMEComparitor::beginJob ( void  ) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 296 of file MEtoMEComparitor.cc.

{
}
template<class T >
void MEtoMEComparitor::book ( const std::string &  directory,
const std::string &  type,
const T *  h 
) [private]

Definition at line 99 of file MEtoMEComparitor.cc.

References _dbe, DQMStore::book1D(), DQMStore::book1DD(), DQMStore::book1S(), h, and DQMStore::setCurrentFolder().

Referenced by keepBadHistograms().

                                                                                          {
  _dbe->setCurrentFolder(type);
  std::type_info const & tp = typeid(*h);
  if (tp == typeid(TH1S))
    _dbe->book1S(h->GetName(),dynamic_cast<TH1S*>(const_cast<T*>(h)));
  else if (tp == typeid(TH1F))
    _dbe->book1D(h->GetName(),dynamic_cast<TH1F*>(const_cast<T*>(h)));
  else if (tp == typeid(TH1D))
    _dbe->book1DD(h->GetName(),dynamic_cast<TH1D*>(const_cast<T*>(h)));
}
template<class W , class T >
void MEtoMEComparitor::compare ( const W &  where,
const std::string &  instance 
) [private]

Definition at line 135 of file MEtoMEComparitor.cc.

References _diffgoodness, _dirDepth, _KSgoodness, _moduleLabel, _overallgoodness, _process_new, _process_ref, abs, dir, exception, edm::HandleBase::failedToGet(), keepBadHistograms(), LogDebug, tests::test_downloadMethods::pathname, split, hcal_dqm_sourceclient-file_cfg::subsystem, and edmLumisInFiles::summary.

                                                                       {

  edm::Handle<MEtoEDM<T> > metoedm_ref;
  edm::Handle<MEtoEDM<T> > metoedm_new;
  where.getByLabel(edm::InputTag(_moduleLabel,
                                 instance,
                                 _process_ref),
                   metoedm_ref);
  where.getByLabel(edm::InputTag(_moduleLabel,
                                 instance,
                                 _process_new),
                   metoedm_new);

  if (metoedm_ref.failedToGet() || metoedm_new.failedToGet()){
    edm::LogError("ProductNotFound")<<"MEtoMEComparitor did not find his products.";
    return;
  }

  typedef typename MEtoEDM<T>::MEtoEDMObject MEtoEDMObject; 
  
  const std::vector<MEtoEDMObject> & metoedmobject_ref = metoedm_ref->getMEtoEdmObject();
  const std::vector<MEtoEDMObject> & metoedmobject_new = metoedm_new->getMEtoEdmObject();

  typedef std::map<std::string, std::pair<const MEtoEDMObject*, const MEtoEDMObject*> > Mapping;
  typedef typename std::map<std::string, std::pair<const MEtoEDMObject*, const MEtoEDMObject*> >::iterator Mapping_iterator;

  Mapping mapping;

  LogDebug("MEtoMEComparitor")<<"going to do the mapping from "<<metoedmobject_ref.size()<<" x "<<metoedmobject_new.size();
  unsigned int countMe=0;
  for (unsigned int i_new=0; i_new!= metoedmobject_new.size(); ++i_new){
    const std::string & pathname = metoedmobject_new[i_new].name;
    if (metoedmobject_new[i_new].object.GetEntries()==0 ||
        metoedmobject_new[i_new].object.Integral()==0){
      countMe--;
      continue;
    }
    mapping[pathname]=std::make_pair(&metoedmobject_new[i_new],(const MEtoEDMObject*)0);
  }
  for (unsigned int i_ref=0; i_ref!= metoedmobject_ref.size() ; ++i_ref){
    const std::string & pathname = metoedmobject_ref[i_ref].name;
    Mapping_iterator there = mapping.find(pathname);
    if (there != mapping.end()){
      there->second.second = &metoedmobject_ref[i_ref];
    }
  }

  LogDebug("MEtoMEComparitor")<<"found "<<mapping.size()<<" pairs of plots";
  countMe=0;

  unsigned int nNoMatch=0;
  unsigned int nEmpty=0;
  unsigned int nHollow=0;
  unsigned int nGoodKS=0;
  unsigned int nBadKS=0;
  unsigned int nBadDiff=0;
  unsigned int nGoodDiff=0;

  typedef std::map<std::string, std::pair<unsigned int,unsigned int> > Subs;
  Subs subSystems;

  for (Mapping_iterator it = mapping.begin();
       it!=mapping.end(); 
       ++it){
    if (!it->second.second){
      //this is expected by how the map was created
      nNoMatch++;
      continue;
    }
    const T * h_ref = &it->second.second->object;
    const T * h_new = &it->second.first->object;

    lat::StringList dir = lat::StringOps::split(it->second.second->name,"/");
    std::string subsystem = dir[0];
    if (dir.size()>=_dirDepth)
      for (unsigned int iD=1;iD!=_dirDepth;++iD) subsystem+="/"+dir[iD];
    subSystems[subsystem].first++;

    if (h_ref->GetEntries()!=0 && h_ref->Integral()!=0){
      double KS=0;
      bool cannotComputeKS=false;
      try {
        KS = h_new->KolmogorovTest(h_ref);
      }
      catch( cms::Exception& exception ){
        cannotComputeKS=true;
      }
      if (KS<_KSgoodness){

        unsigned int total_ref=0;
        unsigned int absdiff=0;
        for (unsigned int iBin=0;
             iBin!=(unsigned int)h_new->GetNbinsX()+1 ;
             ++iBin){
          total_ref+=h_ref->GetBinContent(iBin);
          absdiff=std::abs(h_new->GetBinContent(iBin) - h_ref->GetBinContent(iBin));
        }
        double relativediff=1;
        if (total_ref!=0){
          relativediff=absdiff / (double) total_ref;
        }
        if (relativediff > _diffgoodness ){
          edm::LogWarning("MEtoMEComparitor")<<"for "<<h_new->GetName()
                                             <<" in "<<it->first    
                                             <<" the KS is "<<KS*100.<<" %"
                                             <<" and the relative diff is: "<<relativediff*100.<<" %"
                                             <<" KS"<<((cannotComputeKS)?" not valid":" is valid");
          //std::string(" KolmogorovTest is not happy on : ")+h_new->GetName() : "";
          //there you want to output the plots somewhere
          keepBadHistograms(subsystem,h_new,h_ref);
          
          nBadDiff++;
          subSystems[subsystem].second++;
        }else{
          nGoodDiff++;
        }
        nBadKS++;
      }
      else
        nGoodKS++;
    }
    else{
      if (h_ref->GetEntries()==0)
        nEmpty++;
      else
        nHollow++;
      LogDebug("MEtoMEComparitor")<<h_new->GetName()   <<" in "<<it->first    <<" is empty";
      countMe--;
    }
    
  }
  
  if (mapping.size()!=0){
    std::stringstream summary;
    summary<<" Summary :"
           <<"\n not matched : "<<nNoMatch
           <<"\n empty : "<<nEmpty
           <<"\n integral zero : "<<nHollow
           <<"\n good KS : "<<nGoodKS
           <<"\n bad KS : "<<nBadKS
           <<"\n bad diff : "<<nBadDiff
           <<"\n godd diff : "<<nGoodDiff;
    bool tell=false;
    for (Subs::iterator iSub=subSystems.begin();
         iSub!=subSystems.end();++iSub){
      double fraction = 1-(iSub->second.second / (double)iSub->second.first);
      summary<<std::endl<<"Subsytem: "<<iSub->first<<" has "<< fraction*100<<" % goodness";
      if (fraction < _overallgoodness)
        tell=true;
    }
    if (tell)
      edm::LogWarning("MEtoMEComparitor")<<summary.str();
    else
      edm::LogInfo("MEtoMEComparitor")<<summary.str();
  }
  
}
void MEtoMEComparitor::endJob ( void  ) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 302 of file MEtoMEComparitor.cc.

                         {
}
void MEtoMEComparitor::endLuminosityBlock ( const edm::LuminosityBlock iLumi,
const edm::EventSetup  
) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 79 of file MEtoMEComparitor.cc.

References _lumiInstance.

{

  compare<edm::LuminosityBlock,TH1S>(iLumi,_lumiInstance);
  compare<edm::LuminosityBlock,TH1F>(iLumi,_lumiInstance);
  compare<edm::LuminosityBlock,TH1D>(iLumi,_lumiInstance);
}
void MEtoMEComparitor::endRun ( const edm::Run iRun,
const edm::EventSetup iSetup 
) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 88 of file MEtoMEComparitor.cc.

References _runInstance.

{

  compare<edm::Run,TH1S>(iRun,_runInstance);
  compare<edm::Run,TH1F>(iRun,_runInstance);
  compare<edm::Run,TH1D>(iRun,_runInstance);

}
template<class T >
void MEtoMEComparitor::keepBadHistograms ( const std::string &  directory,
const T *  h_new,
const T *  h_ref 
) [private]

Definition at line 110 of file MEtoMEComparitor.cc.

References book().

Referenced by compare().

                                                                                                     {
  //put it in a collection rather.

  
  std::string d_n(h_new->GetName());
  d_n+="_diff";
  T * difference = new T(d_n.c_str(),
                         h_new->GetTitle(),
                         h_new->GetNbinsX(),
                         h_new->GetXaxis()->GetXmin(),
                         h_new->GetXaxis()->GetXmax());
  difference->Add(h_new);
  difference->Add(h_ref,-1.);

  book(directory,"Ref",h_ref);
  book(directory,"New",h_new);
  book(directory,"Diff",difference);
  delete difference;

}
template<class T , class W >
void MEtoMEComparitor::product ( ) [private]

Definition at line 64 of file MEtoMEComparitor.cc.

                         {
  /*
    typedef typename MEtoEDM<T> prod;
    produces<prod,W>("ref");
    produces<prod,W>("new");
    produces<prod,W>("diff");
  */
}

Member Data Documentation

Definition at line 70 of file MEtoMEComparitor.h.

Referenced by book(), and MEtoMEComparitor().

Definition at line 79 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

unsigned int MEtoMEComparitor::_dirDepth [private]

Definition at line 80 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

Definition at line 78 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

std::string MEtoMEComparitor::_lumiInstance [private]

Definition at line 73 of file MEtoMEComparitor.h.

Referenced by endLuminosityBlock(), and MEtoMEComparitor().

std::string MEtoMEComparitor::_moduleLabel [private]

Definition at line 71 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

Definition at line 81 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

std::string MEtoMEComparitor::_process_new [private]

Definition at line 77 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

std::string MEtoMEComparitor::_process_ref [private]

Definition at line 76 of file MEtoMEComparitor.h.

Referenced by compare(), and MEtoMEComparitor().

std::string MEtoMEComparitor::_runInstance [private]

Definition at line 74 of file MEtoMEComparitor.h.

Referenced by endRun(), and MEtoMEComparitor().