752 {
753
760
761
762
763 if (derivativeFlag != 0) {
764 const double weight = measurement.weight();
765 const Amg::Vector3D& driftDirection = measurement.minimizationDirection();
766 const double xDrift = driftDirection.x();
767 const double yDrift = driftDirection.y();
768
769
770 if (
m_parameters->fitEnergyDeposit() && measurement.afterCalo()) {
773 measurement.derivative(
778 measurement.derivative(
780 }
781
782 if (measurement.numericalDerivative()) {
785 measurement.derivative(
787
788
789
790
793 measurement.derivative(
795
796
797
798
799 } else if (
801
802
803
804
805
806 && !measurement.isPseudo()) {
807 measurement.derivative(
D0, 0.);
808 measurement.derivative(
Phi0, 0.);
809 } else {
810 measurement.derivative(
812 measurement.derivative(
813 Phi0, weight * (xDistance * yDrift - yDistance * xDrift));
814 }
815
816 measurement.derivative(
Z0, weight * driftDirection.z());
817 measurement.derivative(
Theta0, weight * driftDirection.z() * rDistance);
818
819
820
821 unsigned param =
m_parameters->firstScatteringParameter();
822 std::vector<FitMeasurement*>::const_iterator
s =
m_scatterers.begin();
823 while (++param < measurement.lastParameter()) {
826 const double xDistScat =
827 intersection.position().x() - scatteringCentre.position().x();
828 const double yDistScat =
829 intersection.position().y() - scatteringCentre.position().y();
830 const double rDistScat = -(scatteringCentre.direction().
x() * xDistScat +
831 scatteringCentre.direction().y() * yDistScat) /
832 (scatteringCentre.direction().
perp2() *
833 scatteringCentre.direction().perp());
834 measurement.derivative(
835 param, weight * (xDistScat * yDrift - yDistScat * xDrift));
836 measurement.derivative(++param, weight * driftDirection.z() * rDistScat);
838 }
839
840
841 if (measurement.alignmentParameter()) {
842 param = measurement.alignmentParameter();
846
847
850 double xDistance =
851 intersection.position().x() - alignmentCentre.position().x();
852 double yDistance =
853 intersection.position().y() - alignmentCentre.position().y();
854 double rDistance = -(alignmentCentre.direction().
x() * xDistance +
855 alignmentCentre.direction().y() * yDistance) /
856 (alignmentCentre.direction().
perp2() *
857 alignmentCentre.direction().perp());
858 measurement.derivative(param, weight * driftDirection.z() * rDistance);
859
860
861
862 double projection = 0;
863 const Surface& surface = *fm->surface();
864 if (std::abs(surface.normal().z()) > 0.5) {
865 projection = (driftDirection.x() * surface.center().x() +
866 driftDirection.y() * surface.center().y()) /
867 surface.center().perp();
868 } else {
869 projection = driftDirection.z();
870 }
871 measurement.derivative(++param, weight * projection);
872
873 if (measurement.alignmentParameter2()) {
874 param = measurement.alignmentParameter2();
878
879
882 xDistance =
883 intersection.position().x() - alignmentCentre.position().x();
884 yDistance =
885 intersection.position().y() - alignmentCentre.position().y();
886 rDistance = -(alignmentCentre.direction().
x() * xDistance +
887 alignmentCentre.direction().y() * yDistance) /
888 (alignmentCentre.direction().
perp2() *
889 alignmentCentre.direction().perp());
890 measurement.derivative(param, weight * driftDirection.z() * rDistance);
891
892
893
894 const Surface& surface = *fm->surface();
895 if (surface.normal().dot(surface.center().unit()) < 0.5) {
896 projection = driftDirection.z();
897 } else {
898 projection = (driftDirection.x() * surface.center().x() +
899 driftDirection.y() * surface.center().y()) /
900 surface.center().perp();
901 }
902 measurement.derivative(++param, weight * projection);
903 }
904 }
905 }
906
907
908 if (derivativeFlag == 1)
909 return;
910 const double weight = measurement.weight2();
911 const Amg::Vector3D& wireDirection = measurement.sensorDirection();
912 const double xWire = wireDirection.x();
913 const double yWire = wireDirection.y();
914
915
916 if (
m_parameters->fitEnergyDeposit() && measurement.afterCalo()) {
919 measurement.derivative2(
924 measurement.derivative2(
926 }
927
928 if (measurement.numericalDerivative()) {
931 measurement.derivative2(
933
934
935
938 measurement.derivative2(
940
941
942
943 } else {
944 measurement.derivative2(
D0,
946 measurement.derivative2(
Phi0,
947 weight * (xDistance * yWire - yDistance * xWire));
948 }
949
950 measurement.derivative2(
Z0, weight * wireDirection.z());
951 measurement.derivative2(
Theta0, weight * wireDirection.z() * rDistance);
952
953
954
955 unsigned param =
m_parameters->firstScatteringParameter();
956 std::vector<FitMeasurement*>::const_iterator
s =
m_scatterers.begin();
957 while (++param < measurement.lastParameter()) {
960 const double xDistScat =
961 intersection.position().x() - scatteringCentre.position().x();
962 const double yDistScat =
963 intersection.position().y() - scatteringCentre.position().y();
964 const double rDistScat = -(scatteringCentre.direction().
x() * xDistScat +
965 scatteringCentre.direction().y() * yDistScat) /
966 (scatteringCentre.direction().
perp2() *
967 scatteringCentre.direction().perp());
968 measurement.derivative2(param,
969 weight * (xDistScat * yWire - yDistScat * xWire));
970 measurement.derivative2(++param, weight * wireDirection.z() * rDistScat);
972 }
973}