From 45e07d7134c8d8e657fb6b21e50ccaaf992b42af Mon Sep 17 00:00:00 2001 From: Andreas Stefl Date: Fri, 22 Sep 2023 22:11:26 +0200 Subject: [PATCH] refactor!: Disambiguate surface intersection solutions (#2336) Currently our intersection call can give an alternative solution but it is not clear which one is to be preferred in which situation and the results are unstable meaning that it could be swapped depending on where you are on the ray. Here I try to make the interface cleaner and the intersection order stable. blocked by - https://github.com/acts-project/acts/pull/2366 - https://github.com/acts-project/acts/pull/2368 --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Benjamin Huth <37871400+benjaminhuth@users.noreply.github.com> Co-authored-by: Benjamin Huth Co-authored-by: Paul Gessinger --- .../reference/performance_ambi_ttbar.root | Bin 38443 -> 38424 bytes ...erformance_amvf_gridseeder_ttbar_hist.root | Bin 38952 -> 39268 bytes .../performance_amvf_ttbar_hist.root | Bin 39533 -> 39583 bytes .../performance_ckf_truth_smeared.root | Bin 34295 -> 34300 bytes .../reference/performance_ckf_ttbar.root | Bin 38952 -> 39013 bytes .../performance_ivf_truth_smeared_hist.root | Bin 42930 -> 42961 bytes .../tracksummary_ckf_truth_smeared_hist.root | Bin 40310 -> 40287 bytes .../Acts/Geometry/ApproachDescriptor.hpp | 13 +- .../Geometry/GenericApproachDescriptor.hpp | 19 +- Core/include/Acts/Geometry/TrackingVolume.hpp | 7 +- .../Navigation/NavigationStateFillers.hpp | 4 +- .../Navigation/SurfaceCandidatesUpdators.hpp | 19 +- Core/include/Acts/Propagator/AtlasStepper.hpp | 7 +- Core/include/Acts/Propagator/EigenStepper.hpp | 7 +- .../Acts/Propagator/MultiEigenStepperLoop.hpp | 25 +- .../Acts/Propagator/MultiEigenStepperLoop.ipp | 3 +- .../Acts/Propagator/MultiStepperAborters.hpp | 16 +- Core/include/Acts/Propagator/Navigator.hpp | 55 ++-- .../Acts/Propagator/StandardAborters.hpp | 59 ++-- .../Acts/Propagator/StraightLineStepper.hpp | 7 +- .../Acts/Propagator/detail/SteppingHelper.hpp | 27 +- Core/include/Acts/Surfaces/ConeSurface.hpp | 4 +- .../include/Acts/Surfaces/CylinderSurface.hpp | 2 +- Core/include/Acts/Surfaces/DiscSurface.hpp | 4 +- Core/include/Acts/Surfaces/LineSurface.hpp | 2 +- Core/include/Acts/Surfaces/PlaneSurface.hpp | 4 +- Core/include/Acts/Surfaces/Surface.hpp | 6 +- .../Acts/Surfaces/detail/PlanarHelper.hpp | 2 +- .../CombinatorialKalmanFilter.hpp | 21 +- .../Acts/TrackFitting/GaussianSumFitter.hpp | 3 +- .../Acts/TrackFitting/KalmanFitter.hpp | 27 +- Core/include/Acts/Utilities/Intersection.hpp | 307 ++++++++++++------ .../Acts/Vertexing/HelicalTrackLinearizer.ipp | 8 +- .../Acts/Vertexing/ImpactPointEstimator.ipp | 8 +- .../Vertexing/NumericalTrackLinearizer.ipp | 22 +- Core/src/Digitization/PlanarModuleStepper.cpp | 39 ++- .../CorrectedTransformationFreeToBound.cpp | 9 +- .../Geometry/GenericApproachDescriptor.cpp | 28 +- Core/src/Geometry/Layer.cpp | 71 ++-- Core/src/Geometry/TrackingVolume.cpp | 99 +++--- Core/src/Surfaces/ConeSurface.cpp | 27 +- Core/src/Surfaces/CylinderSurface.cpp | 25 +- Core/src/Surfaces/DiscSurface.cpp | 18 +- Core/src/Surfaces/IntersectionHelper2D.cpp | 20 +- Core/src/Surfaces/LineSurface.cpp | 8 +- Core/src/Surfaces/PlaneSurface.cpp | 14 +- .../Performance/VertexPerformanceWriter.cpp | 10 +- .../Io/Root/src/RootMaterialTrackWriter.cpp | 12 +- .../Root/src/RootTrajectorySummaryWriter.cpp | 8 +- Examples/Python/tests/root_file_hashes.txt | 12 +- Fatras/src/Digitization/Channelizer.cpp | 4 +- Fatras/src/Digitization/PlanarSurfaceMask.cpp | 22 +- .../CorrectedTransformFreeToBoundTests.cpp | 6 +- .../Core/Geometry/BVHDataTestCase.hpp | 16 +- .../GenericApproachDescriptorTests.cpp | 32 +- .../Core/Propagator/AtlasStepperTests.cpp | 16 +- .../Core/Propagator/EigenStepperTests.cpp | 22 +- .../Core/Propagator/NavigatorTests.cpp | 4 +- .../Core/Propagator/PropagatorTests.cpp | 3 +- .../Propagator/StraightLineStepperTests.cpp | 16 +- .../Core/Surfaces/CylinderSurfaceTests.cpp | 18 +- .../Core/Surfaces/DiscSurfaceTests.cpp | 13 +- .../Surfaces/IntersectionHelper2DTests.cpp | 52 +-- .../Core/Surfaces/LineSurfaceTests.cpp | 25 +- .../Core/Surfaces/PlaneSurfaceTests.cpp | 14 +- .../Surfaces/SurfaceIntersectionTests.cpp | 183 +++++------ Tests/UnitTests/Core/Surfaces/SurfaceStub.hpp | 13 +- .../Core/TrackFitting/FitterTestsCommon.hpp | 5 +- .../TrackFitting/GsfComponentMergingTests.cpp | 5 +- .../Core/TrackFitting/KalmanFitterTests.cpp | 4 +- .../Core/Utilities/IntersectionTests.cpp | 153 +++------ .../GridDensityVertexFinderTests.cpp | 15 +- .../Vertexing/ImpactPointEstimatorTests.cpp | 6 +- .../TrackDensityVertexFinderTests.cpp | 5 +- 74 files changed, 916 insertions(+), 824 deletions(-) diff --git a/CI/physmon/reference/performance_ambi_ttbar.root b/CI/physmon/reference/performance_ambi_ttbar.root index 3af6352a0d6aaf806952c9f73d3e47f04f40043c..54fc2edb994463c4dd4eef8ba41f04a6dbb56bc3 100644 GIT binary patch delta 28676 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 diff --git a/CI/physmon/reference/performance_amvf_gridseeder_ttbar_hist.root b/CI/physmon/reference/performance_amvf_gridseeder_ttbar_hist.root index dd1dd619dca1f9b0c628d83ce31e050c07908e9d..3d2ea2f053410a6a3aade4440176cd92b184e68b 100644 GIT binary patch delta 20996 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

%#zBO}>WW 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 F7yuK51=;`r delta 20495 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

UuqkCcA8_qY0{4dXX(o`pWGFuGP=hG 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 diff --git a/CI/physmon/reference/performance_amvf_ttbar_hist.root b/CI/physmon/reference/performance_amvf_ttbar_hist.root index 132cd0ba3f574957b1b28b28ac7e8dabcb5caaca..831b4596c375b6c42f9b031639c8c6bced9951b5 100644 GIT binary patch delta 21658 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 delta 21724 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 D3hN|c diff --git a/CI/physmon/reference/performance_ckf_truth_smeared.root b/CI/physmon/reference/performance_ckf_truth_smeared.root index 2fd246e46784a0850fa7cfee87eb248c6e27d28d..1c058fd6e16a17ae97b3aa1fd422f6bfdc77674b 100644 GIT binary patch delta 25400 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

i2@$De;$%M0~e3B`X_JCUnU9d5*5q_e%61C9#I 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 diff --git a/CI/physmon/reference/performance_ckf_ttbar.root b/CI/physmon/reference/performance_ckf_ttbar.root index 83309ec75e6bb9d13ec6db068332ceedb15aef65..b778d24f56843c41c39540c0c195b33102feafbc 100644 GIT binary patch delta 31074 zcma&N1ymbP`1c#26e&{Np_CSAvEuGttT;uBI}~@8A_a=OJH@TIL$Tn2;_d{u;E-_J z-~Ybnz30j~H|NYIv%8bs=t>O)0-1q8spfwR;or}y ze+$yz;_&S6=I>5lZ4d~L5QNnH$QJ#X81E#t0U3l}(RmstPX7S}Dg*sH&D7b>=>R1A zU%S8G1p=XJ$XMH%zh!f^|N5^u+HvrIaCbCMFp46ME5|_pztlfiO$| zw*CA5?}q-pqHO=4*ZrR(|7(kU@b3mNQ~tKMOQ1v&0aB4cDVQKnq~qif6?N5@p~YkU2gMZ7N-l&vY`U9pd?@L!Ksd+Ta1&A6&6>KVK~}+m)}_ zwZ^_na^`iPUU13(e6MSTx#)XVmj2zY!RyR1+X7I2{Y)f48n3P6h0Oc3kDY{d5p+9x z;elDrvl)lBV}`{w^ynzh{9V4*n%3I5IqW;~*Ppp7W__oR;4xXG>uzuN7Wf0%Gt9Y zBKzooN=wfaRyQZ(eZ@xPo=fzZuf!CQA?eFSEHNL6OX=xMyleg*1q>x^PcN}%*W`*0 znrF=rl9syN*RnIxy27i4hS!)guGvi6P5Hj`ElCE|wB1yO0)};$C=FaYS3g`V`d_HM zhisOUw5I^K1KEzgDlOc?7e6odHq<@ZbGER6&z_<>r`Fymdplo0*5MlAV7wscaeuyU zsFd(WwG#D!wD}J5$4Zi_(R0_oYv1TaVf;-mQf@qXHj3u`K=Y-WcU{SE?fYSmk+i&H zHzpd7N)nMIvcnLzTK5-g)0X~^dr-mhbG=2RiUE;<8=(hl%xqfR3;(ZfA&xdV1u~|p z{Qei~&LM0?`HazB3YR1t1=w!4WiN7o_B1H)bK%s;{ww=u5C|pkzo?D=7qy^||73%5 zn-GUamB8|h9AHBMMgJGU8cK2+s)Qn2B~b~5v<;V7BXjNWWF(}R^y(8<%cV7>5;1lia%tj!yylFRXuHYuDTeX|+V{fN z{h?3U9;Yp6zePdj=r5ne+&=R{^5tG|<@-Z$d~g8pW$lMq^t#!rMZZ;f7R*WlAuW z@I@M`xP7QQb!-pX*=tWo5bn=o$A+3;C5t$mnL|>7yeW(VpCFCT<0LhV+%>|*hIzeF|v9!HMPF31@K5o+N+AxpbFt+aNuO7nA- zrw-l@`Kel1;bGJN9-XY;OEPGd|FAVI^8hL}zDO_MmRWWf|2>oYLW+1d>!b6b>+sNV z+Sc2y+%4L!a-J5J(S@!d#C$d#oalj}KjerExL9)l-hyeaxfa+K9p#N2RpOQ%Mc+m? zDXI;9sd?=C@*o@p#}3+ZERU$-;sfe_KlDfO4|Cdm72X=$Zy&r`6{`YxFP_>Z5M9)l zai*wRPC^%6T&CRcIooa6$L8^P&Ni)QeCnH+4||xntq)!cOoL;#qS;{ua2Ik+Uro!+w2$C|NBtdUiCtu3akP02f393TJ z$EF}p&gnl6E44!JU(lzDs~f+T!g9BjN>1RHInEibtJvB^O0Ilq`Z15c#4L0YlOw$n z)0QYbGKBA^%8JH)fCO^4M)ZzZ*!deIfbf8|Z)ZMRO2)x>Q@b_H`i39vOnzN3R^2h6 zXjR06#GWzRdqIPTa!tc|FV5O+w{pDw$$eKia}%r;31(XcoXki+08L9Afd$^P*7_H( z&T}lXv!9xS2#m|aNP^>p3bKv8EeI_LYFEh36;Vm2DkF>HS-2A_#Ag{`k=B)}xV3g2 z8ezlPdd!DpC0mO2xW96em9k{_r!d|8IU$IU)@cNNt>IkdlU`2m2IW!)dNT7pKx3bW@|0;_YNJ0hS;QxCrkk~6GY2JQiBVp^S?M`QMsi;Vl8LCy4 zNr`ePw5H@o{5*v8=(_<|B)NAccrJQ^g@G?R={f={lDHs6UD=HgLLcR|S zq(@(;&lc@2=LYdQda^<$(ht)qc&6<+1pGI|E4k_*A0G5iOBTp{a5M)(Vz-bw+AQbvu1}CLD=G=DK?Ek%OPs-Rc6FUTE_T8g8I&*y8zr^_-ggv6PTs zX?27x(lCW2SS`&X+Z^w6}Ee(W3~xVnL+eC$Ot}E9ejR(MR&GABeSn2s06(QJEzGWcI^-w;nYCZHxq-!xh*+&t2LDD zBh8$useKwH_;M|_>%GJlzjyVudrXH%?kfeK$>r4RBeK#|q19sH7s_N2p>F8}R)-G) z$0r1qb8Ks6{o~bFvzhcPludL$4_bY9=BkRGyV-v(kJGQHBA(NRJa~SD!*zC8Aj#C~ z>e4FIht!8^fH1I$E;B=N9#R$r%rU4X!J!@t5Q6HgSa zy#K_io+XCBzaskMlO*FCo$q|ZLd9diuJBsq4@3ASu~Zl?mQ?fajlVEp0kdb@$Y0H~mWs%}ojLqbcrVOYn(Y>U z@X%Q34bc5Uz^UcojPcVs#PaaPccs9Z!jUCJDgORN{Cx-BvwK{mF-fKgUptialnybN z%QLHNWdM0>?#)E|4rt5>X+o&#Svo`@*J}lttLqdr2BXcrLl9f7LW0)z6}oWudG?fNokkN{#Nn^Ua`| z+l_49;N195MUDntufvTZaCuHI4p&t7I6BJ>0KTbwXYHgm%x}wQ1iy^yqmgqvpvO$* zRORA8njLU@A^wWA=0k8vfLP|9d9tCg@qABh^H<_$c<78xu{-mI{I5`Ym`NDgdwRlt zwjr3uFOC>Yc1E}{#nM8Cnh$gC#4dK60v+_z&x)D-Sn}y{BhZ+spDl}}_0RQTcpL}x zvjACF<+02GFf)O=+!!F6@|`ZI=SuXmv4Ipn;A# zIjyBR90rdc#duX-_J!Q`cjE@bY`mzA0G7Am#eMce)yeY;zZR1P)kSn;xnUM*UUjLw z3!@q4yJMS=dK;A7PdU6JakN6@v=|56_HPeWPD#F&`IVHID$sUmlIE*z;yyO)LSWx9y(fuJKJ~=pWV5+qq_^V=X;_H6Tt! zFB6WMR_(O4YMzPq02Pe6;>)R-fwsk;Hh)xr-s)r@{`T+*h9kdkzB2A$oQh*vZd;9F zQuaR46C*IR-q#f4gQitLhd+CbC!Bt*LYZR=-Yt3{t-W4g1&_I@G(zq)^Zd%l&j5D2`r*yMUb10lFcIqY^%8+RFTTW@WhxNmTyWt)0} zKBCN8rxpJ-aH)R=F4_2>f$RQ5BW#ldyJ#suR}p>V8K_b6pNH$NI1*|SirSZ2lhXx8 zv6DM#BqGP*zC*8{=bWn4oW9uj5k^|F^p;1?y0u@!h_W2FGyFR#fl>PHA6|ST&jj%& zBooC?IXnYsez1_fR4bvIY!?s9r7Sq<(gK;gLmjLQx*X#&ewy9FxzvG9x7IBXOa&-R zD9xeni3hOn<%+&H00~nR#Xwz1>gotuU?H5R#N(r84`4O}PbN`Y10l;XwJBF)hif$l zR#EG*Qe`a%6K`i5XA@SV+*0q{I#^>k*f;c}r`4WkqUkHVZN?*Hf}2 zzAMvT%1dd-@-VM49PpQ!8HJrf2ipt`ej~-*g!_tZi^t^aDT1_LQV15Vfhvave_&m)*=T*zYd0;#u{EXnG~L3I(#K-Z5z=>Y=P zE!*T=u;&G{X_^Ad16zGC^b-GClX=6(219V**T8V;XJ4kKeQ#Ckunx&8nN}ea*IsEY z?5BPm-Jv$=RYuRQ^`JnD5E`O8r{4_En$Xje)>tpp0|ik%T3Q3?>9UEvV%7uJ4aF1Q zLBiUN&H~oO#S_FOU#FOc0z0TktX4&*K-hTGz zrrJ7oaz^B-XPExy8POmkz@3a{J)lN5Hm{x} zWQXpEk3EO9dxW8(+H-!!YLh25Rm^0Q(cfR%C$Qk?CF=;}l_5Jl0z8JDX>4)!tJy1A z5jeXDaBsg9iuaq^{`uQXhNNT86Eh9sQ_$qcpxYM$O@jziW(~=<69h%Qq8Gyd7RST! z%~4N47uLBTlUFSdl<@UUr9TJ_%5_}lIvp2*OY?E~8Aa8pGe*#TYg-W3r;AwYh{a=T zTNkX{`?%LEsF$C3Y*!O91RRABF33& zui73vGp?!SPD(fLeniY3HP-`f&;PVnj4SA{oL~#q-Zum8Mmd*vhQe$;HcP@eJr~4W ztYeT@7Crk@k62*6iIT+sDo!5FPWvV1Sg*RD?-eDKYqWlp{p6P=pmbnzewzPh=}^>A zEv(Do3A*T|sW8j_XOvC)>wV(dP7m7Jh;ugi8AwwR)t(n< z($b;+oZImV3GBu}gP(IC^7`UnXXnQ&It@P2*cgZ4=aT8ec2YH6W~}Vnl&V-Ry9G5D zPxg@$aqdYOPHgURbIYg2faArX-e;P;0$qO*U~8{n6TCX}F`2x{-Y4qD-dyFuim8&< zVd<`rLzIGs%wFY6Bqi8nO}~Y$f70uTpk4O&2PjRaR zCv|94qct@NWEU=Pmno%6!RPT=`6iL`DRytL1VtYagBgaeo>xQELxnZZX9p>Mj zqRBry#4k#y!B+vMpMg66^FloXJ0fX95jdxksT2#X$+K#_xE#<-ppNd*!qN+=;N%5vHppwPy4ia4;nrqr=dii`fQ69$t|`@QL`8H|XDj|~XNE| zZDnQlgf)xSqm$oqoZn?PV<9VJ6)6wuVI?(>px{yk{7}>Ja&Zs#Xp)`>>^5xm55cCO zI4MPF5Nuo`28AFa<*b$uZWj5?r8kfB3mZerb961%#JYx%b`!w5}{A^|=si=OeSs!lAZ88@kYP0O=e^)~NWcTmZ8j9o}5 zWk?4;=;70lELU=p@3fXDGkA|tNF=w05vhg`DBmU+)X|!EWP0TLx0^rrYqY|{Usj54#{hlM_-nEOFTZ2jJN?m=UH%MPCaXA+U1z#zt+FTjC+Dvj_O=4n7Hf+yFrfwc-XglQ zdjwVa*LAQdZA#A7?i`|TB{4PH)4@PZS{$_4Yl75m(FvX(olq}qsAh{174EVK^WG0To}%PP%P5pax(nZBsXmzYX|_j2XjuJ ze)~GhG>0iW;(T$hUv1HIrZXm26G;*DpybH){Hq6-k15qCNXtJLy^*tHgS5MV5gWdm zvyo5AG!}rcRvdXw0tTI^B6cZ_C}S3vgrMo+KgEyq^(pJBJ07h?xV(L$2$PWDH@7AJ z1D!l57DltXZ>xws`mZXEn}9!aXtq-(_3UIHdL>!plk7s#r z8_AbU+Q?;jQP9uuxhBUn-(%Oh->9`2IvOyGW)k_$mepN2;E3oQEr6MY8C9})+o(E>&8c(H3eRm?a# z;UYDs+rO#^Ta0*0eC@30^RE6+>lDVT<~~A(w(hZqX|vTSX(9X+Yqr@O7^iDj#_kP$ z!Tvr>MAmv#^@FMTHWN_cMwjLmDNq)oDjfd{Vsw52F{{<_)Hv_pe9?cekR@#m;eKJ+ zwm#8HGis*0TKqbuejC3p^_Ds(Bp#I&HD>nes~x>C4OWW9rWQTqr$J!FS=uEGFWGGb z$2Ki0EBs+gIzh=)g63$5Y03sAn<$oTSKBl5B{<6C` zi2)iP zK|MruDB-}qnNU`0>UgB^aO7COZ7B8lvPw|_uG%D_n>19($n`b5AU}6ns)_}pBx&Gp zLHZXn9^$baetEjVHq*qgfRE^S$RjWFuHpQUpa}^R-@~n{aRGVHgbTgm0S%+z2>71T?NUooL%y5vnA6! zy;EBs6~4#EWjc1HLBgY}R6h||ChEG^wr95~&i&{M;sBDkEd^>=ErhZb)E-D_L`!RY+uK#93gQ!jR-&qe+khHzPq{rUL|7j< zn59PxqBU_GMu49~*odKmv7*e+a!zI(dR8%UoXZ+Mw~KR!ieyo-KkQaSL-E(uGT>52 z9`^Cz&Ws0{pWB?Ba5J>W{+qZ1M^ozckHB5%@OP-_V{w6d=GJ}1WpBQ@0#@$R%x-@@ z*bWL_7tebrWlBjkzK&qI^Xcx7=CE_C-fn6`_&T`jBcAL%B6LR&+c=OE<5welg7E(CU+*KIoVVATO59D zbR9IRJ5-4_RerkaoO?738E(?_@)rH$v#DjyroU?9Da)x>N77J&#QXn#eKG7KW)uKK zFkkHf0=*FWPeH%_Q;^<21yN`uc*RKn>rTyMf`0u^cSu(&Mvy>BmB=*0a<4dZ=eye{sfmigLLJ7ghF2qH|#-3UtET8Zljr+Eco*oKD z3mQP14sCQyxP9dp->2|{y>d<0$L}d~p;y#$Jk8}h&wkb6({*cg$2H=HACQ&lxy}jo z$FMcRQaF2*A&q_M{$1oT^cP?7H$mkSLGSH-lwuqjuY=1iBVqXMWO#3oPd5MgPC@Z| z6`JzQz?1F$aCHb}8lQkx+Nbj2xLyWuHl?7D(0^5yn8x1Yu9vCBo`hXrCU+HrD;(+aEoiO z@2>^y9Y2ek-tTE0UIpi(Q%{{vz1wS!kKjifZiMyq4L8F0`;$$(1#l0g066cyY-w(F z&D;iUoNuI5Zhwk;OtP7NswF=zpV@m-yJ}rvsT{b~D`Q_fKfsQFNpR1?NWwRW6)J8R z@DJDCI0*yE&7H+&-B>Au_LD{?qK$*jdUHl^uMefv*-W>K7xB)bkEfFkqZs}+9Lq(w9fL^ z5~Rw_JY+ICZG3*SRX7#@>o#5Af5z4M&ZZ~<8LSnx2D>2v0u^W3Xn<=HOV}wjmta17 zKT67oU;zWwI`!}(si90iy|Wp|rabhNoo7&%%KFI*N;72l8kfIo$f;wC7>q_q=2!=# zAb`WiIdQjy_MAH^*n{08!F;_{YjF!wVKHPBW?dtnRr+@%qZtZv_j} z#3r?`gRX$n$nPBS3sUoF*XCJ={Z~twmR;f8DUKdyG~xB8PcqBVUOFTX1|y?ld$N9y za_e9yEHxr(ndFg0ME; z7@-}Xy1^;O94Q2Qim094%Uue$Y^Y-9Q{mRZ{vdF}^RexTd3*~KGIA3I4S|M1c;_$c27$c0k-rsz zA+~)a`PZ5t7EZ!B*Y^uX*WbLaZJU zoPib9MR@U>Q_0`j?KrDwN4yZW(~$;;8)Mn~r1M1FH~xv$&ioHA7hYK#F2ejb1$5Z1 zD!_1IeTbMy%4fTchrx%42Z-AlJWqeQnp}Zk*sC+VzTio#33|5yMLWK0Q4~H-3w6$x z^=G|@)_qv}wv117GlCcdA9eU(LQo(yK%BFRfvnz$e9mLSIn94rceJ(hWD^F_=Zb(PRL^#CNvrC zM4IE5o4uAZIF<7NY2Lo`;!a=c>4SL9QKUU1ghsd=JdFEKW%{0Xycg~Yr#apSR0@Uq zHB>qW!9J5jA-=CLNvqEaIu1jAP#4%mWBfSXU-p2E2u$6-=-fn<`dx?+J1s}QDmCgU zcCTle9k_0Bzyh^vV%J)Or+ zs9$QP%B<*?kLVi1sx|`QVh{q*oT6rDBo;4|XdKx(cSb-YcPpjPcHdoa;GDWtSwfQ6u5f!1&3V&>-|snO3!<|kOX2m!2zhZ zXS80khtk+1R_aA*yP`^)L%|y)y&cP^y}4l#j5T(qM}vV=z~7Pmi!Ok6w<)4#i@((HtRw={eW<~FKc2mOEaH=O4Exyw?~J$rT5wO96Dcw9~A6({fhmMcfHyc zx(x1Lug=$c>kX+3dzmbBva?;)tL#h{J1?r|T$Ejjk!DqlD4Y!*5U9@6Z{p?zFSUD*43WXC@T9 z$SXPTPqIgNOZ(E_B>fTJ6;1567#wF5G#*qH@QSyMQpbZj>k~~~3nnFMsU3PDPeND_ z@R3~r<&oVi1rS3@q`lEL!EV4fBY9=V-gl*Ci<2YYM>yd;3JDqzhj!nfRDY|IDys~z zBihx@(l89Q1C@yI@4fbXgvH(kkn|;C0nu1C9&*C>wlp@kU7ogJ@m7TRgu?{s-mAT) zS4mHxV0cL$n#DsqBnPGJ#3#2p$UShH4JFT#n~=vDK-UPLcBovGH7Gcy@GcPkW2ifZ z7Eo?LFE-YJaw#?S7?E1OQj@TV7F(rmubOh@|JL~xZcqJ+x?pv}nQUbvZ|Y&^3{PMe z&a`*K^E0h2+I5Q*Yrn-))!6Z*daVYA*A7Zz(hzY<3B#_7AS<*UA;10S+> z1@aG?O~kY#x8e*JEU%jHXyVW;#UQPFO@!=e`(QK^Tu$*s1h-gGSK=1BsD7quHzAh4 z343@Gd-&2vrbAiN@jCT|ytx3Hny53nFOD&VB;Z#m3k{ePBM~Q>cxkoll~t}NR*;M3 zI^=aZWM;#OBe3neqI$(7cJQM9=3ptc3xAOs9q%Dk>1uQqM|#p|t~65;`X))00l7;6 zog>3kZBGM-`pMR3@2*ym%9g~_R&hYP9$u{PmWkqqKIlt{L{HG)ZjJNpy7PHU_JZ>F zETH_}RRw88L~(9(TTQSk$vJ<da+c>^0^r3$_`2`Q^fl#yGE==I1 znGdZxoVrx3$kLsoUYJW%KC9(=VYh5*(vIToxjcWIz=hN>G;ooZs&7z9*pWD)mT>=V zCRg6@^y;;I8qUDjMQP-PyW|hSLWFmb29Pqm;;Xf8N%1g5`oq18@pTVZ3v7%d3{!BD zpSsMEek{-99b6&|2HDUekd zh~ri1(U@*I<(67&+GIHWx}=ETL4cupke?*CQ$T}N;G8zPo}p~sj+57lAbqQT-)7ew zVSb_PT%yvn<)$mk)U|Mssl=PpTmjtxGR*aWq)#C|w;D;DRj9|{bX`oGm|esvBBw!Ey%9?NL87RnfkR9C=Kd3n zA{RTqs7R`fFXMecUy8i%JC%4(3?;1F%7(d{o17JXVd!YuR79;Ye9dsK<9gBd=?NE#(okiK|vhC7h|^4?Ln@w9JBJ=8-Cd-KD7feNLN>fN8b;l#xX5%Q?+-(}8UHs`k!5(w1MR9;&EI?ZP<$Vp&tjcHA~ z!WYy=UzJ-Rnf{W~IXkQ&yogEUK#x#S0y4cX%+{!M@XC_%*n&|{Q-81M8F~BdU+Z00 zFJ4!#`O60FQKq-y*?*wvCXjq>!e&fle)oX8Fqi_LltFY}3C!;BKFNX89*aEO+7sB= z>xSAPqlj2GjgX!+f9S?05wz>hLVSwhz!oX@+r;$U3C)r01q^Q~wP zKL4I`RP}+;ud9YMzPmjo$l8@e>^?xEor&1Ior9g8@CrLwh_#!o zQV5rVAfIOY&N%3K;!vjWV)%jLU*ZlPg>cI(;7wh4q=19dod9?&`i7rll^)9b=H4d@ zDiGP*d|x~8a*>^S%XjhWhT*mZ=EIqR4l8Z;9X!_|By^k4N|TtC^=nd*M<#SL&uWIC zan>ao1F|PEZl5Vo!khiuV3Cp)Exw_2TLjkN+g=B-8;=0Q`*=|C)#VodfC{o`j(t0w z$+AOEt&q%_irUL-l$$mtP82eiHZ)2a_dDhM5mBhn!wx&tOZ2*xYU^Z3=~d#Xlh3^{ zy(;92hJy!vZe>g8fjJ$m1-!##`TEp8ar~(c*aIUOrQAfpds=JR7H}(|au(4NcO~GB z&b#dS87V~A2wBWc0AGCCH;t8O=v^+1F8b&}*8-W$*(*5v<{d=7@vhYuxLEx({%|d3 z@%^=f3jd)~*WqVymIK(Y&afUBJf?9M91gEwfU9M@ZQZfc%x0V}h{v45yZvPMA4P$; zEx4#g=R&t4x2dqvn454pVYpgh_WbGjAc1Il1;N6rc3%A$_t8`38#;(5QA%4^=posl zB}W8HdyH?+IpQl#yXfO;4b7V(`g%(M)+Xk2@95@pjeEQYKE=AKx1?P4xj+~sV^gPG z__bgJ-}~*=h7URXU&by1c!25ZeeS~&Ccg5P)Niy3^5h$yEu0wc(9;dzvXAJb@&Ts zy7>AC{9}oe^}&RTGbC~cuLBabzac5)K3TlVR>7OXdSsPz$?y>3FLh4;rk2%Ne;u3xD9oh4@t43`?bK5#vH?Iw75c*yiG9JP8-$ZQ*<)vjiskND`Y%h}) zPt;W#(E3-CR?iJ0Hd}7IJGlIHyDYq&q-}C8`u$)cN?TVy*!;Vo4s7 zrzoq%%i0@Ygt<|%&`u}t`?dd{H6bW+TFe8e!PeB2k~jL)rKCMe&PqP((PEYpMbVNw|~N747i3gJ({ZNE;zTcAv7}3zjVLqYI{L`lcK}gS?@wn2;0V zAZqpO(QCpb*X7mV7%SRr7J%wWS;zwwH+_|a{cU=erH{;20QD~fTZ$tk8XvQPDQ(o( zE6adS`o>|0%-Uo7LMEHQ*mSb7AsQ8$@QY4dPozSg+(i)j)8U|VaLkag(IHsh&mUFb z1@#mEtSkSxwip?Ll5BcE*86f!V6U}-E*GotQDowc73C$x#JdSxF}|2Zve?D!>$|3J zWe?PHa9Qz#2WE8ca@6ezzTPCctlcuVX<=ZoB}-OljHqE+Kqs5Yk5$aT=b39W*OSn0 zD~&M9+j-nB>}fv-WLmazxbxsIoE}$w^}{*qTRLq)iqWfO8w#;7OP8@N>eyXAoIefR zY)PljqVDv)#uE6MSkW-#OkX=5FBtErhDINL{>Jw1OSRjCYb37_&NDKa4<2f(a+FB` zqySgy+-{&iam!kT$jJbA&uZE~8otkOlY@OrPPXg!suCqX?UB;eEAj9S`w6x1>f7k} zW(6#^ygI96lkAi5unilEthgvP6>fRZE}BYK#B1utC-2Ndvh&Q`TGcPaUNaH+I*SR# zigz1M^V@j^dFS=S-VDcCFw7cca%5ouP0dj3y*ed|d2ZdfZKVd!GXWfOkL(M9TM+&P zXqF5~IEde7bzdw@2W)3Crf3+7Lr{rgOXwS`JuS}lAmIC|j`MfnL@A{Z;@DFMvVpLs zDeW4l*ZG14i`RGiZ66@;%uFO2l#u4=E??X}+xfgBdq)5Jm8u_W_GIXlNiY}Scu@HS zZH~T5y3U)Mx{g9kYx6_9P|IR((#7jPOleU8&C)Hb1ZR8c(b%3U_m=eLvCAC{cQkRb zEtLt&GI?-j&e{j3iyE1;$NY~(QNrry3> zD;PeyshpNyWi*~A6xuqGvU54v>by5CN8>^oDT+4NXfSM>2t9uOiRM^R`aZ>0>@#__ zooEKOxtjBI%gRl~nqcJal%^A-wmy$Ot zL3=yXN6U!nJxSK>OW8#NO}oZ43RmE} z1IDvOtc8Eq%A0mW#0g0O<>H4lM}uEaN}wE%^_6)&4;*d)xmEq{wl| z;5*0|+nOiH#IpR$3X44hmHf}3ijtj%CLtK&D$u|ZrNw0vmS;LKk-t9wTIXG-dU~^6 z>xaLv>uM$VaZy>2hOuVj9i#uVJ}azL(sV2R=071Xv`>cuL9~4_(!CD&ytRM&V&?k- zpvx|-S>v~pskDSH$}X!Zzjju5>4IEksG)W(P1 zpqCr2X7E!>uz`^{SS(p0xG!Zw`TU`rCwThX(Ko-JyKeP(*uq$2pm1AKx{NON`$?t8x2*>QDpG50 zo*u6KS20o~nabFsZSl0Rh&!uLC(@&mC+P@M$AhC^Y#bc$KgO`qym*g~=}#hk&sAd_dSEm2pfOicrRgW}5W+v{EB(MI@Dolp(-YPQbII>lo|MqNvYm;v zVxJZ%yZ0=<^rH%y{0U#+Kh~Clch=RB$8cA9VOmEOlwHGHghMwz4LoFW9c|pry+6R2 zXTd(w94i@Caa{43fKKkXZHaX1OJ|jcZUj84#ADGARIaGxGu@Ov)q-de$yF7AE9jYb zo$@+tZN2m+40kZvfBDpC>E=8szgZ2lwAA#cOZmH|stC6@J%TgJj@9({cG`4bo<#=W zeL$A!Mkhu3|5y38lnp{&#(wARlEmz_MKoPz%6+G;@qs~=8PL+F^S3~_>J5%99dfJr zbNa=u>MoySc7G!AN^6($PkelJ=X8-Wxb_Cfe*DlRNxG=w9e;`ahoEBnR5b(YlmX@g z>upz5$J5Y38)OHK3a$?e+p}-{(=u<0$lYUcvQ3ho9Q3<93ipF9NrmK9#p7_e{nggpJvdN9BLXFYQNtcOP{Av~7jpVtH-gTDW_)FDYh zg+P@M{AB+-alndj`F6OkCO7K$m&o4%mtSgbe?ahzQaOHql=I`Vmz-!$O(os>__>Ai zy-~Lch(HuM<0fwTd}on25Bv zaW*)Wa5d$U#~X>X`wH^4jh@?ERgPDsgCs`&sPH^UL1OW9@Mxv7X+L%cjE=~+YaNvs z*a|=iG1K(gX4w`F{wO(7f19K3tdcP{s-(KIg?=Llo&bbQGJi4f86DPh3V#mUu{#|2 zYO&pYtE9Xq_2T6{t#x?kg4)sE?4;+@#RJraA`!xZL0ucsW#T$^^YTV`lRZ&2bi=S$ zSu#O>Mdqe?bAq-2m%^`aPow}Xk{&wBs^jr7JcqD-m_jAGF+0aF z>FCsaVz|fVRNP~g%~eD*hrFPR$&<*lOt8bV5OiVm`CVLY;f8;2NuIft;exKyli~3U z34U=$SyCN=#J4gjO!a`0Wzrm&d=|X5c%IQ{!|BVr(Fy`3s}G7QqpL3l>LRj8bI-T1=+ArtV%(7 znz`bmRb#sdDNgA7Iryr}D+R@c#K3eFf&4!&tJ6dKc7b;;IDv=Mw?n24bzhv-Yf1%< z7Ua+*i>@A}D*X(EU4l{}as zPsoH8(ZaC`3S9~=eNcWrtuUU#2zTH%6C=?>dkLP2utBhff3+neR1?alFm&YkT8s{t z&1Lp1edf&9hwA1whCpM8l3*JmxqtLfaod89bO1Cv-&YJ5YnrzX!#X)&ta42rgcQst zZ}BSI3zW#remDLe)qdOdry`o;x-JeCiUPeS&%(Lu&ArMToZN5F)O?8OGPtRNs2P#dZ~ltk`@QMS7+9Hu>$c`)eac6n zIm+Avv>tvseSSm+eLrtR>sk4Cn4RFa3nOU?fLbH`{^BR`?{VbcI@JT-zZ+=+j|BiM z>1e36U)z@@y~??}tqYeQ=Oue=2fkUM(kFbRL`OD6k=PiGtHkZyAWsAERV9g^3fq>1 zNA>a3iv?GXy1#Q3*Z+wJ5B|T!BNX#jJX8t1am4=w6padk@4>=Zdz_`9vamLE8xSr;H*PP>I}d~W#d zVS>N$9FNv?&?zcjUTaxB_9)QGPiS@iEAUjw@1yxLiicJ4B2RZMYT;ohqGvk_N{`>4 zA(b}S%q#kZ&mhN;oXxA7a3Jixbofi@xzEOmV~xG$31~A>+0(F{=UvE%Rk;CDOYGK5 zcEe{C?Cmn(sW@R%v~f1FD!MHifvl7Eq6c7`%G372X$4pg^SEK?`U7{zwH3Y|1z1;N zW)@vNQ>xRZH)JJHicWnDQ+&Vf%e^fc>fwEv3ZVjS zB^R<==jsOA4CE^n5i)L>`h4bD#Cn~Rhu@hedvJYBl3QuDpJp2iRSj||xzlG3bd@CS z`^T9M4*Hwr%6`psH~3;y#FpoJB9BQGLw^eT3!|k%Pe4Z z_NSXc9Y3rWfZQEv0$-`wN*$s_CE?>v;F3B@m2yr>%T9rQ1f-|_teCf)mEc^&WFcRq;`$L7G)k#hyGji9 zljvD<9YVCpeC%s`h1VtiI!6-!PWWBisn*b)2X-uiMBb|q7#Qc9RdZWiN#Mg%Urpxh;KLVRPj=C~xpA2@z=yvL_vcMmzlEX0 zUcMa#d-t@rtEA?zp~C>z#1BR(=rEq(4}d8Kj4$d#P6P(5HTgr=-^6Tt%7?Wzyj?h! z^kb)M2*z4a%1vc1yVuhjsd&+GOvH6$Ul(={3j+N4-gQ-Y=8)t-aO6Sa?jGiK(s^;y zr1z#Tg3@bGDNYYQxLek`#k3KPl3tLNpSr7$sVXYyIQ8S(ZYQwJciy`qDSD^aH1jK4 zlK$dp&%MdMGq43qI>GeQGr?Lc?Ti4?(=7#K7lP{MBmMk>J9~3QW^+(T z*7i{!4evL{CAHYaJP^o&Mq}-2t0S1khT?HeAy2xW`>K(zX|pKucQNz~>%0J4`IR{}LEb zPWG%p7dUr5D>&|!YWRtUkpZ16HadY;d^Yyi*MWXwm0*;h$M*iD@7oBO~jf)lvPhn*-0>G zzkX@rsnJGO(+o3_D*1QfbaW27 z8d-n=<9)2L^rf-hyuGzR58Y?ubfnZywtGe!tzhBCv(%sa=rNWdoIXQ~aIt_9-~Xep zw+x7*+qOl~0KwfQKyY`02X}W5p5X2s+#$HTySo$IJvanw+@WzUuB=6)T8>BqiS*BG!Hmmu$K0pz;C9sy9 zXI6ASi}Bbfv8|pwT5{rQBmzFU@{O=z4+^qMl(oph;y_ym<9eMmfpan2dgD6P`-Nw$ z#T(LwkIVGcl+SqwbILoI<=((7Y8hJ<&Glx9NJE09{0q;z5;KYzT@x#H&3Sai2sBtX zOyyntS>#&)1Y%FxvLGf&@f1nc{PLF-o5+O zmAuiXS8-VB&e-wpX+zC3-ybBiu`kO|#93v(rIGYg@1io-RI6P=n19N`DyX6`%uzt( zBZ~WQe7PLCmeygHt^eV?)8Q8d7}N-edJ1XVYAC)3n~5w5(m?d5j+Q!CNVuWZQFvHM znzf6?(7|5sF%m~!7}qx#J7@q)0?r7b;1!a{Edtbxa1~sXYIJG8I#21yY66=bM^7C% z9aw>+{oukJr}1)o9TT6&V~9SH9|62{AnYzvj3^@>i^=o8VS4p86+7AfXLh4=j>QJN zkUu7^rgSktW_AnmU)mvtpBk|PlOI_S(eLUHw>j9eU&tR=y?n2%?l}P|>Sa+eFQ!kl z+>!fa#-M#-$dF;)R>4NZM!d$UW2zUR}MV@DUy| zM#lNnj7w6J(crMWQ&GS{kBxSu5j#{-7L<}Hxvd%nNyc@X{&*WUMif`@X{(6&`EX8i zr{#w4Z?MO61JT8qYj&|8*^YiplEFtz^NG0oBptZ!3(+my0|z-^Jbv4Le2b$ut)ole zyM17_6-kSezb)4Wu28}7+vxsWQ(c60Q?Pfgb>F*x=KP@9fuRJr_cry@J;$j#8#2K3w_P7*K6+)t0Pr5G363{vAiE}Vzdu()KjQ2AF z;UHFlm}+aI7q0-Jn(|Mk8r+bz|A!SJtEsH;BL&Scw7ZQ4{1PNVDkhwXoXcQFp3ma zY!INLMDnt&Dj_jcv=m2ZqoK9M!N$p_yERXL6BBlPA86huU^)`*yjbZkqA~&DCLppF zMa9c-DrK0@|A|d})`UuXWP!<=s44_SOp3pQrqXOz zrWm#lChu4Dx70YMuQanw(~_n#Cq!IZea-+`7EN^zvzOj-IP)Z`twG9Qm4NDPuUn|R z7xcli5gckAd8zyX!n<57v+pd3LpgRe95oia)TDVEq4r5^MwidinvJURX>K={PKLNW z9*ZoJA4)NQ6RBZCnn`GuxZ7~G@rT_fNF4-td7^JcB*jhCv{Jct~vlH z!VM9Yd{-igI5{g{MD5h~_Cq#dNKG6ByyP(20q2RgS`?uagVCj@m;u`I?e$*v#Z)SP zmKehXV9O|iF<>=_%Bvt00Z%$P6a zFPeQ`(Jy(M5xYUEX;!=nPqeo}bEjn9f_E=n9`Wl;Yq?8>7mV>H+f)FT(^0|k z(6*v!ad+w^{oLWsQ|8cT2GO==mA+GaY34QD(DNVE7mL!->yDwGoQm-PecZlFSBwd4 z1>RHM6y-Y=#aSalQ7>oZ*+U4?C!)L}pi=04hmhiFWpN2W-~Stbf#Rrq+P4l4rP1|9 zl`*qF^ca^TRJ%NV!FVs4f!6>7*0QL2gu@-(!0XyDLq0-d4SgW){IYG}HD|IR-?*Vh zrZn#SAx+?QYlb1;se#7&I#U@4y^K69vEy4HsC(E$or&44GyGTl!45&;8s8$CHC!M4 z-x2P~45#1N?BU6voRTM|y5x4+HsZZ+{$&bq;Y|!a^Gx8)R;yRzwle_8VM^Zqj%5l<&TF19&6F`F{atw94iel_thpU~ zKE#4IeRW8NPLK4J%P*L(nAbx-a{B1cu02UjEaUjI0H6g58!(V}@@s%FbVmAu4!KH) zgWTm`Y2njwk{SNpqqzaFY`_cOvNRE{P3+e`1cR={32)8=rVGz@EqTxsLU$yKAOp{& z2*&}Fg+8O@!zAwD2G(k3K{I%7l0Eh~t36qeSx9aev6L~n6wuYG1a|p*MRd{npRSS2Hqph=Q;%-3w{L;QHN`O;dJFn zOScfqzkmZN>xB=wXN=sm0wcRh_+i!jNO6^+ZdGaYC7Lq9I`bE6%xU!5_H>>cLlp27 z&B)r;-Y#`D<#rE1tP|&Tw!-3Sjmz7p67l*`1Yqjn1HL#|bI*?V_-hJ;s=MgAd*4g@ z>kc=Fo88nWT>?T47l18cPmK;?>8kCTsmKi)S&7iB;N~4KW6XQbR-h}F-ZUdE6;?wl z2ya=<$+`7_d9WoT11$#=?mG0JZ#_v|NbQv<0YQTz$*ZE_T9V^VS19Hh)nA zU+ouE7EspL9+1>tn)oo*JTyCU7`S>V4bfb1e+nu8XDOCagaE_ z#iMy^;%V!Iyr*TLjbwTJVa#)x*?jA@WR#+_L8{K52*iR(hb0@2Aj9%8S$U2cY1H;Hw8x`KCW$8sGKDd$o$ZNvuqaXl$80B7n~Z zT?i#`z!@!bB`X+%EsGX{ltJ(>8En8WW)}Z5LkMOcL50nQ51J?rq3Ki#x&hN9J;Z_u zd(>G%5JQxB?jK2ubV$Gn5$V4a zX$DV4(SdIusMY>h^OLGpU`)jN^8*m3=MAv7GHGr*;BPxj=wWE=(4ty%2@CjMtdvvD zKD;H!>pikf3IN-TJEe4^zM$gR_p4_6S_VfAwXn=Vdu4;cK~o=>=wc%u4@AN~o&0II z2O0eI*Kq$lak)4|7oM!p8{lfHgq!I;9d|*(XUS#5hf__Ygk;2(w^B%;b^wsz&2yhM zgNZ68Qub21ZaSDLL0#+)@1KCmsYU3jrMgdJO#A5n+ItJ0>OP0D4FlEzp^KKvy}#!3 zeFd z+R(JKy^bRV$K6QXDk8X=Yd>H$8kaZ~*XK*C+=3#_3*V=?6J*a9-_AW^4#o+7H>uCp z#r%A=*T+U@o<0MbH47FpAvGp3l}WcPG;Kimum~z(bp0v@Zx5QSmo$OZ)Oxr%?U9EX zhyc|9<-Qng5bbYt1AS}-Q3o!UzkUZir*_XJg5Z@XvAUO_c_T8&{L!#zvca{-U2zGN zGnJuaNWIl+qKD&-_&2Ex-3j^k^88d&*Q4s<7tru`X+o?u_;kDFb$H7LV@$5UwSM{n zF#SVZYuZQ(m)KZ;Gu|Toaqmd0c}JSgn|q*y5nC7|_U0bEHsGp(c@0#?$7)K%y`D-< za52P6Ee1HJWd zAVfo2);kYVoajk2NSa;aG4T>9i!TH8d*E5-16mU+kDCk|4rj>g6^v4D8|AQE6v>Aq z4sx;sTFR)2D#{T!)LzTJ*y7aLKLE?Vhgz1EfCfsQvd@z`tNAsW7xi(&1HTK?Gz(!~ zD2nxK>B{Uc#$|s*qNP{27&cqX%l|dx5Nn@oE+(Ztyo9x)w)~4*x?VYZF-~&(jsY$p zY=VD8m&I+hZCc(1d7o5EJ^HJvWkqVG*k^<`Ybw3PCr;&Qq9(l|T6?}2m(l3DYDHja??am6Ik6r8NZV`8@HV6En)GHcE8V&O zrP`xII`+3yrxWcM3m z!Y~%SXe@g{Z)~AyABn>)Tte?7%diF1%t|Y45_V3<-L(Mj2l(+>@0z&hS=IZx0pj9a zyK@^1v42*OTKmon2%Nt~oKHZ3lHDH8M(k+uU$AXo;Hp#wR}ccULuJ|sEj7V8fPQcS zu3b!1$UMyzs~kss46dVBJgN{6#)w?XX9B|aX5UNfn{?SC5q+XRR#8X>64rMI|Lniq z>PLD&tt3|2MbGLH+R*6hy4a-G|nqYlSifBtB4sYpih|mSMMnn0-bfnRm zjVOkD1^4{JHt^TDw58(hPF87re#b4MUD00{#~D-BR~KOEjabMm|4l5_qE})O#*)NR z#~!I70xT?5MKJ~n@l}|7CE{>|^)N6MQMLj}$Ci zd=m1Zr5?1Tgo^#Mh-ax>*q|cp_Jgn#r+B-eVZUOcVu%1UUXsPFzHYKLciv@kJB%kE z=jVyZC<#juFka_oU?X01rwsFQuex#*63y z9aMP5bdeYo{iN(u0nlM&(D1Y$rQypR>Jj5AVq$?o-Ijo0sRr<<#WkkoT8`t=D$H1^ z#iGDyr9X%grPBx4^NDJOYsNE+*>*Il#d%>zOoj*Zj6t&a)f){#nmBZ46M$@M)I~rc6>!y1rgB@ebNU7N_dg~31CuFR~fA;d% z1=g$rtF-+j50Ur|WtNVI)W=;xxUu(3cbOwId6ok8CKJ7e6al}}S%#J) zjWeIx{*XsK%!_#rkOu^~ms9NbXAoZ!12nBw9w<%kiqLX<>cmZ9UiM5n+2Syuu?yYi z9qi9Qvpsj5N4&&3t_Ev^K(kZi@%5MO=i@>=-_8?6LTo6&#k4izxZP7Hv{~~B$WNeY z4YM1!f|chs{SY5NZMP*7y3>x&2D;OpuoCJi4Pa^;b14TaXUmUH0OWP+R*VDyNN+>7 zI`AI5&ikQ)xW_9<#xDzDf?U^9yM=CE7+zn7)|ZH=lkzs{*aPynyW`K}6E7-j`96-Z zdx^^a+b?6!UdTU2E2n}vg&iI{s`2jRerz+&76Bb1?hDLkm$RFnJ80SGl?$son)=<% z4!kSOI{LlK<`*)(@E)!U`=4b2(+d+25l>e03#SuorvUw$ez%oMJAM;9;9P~BHw;^* z8OS!`@^i#x#pk{|2RKkS*-BKr|HHIslK?Tw$;_vor!Ue?Ho34M8`8i0{6bBc(Ebni zEPtP^$yb1lu%HL{9xnm8{lCpu`KW8c#$DRo-3YfaN|=va;+M;{WH+1uq5O6n{_#8n z9{0sWi`5SuGS7T)RxJXLdL7Y9J89=BFUC4}rYg>7HE=Lb7>}p^&XVH$?P?X~Ok=f` zM+Zs#@>7Y+se#_H=kXRAUEYy&3|^tSiSvu=w97?@{8d{*w!itS_()rbba)7lf_}<>{5y-F@2~&=#D*Ela?)$>p^P z+#RB9IdOh`&=#>tgIUFdRNtyAHsrnPZ|vTctJ*PQat2$e{%CpKrw41DK^J%JH12Pm z4q<(daa4reXZ)&#q{?{ggGL&yRcL)zPQF!*CQMb=FZXzjkq>?+^t5(~^p zN^=?E+oU|Sin(8p^D-y&J5Ne80}@V_quQFWHc2|p(Cw91j@;5zJ^3$u)=MmFY{tG} zhv^n8t`(ZERyz?gOB~IF;Mnmar0fKnYErgSo5+fTvPDqk{LBVeZ;*?nhTibPjIlFkB1yhxy|Vxln2$ z6(>OzsJa+_&X+&LzpC&0O%d6K?6D9pp?lQ#7Bf{bM&D)B4)h8zTy@h-siIDaQMKqe zmhXw?^@!yoh+^`)45reNSFs?ev0}W&@~M1O?+lu4B|8`30A=AJ90tvMAAK1j{G5Jt z;X%6R{02Z+<)URTW4m~V^_?7)WDvB_hKhA55r>DiD;-VY99geP-%T=f0EPbachiui zh_GVNj|VvewTOLgHVw+bf54W7`-LHBpn``Hb@vpRTkC?ol3_UI&p)_5+k_GQqIqMP2+SjPQUU{l|F z)M;z(g^c^r)y$tn?-{z2?^#j7TiwblAJQ3?XtCh4`!QW^+hvQ~n?I>&M9?hQ3rV^a zX-YH4A($tQ+C5=1qSd{|^S1d;J}gtau(tKd@z8Or0`N@d$HmRhwQ#cA>e)>0J+5C@ z%9t8-+=AdT*yr+aFg|uHox$kcLy!=9fpFCPO}-bqwRGgJ^*+t(teN}(55tC|uo@KF z6x+mEp@+R*PKm0%*>sJtrk*&_XXn)H;Nlz-MstR^Ng{jMEUZt=WC)CQJhkFjnCJ|- zrfRrMa47{`IX?O!ZcYxyhH_QQSI>p zRGlGRbUX6~0>+zxYc8id%=u~A7!)tA7c6%lFbArPSwzKUhxA$U*Vs%R zH81H89t*BAO@=*HO_A>jI8FG<>5kjz4*B|Po^k2c9Wr+w0BR02A7kBqhMO%$X{JS< zem7dIJn(Oi8;7%@DCz!-__A}xaq#;xuEa8vvM`lAjleoNvRS`)wG$6r)u`XFbF@iv zLV{)y=-;Uu?=4?sZACet&+X0*u)S{|EHuQjJN2cH()w^}dqY2Ma+QuEpno5FGt$%y z<>cc#s=5Rx1E^Sm!}?(3m#iMvH3f|F)ojFJLkbzk{U!)J5&$!e*NgS!49f@$_)vpw zCL9GafdyGYP}aS&FSk@}lUCp(?URAp4E*GtC&F%8C#)R73?0IHoTtiW^4#z20h5hs zXo~n?2Caoq*X|m#ls4|1DS%PVr?@g}UzXD-GFhBTfcKYMR&xJ)XSd|-+vb5OBA1Rx zKl#%Pu;r>By`Xl4C)C=B5uMM1(g3G+-qROx-Ap)yERFM=9fp4n>pw# zdr^1G16=JCAlu%mG@qTx{AG}C;yXET==rjOu?cI9W@psWd$?#)VJlzAWZxYz;=i(S z6Gi88xC@UDws~JvD(&xqXlNA3v{}Q?&@x_L>af+iCiN&$ahBH#l%>pixh58#vSH+5 z0M9V$hTFEHo|Pl1a{_6J1b2X+*n4Nbx?@9NsBfNs#k<+4@#c>iNXJ&ketq-D%pt)l z{zc3muf#+dFk3&&W%=kXWQAe)_0x4W`PO*A9yA|G@UNmdtxxt=7Sd%MIy5~w&g!~3 zFji_PSWuGsp*bFyv-RYo_*0Kjv8!JdV-F?MuVlgi2` z-brhTdgM}escNU7?l>WK`a~0Hn6}O`&Sg5U&W8Guwr_b9bv2NVPJMYnL*F);j zxFg@S*HiY{^OAaB*c7HZrztTK0q-!c|C}P?l0D*&{ye`zhW6IIDBh`hc7D;gTg1dn zgwD8+=bFPH@HLY8$cr4EX+!BwJr$tYMs(+eVaUMuhin^!Df60Y%xxv|Q>vvcgp9!^ zvyFFI3zhJC*EqT^HCHc||2oe8US0Sn$uXBMMXos;DLWV@ek3>R1L z<0eS5d^z>22q>LWWa3jn>7x8nL*U^;(0r^j9r1P>{|!$mz9f$}!p-uNh`9ErspjvW zFUOp2DtDbG4WpgecTra-T7$WnzcZ}fkdw0)H1s8T3oA`rtdmDJEB;RVF0qLfH@Jdg zz}qB32@7y|Y@4pT-pm!&4`lnZr@S)Ad}NUYcSE5dclPN;wE8Yb=>DV%%HRQfxBbV5 z{qc#=;dSTKtz&hJ#-dyD`5~yo$glGtPNrqX;-=zFQK?JtYNwx0W+9twrs`cW=$6Wd zsUrx}V~pfrt?DG_=Q5`9r9$qJ1TP~jHakN)*yw;vb6@PIQC7QM#RHr!vcWGY1L3%% zEx$+aznSIrwP07?=SZMH)NEis=V;Gi~5OH0SxpJ7qAisan3E#_) zi1?y(p9db`$_pQ;!)1cEpa-1B_~LeOEDn&^CZi(BaIL%xptwjlT6rzKoyCC-ICKs; zgebp;|I-NF_~C2E?g#zabF>>-1Q66Zf>bg;5!~v@|bRgZKONJX_%j_c4R72 zReD7(9U5|cCA{*O(`-J{XM2+VaY2o%UyYLP(Rd`T`m)gc8)%i^q@YZj}9Dj#xU0FOAyqa!ljmE3`Gxp_)V1=Wmt~1qzFV7DJrA}k(e`(jQ3-71uJ{4-*s|$|`56*bt z^!?K+3m|}*Q2W^k5oofJ4>X{FFUaua6AnZ@v&G<5_(;Tdr$N7Y6J(%|xL~-MQ5mdE zzhUA~QQ8*_!zfn&+fTpiQY>?^Vy2h#I!HwJtmUy+GJk)V?=3#gKIj5?S9%Z16H zr0j{kv4+S>NGB{MB8Vb7D!B=Sxw++>0V1;g+w^P{>qW?%0gHvBW-RA5`YsZ>;x=-! zyG*fGZ@W!*2Lls7l(R0_)Oj!EXv?$cVCFC^-R=2T+wD+&0`^C! zATKk%S4Mq$w>-1n3H9Ff-z+gU%8U~*4gr?+MyUEY>9>I6&k0__v0(`btzJQTN0Ms) zVf*`uE(JA%uPCU#$V#D}Q*j!lnIEf*lB=Vu5-o&gYjn$>rNgSsr;I+;vn=hAeylMk zdCf-P?u>|6i7|U^_wO{({=%IoG}wyd2HQQiA$&#)`$_P#>y>;MGD%%sE})>c{PWag zy16;`nu?M~PJ8o?MpG@j=R(u()sTxbEyBs=uN&7yY})liP?c-^#q|*77MUh~(XhV2 zPZ%U!C27JWlQXjpiWR8-nnt1)$mdh#A1+lO8g4yOSdy8)6FVP} zOL)Wu!XN)|upvEVr{vqsGF>DJ&Ki){U1{k=P za1#nURM+&>OO4O}!b#sTA-!$Szx}W#*zsbzed^}(=q1i95&}L7d;$zU74>|*uTUR+ z`aZG$S$$j+HOntho!88ja_o$^{>zusZJFq_p{YX_{yVAMXEl_pbU7VvV6XD7$Yi%0 z^5cH-6{^0=>m4pVd%CxiL!;tw@(L)6SfiF zh=aOG7zh1@=+nnT3~E4A6d?{KAYyWC-69rJ@iEokF5APpcmZ=%05QH6tBSPiBkW#c zRv#zNblTT@`JiW9dz}~gbgNbbtkPx%)v~_yN<&O9U@DsEaBa!OW zhSnRb^HwWt2Ce0n>_QDv7yJ}bXd8BxN+hNUKC>HAR@Gja}e0Pv<3(xLOc6%+)<%^c|zz>xs_zJLXH@F|YcjM7}q@Wdy*gDA?PWzRrk2 zvsR96_|5{bg#asky2(KWMlvOLAKkURZp5+Nj5zW+E7R#a0k11jYc!VFRVg88- zFIw=8cEilCQ^PE%0}dCo=?>?#{fL>ylDdHD%N$0#3%kHC|B+A|*QxAX(96v&eBSmb z@%;TR^62sc*HHX>Oap@NF#|x zqwNtOrkvjuvKFU=N<{SYS6f0~IqrK&lEFZdG?WhyqS?|E)o5c+9vasllgAHZ$sKlyp8#+aET#cRmvVop@Y|jT1)Q|CkiD8t%7_3(pTATD-ZrdxqHBh&u({ z@p(T_IxGVEfV3F~9_A@_u0NRty1CANp0j{&$O2YfF(1SSU|&Fy=LZ*^Y2WY3A-H0m|;vyopY53yRKd zSA^^MXtM1MZ6tT9Yx zC8=N@y-D)Dk~<`awK-YZy6so}#1#;RQvf*8)1xd4R=-zf>Z`@EWLIE9eDwPNEKnA5%TxcI}=%S527~%PANBLhWc_z8jf7yZ?AW1V( zff-G1+K26iLJAH#7BcRu)*3D{_Iz@rk`57S1eAlAV5xsc1SVu#nYWZu)mMnO_49+p zPU0ZXmqRhAZBtJItGCE2E&Km5XJxl?7PJ zyw%EGPC2vSNALTJ?$EbPe!?VGDs~=6U&<0oE|j8u`t=EmRV>pYP@@gy2U%I)fG;9y z0@~%bd}*wf*ka6T10O_G;F`m_Cv!-7Mq+d4r2weS0qET(z31-F@D)fQ0z3657?mj; z<*jBeVUT!qytyyHk|DKoW1Ox9zzSVRsXIDmhF#`RSgs>nSig6p4IM<=i-MG?pt^7> zl0@re%s5UophOh+87}+dCe#&Mcu?fD&VCs_BiH<_x%0P?;@GswFe;S${FxX(P~w*G zkAeqhFAq1}cqM)idGof|vqkQfPf$k}Sw(hu3nC}Z4PJ`O0jGOuA>ooW;0h_%1&`1C zs%lDP>C^H%2+e=q#O$HUa~;5gEPmd^?m=eQj$#+E3kFGCxptMj_WwHzHraz`t^Fzv zxxIqw6^BsT11Ik~%5oJDTibK5^?h{#<<}qWh1I$M>^ZE!>6K+?ph|pT`pkfApOU`H z@*3>mJ}SB_nVu4vFArcDX~ACQ*-enYmDqfzqVjo~*c0Hfc&7>N1-LXaNL4?#ktt<^ zn$1}&A}bjiC$G3WTAT_}#mvfY{FsFe445E-KlQ@Y^ZML&Cvt0`#A?20A+&iZBqCvb zS9!i$_M(AWg+=Izwm@1>Z2T}w7@k5ICY|gXDQ&T?7ciBWlT4C6>Hk*!pkY#D5BByEm zr)xO~EZKkF^=$3CK|W1w)+c$Mn|t~D)&|y7Ye}eE#45`o?pFl5zbo(Jcjf(_5bl8f zs=Q+}!;ADhxe2ty~>Jr)4 zO&d0W#!HBMJKaKx!sc%E$VDMW{E0GWZv;;!W#uVI>lmo*1^YZ|K;fJ=E9Wvxgb%fYz@%CyM{@?g55ik*a z0I@KU%zYy{f;6U8oBOpfh#t|Rj_tTaG7~*P z9KQov<{u@MUv}!daHt31hZO{2*NZxkjAXh0#&JRz<+W)l%sWuG*nv%@#Z`GI!)4y0 zQCzew)!0AB1rAH5-Zihd2sCh@j15P40614~XV)d#7A|@U)D~|7R$31=Jn-)_uZTN4 z^bi4mUhaXIB+E4DCZaKJmxRvoq{ShnQEL3Ze53 zr+?KKyblX>iirK;#0EfktuJ`D{osh;Jim%siLnieyssU>q$#)zEPSs&_OHMzZ(O* zHm`S|kYUWeLr;N|wUR)^^Cpq)(j>qAod7W{Zdx%WhbaXxa>%dF0kFKd-@E;d=j7RM zw^g*MnBBqjT8kB9x$8YP>V%VAYkdPz2dB?70LQ#qo2`c$=^f9EA^TyZ=g_IGL1D9PRG_UGeZO+Qb8dMa z!we9@4zTCDZ#{!83rZnkk|jsdt-0M%xW)wEqbVjrh!f7fXaRHdQ&~rdYy4`W2i786 zaw<|*)PYZR>ejE|2GH4u7koCGLmt#nM1mO(%3xOE$5U53RdVzsF%Xkls44Zg(SbvE z%P808PW-IKZNY>+Qr=qKfyzWrnX%xssqI4Q3aB~pVK2X!fU!S)E|_D?evtIIJ=_ZI zR0X$sew=aOrwSq#TVWBwP$bj|3!R!~&aa>MMz&f;QuKg?A`mBgLywK5QR(d*nau~d zsjrG|uE*81_l%88!=3nG05jOsgJ{uLB{?^@xqAIp@$`?mSqga0cid>q$m z{o4CG5U|{=VXYt{C8(VzL5BhLm1+>`g+!uhNXH(wQA84qOo?2BSp-}$jT1}{%xBLP zj`$o5gUy1FX3sne{FAB6E;*%G0+mwsXf!Al;4%?DF>W664BDf-4^$*^=g*PI@=fFY z2A#!K#d~dQ2zYJCv$DChyYk(k0`<6*PqRf^-!6)XOV{3eteit!mn`N_*dWm60c8{P ziP5klR2@xzw}iPZK12upGsFYy&}3^vRl@=uJE@CV4ZqjkTA3xzSL9z0gbneur}NTV z9;RY)o-b!TK^Glmai6!V9(~W%4h+e!shHdBCSAL@i~)7&1ngd1NJvpB{HFI!`=R@> z1w$KWabuZsDw%L#6H3=2Woa^TK*%n56)$ErJ*l{Qurn4_eaS^NFLpIOhkg-m_R4UG zuDytZL$-$and*x`R*K=&%i;1`gfBcO8c3fBR@8b5JN%nd%ACv7qGF15_Sgl~pLPdM z#0;p7R{*W_TdbL=H4E&9;-!xcU-wrTS6owXJFl<>I`yKw>${0Fy(0-jw1-M@I}xe< z7Vtd7PL|{{zDRI zoj-Qc10$B!of1c`?R81x-voHx1)|>tyxnPWGaKMvC3OEyLhxN;|6Kwm5i9n{9UsTS z@Ks3d--Ni|ggnIFg~St)W50Uf1yeVpPuO<%|E{C_Nb WpN{$Z?&;=&#W_J05#Fi7YC delta 30954 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 diff --git a/CI/physmon/reference/performance_ivf_truth_smeared_hist.root b/CI/physmon/reference/performance_ivf_truth_smeared_hist.root index f0b20b4287d911d3f14f25f734bab622e7f26b62..b5e622cd1d091302618649a52e25336c2fe7c2f4 100644 GIT binary patch delta 27575 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 delta 27328 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 Ikyz0G0bS@$kN^Mx diff --git a/CI/physmon/reference/tracksummary_ckf_truth_smeared_hist.root b/CI/physmon/reference/tracksummary_ckf_truth_smeared_hist.root index a52cc0dc0d7585c64a2af92f248f7336000ff735..91a227a39c47027ae4b399d60f6f6aa73ab9302d 100644 GIT binary patch delta 24044 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 B{Zaq` delta 24163 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 diff --git a/Core/include/Acts/Geometry/ApproachDescriptor.hpp b/Core/include/Acts/Geometry/ApproachDescriptor.hpp index 246e1a11d48..662cbc0faac 100644 --- a/Core/include/Acts/Geometry/ApproachDescriptor.hpp +++ b/Core/include/Acts/Geometry/ApproachDescriptor.hpp @@ -10,6 +10,7 @@ #include "Acts/Definitions/Algebra.hpp" #include "Acts/Geometry/GeometryContext.hpp" +#include "Acts/Surfaces/Surface.hpp" #include "Acts/Utilities/Intersection.hpp" #include @@ -42,11 +43,17 @@ class ApproachDescriptor { /// @param position is the position from start of the search /// @param direction is the direction at the start of the search /// @param bcheck is the boundary check directive + /// @param pLimit The path limit + /// @param oLimit The overstep limit + /// @param tolerance The surface tolerance /// /// @return is a surface intersection - virtual ObjectIntersection approachSurface( - const GeometryContext& gctx, const Vector3& position, - const Vector3& direction, const BoundaryCheck& bcheck) const = 0; + virtual SurfaceIntersection approachSurface(const GeometryContext& gctx, + const Vector3& position, + const Vector3& direction, + const BoundaryCheck& bcheck, + double pLimit, double oLimit, + double tolerance) const = 0; /// Get all the contained surfaces /// @return all contained surfaces of this approach descriptor diff --git a/Core/include/Acts/Geometry/GenericApproachDescriptor.hpp b/Core/include/Acts/Geometry/GenericApproachDescriptor.hpp index 28ad0e9a003..2c69d92d068 100644 --- a/Core/include/Acts/Geometry/GenericApproachDescriptor.hpp +++ b/Core/include/Acts/Geometry/GenericApproachDescriptor.hpp @@ -12,6 +12,7 @@ #include "Acts/Geometry/ApproachDescriptor.hpp" #include "Acts/Geometry/GeometryContext.hpp" #include "Acts/Surfaces/BoundaryCheck.hpp" +#include "Acts/Surfaces/Surface.hpp" #include "Acts/Utilities/Helpers.hpp" #include "Acts/Utilities/Intersection.hpp" @@ -28,10 +29,6 @@ class Surface; /// /// Class to decide and return which approaching surface to be taken, /// it's a generic descriptor for n surfaces -/// -/// It is templated in order to allow for BoundarySurfaces from -/// representing volumes of layers to be re-used - class GenericApproachDescriptor : public ApproachDescriptor { public: /// A generic approach descriptor for new Acts::Surface objects @@ -60,11 +57,17 @@ class GenericApproachDescriptor : public ApproachDescriptor { /// @param position The global position to start the approach from /// @param direction The momentum vector /// @param bcheck The boundary check prescription + /// @param pLimit The path limit + /// @param oLimit The overstep limit + /// @param tolerance The surface tolerance /// - /// @return : a SurfaceIntersection - ObjectIntersection approachSurface( - const GeometryContext& gctx, const Vector3& position, - const Vector3& direction, const BoundaryCheck& bcheck) const override; + /// @return : a @c SurfaceIntersection + SurfaceIntersection approachSurface(const GeometryContext& gctx, + const Vector3& position, + const Vector3& direction, + const BoundaryCheck& bcheck, + double pLimit, double oLimit, + double tolerance) const override; /// return all contained surfaces of this approach descriptor const std::vector& containedSurfaces() const override; diff --git a/Core/include/Acts/Geometry/TrackingVolume.hpp b/Core/include/Acts/Geometry/TrackingVolume.hpp index 7629e0745bb..d344342bb2b 100644 --- a/Core/include/Acts/Geometry/TrackingVolume.hpp +++ b/Core/include/Acts/Geometry/TrackingVolume.hpp @@ -68,13 +68,18 @@ using MutableTrackingVolumeVector = std::vector; using LayerArray = BinnedArray; using LayerVector = std::vector; -// Intersection with Layer +/// Intersection with @c Layer using LayerIntersection = ObjectIntersection; +/// Multi-intersection with @c Layer +using LayerMultiIntersection = ObjectMultiIntersection; /// BoundarySurface of a volume using BoundarySurface = BoundarySurfaceT; /// Intersection with a @c BoundarySurface using BoundaryIntersection = ObjectIntersection; +/// Multi-intersection with a @c BoundarySurface +using BoundaryMultiIntersection = + ObjectMultiIntersection; /// @class TrackingVolume /// diff --git a/Core/include/Acts/Navigation/NavigationStateFillers.hpp b/Core/include/Acts/Navigation/NavigationStateFillers.hpp index db4d5b8db81..9fcda96bca7 100644 --- a/Core/include/Acts/Navigation/NavigationStateFillers.hpp +++ b/Core/include/Acts/Navigation/NavigationStateFillers.hpp @@ -51,7 +51,7 @@ struct SurfacesFiller { const std::vector& surfaces) { std::for_each(surfaces.begin(), surfaces.end(), [&](const auto& s) { nState.surfaceCandidates.push_back(NavigationState::SurfaceCandidate{ - ObjectIntersection{}, s, nullptr, + ObjectIntersection::invalid(), s, nullptr, nState.surfaceBoundaryCheck}); }); } @@ -68,7 +68,7 @@ struct PortalsFiller { const std::vector& portals) { std::for_each(portals.begin(), portals.end(), [&](const auto& p) { nState.surfaceCandidates.push_back(NavigationState::SurfaceCandidate{ - ObjectIntersection{}, nullptr, p, true}); + ObjectIntersection::invalid(), nullptr, p, true}); }); } }; diff --git a/Core/include/Acts/Navigation/SurfaceCandidatesUpdators.hpp b/Core/include/Acts/Navigation/SurfaceCandidatesUpdators.hpp index 48edba8d9c1..13fbb042f20 100644 --- a/Core/include/Acts/Navigation/SurfaceCandidatesUpdators.hpp +++ b/Core/include/Acts/Navigation/SurfaceCandidatesUpdators.hpp @@ -43,26 +43,21 @@ inline static void updateCandidates(const GeometryContext& gctx, for (auto& c : nCandidates) { // Get the surface representation: either native surfcae of portal const Surface& sRep = - (c.surface != nullptr) ? (*c.surface) : (c.portal->surface()); + c.surface != nullptr ? *c.surface : c.portal->surface(); // Get the intersection @todo make a templated intersector - auto sIntersection = - sRep.intersect(gctx, position, direction, c.boundaryCheck); - // Re-order and swap if necessary - if (sIntersection.intersection.pathLength + s_onSurfaceTolerance < - nState.overstepTolerance and - sIntersection.alternative.status >= Intersection3D::Status::reachable) { - sIntersection.swapSolutions(); - } - c.objectIntersection = sIntersection; + // TODO surface tolerance + auto sIntersection = sRep.intersect(gctx, position, direction, + c.boundaryCheck, s_onSurfaceTolerance); + c.objectIntersection = sIntersection[c.objectIntersection.index()]; } // Sort and stuff non-allowed solutions to the end std::sort( nCandidates.begin(), nCandidates.end(), [&](const auto& a, const auto& b) { // The two path lengths - ActsScalar pathToA = a.objectIntersection.intersection.pathLength; - ActsScalar pathToB = b.objectIntersection.intersection.pathLength; + ActsScalar pathToA = a.objectIntersection.pathLength(); + ActsScalar pathToB = b.objectIntersection.pathLength(); if (pathToA + s_onSurfaceTolerance < nState.overstepTolerance or std::abs(pathToA) < s_onSurfaceTolerance) { return false; diff --git a/Core/include/Acts/Propagator/AtlasStepper.hpp b/Core/include/Acts/Propagator/AtlasStepper.hpp index 89eee80c9f6..2fbef6327af 100644 --- a/Core/include/Acts/Propagator/AtlasStepper.hpp +++ b/Core/include/Acts/Propagator/AtlasStepper.hpp @@ -375,7 +375,10 @@ class AtlasStepper { } /// Overstep limit - double overstepLimit(const State& /*state*/) const { + /// + /// @param state The stepping state (thread-local cache) + double overstepLimit(const State& state) const { + (void)state; return -m_overstepLimit; } @@ -414,7 +417,7 @@ class AtlasStepper { /// @param release [in] boolean to trigger step size release template void updateStepSize(State& state, const object_intersection_t& oIntersection, - bool release = true) const { + Direction /*direction*/, bool release = true) const { detail::updateSingleStepSize(state, oIntersection, release); } diff --git a/Core/include/Acts/Propagator/EigenStepper.hpp b/Core/include/Acts/Propagator/EigenStepper.hpp index 1c34355b041..471ef6921d9 100644 --- a/Core/include/Acts/Propagator/EigenStepper.hpp +++ b/Core/include/Acts/Propagator/EigenStepper.hpp @@ -267,7 +267,7 @@ class EigenStepper { /// @param release [in] boolean to trigger step size release template void updateStepSize(State& state, const object_intersection_t& oIntersection, - bool release = true) const { + Direction /*direction*/, bool release = true) const { detail::updateSingleStepSize(state, oIntersection, release); } @@ -307,7 +307,10 @@ class EigenStepper { } /// Overstep limit - double overstepLimit(const State& /*state*/) const { + /// + /// @param state The stepping state (thread-local cache) + double overstepLimit(const State& state) const { + (void)state; // A dynamic overstep limit could sit here return -m_overstepLimit; } diff --git a/Core/include/Acts/Propagator/MultiEigenStepperLoop.hpp b/Core/include/Acts/Propagator/MultiEigenStepperLoop.hpp index 9f67ea57978..db96af50651 100644 --- a/Core/include/Acts/Propagator/MultiEigenStepperLoop.hpp +++ b/Core/include/Acts/Propagator/MultiEigenStepperLoop.hpp @@ -23,12 +23,14 @@ #include "Acts/Propagator/EigenStepper.hpp" #include "Acts/Propagator/EigenStepperError.hpp" #include "Acts/Propagator/Propagator.hpp" +#include "Acts/Surfaces/Surface.hpp" #include "Acts/Utilities/GaussianMixtureReduction.hpp" #include "Acts/Utilities/Intersection.hpp" #include "Acts/Utilities/Result.hpp" #include #include +#include #include #include #include @@ -770,30 +772,21 @@ class MultiEigenStepperLoop /// /// @param state [in,out] The stepping state (thread-local cache) /// @param oIntersection [in] The ObjectIntersection to layer, boundary, etc + /// @param direction [in] The propagation direction /// @param release [in] boolean to trigger step size release template void updateStepSize(State& state, const object_intersection_t& oIntersection, - bool release = true) const { - const Surface& surface = *oIntersection.representation; + Direction direction, bool release = true) const { + const Surface& surface = *oIntersection.representation(); for (auto& component : state.components) { auto intersection = surface.intersect( component.state.geoContext, SingleStepper::position(component.state), - SingleStepper::direction(component.state), true); + direction * SingleStepper::direction(component.state), + true)[oIntersection.index()]; - // We don't know whatever was done to manipulate the intersection before - // (e.g. in Layer.ipp:240), so we trust and just adjust the sign - if (std::signbit(oIntersection.intersection.pathLength) != - std::signbit(intersection.intersection.pathLength)) { - intersection.intersection.pathLength *= -1; - } - - if (std::signbit(oIntersection.alternative.pathLength) != - std::signbit(intersection.alternative.pathLength)) { - intersection.alternative.pathLength *= -1; - } - - SingleStepper::updateStepSize(component.state, intersection, release); + SingleStepper::updateStepSize(component.state, intersection, direction, + release); } } diff --git a/Core/include/Acts/Propagator/MultiEigenStepperLoop.ipp b/Core/include/Acts/Propagator/MultiEigenStepperLoop.ipp index 62ea829fd0b..9d6f8b51f1b 100644 --- a/Core/include/Acts/Propagator/MultiEigenStepperLoop.ipp +++ b/Core/include/Acts/Propagator/MultiEigenStepperLoop.ipp @@ -39,7 +39,8 @@ auto MultiEigenStepperLoop::boundState( .intersect(state.geoContext, cmpState.pars.template segment<3>(eFreePos0), cmpState.pars.template segment<3>(eFreeDir0), false) - .intersection.position; + .closest() + .position(); auto bs = SingleStepper::boundState(cmpState, surface, transportCov, freeToBoundCorrection); diff --git a/Core/include/Acts/Propagator/MultiStepperAborters.hpp b/Core/include/Acts/Propagator/MultiStepperAborters.hpp index ac8f3806dfe..fa5ebe7931c 100644 --- a/Core/include/Acts/Propagator/MultiStepperAborters.hpp +++ b/Core/include/Acts/Propagator/MultiStepperAborters.hpp @@ -78,13 +78,15 @@ struct MultiStepperSurfaceReached { // However, if mean of all is on surface, we are happy as well if (averageOnSurface) { - const auto sIntersection = targetSurface.intersect( - state.geoContext, stepper.position(state.stepping), - state.options.direction * stepper.direction(state.stepping), true, - averageOnSurfaceTolerance); - - if (sIntersection.intersection.status == - Intersection3D::Status::onSurface) { + const auto sIntersection = + targetSurface + .intersect( + state.geoContext, stepper.position(state.stepping), + state.options.direction * stepper.direction(state.stepping), + true, averageOnSurfaceTolerance) + .closest(); + + if (sIntersection.status() == Intersection3D::Status::onSurface) { ACTS_VERBOSE("Reached target in average mode"); navigator.currentSurface(state.navigation, &targetSurface); navigator.targetReached(state.navigation, true); diff --git a/Core/include/Acts/Propagator/Navigator.hpp b/Core/include/Acts/Propagator/Navigator.hpp index f72149a7f2b..6f420f9902d 100644 --- a/Core/include/Acts/Propagator/Navigator.hpp +++ b/Core/include/Acts/Propagator/Navigator.hpp @@ -525,7 +525,7 @@ class Navigator { state.navigation.lastHierarchySurfaceReached = false; // Update volume information // get the attached volume information - auto boundary = state.navigation.navBoundary().object; + auto boundary = state.navigation.navBoundary().object(); state.navigation.currentVolume = boundary->attachedVolume( state.geoContext, stepper.position(state.stepping), stepper.direction(state.stepping), state.options.direction); @@ -595,7 +595,7 @@ class Navigator { return false; } // Take the current surface - auto surface = navSurfaces.at(navIndex).representation; + auto surface = navSurfaces.at(navIndex).representation(); // Check if we are at a surface // If we are on the surface pointed at by the index, we can make // it the current one to pass it to the other actors @@ -663,7 +663,7 @@ class Navigator { << "No surfaces present, target at layer first."); return false; } - auto layerID = state.navigation.navSurface().object->geometryId().layer(); + auto layerID = state.navigation.navSurface().object()->geometryId().layer(); std::pair externalSurfaceRange = state.navigation.externalSurfaces.equal_range(layerID); @@ -677,7 +677,7 @@ class Navigator { << " out of " << state.navigation.navSurfaces.size() << " surfaces remain to try."); // Take the surface - auto surface = state.navigation.navSurface().object; + auto surface = state.navigation.navSurface().object(); // Screen output which surface you are on ACTS_VERBOSE(volInfo(state) << "Next surface candidate will be " << surface->geometryId()); @@ -810,9 +810,10 @@ class Navigator { // did we find any surfaces? // Check: are we on the first surface? + // TODO magic number `1_um` if ((state.navigation.currentSurface == nullptr && state.navigation.navSurfaces.empty()) || - protoNavSurfaces.front().intersection.pathLength > 1_um) { + protoNavSurfaces.front().pathLength() > 1_um) { // we are not, go on // state.navigation.navSurfaces = std::move(protoNavSurfaces); state.navigation.navSurfaces.clear(); @@ -825,7 +826,8 @@ class Navigator { state.navigation.navLayerIndex = state.navigation.navLayers.size(); // The stepper updates the step size ( single / multi component) stepper.updateStepSize(state.stepping, - state.navigation.navSurface(), true); + state.navigation.navSurface(), + state.options.direction, true); ACTS_VERBOSE(volInfo(state) << "Navigation stepSize updated to " << stepper.outputStepSize(state.stepping)); @@ -843,7 +845,7 @@ class Navigator { while (state.navigation.navLayerIndex != state.navigation.navLayers.size()) { // The layer surface - auto layerSurface = state.navigation.navLayer().representation; + auto layerSurface = state.navigation.navLayer().representation(); // We are on the layer if (state.navigation.currentSurface == layerSurface) { ACTS_VERBOSE(volInfo(state) << "We are on a layer, resolve Surfaces."); @@ -972,7 +974,7 @@ class Navigator { os << state.navigation.navBoundaries.size(); os << " boundary candidates found at path(s): "; for (auto& bc : state.navigation.navBoundaries) { - os << bc.intersection.pathLength << " "; + os << bc.pathLength() << " "; } logger().log(Logging::VERBOSE, os.str()); } @@ -981,7 +983,7 @@ class Navigator { if (not state.navigation.navBoundaries.empty()) { // Set to the first and return to the stepper stepper.updateStepSize(state.stepping, state.navigation.navBoundary(), - true); + state.options.direction, true); ACTS_VERBOSE(volInfo(state) << "Navigation stepSize updated to " << stepper.outputStepSize(state.stepping)); return true; @@ -998,7 +1000,7 @@ class Navigator { while (state.navigation.navBoundaryIndex != state.navigation.navBoundaries.size()) { // That is the current boundary surface - auto boundarySurface = state.navigation.navBoundary().representation; + auto boundarySurface = state.navigation.navBoundary().representation(); // Step towards the boundary surfrace auto boundaryStatus = stepper.updateSurfaceStatus( state.stepping, *boundarySurface, state.options.direction, true, @@ -1081,18 +1083,21 @@ class Navigator { } // Slow navigation initialization for target: // target volume and layer search through global search - auto targetIntersection = state.navigation.targetSurface->intersect( - state.geoContext, stepper.position(state.stepping), - state.options.direction * stepper.direction(state.stepping), false, - state.options.targetTolerance); + auto targetIntersection = + state.navigation.targetSurface + ->intersect( + state.geoContext, stepper.position(state.stepping), + state.options.direction * stepper.direction(state.stepping), + false, state.options.targetTolerance) + .closest(); if (targetIntersection) { ACTS_VERBOSE(volInfo(state) << "Target estimate position (" - << targetIntersection.intersection.position.x() << ", " - << targetIntersection.intersection.position.y() << ", " - << targetIntersection.intersection.position.z() << ")"); + << targetIntersection.position().x() << ", " + << targetIntersection.position().y() << ", " + << targetIntersection.position().z() << ")"); /// get the target volume from the intersection - auto tPosition = targetIntersection.intersection.position; + auto tPosition = targetIntersection.position(); state.navigation.targetVolume = m_cfg.trackingGeometry->lowestTrackingVolume(state.geoContext, tPosition); @@ -1125,8 +1130,8 @@ class Navigator { const Layer* cLayer = nullptr) const { // get the layer and layer surface auto layerSurface = cLayer ? state.navigation.startSurface - : state.navigation.navLayer().representation; - auto navLayer = cLayer ? cLayer : state.navigation.navLayer().object; + : state.navigation.navLayer().representation(); + auto navLayer = cLayer ? cLayer : state.navigation.navLayer().object(); // are we on the start layer bool onStart = (navLayer == state.navigation.startLayer); auto startSurface = onStart ? state.navigation.startSurface : layerSurface; @@ -1169,7 +1174,7 @@ class Navigator { os << state.navigation.navSurfaces.size(); os << " surface candidates found at path(s): "; for (auto& sfc : state.navigation.navSurfaces) { - os << sfc.intersection.pathLength << " "; + os << sfc.pathLength() << " "; } logger().log(Logging::VERBOSE, os.str()); } @@ -1178,7 +1183,7 @@ class Navigator { state.navigation.navSurfaceIndex = 0; // The stepper updates the step size ( single / multi component) stepper.updateStepSize(state.stepping, state.navigation.navSurface(), - true); + state.options.direction, true); ACTS_VERBOSE(volInfo(state) << "Navigation stepSize updated to " << stepper.outputStepSize(state.stepping)); return true; @@ -1240,7 +1245,7 @@ class Navigator { os << state.navigation.navLayers.size(); os << " layer candidates found at path(s): "; for (auto& lc : state.navigation.navLayers) { - os << lc.intersection.pathLength << " "; + os << lc.pathLength() << " "; } logger().log(Logging::VERBOSE, os.str()); } @@ -1248,11 +1253,11 @@ class Navigator { state.navigation.navLayerIndex = 0; // Setting the step size towards first if (state.navigation.startLayer && - state.navigation.navLayer().object != state.navigation.startLayer) { + state.navigation.navLayer().object() != state.navigation.startLayer) { ACTS_VERBOSE(volInfo(state) << "Target at layer."); // The stepper updates the step size ( single / multi component) stepper.updateStepSize(state.stepping, state.navigation.navLayer(), - true); + state.options.direction, true); ACTS_VERBOSE(volInfo(state) << "Navigation stepSize updated to " << stepper.outputStepSize(state.stepping)); return true; diff --git a/Core/include/Acts/Propagator/StandardAborters.hpp b/Core/include/Acts/Propagator/StandardAborters.hpp index e385048cdc8..aee88303615 100644 --- a/Core/include/Acts/Propagator/StandardAborters.hpp +++ b/Core/include/Acts/Propagator/StandardAborters.hpp @@ -10,6 +10,7 @@ #include "Acts/Definitions/Algebra.hpp" #include "Acts/Definitions/Direction.hpp" +#include "Acts/Definitions/Units.hpp" #include "Acts/Propagator/ConstrainedStep.hpp" #include "Acts/Surfaces/BoundaryCheck.hpp" #include "Acts/Surfaces/Surface.hpp" @@ -17,6 +18,7 @@ #include "Acts/Utilities/Logger.hpp" #include +#include #include #include @@ -87,7 +89,10 @@ struct PathLimitReached { /// This is the condition that the Surface has been reached /// it then triggers an propagation abort of the propagation struct SurfaceReached { + std::optional overstepLimit; + SurfaceReached() = default; + SurfaceReached(double oLimit) : overstepLimit(oLimit) {} /// boolean operator for abort condition without using the result /// @@ -126,6 +131,7 @@ struct SurfaceReached { if (navigator.targetReached(state.navigation)) { return true; } + // Check if the cache filled the currentSurface - or if we are on the // surface if ((navigator.currentSurface(state.navigation) && @@ -136,23 +142,25 @@ struct SurfaceReached { navigator.targetReached(state.navigation, true); return true; } + + // TODO the following code is mostly duplicated in updateSingleSurfaceStatus + // Calculate the distance to the surface const double tolerance = state.options.targetTolerance; + const auto sIntersection = targetSurface.intersect( state.geoContext, stepper.position(state.stepping), state.options.direction * stepper.direction(state.stepping), true, tolerance); - - // The target is reached - bool targetReached = (sIntersection.intersection.status == - Intersection3D::Status::onSurface); - double distance = sIntersection.intersection.pathLength; + const auto closest = sIntersection.closest(); // Return true if you fall below tolerance - if (targetReached) { + if (closest.status() == Intersection3D::Status::onSurface) { + const double distance = closest.pathLength(); ACTS_VERBOSE("Target: x | " << "Target surface reached at distance (tolerance) " << distance << " (" << tolerance << ")"); + // assigning the currentSurface navigator.currentSurface(state.navigation, &targetSurface); ACTS_VERBOSE("Target: x | " @@ -161,23 +169,32 @@ struct SurfaceReached { // reaching the target calls a navigation break navigator.targetReached(state.navigation, true); - } else { - // Target is not reached, update the step size - const double overstepLimit = stepper.overstepLimit(state.stepping); - // Check the alternative solution - if (distance < overstepLimit and sIntersection.alternative) { - // Update the distance to the alternative solution - distance = sIntersection.alternative.pathLength; - } - stepper.setStepSize(state.stepping, distance, ConstrainedStep::aborter, - false); - ACTS_VERBOSE("Target: 0 | " - << "Target stepSize (surface) updated to " - << stepper.outputStepSize(state.stepping)); + return true; } - // path limit check - return targetReached; + + const double pLimit = + state.stepping.stepSize.value(ConstrainedStep::aborter); + // not using the stepper overstep limit here because it does not always work + // for perigee surfaces + const double oLimit = + overstepLimit.value_or(stepper.overstepLimit(state.stepping)); + + for (const auto& intersection : sIntersection.split()) { + if (intersection && + detail::checkIntersection(intersection.intersection(), pLimit, oLimit, + tolerance, logger)) { + stepper.setStepSize(state.stepping, intersection.pathLength(), + ConstrainedStep::aborter, false); + break; + } + } + + ACTS_VERBOSE("Target: 0 | " + << "Target stepSize (surface) updated to " + << stepper.outputStepSize(state.stepping)); + + return false; } }; diff --git a/Core/include/Acts/Propagator/StraightLineStepper.hpp b/Core/include/Acts/Propagator/StraightLineStepper.hpp index ed1ca6c5b70..0e54510db4f 100644 --- a/Core/include/Acts/Propagator/StraightLineStepper.hpp +++ b/Core/include/Acts/Propagator/StraightLineStepper.hpp @@ -218,7 +218,10 @@ class StraightLineStepper { double time(const State& state) const { return state.pars[eFreeTime]; } /// Overstep limit - double overstepLimit(const State& /*state*/) const { + /// + /// @param state The stepping state (thread-local cache) + double overstepLimit(const State& state) const { + (void)state; return -m_overstepLimit; } @@ -254,7 +257,7 @@ class StraightLineStepper { /// @param release [in] boolean to trigger step size release template void updateStepSize(State& state, const object_intersection_t& oIntersection, - bool release = true) const { + Direction /*direction*/, bool release = true) const { detail::updateSingleStepSize(state, oIntersection, release); } diff --git a/Core/include/Acts/Propagator/detail/SteppingHelper.hpp b/Core/include/Acts/Propagator/detail/SteppingHelper.hpp index 865aac8b11c..8ffe3ec05eb 100644 --- a/Core/include/Acts/Propagator/detail/SteppingHelper.hpp +++ b/Core/include/Acts/Propagator/detail/SteppingHelper.hpp @@ -43,32 +43,27 @@ Acts::Intersection3D::Status updateSingleSurfaceStatus( navDir * stepper.direction(state), bcheck, surfaceTolerance); // The intersection is on surface already - if (sIntersection.intersection.status == Intersection3D::Status::onSurface) { + if (sIntersection.closest().status() == Intersection3D::Status::onSurface) { // Release navigation step size state.stepSize.release(ConstrainedStep::actor); ACTS_VERBOSE("Intersection: state is ON SURFACE"); return Intersection3D::Status::onSurface; - } else if (sIntersection.intersection or sIntersection.alternative) { - // Path and overstep limit checking - double pLimit = state.stepSize.value(ConstrainedStep::aborter); - double oLimit = stepper.overstepLimit(state); + } - // If either of the two intersections are viable return reachable - if (detail::checkIntersection(sIntersection.intersection, pLimit, oLimit, - surfaceTolerance, logger)) { - ACTS_VERBOSE("Surface is reachable"); - stepper.setStepSize(state, sIntersection.intersection.pathLength); - return Intersection3D::Status::reachable; - } + // Path and overstep limit checking + const double pLimit = state.stepSize.value(ConstrainedStep::aborter); + const double oLimit = stepper.overstepLimit(state); - if (sIntersection.alternative and - detail::checkIntersection(sIntersection.alternative, pLimit, oLimit, + for (const auto& intersection : sIntersection.split()) { + if (intersection && + detail::checkIntersection(intersection.intersection(), pLimit, oLimit, surfaceTolerance, logger)) { ACTS_VERBOSE("Surface is reachable"); - stepper.setStepSize(state, sIntersection.alternative.pathLength); + stepper.setStepSize(state, intersection.pathLength()); return Intersection3D::Status::reachable; } } + ACTS_VERBOSE("Surface is NOT reachable"); return Intersection3D::Status::unreachable; } @@ -85,7 +80,7 @@ template void updateSingleStepSize(typename stepper_t::State& state, const object_intersection_t& oIntersection, bool release = true) { - double stepSize = oIntersection.intersection.pathLength; + double stepSize = oIntersection.pathLength(); state.stepSize.update(stepSize, ConstrainedStep::actor, release); } diff --git a/Core/include/Acts/Surfaces/ConeSurface.hpp b/Core/include/Acts/Surfaces/ConeSurface.hpp index cf659eda6be..debe2a47934 100644 --- a/Core/include/Acts/Surfaces/ConeSurface.hpp +++ b/Core/include/Acts/Surfaces/ConeSurface.hpp @@ -181,8 +181,8 @@ class ConeSurface : public Surface { /// /// If possible returns both solutions for the cylinder /// - /// @return SurfaceIntersection object (contains intersection & surface) - SurfaceIntersection intersect( + /// @return @c SurfaceMultiIntersection object (contains intersection & surface) + SurfaceMultiIntersection intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck = false, double tolerance = s_onSurfaceTolerance) const final; diff --git a/Core/include/Acts/Surfaces/CylinderSurface.hpp b/Core/include/Acts/Surfaces/CylinderSurface.hpp index 68d30ed4f95..847a925aca2 100644 --- a/Core/include/Acts/Surfaces/CylinderSurface.hpp +++ b/Core/include/Acts/Surfaces/CylinderSurface.hpp @@ -192,7 +192,7 @@ class CylinderSurface : public Surface { /// If possible returns both solutions for the cylinder /// /// @return SurfaceIntersection object (contains intersection & surface) - SurfaceIntersection intersect( + SurfaceMultiIntersection intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck = false, ActsScalar tolerance = s_onSurfaceTolerance) const final; diff --git a/Core/include/Acts/Surfaces/DiscSurface.hpp b/Core/include/Acts/Surfaces/DiscSurface.hpp index a2f9ed127fa..df4e58f6d34 100644 --- a/Core/include/Acts/Surfaces/DiscSurface.hpp +++ b/Core/include/Acts/Surfaces/DiscSurface.hpp @@ -271,8 +271,8 @@ class DiscSurface : public Surface { /// - either in the plane /// - perpendicular to the normal of the plane /// - /// @return The SurfaceIntersection object - SurfaceIntersection intersect( + /// @return The @c SurfaceMultiIntersection object + SurfaceMultiIntersection intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck = false, ActsScalar tolerance = s_onSurfaceTolerance) const final; diff --git a/Core/include/Acts/Surfaces/LineSurface.hpp b/Core/include/Acts/Surfaces/LineSurface.hpp index 89b25aae5ad..f6d83e89540 100644 --- a/Core/include/Acts/Surfaces/LineSurface.hpp +++ b/Core/include/Acts/Surfaces/LineSurface.hpp @@ -250,7 +250,7 @@ class LineSurface : public Surface { /// @param bcheck The boundary check directive for the estimate /// @param tolerance the tolerance used for the intersection /// @return is the intersection object - SurfaceIntersection intersect( + SurfaceMultiIntersection intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck = false, ActsScalar tolerance = s_onSurfaceTolerance) const final; diff --git a/Core/include/Acts/Surfaces/PlaneSurface.hpp b/Core/include/Acts/Surfaces/PlaneSurface.hpp index fe38427374a..a7200bc82f3 100644 --- a/Core/include/Acts/Surfaces/PlaneSurface.hpp +++ b/Core/include/Acts/Surfaces/PlaneSurface.hpp @@ -186,8 +186,8 @@ class PlaneSurface : public Surface { /// - either in the plane /// - perpendicular to the normal of the plane /// - /// @return the SurfaceIntersection object - SurfaceIntersection intersect( + /// @return the @c SurfaceMultiIntersection object + SurfaceMultiIntersection intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck = false, ActsScalar tolerance = s_onSurfaceTolerance) const final; diff --git a/Core/include/Acts/Surfaces/Surface.hpp b/Core/include/Acts/Surfaces/Surface.hpp index c5615cda832..84336f92f0f 100644 --- a/Core/include/Acts/Surfaces/Surface.hpp +++ b/Core/include/Acts/Surfaces/Surface.hpp @@ -46,6 +46,8 @@ class Surface; /// Typedef of the surface intersection using SurfaceIntersection = ObjectIntersection; +/// Typedef of the surface multi-intersection +using SurfaceMultiIntersection = ObjectMultiIntersection; /// @class Surface /// @@ -407,8 +409,8 @@ class Surface : public virtual GeometryObject, /// @param bcheck the Boundary Check /// @param tolerance the tolerance used for the intersection /// - /// @return SurfaceIntersection object (contains intersection & surface) - virtual SurfaceIntersection intersect( + /// @return @c SurfaceMultiIntersection object (contains intersection & surface) + virtual SurfaceMultiIntersection intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck = false, ActsScalar tolerance = s_onSurfaceTolerance) const = 0; diff --git a/Core/include/Acts/Surfaces/detail/PlanarHelper.hpp b/Core/include/Acts/Surfaces/detail/PlanarHelper.hpp index eb8034b90a4..32c6a8bf75d 100644 --- a/Core/include/Acts/Surfaces/detail/PlanarHelper.hpp +++ b/Core/include/Acts/Surfaces/detail/PlanarHelper.hpp @@ -43,7 +43,7 @@ inline Intersection3D intersect(const Transform3& transform, // Return the intersection return Intersection3D{(position + path * direction), path, status}; } - return Intersection3D(); + return Intersection3D::invalid(); } } // namespace PlanarHelper diff --git a/Core/include/Acts/TrackFinding/CombinatorialKalmanFilter.hpp b/Core/include/Acts/TrackFinding/CombinatorialKalmanFilter.hpp index 1f477500056..445c77db8c3 100644 --- a/Core/include/Acts/TrackFinding/CombinatorialKalmanFilter.hpp +++ b/Core/include/Acts/TrackFinding/CombinatorialKalmanFilter.hpp @@ -40,6 +40,7 @@ #include "Acts/Utilities/Zip.hpp" #include +#include #include #include #include @@ -1187,10 +1188,12 @@ class CombinatorialKalmanFilter { // Lambda to get the intersection of the free params on the target surface auto target = [&](const FreeVector& freeVector) -> SurfaceIntersection { - return smoothingTargetSurface->intersect( - state.geoContext, freeVector.segment<3>(eFreePos0), - state.options.direction * freeVector.segment<3>(eFreeDir0), true, - state.options.targetTolerance); + return smoothingTargetSurface + ->intersect( + state.geoContext, freeVector.segment<3>(eFreePos0), + state.options.direction * freeVector.segment<3>(eFreeDir0), + true, state.options.targetTolerance) + .closest(); }; // The smoothed free params at the first/last measurement state @@ -1213,20 +1216,20 @@ class CombinatorialKalmanFilter { // surface is not checked here. bool reverseDirection = false; bool closerToFirstCreatedState = - (std::abs(firstIntersection.intersection.pathLength) <= - std::abs(lastIntersection.intersection.pathLength)); + (std::abs(firstIntersection.pathLength()) <= + std::abs(lastIntersection.pathLength())); if (closerToFirstCreatedState) { stepper.update(state.stepping, firstParams, firstCreatedState.smoothed(), firstCreatedState.smoothedCovariance(), firstCreatedState.referenceSurface()); - reverseDirection = (firstIntersection.intersection.pathLength < 0); + reverseDirection = firstIntersection.pathLength() < 0; } else { stepper.update(state.stepping, lastParams, lastCreatedMeasurement.smoothed(), lastCreatedMeasurement.smoothedCovariance(), lastCreatedMeasurement.referenceSurface()); - reverseDirection = (lastIntersection.intersection.pathLength < 0); + reverseDirection = lastIntersection.pathLength() < 0; } const auto& surface = closerToFirstCreatedState ? firstCreatedState.referenceSurface() @@ -1268,7 +1271,7 @@ class CombinatorialKalmanFilter { source_link_accessor_t m_sourcelinkAccessor; /// The Surface being targeted - SurfaceReached targetReached; + SurfaceReached targetReached{std::numeric_limits::lowest()}; /// Actor logger instance const Logger* actorLogger{nullptr}; diff --git a/Core/include/Acts/TrackFitting/GaussianSumFitter.hpp b/Core/include/Acts/TrackFitting/GaussianSumFitter.hpp index c45a793d482..0d1e63285dc 100644 --- a/Core/include/Acts/TrackFitting/GaussianSumFitter.hpp +++ b/Core/include/Acts/TrackFitting/GaussianSumFitter.hpp @@ -215,7 +215,8 @@ struct GaussianSumFitter { .intersect(GeometryContext{}, sParameters.position(GeometryContext{}), sParameters.direction(), true) - .intersection.status; + .closest() + .status(); if (intersectionStatusStartSurface != Intersection3D::Status::onSurface) { ACTS_ERROR( diff --git a/Core/include/Acts/TrackFitting/KalmanFitter.hpp b/Core/include/Acts/TrackFitting/KalmanFitter.hpp index a6f00140c8f..74b9c4e37cf 100644 --- a/Core/include/Acts/TrackFitting/KalmanFitter.hpp +++ b/Core/include/Acts/TrackFitting/KalmanFitter.hpp @@ -40,6 +40,7 @@ #include "Acts/Utilities/Result.hpp" #include +#include #include #include @@ -323,7 +324,7 @@ class KalmanFitter { KalmanFitterExtensions extensions; /// The Surface being - SurfaceReached targetReached; + SurfaceReached targetReached{std::numeric_limits::lowest()}; /// Calibration context for the fit const CalibrationContext* calibrationContext{nullptr}; @@ -932,10 +933,12 @@ class KalmanFitter { // Lambda to get the intersection of the free params on the target surface auto target = [&](const FreeVector& freeVector) -> SurfaceIntersection { - return targetSurface->intersect( - state.geoContext, freeVector.segment<3>(eFreePos0), - state.options.direction * freeVector.segment<3>(eFreeDir0), true, - state.options.targetTolerance); + return targetSurface + ->intersect( + state.geoContext, freeVector.segment<3>(eFreePos0), + state.options.direction * freeVector.segment<3>(eFreeDir0), + true, state.options.targetTolerance) + .closest(); }; // The smoothed free params at the first/last measurement state. @@ -959,18 +962,20 @@ class KalmanFitter { // surface is not checked here. bool reverseDirection = false; bool closerTofirstCreatedState = - (std::abs(firstIntersection.intersection.pathLength) <= - std::abs(lastIntersection.intersection.pathLength)); + std::abs(firstIntersection.pathLength()) <= + std::abs(lastIntersection.pathLength()); if (closerTofirstCreatedState) { stepper.resetState(state.stepping, firstCreatedState.smoothed(), firstCreatedState.smoothedCovariance(), - firstCreatedState.referenceSurface()); - reverseDirection = (firstIntersection.intersection.pathLength < 0); + firstCreatedState.referenceSurface(), + state.options.maxStepSize); + reverseDirection = firstIntersection.pathLength() < 0; } else { stepper.resetState(state.stepping, lastCreatedMeasurement.smoothed(), lastCreatedMeasurement.smoothedCovariance(), - lastCreatedMeasurement.referenceSurface()); - reverseDirection = (lastIntersection.intersection.pathLength < 0); + lastCreatedMeasurement.referenceSurface(), + state.options.maxStepSize); + reverseDirection = lastIntersection.pathLength() < 0; } const auto& surface = closerTofirstCreatedState ? firstCreatedState.referenceSurface() diff --git a/Core/include/Acts/Utilities/Intersection.hpp b/Core/include/Acts/Utilities/Intersection.hpp index aa06617ce5b..6eebafff4e8 100644 --- a/Core/include/Acts/Utilities/Intersection.hpp +++ b/Core/include/Acts/Utilities/Intersection.hpp @@ -1,21 +1,24 @@ // This file is part of the Acts project. // -// Copyright (C) 2016-2018 CERN for the benefit of the Acts project +// Copyright (C) 2016-2023 CERN for the benefit of the Acts project // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -/////////////////////////////////////////////////////////////////// -// Intersection.hpp, Acts project -/////////////////////////////////////////////////////////////////// - #pragma once + #include "Acts/Definitions/Algebra.hpp" #include "Acts/Utilities/Logger.hpp" +#include #include +#include +#include #include + +#include + namespace Acts { /// Status enum @@ -39,145 +42,237 @@ inline std::ostream& operator<<(std::ostream& os, IntersectionStatus status) { /// /// Intersection struct used for position template -struct Intersection { +class Intersection { + public: + /// Position type + using Position = ActsVector; /// Status enum using Status = IntersectionStatus; - /// Position of the intersection - ActsVector position = ActsVector::Zero(); - /// Signed path length to the intersection (if valid) - typename ActsVector::Scalar pathLength{ - std::numeric_limits::infinity()}; - /// The Status of the intersection - Status status{Status::unreachable}; - /// Constructor with arguments /// - /// @param sinter is the position of the intersection - /// @param slength is the path length to the intersection - /// @param sstatus is an enum indicating the status of the intersection - Intersection(const ActsVector& sinter, double slength, Status sstatus) - : position(sinter), pathLength(slength), status(sstatus) {} - - /// Default constructor - Intersection() = default; - - /// Bool() operator for validity checking - explicit operator bool() const { return (status != Status::missed); } - - /// Smaller operator for sorting, - /// - it respects the validity of the intersection - /// @param si is the intersection for testing - bool operator<(const Intersection& si) const { - if (status == Status::unreachable) { - return false; - } - // Now check the pathLength - if (si.status != Status::unreachable) { - return (pathLength < si.pathLength); - } - // The current one wins, no re-ordering - return true; + /// @param position is the position of the intersection + /// @param pathLength is the path length to the intersection + /// @param status is an enum indicating the status of the intersection + constexpr Intersection(const Position& position, double pathLength, + Status status) + : m_position(position), m_pathLength(pathLength), m_status(status) {} + + /// Returns whether the intersection was successful or not + constexpr explicit operator bool() const { + return m_status != Status::missed; + } + + constexpr const Position& position() const { return m_position; } + + constexpr ActsScalar pathLength() const { return m_pathLength; } + + constexpr Status status() const { return m_status; } + + constexpr static Intersection invalid() { return Intersection(); } + + /// Comparison function for forward order i.e. intersection closest to -inf + /// will be first. + constexpr static bool forwardOrder(const Intersection& aIntersection, + const Intersection& bIntersection) { + auto a = aIntersection.pathLength(); + auto b = bIntersection.pathLength(); + return a < b; } - /// Greater operator for sorting, - /// - it respects the validity of the intersection - /// @param si is the intersection for testing - bool operator>(const Intersection& si) const { - if (status == Status::unreachable) { + /// Comparison function for closest order i.e. intersection closest to 0 will + /// be first. + constexpr static bool closestOrder(const Intersection& aIntersection, + const Intersection& bIntersection) { + if ((aIntersection.status() == Status::unreachable) && + (bIntersection.status() != Status::unreachable)) { return false; } - // Now check the pathLength - if (si.status != Status::unreachable) { - return (pathLength > si.pathLength); + if ((aIntersection.status() != Status::unreachable) && + (bIntersection.status() == Status::unreachable)) { + return true; } - // The current one wins, no re-ordering - return true; + // both are reachable or onSurface now + auto a = aIntersection.pathLength(); + auto b = bIntersection.pathLength(); + return std::abs(a) < std::abs(b); } + + private: + /// Position of the intersection + Position m_position = Position::Zero(); + /// Signed path length to the intersection (if valid) + ActsScalar m_pathLength = std::numeric_limits::infinity(); + /// The Status of the intersection + Status m_status = Status::unreachable; + + constexpr Intersection() = default; }; using Intersection2D = Intersection<2>; - using Intersection3D = Intersection<3>; +static constexpr std::uint8_t s_maximumNumberOfIntersections = 2; +using MultiIntersection3D = + boost::container::static_vector; + /// @brief class extensions to return also the object and a representation template class ObjectIntersection { public: + /// Object intersection - symmetric setup + /// + /// @param intersection is the intersection + /// @param object is the object to be instersected + /// @param index is the intersection index + template ::value, int> = 0> + constexpr ObjectIntersection(const Intersection3D& intersection, + const object_t* object, std::uint8_t index = 0) + : m_intersection(intersection), + m_object(object), + m_representation(object), + m_index(index) {} + + /// Object intersection + /// + /// @param intersection is the intersection + /// @param object is the object to be instersected + /// @param representation is the object representation + /// @param index is the intersection index + constexpr ObjectIntersection(const Intersection3D& intersection, + const object_t* object, + const representation_t* representation, + std::uint8_t index = 0) + : m_intersection(intersection), + m_object(object), + m_representation(representation), + m_index(index) {} + + /// Returns whether the intersection was successful or not + constexpr explicit operator bool() const { + return m_intersection.operator bool(); + } + + constexpr const Intersection3D& intersection() const { + return m_intersection; + } + + constexpr const Intersection3D::Position& position() const { + return m_intersection.position(); + } + + constexpr ActsScalar pathLength() const { + return m_intersection.pathLength(); + } + + constexpr Intersection3D::Status status() const { + return m_intersection.status(); + } + + constexpr const object_t* object() const { return m_object; } + + constexpr const representation_t* representation() const { + return m_representation; + } + + constexpr std::uint8_t index() const { return m_index; } + + constexpr static ObjectIntersection invalid() { return ObjectIntersection(); } + + constexpr static bool forwardOrder(const ObjectIntersection& aIntersection, + const ObjectIntersection& bIntersection) { + return Intersection3D::forwardOrder(aIntersection.intersection(), + bIntersection.intersection()); + } + + constexpr static bool closestOrder(const ObjectIntersection& aIntersection, + const ObjectIntersection& bIntersection) { + return Intersection3D::closestOrder(aIntersection.intersection(), + bIntersection.intersection()); + } + + private: /// The intersection itself - Intersection3D intersection{}; + Intersection3D m_intersection = Intersection3D::invalid(); /// The object that was (tried to be) intersected - const object_t* object{nullptr}; + const object_t* m_object = nullptr; /// The representation of this object - const representation_t* representation{nullptr}; + const representation_t* m_representation = nullptr; + /// The intersection index + std::uint8_t m_index = 0; - /// The alternative intersections - Intersection3D alternative{}; + constexpr ObjectIntersection() = default; +}; - /// Default constructor - ObjectIntersection() = default; +/// @brief class extensions to return also the object and a representation +template +class ObjectMultiIntersection { + public: + using SplitIntersections = boost::container::static_vector< + ObjectIntersection, + s_maximumNumberOfIntersections>; /// Object intersection - symmetric setup /// - /// @param sInter is the intersection - /// @param sObject is the object to be instersected + /// @param intersections are the intersections + /// @param object is the object to be instersected template ::value, int> = 0> - ObjectIntersection(const Intersection3D& sInter, const object_t* sObject) - : intersection(sInter), object(sObject), representation(sObject) {} + constexpr ObjectMultiIntersection(const MultiIntersection3D& intersections, + const object_t* object) + : m_intersections(intersections), + m_object(object), + m_representation(object) {} /// Object intersection /// - /// @param sInter is the intersection - /// @param sObject is the object to be instersected - /// @param sRepresentation is the object representation - ObjectIntersection(const Intersection3D& sInter, const object_t* sObject, - const representation_t* sRepresentation) - : intersection(sInter), - object(sObject), - representation(sRepresentation) {} - - /// Bool() operator for validity checking - explicit operator bool() const { return bool(intersection); } - - /// @brief Smaller operator for ordering & sorting - /// - /// This operator will ignore the alternative, but simply - /// order the representing intersection - /// - /// @param oi is the source intersection for comparison - bool operator<( - const ObjectIntersection& oi) const { - return (intersection < oi.intersection); + /// @param intersections are the intersections + /// @param object is the object to be instersected + /// @param representation is the object representation + constexpr ObjectMultiIntersection(const MultiIntersection3D& intersections, + const object_t* object, + const representation_t* representation) + : m_intersections(intersections), + m_object(object), + m_representation(representation) {} + + constexpr ObjectIntersection operator[]( + std::uint8_t index) const { + return {m_intersections[index], m_object, m_representation, index}; } - /// @brief Greater operator for ordering & sorting - /// - /// This operator will ignore the alternative, but simply - /// order the representing intersection - /// - /// @param oi is the source intersection for comparison - bool operator>( - const ObjectIntersection& oi) const { - return (intersection > oi.intersection); + constexpr std::size_t size() const { return m_intersections.size(); } + + constexpr const object_t* object() const { return m_object; } + + constexpr const representation_t* representation() const { + return m_representation; } - /// Allow swapping the intersection and the alternative - void swapSolutions() { std::swap(intersection, alternative); } -}; + constexpr SplitIntersections split() const { + SplitIntersections result; + for (std::size_t i = 0; i < size(); ++i) { + result.push_back(operator[](i)); + } + return result; + } -struct SameSurfaceIntersection { - /// @brief comparison operator - /// - /// This is a struct to pick out intersection with identical surfaces - /// - /// @tparam intersection_t Type of the intersection object - /// @param i1 First intersection to test - /// @param i2 Second intersection to test - template - bool operator()(const intersection_t& i1, const intersection_t& i2) const { - return (i1.object == i2.object); + constexpr ObjectIntersection closest() const { + auto splitIntersections = split(); + return *std::min_element( + splitIntersections.begin(), splitIntersections.end(), + ObjectIntersection::closestOrder); } + + private: + /// The intersections + MultiIntersection3D m_intersections; + /// The object that was (tried to be) intersected + const object_t* m_object = nullptr; + /// The representation of this object + const representation_t* m_representation = nullptr; }; namespace detail { @@ -199,7 +294,7 @@ template bool checkIntersection(const intersection_t& intersection, double pLimit, double oLimit, double tolerance, const Logger& logger = getDummyLogger()) { - const double cLimit = intersection.pathLength; + const double cLimit = intersection.pathLength(); ACTS_VERBOSE(" -> pLimit, oLimit, cLimit: " << pLimit << ", " << oLimit << ", " << cLimit); diff --git a/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp b/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp index cb54a802e8f..121c9a95287 100644 --- a/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp +++ b/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp @@ -32,15 +32,17 @@ Acts::Result Acts:: // move on a straight line. // This allows us to determine whether we need to propagate the track // forward or backward to arrive at the PCA. - auto intersection = perigeeSurface->intersect(gctx, params.position(gctx), - params.direction(), false); + auto intersection = + perigeeSurface + ->intersect(gctx, params.position(gctx), params.direction(), false) + .closest(); // Setting the propagation direction using the intersection length from // above // We handle zero path length as forward propagation, but we could actually // skip the whole propagation in this case pOptions.direction = - Direction::fromScalarZeroAsPositive(intersection.intersection.pathLength); + Direction::fromScalarZeroAsPositive(intersection.pathLength()); // Propagate to the PCA of linPointPos auto result = m_cfg.propagator->propagate(params, *perigeeSurface, pOptions); diff --git a/Core/include/Acts/Vertexing/ImpactPointEstimator.ipp b/Core/include/Acts/Vertexing/ImpactPointEstimator.ipp index b23eb6ae03f..961868689b2 100644 --- a/Core/include/Acts/Vertexing/ImpactPointEstimator.ipp +++ b/Core/include/Acts/Vertexing/ImpactPointEstimator.ipp @@ -70,9 +70,15 @@ Acts::ImpactPointEstimator:: std::shared_ptr planeSurface = Surface::makeShared(thePlane); + auto intersection = planeSurface + ->intersect(gctx, trkParams.position(gctx), + trkParams.direction(), false) + .closest(); + // Create propagator options propagator_options_t pOptions(gctx, mctx); - pOptions.direction = Direction::Backward; + pOptions.direction = + Direction::fromScalarZeroAsPositive(intersection.pathLength()); // Do the propagation to linPointPos auto result = m_cfg.propagator->propagate(trkParams, *planeSurface, pOptions); diff --git a/Core/include/Acts/Vertexing/NumericalTrackLinearizer.ipp b/Core/include/Acts/Vertexing/NumericalTrackLinearizer.ipp index c111c788657..89bb4f3db4c 100644 --- a/Core/include/Acts/Vertexing/NumericalTrackLinearizer.ipp +++ b/Core/include/Acts/Vertexing/NumericalTrackLinearizer.ipp @@ -34,15 +34,17 @@ Acts::NumericalTrackLinearizer:: // move on a straight line. // This allows us to determine whether we need to propagate the track // forward or backward to arrive at the PCA. - auto intersection = perigeeSurface->intersect(gctx, params.position(gctx), - params.direction(), false); + auto intersection = + perigeeSurface + ->intersect(gctx, params.position(gctx), params.direction(), false) + .closest(); // Setting the propagation direction using the intersection length from // above. // We handle zero path length as forward propagation, but we could actually // skip the whole propagation in this case. pOptions.direction = - Direction::fromScalarZeroAsPositive(intersection.intersection.pathLength); + Direction::fromScalarZeroAsPositive(intersection.pathLength()); // Propagate to the PCA of linPointPos auto result = m_cfg.propagator->propagate(params, *perigeeSurface, pOptions); @@ -115,14 +117,16 @@ Acts::NumericalTrackLinearizer:: paramVecCopy(eLinTheta)); // Since we work in 4D we have eLinPosSize = 4 CurvilinearTrackParameters wiggledCurvilinearParams( - paramVecCopy.head(eLinPosSize), wiggledDir, paramVecCopy(eLinQOverP), - std::nullopt, ParticleHypothesis::pion()); + paramVecCopy.template head(), wiggledDir, + paramVecCopy(eLinQOverP), std::nullopt, ParticleHypothesis::pion()); // Obtain propagation direction - intersection = perigeeSurface->intersect( - gctx, paramVecCopy.head(eLinPosSize - 1), wiggledDir, false); - pOptions.direction = Direction::fromScalarZeroAsPositive( - intersection.intersection.pathLength); + intersection = perigeeSurface + ->intersect(gctx, paramVecCopy.template head<3>(), + wiggledDir, false) + .closest(); + pOptions.direction = + Direction::fromScalarZeroAsPositive(intersection.pathLength()); // Propagate to the new PCA and extract Perigee parameters auto newResult = m_cfg.propagator->propagate(wiggledCurvilinearParams, diff --git a/Core/src/Digitization/PlanarModuleStepper.cpp b/Core/src/Digitization/PlanarModuleStepper.cpp index c4cf9abb59d..c26298364b4 100644 --- a/Core/src/Digitization/PlanarModuleStepper.cpp +++ b/Core/src/Digitization/PlanarModuleStepper.cpp @@ -46,21 +46,22 @@ std::vector Acts::PlanarModuleStepper::cellSteps( for (auto& sSurface : stepSurfaces) { // try it out by intersecting, but do not force the direction auto sIntersection = - sSurface->intersect(gctx, startPoint, trackDirection, true); - if (bool(sIntersection)) { + sSurface->intersect(gctx, startPoint, trackDirection, true).closest(); + if (sIntersection) { // now record - stepIntersections.push_back(sIntersection.intersection); + stepIntersections.push_back(sIntersection.intersection()); ACTS_VERBOSE("Boundary Surface intersected with = " - << sIntersection.intersection.position.x() << ", " - << sIntersection.intersection.position.y() << ", " - << sIntersection.intersection.position.z()); + << sIntersection.position().x() << ", " + << sIntersection.position().y() << ", " + << sIntersection.position().z()); } } // Last one is also valid - now sort stepIntersections.push_back( Intersection3D(endPoint, (startPoint - endPoint).norm(), Intersection3D::Status::reachable)); - std::sort(stepIntersections.begin(), stepIntersections.end()); + std::sort(stepIntersections.begin(), stepIntersections.end(), + Intersection3D::forwardOrder); Vector3 lastPosition = startPoint; // reserve the right amount @@ -68,8 +69,8 @@ std::vector Acts::PlanarModuleStepper::cellSteps( for (auto& sIntersection : stepIntersections) { // create the new digitization step cSteps.push_back( - dmodule.digitizationStep(lastPosition, sIntersection.position)); - lastPosition = sIntersection.position; + dmodule.digitizationStep(lastPosition, sIntersection.position())); + lastPosition = sIntersection.position(); } // return all the steps return cSteps; @@ -93,14 +94,15 @@ std::vector Acts::PlanarModuleStepper::cellSteps( ++attempts; // try it out by intersecting, but do not force the direction auto bIntersection = - bSurface->intersect(gctx, intersection3D, trackDirection, true); - if (bool(bIntersection)) { + bSurface->intersect(gctx, intersection3D, trackDirection, true) + .closest(); + if (bIntersection) { // now record - boundaryIntersections.push_back(bIntersection.intersection); + boundaryIntersections.push_back(bIntersection.intersection()); ACTS_VERBOSE("Boundary Surface intersected with = " - << bIntersection.intersection.position.x() << ", " - << bIntersection.intersection.position.y() << ", " - << bIntersection.intersection.position.z()); + << bIntersection.position().x() << ", " + << bIntersection.position().y() << ", " + << bIntersection.position().z()); } // fast break in case of readout/counter surface hit // the first two attempts are the module faces, if they are hit, @@ -115,13 +117,14 @@ std::vector Acts::PlanarModuleStepper::cellSteps( ACTS_VERBOSE( "More than 2 Boundary Surfaces intersected, this is an edge " "case, resolving ... "); - std::sort(boundaryIntersections.begin(), boundaryIntersections.end()); + std::sort(boundaryIntersections.begin(), boundaryIntersections.end(), + Intersection3D::forwardOrder); } // if for some reason the intersection does not work if (boundaryIntersections.empty()) { return std::vector(); } // return - return cellSteps(gctx, dmodule, boundaryIntersections[0].position, - boundaryIntersections[1].position); + return cellSteps(gctx, dmodule, boundaryIntersections[0].position(), + boundaryIntersections[1].position()); } diff --git a/Core/src/EventData/CorrectedTransformationFreeToBound.cpp b/Core/src/EventData/CorrectedTransformationFreeToBound.cpp index 7373e5636ab..e6b1bd0bd59 100644 --- a/Core/src/EventData/CorrectedTransformationFreeToBound.cpp +++ b/Core/src/EventData/CorrectedTransformationFreeToBound.cpp @@ -148,10 +148,11 @@ Acts::detail::CorrectedFreeToBoundTransformer::operator()( // Reintersect to get the corrected free params without boundary check SurfaceIntersection intersection = - surface.intersect(geoContext, params.segment<3>(eFreePos0), - navDir * params.segment<3>(eFreeDir0), false); - correctedFreeParams.segment<3>(eFreePos0) = - intersection.intersection.position; + surface + .intersect(geoContext, params.segment<3>(eFreePos0), + navDir * params.segment<3>(eFreeDir0), false) + .closest(); + correctedFreeParams.segment<3>(eFreePos0) = intersection.position(); // Transform the free to bound auto result = detail::transformFreeToBoundParameters(correctedFreeParams, diff --git a/Core/src/Geometry/GenericApproachDescriptor.cpp b/Core/src/Geometry/GenericApproachDescriptor.cpp index 7dfbb32f22d..9307cde34d6 100644 --- a/Core/src/Geometry/GenericApproachDescriptor.cpp +++ b/Core/src/Geometry/GenericApproachDescriptor.cpp @@ -23,25 +23,27 @@ void Acts::GenericApproachDescriptor::registerLayer(const Layer& lay) { } } -Acts::ObjectIntersection -Acts::GenericApproachDescriptor::approachSurface( +Acts::SurfaceIntersection Acts::GenericApproachDescriptor::approachSurface( const GeometryContext& gctx, const Vector3& position, - const Vector3& direction, const BoundaryCheck& bcheck) const { + const Vector3& direction, const BoundaryCheck& bcheck, double pLimit, + double oLimit, double tolerance) const { // almost always 2 - boost::container::small_vector, 2> sIntersections; + boost::container::small_vector sIntersections; sIntersections.reserve(m_surfaceCache.size()); - for (auto& sf : m_surfaceCache) { + for (const auto& sf : m_surfaceCache) { auto sfIntersection = sf->intersect(gctx, position, direction, bcheck); - // Overstepping is not allowed for approach surfaces - if (sfIntersection.intersection.pathLength < 0. and - sfIntersection.alternative.pathLength > 0.) { - std::swap(sfIntersection.intersection, sfIntersection.alternative); + for (const auto& intersection : sfIntersection.split()) { + if (intersection && + detail::checkIntersection(intersection, pLimit, oLimit, tolerance)) { + sIntersections.push_back(intersection); + } } - sIntersections.push_back(sfIntersection); } - // Sort them & return the closest - std::sort(sIntersections.begin(), sIntersections.end()); - return (*sIntersections.begin()); + if (sIntersections.empty()) { + return SurfaceIntersection::invalid(); + } + return *std::min_element(sIntersections.begin(), sIntersections.end(), + SurfaceIntersection::forwardOrder); } const std::vector& diff --git a/Core/src/Geometry/Layer.cpp b/Core/src/Geometry/Layer.cpp index 4f2a545e592..9cb65170f34 100644 --- a/Core/src/Geometry/Layer.cpp +++ b/Core/src/Geometry/Layer.cpp @@ -127,14 +127,16 @@ Acts::Layer::compatibleSurfaces( if (options.endObject != nullptr) { // intersect the end surface // - it is the final one don't use the boundary check at all - SurfaceIntersection endInter = options.endObject->intersect( - gctx, position, direction, BoundaryCheck(true)); + SurfaceIntersection endInter = + options.endObject + ->intersect(gctx, position, direction, BoundaryCheck(true)) + .closest(); // non-valid intersection with the end surface provided at this layer // indicates wrong direction or faulty setup // -> do not return compatible surfaces since they may lead you on a wrong // navigation path if (endInter) { - pathLimit = endInter.intersection.pathLength; + pathLimit = endInter.pathLength(); } else { return sIntersections; } @@ -181,13 +183,15 @@ Acts::Layer::compatibleSurfaces( boundaryCheck = false; } // the surface intersection - SurfaceIntersection sfi = + SurfaceMultiIntersection sfmi = sf.intersect(gctx, position, direction, boundaryCheck); - // check if intersection is valid and pathLimit has not been exceeded - if (sfi && detail::checkIntersection(sfi.intersection, pathLimit, - overstepLimit, s_onSurfaceTolerance)) { - // Now put the right sign on it - sIntersections.push_back(sfi); + for (const auto& sfi : sfmi.split()) { + // check if intersection is valid and pathLimit has not been exceeded + if (sfi && + detail::checkIntersection(sfi.intersection(), pathLimit, + overstepLimit, s_onSurfaceTolerance)) { + sIntersections.push_back(sfi); + } } }; @@ -232,21 +236,24 @@ Acts::Layer::compatibleSurfaces( processSurface(*layerSurface); // Sort by object address - std::sort(sIntersections.begin(), sIntersections.end(), - [](const auto& a, const auto& b) { return a.object < b.object; }); + std::sort( + sIntersections.begin(), sIntersections.end(), + [](const auto& a, const auto& b) { return a.object() < b.object(); }); // Now look for duplicates. As we just sorted by path length, duplicates // should be subsequent auto it = std::unique( sIntersections.begin(), sIntersections.end(), [](const SurfaceIntersection& a, const SurfaceIntersection& b) -> bool { - return a.object == b.object; + return a.object() == b.object(); }); // resize to remove all items that are past the unique range - sIntersections.resize(std::distance(sIntersections.begin(), it)); + sIntersections.resize(std::distance(sIntersections.begin(), it), + SurfaceIntersection::invalid()); // sort according to the path length - std::sort(sIntersections.begin(), sIntersections.end()); + std::sort(sIntersections.begin(), sIntersections.end(), + SurfaceIntersection::forwardOrder); return sIntersections; } @@ -267,40 +274,34 @@ Acts::SurfaceIntersection Acts::Layer::surfaceOnApproach( // The Limits: current path & overstepping double pLimit = options.pathLimit; double oLimit = options.overstepLimit; + // TODO this should be configurable + double tolerance = s_onSurfaceTolerance; - // Helper function to test intersection - auto checkIntersection = - [&](SurfaceIntersection& isection) -> SurfaceIntersection { - // Avoid doing anything if that's a rotten apple already - if (!isection) { - return isection; - } - - if (detail::checkIntersection(isection.intersection, pLimit, oLimit, - s_onSurfaceTolerance)) { - return isection; - } - - if (isection.alternative and - detail::checkIntersection(isection.alternative, pLimit, oLimit, - s_onSurfaceTolerance)) { - return SurfaceIntersection(isection.alternative, isection.object); + // Helper function to find valid intersection + auto findValidIntersection = + [&](const SurfaceMultiIntersection& sfmi) -> SurfaceIntersection { + for (const auto& sfi : sfmi.split()) { + if (sfi && detail::checkIntersection(sfi.intersection(), pLimit, oLimit, + tolerance)) { + return sfi; + } } // Return an invalid one - return SurfaceIntersection(); + return SurfaceIntersection::invalid(); }; // Approach descriptor present and resolving is necessary if (m_approachDescriptor && (resolvePS || resolveMS)) { SurfaceIntersection aSurface = m_approachDescriptor->approachSurface( - gctx, position, direction, options.boundaryCheck); - return checkIntersection(aSurface); + gctx, position, direction, options.boundaryCheck, pLimit, oLimit, + tolerance); + return aSurface; } // Intersect and check the representing surface const Surface& rSurface = surfaceRepresentation(); auto sIntersection = rSurface.intersect(gctx, position, direction, options.boundaryCheck); - return checkIntersection(sIntersection); + return findValidIntersection(sIntersection); } diff --git a/Core/src/Geometry/TrackingVolume.cpp b/Core/src/Geometry/TrackingVolume.cpp index ed50d0e732f..d8a19c97641 100644 --- a/Core/src/Geometry/TrackingVolume.cpp +++ b/Core/src/Geometry/TrackingVolume.cpp @@ -478,59 +478,47 @@ Acts::TrackingVolume::compatibleBoundaries( // Helper function to test intersection auto checkIntersection = - [&](SurfaceIntersection& sIntersection, + [&](SurfaceMultiIntersection& smIntersection, const BoundarySurface* bSurface) -> BoundaryIntersection { - // Avoid doing anything if that's a rotten apple already - if (!sIntersection) { - return BoundaryIntersection(); - } + for (const auto& sIntersection : smIntersection.split()) { + if (!sIntersection) { + continue; + } - if (options.forceIntersectBoundaries and - sIntersection.intersection.pathLength > 0) { - const bool coCriterion = - std::abs(sIntersection.intersection.pathLength) < std::abs(oLimit); - ACTS_VERBOSE("Forcing intersection with surface " - << bSurface->surfaceRepresentation().geometryId()); - if (coCriterion) { - ACTS_VERBOSE("Intersection forced successfully "); + if (options.forceIntersectBoundaries) { + const bool coCriterion = + std::abs(sIntersection.pathLength()) < std::abs(oLimit); + ACTS_VERBOSE("Forcing intersection with surface " + << bSurface->surfaceRepresentation().geometryId()); + if (coCriterion) { + ACTS_VERBOSE("Intersection forced successfully "); + ACTS_VERBOSE("- intersection path length " + << std::abs(sIntersection.pathLength()) + << " < overstep limit " << std::abs(oLimit)); + return BoundaryIntersection(sIntersection.intersection(), bSurface, + sIntersection.object(), + sIntersection.index()); + } + ACTS_VERBOSE("Can't force intersection: "); ACTS_VERBOSE("- intersection path length " - << std::abs(sIntersection.intersection.pathLength) - << " < overstep limit " << std::abs(oLimit)); - return BoundaryIntersection(sIntersection.intersection, bSurface, - sIntersection.object); + << std::abs(sIntersection.pathLength()) + << " > overstep limit " << std::abs(oLimit)); } - ACTS_VERBOSE("Can't force intersection: "); - ACTS_VERBOSE("- intersection path length " - << std::abs(sIntersection.intersection.pathLength) - << " > overstep limit " << std::abs(oLimit)); - } - ACTS_VERBOSE("Check intersection with surface " - << bSurface->surfaceRepresentation().geometryId()); - if (detail::checkIntersection( - sIntersection.intersection, pLimit, oLimit, s_onSurfaceTolerance, - logger)) { - return BoundaryIntersection(sIntersection.intersection, bSurface, - sIntersection.object); - } - - if (sIntersection.alternative) { - ACTS_VERBOSE("Consider alternative"); - if (detail::checkIntersectionsurfaceRepresentation().geometryId()); + if (detail::checkIntersection( - sIntersection.alternative, pLimit, oLimit, s_onSurfaceTolerance, - logger)) { - return BoundaryIntersection(sIntersection.alternative, bSurface, - sIntersection.object); - ; + sIntersection.intersection(), pLimit, oLimit, + s_onSurfaceTolerance, logger)) { + return BoundaryIntersection(sIntersection.intersection(), bSurface, + sIntersection.object(), + sIntersection.index()); } - } else { - ACTS_VERBOSE("No alternative for intersection"); } ACTS_VERBOSE("No intersection accepted"); - return BoundaryIntersection(); + return BoundaryIntersection::invalid(); }; /// Helper function to process boundary surfaces @@ -591,8 +579,7 @@ Acts::TrackingVolume::compatibleBoundaries( std::sort(bIntersections.begin(), bIntersections.end(), [&](const auto& a, const auto& b) { - return comparator(a.intersection.pathLength, - b.intersection.pathLength); + return comparator(a.pathLength(), b.pathLength()); }); return bIntersections; } @@ -621,14 +608,15 @@ Acts::TrackingVolume::compatibleLayers( // layer on approach intersection auto atIntersection = tLayer->surfaceOnApproach(gctx, position, direction, options); - auto path = atIntersection.intersection.pathLength; + auto path = atIntersection.pathLength(); bool withinLimit = std::abs(path) <= std::abs(options.pathLimit); // Intersection is ok - take it (move to surface on approach) if (atIntersection && - (atIntersection.object != options.targetSurface) && withinLimit) { + (atIntersection.object() != options.targetSurface) && withinLimit) { // create a layer intersection lIntersections.push_back(LayerIntersection( - atIntersection.intersection, tLayer, atIntersection.object)); + atIntersection.intersection(), tLayer, atIntersection.object(), + atIntersection.index())); } } // move to next one or break because you reached the end layer @@ -636,7 +624,8 @@ Acts::TrackingVolume::compatibleLayers( ? nullptr : tLayer->nextLayer(gctx, position, direction); } - std::sort(lIntersections.begin(), lIntersections.end()); + std::sort(lIntersections.begin(), lIntersections.end(), + LayerIntersection::forwardOrder); } // and return return lIntersections; @@ -706,16 +695,18 @@ Acts::TrackingVolume::compatibleSurfacesFromHierarchy( boundarySurfaces = avol->boundarySurfaces(); for (const auto& bs : boundarySurfaces) { const Surface& srf = bs->surfaceRepresentation(); - auto sfi = srf.intersect(gctx, position, direction, false); - if (sfi and sfi.intersection.pathLength > oLimit and - sfi.intersection.pathLength <= pLimit) { - sIntersections.push_back(std::move(sfi)); + auto sfmi = srf.intersect(gctx, position, direction, false); + for (const auto& sfi : sfmi.split()) { + if (sfi and sfi.pathLength() > oLimit and sfi.pathLength() <= pLimit) { + sIntersections.push_back(sfi); + } } } } // Sort according to the path length - std::sort(sIntersections.begin(), sIntersections.end()); + std::sort(sIntersections.begin(), sIntersections.end(), + SurfaceIntersection::forwardOrder); return sIntersections; } diff --git a/Core/src/Surfaces/ConeSurface.cpp b/Core/src/Surfaces/ConeSurface.cpp index b4608552996..a0de5746b0a 100644 --- a/Core/src/Surfaces/ConeSurface.cpp +++ b/Core/src/Surfaces/ConeSurface.cpp @@ -285,7 +285,7 @@ Acts::detail::RealQuadraticEquation Acts::ConeSurface::intersectionSolver( return detail::RealQuadraticEquation(A, B, C); } -Acts::SurfaceIntersection Acts::ConeSurface::intersect( +Acts::SurfaceMultiIntersection Acts::ConeSurface::intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck, ActsScalar tolerance) const { @@ -294,7 +294,7 @@ Acts::SurfaceIntersection Acts::ConeSurface::intersect( // If no valid solution return a non-valid surfaceIntersection if (qe.solutions == 0) { - return SurfaceIntersection(); + return {{Intersection3D::invalid(), Intersection3D::invalid()}, this}; } // Check the validity of the first solution @@ -320,26 +320,11 @@ Acts::SurfaceIntersection Acts::ConeSurface::intersect( // Set the intersection Intersection3D first(tf * solution1, qe.first, status1); Intersection3D second(tf * solution2, qe.second, status2); - SurfaceIntersection cIntersection(first, this); - // Check one if its valid or neither is valid - bool check1 = status1 != Intersection3D::Status::missed or - (status1 == Intersection3D::Status::missed and - status2 == Intersection3D::Status::missed); - // Check and (eventually) go with the first solution - if ((check1 and (std::abs(qe.first) < std::abs(qe.second))) or - status2 == Intersection3D::Status::missed) { - // And add the alternative - if (qe.solutions > 1) { - cIntersection.alternative = second; - } - } else { - // And add the alternative - if (qe.solutions > 1) { - cIntersection.alternative = first; - } - cIntersection.intersection = second; + // Order based on path length + if (first.pathLength() <= second.pathLength()) { + return {{first, second}, this}; } - return cIntersection; + return {{second, first}, this}; } Acts::AlignmentToPathMatrix Acts::ConeSurface::alignmentToPathDerivative( diff --git a/Core/src/Surfaces/CylinderSurface.cpp b/Core/src/Surfaces/CylinderSurface.cpp index bc19c446c91..e8c6df40d1e 100644 --- a/Core/src/Surfaces/CylinderSurface.cpp +++ b/Core/src/Surfaces/CylinderSurface.cpp @@ -216,7 +216,7 @@ Acts::detail::RealQuadraticEquation Acts::CylinderSurface::intersectionSolver( return detail::RealQuadraticEquation(a, b, c); } -Acts::SurfaceIntersection Acts::CylinderSurface::intersect( +Acts::SurfaceMultiIntersection Acts::CylinderSurface::intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck, ActsScalar tolerance) const { @@ -227,7 +227,7 @@ Acts::SurfaceIntersection Acts::CylinderSurface::intersect( // If no valid solution return a non-valid surfaceIntersection if (qe.solutions == 0) { - return SurfaceIntersection(); + return {{Intersection3D::invalid(), Intersection3D::invalid()}, this}; } // Check the validity of the first solution @@ -266,9 +266,8 @@ Acts::SurfaceIntersection Acts::CylinderSurface::intersect( status1 = boundaryCheck(solution1, status1); // Set the intersection Intersection3D first(solution1, qe.first, status1); - SurfaceIntersection cIntersection(first, this); if (qe.solutions == 1) { - return cIntersection; + return {{first, first}, this}; } // Check the validity of the second solution Vector3 solution2 = position + qe.second * direction; @@ -278,21 +277,11 @@ Acts::SurfaceIntersection Acts::CylinderSurface::intersect( // Check first solution for boundary compatibility status2 = boundaryCheck(solution2, status2); Intersection3D second(solution2, qe.second, status2); - // Check one if its valid or neither is valid - bool check1 = status1 != Intersection3D::Status::missed or - (status1 == Intersection3D::Status::missed and - status2 == Intersection3D::Status::missed); - // Check and (eventually) go with the first solution - if ((check1 and (std::abs(qe.first) < std::abs(qe.second))) or - status2 == Intersection3D::Status::missed) { - // And add the alternative - cIntersection.alternative = second; - } else { - // And add the alternative - cIntersection.alternative = first; - cIntersection.intersection = second; + // Order based on path length + if (first.pathLength() <= second.pathLength()) { + return {{first, second}, this}; } - return cIntersection; + return {{second, first}, this}; } Acts::AlignmentToPathMatrix Acts::CylinderSurface::alignmentToPathDerivative( diff --git a/Core/src/Surfaces/DiscSurface.cpp b/Core/src/Surfaces/DiscSurface.cpp index 2c35ba35bb2..f526a547519 100644 --- a/Core/src/Surfaces/DiscSurface.cpp +++ b/Core/src/Surfaces/DiscSurface.cpp @@ -293,7 +293,7 @@ Acts::FreeToBoundMatrix Acts::DiscSurface::freeToBoundJacobian( return jacToLocal; } -Acts::SurfaceIntersection Acts::DiscSurface::intersect( +Acts::SurfaceMultiIntersection Acts::DiscSurface::intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck, ActsScalar tolerance) const { @@ -302,25 +302,29 @@ Acts::SurfaceIntersection Acts::DiscSurface::intersect( // Use the intersection helper for planar surfaces auto intersection = PlanarHelper::intersect(gctxTransform, position, direction, tolerance); + auto status = intersection.status(); // Evaluate boundary check if requested (and reachable) - if (intersection.status != Intersection3D::Status::unreachable and bcheck and - m_bounds != nullptr) { + if (intersection.status() != Intersection3D::Status::unreachable and + bcheck and m_bounds != nullptr) { // Built-in local to global for speed reasons const auto& tMatrix = gctxTransform.matrix(); - const Vector3 vecLocal(intersection.position - tMatrix.block<3, 1>(0, 3)); + const Vector3 vecLocal(intersection.position() - tMatrix.block<3, 1>(0, 3)); const Vector2 lcartesian = tMatrix.block<3, 2>(0, 0).transpose() * vecLocal; if (bcheck.type() == BoundaryCheck::Type::eAbsolute and m_bounds->coversFullAzimuth()) { double modifiedTolerance = tolerance + bcheck.tolerance()[eBoundLoc0]; if (not m_bounds->insideRadialBounds(VectorHelpers::perp(lcartesian), modifiedTolerance)) { - intersection.status = Intersection3D::Status::missed; + status = Intersection3D::Status::missed; } } else if (not insideBounds(localCartesianToPolar(lcartesian), bcheck)) { - intersection.status = Intersection3D::Status::missed; + status = Intersection3D::Status::missed; } } - return {intersection, this}; + return {{Intersection3D(intersection.position(), intersection.pathLength(), + status), + Intersection3D::invalid()}, + this}; } Acts::ActsMatrix<2, 3> Acts::DiscSurface::localCartesianToBoundLocalDerivative( diff --git a/Core/src/Surfaces/IntersectionHelper2D.cpp b/Core/src/Surfaces/IntersectionHelper2D.cpp index b83d0247b1c..689b2a69c60 100644 --- a/Core/src/Surfaces/IntersectionHelper2D.cpp +++ b/Core/src/Surfaces/IntersectionHelper2D.cpp @@ -23,7 +23,7 @@ Acts::Intersection2D Acts::detail::IntersectionHelper2D::intersectSegment( Vector2 edge(s1 - s0); ActsScalar det = edge.x() * dir.y() - edge.y() * dir.x(); if (std::abs(det) < s_epsilon) { - return Intersection2D(); + return Intersection2D::invalid(); } auto line = Line(origin, dir); @@ -74,9 +74,9 @@ Acts::detail::IntersectionHelper2D::intersectEllipse(ActsScalar Rx, } else if (std::abs(D) < s_epsilon) { return {Intersection2D(Vector2(solx, 0.), -origin.y(), Intersection2D::Status::reachable), - Intersection2D()}; + Intersection2D::invalid()}; } - return {Intersection2D(), Intersection2D()}; + return {Intersection2D::invalid(), Intersection2D::invalid()}; } else if (std::abs(dir.y()) < s_epsilon) { ActsScalar soly = origin.y(); ActsScalar D = 1. - soly * soly / (Ry * Ry); @@ -88,9 +88,9 @@ Acts::detail::IntersectionHelper2D::intersectEllipse(ActsScalar Rx, } else if (std::abs(D) < s_epsilon) { return {Intersection2D(Vector2(0., soly), -origin.x(), Intersection2D::Status::reachable), - Intersection2D()}; + Intersection2D::invalid()}; } - return {Intersection2D(), Intersection2D()}; + return {Intersection2D::invalid(), Intersection2D::invalid()}; } // General solution ActsScalar k = dir.y() / dir.x(); @@ -106,7 +106,7 @@ Acts::detail::IntersectionHelper2D::intersectEllipse(ActsScalar Rx, Vector2 toSolD(sol - origin); ActsScalar solD = std::copysign(toSolD.norm(), toSolD.dot(dir)); return {Intersection2D(sol, solD, Intersection2D::Status::reachable), - Intersection2D()}; + Intersection2D::invalid()}; } else if (solver.solutions > 1) { ActsScalar x0 = solver.first; ActsScalar x1 = solver.second; @@ -114,7 +114,7 @@ Acts::detail::IntersectionHelper2D::intersectEllipse(ActsScalar Rx, Vector2 alt(x1, k * x1 + d); return createSolution(sol, alt); } - return {Intersection2D(), Intersection2D()}; + return {Intersection2D::invalid(), Intersection2D::invalid()}; } Acts::Intersection2D Acts::detail::IntersectionHelper2D::intersectCircleSegment( @@ -122,12 +122,12 @@ Acts::Intersection2D Acts::detail::IntersectionHelper2D::intersectCircleSegment( const Vector2& dir) { auto intersections = intersectCircle(R, origin, dir); for (const auto& candidate : intersections) { - if (candidate.pathLength > 0.) { - ActsScalar phi = Acts::VectorHelpers::phi(candidate.position); + if (candidate.pathLength() > 0.) { + ActsScalar phi = Acts::VectorHelpers::phi(candidate.position()); if (phi > phiMin and phi < phiMax) { return candidate; } } } - return Intersection2D(); + return Intersection2D::invalid(); } diff --git a/Core/src/Surfaces/LineSurface.cpp b/Core/src/Surfaces/LineSurface.cpp index 44dda16b408..00ee0637203 100644 --- a/Core/src/Surfaces/LineSurface.cpp +++ b/Core/src/Surfaces/LineSurface.cpp @@ -145,7 +145,7 @@ const Acts::SurfaceBounds& Acts::LineSurface::bounds() const { return s_noBounds; } -Acts::SurfaceIntersection Acts::LineSurface::intersect( +Acts::SurfaceMultiIntersection Acts::LineSurface::intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck, ActsScalar tolerance) const { @@ -168,9 +168,7 @@ Acts::SurfaceIntersection Acts::LineSurface::intersect( // small number so `u` does not explode if (std::abs(denom) < std::abs(tolerance)) { // return a false intersection - return {Intersection3D(position, std::numeric_limits::max(), - Intersection3D::Status::unreachable), - this}; + return {{Intersection3D::invalid(), Intersection3D::invalid()}, this}; } double u = (mab.dot(ea) - mab.dot(eb) * eaTeb) / denom; @@ -193,7 +191,7 @@ Acts::SurfaceIntersection Acts::LineSurface::intersect( } } - return {Intersection3D(result, u, status), this}; + return {{Intersection3D(result, u, status), Intersection3D::invalid()}, this}; } Acts::BoundToFreeMatrix Acts::LineSurface::boundToFreeJacobian( diff --git a/Core/src/Surfaces/PlaneSurface.cpp b/Core/src/Surfaces/PlaneSurface.cpp index 10214e13853..c69e168b47d 100644 --- a/Core/src/Surfaces/PlaneSurface.cpp +++ b/Core/src/Surfaces/PlaneSurface.cpp @@ -173,7 +173,7 @@ double Acts::PlaneSurface::pathCorrection(const GeometryContext& gctx, return 1. / std::abs(Surface::normal(gctx, position).dot(direction)); } -Acts::SurfaceIntersection Acts::PlaneSurface::intersect( +Acts::SurfaceMultiIntersection Acts::PlaneSurface::intersect( const GeometryContext& gctx, const Vector3& position, const Vector3& direction, const BoundaryCheck& bcheck, ActsScalar tolerance) const { @@ -182,18 +182,22 @@ Acts::SurfaceIntersection Acts::PlaneSurface::intersect( // Use the intersection helper for planar surfaces auto intersection = PlanarHelper::intersect(gctxTransform, position, direction, tolerance); + auto status = intersection.status(); // Evaluate boundary check if requested (and reachable) - if (intersection.status != Intersection3D::Status::unreachable and bcheck) { + if (intersection.status() != Intersection3D::Status::unreachable and bcheck) { // Built-in local to global for speed reasons const auto& tMatrix = gctxTransform.matrix(); // Create the reference vector in local - const Vector3 vecLocal(intersection.position - tMatrix.block<3, 1>(0, 3)); + const Vector3 vecLocal(intersection.position() - tMatrix.block<3, 1>(0, 3)); if (not insideBounds(tMatrix.block<3, 2>(0, 0).transpose() * vecLocal, bcheck)) { - intersection.status = Intersection3D::Status::missed; + status = Intersection3D::Status::missed; } } - return {intersection, this}; + return {{Intersection3D(intersection.position(), intersection.pathLength(), + status), + Intersection3D::invalid()}, + this}; } Acts::ActsMatrix<2, 3> Acts::PlaneSurface::localCartesianToBoundLocalDerivative( diff --git a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp index ece23528cf3..bcd628191a8 100644 --- a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp +++ b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp @@ -607,11 +607,13 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( // Lambda for propagating the tracks to the PCA auto propagateToVtx = [&](const auto& params) -> std::optional { - auto intersection = perigeeSurface->intersect( - ctx.geoContext, params.position(ctx.geoContext), - params.direction(), false); + auto intersection = + perigeeSurface + ->intersect(ctx.geoContext, params.position(ctx.geoContext), + params.direction(), false) + .closest(); pOptions.direction = Acts::Direction::fromScalarZeroAsPositive( - intersection.intersection.pathLength); + intersection.pathLength()); auto result = propagator->propagate(params, *perigeeSurface, pOptions); diff --git a/Examples/Io/Root/src/RootMaterialTrackWriter.cpp b/Examples/Io/Root/src/RootMaterialTrackWriter.cpp index f812e72c386..6440c4f353e 100644 --- a/Examples/Io/Root/src/RootMaterialTrackWriter.cpp +++ b/Examples/Io/Root/src/RootMaterialTrackWriter.cpp @@ -288,13 +288,15 @@ ActsExamples::ProcessCode ActsExamples::RootMaterialTrackWriter::writeT( m_sur_y.push_back(mint.intersection.y()); m_sur_z.push_back(mint.intersection.z()); } else if (surface != nullptr) { - auto sfIntersection = surface->intersect( - ctx.geoContext, mint.position, mint.direction, true); + auto sfIntersection = surface + ->intersect(ctx.geoContext, mint.position, + mint.direction, true) + .closest(); m_sur_id.push_back(surface->geometryId().value()); m_sur_pathCorrection.push_back(1.0); - m_sur_x.push_back(sfIntersection.intersection.position.x()); - m_sur_y.push_back(sfIntersection.intersection.position.y()); - m_sur_z.push_back(sfIntersection.intersection.position.z()); + m_sur_x.push_back(sfIntersection.position().x()); + m_sur_y.push_back(sfIntersection.position().y()); + m_sur_z.push_back(sfIntersection.position().z()); } else { m_sur_id.push_back(Acts::GeometryIdentifier().value()); m_sur_x.push_back(0); diff --git a/Examples/Io/Root/src/RootTrajectorySummaryWriter.cpp b/Examples/Io/Root/src/RootTrajectorySummaryWriter.cpp index 4704f9532ce..8a52f7a5484 100644 --- a/Examples/Io/Root/src/RootTrajectorySummaryWriter.cpp +++ b/Examples/Io/Root/src/RootTrajectorySummaryWriter.cpp @@ -332,9 +332,11 @@ ActsExamples::ProcessCode ActsExamples::RootTrajectorySummaryWriter::writeT( if (pSurface != nullptr) { auto intersection = - pSurface->intersect(ctx.geoContext, particle.position(), - particle.direction(), false); - auto position = intersection.intersection.position; + pSurface + ->intersect(ctx.geoContext, particle.position(), + particle.direction(), false) + .closest(); + auto position = intersection.position(); // get the truth perigee parameter auto lpResult = pSurface->globalToLocal(ctx.geoContext, position, diff --git a/Examples/Python/tests/root_file_hashes.txt b/Examples/Python/tests/root_file_hashes.txt index 8127a0b8f04..0fe8d2b85a2 100644 --- a/Examples/Python/tests/root_file_hashes.txt +++ b/Examples/Python/tests/root_file_hashes.txt @@ -36,8 +36,8 @@ test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: 2a6de6dedd20ac test_truth_tracking_kalman[odd-1000.0]__performance_track_finder.root: 39aec6316cceb90e314e16b02947faa691c18f57c3a851a25e547a8fc05a4593 test_truth_tracking_gsf[generic]__trackstates_gsf.root: d2ea2f83e7737cc3d48d0c06e832d381e9e1041226361631f05a1962a9ed8fbd test_truth_tracking_gsf[generic]__tracksummary_gsf.root: d51143362b51e7b4ee9d6aaab3083db6f7784c14589d90a16213642aa605e78f -test_truth_tracking_gsf[odd]__trackstates_gsf.root: c429b399a18fc629c06b120b87282077893f63b37da622fab01a8ef0f4f0ac50 -test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 014b5c7f12c876a90b50f2857de8ab78833fe4a4d68bb3638a5c3f740cb648a5 +test_truth_tracking_gsf[odd]__trackstates_gsf.root: 1b1d3be665abe75a5b400db3df9f2a6fbc1a193ea7a5e238a51a1f212e50e414 +test_truth_tracking_gsf[odd]__tracksummary_gsf.root: e707c8ca54ba404e7a5e0a4ad77c746445fc10ba9d8ab87c726721ebe09163e4 test_particle_gun__particles.root: 8549ba6e20338004ab8ba299fc65e1ee5071985b46df8f77f887cb6fef56a8ec test_material_mapping__material-map_tracks.root: 4e1c866038f0c06b099aa74fd01c3d875f07b89f54898f90debd9b558d8e4025 test_material_mapping__propagation-material.root: 646b8e2bbacec40d0bc4132236f9ab3f03b088e656e6e9b80c47ae03eaf6eab5 @@ -55,16 +55,16 @@ test_ckf_tracks_example[generic-full_seeding]__performance_seeding_trees.root: 0 test_ckf_tracks_example[generic-truth_estimated]__trackstates_ckf.root: 7dd654c2223f3c53eac4ba496b3dec3739d29a443e9a77e718981bad44b95f1c test_ckf_tracks_example[generic-truth_estimated]__tracksummary_ckf.root: e9886b61af4934c1b2a825719ea69ec3b69b245927cb22d8cca5071612609fe5 test_ckf_tracks_example[generic-truth_estimated]__performance_seeding.root: 1facb05c066221f6361b61f015cdf0918e94d9f3fce2269ec7b6a4dffeb2bc7e -test_ckf_tracks_example[generic-truth_smeared]__trackstates_ckf.root: 2550cd0dc63fff03bc20e3c58b9432f8534cabccf8a6c02e6c551d01fc68ad8b -test_ckf_tracks_example[generic-truth_smeared]__tracksummary_ckf.root: 92ea381077be53d81700996b8bc9736dab3031c4825b5585315c0ea44ce378ac +test_ckf_tracks_example[generic-truth_smeared]__trackstates_ckf.root: 0351e6e87bbda82c666e3580f8437fa9736f9d95ec4dd8658129bc73bb3fbf6c +test_ckf_tracks_example[generic-truth_smeared]__tracksummary_ckf.root: e72c400c9e7e9ca5f3612005254b6fa1cae070e86c533fc5487776e4120968a5 test_ckf_tracks_example[odd-full_seeding]__trackstates_ckf.root: bf564fc788eed6e72791d4eac639bd439ba2e167554cee4edb6a6162cec22089 test_ckf_tracks_example[odd-full_seeding]__tracksummary_ckf.root: f107b73de07e5fb035c2a3e50b2d2928df77d7ce6579341bc5a227485972c878 test_ckf_tracks_example[odd-full_seeding]__performance_seeding_trees.root: 43c58577aafe07645e5660c4f43904efadf91d8cda45c5c04c248bbe0f59814f test_ckf_tracks_example[odd-truth_estimated]__trackstates_ckf.root: 3defdfb49c4942e53e5cda8f2cd01475ce2bfe1b92b6745d83ea17d9c2ad535f test_ckf_tracks_example[odd-truth_estimated]__tracksummary_ckf.root: b9a5e794e3d8c3c64426efb4abe2ce38e338de96f3de4f751b238b5ae1997189 test_ckf_tracks_example[odd-truth_estimated]__performance_seeding.root: 1a36b7017e59f1c08602ef3c2cb0483c51df248f112e3780c66594110719c575 -test_ckf_tracks_example[odd-truth_smeared]__trackstates_ckf.root: e7df29a9b7d62608175c11c208cc775aa9d8869fc41878df5079c6ae9464b19d -test_ckf_tracks_example[odd-truth_smeared]__tracksummary_ckf.root: 6b183adc9da557e170aaa4d83458833b52d982c054c399f2a106956a70c5e501 +test_ckf_tracks_example[odd-truth_smeared]__trackstates_ckf.root: d4b47a6c9621847be84a17a21fb929a050c49d0c7b3d944bf14fee365478609d +test_ckf_tracks_example[odd-truth_smeared]__tracksummary_ckf.root: 2c94035575fc222eff022368052b98c84d54f1b75e94681e794bd30282cc7146 test_vertex_fitting_reading[Truth-False-100]__performance_vertexing.root: 76ef6084d758dfdfc0151ddec2170e12d73394424e3dac4ffe46f0f339ec8293 test_vertex_fitting_reading[Iterative-False-100]__performance_vertexing.root: 60372210c830a04f95ceb78c6c68a9b0de217746ff59e8e73053750c837b57eb test_vertex_fitting_reading[Iterative-True-100]__performance_vertexing.root: e34f217d524a5051dbb04a811d3407df3ebe2cc4bb7f54f6bda0847dbd7b52c3 diff --git a/Fatras/src/Digitization/Channelizer.cpp b/Fatras/src/Digitization/Channelizer.cpp index 08975383070..e4aaac582f7 100644 --- a/Fatras/src/Digitization/Channelizer.cpp +++ b/Fatras/src/Digitization/Channelizer.cpp @@ -110,7 +110,7 @@ ActsFatras::Channelizer::segments(const Acts::GeometryContext& geoCtx, r, std::min(phistart, phiend), std::max(phistart, phiend), start, (end - start).normalized()); cSteps.push_back(ChannelStep{{(bstart[0] < bend[0] ? 1 : -1), 0}, - radIntersection.position, + radIntersection.position(), start}); } } @@ -130,7 +130,7 @@ ActsFatras::Channelizer::segments(const Acts::GeometryContext& geoCtx, Acts::detail::IntersectionHelper2D::intersectSegment( origin, philine, start, (end - start).normalized()); cSteps.push_back(ChannelStep{{0, (bstart[1] < bend[1] ? 1 : -1)}, - phiIntersection.position, + phiIntersection.position(), start}); } } diff --git a/Fatras/src/Digitization/PlanarSurfaceMask.cpp b/Fatras/src/Digitization/PlanarSurfaceMask.cpp index eec5a4bcd88..49c7739f889 100644 --- a/Fatras/src/Digitization/PlanarSurfaceMask.cpp +++ b/Fatras/src/Digitization/PlanarSurfaceMask.cpp @@ -37,8 +37,8 @@ namespace { /// @param sLength The segment length, maximal allowed length void checkIntersection(std::vector& intersections, const Acts::Intersection2D& candidate, double sLength) { - if (candidate and candidate.pathLength > 0 and - candidate.pathLength < sLength) { + if (candidate and candidate.pathLength() > 0 and + candidate.pathLength() < sLength) { intersections.push_back(candidate); } } @@ -57,17 +57,18 @@ void checkIntersection(std::vector& intersections, Acts::Result maskAndReturn( std::vector& intersections, const ActsFatras::PlanarSurfaceMask::Segment2D& segment, bool firstInside) { - std::sort(intersections.begin(), intersections.end()); + std::sort(intersections.begin(), intersections.end(), + Acts::Intersection2D::forwardOrder); if (intersections.size() >= 2) { - return ActsFatras::PlanarSurfaceMask::Segment2D{intersections[0].position, - intersections[1].position}; + return ActsFatras::PlanarSurfaceMask::Segment2D{ + intersections[0].position(), intersections[1].position()}; } else if (intersections.size() == 1) { return (not firstInside ? ActsFatras::PlanarSurfaceMask::Segment2D{intersections[0] - .position, + .position(), segment[1]} : ActsFatras::PlanarSurfaceMask::Segment2D{ - segment[0], intersections[0].position}); + segment[0], intersections[0].position()}); } return ActsFatras::DigitizationError::MaskingError; } @@ -277,8 +278,11 @@ ActsFatras::PlanarSurfaceMask::annulusMask(const Acts::AnnulusBounds& aBounds, Acts::VectorHelpers::phi(vertices[phii[iarc * 2 + 1]] - moduleOrigin), segment[0] - moduleOrigin, sDir); if (intersection) { - intersection.position += moduleOrigin; - checkIntersection(intersections, intersection, sLength); + checkIntersection(intersections, + Acts::Intersection2D( + intersection.position() + moduleOrigin, + intersection.pathLength(), intersection.status()), + sLength); } } return maskAndReturn(intersections, segment, firstInside); diff --git a/Tests/UnitTests/Core/EventData/CorrectedTransformFreeToBoundTests.cpp b/Tests/UnitTests/Core/EventData/CorrectedTransformFreeToBoundTests.cpp index c29930a3f73..244991ba701 100644 --- a/Tests/UnitTests/Core/EventData/CorrectedTransformFreeToBoundTests.cpp +++ b/Tests/UnitTests/Core/EventData/CorrectedTransformFreeToBoundTests.cpp @@ -76,9 +76,9 @@ BOOST_AUTO_TEST_CASE(CorrectedFreeToBoundTrackParameters) { // the intersection of the track with the end surface SurfaceIntersection intersection = - eSurface->intersect(geoCtx, Vector3(0, 0, 0), dir, true); - Vector3 tpos = intersection.intersection.position; - auto s = intersection.intersection.pathLength; + eSurface->intersect(geoCtx, Vector3(0, 0, 0), dir, true).closest(); + Vector3 tpos = intersection.position(); + auto s = intersection.pathLength(); BOOST_CHECK_EQUAL(s, distance * std::sqrt(2)); diff --git a/Tests/UnitTests/Core/Geometry/BVHDataTestCase.hpp b/Tests/UnitTests/Core/Geometry/BVHDataTestCase.hpp index 30c9a71662e..c5614741011 100644 --- a/Tests/UnitTests/Core/Geometry/BVHDataTestCase.hpp +++ b/Tests/UnitTests/Core/Geometry/BVHDataTestCase.hpp @@ -8,6 +8,8 @@ #pragma once +#include "Acts/Surfaces/Surface.hpp" + namespace bdata = boost::unit_test::data; using Box = Acts::Volume::BoundingBox; using Ray = Acts::Ray; @@ -57,20 +59,22 @@ BOOST_DATA_TEST_CASE( // collect all surfaces that are hit for (const auto& bndSrf : bndSurfaces) { const auto& srf = bndSrf->surfaceRepresentation(); - auto sri = srf.intersect(tgContext, ray.origin(), ray.dir(), true); - if (sri and sri.intersection.pathLength >= s_onSurfaceTolerance) { - // does intersect - hits.push_back(std::move(sri)); + auto srmi = srf.intersect(tgContext, ray.origin(), ray.dir(), true); + for (const auto& sri : srmi.split()) { + if (sri and sri.pathLength() >= s_onSurfaceTolerance) { + // does intersect + hits.push_back(sri); + } } } } // sort by path length - std::sort(hits.begin(), hits.end()); + std::sort(hits.begin(), hits.end(), SurfaceIntersection::forwardOrder); std::vector expHits; expHits.reserve(hits.size()); for (const auto& hit : hits) { - expHits.push_back(hit.object); + expHits.push_back(hit.object()); } // now do the same through a propagator diff --git a/Tests/UnitTests/Core/Geometry/GenericApproachDescriptorTests.cpp b/Tests/UnitTests/Core/Geometry/GenericApproachDescriptorTests.cpp index ed340314a15..429b82bbc53 100644 --- a/Tests/UnitTests/Core/Geometry/GenericApproachDescriptorTests.cpp +++ b/Tests/UnitTests/Core/Geometry/GenericApproachDescriptorTests.cpp @@ -12,6 +12,7 @@ #include "Acts/Definitions/Algebra.hpp" #include "Acts/Definitions/Tolerance.hpp" +#include "Acts/Definitions/Units.hpp" #include "Acts/Geometry/GenericApproachDescriptor.hpp" #include "Acts/Geometry/GeometryContext.hpp" #include "Acts/Geometry/Layer.hpp" @@ -23,6 +24,7 @@ #include "Acts/Utilities/Intersection.hpp" #include +#include #include #include @@ -68,6 +70,9 @@ BOOST_AUTO_TEST_CASE(GenericApproachDescriptorProperties) { }; Vector3 zDir{0., 0., 1.}; BoundaryCheck bcheck{true}; + double pLimit = std::numeric_limits::max(); + double oLimit = -100 * UnitConstants::um; + double tolerance = s_onSurfaceTolerance; // std::vector> someSurfaces{ Surface::makeShared(), Surface::makeShared()}; @@ -76,11 +81,10 @@ BOOST_AUTO_TEST_CASE(GenericApproachDescriptorProperties) { // registerLayer() BOOST_CHECK_NO_THROW(approachDescriptor.registerLayer(aLayer)); // approachSurface - SurfaceIntersection surfIntersection = - approachDescriptor.approachSurface(tgContext, origin, zDir, bcheck); + SurfaceIntersection surfIntersection = approachDescriptor.approachSurface( + tgContext, origin, zDir, bcheck, pLimit, oLimit, tolerance); double expectedIntersection = 20.0; // property of SurfaceStub - CHECK_CLOSE_REL(surfIntersection.intersection.pathLength, - expectedIntersection, 1e-6); + CHECK_CLOSE_REL(surfIntersection.pathLength(), expectedIntersection, 1e-6); // containedSurfaces() BOOST_CHECK_EQUAL(approachDescriptor.containedSurfaces().size(), someSurfaces.size()); @@ -98,6 +102,9 @@ BOOST_AUTO_TEST_CASE(GenericApproachNoOverstepping) { Vector3 origin{0., -0.5, 1.}; Vector3 direction{0., 1., 0.}; BoundaryCheck bcheck{true}; + double pLimit = std::numeric_limits::max(); + double oLimit = -100 * UnitConstants::um; + double tolerance = s_onSurfaceTolerance; auto conCyl = Surface::makeShared(Transform3::Identity(), 10., 20.); @@ -106,19 +113,14 @@ BOOST_AUTO_TEST_CASE(GenericApproachNoOverstepping) { GenericApproachDescriptor gad(approachSurface); - auto sfIntersection = - gad.approachSurface(GeometryContext(), origin, direction, bcheck); + auto sfIntersection = gad.approachSurface( + GeometryContext(), origin, direction, bcheck, pLimit, oLimit, tolerance); // No overstepping allowed, the preferred solution should be the forward one - CHECK_CLOSE_ABS(sfIntersection.intersection.pathLength, 10.5, s_epsilon); - CHECK_CLOSE_ABS(sfIntersection.intersection.position.x(), 0., s_epsilon); - CHECK_CLOSE_ABS(sfIntersection.intersection.position.y(), 10., s_epsilon); - CHECK_CLOSE_ABS(sfIntersection.intersection.position.z(), 1., s_epsilon); - - CHECK_CLOSE_ABS(sfIntersection.alternative.pathLength, -9.5, s_epsilon); - CHECK_CLOSE_ABS(sfIntersection.alternative.position.x(), 0., s_epsilon); - CHECK_CLOSE_ABS(sfIntersection.alternative.position.y(), -10., s_epsilon); - CHECK_CLOSE_ABS(sfIntersection.alternative.position.z(), 1., s_epsilon); + CHECK_CLOSE_ABS(sfIntersection.pathLength(), 10.5, s_epsilon); + CHECK_CLOSE_ABS(sfIntersection.position().x(), 0., s_epsilon); + CHECK_CLOSE_ABS(sfIntersection.position().y(), 10., s_epsilon); + CHECK_CLOSE_ABS(sfIntersection.position().z(), 1., s_epsilon); } BOOST_AUTO_TEST_SUITE_END() diff --git a/Tests/UnitTests/Core/Propagator/AtlasStepperTests.cpp b/Tests/UnitTests/Core/Propagator/AtlasStepperTests.cpp index 735c59a6512..b4223f5d433 100644 --- a/Tests/UnitTests/Core/Propagator/AtlasStepperTests.cpp +++ b/Tests/UnitTests/Core/Propagator/AtlasStepperTests.cpp @@ -588,18 +588,22 @@ BOOST_AUTO_TEST_CASE(StepSizeSurface) { // test the step size modification in the context of a surface stepper.updateStepSize( state, - target->intersect(state.geoContext, stepper.position(state), - navDir * stepper.direction(state), false), - false); + target + ->intersect(state.geoContext, stepper.position(state), + navDir * stepper.direction(state), false) + .closest(), + navDir, false); BOOST_CHECK_EQUAL(state.stepSize.value(), distance); // start with a different step size state.stepSize.setValue(navDir * stepSize); stepper.updateStepSize( state, - target->intersect(state.geoContext, stepper.position(state), - navDir * stepper.direction(state), false), - true); + target + ->intersect(state.geoContext, stepper.position(state), + navDir * stepper.direction(state), false) + .closest(), + navDir, true); BOOST_CHECK_EQUAL(state.stepSize.value(), navDir * stepSize); } diff --git a/Tests/UnitTests/Core/Propagator/EigenStepperTests.cpp b/Tests/UnitTests/Core/Propagator/EigenStepperTests.cpp index 07b0721c434..1a6b8c1c5f1 100644 --- a/Tests/UnitTests/Core/Propagator/EigenStepperTests.cpp +++ b/Tests/UnitTests/Core/Propagator/EigenStepperTests.cpp @@ -463,18 +463,20 @@ BOOST_AUTO_TEST_CASE(eigen_stepper_test) { eps); // Test the step size modification in the context of a surface - es.updateStepSize( - esState, - targetSurface->intersect(esState.geoContext, es.position(esState), - navDir * es.direction(esState), false), - false); + es.updateStepSize(esState, + targetSurface + ->intersect(esState.geoContext, es.position(esState), + navDir * es.direction(esState), false) + .closest(), + navDir, false); CHECK_CLOSE_ABS(esState.stepSize.value(), 2., eps); esState.stepSize.setValue(navDir * stepSize); - es.updateStepSize( - esState, - targetSurface->intersect(esState.geoContext, es.position(esState), - navDir * es.direction(esState), false), - true); + es.updateStepSize(esState, + targetSurface + ->intersect(esState.geoContext, es.position(esState), + navDir * es.direction(esState), false) + .closest(), + navDir, true); CHECK_CLOSE_ABS(esState.stepSize.value(), 2., eps); // Test the bound state construction diff --git a/Tests/UnitTests/Core/Propagator/NavigatorTests.cpp b/Tests/UnitTests/Core/Propagator/NavigatorTests.cpp index 835139bc0ac..425365de264 100644 --- a/Tests/UnitTests/Core/Propagator/NavigatorTests.cpp +++ b/Tests/UnitTests/Core/Propagator/NavigatorTests.cpp @@ -158,7 +158,7 @@ struct PropagatorState { template void updateStepSize(State& state, const object_intersection_t& oIntersection, - bool release = true) const { + Direction /*direction*/, bool release = true) const { detail::updateSingleStepSize(state, oIntersection, release); } @@ -512,7 +512,7 @@ BOOST_AUTO_TEST_CASE(Navigator_target_methods) { // The index should points to the begin BOOST_CHECK(state.navigation.navLayerIndex == 0); // Cache the beam pipe radius - double beamPipeR = perp(state.navigation.navLayer().intersection.position); + double beamPipeR = perp(state.navigation.navLayer().position()); // step size has been updated CHECK_CLOSE_ABS(state.stepping.stepSize.value(), beamPipeR, s_onSurfaceTolerance); diff --git a/Tests/UnitTests/Core/Propagator/PropagatorTests.cpp b/Tests/UnitTests/Core/Propagator/PropagatorTests.cpp index 27ff66e7145..5d6e53f8ab5 100644 --- a/Tests/UnitTests/Core/Propagator/PropagatorTests.cpp +++ b/Tests/UnitTests/Core/Propagator/PropagatorTests.cpp @@ -112,7 +112,8 @@ struct SurfaceObserver { surface ->intersect(state.geoContext, stepper.position(state.stepping), stepper.direction(state.stepping), true) - .intersection.pathLength; + .closest() + .pathLength(); // Adjust the step size so that we cannot cross the target surface state.stepping.stepSize.update(distance * state.options.direction, ConstrainedStep::actor); diff --git a/Tests/UnitTests/Core/Propagator/StraightLineStepperTests.cpp b/Tests/UnitTests/Core/Propagator/StraightLineStepperTests.cpp index 90164b5ddbd..95a33f88b83 100644 --- a/Tests/UnitTests/Core/Propagator/StraightLineStepperTests.cpp +++ b/Tests/UnitTests/Core/Propagator/StraightLineStepperTests.cpp @@ -343,16 +343,20 @@ BOOST_AUTO_TEST_CASE(straight_line_stepper_test) { // Test the step size modification in the context of a surface sls.updateStepSize( slsState, - targetSurface->intersect(slsState.geoContext, sls.position(slsState), - navDir * sls.direction(slsState), false), - false); + targetSurface + ->intersect(slsState.geoContext, sls.position(slsState), + navDir * sls.direction(slsState), false) + .closest(), + navDir, false); CHECK_CLOSE_ABS(slsState.stepSize.value(), 2, 1e-6); slsState.stepSize.setValue(navDir * stepSize); sls.updateStepSize( slsState, - targetSurface->intersect(slsState.geoContext, sls.position(slsState), - navDir * sls.direction(slsState), false), - true); + targetSurface + ->intersect(slsState.geoContext, sls.position(slsState), + navDir * sls.direction(slsState), false) + .closest(), + navDir, true); CHECK_CLOSE_ABS(slsState.stepSize.value(), 2, 1e-6); // Test the bound state construction diff --git a/Tests/UnitTests/Core/Surfaces/CylinderSurfaceTests.cpp b/Tests/UnitTests/Core/Surfaces/CylinderSurfaceTests.cpp index 820964e4028..820a257e94e 100644 --- a/Tests/UnitTests/Core/Surfaces/CylinderSurfaceTests.cpp +++ b/Tests/UnitTests/Core/Surfaces/CylinderSurfaceTests.cpp @@ -189,18 +189,18 @@ BOOST_AUTO_TEST_CASE(CylinderSurfaceProperties) { testContext, offSurface, direction, false); Intersection3D expectedIntersect{Vector3{1, 1, 2}, 99., Intersection3D::Status::reachable}; - BOOST_CHECK(bool(sfIntersection)); - CHECK_CLOSE_ABS(sfIntersection.intersection.position, - expectedIntersect.position, 1e-9); - CHECK_CLOSE_ABS(sfIntersection.intersection.pathLength, - expectedIntersect.pathLength, 1e-9); + BOOST_CHECK(sfIntersection[0]); + CHECK_CLOSE_ABS(sfIntersection[0].position(), expectedIntersect.position(), + 1e-9); + CHECK_CLOSE_ABS(sfIntersection[0].pathLength(), + expectedIntersect.pathLength(), 1e-9); // there is a second solution & and it should be valid - BOOST_CHECK(sfIntersection.alternative); + BOOST_CHECK(sfIntersection[1]); // And it's path should be further away then the primary solution - double pn = sfIntersection.intersection.pathLength; - double pa = sfIntersection.alternative.pathLength; + double pn = sfIntersection[0].pathLength(); + double pa = sfIntersection[1].pathLength(); BOOST_CHECK(std::abs(pn) < std::abs(pa)); - BOOST_CHECK_EQUAL(sfIntersection.object, cylinderSurfaceObject.get()); + BOOST_CHECK_EQUAL(sfIntersection.object(), cylinderSurfaceObject.get()); // /// Test pathCorrection diff --git a/Tests/UnitTests/Core/Surfaces/DiscSurfaceTests.cpp b/Tests/UnitTests/Core/Surfaces/DiscSurfaceTests.cpp index 117c8d8346a..461815b0053 100644 --- a/Tests/UnitTests/Core/Surfaces/DiscSurfaceTests.cpp +++ b/Tests/UnitTests/Core/Surfaces/DiscSurfaceTests.cpp @@ -202,15 +202,16 @@ BOOST_AUTO_TEST_CASE(DiscSurfaceProperties) { // intersect is a struct of (Vector3) position, pathLength, distance and // (bool) valid, it's contained in a Surface intersection auto sfIntersection = - discSurfaceObject->intersect(tgContext, globalPosition, direction, false); + discSurfaceObject->intersect(tgContext, globalPosition, direction, false) + .closest(); Intersection3D expectedIntersect{Vector3{1.2, 0., 0.}, 10., Intersection3D::Status::reachable}; BOOST_CHECK(bool(sfIntersection)); - CHECK_CLOSE_ABS(sfIntersection.intersection.position, - expectedIntersect.position, 1e-9); - CHECK_CLOSE_ABS(sfIntersection.intersection.pathLength, - expectedIntersect.pathLength, 1e-9); - BOOST_CHECK_EQUAL(sfIntersection.object, discSurfaceObject.get()); + CHECK_CLOSE_ABS(sfIntersection.position(), expectedIntersect.position(), + 1e-9); + CHECK_CLOSE_ABS(sfIntersection.pathLength(), expectedIntersect.pathLength(), + 1e-9); + BOOST_CHECK_EQUAL(sfIntersection.object(), discSurfaceObject.get()); // /// Test name diff --git a/Tests/UnitTests/Core/Surfaces/IntersectionHelper2DTests.cpp b/Tests/UnitTests/Core/Surfaces/IntersectionHelper2DTests.cpp index eb01cea49ae..ecdd0ce0f4d 100644 --- a/Tests/UnitTests/Core/Surfaces/IntersectionHelper2DTests.cpp +++ b/Tests/UnitTests/Core/Surfaces/IntersectionHelper2DTests.cpp @@ -57,7 +57,7 @@ void basicChecks(bool circleCase = false) { rX, rY, start, direction); BOOST_CHECK(onesolY[0]); - CHECK_CLOSE_ABS(onesolY[0].position.x(), 0., s_epsilon); + CHECK_CLOSE_ABS(onesolY[0].position().x(), 0., s_epsilon); BOOST_CHECK(not onesolY[1]); start = Vector2(rX, -4); @@ -69,7 +69,7 @@ void basicChecks(bool circleCase = false) { rX, rY, start, direction); BOOST_CHECK(onesolX[0]); - CHECK_CLOSE_ABS(onesolX[0].position.y(), 0., s_epsilon); + CHECK_CLOSE_ABS(onesolX[0].position().y(), 0., s_epsilon); BOOST_CHECK(not onesolX[1]); } @@ -123,15 +123,15 @@ BOOST_AUTO_TEST_CASE(EllipseIntersection) { // Numerically checked / per hand calculated BOOST_CHECK(solution[0]); - CHECK_CLOSE_ABS(solution[0].position.x(), -283.68, 0.01); - CHECK_CLOSE_ABS(solution[0].position.y(), -213.47, 0.01); - BOOST_CHECK(solution[0].pathLength > 0.); + CHECK_CLOSE_ABS(solution[0].position().x(), -283.68, 0.01); + CHECK_CLOSE_ABS(solution[0].position().y(), -213.47, 0.01); + BOOST_CHECK(solution[0].pathLength() > 0.); BOOST_CHECK(solution[1]); - CHECK_CLOSE_ABS(solution[1].position.x(), 433.65, 0.01); - CHECK_CLOSE_ABS(solution[1].position.y(), 73.46, 0.01); - BOOST_CHECK(solution[1].pathLength > 0.); + CHECK_CLOSE_ABS(solution[1].position().x(), 433.65, 0.01); + CHECK_CLOSE_ABS(solution[1].position().y(), 73.46, 0.01); + BOOST_CHECK(solution[1].pathLength() > 0.); // Reverse checks will be done with circle (same code) } @@ -153,15 +153,15 @@ BOOST_AUTO_TEST_CASE(CircleIntersection) { // Numerically checked / per hand calculated BOOST_CHECK(solution[0]); - CHECK_CLOSE_ABS(solution[0].position.x(), -266.771, 0.001); - CHECK_CLOSE_ABS(solution[0].position.y(), -66.771, 0.001); - BOOST_CHECK(solution[0].pathLength > 0.); + CHECK_CLOSE_ABS(solution[0].position().x(), -266.771, 0.001); + CHECK_CLOSE_ABS(solution[0].position().y(), -66.771, 0.001); + BOOST_CHECK(solution[0].pathLength() > 0.); BOOST_CHECK(solution[1]); - CHECK_CLOSE_ABS(solution[1].position.x(), 66.771, 0.001); - CHECK_CLOSE_ABS(solution[1].position.y(), 266.771, 0.001); - BOOST_CHECK(solution[1].pathLength > 0.); + CHECK_CLOSE_ABS(solution[1].position().x(), 66.771, 0.001); + CHECK_CLOSE_ABS(solution[1].position().y(), 266.771, 0.001); + BOOST_CHECK(solution[1].pathLength() > 0.); // Reverse start = Vector2(1500., 1700.); @@ -170,14 +170,14 @@ BOOST_AUTO_TEST_CASE(CircleIntersection) { detail::IntersectionHelper2D::intersectCircle(radius, start, direction); BOOST_CHECK(solution[0]); - CHECK_CLOSE_ABS(solution[0].position.x(), 66.771, 0.001); - CHECK_CLOSE_ABS(solution[0].position.y(), 266.771, 0.001); - BOOST_CHECK(solution[0].pathLength < 0.); + CHECK_CLOSE_ABS(solution[0].position().x(), 66.771, 0.001); + CHECK_CLOSE_ABS(solution[0].position().y(), 266.771, 0.001); + BOOST_CHECK(solution[0].pathLength() < 0.); BOOST_CHECK(solution[1]); - CHECK_CLOSE_ABS(solution[1].position.x(), -266.771, 0.001); - CHECK_CLOSE_ABS(solution[1].position.y(), -66.771, 0.001); - BOOST_CHECK(solution[1].pathLength < 0.); + CHECK_CLOSE_ABS(solution[1].position().x(), -266.771, 0.001); + CHECK_CLOSE_ABS(solution[1].position().y(), -66.771, 0.001); + BOOST_CHECK(solution[1].pathLength() < 0.); // Reverse with reverse direction direction = Vector2(-1., -1.).normalized(); @@ -185,14 +185,14 @@ BOOST_AUTO_TEST_CASE(CircleIntersection) { detail::IntersectionHelper2D::intersectCircle(radius, start, direction); BOOST_CHECK(solution[0]); - CHECK_CLOSE_ABS(solution[0].position.x(), 66.771, 0.001); - CHECK_CLOSE_ABS(solution[0].position.y(), 266.771, 0.001); - BOOST_CHECK(solution[0].pathLength > 0.); + CHECK_CLOSE_ABS(solution[0].position().x(), 66.771, 0.001); + CHECK_CLOSE_ABS(solution[0].position().y(), 266.771, 0.001); + BOOST_CHECK(solution[0].pathLength() > 0.); BOOST_CHECK(solution[1]); - CHECK_CLOSE_ABS(solution[1].position.x(), -266.771, 0.001); - CHECK_CLOSE_ABS(solution[1].position.y(), -66.771, 0.001); - BOOST_CHECK(solution[1].pathLength > 0.); + CHECK_CLOSE_ABS(solution[1].position().x(), -266.771, 0.001); + CHECK_CLOSE_ABS(solution[1].position().y(), -66.771, 0.001); + BOOST_CHECK(solution[1].pathLength() > 0.); } BOOST_AUTO_TEST_SUITE_END() diff --git a/Tests/UnitTests/Core/Surfaces/LineSurfaceTests.cpp b/Tests/UnitTests/Core/Surfaces/LineSurfaceTests.cpp index 6ecab814604..5686a678001 100644 --- a/Tests/UnitTests/Core/Surfaces/LineSurfaceTests.cpp +++ b/Tests/UnitTests/Core/Surfaces/LineSurfaceTests.cpp @@ -123,12 +123,13 @@ BOOST_AUTO_TEST_CASE(LineSurface_allNamedMethods_test) { const Vector3 direction{0., 1., 2.}; BoundaryCheck bcheck(false); auto sfIntersection = - line.intersect(tgContext, {0., 0., 0.}, direction.normalized(), bcheck); - BOOST_CHECK(bool(sfIntersection)); + line.intersect(tgContext, {0., 0., 0.}, direction.normalized(), bcheck) + .closest(); + BOOST_CHECK(sfIntersection); Vector3 expectedIntersection(0, 1., 2.); - CHECK_CLOSE_ABS(sfIntersection.intersection.position, expectedIntersection, + CHECK_CLOSE_ABS(sfIntersection.position(), expectedIntersection, 1e-6); // need more tests.. - BOOST_CHECK_EQUAL(sfIntersection.object, &line); + BOOST_CHECK_EQUAL(sfIntersection.object(), &line); // // isOnSurface const Vector3 insidePosition{0., 2.5, 0.}; @@ -229,8 +230,8 @@ BOOST_AUTO_TEST_CASE(LineSurfaceTransformRoundTrip) { LineSurfaceStub surface(Transform3::Identity()); auto roundTrip = [&surface](const Vector3& pos, const Vector3& dir) { - auto intersection = surface.intersect(tgContext, pos, dir); - Vector3 global = intersection.intersection.position; + auto intersection = surface.intersect(tgContext, pos, dir).closest(); + Vector3 global = intersection.position(); Vector2 local = *surface.globalToLocal(tgContext, global, dir); Vector3 global2 = surface.localToGlobal(tgContext, local, dir); return std::make_tuple(global, local, global2); @@ -266,9 +267,9 @@ BOOST_AUTO_TEST_CASE(LineSurfaceTransformRoundTripEtaStability) { Vector3 dir = makeDirectionFromPhiEta(M_PI_2, eta); Vector3 pos = pca + dir; - auto intersection = surface.intersect(tgContext, pos, dir); + auto intersection = surface.intersect(tgContext, pos, dir).closest(); - Vector3 global = intersection.intersection.position; + Vector3 global = intersection.position(); Vector2 local = *surface.globalToLocal(tgContext, global, dir); Vector3 global2 = surface.localToGlobal(tgContext, local, dir); @@ -311,9 +312,11 @@ BOOST_AUTO_TEST_CASE(LineSurfaceIntersection) { } auto intersection = - surface->intersect(tgContext, displacedParameters.position(tgContext), - displacedParameters.direction()); - CHECK_CLOSE_ABS(intersection.intersection.pathLength, pathLimit, eps); + surface + ->intersect(tgContext, displacedParameters.position(tgContext), + displacedParameters.direction()) + .closest(); + CHECK_CLOSE_ABS(intersection.pathLength(), pathLimit, eps); BoundTrackParameters endParameters{surface, BoundVector::Zero(), std::nullopt, ParticleHypothesis::pion()}; diff --git a/Tests/UnitTests/Core/Surfaces/PlaneSurfaceTests.cpp b/Tests/UnitTests/Core/Surfaces/PlaneSurfaceTests.cpp index 1d4216f2924..eb4f9c008b3 100644 --- a/Tests/UnitTests/Core/Surfaces/PlaneSurfaceTests.cpp +++ b/Tests/UnitTests/Core/Surfaces/PlaneSurfaceTests.cpp @@ -161,15 +161,15 @@ BOOST_AUTO_TEST_CASE(PlaneSurfaceProperties) { // Test intersection Vector3 direction{0., 0., 1.}; auto sfIntersection = - planeSurfaceObject->intersect(tgContext, offSurface, direction, true); + planeSurfaceObject->intersect(tgContext, offSurface, direction, true) + .closest(); Intersection3D expectedIntersect{Vector3{0, 1, 2}, 4., Intersection3D::Status::reachable}; - BOOST_CHECK(bool(sfIntersection)); - BOOST_CHECK_EQUAL(sfIntersection.intersection.position, - expectedIntersect.position); - BOOST_CHECK_EQUAL(sfIntersection.intersection.pathLength, - expectedIntersect.pathLength); - BOOST_CHECK_EQUAL(sfIntersection.object, planeSurfaceObject.get()); + BOOST_CHECK(sfIntersection); + BOOST_CHECK_EQUAL(sfIntersection.position(), expectedIntersect.position()); + BOOST_CHECK_EQUAL(sfIntersection.pathLength(), + expectedIntersect.pathLength()); + BOOST_CHECK_EQUAL(sfIntersection.object(), planeSurfaceObject.get()); // /// Test pathCorrection diff --git a/Tests/UnitTests/Core/Surfaces/SurfaceIntersectionTests.cpp b/Tests/UnitTests/Core/Surfaces/SurfaceIntersectionTests.cpp index ca9a49154ff..318803e30b1 100644 --- a/Tests/UnitTests/Core/Surfaces/SurfaceIntersectionTests.cpp +++ b/Tests/UnitTests/Core/Surfaces/SurfaceIntersectionTests.cpp @@ -72,36 +72,30 @@ BOOST_AUTO_TEST_CASE(CylinderIntersectionTests) { aCylinder->intersect(tgContext, onCylinder, alongX, true); // Check the validity of the intersection - BOOST_CHECK(aIntersection); + BOOST_CHECK(aIntersection[0]); // The status of this one should be on surface - BOOST_CHECK(aIntersection.intersection.status == - Intersection3D::Status::onSurface); + BOOST_CHECK(aIntersection[0].status() == Intersection3D::Status::reachable); + // The intersection is at 2 meter distance + CHECK_CLOSE_ABS(aIntersection[0].pathLength(), -2_m, s_onSurfaceTolerance); // There MUST be a second solution - BOOST_CHECK(aIntersection.alternative); + BOOST_CHECK(aIntersection[1]); // The other intersection MUST be reachable - BOOST_CHECK(aIntersection.alternative.status == - Intersection3D::Status::reachable); - // The other intersection is at 2 meter distance - CHECK_CLOSE_ABS(aIntersection.alternative.pathLength, -2_m, - s_onSurfaceTolerance); + BOOST_CHECK(aIntersection[1].status() == Intersection3D::Status::onSurface); // Intersect from the center auto cIntersection = aCylinder->intersect(tgContext, atCenter, alongX, true); // Check the validity of the intersection - BOOST_CHECK(cIntersection); + BOOST_CHECK(cIntersection[0]); // The status of this one MUST be reachable - BOOST_CHECK(cIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(cIntersection[0].status() == Intersection3D::Status::reachable); // There MUST be a second solution - BOOST_CHECK(cIntersection.alternative); + BOOST_CHECK(cIntersection[1]); // The other intersection MUST be reachable - BOOST_CHECK(cIntersection.alternative.status == - Intersection3D::Status::reachable); + BOOST_CHECK(cIntersection[1].status() == Intersection3D::Status::reachable); // There MUST be one forward one backwards solution - BOOST_CHECK(cIntersection.alternative.pathLength * - cIntersection.intersection.pathLength < + BOOST_CHECK(cIntersection[1].pathLength() * cIntersection[0].pathLength() < 0); // Intersect from outside where both intersections are reachable @@ -109,18 +103,15 @@ BOOST_AUTO_TEST_CASE(CylinderIntersectionTests) { aCylinder->intersect(tgContext, outCylinder, alongX, true); // Check the validity of the intersection - BOOST_CHECK(oIntersection); + BOOST_CHECK(oIntersection[0]); // The status of this one MUST be reachable - BOOST_CHECK(oIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(oIntersection[0].status() == Intersection3D::Status::reachable); // There MUST be a second solution - BOOST_CHECK(oIntersection.alternative); + BOOST_CHECK(oIntersection[1]); // The other intersection MUST be reachable - BOOST_CHECK(oIntersection.alternative.status == - Intersection3D::Status::reachable); + BOOST_CHECK(oIntersection[1].status() == Intersection3D::Status::reachable); // There MUST be one forward one backwards solution - BOOST_CHECK(oIntersection.alternative.pathLength * - oIntersection.intersection.pathLength > + BOOST_CHECK(oIntersection[1].pathLength() * oIntersection[0].pathLength() > 0); // Intersection from outside without chance of hitting the cylinder @@ -128,41 +119,37 @@ BOOST_AUTO_TEST_CASE(CylinderIntersectionTests) { aCylinder->intersect(tgContext, outCylinder, transXY, false); // Check the validity of the intersection - BOOST_CHECK(!iIntersection); + BOOST_CHECK(!iIntersection[0]); // From edge tests - wo boundary test auto eIntersection = aCylinder->intersect(tgContext, atEdge, transTZ, false); // Check the validity of the intersection - BOOST_CHECK(eIntersection); + BOOST_CHECK(eIntersection[0]); // This should be the positive one - BOOST_CHECK(eIntersection.intersection.pathLength > 0.); + BOOST_CHECK(eIntersection[0].pathLength() < 0.); // The status of this one should be reachable - BOOST_CHECK(eIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(eIntersection[0].status() == Intersection3D::Status::reachable); // There MUST be a second solution - BOOST_CHECK(eIntersection.alternative); + BOOST_CHECK(eIntersection[1]); // The other intersection MUST be reachable - BOOST_CHECK(eIntersection.alternative.status == - Intersection3D::Status::reachable); + BOOST_CHECK(eIntersection[1].status() == Intersection3D::Status::reachable); // And be the negative one - BOOST_CHECK(eIntersection.alternative.pathLength < 0.); + BOOST_CHECK(eIntersection[1].pathLength() > 0.); // Now re-do with boundary check eIntersection = aCylinder->intersect(tgContext, atEdge, transTZ, true); // This should be the negative one - BOOST_CHECK(eIntersection.intersection.pathLength < 0.); + BOOST_CHECK(eIntersection[0].pathLength() < 0.); // The status of this one should be reachable - BOOST_CHECK(eIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(eIntersection[0].status() == Intersection3D::Status::reachable); // There MUST be a second solution - BOOST_CHECK(!eIntersection.alternative); + BOOST_CHECK(!eIntersection[1]); // The other intersection MUST NOT be reachable - BOOST_CHECK(eIntersection.alternative.status == - Intersection3D::Status::missed); + BOOST_CHECK(eIntersection[1].status() == Intersection3D::Status::missed); // And be the positive one - BOOST_CHECK(eIntersection.alternative.pathLength > 0.); + BOOST_CHECK(eIntersection[1].pathLength() > 0.); }; // In a nominal world @@ -196,25 +183,21 @@ BOOST_AUTO_TEST_CASE(ConeIntersectionTest) { auto aIntersection = aCone->intersect(tgContext, onCone, transXY, true); // Check the validity of the intersection - BOOST_CHECK(aIntersection); + BOOST_CHECK(aIntersection[0]); // The status of this one should be on surface - BOOST_CHECK(aIntersection.intersection.status == - Intersection3D::Status::onSurface); - + BOOST_CHECK(aIntersection[0].status() == Intersection3D::Status::reachable); + // The intersection is at 4 mm distance + CHECK_CLOSE_ABS(aIntersection[0].pathLength(), -4., s_onSurfaceTolerance); // There MUST be a second solution - BOOST_CHECK(aIntersection.alternative); + BOOST_CHECK(aIntersection[1]); // The other intersection MUST be reachable - BOOST_CHECK(aIntersection.alternative.status == - Intersection3D::Status::reachable); - // The other intersection is at 2 meter distance - CHECK_CLOSE_ABS(aIntersection.alternative.pathLength, -4., - s_onSurfaceTolerance); + BOOST_CHECK(aIntersection[1].status() == Intersection3D::Status::onSurface); // Intersection from outside without chance of hitting the cylinder auto iIntersection = aCone->intersect(tgContext, outCone, perpXY, false); // Check the validity of the intersection - BOOST_CHECK(!iIntersection); + BOOST_CHECK(!iIntersection[0]); }; // In a nominal world @@ -254,61 +237,56 @@ BOOST_AUTO_TEST_CASE(PlanarIntersectionTest) { auto fIntersection = aPlane->intersect(tgContext, before, direction, true); // The intersection MUST be valid - BOOST_CHECK(fIntersection); + BOOST_CHECK(fIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(fIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(fIntersection[0].status() == Intersection3D::Status::reachable); // The path length MUST be positive - BOOST_CHECK(fIntersection.intersection.pathLength > 0.); + BOOST_CHECK(fIntersection[0].pathLength() > 0.); // The intersection MUST be unique - BOOST_CHECK(!fIntersection.alternative); + BOOST_CHECK(!fIntersection[1]); // On surface intersection auto oIntersection = aPlane->intersect(tgContext, onit, direction, true); // The intersection MUST be valid - BOOST_CHECK(oIntersection); + BOOST_CHECK(oIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(oIntersection.intersection.status == - Intersection3D::Status::onSurface); + BOOST_CHECK(oIntersection[0].status() == Intersection3D::Status::onSurface); // The path length MUST be positive - BOOST_CHECK(std::abs(oIntersection.intersection.pathLength) < - s_onSurfaceTolerance); + BOOST_CHECK(std::abs(oIntersection[0].pathLength()) < s_onSurfaceTolerance); // The intersection MUST be unique - BOOST_CHECK(!oIntersection.alternative); + BOOST_CHECK(!oIntersection[1]); // Intersect backwards auto bIntersection = aPlane->intersect(tgContext, after, direction, true); // The intersection MUST be valid - BOOST_CHECK(bIntersection); + BOOST_CHECK(bIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(bIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(bIntersection[0].status() == Intersection3D::Status::reachable); // The path length MUST be negative - BOOST_CHECK(bIntersection.intersection.pathLength < 0.); + BOOST_CHECK(bIntersection[0].pathLength() < 0.); // The intersection MUST be unique - BOOST_CHECK(!bIntersection.alternative); + BOOST_CHECK(!bIntersection[1]); // An out of bounds attempt: missed auto mIntersection = aPlane->intersect(tgContext, outside, direction, true); // The intersection MUST NOT be valid - BOOST_CHECK(!mIntersection); + BOOST_CHECK(!mIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(mIntersection.intersection.status == - Intersection3D::Status::missed); + BOOST_CHECK(mIntersection[0].status() == Intersection3D::Status::missed); // The path length MUST be negative - BOOST_CHECK(mIntersection.intersection.pathLength > 0.); + BOOST_CHECK(mIntersection[0].pathLength() > 0.); // The intersection MUST be unique - BOOST_CHECK(!mIntersection.alternative); + BOOST_CHECK(!mIntersection[1]); // An invalid attempt auto iIntersection = aPlane->intersect(tgContext, before, parallel, true); // The intersection MUST NOT be valid - BOOST_CHECK(!iIntersection); + BOOST_CHECK(!iIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(iIntersection.intersection.status == + BOOST_CHECK(iIntersection[0].status() == Intersection3D::Status::unreachable); // The intersection MUST be unique - BOOST_CHECK(!iIntersection.alternative); + BOOST_CHECK(!iIntersection[1]); }; // In a nominal world @@ -347,74 +325,67 @@ BOOST_AUTO_TEST_CASE(LineIntersectionTest) { // Intersect forward auto fIntersection = aLine->intersect(tgContext, before, direction, true); // The intersection MUST be valid - BOOST_CHECK(fIntersection); + BOOST_CHECK(fIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(fIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(fIntersection[0].status() == Intersection3D::Status::reachable); // The path length MUST be positive - BOOST_CHECK(fIntersection.intersection.pathLength > 0.); + BOOST_CHECK(fIntersection[0].pathLength() > 0.); // The intersection MUST be unique - BOOST_CHECK(!fIntersection.alternative); + BOOST_CHECK(!fIntersection[1]); // On surface intersection - on the straw with random direction auto oIntersection = aLine->intersect(tgContext, onit1, direction, true); // The intersection MUST be valid - BOOST_CHECK(oIntersection); + BOOST_CHECK(oIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(oIntersection.intersection.status == - Intersection3D::Status::onSurface); + BOOST_CHECK(oIntersection[0].status() == Intersection3D::Status::onSurface); // The path length MUST be positive - BOOST_CHECK(std::abs(oIntersection.intersection.pathLength) < - s_onSurfaceTolerance); + BOOST_CHECK(std::abs(oIntersection[0].pathLength()) < s_onSurfaceTolerance); // The intersection MUST be unique - BOOST_CHECK(!oIntersection.alternative); + BOOST_CHECK(!oIntersection[1]); // On surface intersecion - on the surface with normal vector oIntersection = aLine->intersect(tgContext, onitP, normalP, true); // The intersection MUST be valid - BOOST_CHECK(oIntersection); + BOOST_CHECK(oIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(oIntersection.intersection.status == - Intersection3D::Status::onSurface); + BOOST_CHECK(oIntersection[0].status() == Intersection3D::Status::onSurface); // The path length MUST be positive - BOOST_CHECK(std::abs(oIntersection.intersection.pathLength) < - s_onSurfaceTolerance); + BOOST_CHECK(std::abs(oIntersection[0].pathLength()) < s_onSurfaceTolerance); // The intersection MUST be unique - BOOST_CHECK(!oIntersection.alternative); + BOOST_CHECK(!oIntersection[1]); // Intersect backwards auto bIntersection = aLine->intersect(tgContext, after, direction, true); // The intersection MUST be valid - BOOST_CHECK(bIntersection); + BOOST_CHECK(bIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(bIntersection.intersection.status == - Intersection3D::Status::reachable); + BOOST_CHECK(bIntersection[0].status() == Intersection3D::Status::reachable); // The path length MUST be negative - BOOST_CHECK(bIntersection.intersection.pathLength < 0.); + BOOST_CHECK(bIntersection[0].pathLength() < 0.); // The intersection MUST be unique - BOOST_CHECK(!bIntersection.alternative); + BOOST_CHECK(!bIntersection[1]); // An out of bounds attempt: missed auto mIntersection = aLine->intersect(tgContext, outside, direction, true); // The intersection MUST NOT be valid - BOOST_CHECK(!mIntersection); + BOOST_CHECK(!mIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(mIntersection.intersection.status == - Intersection3D::Status::missed); + BOOST_CHECK(mIntersection[0].status() == Intersection3D::Status::missed); // The path length MUST be negative - BOOST_CHECK(mIntersection.intersection.pathLength < 0.); + BOOST_CHECK(mIntersection[0].pathLength() < 0.); // The intersection MUST be unique - BOOST_CHECK(!mIntersection.alternative); + BOOST_CHECK(!mIntersection[1]); // An invalid attempt auto iIntersection = aLine->intersect(tgContext, before, parallel, true); // The intersection MUST NOT be valid - BOOST_CHECK(!iIntersection); + BOOST_CHECK(!iIntersection[0]); // The intersection MUST be reachable - BOOST_CHECK(iIntersection.intersection.status == + BOOST_CHECK(iIntersection[0].status() == Intersection3D::Status::unreachable); // The intersection MUST be unique - BOOST_CHECK(!iIntersection.alternative); + BOOST_CHECK(!iIntersection[1]); }; // In a nominal world diff --git a/Tests/UnitTests/Core/Surfaces/SurfaceStub.hpp b/Tests/UnitTests/Core/Surfaces/SurfaceStub.hpp index b2bc7422f80..82419c34205 100644 --- a/Tests/UnitTests/Core/Surfaces/SurfaceStub.hpp +++ b/Tests/UnitTests/Core/Surfaces/SurfaceStub.hpp @@ -13,6 +13,7 @@ #include "Acts/Surfaces/InfiniteBounds.hpp" //to get s_noBounds #include "Acts/Surfaces/PlanarBounds.hpp" #include "Acts/Surfaces/Surface.hpp" +#include "Acts/Utilities/Intersection.hpp" namespace Acts { /// Surface derived class stub @@ -80,14 +81,14 @@ class SurfaceStub : public Surface { } /// Surface intersction - SurfaceIntersection intersect(const GeometryContext& /*gctx*/, - const Vector3& /*position*/, - const Vector3& /*direction*/, - const BoundaryCheck& /*bcheck*/, - const ActsScalar /*tolerance*/) const final { + SurfaceMultiIntersection intersect( + const GeometryContext& /*gctx*/, const Vector3& /*position*/, + const Vector3& /*direction*/, const BoundaryCheck& /*bcheck*/, + const ActsScalar /*tolerance*/) const final { Intersection3D stubIntersection(Vector3(20., 0., 0.), 20., Intersection3D::Status::reachable); - return SurfaceIntersection(stubIntersection, this); + return SurfaceMultiIntersection( + {stubIntersection, Intersection3D::invalid()}, this); } /// Return properly formatted class name diff --git a/Tests/UnitTests/Core/TrackFitting/FitterTestsCommon.hpp b/Tests/UnitTests/Core/TrackFitting/FitterTestsCommon.hpp index fdeaae99d38..a466a32a664 100644 --- a/Tests/UnitTests/Core/TrackFitting/FitterTestsCommon.hpp +++ b/Tests/UnitTests/Core/TrackFitting/FitterTestsCommon.hpp @@ -551,8 +551,9 @@ struct FitterTester { const auto& outlierSourceLinks = measurements.outlierSourceLinks; BOOST_REQUIRE_EQUAL(sourceLinks.size(), nMeasurements); BOOST_REQUIRE_EQUAL(outlierSourceLinks.size(), nMeasurements); - // create a boundless target surface near the tracker exit - Acts::Vector3 center(3._m, 0., 0.); + + // create a boundless target surface near the tracker entry + Acts::Vector3 center(-3._m, 0., 0.); Acts::Vector3 normal(1., 0., 0.); auto targetSurface = Acts::Surface::makeShared(center, normal); diff --git a/Tests/UnitTests/Core/TrackFitting/GsfComponentMergingTests.cpp b/Tests/UnitTests/Core/TrackFitting/GsfComponentMergingTests.cpp index a00fc7561dc..a75822b8d62 100644 --- a/Tests/UnitTests/Core/TrackFitting/GsfComponentMergingTests.cpp +++ b/Tests/UnitTests/Core/TrackFitting/GsfComponentMergingTests.cpp @@ -200,8 +200,9 @@ BoundVector meanFromFree(std::vector> cmps, Vector3 position = mean.head<3>(); Vector3 direction = mean.segment<3>(eFreeDir0); auto intersection = - surface.intersect(GeometryContext{}, position, direction, false); - mean.head<3>() = intersection.intersection.position; + surface.intersect(GeometryContext{}, position, direction, false) + .closest(); + mean.head<3>() = intersection.position(); return *detail::transformFreeToBoundParameters(mean, surface, GeometryContext{}); diff --git a/Tests/UnitTests/Core/TrackFitting/KalmanFitterTests.cpp b/Tests/UnitTests/Core/TrackFitting/KalmanFitterTests.cpp index 96277b637ee..38247a6cab4 100644 --- a/Tests/UnitTests/Core/TrackFitting/KalmanFitterTests.cpp +++ b/Tests/UnitTests/Core/TrackFitting/KalmanFitterTests.cpp @@ -82,10 +82,10 @@ Acts::CurvilinearTrackParameters makeParameters() { const FitterTester tester; // reconstruction propagator and fitter -const auto kfLogger = getDefaultLogger("KalmanFilter", Logging::INFO); +auto kfLogger = getDefaultLogger("KalmanFilter", Logging::INFO); const auto kfZeroPropagator = makeConstantFieldPropagator(tester.geometry, 0_T); -const auto kfZero = KalmanFitter(kfZeroPropagator); +const auto kfZero = KalmanFitter(kfZeroPropagator, std::move(kfLogger)); std::default_random_engine rng(42); diff --git a/Tests/UnitTests/Core/Utilities/IntersectionTests.cpp b/Tests/UnitTests/Core/Utilities/IntersectionTests.cpp index 3d54951fb93..caee87d5580 100644 --- a/Tests/UnitTests/Core/Utilities/IntersectionTests.cpp +++ b/Tests/UnitTests/Core/Utilities/IntersectionTests.cpp @@ -51,23 +51,14 @@ BOOST_AUTO_TEST_CASE(IntersectionTest) { std::vector tsfpIntersections = {tIp, sIp, fIp}; // let's sort the tsf intersection, it should give fst - std::sort(tsfpIntersections.begin(), tsfpIntersections.end()); - BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength, - tsfpIntersections[0].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength, - tsfpIntersections[1].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength, - tsfpIntersections[2].pathLength); - - // let's sort them with greater std::sort(tsfpIntersections.begin(), tsfpIntersections.end(), - std::greater<>()); - BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength, - tsfpIntersections[2].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength, - tsfpIntersections[1].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength, - tsfpIntersections[0].pathLength); + Intersection3D::forwardOrder); + BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength(), + tsfpIntersections[0].pathLength()); + BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength(), + tsfpIntersections[1].pathLength()); + BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength(), + tsfpIntersections[2].pathLength()); // now let's create one with a non-valid intersection, it should be shuffled // last @@ -75,24 +66,23 @@ BOOST_AUTO_TEST_CASE(IntersectionTest) { std::vector tfnsnpIntersections = {tIp, fIp, nIp, sIp, nIp}; // shuffle the intersections - std::sort(ntfspIntersections.begin(), ntfspIntersections.end()); - BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength, - ntfspIntersections[0].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength, - ntfspIntersections[1].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength, - ntfspIntersections[2].pathLength); - BOOST_CHECK_EQUAL(bool(ntfspIntersections[3]), false); - - std::sort(tfnsnpIntersections.begin(), tfnsnpIntersections.end()); - BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength, - tfnsnpIntersections[0].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength, - tfnsnpIntersections[1].pathLength); - BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength, - tfnsnpIntersections[2].pathLength); - BOOST_CHECK_EQUAL(bool(tfnsnpIntersections[3]), false); - BOOST_CHECK_EQUAL(bool(tfnsnpIntersections[4]), false); + std::sort(ntfspIntersections.begin(), ntfspIntersections.end(), + Intersection3D::forwardOrder); + BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength(), + ntfspIntersections[0].pathLength()); + BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength(), + ntfspIntersections[1].pathLength()); + BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength(), + ntfspIntersections[2].pathLength()); + + std::sort(tfnsnpIntersections.begin(), tfnsnpIntersections.end(), + Intersection3D::forwardOrder); + BOOST_CHECK_EQUAL(fstpIntersections[0].pathLength(), + tfnsnpIntersections[0].pathLength()); + BOOST_CHECK_EQUAL(fstpIntersections[1].pathLength(), + tfnsnpIntersections[1].pathLength()); + BOOST_CHECK_EQUAL(fstpIntersections[2].pathLength(), + tfnsnpIntersections[2].pathLength()); /// let's make a bunch of negative solution Intersection3D fIn(Vector3(0., -1., 0.), -1., @@ -106,80 +96,47 @@ BOOST_AUTO_TEST_CASE(IntersectionTest) { std::vector fstnIntersections = {fIn, sIn, tIn}; // this time around, sort the f-s-t-n to match the t-s-f-n - std::sort(fstnIntersections.begin(), fstnIntersections.end()); - BOOST_CHECK_EQUAL(fstnIntersections[0].pathLength, - tsfnIntersections[0].pathLength); - BOOST_CHECK_EQUAL(fstnIntersections[1].pathLength, - tsfnIntersections[1].pathLength); - BOOST_CHECK_EQUAL(fstnIntersections[2].pathLength, - tsfnIntersections[2].pathLength); - - // let's sort them with greater std::sort(fstnIntersections.begin(), fstnIntersections.end(), - std::greater<>()); - BOOST_CHECK_EQUAL(fstnIntersections[0].pathLength, - tsfnIntersections[2].pathLength); - BOOST_CHECK_EQUAL(fstnIntersections[1].pathLength, - tsfnIntersections[1].pathLength); - BOOST_CHECK_EQUAL(fstnIntersections[2].pathLength, - tsfnIntersections[0].pathLength); + Intersection3D::forwardOrder); + BOOST_CHECK_EQUAL(fstnIntersections[0].pathLength(), + tsfnIntersections[0].pathLength()); + BOOST_CHECK_EQUAL(fstnIntersections[1].pathLength(), + tsfnIntersections[1].pathLength()); + BOOST_CHECK_EQUAL(fstnIntersections[2].pathLength(), + tsfnIntersections[2].pathLength()); // shuffle negative and positive solutions std::vector pnsolutions = {tIp, sIn, sIp, fIn, tIn, fIp}; - std::sort(pnsolutions.begin(), pnsolutions.end()); + std::sort(pnsolutions.begin(), pnsolutions.end(), + Intersection3D::forwardOrder); - BOOST_CHECK_EQUAL(pnsolutions[0].pathLength, -3.); - BOOST_CHECK_EQUAL(pnsolutions[1].pathLength, -2.); - BOOST_CHECK_EQUAL(pnsolutions[2].pathLength, -1.); - BOOST_CHECK_EQUAL(pnsolutions[3].pathLength, 1.); - BOOST_CHECK_EQUAL(pnsolutions[4].pathLength, 2.); - BOOST_CHECK_EQUAL(pnsolutions[5].pathLength, 3.); + BOOST_CHECK_EQUAL(pnsolutions[0].pathLength(), -3.); + BOOST_CHECK_EQUAL(pnsolutions[1].pathLength(), -2.); + BOOST_CHECK_EQUAL(pnsolutions[2].pathLength(), -1.); + BOOST_CHECK_EQUAL(pnsolutions[3].pathLength(), 1.); + BOOST_CHECK_EQUAL(pnsolutions[4].pathLength(), 2.); + BOOST_CHECK_EQUAL(pnsolutions[5].pathLength(), 3.); // sort intersections with zero path length Intersection3D zI(Vector3(0., 0., 0.), 0., Intersection3D::Status::onSurface); std::vector tszfpIntersections = {tIp, sIp, zI, fIp}; - std::sort(tszfpIntersections.begin(), tszfpIntersections.end()); - BOOST_CHECK_EQUAL(tszfpIntersections[0].pathLength, 0.); - BOOST_CHECK_EQUAL(tszfpIntersections[1].pathLength, 1.); - BOOST_CHECK_EQUAL(tszfpIntersections[2].pathLength, 2.); - BOOST_CHECK_EQUAL(tszfpIntersections[3].pathLength, 3.); + std::sort(tszfpIntersections.begin(), tszfpIntersections.end(), + Intersection3D::forwardOrder); + BOOST_CHECK_EQUAL(tszfpIntersections[0].pathLength(), 0.); + BOOST_CHECK_EQUAL(tszfpIntersections[1].pathLength(), 1.); + BOOST_CHECK_EQUAL(tszfpIntersections[2].pathLength(), 2.); + BOOST_CHECK_EQUAL(tszfpIntersections[3].pathLength(), 3.); std::vector tfsznIntersections = {tIn, fIn, sIn, zI}; std::vector ztfsnIntersections = {zI, tIn, fIn, sIn}; std::sort(tfsznIntersections.begin(), tfsznIntersections.end(), - std::greater<>()); - BOOST_CHECK_EQUAL(tfsznIntersections[0].pathLength, 0.); - BOOST_CHECK_EQUAL(tfsznIntersections[1].pathLength, -1.); - BOOST_CHECK_EQUAL(tfsznIntersections[2].pathLength, -2.); - BOOST_CHECK_EQUAL(tfsznIntersections[3].pathLength, -3.); - - std::sort(ztfsnIntersections.begin(), ztfsnIntersections.end(), - std::greater<>()); - BOOST_CHECK_EQUAL(ztfsnIntersections[0].pathLength, 0.); - BOOST_CHECK_EQUAL(ztfsnIntersections[1].pathLength, -1.); - BOOST_CHECK_EQUAL(ztfsnIntersections[2].pathLength, -2.); - BOOST_CHECK_EQUAL(ztfsnIntersections[3].pathLength, -3.); -} - -/// test swappping of the intersection -BOOST_AUTO_TEST_CASE(SwapObjectIntersectionTest) { - using ObjectIntersection = ObjectIntersection; - - Intersection3D intersection(Vector3(0., 0., 0.), 0., - IntersectionStatus::onSurface); - Intersection3D alternative(Vector3(10., 0., 0.), 10., - IntersectionStatus::reachable); - ObjectIntersection oIntersection; - oIntersection.intersection = intersection; - oIntersection.alternative = alternative; - - BOOST_CHECK(oIntersection.intersection.position == Vector3(0., 0., 0.)); - BOOST_CHECK(oIntersection.alternative.position == Vector3(10., 0., 0.)); - oIntersection.swapSolutions(); - BOOST_CHECK(oIntersection.alternative.position == Vector3(0., 0., 0.)); - BOOST_CHECK(oIntersection.intersection.position == Vector3(10., 0., 0.)); + Intersection3D::forwardOrder); + BOOST_CHECK_EQUAL(tfsznIntersections[0].pathLength(), -3.); + BOOST_CHECK_EQUAL(tfsznIntersections[1].pathLength(), -2.); + BOOST_CHECK_EQUAL(tfsznIntersections[2].pathLength(), -1.); + BOOST_CHECK_EQUAL(tfsznIntersections[3].pathLength(), 0.); } /// test of the object intersection class @@ -226,15 +183,9 @@ BOOST_AUTO_TEST_CASE(ObjectIntersectionTest) { // This should give 6 different intersections std::set_union(firstSet.begin(), firstSet.end(), secondSet.begin(), - secondSet.end(), std::back_inserter(unionSetStd)); + secondSet.end(), std::back_inserter(unionSetStd), + PlaneIntersection::forwardOrder); BOOST_CHECK_EQUAL(unionSetStd.size(), 6u); - - // This should give 5 different inteseciton attempts (for each surface 1) - SameSurfaceIntersection onSameSurface; - std::set_union(firstSet.begin(), firstSet.end(), secondSet.begin(), - secondSet.end(), std::back_inserter(unionSetCst), - onSameSurface); - BOOST_CHECK_EQUAL(unionSetCst.size(), 5u); } BOOST_AUTO_TEST_CASE(IntersectionStatusPrinting) { diff --git a/Tests/UnitTests/Core/Vertexing/GridDensityVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/GridDensityVertexFinderTests.cpp index 47fd70181dc..b57a11b2ec7 100644 --- a/Tests/UnitTests/Core/Vertexing/GridDensityVertexFinderTests.cpp +++ b/Tests/UnitTests/Core/Vertexing/GridDensityVertexFinderTests.cpp @@ -138,8 +138,9 @@ BOOST_AUTO_TEST_CASE(grid_density_vertex_finder_test) { // project the position on the surface Vector3 direction = makeDirectionFromPhiEta(phi, eta); - auto intersection = perigeeSurface->intersect(geoContext, pos, direction); - pos = intersection.intersection.position; + auto intersection = + perigeeSurface->intersect(geoContext, pos, direction).closest(); + pos = intersection.position(); // Produce most of the tracks at near z1 position, // some near z2. Highest track density then expected at z1 @@ -252,8 +253,9 @@ BOOST_AUTO_TEST_CASE(grid_density_vertex_finder_track_caching_test) { // project the position on the surface Vector3 direction = makeDirectionFromPhiEta(phi, eta); - auto intersection = perigeeSurface->intersect(geoContext, pos, direction); - pos = intersection.intersection.position; + auto intersection = + perigeeSurface->intersect(geoContext, pos, direction).closest(); + pos = intersection.position(); // Produce most of the tracks at near z1 position, // some near z2. Highest track density then expected at z1 @@ -417,8 +419,9 @@ BOOST_AUTO_TEST_CASE(grid_density_vertex_finder_seed_width_test) { // project the position on the surface Vector3 direction = makeDirectionFromPhiEta(phi, eta); - auto intersection = perigeeSurface->intersect(geoContext, pos, direction); - pos = intersection.intersection.position; + auto intersection = + perigeeSurface->intersect(geoContext, pos, direction).closest(); + pos = intersection.position(); pos[eZ] = z1dist(gen); diff --git a/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp b/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp index 86ac107ede6..8d481f88b67 100644 --- a/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp +++ b/Tests/UnitTests/Core/Vertexing/ImpactPointEstimatorTests.cpp @@ -25,9 +25,11 @@ #include "Acts/MagneticField/NullBField.hpp" #include "Acts/Propagator/EigenStepper.hpp" #include "Acts/Propagator/Propagator.hpp" +#include "Acts/Propagator/detail/VoidPropagatorComponents.hpp" #include "Acts/Surfaces/PerigeeSurface.hpp" #include "Acts/Surfaces/Surface.hpp" #include "Acts/Tests/CommonHelpers/FloatComparisons.hpp" +#include "Acts/Utilities/Logger.hpp" #include "Acts/Utilities/Result.hpp" #include "Acts/Vertexing/ImpactPointEstimator.hpp" #include "Acts/Vertexing/TrackAtVertex.hpp" @@ -89,7 +91,9 @@ Estimator makeEstimator(double bZ) { auto field = std::make_shared(Vector3(0, 0, bZ)); Stepper stepper(field); Estimator::Config cfg(field, - std::make_shared(std::move(stepper))); + std::make_shared( + std::move(stepper), detail::VoidNavigator(), + getDefaultLogger("Prop", Logging::Level::VERBOSE))); return Estimator(cfg); } diff --git a/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp index 9cd1374fe25..2ec46ea0830 100644 --- a/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp +++ b/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp @@ -256,8 +256,9 @@ BOOST_AUTO_TEST_CASE(track_density_finder_random_test) { // project the position on the surface Vector3 direction = makeDirectionFromPhiEta(phi, eta); - auto intersection = perigeeSurface->intersect(geoContext, pos, direction); - pos = intersection.intersection.position; + auto intersection = + perigeeSurface->intersect(geoContext, pos, direction).closest(); + pos = intersection.position(); // Produce most of the tracks at near z1 position, // some near z2. Highest track density then expected at z1