From 505360faa63b786db45ed738bb16063af1ac40fb Mon Sep 17 00:00:00 2001 From: sarahmadeleine Date: Sun, 5 May 2024 09:34:19 +0000 Subject: [PATCH] deploy: 8f54d3f42d4b50cb40010f0f82f3e5c3fd80aba2 --- .buildinfo | 4 + .doctrees/businesstrips.doctree | Bin 0 -> 6621 bytes .doctrees/calculate/distances.doctree | Bin 0 -> 23510 bytes .doctrees/calculate/emission_factors.doctree | Bin 0 -> 246989 bytes .../calculate/heating_electricity.doctree | Bin 0 -> 12704 bytes .doctrees/calculate/transport_modes.doctree | Bin 0 -> 10272 bytes .doctrees/commuting.doctree | Bin 0 -> 15161 bytes .doctrees/documentation.doctree | Bin 0 -> 77500 bytes .doctrees/environment.pickle | Bin 0 -> 611289 bytes .doctrees/index.doctree | Bin 0 -> 5969 bytes .doctrees/tutorial.doctree | Bin 0 -> 3904 bytes .nojekyll | 0 _sources/businesstrips.rst.txt | 30 + _sources/calculate/distances.rst.txt | 110 + _sources/calculate/emission_factors.rst.txt | 15 + .../calculate/heating_electricity.rst.txt | 32 + _sources/calculate/transport_modes.rst.txt | 35 + _sources/commuting.rst.txt | 64 + _sources/documentation.md.txt | 148 ++ _sources/index.rst.txt | 34 + _sources/tutorial.md.txt | 17 + _static/Final logo.svg | 1 + _static/alabaster.css | 714 +++++++ _static/basic.css | 925 +++++++++ _static/css-style.css | 4 + _static/custom.css | 1 + _static/doctools.js | 156 ++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 199 ++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 84 + _static/searchtools.js | 619 ++++++ _static/sphinx_highlight.js | 154 ++ businesstrips.html | 148 ++ calculate/distances.html | 247 +++ calculate/emission_factors.html | 1834 +++++++++++++++++ calculate/heating_electricity.html | 195 ++ calculate/transport_modes.html | 168 ++ commuting.html | 188 ++ documentation.html | 470 +++++ genindex.html | 118 ++ index.html | 148 ++ objects.inv | Bin 0 -> 1188 bytes search.html | 135 ++ searchindex.js | 1 + tutorial.html | 135 ++ 48 files changed, 7146 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/businesstrips.doctree create mode 100644 .doctrees/calculate/distances.doctree create mode 100644 .doctrees/calculate/emission_factors.doctree create mode 100644 .doctrees/calculate/heating_electricity.doctree create mode 100644 .doctrees/calculate/transport_modes.doctree create mode 100644 .doctrees/commuting.doctree create mode 100644 .doctrees/documentation.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/tutorial.doctree create mode 100644 .nojekyll create mode 100644 _sources/businesstrips.rst.txt create mode 100644 _sources/calculate/distances.rst.txt create mode 100644 _sources/calculate/emission_factors.rst.txt create mode 100644 _sources/calculate/heating_electricity.rst.txt create mode 100644 _sources/calculate/transport_modes.rst.txt create mode 100644 _sources/commuting.rst.txt create mode 100644 _sources/documentation.md.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/tutorial.md.txt create mode 100644 _static/Final logo.svg create mode 100644 _static/alabaster.css create mode 100644 _static/basic.css create mode 100644 _static/css-style.css create mode 100644 _static/custom.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 businesstrips.html create mode 100644 calculate/distances.html create mode 100644 calculate/emission_factors.html create mode 100644 calculate/heating_electricity.html create mode 100644 calculate/transport_modes.html create mode 100644 commuting.html create mode 100644 documentation.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 objects.inv create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 tutorial.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..60ea947 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: cd44277946ced39c9c532366abb48ddc +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/businesstrips.doctree b/.doctrees/businesstrips.doctree new file mode 100644 index 0000000000000000000000000000000000000000..fa9933508f8c16a8b7f05e44a5dad9eb5d01bd3f GIT binary patch literal 6621 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 lx~~->UAar)Dx$^^U(^Pm+(z z=Mz5jR=;o0_j&5A_xVnBb=4hZ+s2$W>NNAezSFb4@kDBEbtD!`rDI06zi(_T9nJR` zsa*fo{<(MdZ|a}ZSDA^d$)@v}sL|hdn(7gaCz7#@k?Oy#zi*P+J(oyktBd0+vPLwQ zNT;0P@v?Y%yyCY0Iq}NAvRopUG+ZzBO7s=%^iH>|uMQKJgIuXm7 z5mZEzk!)6NR6m!cB0Ytl#>Vo!(&&gpyE8_o*(cvuk&AShFZIVykDn8t5I;9QIzGK` z<@|WM$C#hVr&2~{{+e{Adww)s7mXyN`D8=|HmId=v-9m&jrm3~3+=@$RA;g(t{F>4 z=Q~s`DpjD7u1usi?n>R8&J3M)+TwI398LH1s$G!k3fu3JofnRTqbfC-NHW};Frr2{ z-5E}#I@6h+h`DpZiEKC*H=F_LwVaX4CUWb{j^-<|L}#aAW;d*MOJa2*moT!`<8F)_ zStG2n9yZqYW(<|KSh!=Iyp2siZlRG(ubCHKm(GWy5w&jP7WC6Pe@QC_E>TQt{Op;a(#X&ZiQ&xz*!tN#xX=4X0CvdheXkmCmf2=M_y)WL+_o za4Zwa<`OF9Nwvx7HBvD%WhxhDxY=GKn&?!on%Nn*)W}_=5)|oHv4+*8={19lMl#jm zE5kiTERpXCcc|H9WK`%$HQh6bsQI#qpUbNBr1L7Gn(CUyrf_$c#XrBh$BZSK%v-1N1}@A%*;Jx7YGs9M727nZQL_zZKQjL%f7V|FO6nbn_fC9e$J|i>OBMMg?13*v-ys} zaSYfdq0AX>D63|eBMQtH5Si`2GORyX&UF6h5Yo#L(o2b?Wj*R|yQDooiY?*18R5Kv z$T_C)XO;N};F*1ehEVn(l&hGO=HDT9GRIgAp?n8Ic_))Hn^>>@L@nmhY6#_r5z70B zl$GgdG~XLZMc3J=t}Vj*IfVBSBClFodm~Zxce0Hu8-(`j28_D+Ex?YFXwMBS;hw#3_wcQ zCY?QF3k{*X0HHjONU6>o4)}Y}X$$M62x}{oRh@LRPLdWESoOzap)IU8Agn8f#cKG8 zWc*LcBL5IDmEylI{>5tQZAUtGysOTM|Jhc~;@`~vS~{x6o^a|X$;xIVD;u=4vTCi> z)gQ4^ogYnQd(#=Gn!C0L@-_td9xn3ej(qV9`I&vz&w{xd!Q8>coVb5`ce?7@lse&> z%RAW}v{lgeBj}HF(aXBble6~REw%*pFoOCN7xi@u^VzDUiB!U-`VbrcEe1#VDdR#bQQ*y%4c1a$0ZprV$k!2!!)@$Xfw)uW<#a^7Zj+JZY1 z!9ACO>vJwQI96z|oS-O6rq!n|cAAPUNzye)k`^(NB&cKK>tdO7m-=Y4Sl4BP0JkH+ zZ{Y%0ba%~nA23c^a91O^SuSq5`cSN{vDVJ6-4xjOAh7Rdz(SK=dvKt!t;$==>TspY zN$sdwmvnsv$?6yNv-)pVSBiA~073pP7uiR;euH5Cl8ZTQfOJ(wVv*jQ5wnjqk5}c; z8#4x|t)tXn&DyFnNdhG790c`jE~=kl6^n>p7s-De64ZQdP`(m&Edsij3+hOh{dc%6 zWs=voBDl9Pa5bue_dx*-7PFa{OsBf4V(J1Mb+Xkt7c^+AB<)>D(%#8PnxKn=`AFHv z5a5q+fgK66C#5ZElHY$pa6iw*wJoejYc~be&GGL*DKznehq^!=a!K3P2Qg&Jy zP;dXFpVdEDT`5v_7J__+8my@ZI>c@DvRmW!z&TfaweU*+POcGXndY#V{yl-!988O$hQ$Tx1{FN+Xy_E~dvhuA+2# zyefy@JCRV{&J86%zCMDWeu#_eD^|ta`}UDN@OdPx&vL`^m9K9ipkL#HYRK1*5!@d# za5d_J_u2^!7NZ$-w#)uoY~YzOnT+ErfJ!`84c4s0-f;`MkBps%V9w-XYRFhCg4@K! zwe71o6YQo;ffWesG6pO(^|c3=O2!%-8EbIK*xQh-Zqd)`Myo4D#y*H3Z|5TW$k=BP z%sphxn-*Sa@BY!|&vICO6~R2f#VpTd4E6O0o78R!?6U~$5iV?{b+uQ@brGOziy*&> zARpr*`)bsLu|SEfRD(53tjK{dFj|2KgqJ-ITm;L0~s>VKroMJA%8Fi)-3nU45%_ z{1=;&+dT;EP6n)o&v~zO+Jj3agN=4-M>V=uf*>eOf=Ohpes?8T>7R{4y8WM+PTW z0>yQl8mw7dbuw!SVDZnaK{9wgf;o$eY1^Ou2Vv0-WevClfo)Im7*CWWw zxyZgUm_R@~xuAhEcn1Qzi3=O56U$OR%C5f`f$S$kda2;U2;?p3*K&0!lGRrItTtI)DJpmag1mx@?4yFK5X>$zruTWlI}yyyT+Bcfybpoh#)Wl> zpPvdof*|kaBKxY~lL+X3E@+?%K7+s>=E8;=MFrK5Qn6k^AdiwEy;N}gc%ZC~Rf9Fl zs!jn2P{H#M)R|n=Kox97V4JwG8Y;K~!Cl71HQleFX2A7&W>XHVE(A8lfYq=$?+LFx zxKt|Wq;`}$s~<$Nx?Ml3Tdl4X75of>yoZbIqk>;WFb|M1y;bm81oH?NGf)LzMPQF{ zVKr57!UUkyR;t08rB>$v^Hssw2xyoK8mNK`5ZGoeY^X(4Q2i(sYb65NMuzlK!8ihG za3KR!a0`OEk&7Crg4+?;tz1|Q72Jd1?&RWH9}u@Vci6C-a$p@mVD~a$HEhm%LDn8z zDiv&T&I-1;maE?)S$$bQt1nqyDJnQ|B2Zk%sll4XRR`He1Fyp#l;M@ zim$34C6`Yiko&lh0V?=3f_jLH8mNLVBd{-VVKr26+$5l=R;a5cZ2KZ3ciA%9_6BXUMV>KbfCD7Rf9E) ztIo>mDT3!AkTbcE0V3Fnpf+()14VEJ0=tY0t09722yTpvYl>j=z;l9TQ$%nx0=t0$ ztKo9qN2T`Q5{Y1_R{khdKT2LdgXDFOeqMK4T`4N~RRs9}7uiPzpG7c_kTJbg@Kpr! z7#A~81t&}f%4?+>tXW>QW~<(Jh-V|nVJ@<-3NAoEo4KF?D!39sZR4VPUMUzyAPq94 z*Ezv02;@dCWPl28M^LwNQ3F+Q4+6WB3#*}m2N2x7TwGHH>zf9g6EvHmEJqO7gA7;= zoAa(9+Jj4`f=+HjweGx5oB|ZracZz;ajmerQdIDK1bG%0*+&I0K`>j$nBFRQJ%YKM ziy5eb2?Vy23#)ln@D2od6BpT61@A>b`?;V2D)=yhx{HhId8ObJ2;@F8q?ZaljX)ma zLI$Yd%LwXAT+~1n95)pxs}*W6v8-yS;4B1p1{c@*c(~E|lB?Ym6>LFZ8yT<~Hs|d- z+Jj4`g3co~LbdK^YOF%?+NGb@nAMe{f_Eawo4Lq7DtI4)xs8nJt%8prn7g@{fhzbU z0=u6JtEqy|AjpTg$i6E03IckR3tE=#i6rF#sD+jkgYmBc3hh`mShLXTELuL-3Z92x z&g5c->g8i0^`qpn6@hHxLI%j-3Iuf-7d21@yAaqI7gj?CHzT+kxVYAN!3O7oHoGZv zb{hhF4+B=i=e!pW?ZG9JLFbVlp<4GdKfa3O^?-g}_gY;kGWaZle1wbaBZIFZn8(PN z-ZD7h44|-9s==CtRc8VO%HV7SHq3?9l)(iEax)j%R|Z!iplw{x02z!Us0J6+^J>8@ z2;@dGq?ZbAMgqRM*x!-*PRsL&m1A*Pdh1C?ndlBS*F0!u(K8%3w;(`W<;1dYyJ}#=~wSrG0kcY^S zULyE10{IdbGC%~!oe5N`3N@HmsRBiC76Lni3#%c5EeLKS7uP%q*i_@3x3Zg}EXxtt zr3_dNoAdS^?ZG8eLFZv3p<4ITM(#xNx>-N38?3Gr6}%5Y-o{1tQNc$L%-v*6ZxwtJ z!Q9Wq3{=5q5ZJ?9SWOjt1wlT_MfO#}@n-?0cB~q#S!#7wf&djf4?&&DMfJQ^uoZ!9 zB13wq;0gqC85c4@1-lT`7#B5A1vewG8@R9DwX-h%ag5YlC z;(C5Wyd8nu%7q-$TvP3w4=6Mwn|lz@om|iWB|Lzj?&YEeD&Y|X_8=ElLkW)|xG!>X zO(kq;bRLXhH)YONz7{C33w$a4g_-(7c)=^??qtyxv-i__%MRJi;L{5gij!#`?#Qv0v1mZ zIBh8iPb0X8xVWAl7Qc)@zQl#}Rl;$v1IlZK8mw7fb;>}163#+UXK+yim9PbYZREmg zDB*GhcPSUwbin$SfnOp~O<4gt5!fgLR>SJNC%pFHk}08cS!Sr#{q&Lhki2fw&+9!_ zSBerof*|kaBKs)elL+R1GN!i@K7(K$=3)ja;VTI2Q7){e5{^FyD7ItOV9jEybAb6O z;duz?OfIOSfZj^jir_YJaXmjYUV%U^<3jo>VHW}#z(hx+D(zdFakTB0juG4-Ws7jxKvVDCpVr_KT2M&NAkK{Kd(!zt`sRu zAjq9uWFINK1Hs%x#`KoLdlAfjE@q$1X?!8;q?RpypId) ztAtM@poh4i0k@!j89{xCi|V6;<7NQmwL%TnEU!8%Yp6+v z3{=DMGl6nDRt?rHw>q;`OtAPlr)-dA>pTQ_CKuRO4OT4mvK=&zhcsb zK*q?BUShZzf!x4_9HfB7V`|V=Ik2`N==X5Z1I2JR0=t6?t09K_5!}bQxTXmN(8fwiy0_}aRk=j!iop_h~X9lcq13sR}8l!pj)}10b;lZLEXtk_57mA z0R(a{8PZD(k06i-xsZbtFh~rKA?Po1(F4V>au!fz%hh0Fk<}2xFoHXsi))HueZ3l_G|BAjq4z$Ub6tFM`=m z#`G4$hY`$OT+Bc*d;)>p$A#4r!>1A8LtJ2AF?<;TeMu8^+o;nZG{@FS#NbvJ->G{3xS+LhV(MT76h`93pq?fT#leG<)Q}~VkZI{<-%$h;wA)l zJr~zh!n(Qvrw+}g7-ByH`vC^5hU9rKCE9~aW{6I1Lj&^qB$C(t`gwia>Pj)hXAtDW zTx1_Zdc2kN$7XlmO!unirxEaCRz{MO>-&*Z_4YAOWd~QQP@8Na~B!YTMwT=F!ymW1NHD}1ojXYR!a|GMu1=9 z0{iOWxC? z5Xv)1UJvW%^(m_>MGs#=kdJbaee`hrML@wFs|ITpT%FANJR9#k1al@AGf)p(5!fa! ztd<_GK!BHVfqnI`3jvLBK?C)0GXlGT3+s91;Wh;F9xkM>9_~g!cW^<6sfYU!^vAjA zfqHltfqjY#tD%QS5!@HJxYno1EzVt6?5619*f~J4EmMQxVyj_z-j!N=aLM%0xm!@E z&izo71xQ|-_4C?bb*1RxN(8x$i|nI^aRk#KV|t%G+=5_kPivBhY{pmTx1_Xd;-DTN5=FP#HSI=LtM;2L3|m3 zeTfUJC5Yo*50u^tHCVIs>KtCaf;bBSoxugw5X2S)w~>qM`2q8C1ac`C(pL~W5zr_X zbeMv;2|-`aMGq9jegyUdTv!c3+=bvi#KkoQvA)&$j;-C4KXUdVuwP-oYB-+vGOazh zRDxJ9_sds5N?u<<@_JN1uP<0#DS|luVxZ`bRf9E)t`4$~AfAU{&Lm@c3t}sR*~G;R z6vPz>>@qH_mLPT^z%eecuOMzlKsRtfH3V@Rf_o1a*YhLh-3a6kE~Kv@?ngi$=YkGX z5Dz2hPjS%$1@R~X`vMnMLlDQ#0}5@K8cZy-)@RC11Fk@nF#E;3|I}v^HvJ& z!6g$!=i~cOeXT36E0Mgm>F0Hc)s-TMaRk}mBKrv976fx68Pi)3woR&0SsS_764Y_kKoPD`gEfn=&ioCp=w4H`JeNyXUDbAV zRaYjR%~ri}QB_?{T}{=(NLHcaq_?>t~sUN5f*XNMDKC7SCBUV?61pOXCewB;tBSELn2g>sVHCVGe z>tuG2?i8vin&^b_G*Ig1(91evON( zw5PV!`O;*uCG+;j2H7yH#CLE* z^wpq`BA_4Uf(G9579CBYAzJeqOJ%x>7{w?-As`<0AWr zP#(d|a51M1_(-fO5{vZajF|n`vd61(@bw{~yo(!3fEaxOLH!sPRYP}*N~+OQ_Qn^G z5dVc6qOTZz8v*?fE~v(pSieAUf6BnsC^6pa=!qLF&f%j*ud4$J_*rVOW&!t3kYH-4 zQ7wX7&BYB+qiYb!Tco`(^p=`)C2Wulp3sA zuXK)n4S6{S!9AOSt5F2JV?A+$T~-iTZDb-{hCOqgtjp|OhGh9VMwVT;-CgrnRCha1 z&vm3maAOE=go|rROs#VgqSzAD4G8L52I|O6!IDXgbLuRl&Z0?P_aJ%Qsh`&et*#V_ zIe;MVE1 zK8&F5VxW%96fBv*I2S>M>fLva{}GbcXY})W*y>6VnBO7DuW*rl1ZGkrP;AGm!J5TZ zC$l~e7PtdGLH z6Ty5t7t>c^K7xRLhzlCfA!+v-Qj>tZCYSLx^V3acwcU~WT@ zZ{;HU2uu#ayq%2cEinIxVBXEe3>27uLSP@@!uklzzaf~9aWQ=b=D!foZ*f7LYch%# zPCIQ`tbUH*KF`3_C<5Lq-H974Rxq|Jl1(QQDd$oc*&um-Z3|Fr&s2joi>-I61lYOu z#hw?`R4j0x(V}6Zb{x=uXS7S!E0`=-N zHCVG==^Xt5*TTFGK|PCss!;&E<2-SL#R$Y$ib^0Gq|h!!@_a2L&jPHWFi`~etz6tO z>S`G0ij6`;^12=YUBdt!nJHK@fsy+cH@NR#yc@~u4*k4-+UiOXnEeRy<6LAPfjNv| zK1Ig#7MP<5<_lcRK!F*%04TU+YOrR()tRk60y7iAJeP~bfN#g<6S9t3qK19fC3 zVaX&$?myh%zW?wKk-R>wpVvcHSBk{^7D0ZQi|ivY6E6V@?l?7Av*7Av*5`uW^AXHh zT+Bd;xdef2;llbz%=HN7axSK?#3T^VPA+J`)i8G;sGAt58U?`nSUhoq#R#+%=5t7% zA7SKKfHf56>j>_XTwEnB^|fw=Fus#a&uL$Npb1{7t=06e8|HlOlxEAJT z2eXMkpn+GyycU5yQw`QEuHH+PMhQ3>2a6K~ z3d|BD$Ja1&EU+2^(}Cc&b8&qy=t`~ex$TVGy6Fn`0v4Ahs3D}Zu4Mh(`iU^=taM_*sqlT zXJ2+Bs5=;_BQpU@rZ3Jnyh07`d-6Vub7PF$T8AbkK=;n9sGIb|p~1r>eo4^;-u$;PH*~5Y)L`)U$3#CnK4v6*pH!deWKR zc;T7Wwaz_~JYSa?cNG%O72I$_H(qBSALfq&c`E{W3j-25EKbqEQgh4Hy;dR_d*2jW zvU|26yXPLp?s1{2`>Mz^Dl4=EbvJ^#gN#~R+v2)aT%jeX`w`T~8K@&OZ%d{Ij&+5U zfJt6oMe=$~Kd&!ZU1@4CVIfc=E7f4l66uYtF&(@IyN=LnuWh^X24^uTv}E_pL*ksv zh|`7IW%MMn4r-w#s8=DVS8!3ME=pD{xut4FB-356fI7zlhI&bYxD^TF7H$xp0&qJ5 znPNaflm8SQEC<4rE+f+uNwpg(Bh$66y(h8OJ}8EGMdsFSWVh{L>^2FZr~>wPX$OnJ zegyS#E^2vgO>3jvyToovUJoO%PcdLeW=5Av4H})bF{FN!yiT|Zsj+IXW{oYky85d@ zMcjzw5~(ixKy%uHI~&0bGjKJgfljQ$JX>%T689C1xLwPNzardRX(9Uf4~^>rn*u1qSTM%-fP_h4Uq$P^0@2+u3gfv?8nqYih-Gt1GM(3lQ992Cl|5 z(1~@JT5&59_brULUCWBUR@{!Drnson7aN(>n*E>5^cZfPsH>@~nQx@*H9Vk~EJAl9 zq1|;{Xxqk|HtIC(9q8UKLU=#Lro!Gm|_$;Q@s9{^Mx>3P|W! zIYkG{aWXlU$eJIm=Gq7Sxpe#sGQ|!fJMAgPPLluv{NX5q`T`lXxw*c{xm>WU(2}f< zT?ACQGBp^kaw9XFOJ)ypOVvjAEmapFd2QCuYlGDlwuhAnZW{wvV;bnhI!t@G9f>=| zh}*TO_}jzX2 z17g7CR>hA125gi0bQIZDFEDnMUOL}7b8yBGUBfT z4 zS?15!tC2dZ25Z(?t!2mm`o@_E>bYdprpCr*=lcAzLQAsRgrL?lP)BCYmP`ob)}M{; zTYtupyc+s>?XbGSLa+tF-N?YzmGJ zK5XdC_w*W7J?T`sYH7YRXJ7T`K6{|oS(c=4A%T8_8>pu!JdZ#=$AE+mm{WAH94r&f zPa4|I+1DOPIA4kwv{mNR%xeI7I9CnUln0$9D&TxV6M|Y#My;=JY;itMFDtYptIH77 z>lmmbGmlFq4|3DZM)yrOw;*}lsGrw$R##Xawj;P(8MqqLKquB=%EMzw+>bKimh~_| z9=?U3euIlTXDE4Cl!;}Ggu3ieT?1)e`REo1{QFTv$s&&`~ZoFA*c~DYC}U^lT+!+3N6X%1_X62 z19fEPa>*pZxvn(S=)Mi*9we_j_4E3m)fJYA0|@S32Cl|5(1~@J67f6|_j8Q6U5kqU z)ee6|P=C)wecj^Z{x4>;i7xfo^Pr0$?LSxiy2$b~bqP|3)nLs!tTS~yWnnG?c_9N5 zIyg?z!E#`XOD1m5Ct~fc3mx2>WH!Z+9Tj2hD1i=8gbfJlS~6-&U4uHAZl7l;v?Qzd zAgJ$SppMK8E}0@Ymy(1U-M4x?faGGWoWEzp z=~_hmm0;>pq3Y`xrY&U;_kU2ZH)(GHPu@i|a#$LQAsxID+~m z2I|Pn+)@cblicP}{U~`ohUE1{{k;C#>Iw@&WgAd9%hh1b!s(5xF%7&2%aJ+E4;AJj zabL)YThIfpOt=C;y^M=`uJureC23^}-MMt8YH>1RU)(63;NM9Om0OU&ZsZ2$sRt

ID+~mGHPv2i|ZQ@g_azdPa&w^W1x=A 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 YW=@|jb5D+ond@G0i7+d9zN7m81C(*XGXMYp literal 0 HcmV?d00001 diff --git a/.doctrees/calculate/heating_electricity.doctree b/.doctrees/calculate/heating_electricity.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d1227f4c6050f1e6476a786fb849b1bfc9ba5563 GIT binary patch literal 12704 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 K6oJIO&i?@_Qwd%G literal 0 HcmV?d00001 diff --git a/.doctrees/documentation.doctree b/.doctrees/documentation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..55f58cecd31f26281fc5976d9dded3346c5c5943 GIT binary patch literal 77500 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


d`Dd~ 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 literal 0 HcmV?d00001 diff --git a/.doctrees/tutorial.doctree b/.doctrees/tutorial.doctree new file mode 100644 index 0000000000000000000000000000000000000000..809ab95873054af5dd66cf87baffcc37548020c1 GIT binary patch literal 3904 zcmdT{-EJJW6}By}w7Zg4mj6=3mb*cb*hZ{f!)<}UfL#;;dLu+_4WoAf!JXkQ3313V ze`M*xKyqQA0(fWkx=+v-O42uI-=QC8c1F8v)qrmTM8HDBGlx7s{LXjIeAoHM?{_X$ ze__X#T&R-~&2y!5W@G5)I`ainF20KozmIR?gU~bdwbkBaEQU+a$heTXVJdzb!yu_U zA?;|sf5WoO39Z`gyu;V|#<%eS?}d&NPO^npq5IN1Z3LAu=|JV`OLmfMFT8mhYd_XY z3ac*i-OwYgn|v*-&%HYgSEW!a9{LFled?SM6YmgJiegRVHhH{}Nop;GcEa4QLv7xX-dQ63+6Um0hf(}bj zKCRPtJACxMd2->>IJw044*9*5KmKbZjemwa`3-)b<98pwhe!zjlJ6rCQ00%7BH5P0 zF+(MpNSz%mM)N6L913L}m2x?%e&hIuRB9h#>ksw=j)ktIYUYum7}m>E#{t67J1OK- zi_}5bEe*5G9J4BhXO;i=4mt}ljB3R5PLO}nW=Mxt6eY4uRX&_hE3zRggtdV8u(@qK zKN>cz9AVj?FTIgiZ9AQj)HKpt81BGBa~i|-sn$+u#}-~5Tn^i* zM*{5RWU5UOAsN_I6eQC{YP}Xm-l-)_vPwc;3&%;*x?pj>VcyFQ!)quSD?7ur6o5sRIPxQ_Hn82a38XtmTeyNrCfqPA(f-niIETYR4;+g-BetFjhX?4QWV0)Z?4@BgOZg5Nnt3-tV-BclAu*G zk}4zoiaS@@r{giic2qazkv6k&47ZYI5%I^llH78F(X%A=?)5_O|m*Gq!2ht5;GmvM}B87{sqHe|Uxn0Nw5Lp<8naiWg86Di|0ee%fpd>xpiV#W(n9Ny7S>JO0XsUJ|&|61Vv#a(8C=XZZh$Z`rWD2<&S2b|&gE zDiu>LN&MC5)mOSGsr7KtD1>67Wm_wi>dh5ltKC~VvDa9wHeFvjAAQKU)c9_#o;81i z_78Tgu#|epW~QYC2mu_l*Nv|e#vp%(;NQjCS jne=%or&&UFKTmyNPMK+<3H{>KqH#)(iQ-N4lhOYGd+qr& literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_sources/businesstrips.rst.txt b/_sources/businesstrips.rst.txt new file mode 100644 index 0000000..ed1edbf --- /dev/null +++ b/_sources/businesstrips.rst.txt @@ -0,0 +1,30 @@ +============== +Business trips +============== + +.. toctree:: + :maxdepth: 2 + :caption: See also: + :titlesonly: + :includehidden: + + calculate/distances + calculate/transport_modes + +The calculation of emissions from business trips is currently supported for the following modes of transport: + +* car +* bus +* train +* plane +* ferry + +The user must specify either the distance of a trip or the location of departure and destination. +The distance (in km) may be used, when the user has the direct information of the distance travelled, e.g., from the speedometer of a car. +In other cases, the distance can be calculated from the given locations, see :ref:`Distance calculations `. +With the boolean paramter ``roundtrip``, users can indicate whether a trip was a roundtrip, in which case the distance wil be doubled. + +Aside of the mode of transport, the user should provide the specifica of the trip, depending on the mode of transport +(see :doc'Transportation modes ' :doc:`Emission factors `). + +.. autofunction:: co2calculator.calculate.calc_co2_businesstrip diff --git a/_sources/calculate/distances.rst.txt b/_sources/calculate/distances.rst.txt new file mode 100644 index 0000000..e7ec436 --- /dev/null +++ b/_sources/calculate/distances.rst.txt @@ -0,0 +1,110 @@ +===================== +Distance calculations +===================== + +Geocoding +--------- + +The first step in calculating the distance between two locations is to obtain the geographic coordinates of +these locations, which is called *geocoding*. For this, we use the open-source geocoder `Pelias `_, +as well as a database of train stations. + +a) Geocoding for air travel +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Most airports around the world can be identified by a unique code, assigned by the International Air Transport Association (`IATA `_). +To retrieve the location of airports, we use `Pelias `_ and search for the IATA code in combination with the keyword "Airport". + +.. autofunction:: co2calculator.distances.geocoding_airport + +In the ``calc_co2_businesstrip()`` function, the user only needs to provide the IATA codes for start and destination, e.g.:: + + emissions, distance, range_category, range_description = calc_co2_businesstrip( + transportation_mode: "plane", + start="FRA", + destination="SCQ", + seating = "economy_class", + roundtrip: bool = False) + +b) Geocoding for train trips +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To obtain the coordinates of train stations within Europe, we use the `train station database `_ +by `Trainline `_. + +.. autofunction:: co2calculator.distances.geocoding_train_stations + +As you can see above, a dictionary with the keys `country` and `station_name` has to be provided for both start and destination. +Calculating a train trip may thus look like this:: + + start_dict = { + "country": "DE", + "station_name: "Heidelberg Hauptbahnhof" + } + dest_dict = { + "country": "DE", + "station_name: "Hamburg Hauptbahnhof" + } + emissions, distance, range_category, range_description = calc_co2_businesstrip( + transportation_mode: "train", + start=start_dict, + destination=dest_dict + roundtrip: bool = False) + +We use the fuzzy string matching package `thefuzz `_ to find the train station in the database which best matches the +user input. + +c) Geocoding for other trips +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For other trips (e.g., car or bus), we use `Pelias structured geocoding `_ +as included in `openrouteservice `_. +This means that the user has different predefined fields to specify an address. + +.. autofunction:: co2calculator.distances.geocoding_structured + +Good results can be achieved by specifying `country`, `locality` and `address`. Further specifications +are usually not needed and can sometimes even negatively affect the geocoding results. + +Distance computation +-------------------- + +For the computation of distances between places of departure and destination, we use two different approaches, +depending on the specified mode of transport: + +a) Distance as the crow flies + detour +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Calculating the distance as the crow flies (great circle distance) and multiplying by a detour coefficient or adding +a detour constant. + +The distance as the crow flies is calculated using the haversine formula: + +.. autofunction:: co2calculator.distances.haversine + +The transport modes for which this approach is used are listed in the table below, together with their detour parameters. + +.. csv-table:: Detour parameters + :file: ../../data/detour.csv + :header-rows: 1 + :stub-columns: 2 + :widths: 10 30 30 30 + +b) Road distance +^^^^^^^^^^^^^^^^ + +Calculating the road distance using `openrouteservice `_. + +This approach is only used for the transport mode ``car``. + +Here is an example of how this works using the ``openrouteservice`` `Python library `_). +:: + + import openrouteservice + from openrouteservice.directions import directions + + clnt = openrouteservice.Client(key=ors_api_key) + + # coords: list/tuple of locations [lat,long] + route = directions(clnt, coords, profile="driving-car") + distance = route["routes"][0]["summary"]["distance"] diff --git a/_sources/calculate/emission_factors.rst.txt b/_sources/calculate/emission_factors.rst.txt new file mode 100644 index 0000000..c2f7d3c --- /dev/null +++ b/_sources/calculate/emission_factors.rst.txt @@ -0,0 +1,15 @@ + +Emission factors +================ + +For computing emissions, a central piece of information is the emission intensity of the different activities. +These are expressed by emission factors. +Below, you can find a list of all activities and their emission factors (in co2e per unit). +Within one category, the emission intensity may differ drastically depending on the specification +Let's take a trip by car. A medium battery electric car emits around 0.056 kg co2e/km (including emissions from +manufacturing), while an average car driving on gasoline emits 0.224 kg co2e/km. + +.. csv-table:: Conversion factors heating + :file: ../../data/emission_factors.csv + :header-rows: 1 + :stub-columns: 2 diff --git a/_sources/calculate/heating_electricity.rst.txt b/_sources/calculate/heating_electricity.rst.txt new file mode 100644 index 0000000..9d19cfc --- /dev/null +++ b/_sources/calculate/heating_electricity.rst.txt @@ -0,0 +1,32 @@ +======================= +Heating and electricity +======================= + +.. contents:: + +Heating +------- + +Heating emissions are computed based on the consumption (typically in kWh) and the emission factors for a specified fuel type. + +.. autofunction:: co2calculator.calculate.calc_co2_heating + +Per default, the expected unit is kWh. For some fuel types, the consumption may also be specified using different units, e.g., litres of oil or kg of wood chips. +In these cases, it is possible to specify the `unit`. The consumption will then be converted from the specified unit to kWh, based on common conversion factors: + +.. csv-table:: Conversion factors heating + :file: ../../data/conversion_factors_heating.csv + :header-rows: 1 + :stub-columns: 2 + :widths: 10 30 30 30 + +The parameter `area_share` accounts for the fact, that the heating energy consumption may often only be known for an entire building, while a working group just occupies parts of the buildin. +In this case, the (approximate) share of the building floor space, that is occupied by the working group can be provided. +The `area_share` must be between 0.0 and 1.0 and is 1.0 by default. + +Electricity +----------- + +Electricity emissions are computed based on the consumption (in kWh) and the emission factors for a specified energy mix or energy source. + +.. autofunction:: co2calculator.calculate.calc_co2_electricity diff --git a/_sources/calculate/transport_modes.rst.txt b/_sources/calculate/transport_modes.rst.txt new file mode 100644 index 0000000..2ef4c4e --- /dev/null +++ b/_sources/calculate/transport_modes.rst.txt @@ -0,0 +1,35 @@ +==================== +Transportation modes +==================== + +.. contents:: + +Business trips can be calculated for different modes of transport. +The overview here summarizes, which parameters influence the carbon emission intensity of a trip for the different transportation modes. +The specific emission factors for different configurations (e.g., vehicle size, fuel type, etc.) are documented under +:doc:`Emission factors `. + +Car trip +-------- +The quantity of CO2e emitted by a car trip depends on the ``fuel_type`` (average, cng, diesel, electric, gasoline, +hybrid, hydrogen, plug-in_hybrid), car ``size`` (average, small, medium, large) and the number of ``passengers``. + +Bus trip +-------- +The quantity of CO2e emitted by a bus trip depends on the bus ``size`` (average, medium, large) and the +``occupancy`` in % (20, 50, 80, 100). The ``vehicle_range`` is set to long-distance automatically. + +Train trip +---------- +The quantity of CO2e emitted by a train trip depends on the ``fuel_type`` (average, electric, diesel). +The ``vehicle_range`` is set to long-distance automatically. + +Plane trip +---------- +The quantity of CO2e emitted by a plane trip depends on the +``seating_class`` (average, economy_class, business_class, premium_economy_class, first_class). + +Ferry trip +---------- +The quantity of CO2e emitted by a ferry trip depends on the +``seating_class`` (average, Foot passenger, Car passenger). diff --git a/_sources/commuting.rst.txt b/_sources/commuting.rst.txt new file mode 100644 index 0000000..d42482b --- /dev/null +++ b/_sources/commuting.rst.txt @@ -0,0 +1,64 @@ +========= +Commuting +========= + +.. contents:: + +The calculation of emissions from commuting is currently supported for the following modes of transport: + +* car +* bus +* train +* motorbike +* tram +* bicycle +* pedelec + +Their specific emission factors for different configurations (e.g., vehicle size, fuel type, etc.) are documented under +:doc:`Emission factors `. + +For each mode of transport used for the commute, the user must provide the average ``weekly_distance`` (in km) travelled during +a given time period. The users are asked to enter their usual commuting behaviour and should estimate the distance as +accurately as possible. If they often use a different mode of transport if there is bad weather or in the cold season, +they should account for this by estimating the mean distance for each transportation mode over the entire year. The +commuting data may also be entered separately for each month or once for the summer months and for the winter months +(e.g., April-October and November-March). + +Aside of the mode of transport and the weekly distance, the user should provide the specifica of the commute, depending on +the mode of transport (see :doc:`Emission factors `). + +.. autofunction:: co2calculator.calculate.calc_co2_commuting + + +Car commute +----------- +The quantity of CO2e emitted by a car commute depends on the ``fuel_type`` (average, cng, diesel, electric, gasoline, +hybrid, hydrogen, plug-in_hybrid), car ``size`` (average, small, medium, large) and the number of ``passengers``. + +Bus commute +----------- +The quantity of CO2e emitted by a bus commute depends on the bus ``size`` (average, medium, large) and the +``occupancy`` in % (20, 50, 80, 100). The ``vehicle_range`` is set to local automatically. + +Train commute +------------- +The quantity of CO2e emitted by a train commute depends on the ``fuel_type`` (average, electric, diesel). +The ``vehicle_range`` is set to local automatically. + +Motorbike commute +----------------- +The quantity of CO2e emitted by a motorbike commute depends on the ``size`` (average, small, medium, large) of the +motorbike. + +Tram, bicycle or pedelec commute +-------------------------------- +For tram, bicylce or pedelec, no specifica have to be provided. + + +Aggregating emissions to the group level +---------------------------------------- +If it can be assumed that a representative sample (``n_participants``) of the entire group (``n_members``) have entered +their commuting data, an estimate of the commuting emissions for the entire group can be obtained using the following +function: + +.. autofunction:: co2calculator.calculate.commuting_emissions_group diff --git a/_sources/documentation.md.txt b/_sources/documentation.md.txt new file mode 100644 index 0000000..b20451a --- /dev/null +++ b/_sources/documentation.md.txt @@ -0,0 +1,148 @@ +# Methodology + +The *co2calculator* can compute emissions caused by four big areas of the work life: Electricity, Heating, Business trips and Commuting. Emissions are given as CO2 equivalents (CO2e). + +Business trips and field trips are assessed on an individual level whereas heating and electricity are assessed once for the entire research group. + +The CO2e emissions are calculated using emission factors from different sources: +- [Probas](https://www.probas.umweltbundesamt.de/php/index.php): electricity, heating, most cars, buses, trains +- [UBA (2021). "Umweltfreundlich mobil"](https://www.umweltbundesamt.de/en/publikationen/umweltfreundlich-mobil): bicycles, pedelecs, trams +- [GOV.UK (2020). Greenhouse gas reporting: conversion factors 2020](https://www.gov.uk/government/publications/greenhouse-gas-reporting-conversion-factors-2020): planes, ferries, electric cars, motorbikes + +The specific emission factors for different activities are collected in [this emission factor table](https://github.com/pledge4future/co2calculator/blob/dev/data/emission_factors.csv). + +The basic formula is: +`co2 emissions = consumption * emission factor` + + +## 1 Electricity + +For electricity the user can select between the German electricity mix or solar power. The German electricity mix applies, if the research institute has a regular electricity contract. Solar power is applicable, if the institute uses self-generated solar power. The user is asked for the annual electricity consumption c [kWh] which is then used to calculate the CO2 equivalents [kg/TJ]. Since the emission factors for heating and electricity in the ProBas database apply for a consumption of 1 TJ, the consumption needs to be converted from kWh to TJ with a conversion factor of 277777.7778. + +### Defining a share of electricity use + +If the electricity consumption is only known for a building or building complex and the group occupies only parts of the building and uses only parts of the appliances, the total consumption and an estimate of the share of energy use can be provided. + +## 2 Heating + +The user is asked about the annual consumption and the primary energy source for heating, based on which the CO2e emissions are determined. Heating consumption can be provided in kWh, or in other units, depending on the fuel type (see this [conversion table](https://github.com/pledge4future/co2calculator/blob/dev/data/conversion_factors_heating.csv)): +- Oil: l +- Liquid gas, Coal, Pellet, Woodchips: kg +- Gas: m3 + +The conversion factors are retrieved from: +- [BAFA (2020): Merkblatt zur Ermittlung des Gesamtenergieverbrauchs](https://www.bafa.de/SharedDocs/Downloads/DE/Energie/ea_ermittlung_gesamtenergieverbrauch.html) +- [Krajnc, N. (2015): Wood fuels handbook, FAO](https://agris.fao.org/agris-search/search.do?recordID=XF2017001919) + +The emission factors depend on the fuel type. Fuel types may be oil, gas, liquid gas, electricity, coal, district heating, different types of heat pumps (ground, air, water), pellet, woodchips and solar. + +### Defining a share of heating consumption + +If the heating consumption is only known for a building or building complex and the group occupies only parts of the building, the total consumption and an estimate of the share of the heating consumption can be provided. + +## 3 Business trips + +The `co2calculator` allows to quantify the emissions for individual business trips for different modes of transport. The CO2 equivalent is a function of the distance travelled in km. This distance may either be directly provided, or it may be computed from given start and stop locations using [distances.py](https://github.com/pledge4future/co2calculator/blob/dev/co2calculator/distances.py). In the latter case, the coordinates of the locations have to be retrieved by geocoding and then the travel distance between the locations is computed. Next to the distance or the locations, the user defines the mode of transport and its specifica. + +### Geocoding + +Geocoding is done using the [openrouteservice](https://openrouteservice.org/dev/#/api-docs) geocoding service, which is built on top of the [Pelias](https://github.com/pelias/pelias), a modular, open-source search engine for the world. + +To find airports [geocoding_airport](https://github.com/pledge4future/co2calculator/blob/5ac4e624f742f404299276e013f0f0194e5ba6da/co2calculator/distances.py#L45), we use [Pelias search](https://github.com/pelias/documentation/blob/master/search.md) with the search text "Airplane" + **IATA-code**. To find train stations inside the EU [geocoding_train_stations](https://github.com/pledge4future/co2calculator/blob/5ac4e624f742f404299276e013f0f0194e5ba6da/co2calculator/distances.py#L156), we use the train station database of [Trainline EU](https://github.com/trainline-eu/stations). For train trips outside of the EU and other modes of transport, we use [structured geocoding](https://github.com/pelias/documentation/blob/master/structured-geocoding.md) ([geocoding_structured](https://github.com/pledge4future/co2calculator/blob/5ac4e624f742f404299276e013f0f0194e5ba6da/co2calculator/distances.py#L98)). The structured geocoding parameters are: +- country: highest-level administrative division supported in a search. Full country name or two-/three-letter abbreviations supported + - e.g., Germany / "DE" / "DEU" +- region: first-level administrative divisions within countries, analogous to states and provinces in the US and Canada + - e.g., Delaware, Ontario, Ardennes, Baden-Württemberg +- county: administrative divisions between localities and regions + - e.g., Alb-Donau-Kreis +- locality: equivalent to what are commonly referred to as cities (also municipalities) + - e.g., Bangkok, Caracas +- borough: mostly known in the context of NY, may exist in other cities like Mexico City + - e.g. Manhatten in NY, Iztapalapa in Mexico City +- postalcode: postal code; note: This may not work for all countries! + - e.g., it works for the US and the UK, but not for Germany (and other countries) +- address: street name, optionally also house number +- neighbourhood: vernacular geographic entities that may not necessarily be official administrative divisions but are important nonetheless + - e.g. Notting Hill in London, Le Marais in Paris + +### Distance computation + +For cars and motorbikes, distances are computed with [openrouteservice](https://openrouteservice.org/dev/#/api-docs/directions) with the `profile='driving-car'`. + +For other modes of transport (airplane, ferry, train, bus), the distances between the locations as the crow flies are computed with the [haversine formula](https://github.com/pledge4future/co2calculator/blob/ffc12ec577cb18bf7c67b628ff7d9d79ffeef25b/co2calculator/distances.py#L20). Then, different detour coefficients or constants are applied. +With the `roundtrip`-parameter (type: boolean), users can define if their trip is a roundtrip and if so, the distance will be doubled. + +#### Detour + +Trips on earth will always make a detour, because it is usually not possible to travel in a straight line from start to destination. Therefore, we use coefficients and constants to account for this detour. These differ depending on the mode of travel. + +Mode of transport | Detour formula | Source +------------ | ------------- | ------------- +Bus | x 1.5 | Adapted from [GES 1point5](https://labos1point5.org/ges-1point5), who were advised by Frédéric Héran (economist and urban planner). +Train | x 1.2 | Adapted from [GES 1point5](https://labos1point5.org/ges-1point5), who were advised by Frédéric Héran (economist and urban planner). +Plane | + 95 km | CSN EN 16258 - Methodology for calculation and declaration of energy consumption and GHG emissions of transport services (freight and passengers), European Committee for Standardization, Brussels, November 2012, [Méthode pour la réalisation des bilans d’émissions de gaz à effet de , Version 4](https://www.ecologie.gouv.fr/sites/default/files/Guide%20m%C3%A9thodologique%20sp%C3%A9cifique%20pour%20les%20collectivit%C3%A9s%20pour%20la%20r%C3%A9alisation%20du%20bilan%20d%E2%80%99%C3%A9missions%20de%20GES.pdf), p. 53 +Ferry | ??? | ??? + +### Specifica of the modes of transport + +Mode of transport | Fuel type | Size | Occupancy | Seating | Passengers | Range +------------ | ------------- | ------------- | ------------ | ------------- | ------------- | ------------- +Car | [diesel, gasoline, cng, electric, hybrid, plug-in_hybrid, average] | [small, medium, large, average] | - | - | [1..9] | - +Train | [diesel, electric, average] | - | - | - | - | - (assumes "long-distance") +Bus | [diesel] | [medium, large, average] | in % [20, 50, 80, 100] | - | - | - (assumes "long-distance") +Plane | - | - | - | [average, Economy class, Business class, Premium economy class, First class] | - | - (determined from distance) +Ferry | - | - | - | [average, Foot passenger, Car passenger] | - | - + +These specifica determine how high the emission factors (in kg CO2e/km) are. If these parameters are not specified, the default values in the following table are used: + +### Default values of the specifica of the modes of transport + +Mode of transport | Fuel type | Size | Occupancy | Seating | Passengers | Range +------------ | ------------- | ------------- | ------------ | ------------- | ------------- | ------------- +Car | [average] | [average] | - | - | [1] | - +Motorbike | - | [average] | - | - | - | - +Train | [average] | - | - | - | - | [long distance] +Bus | [diesel] | [average] | [50 %] | - | - | [long distance] +Plane | - | - | - | [average] | - | - (determined from distance) +Ferry | - | - | - | [average] | - | - + +### Range categories + +Trips are categorized based on their ranges, which can be used later for analysis and visualization purposes. + +- Very short haul: < 500 km +- Short distance: 500 - 1500 km +- Medium distance: 1500 - 4000 km +- Long distance: > 4000 km + +## 4 Commuting + +Emissions from commuting are also quantified individually for each mode of transport [calc_co2_commuting](https://github.com/pledge4future/co2calculator/blob/2e102a0971dda57423fe7aef9958d0e61358248c/co2calculator/calculate.py#L445). For a given mode of transport, the user provides the average weekly distance travelled in a given time period (`work_weeks`). Available transportation modes are: +- Car +- (Local) bus +- (Local) train +- Tram +- Motorbike +- Bicycle +- Pedelec + +### Specifica of the modes of transport + +Again, the characteristics of the modes of transport influence the specific emission factors. + +Mode of transport | Fuel type | Size | Occupancy | Seating | Passengers | Range +------------ | ------------- | ------------- | ------------ | ------------- | ------------- | ------------- +Car | [diesel, gasoline, cng, electric, average] | [small, medium, large, average] | - | - | [1..9] | - +Motorbike | - | [small, medium, large, average] | - | - | - | - +Train | [diesel, electric, average] | - | - | - | - | - (assumes "local") +Bus | - | [medium, large, average] | in % [20, 50, 80, 100] | - | - | - (assumes "local") +Tram | - | [medium, large, average] | in % [20, 50, 80, 100] | - | - | - (assumes "local") +Bicycle | - | - | - | - | - | - +Pedelec | - | - | - | - | - | - + +### Aggregating to the group's level + +If we assume that a representative sample (`n_participants`) of the entire group (`n_member`) entered their commuting data, we can obtain an estimate of the commuting emissions for the entire group: + +`group_co2e = aggr_co2 / n_participants * n_members` +with `aggr_co2` the sum of the CO2e emissions of all participants. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..5abad77 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,34 @@ +.. co2calculator documentation master file, created by + sphinx-quickstart on Tue Nov 30 17:57:07 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to co2calculator's documentation! +========================================= + +**co2calculator** is a Python package to calculate work related CO2 emissions from heating and electricity consumption as well as business trips and commuting. + +Contents +================== + + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :includehidden: + + documentation + tutorial + businesstrips + commuting + calculate/heating_electricity + calculate/emission_factors + calculate/transport_modes + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/tutorial.md.txt b/_sources/tutorial.md.txt new file mode 100644 index 0000000..d404493 --- /dev/null +++ b/_sources/tutorial.md.txt @@ -0,0 +1,17 @@ +# Tutorial + +The co2calculator package is available via pip: + +```python +pip install co2calculator +``` + +For a simple and basic emission calculation, import the calculation function and define some emission cause: + +```python + +from co2calculator import calculate_trip +from co2calculator.enums import TransportationMode + +co2e = calculate_trip(distance=200,transportation_mode=TransportationMode.CAR) +``` diff --git a/_static/Final logo.svg b/_static/Final logo.svg new file mode 100644 index 0000000..a9c30a8 --- /dev/null +++ b/_static/Final logo.svg @@ -0,0 +1 @@ + diff --git a/_static/alabaster.css b/_static/alabaster.css new file mode 100644 index 0000000..3f852ad --- /dev/null +++ b/_static/alabaster.css @@ -0,0 +1,714 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: montserrat; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 80%; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 350px; +} + +div.sphinxsidebar { + width: 350px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 80%; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: montserrat; + color: #f15e44; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: montserrat; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 160px; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: montserrat; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: montserrat; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: -20px -30px 20px -30px; + padding: 10px 20px; + background: #f15e44; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} +@media screen and (min-width: 876px) { + div.sphinxsidebar { + position: fixed; + margin-left: 0; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..4a96e3a --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: inherit; + max-width: none; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css-style.css b/_static/css-style.css new file mode 100644 index 0000000..9ea8d56 --- /dev/null +++ b/_static/css-style.css @@ -0,0 +1,4 @@ +body{ + font-family: "Roboto Condensed", sans-serif; + font-style: normal; +} diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..13d90ff --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..367b8ed --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..04a4174 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..92da3f8 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/businesstrips.html b/businesstrips.html new file mode 100644 index 0000000..4eb868d --- /dev/null +++ b/businesstrips.html @@ -0,0 +1,148 @@ + + + + + + + + Business trips — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Business trips

+ +

The calculation of emissions from business trips is currently supported for the following modes of transport:

+
    +
  • car

  • +
  • bus

  • +
  • train

  • +
  • plane

  • +
  • ferry

  • +
+

The user must specify either the distance of a trip or the location of departure and destination. +The distance (in km) may be used, when the user has the direct information of the distance travelled, e.g., from the speedometer of a car. +In other cases, the distance can be calculated from the given locations, see Distance calculations. +With the boolean paramter roundtrip, users can indicate whether a trip was a roundtrip, in which case the distance wil be doubled.

+

Aside of the mode of transport, the user should provide the specifica of the trip, depending on the mode of transport +(see :doc’Transportation modes <calculate/transport_modes>’ Emission factors).

+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/calculate/distances.html b/calculate/distances.html new file mode 100644 index 0000000..e3939e0 --- /dev/null +++ b/calculate/distances.html @@ -0,0 +1,247 @@ + + + + + + + + Distance calculations — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Distance calculations

+
+

Geocoding

+

The first step in calculating the distance between two locations is to obtain the geographic coordinates of +these locations, which is called geocoding. For this, we use the open-source geocoder Pelias, +as well as a database of train stations.

+
+

a) Geocoding for air travel

+

Most airports around the world can be identified by a unique code, assigned by the International Air Transport Association (IATA). +To retrieve the location of airports, we use Pelias and search for the IATA code in combination with the keyword “Airport”.

+

In the calc_co2_businesstrip() function, the user only needs to provide the IATA codes for start and destination, e.g.:

+
emissions, distance, range_category, range_description = calc_co2_businesstrip(
+    transportation_mode: "plane",
+    start="FRA",
+    destination="SCQ",
+    seating = "economy_class",
+    roundtrip: bool = False)
+
+
+
+
+

b) Geocoding for train trips

+

To obtain the coordinates of train stations within Europe, we use the train station database +by Trainline.

+

As you can see above, a dictionary with the keys country and station_name has to be provided for both start and destination. +Calculating a train trip may thus look like this:

+
start_dict = {
+              "country": "DE",
+              "station_name: "Heidelberg Hauptbahnhof"
+              }
+dest_dict = {
+              "country": "DE",
+              "station_name: "Hamburg Hauptbahnhof"
+              }
+emissions, distance, range_category, range_description = calc_co2_businesstrip(
+    transportation_mode: "train",
+    start=start_dict,
+    destination=dest_dict
+    roundtrip: bool = False)
+
+
+

We use the fuzzy string matching package thefuzz to find the train station in the database which best matches the +user input.

+
+
+

c) Geocoding for other trips

+

For other trips (e.g., car or bus), we use Pelias structured geocoding +as included in openrouteservice. +This means that the user has different predefined fields to specify an address.

+

Good results can be achieved by specifying country, locality and address. Further specifications +are usually not needed and can sometimes even negatively affect the geocoding results.

+
+
+
+

Distance computation

+

For the computation of distances between places of departure and destination, we use two different approaches, +depending on the specified mode of transport:

+
+

a) Distance as the crow flies + detour

+

Calculating the distance as the crow flies (great circle distance) and multiplying by a detour coefficient or adding +a detour constant.

+

The distance as the crow flies is calculated using the haversine formula:

+

The transport modes for which this approach is used are listed in the table below, together with their detour parameters.

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Detour parameters

transportation_mode

coefficient

constant [km]

0

bus

1.5

0.0

1

train

1.2

0.0

2

plane

1.0

95

3

ferry

1.0

0.0

+
+
+

b) Road distance

