@@ -146,7 +146,6 @@ void TPCFastSpaceChargeCorrectionHelper::fillSpaceChargeCorrectionFromMap(TPCFas
146146 int nDataPoints = data.size ();
147147 auto & info = correction.getSliceRowInfo (slice, row);
148148 info.resetMaxValues ();
149- info.resetMaxValuesInv ();
150149 if (nDataPoints >= 4 ) {
151150 std::vector<double > pointSU (nDataPoints);
152151 std::vector<double > pointSV (nDataPoints);
@@ -160,7 +159,6 @@ void TPCFastSpaceChargeCorrectionHelper::fillSpaceChargeCorrectionFromMap(TPCFas
160159 pointCorr[3 * i + 1 ] = du;
161160 pointCorr[3 * i + 2 ] = dv;
162161 info.updateMaxValues (20 . * dx, 20 . * du, 20 . * dv);
163- info.updateMaxValuesInv (-20 . * dx, -20 . * du, -20 . * dv);
164162 }
165163 helper.approximateDataPoints (spline, splineParameters, 0 ., spline.getGridX1 ().getUmax (), 0 ., spline.getGridX2 ().getUmax (), &pointSU[0 ],
166164 &pointSV[0 ], &pointCorr[0 ], nDataPoints);
@@ -908,46 +906,60 @@ void TPCFastSpaceChargeCorrectionHelper::initInverse(std::vector<o2::gpu::TPCFas
908906
909907 for (int slice = 0 ; slice < mGeo .getNumberOfSlices (); slice++) {
910908 // LOG(info) << "inverse transform for slice " << slice ;
911- double vLength = (slice < mGeo .getNumberOfSlicesA ()) ? mGeo .getTPCzLengthA () : mGeo .getTPCzLengthC ();
912909
913910 auto myThread = [&](int iThread) {
914911 Spline2DHelper<float > helper;
915912 std::vector<float > splineParameters;
916- ChebyshevFit1D chebFitterX, chebFitterU, chebFitterV;
917913
918914 for (int row = iThread; row < mGeo .getNumberOfRows (); row += mNthreads ) {
919915 TPCFastSpaceChargeCorrection::SplineType spline = correction.getSpline (slice, row);
920916 helper.setSpline (spline, 10 , 10 );
921- std::vector<double > dataPointCU, dataPointCV, dataPointF;
922-
923- float u0, u1, v0, v1;
924- mGeo .convScaledUVtoUV (slice, row, 0 ., 0 ., u0, v0);
925- mGeo .convScaledUVtoUV (slice, row, 1 ., 1 ., u1, v1);
926917
927918 double x = mGeo .getRowInfo (row).x ;
928- int nPointsU = (spline.getGridX1 ().getNumberOfKnots () - 1 ) * 10 ;
929- int nPointsV = (spline.getGridX2 ().getNumberOfKnots () - 1 ) * 10 ;
930-
931- double stepU = (u1 - u0) / (nPointsU - 1 );
932- double stepV = (v1 - v0) / (nPointsV - 1 );
919+ auto & sliceRowInfo = correction.getSliceRowInfo (slice, row);
933920
934- if (prn) {
935- LOG (info) << " u0 " << u0 << " u1 " << u1 << " v0 " << v0 << " v1 " << v1;
921+ std::vector<double > gridU;
922+ {
923+ const auto & grid = spline.getGridX1 ();
924+ for (int i = 0 ; i < grid.getNumberOfKnots (); i++) {
925+ if (i == grid.getNumberOfKnots () - 1 ) {
926+ gridU.push_back (grid.getKnot (i).u );
927+ break ;
928+ }
929+ for (double s = 1 .; s > 0 .; s -= 0.1 ) {
930+ gridU.push_back (s * grid.getKnot (i).u + (1 . - s) * grid.getKnot (i + 1 ).u );
931+ }
932+ }
933+ }
934+ std::vector<double > gridV;
935+ {
936+ const auto & grid = spline.getGridX2 ();
937+ for (int i = 0 ; i < grid.getNumberOfKnots (); i++) {
938+ if (i == grid.getNumberOfKnots () - 1 ) {
939+ gridV.push_back (grid.getKnot (i).u );
940+ break ;
941+ }
942+ for (double s = 1 .; s > 0 .; s -= 0.1 ) {
943+ gridV.push_back (s * grid.getKnot (i).u + (1 . - s) * grid.getKnot (i + 1 ).u );
944+ }
945+ }
936946 }
937- TPCFastSpaceChargeCorrection::RowActiveArea& area = correction.getSliceRowInfo (slice, row).activeArea ;
947+
948+ std::vector<double > dataPointCU, dataPointCV, dataPointF;
949+ dataPointCU.reserve (gridU.size () * gridV.size ());
950+ dataPointCV.reserve (gridU.size () * gridV.size ());
951+ dataPointF.reserve (gridU.size () * gridV.size ());
952+
953+ TPCFastSpaceChargeCorrection::RowActiveArea& area = sliceRowInfo.activeArea ;
938954 area.cuMin = 1 .e10 ;
939955 area.cuMax = -1 .e10 ;
956+ double cvMin = 1 .e10 ;
940957
941- /*
942- v1 = area.vMax;
943- stepV = (v1 - v0) / (nPointsU - 1);
944- if (stepV < 1.f) {
945- stepV = 1.f;
946- }
947- */
958+ for (int iu = 0 ; iu < gridU.size (); iu++) {
959+ for (int iv = 0 ; iv < gridV.size (); iv++) {
960+ float u, v;
961+ correction.convGridToUV (slice, row, gridU[iu], gridV[iv], u, v);
948962
949- for (double u = u0; u < u1 + stepU; u += stepU) {
950- for (double v = v0; v < v1 + stepV; v += stepV) {
951963 float dx, du, dv;
952964 correction.getCorrection (slice, row, u, v, dx, du, dv);
953965 dx *= scaling[0 ];
@@ -976,39 +988,41 @@ void TPCFastSpaceChargeCorrectionHelper::initInverse(std::vector<o2::gpu::TPCFas
976988 dataPointF.push_back (dx);
977989 dataPointF.push_back (du);
978990 dataPointF.push_back (dv);
979-
980- if (prn) {
981- LOG (info) << " measurement cu " << cu << " cv " << cv << " dx " << dx << " du " << du << " dv " << dv;
982- }
983- } // v
984- } // u
991+ }
992+ }
985993
986994 if (area.cuMax - area.cuMin < 0.2 ) {
987995 area.cuMax = .1 ;
988996 area.cuMin = -.1 ;
989997 }
990- if (area.cvMax < 0.1 ) {
998+ if (area.cvMax - cvMin < 0.2 ) {
991999 area.cvMax = .1 ;
1000+ cvMin = -.1 ;
9921001 }
1002+
9931003 if (prn) {
9941004 LOG (info) << " slice " << slice << " row " << row << " max drift L = " << correction.getMaxDriftLength (slice, row)
9951005 << " active area: cuMin " << area.cuMin << " cuMax " << area.cuMax << " vMax " << area.vMax << " cvMax " << area.cvMax ;
9961006 }
9971007
998- TPCFastSpaceChargeCorrection::SliceRowInfo& info = correction.getSliceRowInfo (slice, row);
999- info.gridCorrU0 = area.cuMin ;
1000- info.scaleCorrUtoGrid = spline.getGridX1 ().getUmax () / (area.cuMax - area.cuMin );
1001- info.scaleCorrVtoGrid = spline.getGridX2 ().getUmax () / area.cvMax ;
1008+ // define the grid for the inverse correction
10021009
1003- info.gridCorrU0 = u0;
1004- info.gridCorrV0 = info.gridV0 ;
1005- info.scaleCorrUtoGrid = spline.getGridX1 ().getUmax () / (u1 - info.gridCorrU0 );
1006- info.scaleCorrVtoGrid = spline.getGridX2 ().getUmax () / (v1 - info.gridCorrV0 );
1010+ sliceRowInfo.gridCorrU0 = area.cuMin ;
1011+ sliceRowInfo.gridCorrV0 = cvMin;
1012+ sliceRowInfo.scaleCorrUtoGrid = spline.getGridX1 ().getUmax () / (area.cuMax - area.cuMin );
1013+ sliceRowInfo.scaleCorrVtoGrid = spline.getGridX2 ().getUmax () / area.cvMax ;
1014+
1015+ /*
1016+ sliceRowInfo.gridCorrU0 = sliceRowInfo.gridU0;
1017+ sliceRowInfo.gridCorrV0 = sliceRowInfo.gridV0;
1018+ sliceRowInfo.scaleCorrUtoGrid = sliceRowInfo.scaleUtoGrid;
1019+ sliceRowInfo.scaleCorrVtoGrid = sliceRowInfo.scaleVtoGrid;
1020+ */
10071021
10081022 int nDataPoints = dataPointCU.size ();
10091023 for (int i = 0 ; i < nDataPoints; i++) {
1010- dataPointCU[i] = (dataPointCU[i] - info .gridCorrU0 ) * info .scaleCorrUtoGrid ;
1011- dataPointCV[i] = (dataPointCV[i] - info .gridCorrV0 ) * info .scaleCorrVtoGrid ;
1024+ dataPointCU[i] = (dataPointCU[i] - sliceRowInfo .gridCorrU0 ) * sliceRowInfo .scaleCorrUtoGrid ;
1025+ dataPointCV[i] = (dataPointCV[i] - sliceRowInfo .gridCorrV0 ) * sliceRowInfo .scaleCorrVtoGrid ;
10121026 }
10131027
10141028 splineParameters.resize (spline.getNumberOfParameters ());
0 commit comments