26 BinData::BinData(
unsigned int maxpoints,
unsigned int dim,
28 FitData( maxpoints, dim ),
31 fDataErrorPtr( nullptr ), fDataErrorHighPtr( nullptr ), fDataErrorLowPtr( nullptr ),
32 fpTmpCoordErrorVector( nullptr ), fpTmpBinEdgeVector( nullptr )
42 BinData::BinData (
const DataOptions & opt,
unsigned int maxpoints,
43 unsigned int dim, ErrorType err ) :
44 FitData( opt, maxpoints, dim ),
47 fDataErrorPtr( nullptr ), fDataErrorHighPtr( nullptr ), fDataErrorLowPtr( nullptr ),
48 fpTmpCoordErrorVector( nullptr ), fpTmpBinEdgeVector( nullptr )
58 BinData::BinData (
const DataOptions & opt,
const DataRange & range,
59 unsigned int maxpoints,
unsigned int dim, ErrorType err ) :
60 FitData( opt, range, maxpoints, dim ),
63 fDataErrorPtr( nullptr ), fDataErrorHighPtr( nullptr ), fDataErrorLowPtr( nullptr ),
64 fpTmpCoordErrorVector( nullptr ), fpTmpBinEdgeVector( nullptr )
75 BinData::BinData (
unsigned int n,
const double * dataX,
const double * val,
76 const double * ex ,
const double * eval ) :
79 fDataErrorPtr( nullptr ), fDataErrorHighPtr( nullptr ), fDataErrorLowPtr( nullptr ),
80 fpTmpCoordErrorVector( nullptr ), fpTmpBinEdgeVector( nullptr )
85 if (
nullptr != eval )
89 fErrorType = kValueError;
93 fCoordErrorsPtr.resize( 1 );
95 fCoordErrorsPtr[0] = ex;
97 fErrorType = kCoordError;
102 fErrorType = kNoError;
105 fpTmpCoordErrorVector =
new double [ fDim ];
113 BinData::BinData(
unsigned int n,
const double * dataX,
const double * dataY,
114 const double * val,
const double * ex ,
const double * ey,
115 const double * eval ) :
116 FitData( n, dataX, dataY ),
117 fDataErrorPtr( nullptr ), fDataErrorHighPtr( nullptr ), fDataErrorLowPtr( nullptr ),
118 fpTmpCoordErrorVector( nullptr ), fpTmpBinEdgeVector( nullptr )
123 if (
nullptr != eval )
125 fDataErrorPtr = eval;
127 fErrorType = kValueError;
129 if (
nullptr != ex ||
nullptr != ey )
131 fCoordErrorsPtr.resize( 2 );
133 fCoordErrorsPtr[0] = ex;
134 fCoordErrorsPtr[1] = ey;
136 fErrorType = kCoordError;
141 fErrorType = kNoError;
144 fpTmpCoordErrorVector =
new double [ fDim ];
151 BinData::BinData(
unsigned int n,
const double * dataX,
const double * dataY,
152 const double * dataZ,
const double * val,
const double * ex ,
153 const double * ey ,
const double * ez ,
const double * eval ) :
154 FitData( n, dataX, dataY, dataZ ),
155 fDataErrorPtr( nullptr ), fDataErrorHighPtr( nullptr ), fDataErrorLowPtr( nullptr ),
156 fpTmpCoordErrorVector( nullptr ), fpTmpBinEdgeVector( nullptr )
161 if (
nullptr != eval )
163 fDataErrorPtr = eval;
165 fErrorType = kValueError;
167 if (
nullptr != ex ||
nullptr != ey ||
nullptr != ez )
169 fCoordErrorsPtr.resize( 3 );
171 fCoordErrorsPtr[0] = ex;
172 fCoordErrorsPtr[1] = ey;
173 fCoordErrorsPtr[2] = ez;
175 fErrorType = kCoordError;
180 fErrorType = kNoError;
183 fpTmpCoordErrorVector =
new double [ fDim ];
192 assert( fMaxPoints == 0 || fWrapped == fData.empty() );
194 assert( kValueError == fErrorType || kCoordError == fErrorType ||
195 kAsymError == fErrorType || kNoError == fErrorType );
196 assert( fMaxPoints == 0 || fDataError.empty() || &fDataError.front() == fDataErrorPtr );
197 assert( fMaxPoints == 0 || fDataErrorHigh.empty() || &fDataErrorHigh.front() == fDataErrorHighPtr );
198 assert( fMaxPoints == 0 || fDataErrorLow.empty() || &fDataErrorLow.front() == fDataErrorLowPtr );
199 assert( fMaxPoints == 0 || fDataErrorLow.empty() == fDataErrorHigh.empty() );
200 assert( fMaxPoints == 0 || fData.empty() || &fData.front() == fDataPtr );
202 for (
unsigned int i=0; i < fDim; i++ )
204 assert( fCoordErrors.empty() || &fCoordErrors[i].front() == fCoordErrorsPtr[i] );
207 if ( fpTmpBinEdgeVector )
209 delete[] fpTmpBinEdgeVector;
210 fpTmpBinEdgeVector=
nullptr;
213 if ( fpTmpCoordErrorVector )
215 delete[] fpTmpCoordErrorVector;
216 fpTmpCoordErrorVector =
nullptr;
223 BinData::BinData (
const BinData & rhs) :
229 BinData & BinData::operator= (
const BinData & rhs )
231 FitData::operator=( rhs );
233 if ( fpTmpBinEdgeVector )
235 assert( Opt().fIntegral );
237 delete[] fpTmpBinEdgeVector;
238 fpTmpBinEdgeVector=
nullptr;
241 if ( fpTmpCoordErrorVector )
243 delete[] fpTmpCoordErrorVector;
244 fpTmpCoordErrorVector =
nullptr;
248 fDataErrorPtr= fDataErrorHighPtr= fDataErrorLowPtr=
nullptr;
250 fErrorType = rhs.fErrorType;
251 fRefVolume = rhs.fRefVolume;
252 fBinEdge = rhs.fBinEdge;
257 fCoordErrors.clear();
259 fDataErrorHigh.clear();
260 fDataErrorLow.clear();
262 fDataPtr = rhs.fDataPtr;
263 fCoordErrorsPtr = rhs.fCoordErrorsPtr;
264 fDataErrorPtr = rhs.fDataErrorPtr;
265 fDataErrorHighPtr = rhs.fDataErrorHighPtr;
266 fDataErrorLowPtr = rhs.fDataErrorLowPtr;
272 if ( !fData.empty() )
273 fDataPtr = &fData.front();
275 fCoordErrors = rhs.fCoordErrors;
276 fDataError = rhs.fDataError;
277 fDataErrorHigh = rhs.fDataErrorHigh;
278 fDataErrorLow = rhs.fDataErrorLow;
280 if( ! fCoordErrors.empty() )
282 assert( kCoordError == fErrorType || kAsymError == fErrorType );
283 fCoordErrorsPtr.resize( fDim );
285 for (
unsigned int i=0; i<fDim; i++ )
287 fCoordErrorsPtr[i] = fCoordErrors[i].empty() ?
nullptr : &fCoordErrors[i].front();
291 fDataError = rhs.fDataError;
292 fDataErrorHigh = rhs.fDataErrorHigh;
293 fDataErrorLow = rhs.fDataErrorLow;
295 assert( fDataErrorLow.empty() == fDataErrorHigh.empty() );
296 assert( fDataErrorLow.empty() != fDataError.empty() || kNoError == fErrorType );
298 if ( !fDataError.empty() )
300 assert( kValueError == fErrorType || kCoordError == fErrorType );
301 fDataErrorPtr = &fDataError.front();
303 else if ( !fDataErrorHigh.empty() && !fDataErrorLow.empty() )
305 assert( kAsymError == fErrorType );
306 fDataErrorHighPtr = &fDataErrorHigh.front();
307 fDataErrorLowPtr = &fDataErrorLow.front();
311 fpTmpCoordErrorVector=
new double[ fDim ];
313 if ( Opt().fIntegral )
314 fpTmpBinEdgeVector =
new double[ fDim ];
328 void BinData::Append(
unsigned int newPoints,
unsigned int dim , ErrorType err )
331 assert( fMaxPoints == 0 || fWrapped == fData.empty() );
333 assert( kValueError == fErrorType || kCoordError == fErrorType ||
334 kAsymError == fErrorType || kNoError == fErrorType );
335 assert( fMaxPoints == 0 || fDataError.empty() || &fDataError.front() == fDataErrorPtr );
336 assert( fMaxPoints == 0 || fDataErrorHigh.empty() || &fDataErrorHigh.front() == fDataErrorHighPtr );
337 assert( fMaxPoints == 0 || fDataErrorLow.empty() || &fDataErrorLow.front() == fDataErrorLowPtr );
338 assert( fMaxPoints == 0 || fDataErrorLow.empty() == fDataErrorHigh.empty() );
339 assert( fMaxPoints == 0 || fData.empty() || &fData.front() == fDataPtr );
341 FitData::Append( newPoints, dim );
349 void BinData::Initialize(
unsigned int newPoints,
unsigned int dim, ErrorType err )
351 Append( newPoints, dim, err );
363 BinData & BinData::LogTransform()
371 if ( kNoError == fErrorType )
373 fDataError.resize(fNPoints + FitData::VectorPadding(fNPoints));
374 fDataErrorPtr = fDataError.empty() ?
nullptr : &fDataError.front();
377 for (
unsigned int i=0; i < fNPoints; i++ )
379 double val = fData[i];
383 MATH_ERROR_MSG(
"BinData::TransformLog",
"Some points have negative values - cannot apply a log transformation");
387 fData[i] = std::log( val );
389 if( kNoError == fErrorType )
393 else if ( kValueError == fErrorType )
397 else if ( kCoordError == fErrorType )
401 else if ( kAsymError == fErrorType )
403 fDataErrorHigh[i]/= val;
404 fDataErrorLow[i]/= val;
410 if ( kNoError == fErrorType )
412 fErrorType = kValueError;
422 void BinData::Add(
double x,
double y )
424 assert( kNoError == fErrorType );
426 assert( !fData.empty() && fDataPtr );
427 assert( fDataErrorHigh.empty() && !fDataErrorHighPtr );
428 assert( fDataErrorLow.empty() && !fDataErrorLowPtr );
429 assert( fDataError.empty() && !fDataErrorPtr );
430 assert( fCoordErrors.empty() && fCoordErrorsPtr.empty() );
432 fData[ fNPoints ] = y;
442 void BinData::Add(
double x,
double y,
double ey )
444 assert( kValueError == fErrorType );
445 assert( !fData.empty() && fDataPtr );
446 assert( fDataErrorHigh.empty() && !fDataErrorHighPtr );
447 assert( fDataErrorLow.empty() && !fDataErrorLowPtr );
448 assert( !fDataError.empty() && fDataErrorPtr );
449 assert( fCoordErrors.empty() && fCoordErrorsPtr.empty() );
451 fData[ fNPoints ] = y;
452 fDataError[ fNPoints ] = (ey != 0.0) ? 1.0/ey : 0.0;
456 if (y != 0 || ey != 1.0) fSumError2 += ey*ey;
459 if (y != 0 && std::abs( ey*ey/y - 1.0) > 1.E-12) fIsWeighted =
true;
466 void BinData::Add(
double x,
double y,
double ex,
double ey )
468 assert( kCoordError == fErrorType );
469 assert( !fData.empty() && fDataPtr );
470 assert( !fDataError.empty() && fDataErrorPtr );
471 assert( fDataErrorHigh.empty() && !fDataErrorHighPtr );
472 assert( fDataErrorLow.empty() && !fDataErrorLowPtr );
473 assert( !fCoordErrors.empty() && fCoordErrors.size() == 1 );
474 assert( !fCoordErrorsPtr.empty() && fCoordErrorsPtr.size() == 1 && fCoordErrorsPtr[0] );
475 assert( &fCoordErrors[0].front() == fCoordErrorsPtr[0] );
477 fData[ fNPoints ] = y;
478 fCoordErrors[0][ fNPoints ] = ex;
479 fDataError[ fNPoints ] = ey;
483 if (y != 0 || ey != 1.0) fSumError2 += ey*ey;
486 if (y != 0 && std::abs( ey*ey/y - 1.0) > 1.E-12) fIsWeighted =
true;
493 void BinData::Add(
double x,
double y,
double ex,
double eyl,
double eyh )
495 assert( kAsymError == fErrorType );
496 assert( !fData.empty() && fDataPtr );
497 assert( !fDataErrorHigh.empty() && fDataErrorHighPtr );
498 assert( !fDataErrorLow.empty() && fDataErrorLowPtr );
499 assert( fDataError.empty() && !fDataErrorPtr );
500 assert( !fCoordErrors.empty() && fCoordErrors.size() == 1 );
501 assert( !fCoordErrorsPtr.empty() && fCoordErrorsPtr.size() == 1 && fCoordErrorsPtr[0] );
502 assert( &fCoordErrors[0].front() == fCoordErrorsPtr[0] );
504 fData[ fNPoints ] = y;
505 fCoordErrors[0][ fNPoints ] = ex;
506 fDataErrorHigh[ fNPoints ] = eyh;
507 fDataErrorLow[ fNPoints ] = eyl;
511 if (y != 0 || eyl != 1.0 || eyh != 1.0) fSumError2 += (eyl+eyh)*(eyl+eyh)/4;
518 void BinData::Add(
const double* x,
double val )
520 assert( kNoError == fErrorType );
522 assert( !fData.empty() && fDataPtr );
523 assert( fDataErrorHigh.empty() && !fDataErrorHighPtr );
524 assert( fDataErrorLow.empty() && !fDataErrorLowPtr );
525 assert( fDataError.empty() && !fDataErrorPtr );
526 assert( fCoordErrors.empty() && fCoordErrorsPtr.empty() );
528 fData[ fNPoints ] = val;
538 void BinData::Add(
const double* x,
double val,
double eval )
540 assert( kValueError == fErrorType );
541 assert( !fData.empty() && fDataPtr );
542 assert( fDataErrorHigh.empty() && !fDataErrorHighPtr );
543 assert( fDataErrorLow.empty() && !fDataErrorLowPtr );
544 assert( !fDataError.empty() && fDataErrorPtr );
545 assert( fCoordErrors.empty() && fCoordErrorsPtr.empty() );
547 fData[ fNPoints ] = val;
548 fDataError[ fNPoints ] = (eval != 0.0) ? 1.0/eval : 0.0;
552 if (val != 0 || eval != 1.0) fSumError2 += eval*eval;
554 if (val != 0 && std::abs( eval*eval/val - 1.0) > 1.E-12) fIsWeighted =
true;
560 void BinData::Add(
const double* x,
double val,
const double* ex,
double eval )
562 assert( kCoordError == fErrorType );
563 assert( !fData.empty() && fDataPtr );
564 assert( !fDataError.empty() && fDataErrorPtr );
565 assert( fDataErrorHigh.empty() && !fDataErrorHighPtr );
566 assert( fDataErrorLow.empty() && !fDataErrorLowPtr );
567 assert( fCoordErrors.size() == fDim );
568 assert( fCoordErrorsPtr.size() == fDim );
570 fData[ fNPoints ] = val;
572 for(
unsigned int i=0; i<fDim; i++ )
574 assert( &fCoordErrors[i].front() == fCoordErrorsPtr[i] );
576 fCoordErrors[i][ fNPoints ] = ex[i];
579 fDataError[ fNPoints ] = eval;
583 if (val != 0 || eval != 1.0) fSumError2 += eval*eval;
585 if (val != 0 && std::abs( eval*eval/val - 1.0) > 1.E-12) fIsWeighted =
true;
591 void BinData::Add(
const double* x,
double val,
const double* ex,
double elval,
double ehval )
593 assert( kAsymError == fErrorType );
595 assert( !fData.empty() && fDataPtr );
596 assert( !fDataErrorHigh.empty() && fDataErrorHighPtr );
597 assert( !fDataErrorLow.empty() && fDataErrorLowPtr );
598 assert( fDataError.empty() && !fDataErrorPtr );
599 assert( fCoordErrors.size() == fDim );
600 assert( fCoordErrorsPtr.size() == fDim );
602 fData[ fNPoints ] = val;
604 for(
unsigned int i=0; i<fDim; i++ )
606 assert( &fCoordErrors[i].front() == fCoordErrorsPtr[i] );
608 fCoordErrors[i][ fNPoints ] = ex[i];
611 fDataErrorLow[ fNPoints ] = elval;
612 fDataErrorHigh[ fNPoints ] = ehval;
616 if (val != 0 || elval != 1.0 || ehval != 1.0 )
617 fSumError2 += (elval+ehval)*(elval+ehval)/4;
627 void BinData::AddBinUpEdge(
const double* xup )
629 if ( fBinEdge.empty() )
632 assert( fBinEdge.size() == fDim );
634 for (
unsigned int i=0; i<fDim; i++ )
636 fBinEdge[i].push_back( xup[i] );
639 assert( fNPoints == fBinEdge[i].size() );
643 const double* xlow = Coords( fNPoints-1 );
645 double binVolume = 1.0;
646 for (
unsigned int j = 0; j < fDim; j++ )
648 binVolume *= ( xup[j] - xlow[j] );
653 fRefVolume = binVolume;
654 else if ( binVolume < fRefVolume )
655 fRefVolume = binVolume;
659 void BinData::InitDataVector ()
661 fData.resize(fMaxPoints + FitData::VectorPadding(fMaxPoints));
662 fDataPtr = fData.empty() ?
nullptr : &fData.front();
665 void BinData::InitializeErrors()
667 assert( kValueError == fErrorType || kCoordError == fErrorType ||
668 kAsymError == fErrorType || kNoError == fErrorType );
670 if ( fpTmpCoordErrorVector )
672 delete[] fpTmpCoordErrorVector;
673 fpTmpCoordErrorVector =
nullptr;
676 if ( kNoError == fErrorType )
678 fCoordErrors.clear();
679 fCoordErrorsPtr.clear();
681 fDataErrorHigh.clear();
682 fDataErrorHighPtr =
nullptr;
684 fDataErrorLow.clear();
685 fDataErrorLowPtr =
nullptr;
688 fDataErrorPtr =
nullptr;
693 if ( kCoordError == fErrorType || kAsymError == fErrorType )
695 fCoordErrorsPtr.resize( fDim );
696 fCoordErrors.resize( fDim );
697 for(
unsigned int i=0; i < fDim; i++ )
699 fCoordErrors[i].resize(fMaxPoints + FitData::VectorPadding(fMaxPoints));
701 fCoordErrorsPtr[i] = fCoordErrors[i].empty() ?
nullptr : &fCoordErrors[i].front();
704 fpTmpCoordErrorVector =
new double[fDim];
708 fCoordErrors.clear();
709 fCoordErrorsPtr.clear();
712 if ( kValueError == fErrorType || kCoordError == fErrorType )
714 fDataError.resize(fMaxPoints + FitData::VectorPadding(fMaxPoints));
715 fDataErrorPtr = fDataError.empty() ?
nullptr : &fDataError.front();
717 fDataErrorHigh.clear();
718 fDataErrorHighPtr =
nullptr;
719 fDataErrorLow.clear();
720 fDataErrorLowPtr =
nullptr;
722 else if ( fErrorType == kAsymError )
724 fDataErrorHigh.resize(fMaxPoints + FitData::VectorPadding(fMaxPoints));
725 fDataErrorHighPtr = fDataErrorHigh.empty() ?
nullptr : &fDataErrorHigh.front();
727 fDataErrorLow.resize(fMaxPoints + FitData::VectorPadding(fMaxPoints));
728 fDataErrorLowPtr = fDataErrorLow.empty() ?
nullptr : &fDataErrorLow.front();
731 fDataErrorPtr =
nullptr;
739 void BinData::InitBinEdge()
741 fBinEdge.resize( fDim );
743 for(
unsigned int i=0; i<fDim; i++ )
745 fBinEdge[i].reserve(fMaxPoints + FitData::VectorPadding(fMaxPoints));
748 if ( fpTmpBinEdgeVector )
750 delete[] fpTmpBinEdgeVector;
751 fpTmpBinEdgeVector =
nullptr;
754 fpTmpBinEdgeVector =
new double[ fDim ];
757 void BinData::UnWrap( )
760 assert( kValueError == fErrorType || kCoordError == fErrorType ||
761 kAsymError == fErrorType || kNoError == fErrorType );
762 assert( fDataError.empty() || &fDataError.front() == fDataErrorPtr );
763 assert( fDataErrorHigh.empty() || &fDataErrorHigh.front() == fDataErrorHighPtr );
764 assert( fDataErrorLow.empty() || &fDataErrorLow.front() == fDataErrorLowPtr );
765 assert( fDataErrorLow.empty() == fDataErrorHigh.empty() );
767 assert( fData.empty() );
770 unsigned vectorPadding = FitData::VectorPadding(fNPoints);
771 fData.resize(fNPoints + vectorPadding);
772 std::copy( fDataPtr, fDataPtr + fNPoints, fData.begin() );
773 fDataPtr = fData.empty() ?
nullptr : &fData.front();
775 for (
unsigned int i=0; i < fDim; i++ )
777 assert( fCoordErrorsPtr[i] );
778 assert( fCoordErrors.empty() || &fCoordErrors[i].front() == fCoordErrorsPtr[i] );
781 if( kValueError == fErrorType || kCoordError == fErrorType )
783 assert( fDataError.empty() );
784 assert( fDataErrorPtr );
786 fDataError.resize(fNPoints + vectorPadding);
787 std::copy(fDataErrorPtr, fDataErrorPtr + fNPoints + vectorPadding, fDataError.begin());
788 fDataErrorPtr = fDataError.empty() ?
nullptr : &fDataError.front();
791 if ( kValueError == fErrorType )
793 for (
unsigned int i=0; i < fNPoints; i++ )
795 fDataError[i] = 1.0 / fDataError[i];
799 if ( kCoordError == fErrorType || kAsymError == fErrorType )
801 fCoordErrors.resize( fDim );
802 for(
unsigned int i=0; i < fDim; i++ )
804 assert( fCoordErrorsPtr[i] );
805 fCoordErrors[i].resize(fNPoints + vectorPadding);
806 std::copy(fCoordErrorsPtr[i], fCoordErrorsPtr[i] + fNPoints + vectorPadding, fCoordErrors[i].begin());
807 fCoordErrorsPtr[i] = fCoordErrors[i].empty() ?
nullptr : &fCoordErrors[i].front();
810 if( kAsymError == fErrorType )
812 assert( fDataErrorHigh.empty() );
813 assert( fDataErrorLow.empty() );
814 assert( fDataErrorHighPtr && fDataErrorLowPtr );
816 fDataErrorHigh.resize(fNPoints + vectorPadding);
817 fDataErrorLow.resize(fNPoints + vectorPadding);
818 std::copy(fDataErrorHighPtr, fDataErrorHighPtr + fNPoints + vectorPadding, fDataErrorHigh.begin());
819 std::copy(fDataErrorLowPtr, fDataErrorLowPtr + fNPoints + vectorPadding, fDataErrorLow.begin());
820 fDataErrorHighPtr = fDataErrorHigh.empty() ?
nullptr : &fDataErrorHigh.front();
821 fDataErrorLowPtr = fDataErrorLow.empty() ?
nullptr : &fDataErrorLow.front();
828 void BinData::ComputeSums() {
829 unsigned int n = Size();
832 if (fErrorType != kAsymError) {
833 for (
unsigned int i = 0; i < n; ++i) {
835 double err = Error(i);
837 if (y != 0 || err != 1.0) fSumError2 += err*err;
841 for (
unsigned int i = 0; i < n; ++i) {
844 double elval,ehval = 0;
845 GetAsymError(i,elval,ehval);
846 if (y != 0 || elval != 1.0 || ehval != 1.0)
847 fSumError2 += (elval+ehval)*(elval+ehval)/4;
851 fIsWeighted = (fSumContent != fSumError2);