68 const std::map<std::string,double> & gthreshold,
69 const std::map<std::string,double> & rthreshold )
77 if (gthreshold.size() != rthreshold.size()) {
78 throw dqm_core::BadConfig( ERS_HERE,
"MakeComparisons",
"Need same number of Red and Green Threshold" );
81 if (gthreshold.size() == 0 ) {
82 throw dqm_core::BadConfig( ERS_HERE,
"MakeComparisons",
"No Threshold specified" );
85 std::map<std::string,double>::const_iterator g_iter;
87 for (g_iter=gthreshold.begin();g_iter!=gthreshold.end();++g_iter){
89 std::string name=(std::string) g_iter->first;
90 std::string findname=name;
91 double gtvalue=g_iter->second;
93 if (name ==
"AbsMean" )
95 if (name ==
"AbsXMean" )
97 if (name ==
"AbsYMean" )
101 std::map<std::string,double>::const_iterator ait = algparams.find(findname);
102 std::map<std::string,double>::const_iterator rit = rthreshold.find(name);
106 if ( ait != algparams.end() ) {
110 throw dqm_core::BadConfig( ERS_HERE,
"None",std::move(name) );
113 if ( rit != rthreshold.end() ) {
117 throw dqm_core::BadConfig( ERS_HERE,
"None",std::move(name) );
121 if (name ==
"AbsMean" || name ==
"AbsXMean" || name==
"AbsYMean") {
122 avalue = fabs(avalue);
123 if (gtvalue < 0 || rtvalue <0 ) {
124 throw dqm_core::BadConfig( ERS_HERE,
"None",std::move(name) );
128 ERS_DEBUG(1, name<<
" :red value "<<rtvalue<<
" :green value "<<gtvalue<<
" :param value "<<avalue);
130 if (gtvalue < rtvalue) {
132 if (avalue <= gtvalue ){
134 }
else if(avalue < rtvalue){
140 else if (gtvalue > rtvalue) {
141 if (avalue >= gtvalue ){
143 }
else if(avalue > rtvalue){
150 ERS_DEBUG(0,
"red threshold (" << rtvalue <<
") same as green threshold "<< gtvalue <<
") for parameter " << name <<
": can't evaluate result");
151 throw dqm_core::BadConfig( ERS_HERE,
"None", std::move(name) );
155 ERS_DEBUG(1,
"red: "<<
red<<
" yellow: "<<
yellow<<
" green: "<<
green);
158 dqm_core::Result* result =
new dqm_core::Result();
160 result->tags_ = algparams;
164 result->status_= dqm_core::Result::Red;
166 result->status_= dqm_core::Result::Yellow;
168 result->status_= dqm_core::Result::Green;
176 const std::map<std::string,double> & paramErrors,
177 const std::map<std::string,double> & gthreshold,
178 const std::map<std::string,double> & rthreshold,
double minSig )
187 if (gthreshold.size() != rthreshold.size()) {
188 throw dqm_core::BadConfig( ERS_HERE,
"MakeComparisons",
"Need same number of Red and Green Threshold" );
191 if (gthreshold.size() == 0 ) {
192 throw dqm_core::BadConfig( ERS_HERE,
"MakeComparisons",
"No Threshold specified" );
195 std::map<std::string,double>::const_iterator g_iter;
197 for (g_iter=gthreshold.begin();g_iter!=gthreshold.end();++g_iter){
199 std::string name=(std::string) g_iter->first;
200 std::string findname=name;
201 double gtvalue=g_iter->second;
203 if (name ==
"AbsMean" )
205 if (name ==
"AbsXMean" )
207 if (name ==
"AbsYMean" )
211 std::map<std::string,double>::const_iterator ait = algparams.find(findname);
212 std::map<std::string,double>::const_iterator errItr = paramErrors.find(findname);
213 std::map<std::string,double>::const_iterator rit = rthreshold.find(name);
215 double rtvalue = -999;
216 double avalue = -999;
219 if ( ait != algparams.end() ) {
223 throw dqm_core::BadConfig( ERS_HERE,
"None", std::move(name) );
226 if ( errItr != paramErrors.end() ) {
227 error = errItr->second;
230 throw dqm_core::BadConfig( ERS_HERE,
"Problem retrieving fit param error", std::move(name) );
234 if ( rit != rthreshold.end() ) {
238 throw dqm_core::BadConfig( ERS_HERE,
"None", std::move(name) );
242 if (name ==
"AbsMean" || name ==
"AbsXMean" || name==
"AbsYMean") {
243 avalue = fabs(avalue);
244 if (gtvalue < 0 || rtvalue <0 ) {
245 throw dqm_core::BadConfig( ERS_HERE,
"None", std::move(name) );
249 ERS_DEBUG(1, name<<
" :red value "<<rtvalue<<
" :green value "<<gtvalue<<
" :param value "<<avalue <<
" :param error "<<
error);
251 double significanceBound =
error * minSig;
254 if (gtvalue < rtvalue) {
256 if ( avalue <= (gtvalue - significanceBound) ){
259 else if( avalue > (rtvalue + significanceBound) ){
262 else if( avalue > (gtvalue + significanceBound) ) {
269 else if (gtvalue > rtvalue) {
270 if ( avalue >= (gtvalue + significanceBound) ){
273 else if( avalue < (rtvalue - significanceBound) ){
276 else if( avalue < (gtvalue - significanceBound) ){
284 ERS_DEBUG(0,
"red threshold same as green threshold: can't evaluate result");
285 throw dqm_core::BadConfig( ERS_HERE,
"None", std::move(name) );
292 dqm_core::Result* result =
new dqm_core::Result();
294 result->tags_ = algparams;
299 result->status_= dqm_core::Result::Red;
302 result->status_= dqm_core::Result::Yellow;
305 result->status_= dqm_core::Result::Undefined;
308 result->status_= dqm_core::Result::Green;
317 std::map<std::string, double > params =
GetFitParams(func);
318 std::map<std::string, double > greenthresh=config.getGreenThresholds();
319 std::map<std::string,double>::const_iterator ait = greenthresh.find(chi2Str);
320 if ( ait != greenthresh.end() ) {
321 params[chi2Str]=func->GetChisquare()/ func->GetNDF();
323 double subtractfrommean =
GetFirstFromMap(
"SubtractFromMean", config.getParameters(), 0 );
325 params[
"Mean"] = params[
"Mean"] - subtractfrommean;
326 dqm_core::Result * result;
329 result =
MakeComparisons( params, config.getGreenThresholds(), config.getRedThresholds() );
333 result =
CompareWithErrors( params, paramErrors, config.getGreenThresholds(), config.getRedThresholds(), minSig );
336 result->tags_ = std::move(params);
337 for ( std::map<std::string,double>::const_iterator peItr = paramErrors.begin(); peItr != paramErrors.end(); ++peItr ) {
338 std::string errorName = peItr->first;
339 errorName +=
" Error";
340 result->tags_[errorName] = peItr->second;
458 int hNdimension = hNumerator->GetDimension();
459 int hDdimension = hDenominator->GetDimension();
461 if( hDdimension == hNdimension ) {
462 if( (hNumerator->GetNbinsX() != hDenominator->GetNbinsX()) || (hNumerator->GetNbinsY() != hDenominator->GetNbinsY()) ||
463 (hNumerator->GetNbinsZ() != hNumerator->GetNbinsZ()) ) {
464 throw dqm_core::BadConfig( ERS_HERE,
"DivideByHistogram",
"number of bins do not match");
469 if( hNdimension == 1) {
472 else if ( hNdimension == 2 ) {
475 else if ( hNdimension == 3 ) {
479 throw dqm_core::BadConfig( ERS_HERE,
"DivideByHistogram",
"Histograms with dimension greater than 3 are not supported");
483 hResult->Divide(hNumerator,hDenominator);
485 else if ( hNdimension > hDdimension ) {
489 const TAxis* xax = hNumerator->GetXaxis();
490 int nbinsx = xax->GetNbins();
491 const TAxis* yax = hNumerator->GetYaxis();
492 int nbinsy = yax->GetNbins();
493 const TAxis* zax = hNumerator->GetZaxis();
494 int nbinsz = zax->GetNbins();
496 if( nbinsx != hDenominator->GetNbinsX() ) {
497 throw dqm_core::BadConfig( ERS_HERE,
"DivideByHistogram",
"number of bins in x-axis do not match");
499 if( (hDdimension == 2) && (nbinsy != hDenominator->GetNbinsY()) ) {
500 throw dqm_core::BadConfig( ERS_HERE,
"DivideByHistogram",
"number of bins in y-axis do not match");
503 double numeratorCont = 0;
504 double denominatorCont = 0;
505 double numeratorError = 0;
506 double denominatorError = 0;
508 if(hNdimension == 2) {
511 else if(hNdimension == 3) {
515 throw dqm_core::BadConfig( ERS_HERE,
"DivideByHistogram",
"Histograms with dimension greater than 3 are not supported");
518 for (
int i=1; i <= nbinsx; i++) {
519 if( hDdimension == 1){
520 denominatorCont = hDenominator->GetBinContent(i);
521 denominatorError = hDenominator->GetBinError(i);
523 for (
int j=1; j <= nbinsy; j++) {
524 if( hDdimension == 2){
525 denominatorCont = hDenominator->GetBinContent(i,j);
526 denominatorError = hDenominator->GetBinError(i,j);
528 if( hNdimension == 2){
529 numeratorCont = hNumerator->GetBinContent(i,j);
530 numeratorError = hNumerator->GetBinError(i,j);
531 if(denominatorCont != 0){
532 hResult->SetBinContent(i,j,numeratorCont/denominatorCont);
533 hResult->SetBinError(i,j,sqrt( ( pow(numeratorError,2)/pow(denominatorCont,2) )
534 + ( pow(denominatorError,2) * pow(numeratorCont,2) / pow(denominatorCont,4) ) ) );
538 for (
int k=1; k <= nbinsz; k++) {
539 numeratorCont = hNumerator->GetBinContent(i,j,k);
540 numeratorError = hNumerator->GetBinError(i,j,k);
541 if(denominatorCont != 0){
542 hResult->SetBinContent(i,j,k,numeratorCont/denominatorCont);
543 hResult->SetBinError(i,j,k,sqrt( ( pow(numeratorError,2)/pow(denominatorCont,2) )
544 + ( pow(denominatorError,2) * pow(numeratorCont,2) / pow(denominatorCont,4) ) ) );
555 const TAxis* xax = hDenominator->GetXaxis();
556 int nbinsx = xax->GetNbins();
557 const TAxis* yax = hDenominator->GetYaxis();
558 int nbinsy = yax->GetNbins();
559 const TAxis* zax = hDenominator->GetZaxis();
560 int nbinsz = zax->GetNbins();
562 if( nbinsx != hNumerator->GetNbinsX() ) {
563 throw dqm_core::BadConfig( ERS_HERE,
"number of bins in x-axis",
"do not match");
565 if( (hNdimension == 2) && (nbinsy != hNumerator->GetNbinsY()) ) {
566 throw dqm_core::BadConfig( ERS_HERE,
"number of bins in y-axis",
"do not match");
569 double denominatorCont = 0;
570 double numeratorCont = 0;
571 double denominatorError = 0;
572 double numeratorError = 0;
574 if(hDdimension == 2) {
577 else if(hDdimension == 3) {
581 throw dqm_core::BadConfig( ERS_HERE,
"DivideByHistogram",
"Histograms with dimension greater than 3 are not supported");
585 for (
int i=1; i <= nbinsx; i++) {
586 if( hNdimension == 1){
587 numeratorCont = hNumerator->GetBinContent(i);
588 numeratorError = hNumerator->GetBinError(i);
590 for (
int j=1; j <= nbinsy; j++) {
591 if( hNdimension == 2){
592 numeratorCont = hNumerator->GetBinContent(i,j);
593 numeratorError = hNumerator->GetBinError(i,j);
595 if( hDdimension == 2){
596 denominatorCont = hDenominator->GetBinContent(i,j);
597 denominatorError = hDenominator->GetBinError(i,j);
598 if(denominatorCont != 0){
599 hResult->SetBinContent(i,j,numeratorCont/denominatorCont);
600 hResult->SetBinError(i,j,sqrt( ( pow(numeratorError,2)/pow(denominatorCont,2) )
601 + ( pow(denominatorError,2) * pow(numeratorCont,2) / pow(denominatorCont,4) ) ) );
605 for (
int k=1; k <= nbinsz; k++) {
606 denominatorCont = hDenominator->GetBinContent(i,j,k);
607 denominatorError = hDenominator->GetBinError(i,j,k);
608 if(denominatorCont != 0){
609 hResult->SetBinContent(i,j,k,numeratorCont/denominatorCont);
610 hResult->SetBinError(i,j,sqrt( ( pow(numeratorError,2)/pow(denominatorCont,2) )
611 + ( pow(denominatorError,2) * pow(numeratorCont,2) / pow(denominatorCont,4) ) ) );
701 throw dqm_core::BadConfig( ERS_HERE, name,
"can't make a 2D histogram from a 1D histogram");
704 if(
histogram->GetXaxis()->IsVariableBinSize()) {
705 resultXY =
new TH2F(name.c_str(),title.c_str(),
710 resultXY =
new TH2F(name.c_str(),title.c_str(),
715 resultXY->SetXTitle(
histogram->GetXaxis()->GetTitle());
716 resultXY->SetYTitle(
histogram->GetYaxis()->GetTitle());
717 return static_cast<TH1*
> (resultXY);
722 throw dqm_core::BadConfig( ERS_HERE, name,
"can't extract a Y-Axis from a 1D histogram");
725 if(
histogram->GetYaxis()->IsVariableBinSize()) {
726 resultY =
new TH1F(name.c_str(),title.c_str(),
730 resultY =
new TH1F(name.c_str(),title.c_str(),
733 resultY->SetXTitle(
histogram->GetYaxis()->GetTitle());
734 return static_cast<TH1*
> (resultY);
739 throw dqm_core::BadConfig( ERS_HERE, name,
"can't make a 3D histrogram without at least a 3D histogram");
742 if(
histogram->GetXaxis()->IsVariableBinSize()) {
743 resultXYZ =
new TH3F(name.c_str(),title.c_str(),
749 resultXYZ =
new TH3F(name.c_str(),title.c_str(),
754 resultXYZ->SetXTitle(
histogram->GetXaxis()->GetTitle());
755 resultXYZ->SetYTitle(
histogram->GetYaxis()->GetTitle());
756 resultXYZ->SetZTitle(
histogram->GetZaxis()->GetTitle());
762 throw dqm_core::BadConfig( ERS_HERE, name,
"can't extract a Z-Axis from a dimension < 3 histogram");
765 if(
histogram->GetXaxis()->IsVariableBinSize()) {
766 resultXZ =
new TH2F(name.c_str(),title.c_str(),
771 resultXZ =
new TH2F(name.c_str(),title.c_str(),
775 resultXZ->SetXTitle(
histogram->GetXaxis()->GetTitle());
776 resultXZ->SetYTitle(
histogram->GetZaxis()->GetTitle());
777 return static_cast<TH1*
> (resultXZ);
782 throw dqm_core::BadConfig( ERS_HERE, name,
"can't extract a Z-Axis from a dimension < 3 histogram");
785 if(
histogram->GetYaxis()->IsVariableBinSize()) {
786 resultYZ =
new TH2F(name.c_str(),title.c_str(),
791 resultYZ =
new TH2F(name.c_str(),title.c_str(),
795 resultYZ->SetXTitle(
histogram->GetYaxis()->GetTitle());
796 resultYZ->SetYTitle(
histogram->GetZaxis()->GetTitle());
797 return static_cast<TH1*
> (resultYZ);
802 throw dqm_core::BadConfig( ERS_HERE, name,
"can't extract a Z-Axis from a dimension < 3 histogram");
805 if(
histogram->GetZaxis()->IsVariableBinSize()) {
806 resultZ =
new TH1F(name.c_str(),title.c_str(),
810 resultZ =
new TH1F(name.c_str(),title.c_str(),
813 resultZ->SetXTitle(
histogram->GetZaxis()->GetTitle());
814 return static_cast<TH1*
> (resultZ);
820 if(
histogram->GetXaxis()->IsVariableBinSize()) {
821 resultX =
new TH1F(name.c_str(),title.c_str(),
825 resultX =
new TH1F(name.c_str(),title.c_str(),
828 resultX->SetXTitle(
histogram->GetXaxis()->GetTitle());
829 return static_cast<TH1*
> (resultX );
836 const TObject*& firstReference ,
837 TObject*& secondReference )
839 if ( ro.InheritsFrom(
"TH1") )
842 firstReference = &ro;
846 else if ( ro.InheritsFrom(
"TCollection") )
849 const TCollection* coll =
static_cast<const TCollection*
>(&ro);
850 TIterator* it = coll->MakeIterator();
851 TObject* content = it->Next();
852 if ( content == 0 || content->InheritsFrom(
"TH1") == kFALSE )
854 throw dqm_core::BadRefHist(ERS_HERE,
"handleReference",
" Could not retreive reference");
856 firstReference =
static_cast<TH1 *
>(content);
857 Int_t csize = coll->GetEntries();
864 else if ( coll->GetEntries() == 2 )
867 secondReference = it->Next();
873 secondReference =
static_cast<TObject*
>( (coll->IsA())->New() );
874 if ( secondReference == 0 || secondReference->InheritsFrom(
"TCollection") == kFALSE )
876 throw dqm_core::BadRefHist(ERS_HERE,
"handleReference",
" Could not retreive reference");
878 while ( (content = it->Next()) )
880 static_cast<TCollection*
>(secondReference)->Add(content);
888 throw dqm_core::BadRefHist(ERS_HERE,
"handleReference",
" Could not retreive reference");
896 int nIterations,
double exponent,
double threshold,
double SBCF,
double nStop) {
898 int size = input.size();
903 if (nStop < 0) nStop = 0;
904 if (SBCF < 0) SBCF = 0;
906 std::vector<binContainer>::const_iterator cbegin = input.begin();
907 std::vector<binContainer>::const_iterator cend = input.end();
909 std::vector<binContainer>::iterator begin = input.begin();
910 std::vector<binContainer>::iterator end = input.end();
918 for (
int j = 0; j < nIterations ; j++ ) {
925 for ( std::vector<binContainer>::iterator it = begin; it != end; ++it ) {
927 it->test = ( (fabs(it->value -
mean) < (
threshold * scale) ) || (j==0) );
933 int nOut =
size - newNin;
935 if (newNin < (2 + nStop + SBCF * nOut) ) {
938 newMean = newNin ? (sum / newNin) : 0;
940 if ( (newNin == nIn) && (newMean ==
mean) ) {
947 for ( std::vector<binContainer>::const_iterator it = cbegin; it != cend; ++it ) {
949 scaleSum += pow( fabs(it->value - newMean) , exponent );
952 newScale = pow( scaleSum / (nIn - 1 - (SBCF * nOut) ), 1/exponent);
964 if( minDiff < 0 ) minDiff = 0;
965 if( minNin < 2) minNin = 3;
974 std::vector<binContainer>::iterator begin = input.begin();
975 std::vector<binContainer>::iterator end = input.end();
979 double sumError2 = 0;
980 for( std::vector<binContainer>::iterator it = begin; it != end; ++it ) {
982 sumError2 += pow(it->error,2);
986 meanError = sqrt( sumError2/ nIn );
991 std::map<double,binContainer*> absDiffMap;
992 for( std::vector<binContainer>::iterator it = begin; it != end; ++it ) {
994 absDiffMap[ fabs( it->value -
mean ) ] = &(*it);
999 std::map<double,binContainer*>::iterator outlierCandidate = absDiffMap.end();
1001 if( outlierCandidate->first < minDiff ) {
1007 double newMeanError = 0;
1009 for( std::map<double,binContainer*>::iterator it = absDiffMap.begin(); it != outlierCandidate; ++it) {
1010 sum += it->second->value;
1011 sumError2 += pow(it->second->error,2);
1013 newMean = sum/(nIn - 1);
1014 newMeanError = sqrt( sumError2/(nIn - 2) );
1016 double meanShift = fabs(
mean - newMean );
1019 if( meanShift > newMeanError ) {
1020 outlierCandidate->second->test =
false;
1022 meanError = newMeanError;
1033 const std::vector<double>& xValues,
const std::vector<double>& yValues,
double threshold,
int topology ) {
1035 binCluster cluster = {0.,0.,xValues[seed.ix],yValues[seed.iy],-1.,0,seed.ix,seed.ix,seed.iy,seed.iy};
1036 std::list<binContainer*> binsToCheck;
1037 std::vector<binContainer*> binsInCluster;
1038 binsToCheck.push_back(&seed);
1043 double maxDistanceX = -1;
1044 double maxDistanceY = -1;
1045 int ixRangeMax = (int)xValues.size() - 2;
1046 int iyRangeMax = (int)yValues.size() - 2;
1050 maxDistanceY = (yValues.back() - yValues.front()) / 2;
1053 maxDistanceX = (xValues.back() - xValues.front()) / 2;
1056 maxDistanceX = (xValues.back() - xValues.front()) / 2;
1057 maxDistanceY = (yValues.back() - yValues.front()) / 2;
1061 while( binsToCheck.size() != 0) {
1063 std::list<binContainer*> newNeighbors;
1064 for( std::list<binContainer*>::const_iterator
bin = binsToCheck.begin();
bin != binsToCheck.end(); ++
bin ) {
1073 if( ( fabs((*bin)->value) > (
threshold + 5*(*bin)->error ) ) && ( (*bin)->test == 0 ) && ((*bin)->error >= 0) ) {
1075 binsInCluster.push_back(*
bin);
1078 cluster.
value += (*bin)->value;
1079 error2 += pow( (*bin)->error, 2);
1082 int ix = (*bin)->ix;
1083 int iy = (*bin)->iy;
1084 double xPosition = xValues[ix];
1085 double yPosition = yValues[iy];
1089 if( (maxDistanceX > 0) && (fabs(xPosition - cluster.
x) > maxDistanceX) ) {
1091 if( xPosition < maxDistanceX ) {
1092 xPosition += 2 * maxDistanceX;
1093 if( (ix + ixRangeMax) > cluster.
ixmax ) {
1094 cluster.
ixmax = ix + ixRangeMax;
1098 xPosition -= 2 * maxDistanceX;
1099 if( (ix - ixRangeMax) < cluster.
ixmin ) {
1100 cluster.
ixmin = ix - ixRangeMax;
1106 if( ix < cluster.
ixmin ) {
1109 if( ix > cluster.
ixmax ) {
1114 if( (maxDistanceY > 0) && (fabs(yPosition - cluster.
y) > maxDistanceY) ) {
1116 if( yPosition < maxDistanceY ) {
1117 yPosition += 2 * maxDistanceY;
1118 if( (iy + iyRangeMax) > cluster.
iymax ) {
1119 cluster.
iymax = iy + iyRangeMax;
1123 yPosition -= 2 * maxDistanceY;
1124 if( (iy - iyRangeMax) < cluster.
iymin ) {
1125 cluster.
iymin = iy - iyRangeMax;
1131 if( iy < cluster.
iymin ) {
1134 if( iy > cluster.
iymax ) {
1139 pvpX += xPosition * (*bin)->value;
1140 pvpY += yPosition * (*bin)->value;
1144 newNeighbors.push_back( binMap[ix+1][iy+1] );
1145 newNeighbors.push_back( binMap[ix+1][iy] );
1146 newNeighbors.push_back( binMap[ix+1][iy-1] );
1148 newNeighbors.push_back( binMap[ix][iy+1] );
1149 newNeighbors.push_back( binMap[ix][iy-1] );
1151 newNeighbors.push_back( binMap[ix-1][iy+1] );
1152 newNeighbors.push_back( binMap[ix-1][iy] );
1153 newNeighbors.push_back( binMap[ix-1][iy-1] );
1160 newNeighbors.unique();
1162 binsToCheck = std::move(newNeighbors);
1164 if (cluster.
value != 0) {
1165 cluster.
x = pvpX / cluster.
value;
1166 cluster.
y = pvpY / cluster.
value;
1169 cluster.
x = cluster.
y = 0;
1174 cluster.
error = sqrt( error2 );
1178 for(std::vector<binContainer*>::const_iterator
bin = binsInCluster.begin();
bin != binsInCluster.end(); ++
bin) {
1179 double xDistance = fabs( xValues[(*bin)->ix] - cluster.
x );
1180 double yDistance = fabs( yValues[(*bin)->iy] - cluster.
y );
1181 if (maxDistanceX > 0 && (xDistance > maxDistanceX) ) {
1182 xDistance = 2 * maxDistanceX - xDistance;
1184 if (maxDistanceY > 0 && (yDistance > maxDistanceY) ) {
1185 yDistance = 2 * maxDistanceY - yDistance;
1188 dvpSum += (*bin)->value * sqrt( pow( xValues[(*bin)->ix] - cluster.
x,2) + pow(yValues[(*bin)->iy] - cluster.
y,2) );
1193 while( cluster.
ixmin < 1 ){
1194 cluster.
ixmin += ixRangeMax;
1196 while( cluster.
ixmax > ixRangeMax ){
1197 cluster.
ixmax -= ixRangeMax;
1199 while( cluster.
iymin < 1 ){
1200 cluster.
iymin += iyRangeMax;
1202 while( cluster.
iymax > iyRangeMax ){
1203 cluster.
iymax -= iyRangeMax;
1206 if( cluster.
x < xValues.front() ) {
1207 cluster.
x += 2 * maxDistanceX;
1209 if( cluster.
x > xValues.back() ) {
1210 cluster.
x -= 2 * maxDistanceX;
1212 if( cluster.
y < yValues.front() ) {
1213 cluster.
y += 2 * maxDistanceY;
1215 if( cluster.
y > yValues.back() ) {
1216 cluster.
y -= 2 * maxDistanceY;
1228 std::vector<binContainer*> emptyVector;
1229 for(
int iy = 0; iy <= iymax + 1; ++iy) {
1231 emptyVector.push_back(emptyPointer);
1233 std::vector<std::vector<binContainer*> > binMap;
1234 for(
int ix = 0; ix <= ixmax + 1; ++ix) {
1235 binMap.push_back(emptyVector);
1242 for (std::vector<binContainer>::iterator it =
bins.begin(); it !=
bins.end(); ++it) {
1243 binMap[it->ix][it->iy] = &(*it);
1245 binMap[it->ix][iymax+1] = &(*it);
1247 else if(it->iy == iymax){
1248 binMap[it->ix][0] = &(*it);
1256 for (std::vector<binContainer>::iterator it =
bins.begin(); it !=
bins.end(); ++it) {
1257 binMap[it->ix][it->iy] = &(*it);
1259 binMap[ixmax+1][it->iy] = &(*it);
1261 else if(it->ix == ixmax){
1262 binMap[0][it->iy] = &(*it);
1270 for (std::vector<binContainer>::iterator it =
bins.begin(); it !=
bins.end(); ++it) {
1271 binMap[it->ix][it->iy] = &(*it);
1273 binMap[ixmax+1][it->iy] = &(*it);
1275 binMap[ixmax+1][iymax+1] = &(*it);
1277 if(it->iy == iymax){
1278 binMap[ixmax+1][0] = &(*it);
1281 else if(it->ix == ixmax){
1282 binMap[0][it->iy] = &(*it);
1284 binMap[0][iymax+1] = &(*it);
1286 if(it->iy == iymax){
1287 binMap[0][0] = &(*it);
1291 binMap[it->ix][iymax+1] = &(*it);
1293 else if(it->iy == iymax){
1294 binMap[it->ix][0] = &(*it);
1302 for (std::vector<binContainer>::iterator it =
bins.begin(); it !=
bins.end(); ++it) {
1303 binMap[it->ix][it->iy] = &(*it);
1315 if(baseStatus == dqm_core::Result::Red) {
1316 return dqm_core::Result::Red;
1323 if( weight <= 0.25 ) {
1324 if( addedStatus == dqm_core::Result::Yellow ) {
1325 addedStatus = dqm_core::Result::Green;
1328 if( weight <= 0.5 ) {
1329 if( addedStatus == dqm_core::Result::Red) {
1330 addedStatus = dqm_core::Result::Yellow;
1334 if(addedStatus == dqm_core::Result::Red) {
1335 return dqm_core::Result::Red;
1338 if(baseStatus == dqm_core::Result::Disabled) {
1341 if(addedStatus == dqm_core::Result::Disabled) {
1344 if(baseStatus == dqm_core::Result::Undefined) {
1347 if(addedStatus == dqm_core::Result::Undefined) {
1351 if( (baseStatus == dqm_core::Result::Green) && (addedStatus == dqm_core::Result::Green) ) {
1352 return dqm_core::Result::Green;
1355 return dqm_core::Result::Yellow;
1402 std::vector<double>::const_iterator iter_vals = inputval.begin();
1403 std::vector<double>::const_iterator iter_err = inputerr.begin();
1405 std::vector<double>::const_iterator iter_x0 = x0.begin();
1406 std::vector<double>::const_iterator iter_x0err = x0err.begin();
1409 for ( ; iter_vals != inputval.end(); ++iter_vals,++iter_err,++iter_x0,++iter_x0err){
1410 if (fabs(*iter_err) > 1.0e-5 || fabs(*iter_x0err) > 1.0e-5){
1411 double chisq_cont = pow(((*iter_vals)-(*iter_x0)),2.)/(pow(*iter_err,2.0)+pow(*iter_x0err,2.0));
1413 chisq += chisq_cont;
1417 double prob = ROOT::Math::chisquared_cdf_c(chisq,ndf);
1418 double sigma_chisq = ROOT::Math::normal_quantile_c(prob,1.);
1419 return std::make_pair(prob,sigma_chisq);
1448 if(strips.size() < 2) {
1452 std::vector<std::vector<tools::binContainer> >
::iterator begining = strips.
begin();
1453 std::vector<std::vector<tools::binContainer> >
::iterator ending = strips.
end();
1456 while ( begining != ending ) {
1457 std::vector<std::vector<tools::binContainer> >
::iterator minBinsItr = begining;
1458 for( std::vector<std::vector<tools::binContainer> >
::iterator itr = begining; itr != (ending+1); ++itr ) {
1459 if( (!itr->empty()) && ((itr->size() < minBinsItr->size()) || minBinsItr->empty()) ) {
1464 if( ((
int)minBinsItr->size()) < minStat ) {
1465 if( minBinsItr == begining ) {
1467 std::vector<std::vector<tools::binContainer> >
::iterator mergeStripItr = minBinsItr;
1469 while( mergeStripItr->empty() ) {
1471 if( mergeStripItr == ending )
break;
1473 mergeStripItr->insert( mergeStripItr->end(), minBinsItr->begin(), minBinsItr->end() );
1474 minBinsItr->clear();
1475 begining = mergeStripItr;
1477 else if( minBinsItr == ending ) {
1479 std::vector<std::vector<tools::binContainer> >
::iterator mergeStripItr = minBinsItr;
1481 while( mergeStripItr->empty() ) {
1483 if( mergeStripItr == begining )
break;
1485 mergeStripItr->insert( mergeStripItr->end(), minBinsItr->begin(), minBinsItr->end() );
1486 minBinsItr->clear();
1487 ending = mergeStripItr;
1491 std::vector<std::vector<tools::binContainer> >
::iterator mergeLeftItr = minBinsItr;
1492 std::vector<std::vector<tools::binContainer> >
::iterator mergeRightItr = minBinsItr;
1495 while( mergeLeftItr->empty() && mergeRightItr->empty() ) {
1499 if( mergeLeftItr->empty() ) {
1500 mergeRightItr->insert( mergeRightItr->end(), minBinsItr->begin(), minBinsItr->end() );
1501 minBinsItr->clear();
1503 else if( mergeRightItr->empty() ) {
1504 mergeLeftItr->insert( mergeLeftItr->end(), minBinsItr->begin(), minBinsItr->end() );
1505 minBinsItr->clear();
1508 if( mergeLeftItr->size() < mergeRightItr->size() ) {
1509 mergeLeftItr->insert( mergeLeftItr->end(), minBinsItr->begin(), minBinsItr->end() );
1510 minBinsItr->clear();
1513 mergeRightItr->insert( mergeRightItr->end(), minBinsItr->begin(), minBinsItr->end() );
1514 minBinsItr->clear();