46 const char* comment[3] = {
" ",
"! ",
"!!"};
47 const char* kKeyConstr[2] = {
"constraint",
"measurement"};
68 mPar = mPar.Inverse();
71 auto jac = cstrArr.get();
73 for (
int ich = 0; ich < nch; ich++) {
77 if (child->isFrameTRA()) {
78 child->getMatrixT2G(matRel);
81 matRel = child->getMatrixL2GIdeal();
83 matRel.MultiplyLeft(&mPar);
86 for (
int ics = 0; ics <
kNDOFGeom; ics++) {
89 if (!
isZeroAbs(jv) && child->isFreeDOF(ip) && child->getParErr(ip) >= 0) {
96 if (child->isFreeDOF(ip) && child->getParErr(ip) >= 0) {
104 for (
int ics = 0; ics <
kNDOFGeom; ics++) {
108 int cmtStatus = nContCh[ics] > 0 ? kOff : kOn;
110 if (algConf.verbose > 0) {
115 fprintf(conOut,
"\n%s%s\t%e\t%e\t%s %s of %s Auto\n", comment[cmtStatus], kKeyConstr[kMeas], 0.0,
mSigma[ics],
118 fprintf(conOut,
"\n%s%s\t%e\t%s %s of %s Auto\n", comment[cmtStatus], kKeyConstr[kConstr], 0.0,
121 for (
int ich = 0; ich < nch; ich++) {
125 fprintf(conOut,
"%s", comment[cmtStatus]);
130 if (child->isFreeDOF(ip) && !
isZeroAbs(jv) && child->getParErr(ip) >= 0) {
131 fprintf(conOut,
"%9d %+.3e\t", child->getParLab(ip), jv);
135 fprintf(conOut,
"%s ", comment[kOn]);
139 if (child->isFreeDOF(ip) && !
isZeroAbs(jv) && child->getParErr(ip) >= 0) {
142 fprintf(conOut,
"%9d %+.3e\t", child->getParLab(ip), jv);
145 fprintf(conOut,
"%s from %s\n", comment[kOnOn], child->getSymName());
175 mPar = mPar.Inverse();
178 auto jac = cstrArr.get();
182 printf(
"\n\n ----- Constraints Validation for %s Auto ------\n",
getName().c_str());
191 printf(
" ! %s\n",
getName().c_str());
192 for (
int ich = 0; ich < nch; ich++) {
196 parsC[jc] = child->getParVal(jc);
198 printf(
"#%3d | ", ich);
202 if (child->isFrameTRA()) {
203 child->getMatrixT2G(matRel);
206 matRel = child->getMatrixL2GIdeal();
209 matRel.MultiplyLeft(&mPar);
213 child->delta2Matrix(tau, parsC);
214 const TGeoHMatrix& matreli = matRel.Inverse();
215 tau.Multiply(&matreli);
216 tau.MultiplyLeft(&matRel);
224 parsPEx[0] = tmpPar.
getX();
225 parsPEx[1] = tmpPar.
getY();
226 parsPEx[2] = tmpPar.
getZ();
229 parsPEx[3] = tmpPar.
getPsi();
231 parsPEx[5] = tmpPar.
getPhi();
236 parsPAn[jp] += jac[jp *
kNDOFGeom + jc] * parsC[jc];
238 parsTotAn[jp] += parsPAn[jp];
239 parsTotEx[jp] += parsPEx[jp];
241 printf(
"%+.1e/%+.1e ", parsPAn[jp], parsPEx[jp]);
248 bool acc = child->isFreeDOF(jc) && child->getParErr(jc) >= 0;
250 printf(
" %+.3e ", parsC[jc]);
251 parsTotAn[jc] += parsC[jc];
253 printf(
" /* %+.3e */ ", parsC[jc]);
259 printf(
"%+.1e ", parsC[jc]);
261 printf(
" ! %s\n", child->getSymName());
267 printf(
"%+.1e/%+.1e ", parsTotAn[jp], parsTotEx[jp]);
270 printf(
" %+.3e ", parsTotAn[jp]);
272 printf(
" /* %+.3e */ ", parsTotAn[jp]);
283 printf(
" no parent -> %s ", doJac ?
"Global" :
"Simple");
285 printf(
" ! <----- %s\n",
getName().c_str());
290 printf(
" %+.3e ",
mSigma[jp]);
292 printf(
" /* %+.3e */ ",
mSigma[jp]);
295 printf(
" ! <----- \n");
315 TGeoHMatrix matRI = matRD.Inverse();
316 const int ij[
kNDOFGeom][2] = {{3, 0}, {3, 1}, {3, 2}, {1, 2}, {0, 2}, {0, 1}};
318 const double *
rd = matRD.GetRotationMatrix(), *ri = matRI.GetRotationMatrix();
319 const double * ti = matRI.GetTranslation();
326 const double cf[
kNDOFGeom] = {1., 1., 1., 1., 1., 1.};
327 const double sgc[
kNDOFGeom] = {1., 1., 1., -1., 1., -1.};
338 const double kJTol = 1e-4;
342 {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {
rd[0],
rd[3],
rd[6], 0}},
344 {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {
rd[1],
rd[4],
rd[7], 0}},
346 {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {
rd[2],
rd[5],
rd[8], 0}},
348 {{
rd[2] * ri[3] -
rd[1] * ri[6],
rd[2] * ri[4] -
rd[1] * ri[7],
rd[2] * ri[5] -
rd[1] * ri[8], 0},
349 {
rd[5] * ri[3] -
rd[4] * ri[6],
rd[5] * ri[4] -
rd[4] * ri[7],
rd[5] * ri[5] -
rd[4] * ri[8], 0},
350 {
rd[8] * ri[3] -
rd[7] * ri[6],
rd[8] * ri[4] -
rd[7] * ri[7],
rd[8] * ri[5] -
rd[7] * ri[8], 0},
351 {
rd[2] * ti[1] -
rd[1] * ti[2],
rd[5] * ti[1] -
rd[4] * ti[2],
rd[8] * ti[1] -
rd[7] * ti[2], 0}},
353 {{
rd[0] * ri[6] -
rd[2] * ri[0],
rd[0] * ri[7] -
rd[2] * ri[1],
rd[0] * ri[8] -
rd[2] * ri[2], 0},
354 {
rd[3] * ri[6] -
rd[5] * ri[0],
rd[3] * ri[7] -
rd[5] * ri[1],
rd[3] * ri[8] -
rd[5] * ri[2], 0},
355 {
rd[6] * ri[6] -
rd[8] * ri[0],
rd[6] * ri[7] -
rd[8] * ri[1],
rd[6] * ri[8] -
rd[8] * ri[2], 0},
356 {
rd[0] * ti[2] -
rd[2] * ti[0],
rd[3] * ti[2] -
rd[5] * ti[0],
rd[6] * ti[2] -
rd[8] * ti[0], 0}},
358 {{
rd[1] * ri[0] -
rd[0] * ri[3],
rd[1] * ri[1] -
rd[0] * ri[4],
rd[1] * ri[2] -
rd[0] * ri[5], 0},
359 {
rd[4] * ri[0] -
rd[3] * ri[3],
rd[4] * ri[1] -
rd[3] * ri[4],
rd[4] * ri[2] -
rd[3] * ri[5], 0},
360 {
rd[7] * ri[0] -
rd[6] * ri[3],
rd[7] * ri[1] -
rd[6] * ri[4],
rd[7] * ri[2] -
rd[6] * ri[5], 0},
361 {
rd[1] * ti[0] -
rd[0] * ti[1],
rd[4] * ti[0] -
rd[3] * ti[1],
rd[7] * ti[0] -
rd[6] * ti[1], 0}},
365 int i = ij[cs][0],
j = ij[cs][1];
367 double jval = sgc[cs] * dDPar[ip][
i][
j] * cf[ip];
368 jac[cs *
kNDOFGeom + ip] = (
Abs(jval) > kJTol) ? jval : 0;