From 351f3065158c4885ac2f55c80c8a1aff3377d0d0 Mon Sep 17 00:00:00 2001
From: Joosep Pata <joosep.pata@gmail.com>
Date: Fri, 22 Apr 2016 15:34:12 +0200
Subject: [PATCH] npoints integration test

---
 bin/mem_test.cc           |   3 +-
 bin/mem_test_dl.cc        |   3 +-
 data/transfer.root        | Bin 20939 -> 20915 bytes
 interface/MEMClassifier.h |   4 ++-
 setup/install_mem.sh      |   2 +-
 src/MEMClassifier.cc      |  64 ++++++++++++++++++++------------------
 test/mem.py               |  43 ++++++++++++++-----------
 7 files changed, 67 insertions(+), 52 deletions(-)

diff --git a/bin/mem_test.cc b/bin/mem_test.cc
index 9f50a06..0426a22 100644
--- a/bin/mem_test.cc
+++ b/bin/mem_test.cc
@@ -60,7 +60,8 @@ int main(){
       },
       {},
       {},
-      lv_met
+      lv_met,
+      -1
     );
     std::cout << "mem=" << res.p << std::endl;
   }
diff --git a/bin/mem_test_dl.cc b/bin/mem_test_dl.cc
index 867663c..29d00fd 100644
--- a/bin/mem_test_dl.cc
+++ b/bin/mem_test_dl.cc
@@ -87,7 +87,8 @@ int main(){
       },
       {},
       {},
-      lv_met
+      lv_met,
+      -1
     );
     std::cout << "mem=" << res.p << std::endl;
   }
