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;