+

Calculating the road distance using openrouteservice.

+

This approach is only used for the transport mode car.

+

Here is an example of how this works using the openrouteservice Python library).

+
import openrouteservice
+from openrouteservice.directions import directions
+
+clnt = openrouteservice.Client(key=ors_api_key)
+
+# coords: list/tuple of locations [lat,long]
+route = directions(clnt, coords, profile="driving-car")
+distance = route["routes"][0]["summary"]["distance"]
+
+
+
+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/calculate/emission_factors.html b/calculate/emission_factors.html new file mode 100644 index 0000000..6883229 --- /dev/null +++ b/calculate/emission_factors.html @@ -0,0 +1,1834 @@ + + + + + + + + Emission factors — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Emission factors

+

For computing emissions, a central piece of information is the emission intensity of the different activities. +These are expressed by emission factors. +Below, you can find a list of all activities and their emission factors (in co2e per unit). +Within one category, the emission intensity may differ drastically depending on the specification +Let’s take a trip by car. A medium battery electric car emits around 0.056 kg co2e/km (including emissions from +manufacturing), while an average car driving on gasoline emits 0.224 kg co2e/km.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Conversion factors heating

category

subcategory

source

model

name

unit

size

occupancy

capacity

range

fuel_type

co2e_unit

co2e

