103 bool flagCurv,
bool flagU1dir,
bool flagU2dir) :
104 numAllPoints(aPointList.size()), numPoints(), numOffsets(0), numInnerTrans(
105 0), numCurvature(flagCurv ? 1 : 0), numParameters(0), numLocals(
106 0), numMeasurements(0), externalPoint(0), theDimension(0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalIndex(), externalSeed(), innerTransformations(), externalDerivatives(), externalMeasurements(), externalPrecisions() {
131 unsigned int aLabel,
const TMatrixDSym &aSeed,
bool flagCurv,
132 bool flagU1dir,
bool flagU2dir) :
133 numAllPoints(aPointList.size()), numPoints(), numOffsets(0), numInnerTrans(
134 0), numCurvature(flagCurv ? 1 : 0), numParameters(0), numLocals(
135 0), numMeasurements(0), externalPoint(aLabel), theDimension(0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalIndex(), externalSeed(
136 aSeed), innerTransformations(), externalDerivatives(), externalMeasurements(), externalPrecisions() {
154 const std::vector<std::pair<std::vector<GblPoint>, TMatrixD> > &aPointsAndTransList) :
155 numAllPoints(), numPoints(), numOffsets(0), numInnerTrans(
156 aPointsAndTransList.size()), numParameters(0), numLocals(0), numMeasurements(
157 0), externalPoint(0), theDimension(0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalIndex(), externalSeed(), innerTransformations(), externalDerivatives(), externalMeasurements(), externalPrecisions() {
159 for (
unsigned int iTraj = 0; iTraj < aPointsAndTransList.size(); ++iTraj) {
160 thePoints.push_back(aPointsAndTransList[iTraj].first);
180 const std::vector<std::pair<std::vector<GblPoint>, TMatrixD> > &aPointsAndTransList,
181 const TMatrixD &extDerivatives,
const TVectorD &extMeasurements,
182 const TVectorD &extPrecisions) :
183 numAllPoints(), numPoints(), numOffsets(0), numInnerTrans(
184 aPointsAndTransList.size()), numParameters(0), numLocals(0), numMeasurements(
185 0), externalPoint(0), theDimension(0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalIndex(), externalSeed(), innerTransformations(), externalDerivatives(
186 extDerivatives), externalMeasurements(extMeasurements), externalPrecisions(
189 for (
unsigned int iTraj = 0; iTraj < aPointsAndTransList.size(); ++iTraj) {
190 thePoints.push_back(aPointsAndTransList[iTraj].first);
216 unsigned int aLabel = 0;
221 std::vector<GblPoint>::iterator itPoint;
223 itPoint <
thePoints[iTraj].end(); ++itPoint) {
226 itPoint->setLabel(++aLabel);
249 std::vector<GblPoint>::iterator itPoint;
250 for (itPoint =
thePoints[iTraj].begin() + 1;
251 itPoint <
thePoints[iTraj].end() - 1; ++itPoint) {
252 if (itPoint->hasScatterer()) {
271 unsigned int numStep = 0;
272 std::vector<GblPoint>::iterator itPoint;
273 for (itPoint =
thePoints[iTraj].begin() + 1;
274 itPoint <
thePoints[iTraj].end(); ++itPoint) {
276 scatJacobian = itPoint->getP2pJacobian();
278 scatJacobian = itPoint->getP2pJacobian() * scatJacobian;
281 itPoint->addPrevJacobian(scatJacobian);
282 if (itPoint->getOffset() >= 0) {
285 previousPoint = &(*itPoint);
290 for (itPoint =
thePoints[iTraj].end() - 1;
291 itPoint >
thePoints[iTraj].begin() + 1; --itPoint) {
292 if (itPoint->getOffset() >= 0) {
299 scatJacobian = scatJacobian * itPoint->getP2pJacobian();
302 itPoint->addNextJacobian(scatJacobian);
317 int aSignedLabel)
const {
322 unsigned int nBorder = nCurv + nLocals;
323 unsigned int nParBRL = nBorder + 2 * nDim;
324 unsigned int nParLoc = nLocals + 5;
325 std::vector<unsigned int> anIndex;
326 anIndex.reserve(nParBRL);
327 TMatrixD aJacobian(nParLoc, nParBRL);
330 unsigned int aLabel = abs(aSignedLabel);
331 unsigned int firstLabel = 1;
332 unsigned int lastLabel = 0;
333 unsigned int aTrajectory = 0;
338 if (aLabel <= lastLabel)
340 if (iTraj < numTrajectories - 1)
345 if (aSignedLabel > 0) {
347 if (aLabel >= lastLabel) {
353 if (aLabel <= firstLabel) {
359 std::vector<unsigned int> labDer(5);
364 for (
unsigned int i = 0; i < nLocals; ++i) {
365 aJacobian(i + 5, i) = 1.0;
366 anIndex.push_back(i + 1);
369 unsigned int iCol = nLocals;
370 for (
unsigned int i = 0; i < 5; ++i) {
372 anIndex.push_back(labDer[i]);
373 for (
unsigned int j = 0; j < 5; ++j) {
374 aJacobian(j, iCol) = matDer(j, i);
379 return std::make_pair(anIndex, aJacobian);
394 unsigned int nJacobian)
const {
404 SMatrix22 prevW, prevWJ, nextW, nextWJ, matN;
410 matN = sumWJ.Inverse(ierr);
414 const SVector2 prevNd(matN * prevWd);
415 const SVector2 nextNd(matN * nextWd);
417 unsigned int iOff = nDim * (-nOffset - 1) + nLocals + nCurv + 1;
421 aJacobian.Place_in_col(-prevNd - nextNd, 3, 0);
422 anIndex[0] = nLocals + 1;
424 aJacobian.Place_at(prevNW, 3, 1);
425 aJacobian.Place_at(nextNW, 3, 3);
426 for (
unsigned int i = 0; i < nDim; ++i) {
428 anIndex[3 + theDimension[i]] = iOff + nDim + i;
434 const SMatrix22 prevWPN(nextWJ * prevNW);
435 const SMatrix22 nextWPN(prevWJ * nextNW);
436 const SVector2 prevWNd(nextWJ * prevNd);
437 const SVector2 nextWNd(prevWJ * nextNd);
439 aJacobian(0, 0) = 1.0;
440 aJacobian.Place_in_col(prevWNd - nextWNd, 1, 0);
442 aJacobian.Place_at(-prevWPN, 1, 1);
443 aJacobian.Place_at(nextWPN, 1, 3);
449 unsigned int iOff1 = nDim * nOffset + nCurv + nLocals + 1;
450 unsigned int index1 = 3 - 2 * nJacobian;
451 unsigned int iOff2 = iOff1 + nDim * (nJacobian * 2 - 1);
452 unsigned int index2 = 1 + 2 * nJacobian;
454 aJacobian(3, index1) = 1.0;
455 aJacobian(4, index1 + 1) = 1.0;
456 for (
unsigned int i = 0; i < nDim; ++i) {
466 aJacobian(0, 0) = 1.0;
467 aJacobian.Place_in_col(-vecWd, 1, 0);
468 anIndex[0] = nLocals + 1;
470 aJacobian.Place_at(-matWJ, 1, index1);
471 aJacobian.Place_at(matW, 1, index2);
472 for (
unsigned int i = 0; i < nDim; ++i) {
500 const SVector2 sumWd(prevWd + nextWd);
502 unsigned int iOff = (nOffset - 1) * nDim + nCurv + nLocals + 1;
506 aJacobian.Place_in_col(-sumWd, 0, 0);
507 anIndex[0] = nLocals + 1;
509 aJacobian.Place_at(prevW, 0, 1);
510 aJacobian.Place_at(-sumWJ, 0, 3);
511 aJacobian.Place_at(nextW, 0, 5);
512 for (
unsigned int i = 0; i < nDim; ++i) {
514 anIndex[3 + theDimension[i]] = iOff + nDim + i;
515 anIndex[5 + theDimension[i]] = iOff + nDim * 2 + i;
530 TMatrixDSym &localCov)
const {
533 std::pair<std::vector<unsigned int>, TMatrixD> indexAndJacobian =
535 unsigned int nParBrl = indexAndJacobian.first.size();
536 TVectorD aVec(nParBrl);
537 for (
unsigned int i = 0; i < nParBrl; ++i) {
538 aVec[i] =
theVector(indexAndJacobian.first[i] - 1);
541 localPar = indexAndJacobian.second * aVec;
542 localCov = aMat.Similarity(indexAndJacobian.second);
559 unsigned int &numData, TVectorD &aResiduals, TVectorD &aMeasErrors,
560 TVectorD &aResErrors, TVectorD &aDownWeights) {
567 for (
unsigned int i = 0; i < numData; ++i) {
568 getResAndErr(firstData + i, aResiduals[i], aMeasErrors[i],
569 aResErrors[i], aDownWeights[i]);
587 unsigned int &numData, TVectorD &aResiduals, TVectorD &aMeasErrors,
588 TVectorD &aResErrors, TVectorD &aDownWeights) {
595 for (
unsigned int i = 0; i < numData; ++i) {
596 getResAndErr(firstData + i, aResiduals[i], aMeasErrors[i],
597 aResErrors[i], aDownWeights[i]);
613 double &aMeasError,
double &aResError,
double &aDownWeight) {
616 std::vector<unsigned int>* indLocal;
617 std::vector<double>* derLocal;
618 theData[aData].getResidual(aResidual, aMeasVar, aDownWeight, indLocal,
620 unsigned int nParBrl = (*indLocal).size();
621 TVectorD aVec(nParBrl);
622 for (
unsigned int j = 0; j < nParBrl; ++j) {
623 aVec[j] = (*derLocal)[j];
626 double aFitVar = aMat.Similarity(aVec);
627 aMeasError = sqrt(aMeasVar);
628 aResError = (aFitVar < aMeasVar ? sqrt(aMeasVar - aFitVar) : 0.);
636 double aValue, aWeight;
637 std::vector<unsigned int>* indLocal;
638 std::vector<double>* derLocal;
639 std::vector<GblData>::iterator itData;
640 for (itData =
theData.begin(); itData <
theData.end(); ++itData) {
641 itData->getLocalData(aValue, aWeight, indLocal, derLocal);
642 for (
unsigned int j = 0; j < indLocal->size(); ++j) {
643 theVector((*indLocal)[j] - 1) += (*derLocal)[j] * aWeight * aValue;
661 unsigned int nData = 0;
662 std::vector<TMatrixD> innerTransDer;
663 std::vector<std::vector<unsigned int> > innerTransLab;
671 std::vector<unsigned int> firstLabels(5);
676 matLocalToFit = matFitToLocal.Inverse(ierr);
677 TMatrixD localToFit(5, 5);
678 for (
unsigned int i = 0; i < 5; ++i) {
679 for (
unsigned int j = 0; j < 5; ++j) {
680 localToFit(i, j) = matLocalToFit(i, j);
685 innerTransLab.push_back(firstLabels);
691 std::vector<GblPoint>::iterator itPoint;
694 itPoint <
thePoints[iTraj].end(); ++itPoint) {
696 unsigned int nLabel = itPoint->getLabel();
697 unsigned int measDim = itPoint->hasMeasurement();
699 const TMatrixD localDer = itPoint->getLocalDerivatives();
700 const std::vector<int> globalLab = itPoint->getGlobalLabels();
701 const TMatrixD globalDer = itPoint->getGlobalDerivatives();
703 itPoint->getMeasurement(matP, aMeas, aPrec);
704 unsigned int iOff = 5 - measDim;
705 std::vector<unsigned int> labDer(5);
709 matPDer = matP * matDer;
718 TMatrixD proDer(measDim, 5);
720 unsigned int ifirst = 0;
721 unsigned int ilabel = 0;
723 if (labDer[ilabel] > 0) {
724 while (innerTransLab[iTraj][ifirst]
725 != labDer[ilabel] and ifirst < 5) {
729 labDer[ilabel] -= 2 * nDim * (iTraj + 1);
733 for (
unsigned int k = iOff; k < 5; ++k) {
734 proDer(k - iOff, ifirst) = matPDer(k,
742 transDer = proDer * innerTransDer[iTraj];
744 for (
unsigned int i = iOff; i < 5; ++i) {
746 GblData aData(nLabel, aMeas(i), aPrec(i));
748 globalLab, globalDer,
numLocals, transDer);
764 for (itPoint =
thePoints[iTraj].begin() + 1;
765 itPoint <
thePoints[iTraj].end() - 1; ++itPoint) {
767 unsigned int nLabel = itPoint->getLabel();
768 if (itPoint->hasScatterer()) {
769 itPoint->getScatterer(aMeas, aPrec);
771 std::vector<unsigned int> labDer(7);
777 TMatrixD proDer(nDim, 5);
779 unsigned int ifirst = 0;
780 unsigned int ilabel = 0;
782 if (labDer[ilabel] > 0) {
783 while (innerTransLab[iTraj][ifirst]
784 != labDer[ilabel] and ifirst < 5) {
788 labDer[ilabel] -= 2 * nDim * (iTraj + 1);
792 for (
unsigned int k = 0; k < nDim; ++k) {
793 proDer(k, ifirst) = matDer(k, ilabel);
800 transDer = proDer * innerTransDer[iTraj];
802 for (
unsigned int i = 0; i < nDim; ++i) {
804 if (aPrec(iDim) > 0.) {
805 GblData aData(nLabel, aMeas(iDim), aPrec(iDim));
820 std::pair<std::vector<unsigned int>, TMatrixD> indexAndJacobian =
825 const TVectorD valEigen = externalEigen.GetEigenValues();
826 TMatrixD vecEigen = externalEigen.GetEigenVectors();
827 vecEigen = vecEigen.T() * indexAndJacobian.second;
829 if (valEigen(i) > 0.) {
846 for (
unsigned int iExt = 0; iExt < nExt; ++iExt) {
847 for (
unsigned int iCol = 0; iCol <
numCurvature; ++iCol) {
848 index[iCol] = iCol + 1;
863 std::vector<GblData>::iterator itData;
864 for (itData =
theData.begin(); itData <
theData.end(); ++itData) {
875 std::vector<GblData>::iterator itData;
876 for (itData =
theData.begin(); itData <
theData.end(); ++itData) {
877 aLoss += (1. - itData->setDownWeighting(aMethod));
893 std::string optionList) {
894 const double normChi2[4] = { 1.0, 0.8737, 0.9326, 0.8228 };
895 const std::string methodList =
"TtHhCc";
897 unsigned int aMethod = 0;
901 unsigned int ierr = 0;
907 for (
unsigned int i = 0; i < optionList.size(); ++i)
909 size_t aPosition = methodList.find(optionList[i]);
910 if (aPosition != std::string::npos) {
911 aMethod = aPosition / 2 + 1;
920 for (
unsigned int i = 0; i <
theData.size(); ++i) {
923 Chi2 /= normChi2[aMethod];
927 std::cout <<
" GblTrajectory::fit exception " << e << std::endl;
940 std::vector<unsigned int>* indLocal;
941 std::vector<double>* derLocal;
942 std::vector<int>* labGlobal;
943 std::vector<double>* derGlobal;
946 std::vector<GblData>::iterator itData;
947 for (itData =
theData.begin(); itData !=
theData.end(); ++itData) {
948 itData->getAllData(fValue, fErr, indLocal, derLocal, labGlobal,
950 aMille.
addData(fValue, fErr, *indLocal, *derLocal, *labGlobal,