261 if (!mille->isOpen())
265 std::shared_ptr<genfit::GblFitter> gbl(
new genfit::GblFitter());
267 double lostWeight = -1.;
276 for (
auto& recoTrack : recoTracks) {
282 if (!track.hasFitStatus())
284 genfit::GblFitStatus* fs =
dynamic_cast<genfit::GblFitStatus*
>(track.getFitStatus());
288 if (!fs->isFittedWithReferenceTrack())
292 GblTrajectory trajectory(gbl->collectGblPoints(&track, track.getCardinalRep()), fs->hasCurvature());
294 trajectory.fit(chi2, ndf, lostWeight);
314 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
316 auto gblfs =
dynamic_cast<genfit::GblFitStatus*
>(track->getFitStatus());
318 gbl::GblTrajectory trajectory(gbl->collectGblPoints(track, track->getCardinalRep()), gblfs->hasCurvature());
320 trajectory.fit(chi2, ndf, lostWeight);
340 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
341 auto mother = list->getParticle(iParticle);
342 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
345 daughters.push_back({
346 gbl->collectGblPoints(track, track->getCardinalRep()),
350 if (daughters.size() > 1) {
351 gbl::GblTrajectory combined(daughters);
353 combined.fit(chi2, ndf, lostWeight);
365 B2RESULT(
"Vertex-constrained fit NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
376 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
377 auto mother = list->getParticle(iParticle);
378 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
380 TMatrixD extProjection(5, 3);
381 TMatrixD locProjection(3, 5);
405 daughters.push_back({
406 gbl->collectGblPoints(track, track->getCardinalRep()),
413 if (daughters.size() > 1) {
416 TMatrixDSym vertexCov(get<TMatrixDSym>(beam));
417 TMatrixDSym vertexPrec(get<TMatrixDSym>(beam).Invert());
420 TVectorD extMeasurements(3);
421 extMeasurements[0] = vertexResidual[0];
422 extMeasurements[1] = vertexResidual[1];
423 extMeasurements[2] = vertexResidual[2];
427 TMatrixD extDeriv(3, 3);
435 TMatrixD derivatives(3, 3);
437 derivatives(0, 0) = 1.;
438 derivatives(1, 1) = 1.;
439 derivatives(2, 2) = 1.;
441 std::vector<int> labels;
443 labels.push_back(label.setParameterId(1));
444 labels.push_back(label.setParameterId(2));
445 labels.push_back(label.setParameterId(3));
452 std::vector<int> lab(globals); TMatrixD der(globals);
478 TMatrixD dLocal_dExt = extProjection;
479 TMatrixD dExt_dLocal = locProjection;
481 TVectorD locRes = dLocal_dExt * extMeasurements;
483 TMatrixD locCov = dLocal_dExt * vertexCov * dExt_dLocal;
485 TMatrixD locPrec = locCov.GetSub(3, 4, 3, 4).Invert();
486 TMatrixDSym locPrec2D(2); locPrec2D.Zero();
487 for (
int i = 0; i < 2; ++i)
488 for (
int j = 0; j < 2; ++j)
489 locPrec2D(i, j) = locPrec(i, j);
494 TVectorD locRes2D = locRes.GetSub(3, 4);
495 TMatrixD locDerivs2D = (extProjection * der).GetSub(3, 4, 0, 2);
499 daughters[0].first[0].addMeasurement(locRes2D, locPrec2D);
501 daughters[0].first[0].addGlobals(lab, locDerivs2D);
504 gbl::GblTrajectory combined(daughters);
508 combined.fit(chi2, ndf, lostWeight);
518 B2RESULT(
"Beam vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
522 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, vertexPrec);
524 combined.fit(chi2, ndf, lostWeight);
535 B2RESULT(
"Beam vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
547 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
549 auto mother = list->getParticle(iParticle);
551 if (track12.size() != 2) {
552 B2ERROR(
"Did not get 2 fitted tracks. Skipping this mother.");
557 double motherMass = mother->getPDGMass();
558 double motherWidth = pdgdb->GetParticle(mother->getPDGCode())->Width();
563 if (motherWidth == 0.) {
565 B2WARNING(
"Using artificial width for " << pdgdb->GetParticle(mother->getPDGCode())->GetName() <<
" : " << motherWidth <<
" GeV");
569 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
571 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
572 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
574 TMatrixDSym massPrec(1); massPrec(0, 0) = 1. / motherWidth / motherWidth;
575 TVectorD massResidual(1); massResidual = - (mother->getMass() - motherMass);
577 TVectorD extMeasurements(1);
578 extMeasurements[0] = massResidual[0];
580 TMatrixD extDeriv(1, 9);
584 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, massPrec);
586 combined.fit(chi2, ndf, lostWeight);
598 B2RESULT(
"Mass(PDG) + vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
612 double motherMass = beam->getMass();
613 double motherWidth =
sqrt((beam->getCovHER() + beam->getCovLER())(0, 0));
617 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
619 auto mother = list->getParticle(iParticle);
621 if (track12.size() != 2) {
622 B2ERROR(
"Did not get 2 fitted tracks. Skipping this mother.");
627 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
629 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
630 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
632 TMatrixDSym massPrec(1); massPrec(0, 0) = 1. / motherWidth / motherWidth;
633 TVectorD massResidual(1); massResidual = - (mother->getMass() - motherMass);
635 TVectorD extMeasurements(1);
636 extMeasurements[0] = massResidual[0];
638 TMatrixD extDeriv(1, 9);
642 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, massPrec);
644 combined.fit(chi2, ndf, lostWeight);
654 B2RESULT(
"Mass constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
668 double motherMass = beam->getMass();
669 double motherWidth =
sqrt((beam->getCovHER() + beam->getCovLER())(0, 0));
673 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
675 auto mother = list->getParticle(iParticle);
677 if (track12.size() != 2) {
678 B2ERROR(
"Did not get 2 fitted tracks. Skipping this mother.");
683 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
685 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
686 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
691 TMatrixDSym massPrec(1); massPrec(0, 0) = 1. / motherWidth / motherWidth;
692 TVectorD massResidual(1); massResidual = - (mother->getMass() - motherMass);
694 TMatrixDSym extPrec(4); extPrec.Zero();
695 extPrec.SetSub(0, 0, vertexPrec);
696 extPrec(3, 3) = massPrec(0, 0);
698 TVectorD extMeasurements(4);
699 extMeasurements[0] = vertexResidual[0];
700 extMeasurements[1] = vertexResidual[1];
701 extMeasurements[2] = vertexResidual[2];
702 extMeasurements[3] = massResidual[0];
704 TMatrixD extDeriv(4, 9);
711 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, extPrec);
713 combined.fit(chi2, ndf, lostWeight);
725 B2RESULT(
"Mass + vertex constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
731 B2WARNING(
"This should NOT be used for production of calibration constants for the real detector (yet)!");
740 double M = beam->getMass();
741 double E_HER = beam->getHER().E();
742 double E_LER = beam->getLER().E();
744 double pz = beam->getHER().Pz() + beam->getLER().Pz();
745 double E = (beam->getHER() + beam->getLER()).E();
747 double motherMass = beam->getMass();
748 double motherWidth =
sqrt((E_HER / M) * (E_HER / M) * beam->getCovLER()(0, 0) + (E_LER / M) * (E_LER / M) * beam->getCovHER()(0,
753 for (
unsigned int iParticle = 0; iParticle < list->getListSize(); ++iParticle) {
755 B2WARNING(
"Two body decays with full kinematic constraint not yet correct - need to resolve strange covariance provided by BeamParameters!");
757 auto mother = list->getParticle(iParticle);
760 if (track12.size() != 2) {
761 B2ERROR(
"Did not get exactly 2 fitted tracks. Skipping this mother in list " << listName);
766 std::vector<std::pair<std::vector<gbl::GblPoint>, TMatrixD> > daughters;
768 daughters.push_back({gbl->collectGblPoints(track12[0], track12[0]->getCardinalRep()), dfdextPlusMinus.first});
769 daughters.push_back({gbl->collectGblPoints(track12[1], track12[1]->getCardinalRep()), dfdextPlusMinus.second});
771 TMatrixDSym extCov(7); extCov.Zero();
780 TMatrixD dBoost_dVect(3, 3);
781 dBoost_dVect(0, 0) = 0.; dBoost_dVect(0, 1) = 1. / pz; dBoost_dVect(0, 2) = 0.;
782 dBoost_dVect(1, 0) = 0.; dBoost_dVect(1, 1) = 0.; dBoost_dVect(1, 2) = 1. / pz;
783 dBoost_dVect(2, 0) = pz /
E; dBoost_dVect(2, 1) = 0.; dBoost_dVect(2, 2) = 0.;
785 TMatrixD dVect_dBoost(3, 3);
786 dVect_dBoost(0, 0) = 0.; dVect_dBoost(0, 1) = 0.; dVect_dBoost(0, 2) =
E / pz;
787 dVect_dBoost(1, 0) = pz; dVect_dBoost(1, 1) = 0.; dVect_dBoost(1, 2) = 0.;
788 dVect_dBoost(2, 0) = 0.; dVect_dBoost(2, 1) = pz; dVect_dBoost(2, 2) = 0.;
790 TMatrixD covBoost(3, 3);
791 for (
int i = 0; i < 3; ++i) {
792 for (
int j = i; j < 3; ++j) {
793 covBoost(j, i) = covBoost(i, j) = (beam->getCovHER() + beam->getCovLER())(i, j);
799 if (covBoost(1, 1) == 0.) covBoost(1, 1) = 1.e-4;
800 if (covBoost(2, 2) == 0.) covBoost(2, 2) = 1.e-4;
802 TMatrixD covVect = dBoost_dVect * covBoost * dVect_dBoost;
804 extCov.SetSub(3, 3, covVect);
806 extCov(6, 6) = motherWidth * motherWidth;
807 auto extPrec = extCov; extPrec.Invert();
809 TVectorD extMeasurements(7);
813 extMeasurements[3] = - (
B2Vector3D(mother->getMomentum()) - (beam->getHER().Vect() + beam->getLER().Vect()))[0];
814 extMeasurements[4] = - (
B2Vector3D(mother->getMomentum()) - (beam->getHER().Vect() + beam->getLER().Vect()))[1];
815 extMeasurements[5] = - (
B2Vector3D(mother->getMomentum()) - (beam->getHER().Vect() + beam->getLER().Vect()))[2];
816 extMeasurements[6] = - (mother->getMass() - motherMass);
818 B2INFO(
"mother mass = " << mother->getMass() <<
" and beam mass = " << beam->getMass());
820 TMatrixD extDeriv(7, 9);
834 B2WARNING(
"Primary vertex+kinematics calibration not (yet?) fully implemented!");
835 B2WARNING(
"This code is highly experimental and has (un)known issues!");
838 TMatrixD derivatives(9, 6);
839 std::vector<int> labels;
843 derivatives(0, 0) = 1.;
844 derivatives(1, 1) = 1.;
845 derivatives(2, 2) = 1.;
847 labels.push_back(label.setParameterId(1));
848 labels.push_back(label.setParameterId(2));
849 labels.push_back(label.setParameterId(3));
857 derivatives(3, 3) = mother->getMomentumMagnitude();
858 derivatives(4, 4) = mother->getMomentumMagnitude();
859 derivatives(8, 5) = (beam->getLER().
E() + beam->getHER().E()) / beam->getMass();
862 labels.push_back(label.setParameterId(4));
863 labels.push_back(label.setParameterId(5));
864 labels.push_back(label.setParameterId(6));
878 std::vector<int> lab(globals); TMatrixD der(globals);
881 TMatrixD dTwoBody_dExt(9, 7);
882 dTwoBody_dExt.Zero();
884 dTwoBody_dExt(0, 0) = 1.;
885 dTwoBody_dExt(1, 1) = 1.;
886 dTwoBody_dExt(2, 2) = 1.;
888 dTwoBody_dExt(3, 3) = 1.;
889 dTwoBody_dExt(4, 4) = 1.;
890 dTwoBody_dExt(5, 5) = 1.;
892 dTwoBody_dExt(8, 6) = 1.;
894 const TMatrixD dLocal_dExt = dfdextPlusMinus.first * dTwoBody_dExt;
895 TMatrixD dLocal_dExt_T = dLocal_dExt; dLocal_dExt_T.T();
904 TDecompSVD svd(dLocal_dExt_T);
905 TMatrixD dExt_dLocal = svd.Invert().T();
922 for (
int i = 0; i < 7; ++i) {
923 for (
int j = 0; j < 5; ++j) {
924 if (fabs(dExt_dLocal(i, j)) < 1.e-6)
925 dExt_dLocal(i, j) = 0.;
928 const TVectorD locRes = dLocal_dExt * extMeasurements;
929 const TMatrixD locPrec = dLocal_dExt * extPrec * dExt_dLocal;
931 TMatrixDSym locPrecSym(5); locPrecSym.Zero();
932 for (
int i = 0; i < 5; ++i) {
933 for (
int j = i; j < 5; ++j) {
935 locPrecSym(j, i) = locPrecSym(i, j) = (fabs(locPrec(i, j)) > 1.e-6) ? locPrec(i, j) : 0.;
939 daughters[0].first[0].addMeasurement(locRes, locPrecSym);
941 daughters[0].first[0].addGlobals(lab, dfdextPlusMinus.first * der);
949 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, extPrec);
953 combined.fit(chi2, ndf, lostWeight);
963 B2RESULT(
"Full kinematic-constrained fit (calibration version) results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
969 gbl::GblTrajectory combined(daughters, extDeriv, extMeasurements, extPrec);
973 combined.fit(chi2, ndf, lostWeight);
983 B2RESULT(
"Full kinematic-constrained fit results NDF = " << ndf <<
" Chi2/NDF = " << chi2 /
double(ndf));
1062 auto relatedRecoHitInformation =
1067 if (recoHitInformation.getFlag() == RecoHitInformation::c_pruned) {
1068 B2FATAL(
"Found pruned point in RecoTrack. Pruned tracks cannot be used in MillepedeCollector.");
1071 if (recoHitInformation.getTrackingDetector() != RecoHitInformation::c_CDC)
continue;
1077 auto kalmanFitterInfo =
dynamic_cast<genfit::KalmanFitterInfo*
>(trackPoint->getFitterInfo());
1078 if (not kalmanFitterInfo) {
1081 std::vector<double> weights = kalmanFitterInfo->getWeights();
1082 if (weights.size() == 2) {
1083 if (weights.at(0) > weights.at(1))
1084 recoHitInformation.setRightLeftInformation(RecoHitInformation::c_left);
1085 else if (weights.at(0) < weights.at(1))
1086 recoHitInformation.setRightLeftInformation(RecoHitInformation::c_right);
1088 double weightLR = weights.at(0) + weights.at(1);
1090 sumCDCWeights += weightLR - 1.;
1102 B2ERROR(
"Error in checking DAF weights from previous fit to resolve hit ambiguity. Why? Failed fit points in DAF? Skip track to be sure.");
1106 std::shared_ptr<genfit::GblFitter> gbl(
new genfit::GblFitter());
1120 genfit::MeasurementFactory<genfit::AbsMeasurement> genfitMeasurementFactory;
1124 genfit::MeasurementProducer <RecoHitInformation::UsedPXDHit, AlignablePXDRecoHit>* PXDProducer =
new genfit::MeasurementProducer
1126 genfitMeasurementFactory.addProducer(Const::PXD, PXDProducer);
1130 genfit::MeasurementProducer <RecoHitInformation::UsedSVDHit, AlignableSVDRecoHit>* SVDProducer =
new genfit::MeasurementProducer
1132 genfitMeasurementFactory.addProducer(Const::SVD, SVDProducer);
1136 genfit::MeasurementProducer <RecoHitInformation::UsedCDCHit, AlignableCDCRecoHit>* CDCProducer =
new genfit::MeasurementProducer
1138 genfitMeasurementFactory.addProducer(Const::CDC, CDCProducer);
1142 genfit::MeasurementProducer <RecoHitInformation::UsedBKLMHit, AlignableBKLMRecoHit>* BKLMProducer =
new genfit::MeasurementProducer
1144 genfitMeasurementFactory.addProducer(Const::BKLM, BKLMProducer);
1148 genfit::MeasurementProducer <RecoHitInformation::UsedEKLMHit, AlignableEKLMRecoHit>* EKLMProducer =
new genfit::MeasurementProducer
1150 genfitMeasurementFactory.addProducer(Const::EKLM, EKLMProducer);
1155 std::vector<std::shared_ptr<PXDBaseMeasurementCreator>> pxdMeasurementCreators = { std::shared_ptr<PXDBaseMeasurementCreator>(
new PXDCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1156 std::vector<std::shared_ptr<SVDBaseMeasurementCreator>> svdMeasurementCreators = { std::shared_ptr<SVDBaseMeasurementCreator>(
new SVDCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1159 std::vector<std::shared_ptr<CDCBaseMeasurementCreator>> cdcMeasurementCreators = { std::shared_ptr<CDCBaseMeasurementCreator>(
new CDCCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1160 std::vector<std::shared_ptr<BKLMBaseMeasurementCreator>> bklmMeasurementCreators = { std::shared_ptr<BKLMBaseMeasurementCreator>(
new BKLMCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1161 std::vector<std::shared_ptr<EKLMBaseMeasurementCreator>> eklmMeasurementCreators = { std::shared_ptr<EKLMBaseMeasurementCreator>(
new EKLMCoordinateMeasurementCreator(genfitMeasurementFactory)) };
1164 std::vector<std::shared_ptr<BaseMeasurementCreator>> additionalMeasurementCreators = {};
1165 factory.
resetMeasurementCreators(pxdMeasurementCreators, svdMeasurementCreators, cdcMeasurementCreators, bklmMeasurementCreators,
1166 eklmMeasurementCreators, additionalMeasurementCreators);
1173 currentPdgCode = particle->getPDGCode();
1176 gfTrack.setCardinalRep(gfTrack.getIdForRep(trackRep));
1179 B2Vector3D vertexPos = particle->getVertex();
1180 B2Vector3D vertexMom = particle->getMomentum();
1181 gfTrack.setStateSeed(vertexPos, vertexMom);
1183 genfit::StateOnPlane vertexSOP(gfTrack.getCardinalRep());
1184 B2Vector3D vertexRPhiDir(vertexPos[0], vertexPos[1], 0);
1189 genfit::SharedPlanePtr vertexPlane(
new genfit::DetPlane(vertexPos, vertexMom));
1191 vertexSOP.setPlane(vertexPlane);
1192 vertexSOP.setPosMom(vertexPos, vertexMom);
1193 TMatrixDSym vertexCov(5);
1194 vertexCov.UnitMatrix();
1198 genfit::MeasuredStateOnPlane mop(vertexSOP, vertexCov);
1199 genfit::FullMeasurement* vertex =
new genfit::FullMeasurement(mop, Const::IR);
1200 gfTrack.insertMeasurement(vertex, 0);
1204 for (
unsigned int i = 0; i < gfTrack.getNumPoints() - 1; ++i) {
1207 genfit::PlanarMeasurement* planarMeas1 =
dynamic_cast<genfit::PlanarMeasurement*
>(gfTrack.getPointWithMeasurement(
1208 i)->getRawMeasurement(0));
1209 genfit::PlanarMeasurement* planarMeas2 =
dynamic_cast<genfit::PlanarMeasurement*
>(gfTrack.getPointWithMeasurement(
1210 i + 1)->getRawMeasurement(0));
1212 if (planarMeas1 != NULL && planarMeas2 != NULL &&
1213 planarMeas1->getDetId() == planarMeas2->getDetId() &&
1214 planarMeas1->getPlaneId() != -1 &&
1215 planarMeas1->getPlaneId() == planarMeas2->getPlaneId()) {
1222 if (hit1->
isU() && !hit2->
isU()) {
1225 }
else if (!hit1->
isU() && hit2->
isU()) {
1233 gfTrack.insertMeasurement(hit, i);
1235 gfTrack.deletePoint(i + 1);
1236 gfTrack.deletePoint(i + 1);
1240 }
catch (std::exception& e) {
1242 B2ERROR(
"SVD Cluster combination failed. This is symptomatic of pruned tracks. MillepedeCollector cannot process pruned tracks.");
1247 gbl->processTrackWithRep(&gfTrack, gfTrack.getCardinalRep(),
true);
1248 }
catch (genfit::Exception& e) {
1252 B2ERROR(
"GBL fit failed.");
1310 std::vector<TMatrixD> result;
1312 double px = mother.
getPx();
1313 double py = mother.
getPy();
1314 double pz = mother.
getPz();
1315 double pt =
sqrt(px * px + py * py);
1317 double M = motherMass;
1321 || m != mother.
getDaughter(1)->
getPDGMass()) B2FATAL(
"Only two same-mass daughters (V0->f+f- decays) allowed.");
1324 TMatrixD mother2lab(3, 3);
1325 mother2lab(0, 0) = px * pz / pt / p; mother2lab(0, 1) = - py / pt; mother2lab(0, 2) = px / p;
1326 mother2lab(1, 0) = py * pz / pt / p; mother2lab(1, 1) = px / pt; mother2lab(1, 2) = py / p;
1327 mother2lab(2, 0) = - pt / p; mother2lab(2, 1) = 0; mother2lab(2, 2) = pz / p;
1328 ROOT::Math::Rotation3D lab2mother;
1329 lab2mother.SetRotationMatrix(mother2lab); lab2mother.Invert();
1337 auto mom1 = lab2mother * boostedFrame.
getMomentum(fourVector1).Vect();
1338 auto mom2 = lab2mother * boostedFrame.
getMomentum(fourVector2).Vect();
1341 auto avgMom = 0.5 * (mom1 - mom2);
1342 if (avgMom.Z() < 0.) {
1348 double theta = atan2(avgMom.rho(), avgMom.Z());
1349 double phi = atan2(avgMom.Y(), avgMom.X());
1350 if (phi < 0.) phi += 2. * TMath::Pi();
1352 double alpha = M / 2. / m;
1353 double c1 = m *
sqrt(alpha * alpha - 1.);
1354 double c2 = 0.5 *
sqrt((alpha * alpha - 1.) / alpha / alpha * (p * p + M * M));
1356 double p3 = p * p * p;
1357 double pt3 = pt * pt * pt;
1363 TMatrixD
R = mother2lab;
1364 B2Vector3D P(sign * c1 * sin(theta) * cos(phi),
1365 sign * c1 * sin(theta) * sin(phi),
1366 p / 2. + sign * c2 * cos(theta));
1368 TMatrixD dRdpx(3, 3);
1369 dRdpx(0, 0) = - pz * (pow(px, 4.) - pow(py, 4.) - py * py * pz * pz) / pt3 / p3;
1370 dRdpx(0, 1) = px * py / pt3;
1371 dRdpx(0, 2) = (py * py + pz * pz) / p3;
1373 dRdpx(1, 0) = - px * py * pz * (2. * px * px + 2. * py * py + pz * pz) / pt3 / p3;
1374 dRdpx(1, 1) = - py * py / pt3;
1375 dRdpx(1, 2) = px * py / p3;
1377 dRdpx(2, 0) = - px * pz * pz / pt / p3;
1379 dRdpx(2, 2) = - px * pz / p3;
1381 TMatrixD dRdpy(3, 3);
1382 dRdpy(0, 0) = - px * py * pz * (2. * px * px + 2. * py * py + pz * pz) / pt3 / p3;
1383 dRdpy(0, 1) = - px * px / pt3;
1384 dRdpy(0, 2) = px * pz / p3;
1386 dRdpy(1, 0) = - pz * (- pow(px, 4.) - px * px * pz * pz + pow(py, 4.)) / pt3 / p3;
1387 dRdpy(1, 1) = px * py / pt3;
1388 dRdpy(1, 2) = (px * px + pz * pz) / p3;
1390 dRdpy(2, 0) = - py * pz * pz / pt / p3;
1392 dRdpy(2, 2) = - py * pz / p3;
1394 TMatrixD dRdpz(3, 3);
1395 dRdpz(0, 0) = px * pt / p3;
1397 dRdpz(0, 2) = - px * pz / p3;
1399 dRdpz(1, 0) = py * pt / p3;
1401 dRdpz(1, 2) = py * pz / p3;
1403 dRdpz(2, 0) = pz * pt / p3;
1405 dRdpz(2, 2) = (px * px + py * py) / p3;
1407 auto K = 1. / 2. / p + sign * cos(theta) * m * m * (M * M / 4. / m / m - 1.) / M / M /
sqrt(m * m * (M * M / 4. / m / m - 1.) *
1408 (M * M + p * p) / M / M);
1415 sign * c1 * cos(theta) * sin(phi),
1416 sign * c2 * (- sin(theta)));
1420 sign * c1 * sin(theta) * cos(phi),
1423 double dc1dM = m * M / (2. *
sqrt(M * M - 4. * m * m));
1424 double dc2dM = M * (4. * m * m * p * p + pow(M, 4)) / (2 * M * M * M *
sqrt((M * M - 4. * m * m) * (p * p + M * M)));
1427 sign * sin(theta) * sin(phi) * dc1dM,
1428 sign * cos(theta) * dc2dM);
1430 TMatrixD dpdz(3, 6);
1431 dpdz(0, 0) = dpdpx(0); dpdz(0, 1) = dpdpy(0); dpdz(0, 2) = dpdpz(0); dpdz(0, 3) = dpdtheta(0); dpdz(0, 4) = dpdphi(0);
1432 dpdz(0, 5) = dpdM(0);
1433 dpdz(1, 0) = dpdpx(1); dpdz(1, 1) = dpdpy(1); dpdz(1, 2) = dpdpz(1); dpdz(1, 3) = dpdtheta(1); dpdz(1, 4) = dpdphi(1);
1434 dpdz(1, 5) = dpdM(1);
1435 dpdz(2, 0) = dpdpx(2); dpdz(2, 1) = dpdpy(2); dpdz(2, 2) = dpdpz(2); dpdz(2, 3) = dpdtheta(2); dpdz(2, 4) = dpdphi(2);
1436 dpdz(2, 5) = dpdM(2);
1440 TMatrixD dfdvz(5, 9);
1441 dfdvz.SetSub(0, 0, dqdv);
1442 dfdvz.SetSub(0, 3, dqdp * dpdz);
1444 result.push_back(dfdvz);
1450 return {result[0], result[1]};