seating

comment

0

transport

bus

Öko-Institut

gemis

Bus-Linie-BZ-DE-2020-Basis

P.km

average

local

hydrogen

kg/P.km

0.0251

1

transport

bus

Öko-Institut-adapted

gemis

Bus-Linie-BZ-DE-2020-Basis

P.km

average

long-distance

hydrogen

kg/P.km

0.0251

2

transport

bus

Öko-Institut

gemis

Bus-Linie-CNG-DE-2020-Basis

P.km

average

local

cng

kg/P.km

0.0617

3

transport

bus

Öko-Institut-adapted

gemis

Bus-Linie-CNG-DE-2020-Basis

P.km

average

long-distance

cng

kg/P.km

0.0617

4

transport

bus

UBA

tremod

Linienbus

P.km

medium

100

60

local

diesel

kg/P.km

0.0239

5

transport

bus

UBA

tremod

Linienbus

P.km

medium

20

60

local

diesel

kg/P.km

0.0914

6

transport

bus

UBA

tremod

Linienbus

P.km

medium

50

60

local

diesel

kg/P.km

0.0407

7

transport

bus

UBA

tremod

Linienbus

P.km

medium

80

60

local

diesel

kg/P.km

0.0281

8

transport

bus

UBA

tremod

Linienbus

