27#include <TMatrixDSymEigen.h>
101 for (
int i = 0;
i < 2;
i++) {
136 if (algConf.verbose > 2) {
137 LOG(warn) <<
"Failed on derivatives calculation 0";
144 if (algConf.verbose > 2) {
145 LOG(warn) <<
"Failed on derivatives calculation 0";
173 const int kInvElem[
kNKinParBON] = {-1, 1, 1, -1, -1};
175 const double kDelta[
kNKinParBON] = {0.02, 0.02, 0.001, 0.001, 0.01};
179 delta[
i] = kDelta[
i];
185 int pinc, signELoss = 0;
205 double del = delta[ipar];
209 modParam(probD[(icl << 1) + 0], ipar, del);
210 modParam(probD[(icl << 1) + 1], ipar, -del);
214 for (
int ip = pFrom; ip != pTo; ip += pinc) {
226 if (
invert && kInvElem[ipar] < 0) {
234 for (
int ip = pFrom; ip != pTo; ip += pinc) {
238 if (algConf.verbose > 2) {
239 LOGF(warn,
"Failed on global derivatives calculation at point %d", ip);
256 for (
int ipar = 0; ipar < nParFreeI; ipar++) {
258 deltaMatD[ipar] = d > 0. ?
Sqrt(d) * 5 : delta[ipar];
265 for (
int ipar = 0; ipar < nParFreeI; ipar++) {
266 double del = deltaMatD[ipar];
274 int offsIP = offsI + ipar;
279 double parOrig = extendedParams[offsIP];
280 extendedParams[offsIP] += del;
283 if (!
applyMatCorr(probD[(icl << 1) + 0], extendedParams, pnt)) {
288 extendedParams[offsIP] = parOrig - del;
289 if (!
applyMatCorr(probD[(icl << 1) + 1], extendedParams, pnt)) {
293 extendedParams[offsIP] = parOrig;
297 int offsDerIP = ip *
mNLocPar + offsIP;
303 for (
int jp = ip + pinc; jp != pTo; jp += pinc) {
319 int offsDerJ = jp *
mNLocPar + offsIP;
343 double cspi = 1. /
Sqrt((1 - snp) * (1 + snp)), slpY = snp * cspi, slpZ = tgl * cspi;
360 double* dXYZ = &deriv[ip * 3];
384 for (
int idf = 0; idf < ndof; idf++) {
417 if (!extendedParams) {
418 extendedParams =
mLocPar.data();
427 if (algConf.verbose > 2) {
428 LOG(warn) <<
"Failed on residuals calculation 0";
435 if (algConf.verbose > 2) {
436 LOG(warn) <<
"Failed on residuals calculation 1";
461 setParams(probe, getX(), getAlpha(), extendedParams,
true);
465 int pinc, signELoss = 0;
478 for (
int ip = pFrom; ip != pTo; ip += pinc) {
480 if (!
propagateParamToPoint(probe, pnt, algConf.maxStep, algConf.maxSnp, MatCorrType::USEMatCorrNONE, signELoss)) {
505 for (
int i = 0;
i < nCorrPar;
i++) {
520 for (
int itr = nTr; itr--;) {
522 if (algConf.verbose > 2) {
523 LOG(error) <<
"Failed on clone " << itr <<
" propagation ";
537 return propagate(tr, pnt, maxStep, maxSnp, mt,
nullptr, signCorr);
545 return propagate(tr, pnt, maxStep, maxSnp, mt, tLT, signCorr);
553 int dir = dx > 0.f ? 1 : -1;
616 const double* corrDiag = &corrPar[pnt->
getMaxLocVarID() - nCorrPar];
622 corr[
i] += detELoss[
i];
638 const double snp = trPar.getSnp() + corr[
kParSnp];
640 if (
Abs(snp) > algConf.maxSnp) {
641 if (algConf.verbose > 2) {
642 LOG(error) <<
"Snp is too large: " << snp;
643 printf(
"DeltaPar: ");
645 printf(
"%+.3e ", corr[
i]);
653 trPar.updateParams(corr);
670 const double* corrDiagP = &corrDiag[pnt->
getMaxLocVarID() - nCorrPar];
675 corr[
i] += detELoss[
i];
682 for (
int itr = ntr; itr--;) {
684 if (algConf.verbose > 2) {
685 LOGP(error,
"Failed on clone {} materials", itr);
703 return (4. *
val[1] -
val[0]) * (1. / 3);
706 for (
int i = 0;
i < ord;
i++) {
722 return (4. *
val[1] -
val[0]) * (1. / 3);
724 double* buff =
new double[ord + 1];
725 memcpy(buff,
val, (ord + 1) *
sizeof(
double));
727 for (
int i = 0;
i < ord;
i++) {
728 buff[
i] = (4. * buff[
i + 1] - buff[
i]) * (1. / 3);
742 double resYVP = 0, resYVN = 0, resZVP = 0, resZVN = 0;
745 derRichY[icl] = 0.5 * (resYVP - resYVN) / delta[icl];
746 derRichZ[icl] = 0.5 * (resZVP - resZVN) / delta[icl];
750 if (TMath::IsNaN(derY) || TMath::IsNaN(derZ)) {
751 LOGP(error,
"NAN encounterd: DerY {} : DerZ {}", derY, derZ);
760 printf(
"%s ",
isCosmic() ?
" Cosmic " :
"Collision ");
761 trackParam_t::print();
762 printf(
"N Free Par: %d (Kinem: %d) | Npoints: %d (Inner:%d) | Chi2Ini:%.1f Chi2: %.1f/%d",
775 bool par = optS.Contains(
"lc");
776 bool paru = optS.Contains(
"lcu");
779 printf(
"Ref.track corr: ");
786 if (optS.Contains(
"p") ||
res || der) {
793 printf(
" Residuals : %+.3e %+.3e -> Pulls: %+7.2f %+7.2f\n",
798 for (
int ipar = 0; ipar <
mNLocPar; ipar++) {
805 printf(
" Corr.Diag: ");
806 for (
int i = 0;
i < nCorrPar;
i++) {
810 printf(
" Corr.Pull: ");
813 for (
int i = 0;
i < nCorrPar;
i++) {
818 double corr[5] = {0};
821 printf(
" Corr.Track: ");
823 printf(
"%+.3e ", corr[
i]);
836 printf(
"gpx/D:gpy/D:gpz/D:gtxb/D:gtyb/D:gtzb/D:gtxa/D:gtya/D:gtza/D:alp/D:px/D:py/D:pz/D:tyb/D:tzb/D:tya/D:tza/D:ey/D:ez/D\n");
853 setQ2Pt(
isCosmic() ? 1. / algConf.defPTB0Cosm : 1. / algConf.defPTB0Coll);
863 if (algConf.verbose > 2) {
864 LOG(warn) <<
"Failed fitLeg 0";
876 if (algConf.verbose > 2) {
877 LOG(warn) <<
"Failed fitLeg 1";
917 if (algConf.verbose > 2) {
918 LOG(error) <<
"Tracks must be defined at same reference X and Alpha";
927 float dsnp = trcL.getSnp() - trcU.getSnp(), dTgl = trcL.getTgl() - trcU.getTgl();
928 if (std::abs(dsnp) > algConf.cosmMaxDSnp || std::abs(dTgl) > algConf.cosmMaxDTgl) {
929 if (algConf.verbose > 2) {
930 LOGP(error,
"Rejecting track with dSnp={} dTgl={}", dsnp, dTgl);
931 LOGP(error,
"CosmDn: {}", trcL.
asString());
932 LOGP(error,
"CosmUp: {}", trcU.
asString());
940 TMatrixD matCL(mtSize, mtSize), matCLplCU(mtSize, mtSize);
941 TVectorD vl(mtSize), vUmnvL(mtSize);
946 for (
int i = mtSize;
i--;) {
947 vUmnvL[
i] = trcU.getParam(
i) - trcL.getParam(
i);
948 vl[
i] = trcL.getParam(
i);
949 for (
int j =
i + 1;
j--;) {
950 int indIJ = ((
i * (
i + 1)) >> 1) +
j;
951 matCL(
i,
j) = matCL(
j,
i) = trcL.getCovarElem(
i,
j);
952 matCLplCU(
i,
j) = matCLplCU(
j,
i) = trcL.getCovarElem(
i,
j) + trcU.getCovarElem(
i,
j);
956 if (!matCLplCU.IsValid()) {
957 if (algConf.verbose > 2) {
958 LOG(error) <<
"Failed to invert summed cov.matrix of cosmic track";
963 TMatrixD matK(matCL, TMatrixD::kMult, matCLplCU);
964 TMatrixD matKdotCL(matK, TMatrixD::kMult, matCL);
965 TVectorD vlUp = matK * vUmnvL;
966 for (
int i = mtSize;
i--;) {
967 trcL.updateParam(vlUp[
i],
i);
968 for (
int j =
i + 1;
j--;) {
969 trcL.updateCov(-matKdotCL(
i,
j),
i,
j);
975 for (
int i = mtSize;
i--;) {
976 for (
int j = mtSize;
j--;) {
977 chi2 += matCLplCU(
i,
j) * vUmnvL[
i] * vUmnvL[
j];
993 const int kMinNStep = 3;
994 const double kErrSpace = 50.;
995 const double kErrAng = 0.8;
996 const double kErrRelPtI = 1.;
998 kErrSpace * kErrSpace,
999 0, kErrSpace * kErrSpace,
1000 0, 0, kErrAng * kErrAng,
1001 0, 0, 0, kErrAng * kErrAng,
1002 0, 0, 0, 0, kErrRelPtI * kErrRelPtI};
1004 static int count = 0;
1006 if (algConf.verbose > 2) {
1007 LOGP(info,
"FIT COUNT {}",
count++);
1011 double phi = trc.getPhi(), alp = p0->getAlphaSens();
1014 double dphi = math_utils::detail::deltaPhiSmall(phi, alp);
1015 if (dphi > Pi() / 2.) {
1021 if (algConf.verbose > 2) {
1022 LOGF(warn,
"Failed on PropagateParamOnlyTo to %f", p0->getXTracking());
1027 trc.setCov(kIniErr);
1028 trc.setCov(16 * trc.getQ2Pt() * trc.getQ2Pt(), 4, 4);
1030 int pinc, signELoss = 0;
1043 for (
int ip = pFrom; ip != pTo; ip += pinc) {
1046 if (algConf.verbose > 2) {
1047 LOGF(warn,
"Failed on propagateToPoint %d (%d : %d) %f", ip, pFrom, pTo, pnt->
getXTracking());
1058 double chi = trc.getPredictedChi2(yz, errYZ);
1059 if (!trc.update(yz, errYZ)) {
1060 if (algConf.verbose > 2) {
1061 LOGF(warn,
"Failed on Update %f,%f {%f,%f,%f}", yz[0], yz[1], errYZ[0], errYZ[1], errYZ[2]);
1074 if (algConf.verbose > 2) {
1075 LOGP(info,
"Fitted leg with {} points, chi2: {}", pntCnt,
mChi2);
1088 const int kMinNStep = 3;
1089 const double kErrSpace = 100.;
1090 const double kErrAng = 0.7;
1091 const double kErrRelPtI = 1.;
1093 kErrSpace * kErrSpace,
1094 0, kErrSpace * kErrSpace,
1095 0, 0, kErrAng * kErrAng,
1096 0, 0, 0, kErrAng * kErrAng,
1097 0, 0, 0, 0, kErrRelPtI * kErrRelPtI};
1105 while (pID < nPnt && !(pnt =
getPoint(pID))->containsMeasurement()) {
1114 double dphi = math_utils::detail::deltaPhiSmall(phi, alp);
1115 if (dphi > Pi() / 2.) {
1120 if (!
propagateParamToPoint(trc, pnt, algConf.maxStep, algConf.maxSnp, MatCorrType::USEMatCorrNONE, 1)) {
1121 if (algConf.verbose > 2) {
1122 LOG(warn) <<
"Failed on propagateParamToPoint";
1129 trc.setCov(kIniErr);
1130 const double inwardQ2Pt2 = 4 * trc.getCovarElem(4, 4) * trc.getQ2Pt() * trc.getQ2Pt();
1131 trc.setCov(inwardQ2Pt2, 4, 4);
1133 double chifwd = 0, chibwd = 0;
1136 for (
int ip = pID; ip < nPnt; ip++) {
1154 ws[2] = trc.getSigmaY2();
1155 ws[3] = trc.getSigmaZY();
1156 ws[4] = trc.getSigmaZ2();
1157 double chi = trc.getPredictedChi2(yz, errYZ);
1158 if (!trc.update(yz, errYZ)) {
1159 if (algConf.verbose > 2) {
1160 LOGF(warn,
"Failed on Inward Update %f,%f {%f,%f,%f}", yz[0], yz[1], errYZ[0], errYZ[1], errYZ[2]);
1171 trc.setCov(kIniErr);
1172 const double outwardQ2Pt2 = 4 * trc.getCovarElem(4, 4) * trc.getQ2Pt() * trc.getQ2Pt();
1173 trc.setCov(outwardQ2Pt2, 4, 4);
1175 for (
int ip = nPnt; ip--;) {
1193 ws[2] = trc.getSigmaY2();
1194 ws[3] = trc.getSigmaZY();
1195 ws[4] = trc.getSigmaZ2();
1196 double chi = trc.getPredictedChi2(yz, errYZ);
1199 if (!trc.update(yz, errYZ)) {
1200 if (algConf.verbose > 2) {
1201 LOGF(warn,
"Failed on Outward Update %f,%f {%f,%f,%f}", yz[0], yz[1], errYZ[0], errYZ[1], errYZ[2]);
1211 for (
int ip = 0; ip < nPnt; ip++) {
1218 double &yA = wsA[0], &zA = wsA[1], &sgAYY = wsA[2], &sgAYZ = wsA[3], &sgAZZ = wsA[4];
1219 double &yB = wsB[0], &zB = wsB[1], &sgBYY = wsB[2], &sgBYZ = wsB[3], &sgBZZ = wsB[4];
1221 double sgYY = sgAYY + sgBYY, sgYZ = sgAYZ + sgBYZ, sgZZ = sgAZZ + sgBZZ;
1222 double detI = sgYY * sgZZ - sgYZ * sgYZ;
1231 sgYZ = -sgYZ * detI;
1232 double dy = yB - yA, dz = zB - zA;
1233 double k00 = sgAYY * sgYY + sgAYZ * sgYZ, k01 = sgAYY * sgYZ + sgAYZ * sgZZ;
1234 double k10 = sgAYZ * sgYY + sgAZZ * sgYZ, k11 = sgAYZ * sgYZ + sgAZZ * sgZZ;
1235 double sgAYZt = sgAYZ;
1236 yA += dy * k00 + dz * k01;
1237 zA += dy * k10 + dz * k11;
1238 sgAYY -= k00 * sgAYY + k01 * sgAYZ;
1239 sgAYZ -= k00 * sgAYZt + k01 * sgAZZ;
1240 sgAZZ -= k10 * sgAYZt + k11 * sgAZZ;
1260 if (algConf.verbose > 2) {
1261 LOG(error) <<
"Failed to process materials for leg along the track";
1273 LOG(error) <<
"Failed to process materials for leg against the track";
1285 const int kMinNStep = 3;
1286 const double kErrSpcT = 1e-6;
1287 const double kErrAngT = 1e-6;
1288 const double kErrPtIT = 1e-12;
1290 kErrSpcT * kErrSpcT,
1291 0, kErrSpcT * kErrSpcT,
1292 0, 0, kErrAngT * kErrAngT,
1293 0, 0, 0, kErrAngT * kErrAngT,
1294 0, 0, 0, 0, kErrPtIT * kErrPtIT};
1311 double dpar[5] = {0};
1313 matTL.setTimeNotNeeded();
1316 double minX2X0 = algConf.minScatteringAngleToAccount / 0.014 * trc.getPt();
1320 int pinc, signELoss = 0;
1331 for (
int ip = pFrom; ip != pTo; ip += pinc) {
1333 trc.setCov(kErrTiny);
1339 if (algConf.verbose > 2) {
1340 LOG(error) <<
"Failed to take track to point" << ip <<
" (dir: " << pFrom <<
"->" << pTo <<
") with mat.corr.";
1348 bool hasMaterial = matTL.getX2X0() > minX2X0;
1349 if (!
propagateToPoint(tr0, pnt, algConf.maxStep, algConf.maxSnp, MatCorrType::USEMatCorrNONE,
nullptr, signELoss)) {
1350 if (algConf.verbose > 2) {
1351 LOG(error) <<
"Failed to take track to point" << ip <<
" (dir: " << pFrom <<
"->" << pTo <<
") with mat.corr.";
1359 double *par0 = (
double*)tr0.getParams(), *par1 = (
double*)trc.getParams();
1360 const covMat_t &cov0 = tr0.getCov(), &cov1 = trc.getCov();
1361 for (
int l = 15; l--;) {
1362 dcov[l] = cov1[l] - cov0[l];
1365 dpar[l] = par1[l] - par0[l];
1374 TMatrixDSym matCov(nParFree);
1375 for (
int i = nParFree;
i--;) {
1376 for (
int j =
i + 1;
j--;) {
1377 auto err2 = dcov[
j + ((
i * (
i + 1)) >> 1)];
1378 if (
i ==
j && err2 < 1e-20) {
1379 LOGP(warn,
"Material correction {}-th error too small: {}, declare no material despite x/X0={}",
i, err2, matTL.getX2X0());
1380 hasMaterial =
false;
1383 matCov(
i,
j) = matCov(
j,
i) = err2;
1387 TMatrixDSymEigen matDiag(matCov);
1388 const TMatrixD& matEVec = matDiag.GetEigenVectors();
1389 if (!matEVec.IsValid()) {
1390 if (algConf.verbose > 2) {
1391 LOG(error) <<
"Failed to diagonalize covariance of material correction";
1396 for (
int ix = 0; ix < matDiag.GetEigenValues().GetNrows(); ix++) {
1397 if (matDiag.GetEigenValues()[ix] < 1e-18) {
1398 LOG(warn) <<
"Too small " << ix <<
"-th eignevalue " << matDiag.GetEigenValues()[ix] <<
" for cov.matrix !!!";
1399 LOG(warn) <<
"Track with mat.corr: " << trc.
asString();
1400 LOG(warn) <<
"Track w/o mat.corr: " << tr0.
asString();
1402 matDiag.GetEigenValues().Print();
1403 hasMaterial =
false;
1413 pnt->
setX2X0(matTL.getX2X0());
1422 if (!trc.update(yz, errYZ)) {
1423 if (algConf.verbose > 2) {
1424 LOGF(warn,
"Failed on Update %f,%f {%f,%f,%f}", yz[0], yz[1], errYZ[0], errYZ[1], errYZ[2]);
1454 auto xa =
a->getXTracking(), xb =
b->getXTracking();
1455 if (!
a->isInvDir()) {
1456 if (!
b->isInvDir()) {
1462 if (
b->isInvDir()) {
1474 for (
int ip = np; ip--;) {
1519 std::memset(rhs, 0,
sizeof(
double) *
mNLocPar);
1520 for (
int ip = npnt; ip--;) {
1521 if (
mPoints[ip]->containsMeasurement()) {
1522 for (
int idim = 2; idim--;) {
1523 auto sg2inv = 1. /
mPoints[ip]->getErrDiag(idim);
1525 for (
int parI = 0; parI <
mNLocPar; parI++) {
1526 rhs[parI] -= deriv[parI] *
mResid[idim][ip] * sg2inv;
1527 for (
int parJ = parI; parJ <
mNLocPar; parJ++) {
1528 mat[parI][parJ] += deriv[parI] * deriv[parJ] * sg2inv;
1534 if (
mPoints[ip]->containsMaterial()) {
1535 int npm =
mPoints[ip]->getNMatPar();
1537 const auto expMatCov =
mPoints[ip]->getMatCorrCov();
1538 int offs =
mPoints[ip]->getMaxLocVarID() - npm;
1539 for (
int ipar = 0; ipar < npm; ipar++) {
1540 int parI = offs + ipar;
1543 mat[parI][parI] += 1. / expMatCov[ipar];
1551 solver.
A(
i,
j) = mat[
i][
j];
1553 solver.
B(
i, 0) = rhs[
i];
Configuration file for global alignment.
Base class for detector: wrapper for set of volumes.
End-chain alignment volume in detector branch, where the actual measurement is done.
Base class of alignable volume.
Track model for the alignment.
Definition of SymMatrixSolver class.
General auxilliary methods.
Collection of auxillary methods.
bool isFreeDOF(int dof) const
virtual void dPosTraDParCalib(const AlignmentPoint *pnt, double *deriv, int calibID, const AlignableVolume *parent=nullptr) const
AlignableDetector * getDetector() const
virtual void dPosTraDParGeom(const AlignmentPoint *pnt, double *deriv, const AlignableVolume *parent=nullptr) const
bool isFreeDOF(int dof) const
AlignableVolume * getParent() const
void setXTimesRho(double v)
float * getMatCorrCov() const
virtual void dumpCoordinates() const
bool getELossVaried() const
bool getUseBzOnly() const
void updatePointByTrackInfo(const trackParam_t *t)
void setMinLocVarID(int id)
double getErrDiag(int i) const
void setMatCorrExp(double *p)
double * getTrParamWSB() const
void diagonalizeResiduals(double rY, double rZ, double &resU, double &resV) const
void setContainsMaterial(bool v=true)
void setTrParamWSA(const double *param)
int getMaxLocVarID() const
void setMatCovDiagElem(int i, double err2)
double * getTrParamWSA() const
double getAlphaSens() const
void print(uint16_t opt=0) const
void setMatCovDiag(const TVectorD &v)
const AlignableSensor * getSensor() const
float * getMatCorrExp() const
void getResidualsDiag(const double *pos, double &resU, double &resV) const
bool containsMaterial() const
const double * getYZErrTracking() const
bool getNeedUpdateFromTrack() const
double getXTracking() const
void setMatCovDiagonalizationMatrix(const TMatrixD &d)
bool containsMeasurement() const
const double * getYZTracking() const
void setTrParamWSB(const double *param)
void unDiagMatCorr(const double *diag, double *nodiag) const
void setMaxLocVarID(int id)
void addLocPars(const double *pars)
bool propagateToPoint(trackParam_t &tr, const AlignmentPoint *pnt, double maxStep, double maxSnp=0.95, MatCorrType mt=MatCorrType::USEMatCorrLUT, track::TrackLTIntegral *tLT=nullptr, int signCorr=0)
void setKalmanDone(bool v=true)
void richardsonDeriv(const trackParam_t *trSet, const double *delta, const AlignmentPoint *pnt, double &derY, double &derZ)
std::vector< AlignmentPoint * > mPoints
virtual void dumpCoordinates() const
void setParams(trackParam_t &tr, double x, double alp, const double *par, bool add)
bool getResidDone() const
double getResidual(int dim, int pntID) const
bool applyMatCorr(trackParam_t &trPar, const double *corrDiag, const AlignmentPoint *pnt)
AlignmentPoint * getPoint(int i)
bool calcResiduals(const double *params=nullptr)
void modParam(trackParam_t &tr, int par, double delta)
std::vector< double > mDResDGlo[2]
bool calcResidDeriv(double *params=nullptr)
bool getDerivDone() const
bool propagateParamToPoint(trackParam_t &tr, const AlignmentPoint *pnt, double maxStep=3, double maxSnp=0.95, MatCorrType mt=MatCorrType::USEMatCorrLUT, int signCorr=0)
void checkExpandDerGloBuffer(unsigned int minSize)
bool fitLeg(trackParam_t &trc, int pFrom, int pTo, bool &inv)
std::vector< double > mDResDLoc[2]
std::vector< AlignmentPoint > mDetPoints
std::vector< double > mLocPar
void setDerivDone(bool v=true)
void setLocPars(const double *pars)
int getInnerPointID() const
bool calcResidDerivGlo(AlignmentPoint *pnt)
void Clear(Option_t *opt="") final
void suppressLastPoints(int n)
bool combineTracks(trackParam_t &trcL, const trackParam_t &trcU)
std::vector< int > mGloParID
void setResidDone(bool v=true)
const double * getDResDLoc(int dim, int pntID) const
void copyFrom(const o2::track::TrackParametrizationWithError< P > &trc)
void Print(Option_t *opt="") const final
std::vector< double > mResid[2]
static double richardsonExtrap(double *val, int ord=1)
int getParGloID(int par) const
int getNCalibDOFsFree() const
int getNCalibDOFs() const
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
static const AlignConfig & Instance()
double & A(int i, int j)
access to A elements
double & B(int i, int j)
access to B elements
value_t const params_t & par
gpu::gpustd::array< value_t, kCovMatSize > covMat_t
std::string asString() const
value_t value_t DirType dir
GLboolean GLboolean GLboolean b
GLenum const GLfloat * params
GLboolean GLboolean GLboolean GLboolean a
constexpr double TinyDist
typename track::TrackParametrizationWithError< double > trackParam_t
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"