diff --git a/data/transfer.root b/data/transfer.root
index 6fbb788aa38af23c786cd9b4cf7f2d474ed6f1fc..a6d46c218cecd707359f81b31235a6b90d791bcc 100644
GIT binary patch
delta 10742
zcmZ{q1yodf`?hE3Zs`sYP(qOIPHB*qRvHEn5g4RH1RN0%0Rcgg78yE(Aym4%ySwAt
zgP!C0pZ9#MwSfgQ8x}n4n(Mjm-_I;?X%<+@!`0Oj1X{ZX0)cEmAnj7%@&!H@0WL6b
zNuvGwL`4?_!eR%3*G(zjgO!OF6DdNTF*Vd}#mn5p2Z4M+$cL%vQ@^o~_qeN!{D{0j
zAYwJ-J%9_iH}Xvw>wj<Y>pOqFM>Ry=3w;gwe3+&16)cII3<^=%<o?D$tMb^A*#1eS
zjnL$R$NP0b46)Es53{UrY%Jy$Q+F#!=vCnRxW--qxPfuoV`J#F6eB04nkFtf{_K&R
zy`Wnrk^0>2shZ@ij%QoXiiVREC3_#JhrW*D>mejLE@sts&n*4YZ*IJ4>SR$zU8C06
zulr5C$z;=9cL4e@XOm-~fHR>zJHSKW;1#2n*%O1@vVk?ag#L#9Y3zq<)Fa7Td(=J~
zY3UIE8_Xt67k6AydvJX!&uZ#=y5&9l9${7T!s%`>QL7eH(Q#KT4zdT9j-VCW(>Al-
z%w^?6#V(LG^JEiETsD=>*bd?OOhU&W()vz*3h#KjgVGMVbWZ@cu3?U(v~!d*=`+I3
zQm!y4CAUu+fwJA@#oF?%4UOD~-nY-nBl5lMVw1WrcQ3=66&4p_QsZ@E@GNUfXf>*G
zAes+~PksdjWqS!BrRDZS9l!XQBGsV%#asj=@JnQJ<I{SPthy#q&jRy8TfC=H?}iqK
z)$X*JSh=}C3&F3c41|tceBg6<Yo)#w>;Xp~>-Nv5DS8H@%zI4G9x4R4d&v13Wm;73
z<&*{3Nl?=U97t4n&3#`?NL&eL`Iyy(SwA6l;6~&;e*Wd)SSC-(f7(mQNh(&dEN9c1
z-j~6Ud)!$v#f1UtX_XR?+0bXrV{G9_!`CCpnan(@6_|`*kTq<HwX(nH&_+B9f3B2O
ze1rMjkGG`SvAecsAa@S-aDu0Oa_4DgS63+g_5Sx`n?@~$>U$YLAk--2Kw<D92MSDv
z9BQ<CFg{!gSd7RLObs0$s^&<lO(rP>gR3AYWGJ{<D?afjE8Y~mr%~J<_|-<2<z_Wy
zFT%!&$+?)0iCLEX5-gLAo9I0^n1DmFF^G8yrjV_6v-ZqjRJiEu7>@v>KNd>c?vPj#
zJ4zd38_MWGixDC7Q)LR54@3(fin-<44dE&aTQi_GFN1%zayI%1?cIq!@#9NLE%J>X
zSyy%RsvONXEv&AZyuX}nGjcnXyH(9#g!krtSzcb6`P(1~^vOnF#mu78)Hl3%P5m%z
zG@(mse-dpS;hmx$jrv!Q-=!XMeV6V!7BzgeFZBt%V-M{Ry!0H@!2B@?d*VZJn2v&p
zTs8IRfL2@tt}d&90Q3iu`=Y?tpMivvl1)y=vR|fy#j{Ooy$S}M5SP3rQ)6inC!?di
z2@4KRH{a0mI^*WpGCJrOBu<~+jORdKuad-vSbu7{TYOh82K{N+?w*Nb<M_`-b-p2{
zA2XthZY<IuM(|5e9rG{?-r_Lki@U=HXMSn^)_4oL0d=RQ;V4iimh|@TB^Nc+ooFIq
zqxFeTiG>hxmGP*)N#Ec<Fij4~pVMngE-alsrLTN>DC6EZ>76|+amf4t%CxGuRl}7}
zF|;umDKwRDGE_YmKIv<<lzma+wtu;}bJQi6QuNb=oo6_m0O}tH?JpH_@tX|TEuNOA
z*t9c$F=R*Iwb>1Q!hCizVi?Mkiy!_-DpcPypV4k7tu4gI;6oeq25oDAbkrWcYl*&;
zp|jvcl@Cn~rl^3&){qRZQW&ab);M*eU_cED0XL1K-WTHU*wu2V+84o}2-}!!c~h7I
zh8C|VlB&vizQYGjNkzlZWq^4!`U5yHJ_rm9CuTh?O7sY}2F8chJCeze1(ZS($EtCS
zlRkmfqDRaGpQOxts91XIV-1p%7dl#PqmW}*7gp?!#xaH*XBDe{gyZBC3ln|abJZeJ
zh|_htjhH^NdjbHDQRSb&i-=;#CDUeN5@SA<L1B2q`XzkqC$1W9!C_f84cE77VP#W&
z2B>RQLFb)?p;nqg9Xg9#ALgCe?}(VS$T{JA*@FhI<@)02b~tIGPI4>~d;Z3#MX7nD
zFF&H#IEvOUI5YcV@LWk0B|c74*mufdnr<9E)JJ=CtL4p#Tlc+kNj%g0?12&sx0v}<
zZ6m3aAE8rcvh-BSFOlGca*5BVdA1XALr9?h{L{fgwn?dj-M5cXV%7Td%k+8c0N|k(
z2ALRqjEta~Za@N08U1hIp)3aL0l=eqy~5-|Px^L?1U!oZ01y5D0Poh_W0y%=@v|_>
z7W;F3gpo8`w8+c7p7j@}<ZIn!Rh4f@c8A{$%?m@-0pi)YxfFu+C>4c{(srEk@aFjc
z0lb-T+uFu*tOlI=oHsPRKZ$DN9ah?Z!ct}u(@hA|Vp7vhOlimbMLjsq4=-n;&87&_
zo%ZYN>nbM1E*@Q!UM%VjLu>X{CNE004_tN-sfN!WU5;a1hn?obCR>`5;zmPJ5ihkw
zxH9pRw9lD5ZO?BV4o%StPMY9}QwK>XhUh9lnAdgc)EO8Hm*yLoTzvzjzOG$a1p1m7
z?hC)TK(Em2763*p`rpXIr7Y#c1%sh3C?GxzkPmo3ugj4X7&Ms1Ta6&!;>;U_B0j?%
z-j0J`bFjbC+<9Z_kU_>%@*z^iiAkzBCN4V8Q9DGZ08_Iz*AN}o7YoaGuSiQK{+7A8
z(Z!?<yOp%eXf%(X*p|QR;sy0xD(WvBNlaIeUVc_T*6rX&@~823Y!<f-IZvP-rCO#1
zVq3G;--jE|&#goy3?CJK=sRdJF3{?*xTBAkWlJMs|NTd*S=7R;T8@ZAzJ-M&btU#N
z>Ga%#E|q;xIE*Ccv2mC+OU231GPXQbYa}$r<!OTY?D_{o6&&9meU&7wXYa`cx=15H
zi6DmG(2E10r-p<c6iGd7wP9*%+XzYs^{8zFrfaOFAP1Atc0igAyuU&_|4kM&sbI-D
zMp44q|G>C_C^bsdKj%g`l@Rej{J@B*1xj+ubN``_mM(Y$4{!_|-t$RyX$1s0YCOOk
zdB<iqCU0cgdfNqU8_e23++c_%*6{G9e*;mlb6MBi2!##wR{HMVfc@CKHO-05{g)dH
z18yx{eEpZf?a>vYa*K)t%S;$!oD5C_CX~JpPF|<4Ej_gv8&zt?KJr(HIt#7E8Z?Oz
zZHk}n|4CXt(KRKsB}JFK@-CoaM+FM`u^~Bn;^umGzQ4QMwh5d0xj9r$XudvLb#`oU
zG`1F6pg!*cojwLeuCJ@pY2YALqP(<6qo4aVzkK+u51H2J?!;S>>Jjz|QRjx=+;=f;
z+zZD|AHTN48Tf2S;TnA8mVz=?PY@&`NQp(WU_du^yt8ZTHu4}=Rq(dR3_O?TGn6P>
zQsn)<J%7X2*!dNTuKiw=lSzRTm=Oil;5YUNe~TTGdms=&7A)fi8LVD>?izg>0Q!gu
z(k3;$h4Pr+(n55Wlih{*`BF5vS41A|&nxhVzLenu%k(Fq8_F1IPKKPL%SfPELK`p9
z;sc3fGBJZ0mVLEZDJ%}uH6JR-v^Ue68y@8qem3+<iik21pw(u|(2@VDfg~TNzKI&H
zAqBY!1&>)Jc}-*!LRY31x^f5Z`pH<!)kn3=QMDNs$-tmd13+;oRm;Kl#7?bQ_hAm8
zdNdd-$y<FGJ{#sqo=DZ}yI^xA?cw)1IeL1b-gG<Do*$oyq6MDCEHB3gR}YUatUTa!
z<4y$~zRrq3+)7}xW6ZemC;|>}FIDXpS=zROMy7Sxb`orvDFw_>!_l<<^||FY3LjIe
zMk6B(T^J>|Q=7iq&s70pK2#V5DkD@(K2SK)eP$Cx!U#?S(Q|F0V?fqXqwwm+o=|nw
zF@+r%U181AzJJyHVy1>i3@LQ#1@{YWDW9q$g-+uS-T<Ei@TNpLXn)|QdA|9?Kl$Vv
z&we#q>HbZWVo#~E@i?P5%iqgm&Go11`!CK~;S5*9No!Dp`{~qY$EMJ?)upEwGKNL9
z$2ErsgEN!IBf-tpG=yHz+VZ-kmB>%N{^uhbKJ}NoGwpU4$D|V%-ZpCowQ|Hg=A8Bl
zFTng!QX#o77@9jzVOb$Z1gNoL4+)88^!VO&)BQ-?Kt(LPqZOXlAl$C@zPQ5Gay_V_
z3NMoavkOu7H372}^KZTppTjC7E@7SQ7|{RAH<eLVc+~OSbjJMq;uPl}E$|%dVYBW*
z)6t+sX1<VqR(PD?u;L3@wzL}T+G9+t)eNl4XW!Eqb%;14us98Re6$gA|3NtJgXT|D
zY*(Z>Ro8@5&YXU3EMmct@bg3mTEJUh;Z$FuMAEYdfh6lW<Y<{FXTQngQVUhR^eAzn
zJV=U<S;}AkZYtooqz)N=P+O(L|7EVY_1oA3O%6{_I4KT5I7RWW=|zjISmqy;_s<<Y
zf9Bbs*t6HDzUqdhbtWKc2_0ni#Gm^&+@3~#(67gvaSuo3HRmeHhU!-?sCHZgjv9g$
zAlxko$;RF3;PNKk6fLdWK2n+-X8GnRMX#BWgexFa5_k66`Juz)Axg4!*NY~{nc2Zq
zpJMJ*G5#^$u$Mmx#Co~qRq-o{n3Jbrt4OUI{keFXZ-P;EPBh1zC6Ms9)`5}pcS`BB
z=1<>M7Z3(Ld@N<*UnL_6kJnt7A2v6S<PUh6akOP?j=;aG=Q1BiZ&h5d_ieB?G$XuB
z^Q<x;O{t2h{2u$ea$C0hDFES&B8+zrE+|m9(#1B$?4jbvbpzB@KElOtuc61Ta6wFl
z)D)*Mo_6|+?fw(tr;v-W)SS|t^}d$GHTLo6tKHB!nvvknrH%Hy_}uXOdu!X(iRCY=
z<%7w3drE?m8lPp7%o=HDUh2Eijy<=rQ!NX1*ip~W*;$=+-rjW8nw~5Qe)w`9qfxQ!
zUWD_x&xxt2;GkR-KG%I={MD#U2Kf@T!&?(0``gumSM?43#`PaY2iG(kMlcqDseFK(
zN`haj>o3CHhy)0C3YA3xt)XAP>he7T^zNb*qH@SB6HTd-6%kWfJ-#5gxJg1}pU3EJ
z#Z+MwY?T>AD*|a_LMzlMCgq}uewe{%Y&6_<V8w1g?l7Z2Yy3I1PO7@}IVn0{Oli#t
z|5n%4)rEzVytUlhh)=KMXo&sUpA)K)RO(I~4CLiGPV7M`3cofTxhEZeHg`O6ti{(a
z7^1Gzsr{_8<41x}B9$s+Ph0BXC>yC9)Zal#LibrM#t&X^Kgt1{KU-R?l@4ti+zt3X
zCcDpUe(68SI8+?6oNX%C7Fx3L39Coz#hsy<3`ZA#9N`oV(6bh8d8@D=B>ZvRI0EvT
znUKg%HZmNj1zIL&51-s|yUKnCux7llgg<`xV4ICTF$p3l_V6=FQz(8Vj?2?ja%S@9
z&_WhI0>zufh&|pEVqIml8+RG(dU4~weQF1}|4i!kNXH^#=j9%!lSW}}AZ@U2u0<eU
zVJU;R4$V4CUEf*y4@yM}V}6?FJ9D2*N!OmTq|1RC)OX)~F3!DFCgQD&yZeUfU5X><
zM%X|{?UMMI3P4PWankxTGYh+bZQKj@iQ5+h;0K}|w}oupuwl$X&ZaYj>^*(+*60g6
z>U?}XwAS{y*LXgrIhl@17BIkL>qnm)wM{pSVHTCUOb)Jidq`crR_yDtkHvQtA8aB#
zD!j7tdA(}SlVUPeS12$4?9)36K8$v}OQM{+0c2upngkSEbQtt8P4`K!@#oL^2Ebo4
zFal&6vA^)wJ>3~~jXzj^FA&50uia73z(%Alp~mW1fBa74(J#Ln(~y_Y%fM3Io^^p^
zS0A!#Xg!g+E%Qm?j*qgOvPLgiF9M#2#uNt&5+X+9p^w5u?}1?wvp(6mnI?{HOoZ_1
zS3~lzIWXueg~hS=<k@8V8O>dKeD+6(tZlAd2@)ofV;KSFi}w~B(Ec9@su}APi3Y2k
z>|)7L7H`un+H4l10`9?bg$50y%NhrCnt9)1vn<UQjDPnNw_nnLj1NCBIf@x4Tj$so
z9DE#^*6FR<D4_AvjRec(^4=+0rur<RUa>q#)y~cP<|kHs3A$y|NK!v7+_y{E>!{oy
zra*=J=%fzX@^ZPExzG$V{0)a&%7{=l5~Sb>{}DVkK=3TD1+PwztM!t1tYM5c7Jank
z$F2jPx9H-2at?l<AX4zyD(bLp-lBP%rH57W=~+L1u=2d6QC#liq~M<AhArexk~68T
zJ6&l7F(X<WNC{*?yv~HgUl^5Bo<9`aRYx4Q%K_jIuE7N0Z*hKD#vI?ikydVF>Ss+v
z9={C|f0o4syWb3I6*80(G*6KDgBSQ~zjKo^{7_*AY_+aTs}ZgT)+I-V<D1SFQfahn
zv=`gUW^03V<<-g1q_a`~i*rBr%EA1qDIUpcc+Jxhe^aTw!|qyA=;ZRx5?vFa^ePhu
zhVkKmUN4K9WS5Kcl4atJj}cKXZy-c!*zYo>-Qd`@KyQtAZfi6hDH2q*k1jLTLJFRA
zO4#NWEgHm!mq_qOfhc@u?#3=4cuH(E3Gdv-`Y8saB6QMewN6W^rk^-pLZ9bCo@m1h
z1}z@!pnCyRsgHBL*KQzlmQr6@G%!>G1+?)Cdum9vD@;qXvG{_+B+|@Cl3^dFVK?g{
z$ko=)fhPXci<TnzX;N^~I`cCKe&zhFC?RZ-GfeS_+w+EK67mQof*>Em^UwCaC|o#J
z+=JT(bAZ<st@0Ab(CRWVS8Fs!EQ?|L@v7+MdmE0W#w;AF9v$vZK%ZSAm)eCcfr*4k
zfBijs>O!5`w>mqfv(1U5LWiWS?sf^QPA*>hrkJ|nt*w*Y%3XfxLk*5ggYV{YK_hQF
zd7h?3m^b{a?^?5^HjZ$yrAFa?u^_Jy7-n@lnE=xtvS%Mivw~NgL#x2r@;k(n+h_e1
z;<<&g-*-T!ct3xocp6l8$PjOG(LK^AuM|7yCZFj#*znt(ygvEALOf;kQE|fBM|_p?
zTHrkyP6>(?{Ga<o<q_C-4kJM&A+T<GIw%y~om{Ka>ZY4yN~-ph6<w8q)R2yJ8uQXU
zk^4xrQ6kZ18`jfNYcIZaBW#E2H`;sywxhS_KEt=Mz{T5+RS>yRJig*CDc|a9D98C1
zXJ>WjGkX1Cp{*lH&Cu5Gm#6#Fvd6Qt2W5l3Wy|B=)=np3P1}7Ldr%p3qv#y-gC}W{
zer^X3ca4~2pC|UrYp*Gxw{j-*Qm^3H(OzMhQPoG0p24yrj>u7C6-#1?XY>Z&VV%8B
zSwTglzM~Zdyl&?s((AgXcQhmjO0UoiciIDi5emQ7I{xdVjvTomFnj}IVH;FEMLuFr
zI}3;dY>VLl`UnNY|7(Z+o!s#|!^onUT|T^FykU1YrgOO86U7z-K@w;DdeaIk@@d%z
zd_nCm#7gdSI%E_<uM00wx%E&kZYWR$^;2NY5^B{$_=S)gY>fT!V%lEnv#zzfbA8KH
z)O#vW747tp`zVC+EK&3;{ZSib9%TkxPy?~--PN#K`}9uMqT4)0Hl=FW_gPXV9yu2#
zzHN3)cx&mYt2oK=;G{IvW|BK;@kLKv-3Z?<q<E=e47tO4!TGOuSeUHaUQv%dF<T7j
z74-xTS90sfNihjU70oJuxH>J|(Iu)EsEL7C4a`eHR1=v=zz%Ep*AA<UqxL~S;0KY)
zpWsdr2=2VnbP9W`v|S8Hp-Ilm8=b7O1+~T&JZ$77oq;Q(yw0TBbVg=TYbgpj0>xXW
z0_`yw)DX)`xtJAzaHjy_=xiWw9^gfIRJ>Fe$07nN2eJefVI5)xiyVTp@ZbY=arRS`
za!_C|Es~_r3UQu?iHLY788%U+T7SC0Or~(p!b_$RdEZLul;>Bh@9Mtn4rF|V=}Ymr
zU%R46C(quJZE-y#&aWpr*e885IX)%1;9p5&lyZ64FIBV0S$p6%bXM%R`FNyCYNjTj
z{J{OknclFA`Vq-wDJ*f#WiwOifVtvm8G6_en)<!fS~C7<Jl$_CfFayB!irPWfQVvS
zDIR;rI-a?nQ~2doVE%1=u^58|zuXbLH9+p}qY3QJ1F2o>uhgy?j@8s^Yc0V!QZXMw
z(Jifa#mI^3p-k0o7co_Sa)q8V8JzdUx$F|{1LP_Z7)^`6;f8GwCPdCAi!#iO<s243
zM+}7|j+@U?#mS4|$^iAm{9*foN9ZOwbuTtK$Ctv7OxQ`xlv`1yJ*78rbxopT-ZQR{
z#06rJlc34u%gYcV6pP8e9ohfN>tIHc=gCJ)S67!jf*;Nesqr|5KFBKXN25vJR?)jv
zmY7nI5W1*yw%S;xf2BL$TKM_J&_p)0(@Veb#gJ*XsBLzp!@9ypYoX7Gmvid328^qF
z40>3TRD3v#@5RiwA93K<cyk-lX`ZwhJh^N$QQ8+Uzl56e40KC-vJ6Z^ES;)3{RGG?
z)x3n4Q&Jc(7GYEmHHC3hUc9<<T~TOw{-N8CKX8LiYf##K6cE6bY@H(^HE_gNH?pcI
zmIUZlpsR!sC|(jJnS02J0s-jum@ipgOL8xOS%P%s0HB*tFm{J$B#1BCeZ~d+*G4OX
zd`aEKt4n#p(NzZqAa+GGd;5J-%ZnL5VTr7|W}u>Q$+0DRiUTBe!<u*6ppN{)LPMY^
zysVUGnor?!e<gP1*A<0~t5MN33rca&R^&q1{#}Ik&Sj!C;m{Vwl<yJ!P}(J4>*NSw
zXNO==m&w2oLm?h!*Qk^?cU?(S@19}#?vqK3+RB1d3MGcn)~;5_9=mJ$g!tY(A_Ld5
znD6fH<>F6WCIjur^{)|v4;6P}yAyWuhRv=#$hIe~rh7o^#LVxa-jd2Bez83Tl_bUc
zhv%<I222%V)`OgjEPCg74~5(&yU>C8ivKtIZhp*Sk_RK5&f{<1{pEC{tfM-_&}}Q}
z?g=N|QfKS8(i7;;-?K4PSH4kN^|HcW2@dBI5jxaFVLltk@*yTeq$qGiOv^+uMzCuN
zV%B0w_;zn;cr#;=eW*Qt<GNJ4)lpM#Ih0Wc>)(pILPw_~2_W%dq}FyzH-X*};7;Tm
zaLAY?S5xB}H1K1kO6{;)>Rn0BtWLUL)NhywXq{~3=e3Tcw9;KW7XgNj=Dje!e4)bp
zDqn7}7+CV<!E1RXdod16%CKA$zU#6APrJo^)*>s#oQ+giY)1c8P};6%A!6736Z*y;
z-XUlSncD%(Gy5192Gvo}{j06O(M2Gcr~R9G1Wisl0P`-yv(+mD%JlN&fwH1&jP|9E
zvGq!?2j5+)k}7q60)7|9&un?o?*7(o0tD+7zsd@oVx8-)cJ}~TR&)Sm#RT(@>Hpel
zp@7$2ueH}&m!p8(Y5}b?2ej@SsdXJS5i~Y!<85FG#6y#X-~wM<IYO@VUC4!ath(A+
zrm$ssp3b`Kx<YZM>{sHtYOmvOqt0iJXPsFH*jDHCPaz?c^2xD{lY<V!aC%WpsgTX|
zjt}cyYgw*RX5)@hUgc0B`>D`(S-K}Dd#$c%0g@-j!_tE#>G=5mHHW7mastv!H|V$`
zIL@_gWX~UbXe+{b$s)xF;lJ^u#9UH0f1n20R|Ma|89(zPYJWZ{J$$PiqokwN4bZwH
zH6XXMEdRs><aP_(BUzsIeN9`#KyKI9GKxL|H-@6@D4}qX1EXpDH~M~)k5d?C#(9q1
zYJcmUge$2GQEF`&-Iz>{v|{eE^s^@(eu;>ZzG6dkR!;d=%iBbeXtEKAHw(RFo?47O
zB6pOfwccl-$b^2<)zX#@Va|wXV3?lknA}jfi-H{=CQ+L@Atc7{no|+6oBoJ7(=<Ga
zxJT%^q%G+++4L+j-MD=K<u<MHyK_tw?yQO4r{Vh8&1@iOCG2DW`y4&-zQef@I0dHj
zkk^{3m!ZKk&NNhhOij=juX3kfx=@4T(fNzDJfe}en@GiTnOT@xI?%<(jWAcf7h*~|
zmKH^X-#n~C$9=lENC>jOhG3Mk-d~D`_X~nhWKnyqc)yEU0D?>Sc-Ij0`dE#ERJ`H1
zyy-WCkC`*k&mnY??z|+=Mbg4YUL>hAe~LTdjZcf*Z?!#*FhPWn1NGqljrIP5;208u
zC{3sNP!e|nt^3vlbAG%41e-*m>IIfLwkW@fT7ZJcqV{)Bo3`u34m7*}%=Hex7@bO>
z6z>lqJml<*W*1y6Ri*L*2CLaQw_Iu@z0NfjdKODIl()Xp52@KJo?dSBbwT_0v}b0v
z&w{i3Ygx(#70Wjjl@u?YF$}q`7T{lPSe+);1?<Yk2&NY*$lu`120}gEW~oNKmLe<H
zi|@Z$TJ&K#dEo?n_Wigo*DWneD}hm;^?4n#rQKic6yYaugrZcp_r?KZ_AAr-hy2}n
z1#?uUf>|go{oZW<ul2z`s2~EBWlWU?f2im1!6e&JJuwi}amM|C^yR8Ju{jq<GSOI?
zR`i8V|ESQ{;u?tIiY`QWQ52fq*l4smpcoEVvU5QMBJ0|jlxLk!HYJLFzL5LIiZ3#6
zksT-3sEPDG96E;q)eb1lfkT18XZVlOz34&1H5<`@r@p>76H_?L7d<MQTY6<H&8rM@
zSA5wsD0CD`d5vFC<Y!vGSnfzsyHm>xeuh#L3P4cPUhEDMf**n1cAeV)4+N>+b@(LM
zWY|lja;ZG!=?^-5ih&sz9Z2{v9`fyli|zxtTxe$2-@7fxzjxa^zsifc-imuBMJ<<i
z0SHn>J~f71p2~`Ni@sUqr@L-!RgsNtOWb4HVTeEVVvAOct)(p{_1+%d!dmQLNM(9Q
zvQ;nJk2%qs|Bm*8@Zit^$yoa-BDrhx+j<pyZGP}X!2G0Iwa$+Cd1k{X?+STH6Y>um
zoIK2%WbS79@$uYLs*7dIVTz1>J?1Uh89QKp<wUh(IP@h`c+m3lP9>?S6Sr^Jl24!#
zVv}&8vV(-p+HiYGMT`8@VYl^;_MbM#szU+3SG{8!P@4vkL1(FxFMdPj7JO27t{#mQ
z860emuC)^M$l&BHKahFX#Gr5!5esw|pQnYZ@RO52!xyO&N*8=5@}kSX(RgueFCWS9
zHU&Q~)^@?SOo^SD{!&8!#!23z(fhi&NcgL{7(o*74Aand%wYlygQ3HL$uuGPHv#z=
zV5UkZ$g!0B13_f82Q;@=J*8O0y+$kRg^A-Wrra`agIqzwBe`o6xk>Mttvn2AIp&MM
z40IZld@a!qS{}hBHy(K#!iaV!M1T_~z}4Fxl^w^5+Wus*!_Rf{+0?V<u-6lre#*&$
zH)JyzShp=zGG!~Phc``Y2hE|&<`q5*zQy$D8k+j-tCO-@VW0Kb9ny4aqjY-o`eI)S
z)P5TEG<%|x+u7@3sL=N?XC}9C5O0=$${uff)LEml4kxZ)^YT^s%VndQ^Rt?OOiO|u
zNMu+buJxEU@%s!clguWCsqu6AX(w^ibv`AgNIp*0c4=8IEm8>}*b{{&YTXi_iH?$Q
z#hc+{?-4?k^sx>bp+ap6>e{YAeCRVm(TxZCiw1o+wbg!NKHOgnw0cf;%|JcoPk|?l
zZ_=Xn!vO}Sw1zC60StWp&uW7TDS}^+)dqG~9W9c9XaECMtq$jEc!0AiP-M3e@R==E
z9KF*KvYtaef9Ebz1Xc0!01@<ov;1{drMj*iIID8nlxgIP4}Ne8ajIl0y}e^~_U#z<
z-p>T;E9CQROMmWUb>e7>ntf=$m8WPck$&+Y>*M`3^*N6RlKy$+r~am{3u$z#eiHYD
z-S!uD5_&eQ?P!*c;4bilfOlq7;y%Y3%6d6gItWT$>tm&)AIJLZ`BEY{K3lxow=l(2
zLv+8p$sTc-!3l{Hbv%~i1SJq#qX$<!(!pX&?ZWvN*yCkA6~L^${I>@R_+~jOgJC>)
z7_bIzOsLu;;IK+953F8*v01^)Hk&_Lo*#ZsL*D+ygCMQw-cXXhB*DmBVB;kYdXHx4
z;`LFjIh#gEb%*px5UyF}K`>4Ld8msXn#7T<c@*-f%H&LY_0jmz<`&;v98?IMc31Ml
zd$~rnYxcP~>qmE#9;lWX=YLg&;HnLt%|i?I){po1)o=3aI}F@S&TiSY$~Aw-W9U_z
z+P!D+t$m9FvHLy95^=Ctx$q{9AzXq$GSaIE$v(Dg0sM7Zg-pA}4Jm*w*8*tpDlE<0
zs}SK~aV>ywkP?{imjHf17Po(&R>1~Nt3Uw(<ohjv^i58xfB@D4r&TK50}9O}FD>DP
z<#e%C#*mqID~>8Dhl6Bq61!e$JvAizu4@gqU+l}a%m&!E3$U*oU|%x8zAtjGo4nL#
z6+wj3D70Wdg<^l?X_aGSuE*U~2l|D+Ator{SQ|UU!%3(pjNkla#-XbnvevlH^?+If
znd<?y#_wFOFw0-(U9ps2_HZ5`fRnQOJ{yB=5?mh5m%CriW>5R_Nk!Z%Yj>>?m&?%N
z(vywhtOUoRI{VlfxD?dio8M3D;Z)^TvP5!$SJqh?Z4GaY_w)vIC1XTQVWMvB*`ABi
zd8M3y{Ivi!9cQ(L9G57^Til=>gUZ_Fa26P6`F+wWs`lCu^kJdfop>OHWjFSa(do5G
z@bIFgaD`KT(<^+n`@?jr(W?ydm6`;%E=KUSX|7w1T3=OUuIC(xHhF!54`?-rX_27}
zhzA3?`3hsf1ce!K|8Y>S)KVB5jQ1ZWtX4_?b=u|kVV6_V|2U!moXWaH3g`bk<?o_+
zk@P>BztRc`FqrhZeEFa5<p_Dd|M^jrGo>R^U@)%!AFcz5B^Zo+@PA}bSu+gR-};jQ
z{4)YLK|bq0*0)k7c~mgzf6MdrbN>Irvr206=QsP6HeA2roRj_s9!edRaen>nLDI<o
gj*4#Sa}^q_>;DFb2l*9kU)U#Ydi2sK_g;hkAA}{U=Kufz

delta 10791
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

diff --git a/interface/MEMClassifier.h b/interface/MEMClassifier.h
index 9e9df83..3583e51 100644
--- a/interface/MEMClassifier.h
+++ b/interface/MEMClassifier.h
@@ -54,6 +54,7 @@ class MEMClassifier {
 
     //The constructor loads the transfer functions and b-tag PDF-s
     MEMClassifier();
+    MEMClassifier(MEM::MEMConfig _cfg);
     ~MEMClassifier();
 
     // Call this method to return the MEM output, provide all necessary inputs.
@@ -68,7 +69,8 @@ class MEMClassifier {
         const std::vector<JetType>& selectedJetType,
         const std::vector<TLorentzVector>& looseSelectedJetP4,
         const std::vector<double>& looseSelectedJetCSV,
-        TLorentzVector& metP4
+        TLorentzVector& metP4,
+        int ncalls=1
     );
 
     void setup_mem(
diff --git a/setup/install_mem.sh b/setup/install_mem.sh
index 8aab14a..4ee68b3 100644
--- a/setup/install_mem.sh
+++ b/setup/install_mem.sh
@@ -7,7 +7,7 @@ if [ -e "${CMSSW_BASE}" ]; then
 	cd src/TTH
 
 	#get the MEM code
-	git clone https://github.com/bianchini/Code.git MEIntegratorStandalone
+	git clone https://github.com/bianchini/Code.git MEIntegratorStandalone --branch v0.1
 
 	#copy the OpenLoops ME libraries
 	cp $CMSSW_BASE/src/TTH/MEIntegratorStandalone/libs/*.so $CMSSW_BASE/lib/$SCRAM_ARCH/
diff --git a/src/MEMClassifier.cc b/src/MEMClassifier.cc
index a2b120e..6037946 100644
--- a/src/MEMClassifier.cc
+++ b/src/MEMClassifier.cc
@@ -87,7 +87,7 @@ void MEMClassifier::setup_mem(
 
     // Fallback
     default: {
-        std::cout << "Warning! Fallback case reached. Invalid MEM Hypo!!!" << std::endl;
+        std::cerr << "Warning! Fallback case reached. Invalid MEM Hypo!!!" << std::endl;
         throw 1;
     }
 
@@ -152,7 +152,7 @@ void MEMClassifier::setup_mem_sl_0w2h2t(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -222,14 +222,14 @@ void MEMClassifier::setup_mem_sl_2w2h2t(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     assert(untagged.size() >= 2);
     for (auto* jet : untagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -296,7 +296,7 @@ void MEMClassifier::setup_mem_dl_0w2h2t(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -399,13 +399,13 @@ void MEMClassifier::setup_mem_sl_2w2h2t_sj(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (auto* jet : untagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -414,16 +414,15 @@ void MEMClassifier::setup_mem_sl_2w2h2t_sj(
         MEM::Object* lep = make_lepton(lep_p4.Pt(), lep_p4.Eta(), lep_p4.Phi(), lep_p4.M(), selectedLeptonCharge[il]);
         objs.push_back(lep);
         integrand->push_back_object(lep);
-        std::cout << "adding lep " << lep->p4().Pt() << " charge " << lep->getObs(MEM::Observable::CHARGE) << std::endl;
+        //std::cout << "adding lep " << lep->p4().Pt() << " charge " << lep->getObs(MEM::Observable::CHARGE) << std::endl;
     }
 
     assert(metP4.Pt() > 0);
     MEM::Object* met = new MEM::Object(metP4, MEM::ObjectType::MET );
-    std::cout << "adding met pt " << met->p4().Pt() << " phi " << met->p4().Phi() << std::endl;
+    //std::cout << "adding met pt " << met->p4().Pt() << " phi " << met->p4().Phi() << std::endl;
     integrand->push_back_object(met);
 }
 
-
 MEMResult MEMClassifier::GetOutput(
     const Hypothesis hypo,
     const std::vector<TLorentzVector>& selectedLeptonP4,
@@ -433,7 +432,8 @@ MEMResult MEMClassifier::GetOutput(
     const std::vector<JetType>& selectedJetType,
     const std::vector<TLorentzVector>& looseSelectedJetP4,
     const std::vector<double>& looseSelectedJetCSV,
-    TLorentzVector& metP4
+    TLorentzVector& metP4,
+    int ncalls
 ) {
 
     // Make sure vector sizes match up
@@ -471,48 +471,48 @@ MEMResult MEMClassifier::GetOutput(
 
     // Single Lepton - Boosted 222
     case SL_2W2H2T_SJ: {
-        std::cout << "MEM running signal" << std::endl;
-        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {});
+        //std::cout << "MEM running signal" << std::endl;
+        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
-        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {});
+        //std::cout << "MEM running background" << std::endl;
+        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {}, ncalls);
 
         break;
     }
     
     // Single Lepton - Boosted 222
     case SL_2W2H2T: {
-        std::cout << "MEM running signal" << std::endl;
-        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {});
+        //std::cout << "MEM running signal" << std::endl;
+        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
-        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {});
+        //std::cout << "MEM running background" << std::endl;
+        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {}, ncalls);
 
         break;
     }
 
     // Single Lepton - Resolved 022
     case SL_0W2H2T: {
-        std::cout << "MEM running signal" << std::endl;
+        //std::cout << "MEM running signal" << std::endl;
         res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {},
-        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1});
+        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
+        //std::cout << "MEM running background" << std::endl;
         res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {},
-        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1});
+        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1}, ncalls);
 
         break;
     }
 
     // Di Lepton - Resolved 022
     case DL_0W2H2T: {
-        std::cout << "MEM running signal" << std::endl;
+        //std::cout << "MEM running signal" << std::endl;
         res_sig = integrand->run(MEM::FinalState::LL, MEM::Hypothesis::TTH, {},
-                                 {});
+                                 {}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
+        //std::cout << "MEM running background" << std::endl;
         res_bkg = integrand->run(MEM::FinalState::LL, MEM::Hypothesis::TTBB, {},
-                                 {});
+                                 {}, ncalls);
 
         break;
     }
@@ -586,7 +586,11 @@ TF1* MEMClassifier::getTransferFunction(const char* flavour, double eta) const {
     return tf;
 }
 
-MEMClassifier::MEMClassifier() : cfg(MEM::MEMConfig()) {
+MEMClassifier::MEMClassifier() : MEMClassifier(MEM::MEMConfig()) {
+}
+
+MEMClassifier::MEMClassifier(MEM::MEMConfig _cfg) :
+    cfg(_cfg) {
 
     const string cmssw_path(std::getenv("CMSSW_BASE"));
 
@@ -602,11 +606,11 @@ MEMClassifier::MEMClassifier() : cfg(MEM::MEMConfig()) {
         string("/src/TTH/CommonClassifier/data/btag_pdfs.root")
     ).c_str();
 
-    cout << "opening " << transfers_path << endl;
+    //cout << "opening " << transfers_path << endl;
     transfers = new TFile(transfers_path.c_str());
     assert(transfers != nullptr);
 
-    cout << "opening " << btagfile_path << endl;
+    //cout << "opening " << btagfile_path << endl;
     btagfile = new TFile(btagfile_path.c_str());
     assert(btagfile != nullptr);
 
diff --git a/test/mem.py b/test/mem.py
index 3224288..009d8e4 100644
--- a/test/mem.py
+++ b/test/mem.py
@@ -1,22 +1,26 @@
-import ROOT, json
+import ROOT, json, sys
 ROOT.gSystem.Load("libTTHCommonClassifier")
+ROOT.gSystem.Load("libTTHMEIntegratorStandalone")
 CvectorLorentz = getattr(ROOT, "std::vector<TLorentzVector>")
 Cvectordouble = getattr(ROOT, "std::vector<double>")
 CvectorJetType = getattr(ROOT, "std::vector<int>")
 
+ncalls = [1000, 2000, 4000, 8000, 16000, 32000]
 f = ROOT.MEMClassifier()
 
-inf = open("root/events_6j.json")
-data = inf.read()
-events = data.split("\n\n\n")[:-1]
+if len(sys.argv)==2:
+    inf = open(sys.argv[1])
+else:
+    inf = sys.stdin
 
 def make_p4(pt, eta, phi, m):
     v = ROOT.TLorentzVector()
     v.SetPtEtaPhiM(pt, eta, phi, m)
     return v
 
-for ev in events:
+for ev in inf.readlines():
     print "----"
+    print ev
     jsev = json.loads(ev)
     jets_p4 = jsev["input"]["selectedJetsP4"]
     jets_csv = jsev["input"]["selectedJetsCSV"]
@@ -42,17 +46,20 @@ for ev in events:
 
     c_loosejets_p4 = CvectorLorentz()
     c_loosejets_csv = Cvectordouble()
+    out = {}
+    print "tthbb13 code cat={0}".format(jsev["event"]["cat"])
+    for _ncalls in ncalls:
+        if jsev["output"]["mem_cfg"] == "SL_2w2h2t":
+            ret = f.GetOutput(f.SL_2W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4, _ncalls)
+        elif jsev["output"]["mem_cfg"] == "SL_1w2h2t":
+            ret = f.GetOutput(f.SL_1W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4, _ncalls)
+        elif jsev["output"]["mem_cfg"] == "SL_0w2h2t":
+            ret = f.GetOutput(f.SL_0W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4, _ncalls)
+        out["output__{0}".format(_ncalls)] = {
+            "p_sig": ret.p_sig,
+            "p_err_sig": ret.p_err_sig,
+            "p_bkg": ret.p_bkg,
+            "p_err_bkg": ret.p_err_bkg
+        }
+    print "out:", json.dumps(out)
 
-    print "tthbb13 code blr=", jsev["event"]["blr"], "mem=", jsev["output"]["p_tth"], jsev["output"]["p_ttbb"], jsev["output"]["p"]
-    if jsev["event"]["cat"].startswith("dl"):
-        print "DL_0w2h2t"
-        ret = f.GetOutput(f.DL_0W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4)
-        print "mem.py blr=", ret.blr_4b/(ret.blr_4b + ret.blr_2b), "mem=", ret.p_sig, ret.p_bkg, ret.p
-    elif jsev["event"]["cat"].startswith("sl_jge6"):
-        print "SL_2w2h2t"
-        ret = f.GetOutput(f.SL_2W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4)
-        print "mem.py blr=", ret.blr_4b/(ret.blr_4b + ret.blr_2b), "mem=", ret.p_sig, ret.p_bkg, ret.p
-    elif jsev["event"]["cat"].startswith("sl"):
-        print "SL_0w2h2t"
-        ret = f.GetOutput(f.SL_0W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4)
-        print "mem.py blr=", ret.blr_4b/(ret.blr_4b + ret.blr_2b), "mem=", ret.p_sig, ret.p_bkg, ret.p
-- 
GitLab