P.km

large

100

90

local

diesel

kg/P.km

0.0221

9

transport

bus

UBA

tremod

Linienbus

P.km

large

20

90

local

diesel

kg/P.km

0.0781

10

transport

bus

UBA

tremod

Linienbus

P.km

large

50

90

local

diesel

kg/P.km

0.0361

11

transport

bus

UBA

tremod

Linienbus

P.km

large

80

90

local

diesel

kg/P.km

0.0256

12

transport

bus

UBA

tremod

Linienbus

P.km

small

100

30

local

diesel

kg/P.km

0.0349

13

transport

bus

UBA

tremod

Linienbus

P.km

small

20

30

local

diesel

kg/P.km

0.138

14

transport

bus

UBA

tremod

Linienbus

P.km

small

50

30

local

diesel

kg/P.km

0.0603

15

transport

bus

UBA

tremod

Linienbus

P.km

small

80

30

local

diesel

kg/P.km

0.0412

16

transport

bus

UBA

tremod

Linienbus

P.km

average

20

70.5

local

diesel

kg/P.km

0.0857

17

transport

bus

UBA

tremod

Linienbus

P.km

average

50

70.5

local

diesel

kg/P.km

0.0389

18

transport

bus

UBA

tremod

Linienbus

P.km

average

80

70.5

