41 int32_t
n[2] = {nKnotsU, nKnotsV};
43 for (int32_t uv = 0; uv < 2; ++uv) {
44 if (
n[uv] < mMaxNKnots[uv]) {
45 n[uv] = mMaxNKnots[uv];
56 mMaxNKnots[0] = nKnotsU;
57 mMaxNKnots[1] = nKnotsV;
59 for (int32_t uv = 0; uv < 2; ++uv) {
60 if (mMaxNKnots[uv] < 5) {
71 mRasterData.resize(mRaster.getNumberOfKnots() * 3);
73 for (int32_t
i = 0;
i < mRaster.getNumberOfKnots(); ++
i) {
74 float u = 0,
v = 0, fx = 0, fy = 0, fz = 0;
75 mRaster.getKnotUV(
i, u,
v);
77 mRasterData[3 *
i + 0] = fx;
78 mRasterData[3 *
i + 1] = fy;
79 mRasterData[3 *
i + 2] = fz;
82 mRaster.correctEdges(mRasterData.data());
85 for (int32_t uv = 0; uv < 2; ++uv) {
88 double du = 1. / (mMaxNKnots[uv] - 1);
90 for (int32_t
i = 1;
i < mMaxNKnots[uv] - 1; ++
i) {
94 d.
rasterKnot = nearbyint(u * (mRaster.getGrid(uv).getNumberOfKnots() - 1));
99 if (d.
rasterKnot >= mRaster.getGrid(uv).getNumberOfKnots() - 1) {
102 mKnots[uv].push_back(d);
107 createCurrentSpline();
110void IrregularSpline2D3DCalibrator::createCurrentSpline()
112 createSpline(mSpline, mSplineData);
115void IrregularSpline2D3DCalibrator::createActionSpline()
117 createSpline(mActionSpline, mActionSplineData);
120void IrregularSpline2D3DCalibrator::createSpline(IrregularSpline2D3D& sp, std::vector<float>&
data)
124 for (int32_t uv = 0; uv < 2; ++uv) {
125 mTemp[uv].reserve(mMaxNKnots[uv]);
127 mTemp[uv].push_back(0.f);
128 for (std::list<KnotData>::iterator
i = mKnots[uv].begin();
i != mKnots[uv].end(); ++
i) {
130 mTemp[uv].push_back(mRaster.getGrid(uv).getKnot(
i->rasterKnot).
u);
132 mTemp[uv].push_back(1.f);
135 sp.construct(mTemp[0].
size(), mTemp[0].
data(), mRaster.getGrid(0).getNumberOfKnots(),
136 mTemp[1].size(), mTemp[1].data(), mRaster.getGrid(1).getNumberOfKnots());
138 data.resize(sp.getNumberOfKnots() * 3);
139 for (int32_t
i = 0;
i < sp.getNumberOfKnots(); ++
i) {
140 float u = 0,
v = 0, fx = 0, fy = 0, fz = 0;
141 sp.getKnotUV(
i, u,
v);
142 mRaster.getSplineVec(mRasterData.data(), u,
v, fx, fy, fz);
143 data[3 *
i + 0] = fx;
144 data[3 *
i + 1] = fy;
145 data[3 *
i + 2] = fz;
147 sp.correctEdges(
data.data());
150IrregularSpline2D3DCalibrator::Action IrregularSpline2D3DCalibrator::checkActionShift(std::list<KnotData>::iterator& knot)
156 ret.cost = mMaxDeviation + 1.e10;
159 int32_t uv = knot->uv;
163 if (knot->rasterKnot < mRaster.getGrid(uv).getNumberOfKnots() - 2) {
165 std::list<KnotData>::iterator next = knot;
167 if (next != mKnots[uv].
end()) {
168 if (next->rasterKnot <= knot->rasterKnot + 1) {
176 if (knot->rasterKnot > 1) {
178 std::list<KnotData>::iterator prev = knot;
179 if (prev != mKnots[uv].
begin()) {
181 if (prev->rasterKnot >= knot->rasterKnot - 1) {
187 if (!isSpaceUp && !isSpaceDn) {
192 int32_t regionKnotFirst = knot->rasterKnot;
193 int32_t regionKnotLast = knot->rasterKnot;
194 getRegionOfInfluence(knot, regionKnotFirst, regionKnotLast);
198 double costCurrent = getIntegralDeviationArea(mSpline, mSplineData, uv, regionKnotFirst, regionKnotLast);
204 createActionSpline();
207 ret.cost = getIntegralDeviationArea(mActionSpline, mActionSplineData, uv, regionKnotFirst, regionKnotLast) - costCurrent;
212 createActionSpline();
214 double costDn = getIntegralDeviationArea(mActionSpline, mActionSplineData, uv, regionKnotFirst, regionKnotLast) - costCurrent;
215 if (costDn < ret.cost) {
225IrregularSpline2D3DCalibrator::Action IrregularSpline2D3DCalibrator::checkActionRemove(std::list<KnotData>::iterator& knot)
231 ret.cost = mMaxDeviation + 1.e10;
234 int32_t uv = knot->uv;
236 if (mSpline.getGrid(uv).getNumberOfKnots() <= 5) {
241 int32_t regionKnotFirst = knot->rasterKnot;
242 int32_t regionKnotLast = knot->rasterKnot;
244 getRegionOfInfluence(knot, regionKnotFirst, regionKnotLast);
248 KnotData tmp = *knot;
249 std::list<KnotData>::iterator next = mKnots[uv].erase(knot);
250 createActionSpline();
251 knot = mKnots[uv].insert(next, tmp);
256 ret.cost = getMaxDeviationArea(mActionSpline, mActionSplineData, uv, regionKnotFirst, regionKnotLast);
262void IrregularSpline2D3DCalibrator::getRegionOfInfluence(std::list<KnotData>::iterator knot, int32_t& regionKnotFirst, int32_t& regionKnotLast)
const
264 int32_t uv = knot->uv;
265 regionKnotFirst = knot->rasterKnot;
266 regionKnotLast = knot->rasterKnot;
267 std::list<KnotData>::iterator next = knot;
268 std::list<KnotData>::iterator prev = knot;
269 for (int32_t
i = 0;
i < 3; ++
i) {
270 if (prev != mKnots[uv].
begin()) {
272 regionKnotFirst = prev->rasterKnot;
277 if (next != mKnots[uv].
end()) {
279 if (next != mKnots[uv].
end()) {
280 regionKnotLast = next->rasterKnot;
282 regionKnotLast = mRaster.getGrid(uv).getNumberOfKnots() - 1;
296 bestAction.
cost = 1.e10;
298 for (int32_t uv = 0; uv < 2; ++uv) {
299 for (std::list<KnotData>::iterator
i = mKnots[uv].begin();
i != mKnots[uv].end(); ++
i) {
301 if (
a.cost < bestAction.
cost) {
308 if (bestAction.
cost < 0) {
311 bestAction.
iter->rasterKnot++;
314 bestAction.
iter->rasterKnot--;
316 std::cerr <<
"Internal error!!!";
319 createCurrentSpline();
327 bestAction.
cost = mMaxDeviation + 1.e10;
329 for (int32_t uv = 0; uv < 2; ++uv) {
331 for (std::list<KnotData>::iterator
i = mKnots[uv].begin();
i != mKnots[uv].end(); ++
i) {
333 if (
a.cost < bestAction.
cost) {
338 bestAction.
cost = sqrt(bestAction.
cost / 3.);
342 if (bestAction.
cost <= mMaxDeviation) {
345 mKnots[bestAction.
iter->uv].erase(bestAction.
iter);
347 LOG(info) <<
"Internal error!!!";
350 createCurrentSpline();
358 std::function<
void(
float,
float,
float&,
float&,
float&)> F)
366 createCurrentSpline();
368 std::unique_ptr<float[]> tmp(
new float[mSpline.getNumberOfKnots()]);
369 for (int32_t
i = 0;
i < mSpline.getNumberOfKnots(); ++
i) {
370 tmp[
i] = mSplineData[
i];
375double IrregularSpline2D3DCalibrator::getMaxDeviationLine(
const IrregularSpline2D3D& spline,
const std::vector<float>&
data, int32_t axis0, int32_t knot0)
const
377 int32_t axis1 = (axis0 == 0) ? 1 : 0;
379 u[axis0] = mRaster.getGrid(axis0).getKnot(knot0).
u;
383 for (int32_t knot1 = 0; knot1 < mRaster.getGrid(axis1).getNumberOfKnots(); ++knot1) {
384 u[axis1] = mRaster.getGrid(axis1).getKnot(knot1).
u;
385 float fx0, fy0, fz0, fx, fy, fz;
386 mRaster.getSplineVec(mRasterData.data(), u[0], u[1], fx0, fy0, fz0);
387 spline.getSplineVec(
data.data(), u[0], u[1], fx, fy, fz);
388 double dx = fx - fx0;
389 double dy = fy - fy0;
390 double dz = fz - fz0;
391 double d2 = dx * dx + dy * dy + dz * dz;
399double IrregularSpline2D3DCalibrator::getMaxDeviationArea(
const IrregularSpline2D3D& spline,
const std::vector<float>&
data,
400 int32_t axis, int32_t knotFirst, int32_t knotLast)
const
403 for (int32_t knot = knotFirst; knot <= knotLast; ++knot) {
404 double d = getMaxDeviationLine(spline,
data, axis, knot);
412double IrregularSpline2D3DCalibrator::getIntegralDeviationLine(
const IrregularSpline2D3D& spline,
const std::vector<float>&
data, int32_t axis0, int32_t knot0)
const
414 int32_t axis1 = (axis0 == 0) ? 1 : 0;
416 u[axis0] = mRaster.getGrid(axis0).getKnot(knot0).
u;
420 for (int32_t knot1 = 0; knot1 < mRaster.getGrid(axis1).getNumberOfKnots(); ++knot1) {
421 u[axis1] = mRaster.getGrid(axis1).getKnot(knot1).
u;
422 float fx0, fy0, fz0, fx, fy, fz;
423 mRaster.getSplineVec(mRasterData.data(), u[0], u[1], fx0, fy0, fz0);
424 spline.getSplineVec(
data.data(), u[0], u[1], fx, fy, fz);
425 double dx = fx - fx0;
426 double dy = fy - fy0;
427 double dz = fz - fz0;
428 double d2 = dx * dx + dy * dy + dz * dz;
429 sum += sqrt(d2 / 3.);
435double IrregularSpline2D3DCalibrator::getIntegralDeviationArea(
const IrregularSpline2D3D& spline,
const std::vector<float>&
data,
436 int32_t axis, int32_t knotFirst, int32_t knotLast)
const
439 for (int32_t knot = knotFirst; knot <= knotLast; ++knot) {
440 sum += getIntegralDeviationLine(spline,
data, axis, knot);
Definition of IrregularSpline2D3DCalibrator class.
Definition of IrregularSpline2D3D class.
std::unique_ptr< float[]> calibrateSpline(IrregularSpline2D3D &spline_uv, std::function< void(float, float, float &, float &, float &)> F)
void startCalibration(std::function< void(float, float, float &, float &, float &)> F)
void setMaxNKnots(int32_t nKnotsU, int32_t nKnotsV)
set maximal size of the spline grid
IrregularSpline2D3DCalibrator()
_____________ Constructors / destructors __________________________
void setRasterSize(int32_t nKnotsU, int32_t nKnotsV)
set size of the raster grid
void cloneFromObject(const IrregularSpline2D3D &obj, char *newFlatBufferPtr)
Construction interface.
void constructRegular(int32_t numberOfKnotsU, int32_t numberOfKnotsV)
Constructor for a regular spline.
float sum(float s, o2::dcs::DataPointValue v)
GLboolean GLboolean GLboolean GLboolean a
Enum< T >::Iterator begin(Enum< T >)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
define the action to be done by the writer
std::list< KnotData >::iterator iter
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"