22 #include "classlib/utils/StringList.h" 23 #include "classlib/utils/StringOps.h" 91 std::type_info
const & tp =
typeid(*h);
92 if (tp ==
typeid(TH1S))
93 _dbe->
book1S(h->GetName(),
dynamic_cast<TH1S*
>(
const_cast<T*
>(
h)));
94 else if (tp ==
typeid(TH1F))
95 _dbe->
book1D(h->GetName(),
dynamic_cast<TH1F*
>(
const_cast<T*
>(
h)));
96 else if (tp ==
typeid(TH1D))
97 _dbe->
book1DD(h->GetName(),
dynamic_cast<TH1D*
>(
const_cast<T*
>(
h)));
106 auto * difference =
new T(d_n.c_str(),
109 h_new->GetXaxis()->GetXmin(),
110 h_new->GetXaxis()->GetXmax());
111 difference->Add(h_new);
112 difference->Add(h_ref,-1.);
114 book(directory,
"Ref",h_ref);
115 book(directory,
"New",h_new);
116 book(directory,
"Diff",difference);
139 edm::LogError(
"ProductNotFound")<<
"MEtoMEComparitor did not find his products.";
145 const std::vector<MEtoEDMObject> & metoedmobject_ref = metoedm_ref->getMEtoEdmObject();
146 const std::vector<MEtoEDMObject> & metoedmobject_new = metoedm_new->getMEtoEdmObject();
148 typedef std::map<std::string, std::pair<const MEtoEDMObject*, const MEtoEDMObject*> > Mapping;
149 typedef typename std::map<std::string, std::pair<const MEtoEDMObject*, const MEtoEDMObject*> >::iterator Mapping_iterator;
153 LogDebug(
"MEtoMEComparitor")<<
"going to do the mapping from "<<metoedmobject_ref.size()<<
" x "<<metoedmobject_new.size();
154 unsigned int countMe=0;
155 for (
unsigned int i_new=0; i_new!= metoedmobject_new.size(); ++i_new){
156 const std::string & pathname = metoedmobject_new[i_new].name;
157 if (metoedmobject_new[i_new].
object.GetEntries()==0 ||
158 metoedmobject_new[i_new].object.Integral()==0){
162 mapping[pathname]=std::make_pair(&metoedmobject_new[i_new],(
const MEtoEDMObject*)
nullptr);
164 for (
unsigned int i_ref=0; i_ref!= metoedmobject_ref.size() ; ++i_ref){
165 const std::string & pathname = metoedmobject_ref[i_ref].name;
166 auto there = mapping.find(pathname);
167 if (there != mapping.end()){
168 there->second.second = &metoedmobject_ref[i_ref];
172 LogDebug(
"MEtoMEComparitor")<<
"found "<<mapping.size()<<
" pairs of plots";
175 unsigned int nNoMatch=0;
176 unsigned int nEmpty=0;
177 unsigned int nHollow=0;
178 unsigned int nGoodKS=0;
179 unsigned int nBadKS=0;
180 unsigned int nBadDiff=0;
181 unsigned int nGoodDiff=0;
183 typedef std::map<std::string, std::pair<unsigned int,unsigned int> > Subs;
186 for (
auto it = mapping.begin();
189 if (!it->second.second){
194 const T * h_ref = &it->second.second->object;
195 const T * h_new = &it->second.first->object;
200 for (
unsigned int iD=1;iD!=
_dirDepth;++iD) subsystem+=
"/"+dir[iD];
201 subSystems[subsystem].first++;
203 if (h_ref->GetEntries()!=0 && h_ref->Integral()!=0){
205 bool cannotComputeKS=
false;
207 KS = h_new->KolmogorovTest(h_ref);
210 cannotComputeKS=
true;
214 unsigned int total_ref=0;
215 unsigned int absdiff=0;
216 for (
unsigned int iBin=0;
217 iBin!=(
unsigned int)h_new->GetNbinsX()+1 ;
219 total_ref+=h_ref->GetBinContent(iBin);
220 absdiff=
std::abs(h_new->GetBinContent(iBin) - h_ref->GetBinContent(iBin));
222 double relativediff=1;
224 relativediff=absdiff / (double) total_ref;
229 <<
" the KS is "<<KS*100.<<
" %" 230 <<
" and the relative diff is: "<<relativediff*100.<<
" %" 231 <<
" KS"<<((cannotComputeKS)?
" not valid":
" is valid");
237 subSystems[subsystem].second++;
247 if (h_ref->GetEntries()==0)
251 LogDebug(
"MEtoMEComparitor")<<h_new->GetName() <<
" in "<<it->first <<
" is empty";
257 if (!mapping.empty()){
259 summary<<
" Summary :" 260 <<
"\n not matched : "<<nNoMatch
261 <<
"\n empty : "<<nEmpty
262 <<
"\n integral zero : "<<nHollow
263 <<
"\n good KS : "<<nGoodKS
264 <<
"\n bad KS : "<<nBadKS
265 <<
"\n bad diff : "<<nBadDiff
266 <<
"\n godd diff : "<<nGoodDiff;
268 for (
auto & subSystem : subSystems){
269 double fraction = 1-(subSystem.second.second / (double)subSystem.second.first);
270 summary<<std::endl<<
"Subsytem: "<<subSystem.first<<
" has "<< fraction*100<<
" % goodness";
const_reverse_iterator rbegin() const
T getParameter(std::string const &) const
std::string _lumiInstance
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
static PFTauRenderPlugin instance
void endLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) override
void endRun(const edm::Run &iRun, const edm::EventSetup &iSetup) override
MEtoMEComparitor(const edm::ParameterSet &)
MonitorElement * book1DD(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1S histogram.
void compare(const W &where, const std::string &instance)
void book(const std::string &directory, const std::string &type, const T *h)
Abs< T >::type abs(const T &t)
ProcessHistory const & processHistory() const
~MEtoMEComparitor() override
void keepBadHistograms(const std::string &directory, const T *h_new, const T *h_ref)
void beginRun(const edm::Run &iRun, const edm::EventSetup &iSetup) override
MonitorElement * book1S(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1S histogram.
void setCurrentFolder(const std::string &fullpath)