local

diesel

kg/P.km

0.0272

19

transport

bus

UBA

tremod

Linienbus

P.km

average

100

70.5

local

diesel

kg/P.km

0.0234

20

transport

bus

UBA

tremod

Reisebus

P.km

large

100

60

long-distance

diesel

kg/P.km

0.0188

21

transport

bus

UBA

tremod

Reisebus

P.km

large

20

60

long-distance

diesel

kg/P.km

0.0764

22

transport

bus

UBA

tremod

Reisebus

P.km

large

50

60

long-distance

diesel

kg/P.km

0.0332

23

transport

bus

UBA

tremod

Reisebus

P.km

large

80

60

long-distance

diesel

kg/P.km

0.0224

24

transport

bus

UBA

tremod

Reisebus

P.km

medium

100

39.9

long-distance

diesel

kg/P.km

0.0233

25

transport

bus

UBA

tremod

Reisebus

P.km

medium

20

39.9

long-distance

diesel

kg/P.km

0.0987

26

transport

bus

UBA

tremod

Reisebus

P.km

medium

50

39.9

long-distance

diesel

kg/P.km

0.0423

27

transport

bus

UBA

tremod

Reisebus

P.km

medium

80

39.9

long-distance

diesel

kg/P.km

0.0281

28

transport

bus

UBA

tremod

Reisebus

P.km

average

20

44.6

long-distance

diesel

kg/P.km

0.0917

29

transport

bus

UBA

tremod

Reisebus

P.km

average

50

44.6

long-distance

diesel

kg/P.km

0.0394

30

transport

bus

UBA

tremod

Reisebus

P.km

average

80

44.6

long-distance

diesel

kg/P.km

0.0263

31

transport

bus

UBA

tremod

Reisebus

P.km

average

100

44.6

long-distance

diesel

kg/P.km

0.0219

32

transport

car

Öko-Institut

gemis

Pkw-Otto-CNG-gross-DE-2020-Basis

P.km

large

cng

kg/P.km

0.291

33

transport

car

Öko-Institut

gemis

Pkw-Otto-CNG-klein-DE-2020-Basis

P.km

small

cng

kg/P.km

0.198

34

transport

car

Öko-Institut

gemis

Pkw-Otto-CNG-mittel-DE-2020-Basis

P.km

medium

cng

kg/P.km

0.237

35

transport

car

Öko-Institut-adapted

gemis

Pkw-Otto-CNG-mittel-DE-2020-Basis

P.km

average

cng

kg/P.km

0.237

36

transport

car

UBA

tremod

PKW

P.km

average

average

kg/P.km

0.215

37

transport

car

UBA

tremod

PKW

P.km

small

average

kg/P.km

0.179

38

transport

car

UBA

tremod

PKW

P.km

medium

average

kg/P.km

0.209

39

transport

car

UBA

tremod

PKW

P.km

large

average

kg/P.km

0.274

40

transport

car

UBA

tremod

PKW

P.km

average

gasoline

kg/P.km

0.224

41

transport

car

UBA

tremod

PKW

P.km

small

gasoline

kg/P.km

0.18

42

transport

car

UBA

tremod

PKW

P.km

medium

gasoline

kg/P.km

0.231

43

transport

car

UBA

tremod

PKW

P.km

large

gasoline

kg/P.km

0.311

44

transport

car

UBA

tremod

PKW

P.km

average

diesel

kg/P.km

0.201

45

transport

car

UBA

tremod

PKW

P.km

small

diesel

kg/P.km

0.131

46

transport

car

UBA

tremod

PKW

P.km

medium

diesel

kg/P.km

0.18

47

transport

car

UBA

tremod

PKW

P.km

large

diesel

kg/P.km

0.249

48

electricity

Öko-Institut

gemis

Solar-PV-amorph-DE-2010

TJ

solar

kg/TJ

11874

49

electricity

IINAS

gemis

El-KW-Park-DE-2020

TJ

german_energy_mix

kg/TJ

109518

50

heating

Öko-Institut

gemis

Braunkohle-Brikett-Heizung-DE-rheinisch-2010 (Endenergie)

TJ

coal

kg/TJ

126383

51

heating

Öko-Institut

gemis

Fernwärme-Heizung-DE-2020/en

TJ

district_heating

kg/TJ

77367

52

heating

Öko-Institut

gemis

El-Heizung-DE-2020-mix

TJ

electricity

kg/TJ

116667

53

heating

IINAS

gemis

Gas-Heizung-DE-2020 (Endenergie)

TJ

gas

kg/TJ

65578

54

heating

Öko-Institut

gemis

El-Wärmepumpe-mono-Luft-DE-2020-mix

TJ

heat_pump_air

kg/TJ

33581

55

heating

Öko-Institut

gemis

El-Wärmepumpe-mono-Erdreich-DE-2010-mix

TJ

heat_pump_ground

kg/TJ

48541

56

heating

Öko-Institut

gemis

El-Wärmepumpe-mono-Wasser-DE-2010-mix

TJ

heat_pump_water

kg/TJ

44266

57

heating

Öko-Institut

gemis

FlüssiggasHeizung-DE-2020

TJ

liquid_gas

kg/TJ

82455

58

heating

IINAS

gemis

Öl-Heizung-DE-2020 (Endenergie)

TJ

oil

kg/TJ

87444

59

heating

IINAS

gemis

Holz-EU-KUP-Pellet-Heizung-10 kW-2020

TJ

pellet

kg/TJ

14866

60

heating

Öko-Institut

gemis

SolarKollektor-Flach-DE-2020

TJ

solar

kg/TJ

10881

61

heating

IINAS

gemis

Holz-EU-KUP-Hackschnitzel-Heizwerk 1 MW-2020

TJ

woodchips

kg/TJ

9322

62

transport

train

UBA

tremod

Personenfernverkehrszug

P.km

average

long-distance

average

kg/P.km

0.0329

63

transport

train

UBA

tremod

Personenfernverkehrszug

P.km

average

long-distance

diesel

kg/P.km

0.0698

64

transport

train

UBA

tremod

Personenfernverkehrszug

P.km

average

long-distance

electric

kg/P.km

0.032

65

transport

train

UBA

tremod

Personennahverkehrszug

P.km

average

local

average

kg/P.km

0.0604

66

transport

train

UBA

tremod

Personennahverkehrszug

P.km

average

local

diesel

kg/P.km

0.0884

67

transport

train

UBA

tremod

Personennahverkehrszug

P.km

average

local

electric

kg/P.km

0.0524

68

transport

tram

UBA

tremod

Strassen-Stadt-U-Bahn

P.km

average

electric

kg/P.km

0.0548

69

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, small car

P.km

small

hybrid

kg/P.km

0.10332

70

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, medium car

P.km

medium

hybrid

kg/P.km

0.10999

71

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, large car

P.km

large

hybrid

kg/P.km

0.15491

72

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, average car

P.km

average

hybrid

kg/P.km

0.12004

73

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, small car

P.km

small

plug-in_hybrid

kg/P.km

0.05255

74

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, medium car

P.km

medium

plug-in_hybrid

kg/P.km

0.08597

75

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, large car

P.km

large

plug-in_hybrid

kg/P.km

0.10148

76

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, average car

P.km

average

plug-in_hybrid

kg/P.km

0.09349

77

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, small car

P.km

small

electric

kg/P.km

0.04416

78

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, medium car

P.km

medium

electric

kg/P.km

0.04878

79

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, large car

P.km

large

electric

kg/P.km

0.0555

80

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, average car

P.km

average

electric

kg/P.km

0.0514

81

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, domestic, average passenger

P.km

domestic

kerosine

kg/P.km

0.24587

average

with RF (radiative forcing)

82

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, short-haul, average passenger

P.km

short-haul

kerosine

kg/P.km

0.15353

average

with RF

83

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, short-haul, Economy class passenger

P.km

short-haul

kerosine

kg/P.km

0.15152

economy_class

with RF <= 3700 km

84

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, short-haul, Business class passenger

P.km

short-haul

kerosine

kg/P.km

0.22652

business_class

with RF <= 3700 km

85

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, average passenger

P.km

long-haul

kerosine

kg/P.km

0.19309

average

with RF > 3700 km

86

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, Economy class passenger

P.km

long-haul

kerosine

kg/P.km

0.14787

economy_class

with RF > 3700 km

87

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, Premium economy class passenger

P.km

long-haul

kerosine

kg/P.km

0.23659

premium_economy_class

with RF > 3700 km

88

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, Business class passenger

P.km

long-haul

kerosine

kg/P.km

0.42882

business_class

with RF > 3700 km

89

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, First class passenger

P.km

long-haul

kerosine

kg/P.km

0.59147

first_class

with RF > 3700 km

90

transport

ferry

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Ferry, Foot passenger

