From d1076c94519305d71604d1bd8ee6702703c8b11c Mon Sep 17 00:00:00 2001 From: wkumler Date: Wed, 29 Nov 2023 14:54:22 -0800 Subject: [PATCH] Adding speedsizecomp vignette and images --- .../ssc_vignette_renders/make_time_gp.png | Bin 0 -> 25596 bytes .../ssc_vignette_renders/multichrom_gp.png | Bin 0 -> 18011 bytes .../ssc_vignette_renders/par_time_gp.png | Bin 0 -> 16294 bytes .../ssc_vignette_renders/query_time_gp.png | Bin 0 -> 24073 bytes .../ssc_vignette_renders/size_cons.png | Bin 0 -> 20977 bytes .../figures/ssc_vignette_renders/sum_plot.png | Bin 0 -> 45004 bytes vignettes/speed_size_comparison.Rmd | 683 ++++++++++++++++++ 7 files changed, 683 insertions(+) create mode 100644 vignettes/figures/ssc_vignette_renders/make_time_gp.png create mode 100644 vignettes/figures/ssc_vignette_renders/multichrom_gp.png create mode 100644 vignettes/figures/ssc_vignette_renders/par_time_gp.png create mode 100644 vignettes/figures/ssc_vignette_renders/query_time_gp.png create mode 100644 vignettes/figures/ssc_vignette_renders/size_cons.png create mode 100644 vignettes/figures/ssc_vignette_renders/sum_plot.png create mode 100644 vignettes/speed_size_comparison.Rmd diff --git a/vignettes/figures/ssc_vignette_renders/make_time_gp.png b/vignettes/figures/ssc_vignette_renders/make_time_gp.png new file mode 100644 index 0000000000000000000000000000000000000000..7a9317b070f69e69637641b6fdf493d61e122506 GIT binary patch literal 25596 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 P;zC)7eC5Sp<$?bKc^NE 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
36N5rbn(E6t)g_cFoT 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 literal 0 HcmV?d00001 diff --git a/vignettes/figures/ssc_vignette_renders/par_time_gp.png b/vignettes/figures/ssc_vignette_renders/par_time_gp.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad6a8084bd0a3d076d31b99adfc80079f83b423 GIT binary patch literal 16294 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 literal 0 HcmV?d00001 diff --git a/vignettes/figures/ssc_vignette_renders/query_time_gp.png b/vignettes/figures/ssc_vignette_renders/query_time_gp.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d85ad8ca900c4b8907f964530f88030d93d8b8 GIT binary patch literal 24073 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 z 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 E0Mhi$hX4Qo literal 0 HcmV?d00001 diff --git a/vignettes/figures/ssc_vignette_renders/size_cons.png b/vignettes/figures/ssc_vignette_renders/size_cons.png new file mode 100644 index 0000000000000000000000000000000000000000..e69b2a2e0f95e6a42b485bc86739366ca1a643d6 GIT binary patch literal 20977 zcmeIa1z45swgtLuBm@)`L8L@MQl+FtumMpQ9by2|-Jz6-B4B}}paPOgHzHyIqEgbO zbR!5-cYOZ)?6dbiJI>kn+<5MD*Z=$=u+|rE%sJ*5V}3VIs~n}FWTqsMNHoWfDV`yb z)+CWgtK}(H<2SU2+jimG`U@wIDw0-+{~nbj-o)kz_LUVg$IQq}Tf{cr*s+dz9S6mk?09DqM~Lm2LnvbS+NhJ&1R#U&5Rf;gxBJ-LI%v$x8XZUaZNe#{S5mYZbP1OtpR>G zcCCvF-+1ZVSK(sUc?;o(C-M{PNTjO_6s7nfMBz@uIz=BtrbT(ytFIGy0^@lMnXPxN z4Vf^{byXQWLGNB0BePIJE2pWqjwBK%X3_E_G4c8p>yfYfGMZR&TuJP|BppYXWEb|= z;|%}Pldt}dD^}2_+9tR|`20(*VCge%jkBYz8>pEkx_oGllEecI@_G`zRL?FO8Es+~FQatgB%D`)B zMryqHq9Iw{m!dR8@6e(0Uo*pp6Gz$#?B*uA1LNyW=4YA=R)#dnn5CU3<|cca(sVR> zQ%VGMa*LOL4LfzX^rz)@6k2z``tacctCXYk#LG248)#$Xyh`8pZWQY%ar@aDEN3Z5 zyo*xrqsPzoJj?b%tt=y&ozipnHT35P9tW?d-MOQstJSKERrtL8z!%a>ZC+kp;>dg% z#TR1AX;>>x>+6@|6x|iqX<5X~Te7bhc+8NaPtN@s&e%Y^^OXG&20C|+B0;^v#a_0R zq@*MY6_??(y!4XU7Umkqv9^OYJ+E6Wi!ACAlrd1Pr5+2_4-e2(2=|*t%vK+$&9-d+ zg_|_UF>Tlr>%QM{#n;)Ibi&;xIe~i`A4Fh%*x`l zf#>}9C&%x4cm5nK)IWF5zSHBUMO(hj>i~N3Hfx{G@y-%Ar{}k5W#_tD%rcZuo-}(U zu$n|upQa;T*6B4nqD8;o|4`G+!dOv;a-`UBW18D|$KBsQdE8vUI-hQ@8za zQwE!it9_jnBgy1yRMZZR*LdUMJrBad!X7;6u&+~2PHr*J(UE{lFwIt`}QqH#%+0N+>2Ia5Ysns zGI+;9TWo~Bje|JdIWl=>;B#*eVh{7f`5BEM`U~5)Z^w0Ea}K--Vo{BjWLym7AHb^h zoa?@>lV_bGvLucv-r>w8C%1yA=|2BGY}kX56p)Fn@Z{-Jgpa>)Z6!8dPi5*xzeCvu+%4BHo36$v%@XppwrjqhPc6+_wVOxtUR-@$3N9=kl$jM zw1(Z6?(p?Z9$4I%LiPRz#x(7m6DLlzytsJO`h) zeeGqsUQv2MUxaWi5qOC3iA5RS$s#tuxa!ff`K9HC6pc==m8Cc*$rKK5?x#-U9rN?^ zhz8Uu<_*dB=`JkJO=4oF`)h-bq=oFn0#gWJTbX<7hMo7~LS>M6ho)P4ax&Jm(B8c* zc~-H8OxNVkzrVvR7?xsC=1Jqqc)eos9m4w3kGku$Y+}@p{1xd=jahtBvDM&SG&Y@CRHnI(bKE{W3+K? zjK|VUQH_+x$#oZ^44E!pzMP_-rk#1|MnevX zMAu1CDnGKHx}vz``#s*Xf<+_yQ>s>x*h}f%uYG;WLn)_EOOn6XoxX`k_kYf~{}3ba zS{nCROXv!QHIPNF))<{-P-=46?x``(`B3i8``qNPcpkCH8ewX^rnGeK#)quJW4YuK zIrmX}$-8%Y2E$dyZ_|}X+1j)e3D761DXQI@py?T8cP=*<({X1V(-RD<=$>$vmW{0) z(!QXlqH>$=)u^Lcgpq^5zM92p)jE;9RtpD#7lHx;0-~Y~{nIYeJ5$WATy^!yNKT$~ z*j4@UqdJ3Mhn`STdrW9(-0-i52aHpR%P46b|EY2AoTlE%)T$33&X9A8i>2u(@Z-e` zNo)QK=K0ry@OOaHKl#uu(Xk#8Fgl~`FByT0no%uK@y|8*=; zk`AU*-`->G-rcPXM6sW`_w|h}Cm-;;ER5!D6Ve~Cmhh&kt*Oxi?4f%_%;wLL<^vbs z+(P2cJQ}<+D1R%?dF)t_Sbf}+CzrlFIo`+HdKyWeMZ&sE)pKf#lA5ipEkbIp`}~wV z`}vPE3rlzRsO~&y`)v)a^rvDMJ0&$td26l(Zud&?+v!Fft0j%J+?8`FJb}r{2!DPmgP(4J#)X@OJBWuwY;<-q+cvyUzk1|>oMC5Ji!+ACGPMBy(U^VS##M% zU_yI6wu82pg4QJ`OCoX?7Z*=tnB}z!mHhbfMw6KAUHNae4~0ZU6&uwsC)N#4&nqNi zZBTG%=bCSix{%iztghm#!;#j!TBEEW7V&g7 zbzd8SV_mdU$3d)*^{J}n$4(Njtir&#ko)&9J8YahL~cOBPe}=& zefImMuJM`F(9qD$f{ekX*naC^3bB)2U^x6O-ar**C8`Z_lR-$CR{=Ih?H@2G&JlEWaKmDe=U6LlW2w$ zA8wAlThwAg^ne*c%E0TXsj2GfQyjj@$wW*>JXYvWHz?~^tQ~7FLPTSg{5ZvuDoqq&w-n`fmFySzAp_jZD7mAV70|ceQYY*jz$lA{EDplP9s} z%v7GGr_VY|V|DCf1IWujoW>FsRcQ{?HufIAq~EOW_LHVG>OB!)VyLv&n1v@MIq3CU zvvDZbeO2#%$Tdh)asF^a)neAcNy+n3>GUN<`sKkV#m<#f2W#B+4ZT^{dxS}Op~@mT zd3LPb4Z~Z`i?L7$s1hn`bC)pxDy&=w+#TIgi$Ip`%k=_aX?s?TeB1_(gz(_Hj>f+i&lL zD{8TLZUzQYQc@1dq|xA*BJ-6N00TgI+NJLETU4b#7di}wavg2V531k})14Yh$*^qA z9j)AE&{pJR#ZH%x)ayDkH1k$&`Nf;c;_@O%3XTy+H$Xe=eAano4q{y#Q1X}B`MRCS zAgt=UwS@Fe)u08=$70j7GM0H#+ZKo@-^`$r5eR+o;6X$LbK=_|VH!l6 zo?*`WBO~TYY6I;vnXRLM4@l<+?cQMaqnnGCJj>>#)=+Tq@tq_$V99l5jJ{bnoll=| z=q{}TPEES7>OacDf0(5HXYu)u>ep{q3Q-Hon@_ryFfuZ#B-RZnFmE>|D&q;ZBF9l? z3G4GmjvR>;v#_dBL8VD#^j#>Inqb0>KQ0)BwPwFPnOtN)xcU2q2#VjM5)Ys`+M1_9&Us_6 zTnC76dHi_L?cdjkI^=FVOy<6eVQdzUVktMJ>qUl!Vsnx8^jIm@rlu$Dvw1@>3oDgIS==4t zj8w$vhbUgY{2hfPA0J3bSw+L`_Re?d)?5e%SO47q#7%WM3`A9qR2wr@k6gZ)nCXyrQ7Zk!Odr3yThDdysX_oCIqFlNSof*p zSw=Off;68WTyh|ihcX{G_hq6K?5|ZlapH@}sC!ruNB8gXeD}&SPe*Tcs^VYLG5-W* z{9_L1Pair>UGcoof42siTxn&u=9oEB2nwiebtF{VqyzdqE%0tf!3k!>j+lKZs zKf)+)x?a&cIk)7QVs^u!xw%;(Aj`Pc^ba^@nOCGMs9g6kM#k(V-Na{Q;;ABfDT zCc@9EYsNJtIXV99smCTA#Rc&^KgL`imgqD&{0YRVxaD#0KX8Cd77!8&F6uopxBkpp z0}jQgn6J0%G9T9pQ|FR>zn-4iFRs=zdd{Zsh>f}icVd>zEbu04Bn^yo>CK4Uby{8vejRbgkoZ(y~wFLd>>XQr3yCiwZ%5eW_9=~r4lMoVF&_@7adKILQWu_K<2)|(|G zOSzV)rEeg8BG@=~pf~LtQ*wVQD$+}rE-4o5B*~v8jzy<%Dn`2CP~9q$&2?;b1qz#$ zrJun}`xGeRl1(Q%0TkO&|8CV-Pcqrn_I4Y|m+qBO7VywX5IrkEOt*I&{DSfcWe+v8 z$h)CJ66tqXTPeeDZtawj{4>@@-5|0XxBWjL5dW>|`5%7hPO2bDbi2O|Q1zBQD)s}P z%Db&K^-$2rdw1QkGH=c?(}b0FrXEZf=d_Rc@NPtxYko_1d*I5{kVc5L3TwML$ zg9l@sWpW}j5%zj3)3Gb&$B*MrH+;KT_)xJrmTDot2N-eVcN=+Kog6-iSP+FkqKXAV zY0$re`9&pX#B)$%@&;aDIx?z-SbE!2hB*B06Xl4R>!`Nwka5j+d@cnFkvibvVx?WCke}F`yRP-sMDhh*$ZBrM zwOBw}bd!$B>u?<|GtF5_)K*eEM;=859lTRU%(9Kij~sBjb9puoMK+C|GRNyjhkQJj zr(<=r5$NSPO{Thrr{^iDs1|;XmpM=NwAjhbb*<5BI(mDD*2O~53Sb(ms;J5UD?JCF zhKXsXshf2a&l3j(=i-Fw2tlk#-);1j9~D68_FJ!T>G|iCW$QT(9&`aQj4ax7U0}IvG``h5C7^Q9hU?buU?0@U zgZ7OFPd3dE^aN@#dcmQI?h39Ww}fL&c5Wzg8XudUH(f~|*K=w|F|m~Zj?ckD=pUOQ z(d|L@|C)KZN|w|%b?B~j(018bPn{vUd`I}P#iyZ$6ky|;6{nG} zpNsRADdMhx6nbk^8>6SGnSY@&aKh{M4q10+&?G@xlBCz+;+^hxKL$PbdHV!<-AUqQ2> z6vFB{tm8RRz9EhlweBo}>C?~@s}q6o;dx@cRHd#D-Tcyr)wgXPu8uzOJdKkskyRM* zz#+7pgx`IHXlg>jsn1W8@;0hFZt$GV$))YXlATkoJ zpcWzc25oI^Q`6+y{%L1v^`)d^S0QMJ}?r)j~ z?U8Wd%}|^QR4+qpFRbSS+{N-Y9KZK?O4z@ z?|((Q>)F2N&M5sggrn-aPgX(@SikyOm0(e-MutAYPG@CiD(I{qA7b}?-Z~0|NRY|j z#QpH`tJU}Bn6umsdu&p7UUcVr&D2S;?~Sn;3V)P2l1<0lR>&sw;JwO91i*?@xMHLklWYh%kAHT&Vdb&Cy$dgFA0gwj9 zz=r{Lp=v;81^)mX4UJ}`B`2lf>8gE!2Y?G+#}XE)uMl zQf1WA!cVgZ_5M_RWEQl@hZ&L$p`!(G03EZ)c`l*=9&s!(WQs^w8gnXhn`zL%BXZ)RkiHbP>KNW#sCjsP5IQXI2-sPeXd%_Bih=(pw;M*$>z*bjw1v) zB3a#Jl(pS|pVzYc5r0zuVE~fXfha6_1JAe>));|}()cla^cy4 z9e}HAdLAV07gVrha#}i-JSS05Tu?z+f>ij3C$M!?wsZXMD*40v{!b~9|BGv##7>l) z0qcp3m{SYC*N0fdSN;J zgPV^Cs$d)P_#0~K9li_jc;ZB0Vu01`sqGyRH{a$4?r7bs(C5E-GB-^`nab-?@3HWg z_+(&RhsBM#_GjMXw$Z z(66MhD#p@lO~Yx)$$={Sf;gq5bkrDJol3wN9692jK5YCk>IFga%vzRp8mOrm66M10 z;vTBky49-)0(WF&WP*mN_g`qy{~~t$eF6Lb1s^*4(t#df{OigZ**3iy5zpt>{1x$hCDkWc#S2+~Pz9>f8v_DJZou z|61zmVgN6$P=Xs#Xc7A0xpRb5K+p~lPD9s5i69tLHrPEkWGYM_2RwXpYrCrK{3W17 zLFXkRN!~bi{ZDvv@a45NImY14%^~>9&A(S=PN^sz{4P7x^T50}Z{9q- zZD7W=MBhqZU%y7%V&$2-8UvXOqNN$v3I_K`X)f*{L|w7GsehVr>(<%vPOr(HN>QW1 z!eyiwJ*f8OyeRI$;sTh>d=v#2Z-onvt6BtU=1;vnp65h~U-RhfNud&vJ7gT|>Nig2 zzv7lntCN$G=oGTeoA*mpf*Xte*!wovX}D2fQP=JSW(FcHgJes0yHjVhsF^zI@$fs; z6HyY3&HxS&wN%vzXPEdMsT$Oy5yw~?M zgI{#AeqU~8v-!r{wCb5auD;MumU(qW6(>*psy*uBJ^Dhqye({VhLgCTVh|_&I)liX zK6}aGsP8kbesr(`#BI?N)PNXWVh1f57K^<6{CrR^3ITuYQ!v^KIh)vIr7ygu;P6c! z?vv<6!d!5dMP_*X9SYv&Uz-VL5{mB5_YrSU8{A`#+|*wOdN$=`0IgW002f!q(B7WI zPzG#mGa(aOyhj&nNtvD>;{WmD2wZS9B#Zjn<#!=Fse?)aRa zQ=`o32UlALH-yndI}$|*$KfIO3rM*>;x3;=M#05^oDk&a*L`t8DQJ2X=!&?vKeMw% z^qPduE2YL0))jxl`i13k_u<~*r5xXavm0~CYd7bti3nS#qo=gyQxTWq_-)J*4j!I!o8v-{wl>Q^&3++BK zj@CoA6H1ie`O(xK+kzdNt|L~;J{#Pc(ORhn|+!l}(k3Oqj#u_S@$yBEHN{Rj`;t(JbGrB|!9&b#(z(uyLSd`({|`Hydq&-HAkcmH)LXCE0Ym zqXd-$ebfd0dydennxw?f!M=i&Uk2s8i{>g9sOgOyis03SE)aAxyWf%gbF&0U%eUzT z*rBdKbp~CEQ1B;`Qzz_v3Z2GFy;hb{m!$z8(3e^QP=KyKbm&mfwJkV;yhV_;jSeKt zz`(!ZKV8|bwD&iWg@cw<-)wEO6b~!&eOqY}dO*nQ2B`Y*^@u)`&NeKd z@pap_7IZyL(QQ)~n(oO3{hVKvFR&QIn$IVJgZ{NQ>VG?4|4RmsfHePWQ2YPRbon1Z z2kVTGjpKO~C_p^}=s*=|HeY1ib~`zlbJK!1ceMp@Pmh_-Lr4X`Ll|@OsH3Zs^YP;= z^E|;BGL4)2N*SC=S~uTdR${0SPEC({zi#!lIY~>HYIp+EhYQoO=u-~_&qXA>f4;|n zn!r|~)Q9Ut2nG`cw^3H*#SPT!A4yiWhlX^pa%4GCabQOfT6Lw>_-)w(fv@#8h*WK= zlSdU1k#L^?-%4vBreS+d&%4XU5=9>2zEN~>Ip`uN{d?Ei>&dyzrV@Y2&d#o{umAAj zMDW{-ke<413tov&%)0~8f96e4!(QYIR2WYWYqzX@_wJF?(N`nw*W@3?$G;+~Pj&SN z$;mr|_s|i#^dI|{PStCPP%O9I`c2^f6Pw=uzZC!ESNwYe!SRef?CF)3-<(@?3qsPT zLHI)mA6l4!XER8YeHY)fL1XFr@$_VvWpgIJ3f4+bp9)eMg+C8E4Ma@%L-r>^f4>BG zRrz|A#4IF5NCHDGIc8kx*p;Nsxx2B8FjGWDMO~>&5HKi(xgq>7P*7~oKSM!cANJzV>@P$WCT8Z{ z{rvn;-x?G<+XQJ9rhCmc8#ftvc~}#!A*^%vIcw_^U|j&V7=ERKZ!moq!U6l@!WYM) zr7wU%`BMZ~^E<-y-$Fq(Q3UUdvGBX?=!|05xF&*p=FH|kC7Qp&Kx|%%HWN=W>Ehww z!(433wrv!ywb+B;LD2Ol-K`~d5F20V)X5VkHY@N1zEU9z!L;VpYo^oSmdOr;F;}9c zE8G+SYlvMiqr&T^on|*AM%y07)AtYZBPI!+whKECSv zUOql5S(Il`#lY5M4(S!(2Na~E$k$D8IVlCtUI0CpFI{1JB-f2U2)iAdjs`t|bC1g7 z1{|N$AQsD>=VYC>wcRgsKmmzPJ&cYG)(1icO6Qc7*m1k%?E_79NNJ^qfQsgSs=5ON z1$3|;ENTZWm4^2`Nl4JvQ>duV|B@<3waGhY#r|DwEud*rO;^#yx3|I3*U!HO(Y)Sj z>e1g&d(4UZ2+{s-O#=Kt4GW=kXTdHIj-8Ko^;L`PO(JO>9(uNY@0=@yMU=CMA}y;K z7uVw;uh-N&eC!xp18+(6Uc6rm{VU8bt)CvK=T>;gf zc>fD15)}Bab^y^M`{DTXll?L84#z;rJBJ&)e+$U&vIe7{xso{c>^VxIrmwFOLsi>t zjj)T$ND~c&XF1ah-n#5p6sH(&U%_~&E2_kr@Eb8Kio`lJbfD+bw=ar z=|Y;X+SE~$ zmFJS9cAkL~gR<|=+SZGa3Pb@!M_oEOv%#+92?an9VX{jx0m}ore9^P4wx0+TVR!Fx z`NH7*=?~KmoIM4)h3UV^%9E*te@R)HX6!?Q1a3W z3$-b1AalU#wE%%T1vqP8VAsvLESv@8Y$MZb;uURVS|s?iWVC|3mhcwpQMIwLiQbk7 zf5!JPgCk`-;jY~F=aoO%4^kj~x-=#tLC>y6^mE1rdKab6&kVIS1Je zQ9CCYNtdpdqBKA*FdiY1;2H=}Toe1K8os+6Q^qodjU>{?>kD(7f&{k@|92;nJ^XJ= zo^o>Mk!6RJCX|ZLFkA);0@Wvsuu4upPC)jR{K;H7Aj?%l93@Z*vxH&>Hhu7>q=vleW|P`_b$Vu?DVuTN0g z>sPOuZi-n&3fW-neoZmg_WK7&MZ<+Vqb@M{$MeAVDB&~~<>$AGLC!Zu5@L2foB`83MLJC&SB8=XU?=Ap3f+r`tYB> z1`A)Da7A=C+-SILgsYP$aFKh7QxH=F7MejJDcMv7z7E`~Q1OJq=!-HqOT;XV*YC=Q z0Gy4&RH$rm3Sbf4AfCNJ;wlgKb00WRM~LGAV%|a_bC%GOVO6R8ZhIx7&#@>?5Yufo zp|=Nd@c*eYQQ=Iz{_(nOLR*fO%mK^ackgcy?HkB=QQ}tmmX>2s*Q$A8`D`w9FnfNj zZVt9iKxt;KpGHU3mX=!b5kqGyp zsrcmJ0lFQN>Wpc0`!PTtorA%UUkrS6`a0qjggRCU>qoPx)z#IDi;F!yJ)dsqXEY7Z zU`IEYm}mVLarmp^W$a4!P!X5E2By(8FvaEp>3-rxgGvL4AO@vpPB6+52-G4<0T&DzqP;PlLSm*+G zyfT^0;R`5M7?K})=T7`^VFUTKh+X0t25z__h`Q~}nLG1V?iMMos$0K~I@&e#_!S(1 z)8%s!m$Bn2GPzlOX1~;`mzy3SSVopA$&E@8H# z4=n1ih`V=>;kPr??EMhKmJQ{Y2>|?d>QX=(ru~B#SUE!sS(1=1J zPL*0_)eb`9g5sT?-uOEM=pkLvane!L7iFCMXq1Jjy+U|3A%eb!K(~ub7FA9WKk?=s z^Y!wUp0N;x|FnU_m4?}abdZsuJ0x?FX-m1dkkB|IcQtRqkIzD4} zi1{crJbPZ>K*LH@hVn%ECIyP3_6`Vv*r@&e{YO)dVBfvor{te<8CTn;_oRogXwm|` z@eu$UJEdTe`w#9yMEOsQV|A55&kw?7i92xDYkTk?sk*Py;;-GAe+vT7PHS!-!ud!d zy#H6?v_t!-D~6aOqSA*ab0W|Uh|0VleR3#EO(7^*zVh7&KO25;UY8JrRhJDTi}ZB$ z0muZp#m+B?b*O=00Wo=ph{-3=?dT(*0q|l_+E^!Fmz~5|$1_&CFecAFfzGI0v!;*O z+JuuCJSU*e^x||aK`iNjGXT~wIDOh0?P^3jLFE3+9{}hRRAUMC_Un)~vpl&0@GSo9 z^&InD38@zz@H|3oh(Q-w$4}ao#eO+a~wGv4}%(jxz?em9n^h~ zr9-vMgATn6EM$E0m%A)sEbj2=tKN=Y3S4B7RoPN5TG9yU#;t&n?|SuD)FFE%Q)hl1 z5+4X==nI;9$97-=0;vt!YwI0Lt@`*;kca2p$B(&%ArhaEAiTZ3;XTmQ3m8EI&1pTo z=m!ss95`Nl9BGHe0M?8R1MQ(jg9(w~kL_%2Qw5)d9=Fjzwj*7QgU9M`QNM1R~D!bMuuunho6u4wPy4EMQ_mXMv$_ zGp;bw7Gt;IGY}4k{aGw=I{}MMpY;*_ojN_5h+Z(5R^@)7PY4!Vq8l!*Y!_zc9s;Ee zc;oJ{tqEE_9o{#ampO;5uH_GS3w?#i)ag2$hRG9~p%RU5u~IiR9RjSAMNw~-Ua zpQ7FP36gSltKzaCn4fQ*E6YE#YGqsV*J%kC#+4|{Ev3zHJpPWgHW=!;C$WFcE;_RvIX(5`~HtcjhUm3`#R+OCi zhA&+^C)uniJ(R7%hoW@bvAS$bAG+$E#K&{W$jI3L1x?g-4>3;$U7(PYyv7RpF<78L zAz;bDg1G&FkuLD$OzDI4VN?@ljj2}_8#-{HMnNc=Y$0YI3_py_2QP@ zrvfH;Qiom9%*M7nv0*wc;R>PRp}LjDx5OCNy>oYy=7`YC z&A6z+*1U0;ldy%Em&KC|1D_KP3@4~_sA=7Q4JIPcK{-Kny$=!tghT_tT%$;nv197@ zQ8UccpH(e^1kqPPA$Qa405#W#GH?A}MhrdC;VEcPS{&CO!!%^w4Ug%c)WAK^0yCN- z!@{;nPO5tSItvXHCy$7T0C$Wq-ke25lvuCjd5ZC5`sfM+7nk{!=oZ42`o~cnj z&4ha|ep!W4b9Beq2R*cS_outZw7})NS2{dV`?m4#&RR z-g)y2+8g8+yJRZhGboRJYyA5h7S&C_|_?M3njX`OP~^mvEpOZnO*&N5ox}rVp<{ zB$0B2Juayv3I^L;Fcb-qmdX1{(Dej^n`Y*v_aE-_)sRh0axkFKgWX4Snk7NmM-urHjs#Y(tG?14#YGhg>2J?q1#ep1Fd`SJ(~>Vxsb5zzLDP79*N@=aCy;pwR|i#Qk!j33ikpXLh-icb-Iiz7iCb2o;)myo-i3HBKrrNZqOypR z_+0#R7J*DdQ&aQeH7u)n?{!q(v|Q5F{`B4SySL&%1t6c`S7bq3C}J8x9epYQRU4-_ zbyKJ`sr~TJ@y?YuELJ-t?UP)l``~3QoN0s)h*3cr`vh7j+JHj}k}7X*vqE@+FS5@t zEvwPjc*ZF z(yZ8}k@^1EpU%<>0mv3b5O?Qn;)j1t*UA}aY0U%tFLkagb(XCxjUxiq&*!`Y|Na%r zUy{}x1BTo|u<+|N5CEWayCBeXZLXg6H)PnlH5aQQ7&bYS3%lWQ#k~?a_DvmH2)t1F zeJA325dF5$;&sX;OG;n!*r!H2KY3U1JHoBpc-1ObJrP@l*j}G1j7g)`A zqAwY{2eC|AKwuQ!z#C!H5wOC7jrOqqdHa$cv)T9wb5TbYLXU?+VcMMe9W6%1=FORy zAHwsEHxm@Tf!k;ffG;Mr!`%{B(Rh6huFr+JX726X=52^(BS47NV_TA_+|9N=ats6lS#V4l#?d z<6UeEL!&+s2^O8DGIDZd9}|(+Yw#=thaXZI+?U6{zTg^OF&l65iBDc8c?wcdRV}>W z7UK3l%Fe&*+M!GZO2MT2=PzCry}em^jqmC~`BNeH9&_@P9y_Gw&fp_*CdlWBkIAFB z?2ydYI(uDGS?DPFi==0NzJ1vFG1^1dah1#KpVLiaCH*lACH*r?G1E&iZpx?Lbv|K# zyXDMqImW%euW$G6-CMVA_4oCKHh0%fJ;6R{bc-oj$>XSRNNH(lP>}NF%TKlaNdDv5 zk3O5Ai|>qh8}7dH!i%`LxKsPLZ41M!Wu~O?iHbTPnY?)M0=?2D)dBu=w)Xb!XiPQ{ zVb*`SjbiPY12)#y!it-wD7{Qf2EIH!nU$5*+S)2)P#SgT&a3mnPmC=rEC_Eih-na5 zuV24zY-}tnlzdneeCt*~<%P?UU-e#l$4UxK&nG z7I#}$UoWz6U+A%2P~~wJ6e$waMv%IemX_*gWZ9TlS<%>$@$4D#?1>3_#@Ng2b(*|b z9vb=3**Z8t=4EDPMnBc^^0JSQ4?R7-y=1gXqE%b|3wYT)OLx&xl)~!q^{b|vo7byDQ=m917pztk#+uiw%@BK9@gj2lQ^<3 zz2EE?rlYCJ?mOqcJaUZhvdZi9v@{~C@NDL(^LhOEF^Ghg0=vZf_Zbh-ZQ8VH-@bic zQj+f9-v9lW2jdLuQ{sUg$!`rWu-6+F5<4G-`&XKuh!AiO@tx}H?zUN8bdilU(9rma z&C2lmrFit{hIQ+X*M+oi&)33yFKVc&2D=*H_xC>nR0?qiBK4Zpt1sWb9 zn4XeyS8IQ{>#?(UlaGfuF#2Vi8k(5oW9t*oZ;+O5tE=0>!uf42kY0iFWIS?3al=iu zr<4g=%OvUWkN2W9X)?wf?%1ZV~ z_O*xH0Wvs4lMoV$ii&b_82Rcye^v|J@Nmln|GJeoDP4T(sqd<*?d|PfZyea=caPx23vgO+y^y}i;7^w8H1hIJVhMAceEFpZwGYvj` zNG>dNMVi#p)5APDIywq1(;G0<4f^EERKJ%HTevXoT>SE-eBjy-KhCSF*1mr2i?#P7 z6;81q;yGW`5_UYxh%bH2U}iQ96#h(?L~*TK$|EW|nuUdBGNBh77ShPxlgH_N3kqCL z6R(idJkp+v&MGPdC39`h7zGFRvF!!L{UYS;&mNvixOtN*`0d>$%5Ohoy6#Q!ossS+fHF0RY^o1gS#Ri7KyHV=_eS$pV| z0t)_Q$6>`)gyX z_Bf*tW9{ly%QfBB5Kj>c&;i(#VNiQ%zmRS|d+0F;rx_XJ?tF9(aRWXQqN+%NZFM_;{;KPQM#6^4sRQ%;E^a$=z8pGnk86fp?{p7wQjs&XS}}rI*gcUd zTE(EimOHHK@(axiFEmRTH__5swHJzVarsEw7z#5X7K7FyWYSYJ;(}pSy^~VcI!`atTMn)Ym1|Lo-9!#?Th>92xL zqcZ>_ffr}!0GeT7{$jYH2&a0b@xdJ`r%v5^_UsB)zkXKPuMiXUS7^l_w&aIcEg=$w?d8*cIR=0uA=< zysWPFl=h2>2rX?eZff1ywa4m?DL)0@c7Tcc?Af|X_S_dQCMPB)7}mb|rLb%B@x0S_ zW#a2kY~WS9U9X|msTO#e=Skh5DUAeOuhg1UoxJqy>>sEQC_C*_Qc}z;EP}*oL(79| zKYTDfa*2tVxdmDXa8PV?bbD(nU+=xQmb$kz`7O=O&kYy{2LucZ4Z$H6Q$2|cj3+dO zhllePQ7Cb$0Z#$X9gFtK&CLx9YeHnw(bj&lVKS-Ya@E!~YkW|m@fL@~QyL{M(qCpw z(p(;*OyzIoKKa1J)bvg#NmNX1D?L4u+BG^GRI4O^Y&%ea*9zTA=U1Zz!3RFq&fd_#eIdnlwRSCij!ZX&LzNNU;a%9Uqn zX?nW4=GfzxE$S>ph7Q;6c+h!3t5h5D;~H575k?g0UW(2jTqPaLe7 zwYH>c-5aB0V;zl+V(YE}HCz#4-nnO=#O7^>)9ml@9vwK=2_UbUTBuFY$uY09gPMd-wLBBPUf<@SvFFw6y!R zzJ-+f_VbV5C(Bn(X=or#eKE;KX$75N34V&rHx&7|qVq%BzyK~;E?)}ofSWgg?Css$ zq!dh?ohA0{fi0`6UBTbqAHfx2ZYu7gn3x#w29np;HLY!J?yxM1G<+S?+AS&Bf@d|s z4KUt)c37*g*rCRYCxS*4p9A~)`SWM2wR+w?tVZ|adMFO$)i*WWROFnWe;yqjjmVHm z=e~Ww{udsKK|I@`u~Geo;(iHAt=`ATt=3tgO)>;(dL6c_MeWw6+@LTgRcz>EOZbZaT#!B?tEJum822EYJS(%ZXi^aULnD zBD}pzpkwOB!&62Gi`cgyQt^+G(NQFvG~owL9UU zJ+D{J+JtwFwY9_iD=Twya%yU2rY^yx_oc4x;)M(7 zT_zg;QfBzGJ{4}2{ATpHk$OHc){~iq1)Y=ken_2RnismJDp@TiE?)KH6ENp^Yo6*1 zz0oFKK|v(tdj`|HDSE&qFM+&4q&oLP8E^u75$U+KzW(*4{eWz;3nK??NgE?;N*zZd zz&tJAjNVBp&LGH+Ej~6jh8aS3R6TWSWN7GuFcWqOZX3A>ZEDzo&P~3V{y#eDS}Q6p zT3bIyFr{2hg4!@VG=v8jWv8XpG&G0;e~OBdUDY3cDR3Cx>gS=5mYg&mKsPi#K0Y$? zV{%e$_)vh~)FzelAJ8FHRa>hX_j!HwYN4dXIBh6p39up_LzM&RzOZ#?-vi#8dZ$kd z%gUBw$hYnKYHkaI@ZvS#9yudK4R;{9{8d9pGlaiKR1c572df^b)<{Jo3 z3Fpgwx`{>(66rb5qq;#@^FiQ5njK20LLPD)ZF$<0a`3(U@5k=^e$Q1#;z@*fomV6I z6AvK7>p2gpf_S6=UYZP7|8zJKKjllJ7oK=+U3Z@F!V<5WtA&YYG~jhrX%!P;L&581 fJc;`69d?ebP(hX3P4_`4@vh@aDvId}=e_?AJLV`b literal 0 HcmV?d00001 diff --git a/vignettes/figures/ssc_vignette_renders/sum_plot.png b/vignettes/figures/ssc_vignette_renders/sum_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..089b8e159eeca2a71fec1d5c5270a6dde5b8c92c GIT binary patch literal 45004 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 literal 0 HcmV?d00001 diff --git a/vignettes/speed_size_comparison.Rmd b/vignettes/speed_size_comparison.Rmd new file mode 100644 index 0000000..1e5f21c --- /dev/null +++ b/vignettes/speed_size_comparison.Rmd @@ -0,0 +1,683 @@ +--- +title: "Benchmarking - RaMS, MSnBase, Spectra, Arrow, and SQL" +author: "William Kumler" +date: "`r Sys.Date()`" +output: + rmarkdown::html_vignette: + code_folding: hide +vignette: > + %\VignetteIndexEntry{Benchmarking} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE, eval=FALSE) +options(rmarkdown.html_vignette.check_title = FALSE) + +library(RaMS) +library(tidyverse) +library(microbenchmark) +library(MSnbase) +library(Spectra) +library(MsBackendSql) +library(DBI) +library(arrow) +library(rvest) +library(xml2) + +BiocParallel::register(BiocParallel::SerialParam(stop.on.error = FALSE, progressbar = TRUE)) +``` + +```{r file download} +set.seed(123) + +n_ms_files <- 10 +base_url <- "ftp://massive.ucsd.edu/v01/MSV000080030/peak/" %>% + paste0("Forensic_study_80_volunteers/Forensic_Hands_mzXML/") %>% + paste0("Forensic_Hands_plate_1_mzXML/Sample/") +file_list <- base_url %>% + read_html %>% + xml_text() %>% + strsplit("\\\n") %>% + pluck(1) %>% + str_remove(".*2016 ") %>% + str_remove("\\\r") +chosen_file_list <- sample(file_list, n_ms_files) + +dir.create("vignettes/figures/ssc_vignette_renders/Sample/") +for(i in chosen_file_list){ + new_file_path <- paste0("vignettes/figures/ssc_vignette_renders/Sample/", i) + download.file(paste0(base_url, i), destfile = new_file_path, mode = "wb") +} + +ms_files <- list.files("vignettes/figures/ssc_vignette_renders/Sample/", full.names = TRUE) +``` + +## Intro + +As noted in the [RaMS and friends vignette](https://htmlpreview.github.io/?https://github.com/wkumler/RaMS/blob/master/doc/Minifying-files-with-RaMS.html), one of the major strengths of the 'tidy' data format is how nicely it plays with other packages, allowing for the use of powerful packages that can't normally be applied to MS data. After playing with a few different ones I wanted to do some structured benchmarking to see which is the best use case for various situations. + +The general constraints I'm interested in are speed and space, with a minor consideration for simplicity afterward. My question of interest is how costly in these areas access to the MS data is, a process that can be broken down into two relevant steps - the transformation of the MS data from mz(X)ML format into a queryable format, and then the actual query itself. The query itself is relatively straightforward and can be measured in just the amount of time it takes, but the transformation has a caveat that it can be stored either in memory (and therefore must be recreated every time R is restarted) or it can be stored on disk (which is robust across restarts). So I'm interested in + +1. Time to create +2. Size in memory/size on disk +3. Time to access + +I'll be measuring these constraints across eight different ways of accessing the MS data. + +#### Original MSnExp + +Not used much these days since there's a big push to XCMS3 and the new "on-disk" infrastructure but still provides a useful baseline. The object is stored in memory and is 10/10 in simplicity. + +```{r MSnExp} +msnexp_obj <- readMSData(ms_files, mode="inMemory", msLevel. = 1) +plot(chromatogram(msnexp_obj, mz=pmppm(432.2810, ppm = 20))) +``` + +#### New onDiskMSnExp infrastructure + +The newest version of an XCMS object, using a system of pointers to reduce memory load. The object itself is still stored in memory but is equally easy to construct. + +```{r onDiskMSnExp} +ondisk_obj <- readMSData(ms_files, mode="onDisk", msLevel. = 1) +plot(chromatogram(ondisk_obj, mz=pmppm(432.2810, ppm = 20))) +``` + +#### Spectra package + +The Spectra package "defines an efficient infrastructure for storing and handling mass spectrometry spectra and functionality to subset, process, visualize and compare spectra data." It doesn't handle chromatograms very well but is a useful benchmark for next-gen read and write times. For benchmarking comparisons to other data sets, see the [vignette in the Spectra package](https://bioconductor.org/packages/release/bioc/vignettes/MsBackendSql/inst/doc/MsBackendSql.html#4_Performance_comparison_with_other_backends). + +```{r Spectra} +getIntensities <- function(x, ...) { + if (nrow(x)) { + cbind(mz = NA_real_, intensity = x[, "intensity"]) + } else cbind(mz = NA_real_, intensity = NA_real_) +} + +sfs_filtered <- Spectra(ms_files, source=MsBackendMzR()) %>% + filterMsLevel(1) %>% + filterMzRange(pmppm(432.2810, ppm = 20)) +sfs_agg <- addProcessing(sfs_filtered, getIntensities) +eic <- cbind(rt=rtime(sfs_agg), int=unlist(intensity(sfs_agg), use.names = FALSE)) +plot(eic[,"rt"], eic[,"int"], type="l") +``` + +#### RaMS package + +The eponymous package, notoriously heavy on memory but very speedy and still pretty darn simple. + +```{r RaMS} +rams_obj <- grabMSdata(ms_files, grab_what="MS1") +rams_chrom_data <- rams_obj$MS1[mz%between%pmppm(432.2810, ppm = 20)] +plot(rams_chrom_data$rt, rams_chrom_data$int, type="l") +``` + +#### tmzML files + +I designed the tmzMLs to be a "transposed" mzML where data are stored as binned chromatograms rather than individual scans, thus making it much more efficient to extract the data with a minimal memory requirement. This was before I was more familiar with formats like Parquet and SQL though. + +```{r tmzML} +tmzml_names <- paste0(dirname(dirname(ms_files)), "/tmzMLs/", gsub("mzXML", "tmzML", basename(ms_files))) +dir.create("vignettes/figures/ssc_vignette_renders/tmzMLs") +bpmapply(tmzmlMaker, ms_files, tmzml_names, BPPARAM = SnowParam(workers = 3, progressbar = TRUE, tasks=length(tmzml_names))) +tmzml_obj <- grabMSdata(tmzml_names) +tmzml_chrom_data <- tmzml_obj$MS1[mz%between%pmppm(432.2810, ppm = 20)] +plot(tmzml_chrom_data$rt, tmzml_chrom_data$int, type="l") +``` + +#### Arrow package + +Apache's arrow package is designed to interface with parquet files, a column-based instead of row-based file type, with fast access to large datasets with a minimal memory footprint. There's an excellent package that allows seamless interfacing with R and makes reading and writing files almost trivial. This package was the one that actually made me originally want to write about this because it outperformed tmzMLs and other databases so overwhelmingly. + +```{r arrow} +write_dataset(rams_obj$MS1, path = "vignettes/figures/ssc_vignette_renders/pqds") +arrow_data <- open_dataset("vignettes/figures/ssc_vignette_renders/pqds") %>% + filter(mz%between%pmppm(432.2810, ppm = 20)) %>% + dplyr::collect() +plot(arrow_data$rt, arrow_data$int, type="l") +``` + +#### SQL(ite) + +Finally, another important baseline is SQL databases. In theory these are the "proper" way to store large amounts of MS data but I haven't found them to be incredibly efficient previously, both slow to query and very large on disk. Here I'm testing both the default SQL database as well as one indexed by m/z to optimize for chromatogram extraction. + +```{r sqlite database} +MSdb <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata.sqlite") +dbWriteTable(MSdb, "MS1", rams_obj$MS1, overwrite=TRUE) +EIC_query <- 'SELECT * FROM MS1 WHERE mz BETWEEN :lower_bound AND :upper_bound' +query_params <- as.list(pmppm(432.2810, ppm = 20)) +names(query_params) <- c("lower_bound", "upper_bound") +sql_data <- dbGetQuery(MSdb, EIC_query, params = query_params) +plot(sql_data$rt, sql_data$int, type="l") + +rs <- dbSendQuery(MSdb, "CREATE INDEX mz ON MS1 (mz)") +dbClearResult(rs) +sql_data <- dbGetQuery(MSdb, EIC_query, params = query_params) +sql_data <- sql_data[order(sql_data$filename, sql_data$rt),] +plot(sql_data$rt, sql_data$int, type="l") +dbDisconnect(MSdb) +``` + +## MS data transformation timings + +Below, I've pulled out the "transformation" step from each of the eight methods above that gets the MS data out of the mzML documents and into an R-readable structure. For the first four (MSnExp, onDiskMSnExp, Spectra, and RaMS) this creates an object in the R environment that is wiped each time R is restarted, so they must be recreated every time. For the last four, files are created on the hard drive that are robust across R sessions and only need to be created once. + +```{r time2make} +msnexp_make_fun <- function(){ + readMSData(ms_files, mode="inMemory", msLevel. = 1) +} +ondisk_make_fun <- function(){ + readMSData(ms_files, mode="onDisk", msLevel. = 1) +} +spectra_make_fun <- function(){ + Spectra(ms_files, source=MsBackendMzR()) %>% filterMsLevel(1) +} +rams_make_fun <- function(){ + grabMSdata(ms_files, grab_what="MS1") +} +tmzml_make_fun <- function(){ + tmzml_names <- paste0(dirname(dirname(ms_files)), "/tmzMLs/", + gsub("mzXML", "tmzML", basename(ms_files))) + dir.create("vignettes/figures/ssc_vignette_renders/tmzMLs") + mapply(tmzmlMaker, ms_files, tmzml_names) + unlink("vignettes/figures/ssc_vignette_renders/tmzMLs", recursive = TRUE) +} +arrow_make_fun <- function(){ + msdata <- grabMSdata(ms_files, grab_what="MS1") + write_dataset(msdata$MS1, path = "vignettes/figures/ssc_vignette_renders/pqds") + unlink("vignettes/figures/ssc_vignette_renders/pqds", recursive = TRUE) +} +sql_make_fun <- function(){ + msdata <- grabMSdata(ms_files, grab_what="MS1") + MSdb <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata.sqlite") + dbWriteTable(MSdb, "MS1", msdata$MS1, overwrite=TRUE) + dbDisconnect(MSdb) + unlink("vignettes/figures/ssc_vignette_renders/MSdata.sqlite") +} +sqlidx_make_fun <- function(){ + msdata <- grabMSdata(ms_files, grab_what="MS1") + MSdb_idx <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") + dbWriteTable(MSdb_idx, "MS1", msdata$MS1, overwrite=TRUE) + rs <- dbSendQuery(MSdb_idx, "CREATE INDEX mz ON MS1 (mz)") + dbClearResult(rs) + dbDisconnect(MSdb_idx) + unlink("vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") +} + +make_timings <- microbenchmark( + msnexp_make_fun(), ondisk_make_fun(), spectra_make_fun(), rams_make_fun(), + tmzml_make_fun(), arrow_make_fun(), sql_make_fun(), sqlidx_make_fun(), + times = 10) +saveRDS(make_timings, "vignettes/figures/ssc_vignette_renders/make_timings.rds") +``` + +```{r plot time2make} +make_timings <- readRDS("vignettes/figures/ssc_vignette_renders/make_timings.rds") +make_timings %>% + as.data.frame() %>% + arrange(expr) %>% + mutate(expr=str_remove(expr, "_make_fun\\(\\)")) %>% + mutate(rep_type=case_when( + expr%in%c("msnexp", "ondisk", "spectra", "rams")~"Every R session", + TRUE~"Single-time only" + )) %>% + mutate(expr=factor(expr, levels=c("msnexp", "ondisk", "spectra", "rams", + "tmzml", "arrow", "sql", "sqlidx"), + labels=c("MSnExp", "OnDiskMSnExp", "Spectra", "RaMS", + "tmzMLs", "Arrow", "SQL", "SQL (indexed)"))) %>% + ggplot() + + geom_boxplot(aes(x=expr, y=time/1e9)) + + geom_hline(yintercept = 0) + + facet_wrap(~rep_type, nrow = 1, scales="free_x") + + labs(y="Seconds", x=NULL) + + theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5)) +ggsave("vignettes/figures/ssc_vignette_renders/make_time_gp.png", width = 6.5, height = 4, units = "in", device = "png", dpi = 144) +``` + +![](../vignettes/figures/ssc_vignette_renders/make_time_gp.png) + +Nothing super surprising here. It should be noted that I ran all of these without using parallel processing to ensure a fair comparison, but RaMS and the tmzMLs are almost perfectly parallelizable and can be read/written in series for a huge time saving. Testing this with 5 cores across the 10 files resulted in a 3-fold speed improvement (from ~250 seconds to ~85, placing it about on par with the SQL database) for tmzMLs but not for default RaMS. This makes sense if I/O is the slow step but reading can be done separately from writing, thus preventing multiple simultaneous reads but allowing one tmzML to be written while another is read. Also worth noting is that because `tmzmlMaker` calls `grabMSdata` internally, the RaMS values are a lower bound on the maximum tmzML speed. The MSnExp, OnDiskMSnExp, and Spectra packages focus instead on parallelizing their query step and I can't seem to run those in parallel. The SQL and Arrow options similarly write to a single file that's presumably going to be "locked" during writing and don't have parallelization options available either. Also worth noting is that performing this test on 10 files (~1GB MS data) doesn't really challenge memory requirements, so this could be very different if a larger number of files was used. + +```{r parallel_proc} +unpar_rams <- function(){ + print("Unpar RaMS") + lapply(ms_files, grabMSdata) +} +unpar_tmzml <- function(){ + print("Unpar tmzML") + tmzml_names <- paste0(dirname(dirname(ms_files)), "/tmzMLs/", + gsub("mzXML", "tmzML", basename(ms_files))) + dir.create("vignettes/figures/ssc_vignette_renders/tmzMLs") + pbapply::pbmapply(tmzmlMaker, ms_files, tmzml_names) + unlink("vignettes/figures/ssc_vignette_renders/tmzMLs", recursive = TRUE) +} + +library(BiocParallel) +par_param <- SnowParam(workers = 5, progressbar = TRUE) +par_rams <- function(){ + print("Par RaMS") + bplapply(ms_files, grabMSdata, BPPARAM = par_param) +} +par_tmzml <- function(){ + print("Par tmzML") + tmzml_names <- paste0(dirname(dirname(ms_files)), "/tmzMLs/", + gsub("mzXML", "tmzML", basename(ms_files))) + dir.create("vignettes/figures/ssc_vignette_renders/tmzMLs") + bpmapply(tmzmlMaker, ms_files, tmzml_names, BPPARAM = par_param) + unlink("vignettes/figures/ssc_vignette_renders/tmzMLs", recursive = TRUE) +} + +par_timings <- microbenchmark(par_rams(), unpar_rams(), par_tmzml(), unpar_tmzml(), times = 5) +saveRDS(par_timings, "vignettes/figures/ssc_vignette_renders/par_timings.rds") +``` + +```{r parallel proc plot} +par_timings <- readRDS("vignettes/figures/ssc_vignette_renders/par_timings.rds") +par_timings %>% + as.data.frame() %>% + separate(expr, into = c("sub_type", "par_type"), sep = "_") %>% + mutate(par_type=str_remove(par_type, "\\(\\)")) %>% + mutate(sub_type=factor(sub_type, levels=c("unpar", "par"), + labels=c("Sequential", "Parallel"))) %>% + mutate(par_type=factor(par_type, levels=c("rams", "tmzml"), + labels=c("RaMS", "tmzMLs"))) %>% + ggplot() + + geom_boxplot(aes(x=par_type, y=time/1e9)) + + geom_hline(yintercept = 0) + + facet_wrap(~sub_type, nrow = 1) + + labs(y="Seconds", x=NULL) + + theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5)) +ggsave("vignettes/figures/ssc_vignette_renders/par_time_gp.png", width = 6.5, height = 3, units = "in", device = "png", dpi = 144) +``` + +![](../vignettes/figures/ssc_vignette_renders/par_time_gp.png) + +## MS data query timings + +After the MS data has been transformed into an accessible format, it still needs to be queried for a single chromatogram of interest. This typically means performing a search across the ~75 millon entries of mz/rt/int data for the m/z values within a certain window, and can be performed either on an object in memory (e.g. MSnExp & RaMS) or on a disk object. + +```{r time2query} +msnexp_obj <- readMSData(ms_files, mode="inMemory", msLevel. = 1) +ondisk_obj <- readMSData(ms_files, mode="onDisk", msLevel. = 1) +spectra_obj <- Spectra(ms_files, source=MsBackendMzR()) %>% filterMsLevel(1) +rams_obj <- grabMSdata(ms_files, grab_what="MS1") + +tmzml_names <- paste0(dirname(dirname(ms_files)), "/tmzMLs/", + gsub("mzXML", "tmzML", basename(ms_files))) +dir.create("vignettes/figures/ssc_vignette_renders/tmzMLs") +mapply(tmzmlMaker, ms_files, tmzml_names) + +write_dataset(rams_obj$MS1, path = "vignettes/figures/ssc_vignette_renders/pqds") + +MSdb <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata.sqlite") +dbWriteTable(MSdb, "MS1", rams_obj$MS1, overwrite=TRUE) +dbDisconnect(MSdb) + +MSdb_idx <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") +dbWriteTable(MSdb_idx, "MS1", rams_obj$MS1, overwrite=TRUE) +rs <- dbSendQuery(MSdb_idx, "CREATE INDEX mz ON MS1 (mz)") +dbClearResult(rs) +dbDisconnect(MSdb_idx) + +msnexp_query_fun <- function(){ + plot(chromatogram(msnexp_obj, mz=pmppm(432.2810, ppm = 20))) +} +ondisk_query_fun <- function(){ + plot(chromatogram(ondisk_obj, mz=pmppm(432.2810, ppm = 20))) +} +spectra_query_fun <- function(){ + sfs_filtered <- spectra_obj %>% filterMzRange(pmppm(432.2810, ppm = 20)) + getIntensities <- function(x, ...) { + if (nrow(x)) { + cbind(mz = NA_real_, intensity = x[, "intensity"]) + } else cbind(mz = NA_real_, intensity = NA_real_) + } + sfs_agg <- addProcessing(sfs_filtered, getIntensities) + eic <- cbind(rt=rtime(sfs_agg), int=unlist(intensity(sfs_agg), use.names = FALSE)) + plot(eic[,"rt"], eic[,"int"], type="l") +} +rams_query_fun <- function(){ + rams_chrom_data <- rams_obj$MS1[mz%between%pmppm(432.2810, ppm = 20)] + plot(rams_chrom_data$rt, rams_chrom_data$int, type="l") +} +tmzml_query_fun <- function(){ + tmzml_names <- list.files("vignettes/figures/ssc_vignette_renders/tmzMLs", full.names = TRUE) + tmzml_obj <- grabMSdata(tmzml_names) + tmzml_chrom_data <- tmzml_obj$MS1[mz%between%pmppm(432.2810, ppm = 20)] + plot(tmzml_chrom_data$rt, tmzml_chrom_data$int, type="l") +} +arrow_query_fun <- function(){ + arrow_data <- open_dataset("vignettes/figures/ssc_vignette_renders/pqds") %>% + filter(mz%between%pmppm(432.2810, ppm = 20)) %>% + dplyr::collect() + plot(arrow_data$rt, arrow_data$int, type="l") +} +sql_query_fun <- function(){ + MSdb <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata.sqlite") + EIC_query <- 'SELECT * FROM MS1 WHERE mz BETWEEN :lower_bound AND :upper_bound' + query_params <- as.list(pmppm(432.2810, ppm = 20)) + names(query_params) <- c("lower_bound", "upper_bound") + sql_data <- dbGetQuery(MSdb, EIC_query, params = query_params) + plot(sql_data$rt, sql_data$int, type="l") +} +sqlidx_query_fun <- function(){ + MSdb_idx <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") + EIC_query <- 'SELECT * FROM MS1 WHERE mz BETWEEN :lower_bound AND :upper_bound' + query_params <- as.list(pmppm(432.2810, ppm = 20)) + names(query_params) <- c("lower_bound", "upper_bound") + sql_data <- dbGetQuery(MSdb_idx, EIC_query, params = query_params) + sql_data <- sql_data[order(sql_data$filename, sql_data$rt),] + plot(sql_data$rt, sql_data$int, type="l") +} + +query_timings <- microbenchmark( + msnexp_query_fun(), ondisk_query_fun(), spectra_query_fun(), rams_query_fun(), + tmzml_query_fun(), arrow_query_fun(), sql_query_fun(), sqlidx_query_fun(), + times = 10 +) +query_timings +saveRDS(query_timings, "vignettes/figures/ssc_vignette_renders/query_timings.rds") +``` + +```{r time2query plot} +query_timings <- readRDS("vignettes/figures/ssc_vignette_renders/query_timings.rds") +query_timings %>% + as.data.frame() %>% + arrange(expr) %>% + mutate(expr=str_remove(expr, "_query_fun\\(\\)")) %>% + mutate(rep_type=case_when( + expr%in%c("msnexp", "ondisk", "spectra", "rams")~"Every R session", + TRUE~"Single-time only" + )) %>% + mutate(expr=factor(expr, levels=c("msnexp", "ondisk", "spectra", "rams", + "tmzml", "arrow", "sql", "sqlidx"), + labels=c("MSnExp", "OnDiskMSnExp", "Spectra", "RaMS", + "tmzMLs", "Arrow", "SQL", "SQL (indexed)"))) %>% + ggplot() + + geom_boxplot(aes(x=expr, y=time/1e9)) + + scale_y_log10() + + labs(y="Seconds", x=NULL) + + theme(axis.text.x = element_text(angle=90, hjust=1, vjust=0.5)) +ggsave("vignettes/figures/ssc_vignette_renders/query_time_gp.png", width = 6.5, height = 5, units = "in", device = "png", dpi = 144) +``` + +![](../vignettes/figures/ssc_vignette_renders/query_time_gp.png) + +There's a few surprises in the above plot. Most notably, the incredible speed of the mz-indexed SQL database. It's apparently faster to query the database and read that data into R than it is to index through the big RaMS object entirely within memory. That's a pretty darn compelling reason to switch to SQL databases (although note the importance of indexing them - the non-indexed one took 100x longer!). Side note: I originally expected this to be quite slow because I previously *thought* I was creating an index on the mz data using `dbExecute` instead of `dbSendQuery` but apparently that's not how the function works. This actually disagrees with a [similar comparison](https://bioconductor.org/packages/release/bioc/vignettes/MsBackendSql/inst/doc/MsBackendSql.html#4_Performance_comparison_with_other_backends) done by the Spectra package that found the SQL backend to be consistently slower than the in-memory option. This result was so unexpected that I wrote a quick followup to double-check and can confirm that in real time the SQL query felt just as fast as the RaMS object. Wild. + +```{r double-check sql_idx vs RaMS} +MSdb_idx <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") +EIC_query <- 'SELECT * FROM MS1 WHERE mz BETWEEN :lower_bound AND :upper_bound' +query_params <- as.list(pmppm(432.2810, ppm = 20)) +names(query_params) <- c("lower_bound", "upper_bound") +dbGetQuery(MSdb_idx, EIC_query, params = query_params) %>% qplotMS1data() + +rams_obj$MS1[mz%between%pmppm(432.2810, ppm = 20)] %>% qplotMS1data() +``` + +Also surprising is the performance of the tmzMLs - I thought they'd do much worse and instead they're about on par with the arrow method. I'm pleasantly surprised that my hacky file type can compete at all. Of course, up at the top are the traditional MS formats. They're not designed for this or optimized for chromatogram extraction at all so it's not especially surprising that they struggle, but the graph does also nicely show the improved performance of more recent versions over older ones. + +#### Multiple chromatograms + +Of course, the above tests assume that only a single chromatogram is being requested. This is a little unrealistic. While there are times when I just want to see a single mass, I also often want to extract multiple masses of interest simultaneously and some of these methods are more friendly to this approach than others. This usually requires constructing a string of `between` statements that we can then pass to the evaluator. Fortunately, the same string can be passed to both Arrow and RaMS so that makes the task a little easier. The nice thing about sending a single query is also that the data does not then need to be deduplicated, which can happen during loops if the m/z windows overlap. + +```{r make query strings} +rams_obj <- grabMSdata(ms_files, grab_what="MS1") +grouped_ms1 <- rams_obj$MS1 %>% + arrange(desc(int)) %>% + mutate(mz_group=mz_group(mz, ppm = 10, max_groups = 10, min_group_size=20)) %>% + drop_na() +# grouped_ms1 %>% +# qplotMS1data(facet_col="mz_group", facet_args = list(ncol=2)) +mzs_to_grab <- grouped_ms1 %>% + group_by(mz_group) %>% + summarise(mean_mz=mean(mz), sd_mz=sd(mz), mean_rt=mean(rt)) %>% + pull(mean_mz) + +rams_arrow_call <- lapply(mzs_to_grab, function(mz_i){ + mzrange <- pmppm(mz_i, 10) + call("between", as.name("mz"), mzrange[[1]], mzrange[[2]]) +}) %>% paste(collapse = "|") + +sql_comb_call <- sapply(mzs_to_grab, function(mz_i){ + paste("mz BETWEEN", pmppm(mz_i, 10)[1], "AND", pmppm(mz_i, 10)[2]) +}) %>% paste(collapse = " OR ") %>% paste("SELECT * FROM MS1 WHERE", .) + +print(rams_arrow_call) +print(sql_comb_call) +``` + +Finally we can test the timing of the multiple chromatograms both in loop form and in single-query form. + +```{r multichrom query timing} +rams_uni_fun <- function(){ + print("RaMS unified") + rams_obj$MS1[eval(parse(text=rams_arrow_call))] +} +rams_loop_fun <- function(){ + print("RaMS loop") + lapply(mzs_to_grab, function(mz_i){ + rams_obj$MS1[mz%between%pmppm(mz_i, 10)] + }) %>% bind_rows() %>% distinct() +} + +arrow_ds <- open_dataset("vignettes/figures/ssc_vignette_renders/pqds") +arrow_uni_fun <- function(){ + print("Arrow unified") + arrow_ds %>% + filter(eval(parse(text = rams_arrow_call))) %>% + collect() +} +arrow_loop_fun <- function(){ + print("Arrow loop") + lapply(mzs_to_grab, function(mz_i){ + arrow_ds %>% + filter(mz%between%pmppm(mz_i, 10)) %>% + collect() + }) %>% bind_rows() %>% distinct() +} + +MSdb_idx <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") +sql_uni_fun <- function(){ + print("SQL unified") + dbGetQuery(MSdb_idx, sql_comb_call) +} +sql_query_base <- 'SELECT * FROM MS1 WHERE mz BETWEEN :lower_bound AND :upper_bound' +sql_loop_fun <- function(){ + print("SQL loop") + lapply(mzs_to_grab, function(mz_i){ + query_params <- as.list(pmppm(mz_i, ppm = 20)) + names(query_params) <- c("lower_bound", "upper_bound") + sql_data <- dbGetQuery(MSdb_idx, sql_query_base, params = query_params) + }) %>% bind_rows() %>% distinct() +} + +multichrom_timings <- microbenchmark( + rams_uni_fun(), rams_loop_fun(), arrow_uni_fun(), arrow_loop_fun(), + sql_uni_fun(), sql_loop_fun(), times = 10 +) +saveRDS(multichrom_timings, "vignettes/figures/ssc_vignette_renders/multichrom_timings.rds") + +multichrom_timings <- readRDS("vignettes/figures/ssc_vignette_renders/multichrom_timings.rds") +multichrom_timings %>% + as.data.frame() %>% + arrange(expr) %>% + mutate(expr=str_remove(expr, "_fun\\(\\)")) %>% + separate(expr, into = c("expr", "query_type"), sep = "_") %>% + mutate(expr=factor(expr, levels=c("rams", "arrow", "sql"), + labels=c("RaMS", "Arrow", "SQL"))) %>% + mutate(query_type=factor(query_type, levels=c("uni", "loop"), + labels=c("Unified query", "Query loop"))) %>% + ggplot() + + geom_boxplot(aes(x=query_type, y=time/1e9), lwd=1) + + facet_wrap(~expr, nrow=1) + + scale_y_log10() + + labs(y="Seconds", x=NULL, color=NULL) + + theme_bw() +ggsave("vignettes/figures/ssc_vignette_renders/multichrom_gp.png", width = 6.5, height = 4, units = "in", device = "png", dpi = 144) +``` + +![](../vignettes/figures/ssc_vignette_renders/multichrom_gp.png) + +Once again the indexed SQL database blows the others out of the water, with the unified query performing ~10x better in SQL than Arrow and ~100x better than RaMS. Curiously, the unified query actually takes *longer* when processed via RaMS/data.table than looping. Good to know. + +## MS object sizing info + +Of course, there's no free lunch. The speedier options tend to be much larger in space, as shown in the below graph of the object/file sizes. For the MSnBase, Spectra, and RaMS objects this is space occupied in the computer's memory. For the tmzML, Arrow, and SQL databases this is on the computer's disk. + +```{r sizing info} +size_list <- list() + +size_list$mzXML <- sum(file.size(ms_files)) + +msnexp_obj <- readMSData(ms_files, mode="inMemory", msLevel. = 1) +size_list$msnexp_obj <- pryr::object_size(msnexp_obj) +rm(msnexp_obj) + +ondisk_obj <- readMSData(ms_files, mode="onDisk", msLevel. = 1) +size_list$ondisk_obj <- pryr::object_size(ondisk_obj) +rm(ondisk_obj) + +sfs_filtered <- Spectra(ms_files, source=MsBackendMzR()) %>% + filterMsLevel(1) +size_list$spectra <- pryr::object_size(sfs_filtered) +rm(sfs_filtered) + +rams_obj <- grabMSdata(ms_files, grab_what="MS1") +size_list$rams <- pryr::object_size(rams_obj) + +tmzml_names <- paste0(dirname(dirname(ms_files)), "/tmzMLs/", gsub("mzXML", "tmzML", basename(ms_files))) +dir.create("vignettes/figures/ssc_vignette_renders/tmzMLs") +bpmapply(tmzmlMaker, ms_files, tmzml_names, BPPARAM = SnowParam(workers = 5, progressbar = TRUE, tasks=length(tmzml_names))) +size_list$tmzml <- sum(file.size(list.files("vignettes/figures/ssc_vignette_renders/tmzMLs", full.names = TRUE))) +unlink("vignettes/figures/ssc_vignette_renders/tmzMLs", recursive = TRUE) + +write_dataset(rams_obj$MS1, path = "vignettes/figures/ssc_vignette_renders/pqds") +size_list$arrow <- sum(file.size(list.files("vignettes/figures/ssc_vignette_renders/pqds", full.names = TRUE))) +unlink("vignettes/figures/ssc_vignette_renders/pqds", recursive = TRUE) + +MSdb <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata.sqlite") +dbWriteTable(MSdb, "MS1", rams_obj$MS1, overwrite=TRUE) +dbDisconnect(MSdb) +size_list$MSdb <- file.size("vignettes/figures/ssc_vignette_renders/MSdata.sqlite") + + +MSdb_idx <- dbConnect(RSQLite::SQLite(), "vignettes/figures/ssc_vignette_renders/MSdata.sqlite") +rs <- dbSendQuery(MSdb_idx, "CREATE INDEX mz ON MS1 (mz)") +dbClearResult(rs) +dbDisconnect(MSdb_idx) +size_list$MSdb_idx <- file.size("vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") +unlink("vignettes/figures/ssc_vignette_renders/MSdata.sqlite") + +saveRDS(size_list, "vignettes/figures/ssc_vignette_renders/size_list.rds") +``` + +```{r plot size info} +size_list <- readRDS("vignettes/figures/ssc_vignette_renders/size_list.rds") +size_list %>% + within(rm(mzXML)) %>% + sapply(as.numeric) %>% + data.frame(bytes=.) %>% + rownames_to_column("expr") %>% + mutate(expr=str_remove(expr, "_obj")) %>% + mutate(expr=str_replace(expr, "MSdb_?", "sql")) %>% + mutate(mem_type=case_when( + expr%in%c("msnexp", "ondisk", "spectra", "rams")~"Memory", + TRUE~"Disk" + )) %>% + mutate(mem_type=factor(mem_type, levels=c("Memory", "Disk"))) %>% + mutate(expr=factor(expr, levels=c("msnexp", "ondisk", "spectra", "rams", + "tmzml", "arrow", "sql", "sqlidx"), + labels=c("MSnExp", "OnDiskMSnExp", "Spectra", "RaMS", + "tmzMLs", "Arrow", "SQL", "SQL (indexed)"))) %>% + ggplot() + + geom_hline(yintercept = size_list$mzXML/(1024^3)) + + geom_point(aes(x=expr, y=bytes/(1024^3))) + + scale_y_log10(breaks=c(0.001, 0.01, 0.1, 1, 10), labels=c("1MB", "10MB", "100MB", "1GB", "10GB"), + limits=c(0.001, 10)) + + facet_wrap(~mem_type, scales = "free_x") + + labs(x=NULL, y=NULL) +ggsave("vignettes/figures/ssc_vignette_renders/size_cons.png", width = 6.5, height = 4, units = "in", device = "png", dpi = 144) +``` + +![](../vignettes/figures/ssc_vignette_renders/size_cons.png) + +Unsurprisingly, the SQL databases are massive, weighing in at 5-10x the size of the original mzXML files (black horizontal line in above plot). RaMS is similarly enormous (about 2x the mzXML size) with an additional penalty of existing in memory instead of on disk. The original MSnExp object is about the same size (slightly larger than mzXMLs, maybe because the m/z & int data has been decompressed?) and also exists in memory. tmzMLs and Arrow do slightly better, actually reducing the size of the dataset while remaining on disk, and of course the pointer objects in Spectra and the OnDiskMSnExp object are microscopic in comparison. + +## Summary + +I started out this project because I'd recently learned about `arrow` and was blown away by how fast it was while still remaining essentially memory-free. At the end of it, I think there's more nuance than I was really expecting, though there are a few clear losers. The MSnExp objects should be almost never used, as they're dominated pretty clearly by the OnDisk equivalent. The Spectra package provides even more improvement on this but extracting a chromatogram is more obnoxious and you're still dealing with a complicated S4 object instead of an intuitive data frame. Similarly, the tmzMLs seem to be unilaterally worse than `arrow`, with access at-best equivalent and a make time much larger. Arrow also plays nicely with `dplyr` commands and has good performance when requesting multiple EICs, though longtime RaMS users may find the intuitive syntax of the tmzMLs (and progress bar!) friendlier as long as they don't need to extract more than a single chromatogram. + +In general, it seems to come down more to the size of the dataset than anything else. If your dataset is small (<1GB) or you're only loading a small-ish subset of it, RaMS is the go-to. If it's larger than memory but not enormous (10-100GB), Arrow and SQL seem like good contenders. The SQL database size ballooned scarily (but had insanely fast access times) while Arrow provided a file size reduction and more familiar syntax. For truly large datasets (100GB+) I can't imagine using anything but the OnDisk or Spectra infrastructure because it's just not worth trying to duplicate the dataset at all, so reading the data out of the files is the only real option. Of course, if you're looking at data that large then you may actually come all the way back around to Arrow or SQL anyway so you can host the data in the cloud or on a cluster instead of on a personal computer. + +```{r summary plot} +make_timings <- readRDS("vignettes/figures/ssc_vignette_renders/make_timings.rds") +query_timings <- readRDS("vignettes/figures/ssc_vignette_renders/query_timings.rds") +size_df <- readRDS("vignettes/figures/ssc_vignette_renders/size_list.rds") %>% + sapply(as.numeric) %>% + data.frame(size=.) %>% + mutate(size=size/1024^3) %>% + rownames_to_column("expr") %>% + mutate(expr=str_remove(expr, "_obj")) %>% + mutate(expr=str_replace(expr, "MSdb_?", "sql")) + +bind_rows(make_timings, query_timings) %>% + as.data.frame() %>% + group_by(expr) %>% + mutate(time=time/1e9) %>% + summarise(med_time=median(time), IQR_time=IQR(time)) %>% + mutate(expr=str_remove(expr, "_fun\\(\\)")) %>% + separate(expr, into = c("expr", "time_type")) %>% + left_join(size_df) %>% + mutate(rep_type=case_when( + expr%in%c("msnexp", "ondisk", "spectra", "rams")~"Memory", + TRUE~"Disk" + )) %>% + mutate(expr=factor(expr, levels=c("msnexp", "ondisk", "spectra", "rams", + "tmzml", "arrow", "sql", "sqlidx"), + labels=c("MSnExp", "OnDiskMSnExp", "Spectra", "RaMS", + "tmzMLs", "Arrow", "SQL", "SQL (indexed)"))) %>% + pivot_wider(names_from = time_type, values_from=c("med_time", "IQR_time")) %>% + ggplot() + + geom_vline(xintercept = 0) + + geom_linerange(aes(x=med_time_make, ymin=med_time_query-IQR_time_query*2, + ymax=med_time_query+IQR_time_query*2, color=expr)) + + geom_linerange(aes(y=med_time_query, xmin=med_time_make-IQR_time_make*2, + xmax=med_time_make+IQR_time_make*2, color=expr)) + + geom_point(aes(x=med_time_make, y=med_time_query, color=expr, + size=size, shape=rep_type)) + + scale_shape_manual(values=c(16, 15)) + + scale_y_log10() + + coord_flip() + + guides(color = guide_legend(order = 1), shape = guide_legend(order = 2), + size=guide_legend(order=3)) + + labs(x="Time to transform (s)", y="Time to query (s)", color=NULL, size="Size (GB)", + shape="Storage") + + theme_bw() +ggsave("vignettes/figures/ssc_vignette_renders/sum_plot.png", width = 6.5, height = 5, units = "in", device = "png", dpi = 144) + + +# bind_rows(make_timings, query_timings) %>% +# as.data.frame() %>% +# group_by(expr) %>% +# mutate(time=time/1e9) %>% +# summarise(med_time=median(time)) %>% +# mutate(expr=str_remove(expr, "_fun\\(\\)")) %>% +# separate(expr, into = c("expr", "time_type")) %>% +# pivot_wider(names_from = time_type, values_from=med_time) %>% +# left_join(size_df) %>% +# plotly::plot_ly(x=~make, y=~query, z=~size, hovertext=~expr, +# type="scatter3d", mode="markers") +``` + +![](../vignettes/figures/ssc_vignette_renders/sum_plot.png) + +```{r cleanup} +unlink("vignettes/figures/ssc_vignette_renders/tmzMLs", recursive = TRUE) +unlink("vignettes/figures/ssc_vignette_renders/pqds", recursive = TRUE) +unlink("vignettes/figures/ssc_vignette_renders/MSdata.sqlite") +unlink("vignettes/figures/ssc_vignette_renders/MSdata_idx.sqlite") +unlink("vignettes/figures/ssc_vignette_renders/Sample/", recursive = TRUE) +``` +