From afebfab76c507c86d72ec7a8d56ce53d624eb3bf Mon Sep 17 00:00:00 2001 From: Andreas Stefl Date: Fri, 8 Mar 2024 14:48:52 +0100 Subject: [PATCH] feat: Write truth matching in `VertexPerformanceWriter` (#2969) Writes primary and secondary vertex number after matching to truth. I also reorganized the branches and the order of writing them to follow reco -> truth. blocked by - https://github.com/acts-project/acts/pull/2970 --- ...rformance_amvf_gridseeder_seeded_hist.root | Bin 46353 -> 52003 bytes ...erformance_amvf_gridseeder_ttbar_hist.root | Bin 42394 -> 48172 bytes .../performance_amvf_orthogonal_hist.root | Bin 44994 -> 50877 bytes .../performance_amvf_seeded_hist.root | Bin 44998 -> 50795 bytes ...performance_amvf_truth_estimated_hist.root | Bin 45177 -> 50884 bytes .../performance_amvf_truth_smeared_hist.root | Bin 45088 -> 50678 bytes .../performance_amvf_ttbar_hist.root | Bin 42298 -> 48087 bytes .../performance_ivf_orthogonal_hist.root | Bin 46171 -> 52200 bytes .../performance_ivf_seeded_hist.root | Bin 46150 -> 52188 bytes .../performance_ivf_truth_estimated_hist.root | Bin 46820 -> 52569 bytes .../performance_ivf_truth_smeared_hist.root | Bin 46442 -> 52451 bytes .../Performance/VertexPerformanceWriter.cpp | 438 +++++++++--------- .../Performance/VertexPerformanceWriter.hpp | 117 ++--- 13 files changed, 286 insertions(+), 269 deletions(-) diff --git a/CI/physmon/reference/performance_amvf_gridseeder_seeded_hist.root b/CI/physmon/reference/performance_amvf_gridseeder_seeded_hist.root index 77324ee8da36be8427e2299118d4b8bc6afec054..df4b1db76b0a8207f61f0058ceb0532817fb5bfd 100644 GIT binary patch delta 6765 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 ZmtaL)E6BSHJq*hmAn#7ur8$;i{{g~{cd-Bf delta 3894 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 IXO|KG1~{~x{r~^~ delta 3692 zcmc&%X-rgC6n^)yxL~pH2HA!I+;KRn!wyCjcjcwCf+k4L=Gq=-6(tn-g&D?vx^Um_!`@Zw$ z(q_N5yK0J~tjwt>4_g&QDOQx@ZTw2(<0^gy@@u(2|0+?Gu8oQ^XoY|Rj{W#=7 z%?vgDNGP=Qw79c-1T`zd%|Zzc`k%Bctl5BR-T)~XVR)o$l5SeA(8_nrsxm@r9W!E$P&&5(1}JkoRX_&lFf zbNO5y>+5P_BDgk0Q%rK5QVJ~_q7#H0ny2mYxCwBS*vks|l*M_ya3-Vr@HP3vZWAu? zHa-uhF1W!ogYfugQXkc%j`Oi?lGS1#|47(n8ivTwZcjswSr% zlb2XjE!j8loDcBn>4_3UbGzZpnHK$4qAYJDR?G@xVG7d^sC0zvVNi5h+V|qVP@5hd z<=OYeg&tM{>}9L+3*6Rt6RY=SH2*&C&T&g23#xI#oOOZ?cE;DZ(2U9DjZC}jTgift zu{jwfFN@q*ntF_BSA8vuX5*+aN6EcGNmxGFU-DAi7b`R5Beb{>&t~?O7%O$*JzE$v zu{9LvS=zZIaVnO+4JWq5;J1x7rsWYhm%w2HTs8zAT#CSJ4TJf~T|nq_gpLyEi&dC* zV7jVJBp{!F;Q}c860)~MV$8lCY`P;mbE(r=Qp{Oqr^qmy3QE2)-JOnQi}-Puo`B3m;disy2bJ zg@lb1*jgt{x@g94mIbNWR01Um*B!%fsu3QSoF}v+7 zg0~y4Btb1aSd%hU1mg{di-vpM(DD3tGJo_9I)G;n^;VHD_HTx8D zs3kOdW12f-IG+nii#Ir5N(wiC>s2DO7gnM4bwJC^P<^M zCeMxKn6joU7Z<`;8>K8tUEVB&JX3Qw=n(KEU5Yxl8^oTGyyT7ihnE7X#XvK+cu;ms38LNf46QSsxYM>DwHvW_9 zS~?Mp$j;hHTqm6*%CL#R@yqd@^bm80*h=cR<5Q?_iWO~l7fDPT2_tFr&Ym!HYovC8 z)^E}}>GQ5;*!xbbc7WEe(>isxw@RS=uwa{AA?PE5sI@f&K^J%2WY$Iiy(=rU^?Tm; za2G5(mUuF9#LIOyUuU<-{1fs+TD`9hy0pfd)K~!oNS&{70kqbJn^>v<)UW9dI!g!E z!WvgU?^!!|9-3VGS)(Ekb%)Pg@r2W3-@FQLotGZ_!$-loLZ6Qn0)C_&;x7y#d#dc1 zKkQu*2cufcOiVwQ{~#CZn}+Le79Eu0XNRg;C!Ct`(Xm=)L@bsc2BsO)YQd8ywld9t zS`0sWoN2}+#-j6NJ@4?wOorhX>we*{HwJW~|EeUtBHF-%=P`Zt6sg2R-ErHRB7LEQ zQGD{!5NUxZ)xh@3Uqqvq)_7dGHdr_Ga%;inSG%zY{s)lntdh)kwxgBO-$Kz!VfFRk nVdMB~&iJ`vho(GKl+0u?%Ae1#AH=9UnqMw4I^MQ=^c%|GM&Jve diff --git a/CI/physmon/reference/performance_amvf_seeded_hist.root b/CI/physmon/reference/performance_amvf_seeded_hist.root index 86c338b3a05b1dea518c21f0bdf0e58e4da4cb31..3941a5ffdc0b29bd885e25f1da3868a12783c478 100644 GIT binary patch delta 6918 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 delta 3698 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

-<1$;jgBC9u27 zPp$-mSIU<#@W4X(1YT3B9z0sTf#L163OM7CHDeR22CuUGOY9X5Z!&FLl-PlPwL5HEWYTK2|f@B-*Vp3I!m=e|Hx?tYpYNcbXZ zmL76rVTPTM{yUpKoDYF$ntfm&VTGH61j-on=5gOQ3bQ{DAlQpDxa!33uY^v%;M=W? zvGXRtpT@@)P4oHFSW2lfTI98v9{#a{&ys-LLWb6<_MnbAc9(+05C+{N6Z97HgO!!s z^WZ=$VaUqI_&^vy<8^Z&7pgRDr4+<%W9as^9v~Hpr2eSeZ@~brFwDhLX@P$}-&VP9 zSMz?UB#A^EN)Oq91nkb|hbX0j8V5?@eXvwSC6{`#bair62vW{c9)WPHAwFP5bp)AC zhS;@uyof(Y4YtNoB9&~Yh+|uS5eX*$KO~?g;8XO)X@$XQ`7n@PVC;Z|6kw&a%%LsM zr`?F1&jMbcwSX^Ex-o&H6jV!Cy=oP5K3R{cd*v{WX3O72m{wh+?i=)_!C7%r)LHQ=Mb&4GyP5uNL1-#YR zRbm`CQ&7b%ce?U9)fdeqZV~kk4egf911~U4;KWGzAUULFF&j(vFP?RJ&0xc^LGc(YpY=e^dBLy>99HW7PX6oP_mtO;K;~DY9xJm9)2NQGoNNO{d zT8cMrk2YRe2wb{9fk_zD z>(+v_GGi0kHSd2Ymbic_*^!j&Ljr@oOYM7qM+O1oJw!UqF7}>BLc2kp!{+)3Nq$MB zZHwm>x7}{V+H>upzHFO#nR!;}^b69W{aIP!h{m{<=15)Lebz+|{IAna?D_s}wyZue zyyN@Mwe7FlPCf1$<)O{ty45DA=9GJmG>T}bzFPIza!1vTd#9dc-TPt8foG;V25V*- z+!0isTai~`@Z@;rM<>UbH&|6Tuj#HAZ2P?Bie&s3yPZYco9n`2)^vRBe(b#9-mTXe zXMe0pTDIUc**c=@K)|NP*wXvI^-4H(QI{QM4@&-fW4Tsn%H=aNdyns3ubFPCzT~@} z*8&&4MLj1r-WP>h#fRw?%su*3_@`4lPHg3F|1z~RhJAQs{P)C0n6y z%nVu?OK!rq@uuh|r6~3Tk`qqMO(l8ksc8fsMu(DrlAp%#bnGOGElHuvuBq}iSdp4= z!|q&?$C8+^wRAVhV@XTsSbm&j%S&ifQbO`rvJ$419U^%*aJt^a>55Bq{WSQl;vA_@ ze^;X`#;6B0MbR$PU)K8DWl!2UL+vt#8~h<-s9jcLwE056p>`Rk)KI%T)Gp&d=>MEF z)Gmt%+-457%YWW3quzrBn!&pY6L6t88eA*>+ s9J>j^$p_sy+~esd5xoWZ&`$$;i>E(ICTO5H^aZUDzcn|lnNmdj4_u4O`Tzg` delta 3683 zcmcIneNa?Y6uKP9#TX=4r!=%B-7d@my24oG@4~wJ zZT)b0l$IV)tvFK`d;zwbL#^Pel zP>2ohhD+5}^6Y9KF;eR<^Mq$p9dWY6aW=7ww^x34a%O~YWtFe20Fpc7E!qvCjuCtC z=efUei)de@NQk2@r^pn2+Oe|FoCJ$ma_sF6(;{Wpv|DOC4lcY-({G~eSyaZ2GDrG! zoHS(+w`eh;`=-W2acxXWAVtQ)kb?8YTALJ_a8fE19JbNUw87-%@UXhR?Ik!^VXwZ(=1wgXbF>-W66X>qkF31wwJJR;sBHGU9aO) zvxaf1HeS*(wF_U#y~y=AnKSH2kf+S|aN?YS9DX=9*eWR*CB1XcirS4c?6tDAGQYuP zvuMLZ%gJ(~$JI|8!WfSY#j-v4VgB`8*9pj^{V4T}4H&VYkI@4e?syul3;QaDoMs$b zGC(opp2ckM1*MtUP2j52F=cVMrYD8&Jm)pkXO2`zntKhW-f1_&iM4qST$W?u+M*(u zd_*}>&v2-CTv>aQq4tO^TCzfMiwgs+gnKGhxeFUyP78061*nX=ui}o`wOrp53KTw$ z_T`OAA@fJ$t1EVJ3-1hVqUaMmdCOtNwRk%|aBB+Hdzq*_Y0kPdE~yc0`WU|q*BJhP{O>v;s;P2gAw zE=z+SP7TEaJ4cFpTTEyPq2nc5UIPa^>^SSiv6`Mnpqs!X307PNdxsVO+|`?BXD#vh zO1*+*ewf_y$ZfQA+gK7HzproQvSM*9^U9V;*G=R)pInorYh4uNbPR)p&VCl5dg63c zd0J72zRGWeE*NiDK81~uVU=}w-&X(IMU_>Z#uv8DG|0JGdaNFT-HkIuhbffxE{YXW z%h=jVe0jY?)29%yfPfSUJop04s*l0*O9yKDYyuV5)?J3KCx+rrkB$;K=Mt*0_DCA6 zueW30a;JR7v=YJ<;x=poN4*t2WoepTMWC1VO_lpre~b2p5=}SZ5$84S=DIm+HcWrM zi0gHfPT^+LZn(HP3PJ2xupEEgO4xGz8$3Lnnq;oNmhk#c^WmS2eFGZ})v;ywi8U;z4BdI{Y zTtLRDk+k-!1#~w?PZi-NauL`i(hxIGg`sAexq>))5D%MfE*nnWTrOhFlmhGx4wpD0 z6Ril8`JXh`-h*&hdm1OPJxr45o`#6ChxrksyFwMPF&?^}OrYZ+iGFq|yuELToRh86 zHSDdRNH_I{)-4Xbh3x0ZPE&3B5h!mSDnmL5dY2#?X*)e|X-lkypC{lv0dxy?Ibr>l z82w$czfX1&w_mD#hIei5SS4P{Old$<@l!d!xjP^Oj&<%R=bI3X|DtN>8PJ|1q ztnlOs*h>aaa>CiH=`4C z4|Rw!Zo(#RSf^{IbfT{+$LNI4YVSn6u#kju+zh67Z zFa&vZ;+O~f8^$2HcJw|J$t~iipEzE2i#T5Y*lg_*V>2BdK6m}t3FVAs6wC9O-pyFn b6#3-N7N4)>(+csEYDKMlYFl%E>Qn45WbQ_% diff --git a/CI/physmon/reference/performance_amvf_truth_smeared_hist.root b/CI/physmon/reference/performance_amvf_truth_smeared_hist.root index 713429a721a30361ebeddc7b577abf15ca492737..c6c009b8775adeb031ac35053d8d050fa87a77aa 100644 GIT binary patch delta 7132 zcmeHMc~}$I7N41fr9vS%K@l_o6!-*0P*E181Q0>?MF|uHBoTP*As|v~luBJ{G%zkm z9~5z+P!Z))t=dZ5p(@s;(rRm|sI8W&)hBNF`sUumFwlA5SHJ!%-#2jQo^yZao^#K3 zhq@l3|0B*USzewT!yc(I43l8k$$t7-M2}VUV?aN0F8xc2VTNK1b4@KWAmN|$1Ll1Eb8)*k2=!b@eKR^T#mP!T@FhWCl z^&1a|P@EHRJyoO>0uk*mKRYhm5I{QXdFBm zL3AJpSN-uWxEq|%OGJBe!{~iYX{Y%l+}I$u03N+gE-gteq%m?Osj?*%qR|Tc5LzKd zD<;Dg`n9?hCfXJGvdkQsA4>=|EWXUO6j-BjSDNFnavYBa~OytWLJx)f(5i zBVD(E%daa^n zae9AmRrHIEl81{Xo(m}4sETk7-dO9=xbpO-QzG7#ySMfRS4L33n70MqD0mp~#Ia&> z#o1e4JDR@^NWXdJ3y)Z3v{JUcnCm{f%`Yur&EoOra({R{(A;_B>g{XCce*sBbxPL! z>e{^}YTbc%UPg>3zYTjars4gV1KsIQv-}H96^GX3?Cy;^wcV=rzwi1V>>qt^*4D4` zTY8=jT)f+Ra^U3xpD&ZHdwyba~mPH*j*-z`0UwC+iVsO|n#&O!~IRZS`Cm3b1)`k}{ z$uYQj_2lrduJa+m&P@_3c+I8U8$-FEZ4`<&~ zRA#FAIcKi^fYGYo;(T+{)OC+6eUFVbIomArCX$~Bt1LJ-rm8bs4YuZ|r0^sudiv%( z*W)kO?I0}98)pU$MBTO?fs6lRYU`l%(z772)J35g7)DG%t{Esdf)Qp9)tmYN%=8uz ze7r+T(ov?{g1FRH+zAFqEDVh^!#QSd(D}7qT3)eOTp_aO6Yj&=JUl_}EJtEcrdKZ5 z{*DPjvH*gPBsD(B>5~AcI8n9XURYhiv+wl z9&V1|f6*bl2%Hd&(eO@$XA!X#{OZ?4;7Gq)|2W$&7WK2j#fwqVah6$v1z^W)A zK}r!gBZp>Kfh8YA6Qn01EI?AHK&k&)4yu;g6J$IhEJTE9kdS>4Sg-IWgt@V@BI$g2 z3AB_KWa9K7rWugwy*O%Ol{0cUv}kDsl~QHRC+rYfBw}=ejPIYMY_^P^sP*n>L~w=# z#a$X$Qx1&evaDnnE|D3T6(W+4e~!d44l?g|Kql7Xq|I=2ClG+;b5JLO`jN zMrce|_SvtQ&>7iN7yeTpP^Igw2Gf;?CsoIM_sXSso>oYri>Ia6-^ifQNlzdf1tJ@v z@b^ie!Yi!YbYiF5>Rb-y-Gl_ViY3ueA!5en0!pX?F#{#AVF-#Cp=gekAv@?YWn5{c z(8&&dHe^*i`>Ifj?gbtyJFug*lR6=)?EZNjoFbD>@;^|j{ zr94mzHZatQZ5_G_Zj@k2n>sFixvWT@0k^=GLx-`UJ!lkS#B+Qv<-C6E6lhYEX%k_u ztkF+{jyA!PUa6)HmdM$(*_ArK!EzpiLGKGWIvB1@T8Iwj5^^O*j+W3FMk@<4AxWC1 zAQbrjH)p zU4m2HTNsL$dR10wUI(+{-!B%vY-v!Z4YOF#lLSjF`7h(+9tx>S3Vnwez* zy<`R=F|5DMoO+Nq29nAUiE%fq52eBi#_@3_BBUU_ra}{J@1j~V$3Z)%AQGcb+4(M| z%7I6K`ydkI2pSGk9h)2nUH8*xl&BiHZVhDRoI(On9c`+hlr?C-sFCNO8!U#*z1xNQ zYV%mK4K3+HOHk+3+)qv1EF{mN`HN^C)%lht%JCC{kT%P!A2#Oz*URSyB@oe>Yp8~S2`{$DZv#v z_Oskv-K)CRnKlHz7pOiY6hySIPd%(JSpS~HNj>VtLeF2_0@Y)QnFlu4=qDGudizZ3 zx>@Jiw4!MSX?f?nLvPEk*j=lieA?-`M-CW?yI%aZs~}rG>5t3D^2$Z(9l=7yv~(GN zH0P&v;VoHDv-~a@Twn7YsC6=Z?)h_HyWP#TBVw1{`Vuq0|Hb6wtS84FNB)tmm?1d( z#D0%U<($ugCmm0Edt(H5nmXOfD6jE$tKkvpx`UzN9q#AmhKu(;tFGK|IkoeOeq+ed z;=;~5`->W8=O^YxPlKIgO58qmLVezJsFM=Ob_o#Yej#`zSRMbsZTzIkULZRP= z5u+a8K40!~|NU!Mx{rUDdF1-;`!C`)(4o#2(X?yOB@3tutu^huHn73rB9Uf78_vL> zB#6FUvIH)ev$_^1S;7>QepE{LkSrkyW@h=)U@Q>{9^~1;?)m?Oq!l37#^NMPSb~_6_JVN1eNt*Q2UA(c^JLaC~f|H)Gk zX-cZ#PBHk&MqBbvE}~1mpT`XP!=#4?ynOi6*E0VMIErnipM7wYNB^@UuMdt^=F)e) NL^wLxzu0{v_CMbyZL9zQ delta 3848 zcmcgveNa?Y6ucmz@KV+tBF%h5?^bec*1!#|q*NN1YKbn4#oX!q^ zJ8wMkzt_=)2pIwAdFwtnL;}a;A(v(53E<+g%^%zEnn+giJ zH_bw~0d(utg+~%1`3jRqDrPc9Bss~Kue1&^r^cmt+RG~J#W^hh+*rNzg8M?xM!2)+ z5!G`7c!;PmJVXPTDMENP!&*2TYMn=k>fAPqcQqyOe0dnNJxaq zGyQ440;uwf4|K~fS5$V{J-exk+?JX7T$<><&9q2Xcfx@A;I>H?c5{nrKBJCZKVcBm zvY{S<5j=+LPitcsx%4cRHMRoJ$wo;p#k(hwWPyw+Q3@-V#f&<5|J9)yteD!Mc771W ze8&o!lCMB}#&$o^Cb$=74P<9J4Z#ktqB$;JmfRhta6N4jZfdeE{ZPALmnxCmB8XnN znd)h$`_d&(L05W^%HO$fz3ezNC!SZuSY8dK(>tg<;Jz~71XEr)PQ}Uixnl+1uwm8^ zRTOI=)TfMAkybPZ&deUAG8Eh4msEeAYaIs5!_%B3F3QS1?C1KCKo2jYvKhf_1Y-oa zDv~Xz4}|-TFY_y%hv*7KCku2<71)~7B{=~B3jz}aP;!H9s1JgaCNJtQlqVCRaRT}% zj$P~xlxxssDca+Ned}$u>CDJ5eiDu!*F)i~k_DR`u9y8v^->%nW^^Af+{^83W^Vvo zYw%Nw#xyFL;lVDGVu%&1Du08-J*kejGYkEr1yYrMeB&rdo{DkbK>I{tUta^e-inmu z3+8?GM@d{`e_` z%;Gs}NIpLSb#Jinxmz=eLa{8Bj4aC22gkhAh>A5j4a++jk|SQW!Cv4N{eM(;@iINr zgG_C#sY|6H35kvbJ<1CUtvP(EC7kSTmm%AsA*so(UZ^}8%IR1oL|G6k>G9lD@;a}Q zJw6$X>W}KGD7$l>(a3CD6&$<60vlV|ZB%y)c5bUOM^Uu&vz~5Mx63VJx4I1*9H}pP z>PX6?v|{yYJP?gmDVoEE zeW;UZQ$H;xc48gj+f^@M7v6$|Py$QoM3 zF0D3-P#RLj;)*dbZLu1qrBnZ+?Z%lJ3gzI;*Iu@2x%f^gF0|)!>vQ^4*mGJ`ux58+ zwq{Wq)$UIr@^oZerNX=Kvdb-@!ezIBbYJ0NV1w8@j`_6;(&-6=en1F&#J;bYZ(E3f z_9OHSLfAj|SF)Dhd^_fbjbDdf>jW>vfm`g0vmx>YbomioutOYd zWl874^^$TwRo&rmIlEsQpr?z4hjbe~@cw+hn^m2Pa9*{R`z&@{5PPuA2W?nZYZ|+L zDtxjK0~C`Z*BnRUwKl7;pd{P=wm6QFm`)!C$Aw4zSj=ffWfDXK`!brvl|*A;tgx+! z)t?Sy)^jC#s=+f{ZkeQfzznhreyv-mtidh#wlz^%gIQ=fvW;p{3+LNU4}MX(5(_Cu zJE<14P}kALzbdq;eF+{^KjB|a+WZE?Bl|?95LseR98f>eqQ4E6=L%=&R zD#KAf$gCQ!7@S;&L;br$6{C|-BlNGAsGk3i%Fmi4^5Yn6>Fs-YOHYoOl1Io?vpA2} cE)g<2RE#X4{OJ=Tn?HZb#pqaAWqbqq8`A>_BLDyZ diff --git a/CI/physmon/reference/performance_amvf_ttbar_hist.root b/CI/physmon/reference/performance_amvf_ttbar_hist.root index 8f88b47852e732bad9f718211cc16c4358e2b6ec..175d58e6c3e67a251a785648cdee4b7522315281 100644 GIT binary patch delta 7453 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 QNRnkOx1G*gGi9gr59bsCt^fc4 diff --git a/CI/physmon/reference/performance_ivf_seeded_hist.root b/CI/physmon/reference/performance_ivf_seeded_hist.root index 7c5983ddec3985adf102390755203367e7533473..fe0fe6f0572913810a13a463fa34d2a6ae55ab4d 100644 GIT binary patch delta 7516 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 diff --git a/CI/physmon/reference/performance_ivf_truth_estimated_hist.root b/CI/physmon/reference/performance_ivf_truth_estimated_hist.root index 3308d48d49688dd36622daf1597c34b1c57c5ada..502de77fda5b0bb888a8969e0f7f711a78672975 100644 GIT binary patch delta 7501 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 diff --git a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp index 6cf681e879c..912e6dc28ea 100644 --- a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp +++ b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.cpp @@ -41,18 +41,64 @@ #include #include -namespace ActsExamples { -struct AlgorithmContext; -} // namespace ActsExamples - using Acts::VectorHelpers::eta; using Acts::VectorHelpers::perp; using Acts::VectorHelpers::phi; using Acts::VectorHelpers::theta; -ActsExamples::VertexPerformanceWriter::VertexPerformanceWriter( - const ActsExamples::VertexPerformanceWriter::Config& config, - Acts::Logging::Level level) +namespace ActsExamples { + +namespace { + +int getNumberOfReconstructableVertices(const SimParticleContainer& collection) { + // map for finding frequency + std::map fmap; + + std::vector reconstructableTruthVertices; + + // traverse the array for frequency + for (const auto& p : collection) { + int generation = p.particleId().generation(); + if (generation > 0) { + // truthparticle from secondary vtx + continue; + } + int priVtxId = p.particleId().vertexPrimary(); + fmap[priVtxId]++; + } + + // iterate over the map + for (auto it : fmap) { + // Require at least 2 tracks + if (it.second > 1) { + reconstructableTruthVertices.push_back(it.first); + } + } + + return reconstructableTruthVertices.size(); +} + +int getNumberOfTruePriVertices(const SimParticleContainer& collection) { + // Vector to store indices of all primary vertices + std::set allPriVtxIds; + for (const auto& p : collection) { + int priVtxId = p.particleId().vertexPrimary(); + int generation = p.particleId().generation(); + if (generation > 0) { + // truthparticle from secondary vtx + continue; + } + // Insert to set, removing duplicates + allPriVtxIds.insert(priVtxId); + } + // Size of set corresponds to total number of primary vertices + return allPriVtxIds.size(); +} + +} // namespace + +VertexPerformanceWriter::VertexPerformanceWriter( + const VertexPerformanceWriter::Config& config, Acts::Logging::Level level) : WriterT(config.inputVertices, "VertexPerformanceWriter", level), m_cfg(config) { if (m_cfg.filePath.empty()) { @@ -93,101 +139,107 @@ ActsExamples::VertexPerformanceWriter::VertexPerformanceWriter( m_outputTree = new TTree(m_cfg.treeName.c_str(), m_cfg.treeName.c_str()); if (m_outputTree == nullptr) { throw std::bad_alloc(); - } else { - // I/O parameters. - m_outputTree->Branch("event_nr", &m_eventNr); - - // Branches related to the 4D vertex position - m_outputTree->Branch("truthX", &m_truthX); - m_outputTree->Branch("truthY", &m_truthY); - m_outputTree->Branch("truthZ", &m_truthZ); - m_outputTree->Branch("truthT", &m_truthT); - - m_outputTree->Branch("recoX", &m_recoX); - m_outputTree->Branch("recoY", &m_recoY); - m_outputTree->Branch("recoZ", &m_recoZ); - m_outputTree->Branch("recoT", &m_recoT); - - m_outputTree->Branch("seedX", &m_seedX); - m_outputTree->Branch("seedY", &m_seedY); - m_outputTree->Branch("seedZ", &m_seedZ); - m_outputTree->Branch("seedT", &m_seedT); - - m_outputTree->Branch("resX", &m_resX); - m_outputTree->Branch("resY", &m_resY); - m_outputTree->Branch("resZ", &m_resZ); - m_outputTree->Branch("resT", &m_resT); - - m_outputTree->Branch("resSeedZ", &m_resSeedZ); - m_outputTree->Branch("resSeedT", &m_resSeedT); - - m_outputTree->Branch("pullX", &m_pullX); - m_outputTree->Branch("pullY", &m_pullY); - m_outputTree->Branch("pullZ", &m_pullZ); - m_outputTree->Branch("pullT", &m_pullT); - - m_outputTree->Branch("covXX", &m_covXX); - m_outputTree->Branch("covYY", &m_covYY); - m_outputTree->Branch("covZZ", &m_covZZ); - m_outputTree->Branch("covTT", &m_covTT); - m_outputTree->Branch("covXY", &m_covXY); - m_outputTree->Branch("covXZ", &m_covXZ); - m_outputTree->Branch("covXT", &m_covXT); - m_outputTree->Branch("covYZ", &m_covYZ); - m_outputTree->Branch("covYT", &m_covYT); - m_outputTree->Branch("covZT", &m_covZT); - - m_outputTree->Branch("sumPt2", &m_sumPt2); - - // Branches related to track momenta at vertex - m_outputTree->Branch("trk_truthPhi", &m_truthPhi); - m_outputTree->Branch("trk_truthTheta", &m_truthTheta); - m_outputTree->Branch("trk_truthQOverP", &m_truthQOverP); - - m_outputTree->Branch("trk_recoPhi", &m_recoPhi); - m_outputTree->Branch("trk_recoPhiFitted", &m_recoPhiFitted); - m_outputTree->Branch("trk_recoTheta", &m_recoTheta); - m_outputTree->Branch("trk_recoThetaFitted", &m_recoThetaFitted); - m_outputTree->Branch("trk_recoQOverP", &m_recoQOverP); - m_outputTree->Branch("trk_recoQOverPFitted", &m_recoQOverPFitted); - - m_outputTree->Branch("trk_resPhi", &m_resPhi); - m_outputTree->Branch("trk_resPhiFitted", &m_resPhiFitted); - m_outputTree->Branch("trk_resTheta", &m_resTheta); - m_outputTree->Branch("trk_resThetaFitted", &m_resThetaFitted); - m_outputTree->Branch("trk_resQOverP", &m_resQOverP); - m_outputTree->Branch("trk_resQOverPFitted", &m_resQOverPFitted); - m_outputTree->Branch("trk_momOverlap", &m_momOverlap); - m_outputTree->Branch("trk_momOverlapFitted", &m_momOverlapFitted); - - m_outputTree->Branch("trk_pullPhi", &m_pullPhi); - m_outputTree->Branch("trk_pullPhiFitted", &m_pullPhiFitted); - m_outputTree->Branch("trk_pullTheta", &m_pullTheta); - m_outputTree->Branch("trk_pullThetaFitted", &m_pullThetaFitted); - m_outputTree->Branch("trk_pullQOverP", &m_pullQOverP); - m_outputTree->Branch("trk_pullQOverPFitted", &m_pullQOverPFitted); - - m_outputTree->Branch("trk_weight", &m_trkWeight); - - m_outputTree->Branch("nTracksTruthVtx", &m_nTracksOnTruthVertex); - m_outputTree->Branch("nTracksRecoVtx", &m_nTracksOnRecoVertex); - - m_outputTree->Branch("trkVtxMatch", &m_trackVtxMatchFraction); - - m_outputTree->Branch("nRecoVtx", &m_nRecoVtx); - m_outputTree->Branch("nTrueVtx", &m_nTrueVtx); - m_outputTree->Branch("nVtxDetectorAcceptance", &m_nVtxDetAcceptance); - m_outputTree->Branch("nVtxReconstructable", &m_nVtxReconstructable); } + + m_outputTree->Branch("event_nr", &m_eventNr); + + m_outputTree->Branch("vertex_primary", &m_vertexPrimary); + m_outputTree->Branch("vertex_secondary", &m_vertexSecondary); + + m_outputTree->Branch("recoX", &m_recoX); + m_outputTree->Branch("recoY", &m_recoY); + m_outputTree->Branch("recoZ", &m_recoZ); + m_outputTree->Branch("recoT", &m_recoT); + + m_outputTree->Branch("covXX", &m_covXX); + m_outputTree->Branch("covYY", &m_covYY); + m_outputTree->Branch("covZZ", &m_covZZ); + m_outputTree->Branch("covTT", &m_covTT); + m_outputTree->Branch("covXY", &m_covXY); + m_outputTree->Branch("covXZ", &m_covXZ); + m_outputTree->Branch("covXT", &m_covXT); + m_outputTree->Branch("covYZ", &m_covYZ); + m_outputTree->Branch("covYT", &m_covYT); + m_outputTree->Branch("covZT", &m_covZT); + + m_outputTree->Branch("seedX", &m_seedX); + m_outputTree->Branch("seedY", &m_seedY); + m_outputTree->Branch("seedZ", &m_seedZ); + m_outputTree->Branch("seedT", &m_seedT); + + m_outputTree->Branch("truthX", &m_truthX); + m_outputTree->Branch("truthY", &m_truthY); + m_outputTree->Branch("truthZ", &m_truthZ); + m_outputTree->Branch("truthT", &m_truthT); + + m_outputTree->Branch("resX", &m_resX); + m_outputTree->Branch("resY", &m_resY); + m_outputTree->Branch("resZ", &m_resZ); + m_outputTree->Branch("resT", &m_resT); + + m_outputTree->Branch("resSeedZ", &m_resSeedZ); + m_outputTree->Branch("resSeedT", &m_resSeedT); + + m_outputTree->Branch("pullX", &m_pullX); + m_outputTree->Branch("pullY", &m_pullY); + m_outputTree->Branch("pullZ", &m_pullZ); + m_outputTree->Branch("pullT", &m_pullT); + + m_outputTree->Branch("sumPt2", &m_sumPt2); + + m_outputTree->Branch("nTracksTruthVtx", &m_nTracksOnTruthVertex); + m_outputTree->Branch("nTracksRecoVtx", &m_nTracksOnRecoVertex); + + m_outputTree->Branch("trkVtxMatch", &m_trackVtxMatchFraction); + + m_outputTree->Branch("nRecoVtx", &m_nRecoVtx); + m_outputTree->Branch("nTrueVtx", &m_nTrueVtx); + m_outputTree->Branch("nVtxDetectorAcceptance", &m_nVtxDetAcceptance); + m_outputTree->Branch("nVtxReconstructable", &m_nVtxReconstructable); + + // Branches related to track momenta at vertex + m_outputTree->Branch("trk_weight", &m_trkWeight); + + m_outputTree->Branch("trk_recoPhi", &m_recoPhi); + m_outputTree->Branch("trk_recoTheta", &m_recoTheta); + m_outputTree->Branch("trk_recoQOverP", &m_recoQOverP); + + m_outputTree->Branch("trk_recoPhiFitted", &m_recoPhiFitted); + m_outputTree->Branch("trk_recoThetaFitted", &m_recoThetaFitted); + m_outputTree->Branch("trk_recoQOverPFitted", &m_recoQOverPFitted); + + m_outputTree->Branch("trk_particleId", &m_trkParticleId); + + m_outputTree->Branch("trk_truthPhi", &m_truthPhi); + m_outputTree->Branch("trk_truthTheta", &m_truthTheta); + m_outputTree->Branch("trk_truthQOverP", &m_truthQOverP); + + m_outputTree->Branch("trk_resPhi", &m_resPhi); + m_outputTree->Branch("trk_resTheta", &m_resTheta); + m_outputTree->Branch("trk_resQOverP", &m_resQOverP); + m_outputTree->Branch("trk_momOverlap", &m_momOverlap); + + m_outputTree->Branch("trk_resPhiFitted", &m_resPhiFitted); + m_outputTree->Branch("trk_resThetaFitted", &m_resThetaFitted); + m_outputTree->Branch("trk_resQOverPFitted", &m_resQOverPFitted); + m_outputTree->Branch("trk_momOverlapFitted", &m_momOverlapFitted); + + m_outputTree->Branch("trk_pullPhi", &m_pullPhi); + m_outputTree->Branch("trk_pullTheta", &m_pullTheta); + m_outputTree->Branch("trk_pullQOverP", &m_pullQOverP); + + m_outputTree->Branch("trk_pullPhiFitted", &m_pullPhiFitted); + m_outputTree->Branch("trk_pullThetaFitted", &m_pullThetaFitted); + m_outputTree->Branch("trk_pullQOverPFitted", &m_pullQOverPFitted); } -ActsExamples::VertexPerformanceWriter::~VertexPerformanceWriter() { +VertexPerformanceWriter::~VertexPerformanceWriter() { if (m_outputFile != nullptr) { m_outputFile->Close(); } } -ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::finalize() { +ProcessCode VertexPerformanceWriter::finalize() { m_outputFile->cd(); m_outputTree->Write(); m_outputFile->Close(); @@ -195,54 +247,7 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::finalize() { return ProcessCode::SUCCESS; } -int ActsExamples::VertexPerformanceWriter::getNumberOfReconstructableVertices( - const SimParticleContainer& collection) const { - // map for finding frequency - std::map fmap; - - std::vector reconstructableTruthVertices; - - // traverse the array for frequency - for (const auto& p : collection) { - int generation = p.particleId().generation(); - if (generation > 0) { - // truthparticle from secondary vtx - continue; - } - int priVtxId = p.particleId().vertexPrimary(); - fmap[priVtxId]++; - } - - // iterate over the map - for (auto it : fmap) { - // Require at least 2 tracks - if (it.second > 1) { - reconstructableTruthVertices.push_back(it.first); - } - } - - return reconstructableTruthVertices.size(); -} - -int ActsExamples::VertexPerformanceWriter::getNumberOfTruePriVertices( - const SimParticleContainer& collection) const { - // Vector to store indices of all primary vertices - std::set allPriVtxIds; - for (const auto& p : collection) { - int priVtxId = p.particleId().vertexPrimary(); - int generation = p.particleId().generation(); - if (generation > 0) { - // truthparticle from secondary vtx - continue; - } - // Insert to set, removing duplicates - allPriVtxIds.insert(priVtxId); - } - // Size of set corresponds to total number of primary vertices - return allPriVtxIds.size(); -} - -ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( +ProcessCode VertexPerformanceWriter::writeT( const AlgorithmContext& ctx, const std::vector& vertices) { // Exclusive access to the tree while writing std::lock_guard lock(m_writeMutex); @@ -453,10 +458,10 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( } int maxOccurrence = -1; SimBarcode maxOccurrenceId = -1; - for (auto it : fmap) { - if (it.second > maxOccurrence) { - maxOccurrenceId = it.first; - maxOccurrence = it.second; + for (const auto& [vtxId, occurrence] : fmap) { + if (occurrence > maxOccurrence) { + maxOccurrenceId = vtxId; + maxOccurrence = occurrence; } } @@ -486,9 +491,10 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( int count = 0; // Get references to inner vectors where all track variables corresponding // to the current vertex will be saved - auto& innerTruthPhi = m_truthPhi.emplace_back(); - auto& innerTruthTheta = m_truthTheta.emplace_back(); - auto& innerTruthQOverP = m_truthQOverP.emplace_back(); + + auto& innerTrkParticleId = m_trkParticleId.emplace_back(); + + auto& innerTrkWeight = m_trkWeight.emplace_back(); auto& innerRecoPhi = m_recoPhi.emplace_back(); auto& innerRecoTheta = m_recoTheta.emplace_back(); @@ -498,6 +504,10 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( auto& innerRecoThetaFitted = m_recoThetaFitted.emplace_back(); auto& innerRecoQOverPFitted = m_recoQOverPFitted.emplace_back(); + auto& innerTruthPhi = m_truthPhi.emplace_back(); + auto& innerTruthTheta = m_truthTheta.emplace_back(); + auto& innerTruthQOverP = m_truthQOverP.emplace_back(); + auto& innerResPhi = m_resPhi.emplace_back(); auto& innerResTheta = m_resTheta.emplace_back(); auto& innerResQOverP = m_resQOverP.emplace_back(); @@ -517,8 +527,6 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( auto& innerPullThetaFitted = m_pullThetaFitted.emplace_back(); auto& innerPullQOverPFitted = m_pullQOverPFitted.emplace_back(); - auto& innerTrkWeight = m_trkWeight.emplace_back(); - for (std::size_t j = 0; j < associatedTruthParticles.size(); ++j) { const auto& particle = associatedTruthParticles[j]; SimBarcode vtxId = @@ -552,16 +560,39 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( // Save reconstructed/true vertex position only in the first iteration // to avoid duplicates if (count == 0) { - m_truthX.push_back(truePos[Acts::FreeIndices::eFreePos0]); - m_truthY.push_back(truePos[Acts::FreeIndices::eFreePos1]); - m_truthZ.push_back(truePos[Acts::FreeIndices::eFreePos2]); - m_truthT.push_back(truePos[Acts::FreeIndices::eFreeTime]); + m_vertexPrimary.push_back(vtxId.vertexPrimary()); + m_vertexSecondary.push_back(vtxId.vertexSecondary()); m_recoX.push_back(vtx.fullPosition()[Acts::FreeIndices::eFreePos0]); m_recoY.push_back(vtx.fullPosition()[Acts::FreeIndices::eFreePos1]); m_recoZ.push_back(vtx.fullPosition()[Acts::FreeIndices::eFreePos2]); m_recoT.push_back(vtx.fullPosition()[Acts::FreeIndices::eFreeTime]); + Acts::ActsScalar varX = vtx.fullCovariance()( + Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreePos0); + Acts::ActsScalar varY = vtx.fullCovariance()( + Acts::FreeIndices::eFreePos1, Acts::FreeIndices::eFreePos1); + Acts::ActsScalar varZ = vtx.fullCovariance()( + Acts::FreeIndices::eFreePos2, Acts::FreeIndices::eFreePos2); + Acts::ActsScalar varTime = vtx.fullCovariance()( + Acts::FreeIndices::eFreeTime, Acts::FreeIndices::eFreeTime); + m_covXX.push_back(varX); + m_covYY.push_back(varY); + m_covZZ.push_back(varZ); + m_covTT.push_back(varTime); + m_covXY.push_back(vtx.fullCovariance()( + Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreePos1)); + m_covXZ.push_back(vtx.fullCovariance()( + Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreePos2)); + m_covXT.push_back(vtx.fullCovariance()( + Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreeTime)); + m_covYZ.push_back(vtx.fullCovariance()( + Acts::FreeIndices::eFreePos1, Acts::FreeIndices::eFreePos2)); + m_covYT.push_back(vtx.fullCovariance()( + Acts::FreeIndices::eFreePos1, Acts::FreeIndices::eFreeTime)); + m_covZT.push_back(vtx.fullCovariance()( + Acts::FreeIndices::eFreePos2, Acts::FreeIndices::eFreeTime)); + m_seedX.push_back( vtx.fullSeedPosition()[Acts::FreeIndices::eFreePos0]); m_seedY.push_back( @@ -571,6 +602,11 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( m_seedT.push_back( vtx.fullSeedPosition()[Acts::FreeIndices::eFreeTime]); + m_truthX.push_back(truePos[Acts::FreeIndices::eFreePos0]); + m_truthY.push_back(truePos[Acts::FreeIndices::eFreePos1]); + m_truthZ.push_back(truePos[Acts::FreeIndices::eFreePos2]); + m_truthT.push_back(truePos[Acts::FreeIndices::eFreeTime]); + const Acts::ActsVector<4> diffPos = vtx.fullPosition() - truePos; m_resX.push_back(diffPos[Acts::FreeIndices::eFreePos0]); m_resY.push_back(diffPos[Acts::FreeIndices::eFreePos1]); @@ -582,14 +618,6 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( m_resSeedZ.push_back(diffSeedPos[Acts::FreeIndices::eFreePos2]); m_resSeedT.push_back(diffSeedPos[Acts::FreeIndices::eFreeTime]); - Acts::ActsScalar varX = vtx.fullCovariance()( - Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreePos0); - Acts::ActsScalar varY = vtx.fullCovariance()( - Acts::FreeIndices::eFreePos1, Acts::FreeIndices::eFreePos1); - Acts::ActsScalar varZ = vtx.fullCovariance()( - Acts::FreeIndices::eFreePos2, Acts::FreeIndices::eFreePos2); - Acts::ActsScalar varTime = vtx.fullCovariance()( - Acts::FreeIndices::eFreeTime, Acts::FreeIndices::eFreeTime); m_pullX.push_back( pull(diffPos[Acts::FreeIndices::eFreePos0], varX, "X")); m_pullY.push_back( @@ -599,23 +627,6 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( m_pullT.push_back( pull(diffPos[Acts::FreeIndices::eFreeTime], varTime, "T")); - m_covXX.push_back(varX); - m_covYY.push_back(varY); - m_covZZ.push_back(varZ); - m_covTT.push_back(varTime); - m_covXY.push_back(vtx.fullCovariance()( - Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreePos1)); - m_covXZ.push_back(vtx.fullCovariance()( - Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreePos2)); - m_covXT.push_back(vtx.fullCovariance()( - Acts::FreeIndices::eFreePos0, Acts::FreeIndices::eFreeTime)); - m_covYZ.push_back(vtx.fullCovariance()( - Acts::FreeIndices::eFreePos1, Acts::FreeIndices::eFreePos2)); - m_covYT.push_back(vtx.fullCovariance()( - Acts::FreeIndices::eFreePos1, Acts::FreeIndices::eFreeTime)); - m_covZT.push_back(vtx.fullCovariance()( - Acts::FreeIndices::eFreePos2, Acts::FreeIndices::eFreeTime)); - double sumPt2 = 0; for (const auto& trk : tracksAtVtx) { if (trk.trackWeight > m_cfg.minTrkWeight) { @@ -671,6 +682,9 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( *trk.originalParams.as(); if (boundParams.parameters() == params) { innerTrkWeight.push_back(trk.trackWeight); + + innerTrkParticleId.push_back(particle.particleId().value()); + const auto& trueUnitDir = particle.direction(); Acts::ActsVector<3> trueMom; trueMom.head(2) = Acts::makePhiThetaFromDirection(trueUnitDir); @@ -756,18 +770,30 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( // fill the variables m_outputTree->Fill(); - m_truthX.clear(); - m_truthY.clear(); - m_truthZ.clear(); - m_truthT.clear(); + m_vertexPrimary.clear(); + m_vertexSecondary.clear(); m_recoX.clear(); m_recoY.clear(); m_recoZ.clear(); m_recoT.clear(); + m_covXX.clear(); + m_covYY.clear(); + m_covZZ.clear(); + m_covTT.clear(); + m_covXY.clear(); + m_covXZ.clear(); + m_covXT.clear(); + m_covYZ.clear(); + m_covYT.clear(); + m_covZT.clear(); m_seedX.clear(); m_seedY.clear(); m_seedZ.clear(); m_seedT.clear(); + m_truthX.clear(); + m_truthY.clear(); + m_truthZ.clear(); + m_truthT.clear(); m_resX.clear(); m_resY.clear(); m_resZ.clear(); @@ -778,47 +804,37 @@ ActsExamples::ProcessCode ActsExamples::VertexPerformanceWriter::writeT( m_pullY.clear(); m_pullZ.clear(); m_pullT.clear(); - m_covXX.clear(); - m_covYY.clear(); - m_covZZ.clear(); - m_covTT.clear(); - m_covXY.clear(); - m_covXZ.clear(); - m_covXT.clear(); - m_covYZ.clear(); - m_covYT.clear(); - m_covZT.clear(); m_sumPt2.clear(); - m_truthPhi.clear(); - m_truthTheta.clear(); - m_truthQOverP.clear(); + m_nTracksOnTruthVertex.clear(); + m_nTracksOnRecoVertex.clear(); + m_trackVtxMatchFraction.clear(); + m_trkParticleId.clear(); + m_trkWeight.clear(); m_recoPhi.clear(); - m_recoPhiFitted.clear(); m_recoTheta.clear(); - m_recoThetaFitted.clear(); m_recoQOverP.clear(); + m_recoPhiFitted.clear(); + m_recoThetaFitted.clear(); m_recoQOverPFitted.clear(); + m_truthPhi.clear(); + m_truthTheta.clear(); + m_truthQOverP.clear(); m_resPhi.clear(); - m_resPhiFitted.clear(); m_resTheta.clear(); - m_resThetaFitted.clear(); m_resQOverP.clear(); - m_resQOverPFitted.clear(); m_momOverlap.clear(); + m_resPhiFitted.clear(); + m_resThetaFitted.clear(); + m_resQOverPFitted.clear(); m_momOverlapFitted.clear(); m_pullPhi.clear(); - m_pullPhiFitted.clear(); m_pullTheta.clear(); - m_pullThetaFitted.clear(); m_pullQOverP.clear(); + m_pullPhiFitted.clear(); + m_pullThetaFitted.clear(); m_pullQOverPFitted.clear(); - m_trkWeight.clear(); - - m_nTracksOnTruthVertex.clear(); - m_nTracksOnRecoVertex.clear(); - - m_trackVtxMatchFraction.clear(); - return ProcessCode::SUCCESS; } + +} // namespace ActsExamples diff --git a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.hpp b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.hpp index 33c1efe889f..99f45c6f2d2 100644 --- a/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.hpp +++ b/Examples/Io/Performance/ActsExamples/Io/Performance/VertexPerformanceWriter.hpp @@ -19,6 +19,7 @@ #include "ActsExamples/Framework/ProcessCode.hpp" #include "ActsExamples/Framework/WriterT.hpp" +#include #include #include #include @@ -107,11 +108,9 @@ class VertexPerformanceWriter final /// The event number std::uint32_t m_eventNr{0}; - // True 4D vertex position - std::vector m_truthX; - std::vector m_truthY; - std::vector m_truthZ; - std::vector m_truthT; + // Truth vertex ID + std::vector m_vertexPrimary; + std::vector m_vertexSecondary; // Reconstructed 4D vertex position std::vector m_recoX; @@ -119,6 +118,18 @@ class VertexPerformanceWriter final std::vector m_recoZ; std::vector m_recoT; + // Vertex covariance + std::vector m_covXX; + std::vector m_covYY; + std::vector m_covZZ; + std::vector m_covTT; + std::vector m_covXY; + std::vector m_covXZ; + std::vector m_covXT; + std::vector m_covYZ; + std::vector m_covYT; + std::vector m_covZT; + // 4D position of the vertex seed. x and y coordinate are 0 in current // implementations, we save them here as a check. std::vector m_seedX; @@ -126,6 +137,12 @@ class VertexPerformanceWriter final std::vector m_seedZ; std::vector m_seedT; + // True 4D vertex position + std::vector m_truthX; + std::vector m_truthY; + std::vector m_truthZ; + std::vector m_truthT; + // Difference of reconstructed and true vertex 4D position std::vector m_resX; std::vector m_resY; @@ -142,21 +159,25 @@ class VertexPerformanceWriter final std::vector m_pullZ; std::vector m_pullT; - // Vertex covariance - std::vector m_covXX; - std::vector m_covYY; - std::vector m_covZZ; - std::vector m_covTT; - std::vector m_covXY; - std::vector m_covXZ; - std::vector m_covXT; - std::vector m_covYZ; - std::vector m_covYT; - std::vector m_covZT; - // Sum pT^2 of all tracks associated with the vertex std::vector m_sumPt2; + // Number of tracks associated with truth/reconstructed vertex + std::vector m_nTracksOnTruthVertex; + std::vector m_nTracksOnRecoVertex; + + std::vector m_trackVtxMatchFraction; + + /// Number of reconstructed vertices + int m_nRecoVtx = -1; + /// Number of true vertices + int m_nTrueVtx = -1; + /// Number of vertices in detector acceptance + int m_nVtxDetAcceptance = -1; + /// Max. number of reconstructable vertices (detector acceptance + tracking + /// efficiency) + int m_nVtxReconstructable = -1; + //-------------------------------------------------------------- // Track-related variables are contained in a vector of vectors: The inner // vectors contain the values of all tracks corresponding to one vertex. The @@ -167,74 +188,54 @@ class VertexPerformanceWriter final // (truthPhi of 1st trk belonging to vtx 2, // truthPhi of 2nd trk belonging to vtx 2, ...), // ...) - // - // True track momenta at the vertex - std::vector> m_truthPhi; - std::vector> m_truthTheta; - std::vector> m_truthQOverP; + + // Track weights from vertex fit, will be set to 1 if we do unweighted vertex + // fitting + std::vector> m_trkWeight; // Reconstructed track momenta at the vertex before and after the vertex fit std::vector> m_recoPhi; - std::vector> m_recoPhiFitted; std::vector> m_recoTheta; - std::vector> m_recoThetaFitted; std::vector> m_recoQOverP; + + std::vector> m_recoPhiFitted; + std::vector> m_recoThetaFitted; std::vector> m_recoQOverPFitted; + std::vector> m_trkParticleId; + + // True track momenta at the vertex + std::vector> m_truthPhi; + std::vector> m_truthTheta; + std::vector> m_truthQOverP; + // Difference between reconstructed momenta and true momenta std::vector> m_resPhi; - std::vector> m_resPhiFitted; std::vector> m_resTheta; - std::vector> m_resThetaFitted; std::vector> m_resQOverP; - std::vector> m_resQOverPFitted; std::vector> m_momOverlap; + + std::vector> m_resPhiFitted; + std::vector> m_resThetaFitted; + std::vector> m_resQOverPFitted; std::vector> m_momOverlapFitted; // Pulls std::vector> m_pullPhi; - std::vector> m_pullPhiFitted; std::vector> m_pullTheta; - std::vector> m_pullThetaFitted; std::vector> m_pullQOverP; - std::vector> m_pullQOverPFitted; - - // Track weights from vertex fit, will be set to 1 if we do unweighted vertex - // fitting - std::vector> m_trkWeight; - - // Number of tracks associated with truth/reconstructed vertex - std::vector m_nTracksOnTruthVertex; - std::vector m_nTracksOnRecoVertex; - std::vector m_trackVtxMatchFraction; - - /// Number of reconstructed vertices - int m_nRecoVtx = -1; - /// Number of true vertices - int m_nTrueVtx = -1; - /// Number of vertices in detector acceptance - int m_nVtxDetAcceptance = -1; - /// Max. number of reconstructable vertices (detector acceptance + tracking - /// efficiency) - int m_nVtxReconstructable = -1; - - int getNumberOfReconstructableVertices( - const SimParticleContainer& collection) const; - - int getNumberOfTruePriVertices(const SimParticleContainer& collection) const; + std::vector> m_pullPhiFitted; + std::vector> m_pullThetaFitted; + std::vector> m_pullQOverPFitted; ReadDataHandle m_inputAllTruthParticles{ this, "InputAllTruthParticles"}; - ReadDataHandle m_inputSelectedTruthParticles{ this, "InputSelectedTruthParticles"}; - ReadDataHandle m_inputTracks{this, "InputTracks"}; - ReadDataHandle m_inputAssociatedTruthParticles{ this, "InputAssociatedTruthParticles"}; - ReadDataHandle m_inputMeasurementParticlesMap{ this, "InputMeasurementParticlesMap"}; };