P.km

kg/P.km

0.01874

foot_passenger

with RF > 3700 km

91

transport

ferry

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Ferry, Car passenger

P.km

kg/P.km

0.12952

car_passenger

with RF > 3700 km

92

transport

ferry

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Ferry, Average

P.km

kg/P.km

0.11286

average

with RF > 3700 km

93

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, small

P.km

small

kg/P.km

0.08306

94

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, medium

P.km

medium

kg/P.km

0.1009

95

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, large

P.km

large

kg/P.km

0.13245

96

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, average

P.km

average

kg/P.km

0.11355

97

transport

bicycle

UBA

Fahrrad

P.km

kg/P.km

0.009

98

transport

pedelec

UBA

Pedelec

P.km

kg/P.km

0.015

+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/calculate/heating_electricity.html b/calculate/heating_electricity.html new file mode 100644 index 0000000..29d2544 --- /dev/null +++ b/calculate/heating_electricity.html @@ -0,0 +1,195 @@ + + + + + + + + Heating and electricity — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Heating and electricity

+ +
+

Heating

+

Heating emissions are computed based on the consumption (typically in kWh) and the emission factors for a specified fuel type.

+

Per default, the expected unit is kWh. For some fuel types, the consumption may also be specified using different units, e.g., litres of oil or kg of wood chips. +In these cases, it is possible to specify the unit. The consumption will then be converted from the specified unit to kWh, based on common conversion factors:

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Conversion factors heating

fuel_type

unit

conversion_value

0

oil

l

10.6

1

liquid_gas

kg

14.1

2

coal

kg

6.0

3

pellet

kg

5.4

4

woodchips

kg

5.2

5

gas

m^3

10.8

+

The parameter area_share accounts for the fact, that the heating energy consumption may often only be known for an entire building, while a working group just occupies parts of the buildin. +In this case, the (approximate) share of the building floor space, that is occupied by the working group can be provided. +The area_share must be between 0.0 and 1.0 and is 1.0 by default.

+
+
+

Electricity

+

Electricity emissions are computed based on the consumption (in kWh) and the emission factors for a specified energy mix or energy source.

+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/calculate/transport_modes.html b/calculate/transport_modes.html new file mode 100644 index 0000000..72fb926 --- /dev/null +++ b/calculate/transport_modes.html @@ -0,0 +1,168 @@ + + + + + + + + Transportation modes — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Transportation modes

+ +

Business trips can be calculated for different modes of transport. +The overview here summarizes, which parameters influence the carbon emission intensity of a trip for the different transportation modes. +The specific emission factors for different configurations (e.g., vehicle size, fuel type, etc.) are documented under +Emission factors.

+
+

Car trip

+

The quantity of CO2e emitted by a car trip depends on the fuel_type (average, cng, diesel, electric, gasoline, +hybrid, hydrogen, plug-in_hybrid), car size (average, small, medium, large) and the number of passengers.

+
+
+

Bus trip

+

The quantity of CO2e emitted by a bus trip depends on the bus size (average, medium, large) and the +occupancy in % (20, 50, 80, 100). The vehicle_range is set to long-distance automatically.

+
+
+

Train trip

+

The quantity of CO2e emitted by a train trip depends on the fuel_type (average, electric, diesel). +The vehicle_range is set to long-distance automatically.

+
+
+

Plane trip

+

The quantity of CO2e emitted by a plane trip depends on the +seating_class (average, economy_class, business_class, premium_economy_class, first_class).

+
+
+

Ferry trip

+

The quantity of CO2e emitted by a ferry trip depends on the +seating_class (average, Foot passenger, Car passenger).

+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/commuting.html b/commuting.html new file mode 100644 index 0000000..f978b75 --- /dev/null +++ b/commuting.html @@ -0,0 +1,188 @@ + + + + + + + + Commuting — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Commuting

+ +

The calculation of emissions from commuting is currently supported for the following modes of transport:

+
    +
  • car

  • +
  • bus

  • +
  • train

  • +
  • motorbike

  • +
  • tram

  • +
  • bicycle

  • +
  • pedelec

  • +
+

Their specific emission factors for different configurations (e.g., vehicle size, fuel type, etc.) are documented under +Emission factors.

+

For each mode of transport used for the commute, the user must provide the average weekly_distance (in km) travelled during +a given time period. The users are asked to enter their usual commuting behaviour and should estimate the distance as +accurately as possible. If they often use a different mode of transport if there is bad weather or in the cold season, +they should account for this by estimating the mean distance for each transportation mode over the entire year. The +commuting data may also be entered separately for each month or once for the summer months and for the winter months +(e.g., April-October and November-March).

+

Aside of the mode of transport and the weekly distance, the user should provide the specifica of the commute, depending on +the mode of transport (see Emission factors).

+
+

Car commute

+

The quantity of CO2e emitted by a car commute depends on the fuel_type (average, cng, diesel, electric, gasoline, +hybrid, hydrogen, plug-in_hybrid), car size (average, small, medium, large) and the number of passengers.

+
+
+

Bus commute

+

The quantity of CO2e emitted by a bus commute depends on the bus size (average, medium, large) and the +occupancy in % (20, 50, 80, 100). The vehicle_range is set to local automatically.

+
+
+

Train commute

+

The quantity of CO2e emitted by a train commute depends on the fuel_type (average, electric, diesel). +The vehicle_range is set to local automatically.

+
+
+

Motorbike commute

+

The quantity of CO2e emitted by a motorbike commute depends on the size (average, small, medium, large) of the +motorbike.

+
+
+

Tram, bicycle or pedelec commute

+

For tram, bicylce or pedelec, no specifica have to be provided.

+
+
+

Aggregating emissions to the group level

+

If it can be assumed that a representative sample (n_participants) of the entire group (n_members) have entered +their commuting data, an estimate of the commuting emissions for the entire group can be obtained using the following +function:

+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/documentation.html b/documentation.html new file mode 100644 index 0000000..7e29b77 --- /dev/null +++ b/documentation.html @@ -0,0 +1,470 @@ + + + + + + + + Methodology — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Methodology

+

The co2calculator can compute emissions caused by four big areas of the work life: Electricity, Heating, Business trips and Commuting. Emissions are given as CO2 equivalents (CO2e).

+

Business trips and field trips are assessed on an individual level whereas heating and electricity are assessed once for the entire research group.

+

The CO2e emissions are calculated using emission factors from different sources:

+ +

The specific emission factors for different activities are collected in this emission factor table.

+

The basic formula is: +co2 emissions = consumption * emission factor

+
+

1 Electricity

+

For electricity the user can select between the German electricity mix or solar power. The German electricity mix applies, if the research institute has a regular electricity contract. Solar power is applicable, if the institute uses self-generated solar power. The user is asked for the annual electricity consumption c [kWh] which is then used to calculate the CO2 equivalents [kg/TJ]. Since the emission factors for heating and electricity in the ProBas database apply for a consumption of 1 TJ, the consumption needs to be converted from kWh to TJ with a conversion factor of 277777.7778.

+
+

Defining a share of electricity use

+

If the electricity consumption is only known for a building or building complex and the group occupies only parts of the building and uses only parts of the appliances, the total consumption and an estimate of the share of energy use can be provided.

+
+
+
+

2 Heating

+

The user is asked about the annual consumption and the primary energy source for heating, based on which the CO2e emissions are determined. Heating consumption can be provided in kWh, or in other units, depending on the fuel type (see this conversion table):

+
    +
  • Oil: l

  • +
  • Liquid gas, Coal, Pellet, Woodchips: kg

  • +
  • Gas: m3

  • +
+

The conversion factors are retrieved from:

+ +

The emission factors depend on the fuel type. Fuel types may be oil, gas, liquid gas, electricity, coal, district heating, different types of heat pumps (ground, air, water), pellet, woodchips and solar.

+
+

Defining a share of heating consumption

+

If the heating consumption is only known for a building or building complex and the group occupies only parts of the building, the total consumption and an estimate of the share of the heating consumption can be provided.

+
+
+
+

3 Business trips

+

The co2calculator allows to quantify the emissions for individual business trips for different modes of transport. The CO2 equivalent is a function of the distance travelled in km. This distance may either be directly provided, or it may be computed from given start and stop locations using distances.py. In the latter case, the coordinates of the locations have to be retrieved by geocoding and then the travel distance between the locations is computed. Next to the distance or the locations, the user defines the mode of transport and its specifica.

+
+

Geocoding

+

Geocoding is done using the openrouteservice geocoding service, which is built on top of the Pelias, a modular, open-source search engine for the world.

+

To find airports geocoding_airport, we use Pelias search with the search text “Airplane” + IATA-code. To find train stations inside the EU geocoding_train_stations, we use the train station database of Trainline EU. For train trips outside of the EU and other modes of transport, we use structured geocoding (geocoding_structured). The structured geocoding parameters are:

+
    +
  • country: highest-level administrative division supported in a search. Full country name or two-/three-letter abbreviations supported

    +
      +
    • e.g., Germany / “DE” / “DEU”

    • +
    +
  • +
  • region: first-level administrative divisions within countries, analogous to states and provinces in the US and Canada

    +
      +
    • e.g., Delaware, Ontario, Ardennes, Baden-Württemberg

    • +
    +
  • +
  • county: administrative divisions between localities and regions

    +
      +
    • e.g., Alb-Donau-Kreis

    • +
    +
  • +
  • locality: equivalent to what are commonly referred to as cities (also municipalities)

    +
      +
    • e.g., Bangkok, Caracas

    • +
    +
  • +
  • borough: mostly known in the context of NY, may exist in other cities like Mexico City

    +
      +
    • e.g. Manhatten in NY, Iztapalapa in Mexico City

    • +
    +
  • +
  • postalcode: postal code; note: This may not work for all countries!

    +
      +
    • e.g., it works for the US and the UK, but not for Germany (and other countries)

    • +
    +
  • +
  • address: street name, optionally also house number

  • +
  • neighbourhood: vernacular geographic entities that may not necessarily be official administrative divisions but are important nonetheless

    +
      +
    • e.g. Notting Hill in London, Le Marais in Paris

    • +
    +
  • +
+
+
+

Distance computation

+

For cars and motorbikes, distances are computed with openrouteservice with the profile='driving-car'.

+

For other modes of transport (airplane, ferry, train, bus), the distances between the locations as the crow flies are computed with the haversine formula. Then, different detour coefficients or constants are applied. +With the roundtrip-parameter (type: boolean), users can define if their trip is a roundtrip and if so, the distance will be doubled.

+
+

Detour

+

Trips on earth will always make a detour, because it is usually not possible to travel in a straight line from start to destination. Therefore, we use coefficients and constants to account for this detour. These differ depending on the mode of travel.

+ + + + + + + + + + + + + + + + + + + + + + + + + +

Mode of transport

Detour formula

Source

Bus

x 1.5

Adapted from GES 1point5, who were advised by Frédéric Héran (economist and urban planner).

Train

x 1.2

Adapted from GES 1point5, who were advised by Frédéric Héran (economist and urban planner).

Plane

+ 95 km

CSN EN 16258 - Methodology for calculation and declaration of energy consumption and GHG emissions of transport services (freight and passengers), European Committee for Standardization, Brussels, November 2012, Méthode pour la réalisation des bilans d’émissions de gaz à effet de , Version 4, p. 53

Ferry

???

???

+
+
+
+

Specifica of the modes of transport

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Mode of transport

Fuel type

Size

Occupancy

Seating

Passengers

Range

Car

[diesel, gasoline, cng, electric, hybrid, plug-in_hybrid, average]

[small, medium, large, average]

-

-

[1..9]

-

Train

[diesel, electric, average]

-

-

-

-

- (assumes “long-distance”)

Bus

[diesel]

[medium, large, average]

in % [20, 50, 80, 100]

-

-

- (assumes “long-distance”)

Plane

-

-

-

[average, Economy class, Business class, Premium economy class, First class]

-

- (determined from distance)

Ferry

-

-

-

[average, Foot passenger, Car passenger]

-

-

+

These specifica determine how high the emission factors (in kg CO2e/km) are. If these parameters are not specified, the default values in the following table are used:

+
+
+

Default values of the specifica of the modes of transport

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Mode of transport

Fuel type

Size

Occupancy

Seating

Passengers

Range

Car

[average]

[average]

-

-

[1]

-

Motorbike

-

[average]

-

-

-

-

Train

[average]

-

-

-

-

[long distance]

Bus

[diesel]

[average]

[50 %]

-

-

[long distance]

Plane

-

-

-

[average]

-

- (determined from distance)

Ferry

-

-

-

[average]

-

-

+
+
+

Range categories

+

Trips are categorized based on their ranges, which can be used later for analysis and visualization purposes.

+
    +
  • Very short haul: < 500 km

  • +
  • Short distance: 500 - 1500 km

  • +
  • Medium distance: 1500 - 4000 km

  • +
  • Long distance: > 4000 km

  • +
+
+
+
+

4 Commuting

+

Emissions from commuting are also quantified individually for each mode of transport calc_co2_commuting. For a given mode of transport, the user provides the average weekly distance travelled in a given time period (work_weeks). Available transportation modes are:

+
    +
  • Car

  • +
  • (Local) bus

  • +
  • (Local) train

  • +
  • Tram

  • +
  • Motorbike

  • +
  • Bicycle

  • +
  • Pedelec

  • +
+
+

Specifica of the modes of transport

+

Again, the characteristics of the modes of transport influence the specific emission factors.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Mode of transport

Fuel type

Size

Occupancy

Seating

Passengers

Range

Car

[diesel, gasoline, cng, electric, average]

[small, medium, large, average]

-

-

[1..9]

-

Motorbike

-

[small, medium, large, average]

-

-

-

-

Train

[diesel, electric, average]

-

-

-

-

- (assumes “local”)

