13 #ifndef ROOT_Fit_FitData 
   14 #define ROOT_Fit_FitData 
   70          explicit FitData(
unsigned int maxpoints = 0, 
unsigned int dim = 1);
 
   73          explicit FitData(
const DataOptions &opt, 
unsigned int maxpoints = 0, 
unsigned int dim = 1);
 
   77          explicit FitData(
const DataRange &range, 
unsigned int maxpoints = 0, 
unsigned int dim = 1);
 
   80          FitData(
const DataOptions &opt, 
const DataRange &range,
 
   81                  unsigned int maxpoints = 0, 
unsigned int dim = 1);
 
   84          FitData(
unsigned int n, 
const double *dataX);
 
   87          FitData(
unsigned int n, 
const double *dataX, 
const double *dataY);
 
   90          FitData(
unsigned int n, 
const double *dataX, 
const double *dataY,
 
   98          FitData(
const DataRange &range, 
unsigned int maxpoints, 
const double *dataX);
 
  105          FitData(
const DataRange &range, 
unsigned int maxpoints, 
const double *dataX, 
const double *dataY);
 
  112          FitData(
const DataRange &range, 
unsigned int maxpoints, 
const double *dataX, 
const double *dataY,
 
  113                  const double *dataZ);
 
  122          template<
class Iterator>
 
  123          FitData(
unsigned int n, 
unsigned int dim, Iterator dataItr) :
 
  126             fNPoints(fMaxPoints),
 
  129             fpTmpCoordVector(nullptr)
 
  132             for (
unsigned int i = 0; i < fDim; i++) {
 
  133                fCoordsPtr[i] = *dataItr++;
 
  136             if (fpTmpCoordVector) {
 
  137                delete[] fpTmpCoordVector;
 
  138                fpTmpCoordVector = 
nullptr;
 
  141             fpTmpCoordVector = 
new double [fDim];
 
  149          template<
class Iterator>
 
  150          FitData(
const DataRange &range, 
unsigned int maxpoints, 
unsigned int dim, Iterator dataItr) :
 
  153             fMaxPoints(maxpoints),
 
  156             fpTmpCoordVector(nullptr)
 
  161             InitFromRange(dataItr);
 
  167          FitData(
const FitData &rhs);
 
  169          FitData &operator= (
const FitData &rhs);
 
  171          void Append(
unsigned int newPoints, 
unsigned int dim = 1);
 
  181          void InitCoordsVector()
 
  183             fCoords.resize(fDim);
 
  184             fCoordsPtr.resize(fDim);
 
  186             for (
unsigned int i = 0; i < fDim; i++) {
 
  187                fCoords[i].resize(fMaxPoints + VectorPadding(fMaxPoints));
 
  188                fCoordsPtr[i] = fCoords[i].empty() ? 
nullptr : &fCoords[i].front();
 
  191             if (fpTmpCoordVector) {
 
  192                delete[] fpTmpCoordVector;
 
  193                fpTmpCoordVector = 
nullptr;
 
  196             fpTmpCoordVector = 
new double [fDim];
 
  199          template<
class Iterator>
 
  200          void InitFromRange(Iterator dataItr)
 
  202             for (
unsigned int i = 0; i < fMaxPoints; i++) {
 
  203                bool isInside = 
true;
 
  204                Iterator tmpItr = dataItr;
 
  206                for (
unsigned int j = 0; j < fDim; j++)
 
  207                   isInside &= fRange.IsInside((*tmpItr++)[i], j);
 
  212                   for (
unsigned int k = 0; k < fDim; k++)
 
  213                      fpTmpCoordVector[k] = (*tmpItr++)[i];
 
  215                   Add(fpTmpCoordVector);
 
  229          const double *GetCoordComponent(
unsigned int ipoint, 
unsigned int icoord)
 const 
  231             assert(ipoint < fMaxPoints + VectorPadding(fMaxPoints));
 
  232             assert(icoord < fDim);
 
  233             assert(fCoordsPtr.size() == fDim);
 
  234             assert(fCoordsPtr[icoord]);
 
  235             assert(fCoords.empty() || &fCoords[icoord].front() == fCoordsPtr[icoord]);
 
  237             return &fCoordsPtr[icoord][ipoint];
 
  246          const double *Coords(
unsigned int ipoint)
 const 
  248             assert(fpTmpCoordVector);
 
  249             assert(ipoint < fMaxPoints + VectorPadding(fMaxPoints));
 
  251             for (
unsigned int i = 0; i < fDim; i++) {
 
  252                assert(fCoordsPtr[i]);
 
  253                assert(fCoords.empty() || &fCoords[i].front() == fCoordsPtr[i]);
 
  255                fpTmpCoordVector[i] = fCoordsPtr[i][ipoint];
 
  258             return fpTmpCoordVector;
 
  267             assert(!fCoordsPtr.empty() && fCoordsPtr.size() == 1 && fCoordsPtr[0]);
 
  269             assert(fNPoints < fMaxPoints);
 
  271             fCoords[0][ fNPoints ] = x;
 
  279          void Add(
const double *x)
 
  282             assert(!fCoordsPtr.empty() && fCoordsPtr.size() == fDim);
 
  283             assert(fNPoints < fMaxPoints);
 
  285             for (
unsigned int i = 0; i < fDim; i++) {
 
  286                fCoords[i][ fNPoints ] = x[i];
 
  295          unsigned int NPoints()
 const 
  303          unsigned int Size()
 const 
  311          unsigned int NDim()
 const 
  319          const DataOptions &Opt()
 const 
  331          const DataRange &Range()
 const 
  339          const std::vector< const double * > &GetCoordDataPtrs()
 const 
  349             assert(fCoords.empty());
 
  351             fCoords.resize(fDim);
 
  352             for (
unsigned int i = 0; i < fDim; i++) {
 
  353                assert(fCoordsPtr[i]);
 
  354                unsigned padding = VectorPadding(fNPoints);
 
  355                fCoords[i].resize(fNPoints + padding);
 
  356                std::copy(fCoordsPtr[i], fCoordsPtr[i] + fNPoints + padding, fCoords[i].begin());
 
  357                fCoordsPtr[i] = fCoords[i].empty() ? 
nullptr : &fCoords[i].front();
 
  363 #ifdef R__HAS_VECCORE 
  368          static unsigned VectorPadding(
unsigned dataSize)
 
  370             unsigned padding = 0;
 
  371             unsigned modP = (dataSize) % vecCore::VectorSize<ROOT::Double_v>();
 
  373                padding = vecCore::VectorSize<ROOT::Double_v>() - modP;
 
  382          static constexpr 
unsigned VectorPadding(
const unsigned) { 
return 0; }
 
  390          DataOptions   fOptions;
 
  394          unsigned int  fMaxPoints;
 
  395          unsigned int  fNPoints;
 
  413          std::vector< std::vector< double > > fCoords;
 
  414          std::vector< const double * > fCoordsPtr;
 
  416          double *fpTmpCoordVector;