Bus

-

[medium, large, average]

in % [20, 50, 80, 100]

-

-

- (assumes “local”)

Tram

-

[medium, large, average]

in % [20, 50, 80, 100]

-

-

- (assumes “local”)

Bicycle

-

-

-

-

-

-

Pedelec

-

-

-

-

-

-

+
+
+

Aggregating to the group’s level

+

If we assume that a representative sample (n_participants) of the entire group (n_member) entered their commuting data, we can obtain an estimate of the commuting emissions for the entire group:

+

group_co2e = aggr_co2 / n_participants * n_members +with aggr_co2 the sum of the CO2e emissions of all participants.

+
+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..6f9fa8a --- /dev/null +++ b/genindex.html @@ -0,0 +1,118 @@ + + + + + + + Index — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ + +

Index

+ +
+ +
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..b3b576a --- /dev/null +++ b/index.html @@ -0,0 +1,148 @@ + + + + + + + + Welcome to co2calculator’s documentation! — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Welcome to co2calculator’s documentation!

+

co2calculator is a Python package to calculate work related CO2 emissions from heating and electricity consumption as well as business trips and commuting.

+
+
+

Contents

+ +
+
+

Indices and tables

+ +
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..1c15c686dbfce1d230fa678e0785dcfa40a95aab GIT binary patch literal 1188 zcmV;V1Y7$fAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkoZ!%+H zY-4q7VRUbD3L_v^WpZ8b#rNMXCQiPX<{x4c-pO(&5qkP5XbL)3Kj_v6bV!8Ca2tzb<*Y# zV37pKaY0jKnW!WhB9+v)zD8fKPtxI+M9S1k4tlexncw`$84k%C3JnO;OCimfYE!*w z_#PU{ZfK>%&_ZXpk*a%nG;Q-FwY{P5r+?&@9sv!zdX*9FZs{NX7kNeZgO(j=O%Zp} ztB7dMy!k8oF7qd^sZeb@Y?3oszNUBaH{rk1N@~M90hA;52vqdy2R$?rG<{AhFly*? zxZsT#8gAgX=&F4P&f);$sQC!YvY2DBK*E5#^?+7a4N9oW3O*?GlRZwFe@6*h#f$)k z0EPe-00{qm0Zw>b_fY%HK`XV!1w@(3DXn`ooM;1=D&m5M*b{_}5N4EH69-`)@^)ji zOji2&nJ&pGq(7CE3DE^9X@r0O{wKsB`*~7u&16@q<;AS*XIXKCP~Q7_S`xgC-78*A z)w(sF^&0Ea#`v6K2yU^EJ$N*wXvd=6yUEA-TZKz{a1Nb5sop%asv1=deoH%&{XrgU z4Dp-$RBQ~hwvahE78XRAG`bCwNjIrs9_ZPW>cW*iDqs z;>LP7aA8!x0G(TT_WLkO!)SsH{rzEnu3V4{h8`Zy1`gu}4~?PUc{AVwtAp!&`UFBAq~LMDFTed0r?}d21DSa;QwP^{M{*o+WcOzz?|xR3 zosH~VNl|^|J=m{leGVG7=ynXonPXUO34>Y2Zaq#>OS}_dhV;;$TxtG{p1@%#XSXdL zDP3s_VV@$s&Yx8=8!!=B=&M@nxOSobueiBDn^uB1#2k86r_5I1Y`407AB#;_9*D!Ka9QDie z(f%aUdAVLvNW;f zy}LwaEAorwNPEOvzTx`@miu)ubrOT=#|v-LPF1@h6={vPHYXR!KAl4bt8;(r>$k>uY|5k~XUsFFaJyovC z-SqqkJeNBhZC}v66lZ}M!CUePD!T)>s%%;CWqAD#zNzj<;lvbfj@M2q0r(3}`95j} z+yjy~X*Y>u;TjwM<))*O%osQIX#QiN5j~r?p~apP2==j@5%9sBAEnpyy#D|~meXuj CCpX&w literal 0 HcmV?d00001 diff --git a/search.html b/search.html new file mode 100644 index 0000000..7cc2fcd --- /dev/null +++ b/search.html @@ -0,0 +1,135 @@ + + + + + + + Search — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + +
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..a6de3c5 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"1 Electricity": [[6, "electricity"]], "2 Heating": [[6, "heating"]], "3 Business trips": [[6, "business-trips"]], "4 Commuting": [[6, "commuting"]], "Aggregating emissions to the group level": [[5, "aggregating-emissions-to-the-group-level"]], "Aggregating to the group\u2019s level": [[6, "aggregating-to-the-group-s-level"]], "Bus commute": [[5, "bus-commute"]], "Bus trip": [[4, "bus-trip"]], "Business trips": [[0, "business-trips"]], "Car commute": [[5, "car-commute"]], "Car trip": [[4, "car-trip"]], "Commuting": [[5, "commuting"]], "Contents": [[3, "contents"], [4, "contents"], [5, "contents"], [7, "contents"]], "Conversion factors heating": [[2, "id1"], [3, "id1"]], "Default values of the specifica of the modes of transport": [[6, "default-values-of-the-specifica-of-the-modes-of-transport"]], "Defining a share of electricity use": [[6, "defining-a-share-of-electricity-use"]], "Defining a share of heating consumption": [[6, "defining-a-share-of-heating-consumption"]], "Detour": [[6, "detour"]], "Detour parameters": [[1, "id3"]], "Distance calculations": [[1, "distance-calculations"]], "Distance computation": [[1, "distance-computation"], [6, "distance-computation"]], "Electricity": [[3, "electricity"]], "Emission factors": [[2, "emission-factors"]], "Ferry trip": [[4, "ferry-trip"]], "Geocoding": [[1, "geocoding"], [6, "geocoding"]], "Heating": [[3, "heating"]], "Heating and electricity": [[3, "heating-and-electricity"]], "Indices and tables": [[7, "indices-and-tables"]], "Methodology": [[6, "methodology"]], "Motorbike commute": [[5, "motorbike-commute"]], "Plane trip": [[4, "plane-trip"]], "Range categories": [[6, "range-categories"]], "See also:": [[0, null]], "Specifica of the modes of transport": [[6, "specifica-of-the-modes-of-transport"], [6, "id1"]], "Train commute": [[5, "train-commute"]], "Train trip": [[4, "train-trip"]], "Tram, bicycle or pedelec commute": [[5, "tram-bicycle-or-pedelec-commute"]], "Transportation modes": [[4, "transportation-modes"]], "Tutorial": [[8, "tutorial"]], "Welcome to co2calculator\u2019s documentation!": [[7, "welcome-to-co2calculator-s-documentation"]], "a) Distance as the crow flies + detour": [[1, "a-distance-as-the-crow-flies-detour"]], "a) Geocoding for air travel": [[1, "a-geocoding-for-air-travel"]], "b) Geocoding for train trips": [[1, "b-geocoding-for-train-trips"]], "b) Road distance": [[1, "b-road-distance"]], "c) Geocoding for other trips": [[1, "c-geocoding-for-other-trips"]]}, "docnames": ["businesstrips", "calculate/distances", "calculate/emission_factors", "calculate/heating_electricity", "calculate/transport_modes", "commuting", "documentation", "index", "tutorial"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["businesstrips.rst", "calculate/distances.rst", "calculate/emission_factors.rst", "calculate/heating_electricity.rst", "calculate/transport_modes.rst", "commuting.rst", "documentation.md", "index.rst", "tutorial.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": 2, "0": [1, 2, 3], "009": 2, "015": 2, "01874": 2, "0188": 2, "0219": 2, "0221": 2, "0224": 2, "0233": 2, "0234": 2, "0239": 2, "0251": 2, "0256": 2, "0263": 2, "0272": 2, "0281": 2, "032": 2, "0329": 2, "0332": 2, "0349": 2, "0361": 2, "0389": 2, "0394": 2, "0407": 2, "0412": 2, "0423": 2, "04416": 2, "04878": 2, "0514": 2, "0524": 2, "05255": 2, "0548": 2, "0555": 2, "056": 2, "0603": 2, "0604": 2, "0617": 2, "0698": 2, "0764": 2, "0781": 2, "08306": 2, "0857": 2, "08597": 2, "0884": 2, "0914": 2, "0917": 2, "09349": 2, "0987": 2, "1": [1, 2, 3], "10": [2, 3], "100": [2, 4, 5, 6], "1009": 2, "10148": 2, "10332": 2, "10881": 2, "109518": 2, "10999": 2, "11": 2, "11286": 2, "11355": 2, "116667": 2, "11874": 2, "12": 2, "12004": 2, "126383": 2, "12952": 2, "13": 2, "131": 2, "13245": 2, "138": 2, "14": [2, 3], "14787": 2, "14866": 2, "15": 2, "1500": 6, "15152": 2, "15353": 2, "15491": 2, "16": 2, "16258": 6, "17": 2, "179": 2, "18": 2, "19": 2, "19309": 2, "198": 2, "1point5": 6, "2": [1, 2, 3], "20": [2, 4, 5, 6], "200": 8, "201": 2, "2010": 2, "2012": 6, "2015": 6, "2020": [2, 6], "2021": 6, "209": 2, "21": 2, "215": 2, "22": 2, "224": 2, "22652": 2, "23": 2, "231": 2, "23659": 2, "237": 2, "24": 2, "24587": 2, "249": 2, "25": 2, "26": 2, "27": 2, "274": 2, "277777": 6, "28": 2, "29": 2, "291": 2, "3": [1, 2, 3], "30": 2, "31": 2, "311": 2, "32": 2, "33": 2, "33581": 2, "34": 2, "35": 2, "36": 2, "37": 2, "3700": 2, "38": 2, "39": 2, "4": [2, 3], "40": 2, "4000": 6, "41": 2, "42": 2, "42882": 2, "43": 2, "44": 2, "44266": 2, "45": 2, "46": 2, "47": 2, "48": 2, "48541": 2, "49": 2, "5": [1, 2, 3, 6], "50": [2, 4, 5, 6], "500": 6, "51": 2, "52": 2, "53": [2, 6], "54": 2, "55": 2, "56": 2, "57": 2, "58": 2, "59": 2, "59147": 2, "6": [2, 3], "60": 2, "61": 2, "62": 2, "63": 2, "64": 2, "65": 2, "65578": 2, "66": 2, "67": 2, "68": 2, "69": 2, "7": 2, "70": 2, "71": 2, "72": 2, "73": 2, "74": 2, "75": 2, "76": 2, "77": 2, "77367": 2, "7778": 6, "78": 2, "79": 2, "8": [2, 3], "80": [2, 4, 5, 6], "81": 2, "82": 2, "82455": 2, "83": 2, "84": 2, "85": 2, "86": 2, "87": 2, "87444": 2, "88": 2, "89": 2, "9": [2, 6], "90": 2, "91": 2, "92": 2, "93": 2, "9322": 2, "94": 2, "95": [1, 2, 6], "96": 2, "97": 2, "98": 2, "A": 2, "As": 1, "For": [1, 2, 3, 5, 6, 8], "If": [5, 6], "In": [0, 1, 3, 6], "Notting": 6, "The": [0, 1, 3, 4, 5, 6, 8], "Their": 5, "Then": 6, "These": [2, 6], "To": [1, 6], "With": [0, 6], "abbrevi": 6, "about": 6, "abov": 1, "account": [3, 5, 6], "accur": 5, "achiev": 1, "activ": [2, 6], "ad": 1, "adapt": [2, 6], "address": [1, 6], "administr": 6, "advis": 6, "affect": 1, "again": 6, "aggr_co2": 6, "air": 6, "airplan": 6, "airport": [1, 6], "alb": 6, "all": [2, 6], "allow": 6, "also": [3, 5, 6], "alwai": 6, "amorph": 2, "an": [1, 2, 3, 5, 6], "analog": 6, "analysi": 6, "annual": 6, "appli": 6, "applianc": 6, "applic": 6, "approach": 1, "approxim": 3, "april": 5, "ar": [1, 2, 3, 4, 5, 6], "ardenn": 6, "area": 6, "area_shar": 3, "around": [1, 2], "asid": [0, 5], "ask": [5, 6], "assess": 6, "assign": 1, "associ": 1, "assum": [5, 6], "automat": [4, 5], "avail": [6, 8], "averag": [2, 4, 5, 6], "bad": 5, "baden": 6, "bafa": 6, "bahn": 2, "bangkok": 6, "base": [3, 6], "basi": 2, "basic": [6, 8], "batteri": 2, "becaus": 6, "behaviour": 5, "below": [1, 2], "best": 1, "between": [1, 3, 6], "bicycl": [2, 6], "bicylc": 5, "big": 6, "bilan": 6, "bool": 1, "boolean": [0, 6], "borough": 6, "both": 1, "braunkohl": 2, "brikett": 2, "brussel": 6, "bu": [0, 1, 2, 6], "build": [3, 6], "buildin": 3, "built": 6, "buse": 6, "busi": [2, 4, 7], "business_class": [2, 4], "bz": 2, "c": 6, "calc_co2_businesstrip": 1, "calc_co2_commut": 6, "calcul": [0, 4, 5, 6, 7, 8], "calculate_trip": 8, "call": 1, "can": [0, 1, 2, 3, 4, 5, 6], "canada": 6, "capac": 2, "car": [0, 1, 2, 6, 8], "car_passeng": 2, "caraca": 6, "carbon": 4, "case": [0, 3, 6], "categor": 6, "categori": 2, "caus": [6, 8], "central": 2, "characterist": 6, "chip": 3, "circl": 1, "citi": 6, "class": [2, 6], "client": 1, "clnt": 1, "cng": [2, 4, 5, 6], "co": 6, "co2": [6, 7], "co2calcul": [6, 8], "co2e": [2, 4, 5, 6, 8], "co2e_unit": 2, "coal": [2, 3, 6], "code": [1, 6], "coeffici": [1, 6], "cold": 5, "collect": 6, "combin": 1, "comment": 2, "committe": 6, "common": 3, "commonli": 6, "commut": 7, "complex": 6, "comput": [2, 3], "configur": [4, 5], "constant": [1, 6], "consumpt": [3, 7], "context": 6, "contract": 6, "convers": 6, "conversion_valu": 3, "convert": [3, 6], "coord": 1, "coordin": [1, 6], "counti": 6, "countri": [1, 6], "crow": 6, "csn": 6, "current": [0, 5], "d": 6, "data": [5, 6], "databas": [1, 6], "de": [1, 2, 6], "declar": 6, "default": 3, "defin": 8, "delawar": 6, "depart": 2, "departur": [0, 1], "depend": [0, 1, 2, 4, 5, 6], "dest_dict": 1, "destin": [0, 1, 6], "determin": 6, "deu": 6, "dictionari": 1, "diesel": [2, 4, 5, 6], "differ": [1, 2, 3, 4, 5, 6], "direct": [0, 1], "directli": 6, "distanc": [0, 2, 4, 5, 7, 8], "district": 6, "district_h": 2, "divis": 6, "doc": 0, "document": [4, 5], "domest": 2, "donau": 6, "done": 6, "doubl": [0, 6], "drastic": 2, "drive": [1, 2, 6], "dure": 5, "e": [0, 1, 3, 4, 5, 6], "each": [5, 6], "earth": 6, "economi": [2, 6], "economist": 6, "economy_class": [1, 2, 4], "effet": 6, "either": [0, 6], "el": 2, "electr": [2, 4, 5, 7], "emiss": [0, 1, 3, 4, 6, 7, 8], "emit": [2, 4, 5], "en": [2, 6], "endenergi": 2, "energi": [2, 3, 6], "engin": 6, "enter": [5, 6], "entir": [3, 5, 6], "entiti": 6, "enum": 8, "equival": 6, "erdreich": 2, "ermittlung": 6, "estim": [5, 6], "etc": [4, 5], "eu": [2, 6], "europ": 1, "european": 6, "even": 1, "exampl": 1, "exist": 6, "expect": 3, "express": 2, "fact": 3, "factor": [0, 4, 5, 6, 7], "fahrrad": 2, "fals": 1, "fao": 6, "fernw\u00e4rm": 2, "ferri": [0, 1, 2, 6], "field": [1, 6], "find": [1, 2, 6], "first": [1, 2, 6], "first_class": [2, 4], "flach": 2, "fli": 6, "flight": 2, "floor": 3, "fl\u00fcssiggasheizung": 2, "follow": [0, 5, 6], "foot": [2, 4, 6], "foot_passeng": 2, "forc": 2, "formula": [1, 6], "four": 6, "fra": 1, "freight": 6, "from": [0, 1, 2, 3, 5, 6, 7, 8], "fr\u00e9d\u00e9ric": 6, "fuel": [3, 4, 5, 6], "fuel_typ": [2, 3, 4, 5], "full": 6, "function": [1, 5, 6, 8], "further": 1, "fuzzi": 1, "g": [0, 1, 3, 4, 5, 6], "ga": [2, 3, 6], "gasolin": [2, 4, 5, 6], "gaz": 6, "ge": 6, "gemi": 2, "gener": 6, "geocoding_airport": 6, "geocoding_structur": 6, "geocoding_train_st": 6, "geograph": [1, 6], "german": 6, "german_energy_mix": 2, "germani": 6, "gesamtenergieverbrauch": 6, "ghg": [2, 6], "given": [0, 5, 6], "good": 1, "gov": 6, "great": 1, "greenhous": 6, "gross": 2, "ground": 6, "group": 3, "group_co2": 6, "ha": [0, 1, 6], "hackschnitzel": 2, "hamburg": 1, "handbook": 6, "haul": [2, 6], "hauptbahnhof": 1, "have": [5, 6], "haversin": [1, 6], "heat": 7, "heat_pump_air": 2, "heat_pump_ground": 2, "heat_pump_wat": 2, "heidelberg": 1, "heizung": 2, "heizwerk": 2, "here": [1, 4], "high": 6, "highest": 6, "hill": 6, "holz": 2, "hous": 6, "how": [1, 6], "hybrid": [2, 4, 5, 6], "hydrogen": [2, 4, 5], "h\u00e9ran": 6, "i": [0, 1, 2, 3, 4, 5, 6, 7, 8], "iata": [1, 6], "identifi": 1, "iina": 2, "import": [1, 6, 8], "in_hybrid": [2, 4, 5, 6], "includ": [1, 2], "index": 7, "indic": 0, "individu": 6, "industri": 2, "influenc": [4, 6], "inform": [0, 2], "input": 1, "insid": 6, "instal": 8, "institut": [2, 6], "intens": [2, 4], "intern": 1, "its": 6, "iztapalapa": 6, "just": 3, "kei": 1, "kerosin": 2, "keyword": 1, "kg": [2, 3, 6], "klein": 2, "km": [0, 1, 2, 5, 6], "known": [3, 6], "krajnc": 6, "krei": 6, "kup": 2, "kw": 2, "kwh": [3, 6], "l": [3, 6], "la": 6, "larg": [2, 4, 5, 6], "lat": 1, "later": 6, "latter": 6, "le": 6, "let": 2, "letter": 6, "librari": 1, "life": 6, "like": [1, 6], "line": 6, "lini": 2, "linienbu": 2, "liquid": 6, "liquid_ga": [2, 3], "list": [1, 2], "litr": 3, "local": [1, 2, 5, 6], "locat": [0, 1, 6], "london": 6, "long": [1, 2, 4, 6], "look": 1, "luft": 2, "m": [3, 6], "mai": [0, 1, 2, 3, 5, 6], "make": 6, "manhatten": 6, "manufactur": 2, "marai": 6, "march": 5, "match": 1, "mean": [1, 5], "medium": [2, 4, 5, 6], "merkblatt": 6, "methodologi": 7, "mexico": 6, "mittel": 2, "mix": [2, 3, 6], "mobil": 6, "mode": [0, 1, 5, 7], "model": 2, "modul": 7, "modular": 6, "mono": 2, "month": 5, "most": [1, 6], "mostli": 6, "motorbik": [2, 6], "multipli": 1, "municip": 6, "must": [0, 3, 5], "mw": 2, "m\u00e9thode": 6, "n": 6, "n_member": [5, 6], "n_particip": [5, 6], "name": [2, 6], "necessarili": 6, "need": [1, 6], "neg": 1, "neighbourhood": 6, "next": 6, "nonetheless": 6, "note": 6, "novemb": [5, 6], "number": [4, 5, 6], "ny": 6, "obtain": [1, 5, 6], "occup": [2, 4, 5, 6], "occupi": [3, 6], "octob": 5, "offici": 6, "often": [3, 5], "oil": [2, 3, 6], "onc": [5, 6], "one": 2, "onli": [1, 3, 6], "ontario": 6, "open": [1, 6], "openrouteservic": [1, 6], "option": 6, "ors_api_kei": 1, "other": [0, 6], "otto": 2, "outsid": 6, "over": 5, "overview": 4, "p": [2, 6], "packag": [1, 7, 8], "page": 7, "paramet": [3, 4, 6], "paramt": 0, "pari": 6, "park": 2, "part": [3, 6], "particip": 6, "passeng": [2, 4, 5, 6], "pedelec": [2, 6], "pelia": [1, 6], "pellet": [2, 3, 6], "per": [2, 3], "period": [5, 6], "personenfernverkehrszug": 2, "personennahverkehrszug": 2, "piec": 2, "pip": 8, "pkw": 2, "place": 1, "plane": [0, 1, 2, 6], "planner": 6, "plug": [2, 4, 5, 6], "possibl": [3, 5, 6], "postal": 6, "postalcod": 6, "pour": 6, "power": 6, "predefin": 1, "premium": [2, 6], "premium_economy_class": [2, 4], "primari": 6, "proba": 6, "profil": [1, 6], "provid": [0, 1, 3, 5, 6], "provinc": 6, "pump": 6, "purpos": 6, "pv": 2, "py": 6, "python": [1, 7], "quantifi": 6, "quantiti": [4, 5], "radi": 2, "rang": 2, "range_categori": 1, "range_descript": 1, "refer": 6, "region": 6, "regular": 6, "reisebu": 2, "relat": 7, "report": 6, "repres": [5, 6], "research": 6, "result": 1, "retriev": [1, 6], "rf": 2, "rheinisch": 2, "roundtrip": [0, 1, 6], "rout": 1, "r\u00e9alis": 6, "sampl": [5, 6], "scq": 1, "search": [1, 6, 7], "season": 5, "seat": [1, 2, 6], "seating_class": 4, "see": [1, 5, 6], "select": 6, "self": 6, "separ": 5, "servic": 6, "set": [4, 5], "share": 3, "short": [2, 6], "should": [0, 5], "simpl": 8, "sinc": 6, "size": [2, 4, 5, 6], "small": [2, 4, 5, 6], "so": 6, "solar": [2, 6], "solarkollektor": 2, "some": [3, 8], "sometim": 1, "sourc": [1, 2, 3, 6], "space": 3, "specif": [1, 2, 4, 5, 6], "specifi": [0, 1, 3, 6], "specifica": [0, 5], "speedomet": 0, "stadt": 2, "standard": 6, "start": [1, 6], "start_dict": 1, "state": 6, "station": [1, 6], "station_nam": 1, "step": 1, "stop": 6, "straight": 6, "strassen": 2, "strategi": 2, "street": 6, "string": 1, "structur": [1, 6], "subcategori": 2, "sum": 6, "summar": 4, "summari": 1, "summer": 5, "support": [0, 5, 6], "tabl": [1, 6], "take": 2, "text": 6, "thefuzz": 1, "thei": 5, "therefor": 6, "thi": [1, 3, 5, 6], "three": 6, "thu": 1, "time": [5, 6], "tj": [2, 6], "togeth": 1, "top": 6, "total": 6, "train": [0, 2, 6], "trainlin": [1, 6], "tram": [2, 6], "transport": [0, 1, 2, 5, 7], "transport_mod": 0, "transportation_mod": [1, 8], "transportationmod": 8, "travel": [0, 5, 6], "tremod": 2, "trip": [2, 7], "tupl": 1, "tutori": 7, "two": [1, 6], "type": [3, 4, 5, 6], "typic": 3, "u": [2, 6], "uba": [2, 6], "uk": [2, 6], "umweltfreundlich": 6, "under": [4, 5], "uniqu": 1, "unit": [2, 3, 6], "urban": 6, "us": [0, 1, 3, 5], "user": [0, 1, 5, 6], "usual": [1, 5, 6], "vehicl": [2, 4, 5], "vehicle_rang": [4, 5], "veri": 6, "vernacular": 6, "version": 6, "via": 8, "visual": 6, "wa": 0, "wasser": 2, "water": 6, "we": [1, 6], "weather": 5, "weekli": [5, 6], "weekly_dist": 5, "well": [1, 7], "were": 6, "what": 6, "when": 0, "wherea": 6, "whether": 0, "which": [0, 1, 4, 6], "while": [2, 3], "who": 6, "wil": 0, "winter": 5, "within": [1, 2, 6], "wood": [3, 6], "woodchip": [2, 3, 6], "work": [1, 3, 6, 7], "work_week": 6, "world": [1, 6], "w\u00e4rmepump": 2, "w\u00fcrttemberg": 6, "x": 6, "year": 5, "you": [1, 2], "zur": 6, "\u00e0": 6, "\u00e9mission": 6, "\u00f6ko": 2, "\u00f6l": 2}, "titles": ["Business trips", "Distance calculations", "Emission factors", "Heating and electricity", "Transportation modes", "Commuting", "Methodology", "Welcome to co2calculator\u2019s documentation!", "Tutorial"], "titleterms": {"": [6, 7], "1": 6, "2": 6, "3": 6, "4": 6, "aggreg": [5, 6], "air": 1, "also": 0, "b": 1, "bicycl": 5, "bu": [4, 5], "busi": [0, 6], "c": 1, "calcul": 1, "car": [4, 5], "categori": 6, "co2calcul": 7, "commut": [5, 6], "comput": [1, 6], "consumpt": 6, "content": [3, 4, 5, 7], "convers": [2, 3], "crow": 1, "default": 6, "defin": 6, "detour": [1, 6], "distanc": [1, 6], "document": 7, "electr": [3, 6], "emiss": [2, 5], "factor": [2, 3], "ferri": 4, "fli": 1, "geocod": [1, 6], "group": [5, 6], "heat": [2, 3, 6], "indic": 7, "level": [5, 6], "methodologi": 6, "mode": [4, 6], "motorbik": 5, "other": 1, "paramet": 1, "pedelec": 5, "plane": 4, "rang": 6, "road": 1, "see": 0, "share": 6, "specifica": 6, "tabl": 7, "train": [1, 4, 5], "tram": 5, "transport": [4, 6], "travel": 1, "trip": [0, 1, 4, 6], "tutori": 8, "us": 6, "valu": 6, "welcom": 7}}) \ No newline at end of file diff --git a/tutorial.html b/tutorial.html new file mode 100644 index 0000000..fa68e96 --- /dev/null +++ b/tutorial.html @@ -0,0 +1,135 @@ + + + + + + + + Tutorial — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Tutorial

+

The co2calculator package is available via pip:

+
pip install co2calculator
+
+
+

For a simple and basic emission calculation, import the calculation function and define some emission cause:

+

+from co2calculator import calculate_trip
+from co2calculator.enums import TransportationMode
+
+co2e = calculate_trip(distance=200,transportation_mode=TransportationMode.CAR)
+
+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file