From 00774350c3ed0d27ae6f5e027d957c1568504943 Mon Sep 17 00:00:00 2001 From: codingfabi Date: Sun, 5 May 2024 14:24:08 +0000 Subject: [PATCH] deploy: 9c0ae9effa2354036df2a3247d3e0f413508a256 --- .buildinfo | 4 + .doctrees/api.doctree | Bin 0 -> 3037 bytes .doctrees/calculate/distances.doctree | Bin 0 -> 23510 bytes .doctrees/calculate/electricity.doctree | Bin 0 -> 3422 bytes .doctrees/calculate/emission_factors.doctree | Bin 0 -> 246601 bytes .doctrees/calculate/heating.doctree | Bin 0 -> 10338 bytes .doctrees/calculate/transport_modes.doctree | Bin 0 -> 11557 bytes .doctrees/documentation.doctree | Bin 0 -> 66207 bytes .doctrees/environment.pickle | Bin 0 -> 586559 bytes .doctrees/index.doctree | Bin 0 -> 5942 bytes .doctrees/mobility.doctree | Bin 0 -> 16571 bytes .doctrees/tutorial.doctree | Bin 0 -> 3904 bytes .nojekyll | 0 .../Workflow_figure_co2_calculator.drawio.png | Bin 0 -> 61526 bytes _sources/api.rst.txt | 8 + _sources/calculate/distances.rst.txt | 110 + _sources/calculate/electricity.rst.txt | 10 + _sources/calculate/emission_factors.rst.txt | 13 + _sources/calculate/heating.rst.txt | 21 + _sources/calculate/transport_modes.rst.txt | 43 + _sources/documentation.md.txt | 149 ++ _sources/index.rst.txt | 33 + _sources/mobility.rst.txt | 82 + _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 ++ api.html | 127 ++ calculate/distances.html | 249 +++ calculate/electricity.html | 132 ++ calculate/emission_factors.html | 1836 +++++++++++++++++ calculate/heating.html | 179 ++ calculate/transport_modes.html | 183 ++ documentation.html | 314 +++ genindex.html | 120 ++ index.html | 153 ++ mobility.html | 194 ++ objects.inv | Bin 0 -> 1322 bytes search.html | 137 ++ searchindex.js | 1 + tutorial.html | 137 ++ 52 files changed, 7122 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/api.doctree create mode 100644 .doctrees/calculate/distances.doctree create mode 100644 .doctrees/calculate/electricity.doctree create mode 100644 .doctrees/calculate/emission_factors.doctree create mode 100644 .doctrees/calculate/heating.doctree create mode 100644 .doctrees/calculate/transport_modes.doctree create mode 100644 .doctrees/documentation.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/mobility.doctree create mode 100644 .doctrees/tutorial.doctree create mode 100644 .nojekyll create mode 100644 _images/Workflow_figure_co2_calculator.drawio.png create mode 100644 _sources/api.rst.txt create mode 100644 _sources/calculate/distances.rst.txt create mode 100644 _sources/calculate/electricity.rst.txt create mode 100644 _sources/calculate/emission_factors.rst.txt create mode 100644 _sources/calculate/heating.rst.txt create mode 100644 _sources/calculate/transport_modes.rst.txt create mode 100644 _sources/documentation.md.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/mobility.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 api.html create mode 100644 calculate/distances.html create mode 100644 calculate/electricity.html create mode 100644 calculate/emission_factors.html create mode 100644 calculate/heating.html create mode 100644 calculate/transport_modes.html create mode 100644 documentation.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 mobility.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..a89964e --- /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: e034d179c20c6002bef13f6d2f368b30 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..abc05535bdf0f878079a4a2556933fce84e67050 GIT binary patch literal 3037 zcmb7GTWcIQ6n1Ry)%My>;!sGOCX_S@jd$D7hmz8VkWyOQno>$Ar9o(Cv@78mX{w98 zCKy^sNDX?6`bYXx`iuH$W_G>1ArCby9vvN>>-Qb$kH+8sZmg7le%lmW$Vs23sZ=R5 z!M9VDxSUBF-iC*NhV$^icQidU%ISm!zXFYfi!9Ylh8My2qPi8C>DT95h9y=gIXli9 zyvbWH!UNv%4J&NM=C*wM>5t#t`C26=L>;KC|I8-Q_uS6wP{q+KD7@OhcYTM zEFH(Kz_cP)7NV~W61aW1 z>V|y9?^rs7x+aOrh$&bySDLD7{6oaf@1isx;dc+e`}jRX?CYhz-}&vAm!F-#e0)Cr z9~}RLA6!PtAMx8Lh`&*{8s+U%XO(ezPW4&vyK^gofEF9H-o@XvIgRD*I>?T1+Obxy zcqjhY^%k=GpUJgxzLP0Au4+l=n;K6)#p$n>PtPm)&Lq#Cn1V(= zwhPS+(nssN-9eGwqe!^ zImV3IjpQ$f&PXe1nM{LkKBt)jmuFL}shlmG4M%+Y$alsJG>yCrSfms~!P30IVxw|M z;N=+0ZoPCm!)nW_gv4PGcj35!2qR^#j+C-eSvI$Mc*SqU*(Y62CL^Wu07=ha1{I)p z9!IKy$(xmgWvrBtQ(-xojwE=j57aa2$Zu*^C~Zl`P8iC!>bsm~vt`5YvWY;|EVa%| zl^VX0vY{KpUGJ1?iK;!VKPxEw1V$AJ39E{zzBTbTHGW| zYo!UNGR>Gq#bc<64Su_-^qiGOX(jmmrJW@c{2$+|j9vyXJ$h?#W9g*di3tE`hNC`N zNrkP9%CVzkhH|H%#wu6E0b08HRU03%1fnJ76zjwpvn0aP{;lfaw47fDJk zMSfKPTU)8i3o^qWs#*#Jpr<7T?~nX;DJhX1dw(e^40EX>pe(d@*rZT~k@=G)L=sC* zgb@`!w@E5YoWn?@j06^JFl9*z}7t z%a!aaJst$V7d6WOph+yt(H>h)Dpnla`}A|vv!_SNlKCjPH2?9`JeW!&UXPjX3uZ^9 z53qm0ZJxnd2SXGTDldw*-v=ObGUMhf0bH#SAs2qfoJmV3go`oH@B?_)<0uY()8I0+ zu1H6xg!@5uOMB=ECs1`2UJ;8oxE)tn&0$BGB^a z9u_M}sc*-i{xL2pMZWmW5FXlJPrC?Ih+lS1@XpAT()dO$Ru-V UgvdB{tDDBzR*!*rTf1TZKb3^6ZU6uP literal 0 HcmV?d00001 diff --git a/.doctrees/calculate/distances.doctree b/.doctrees/calculate/distances.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e40ab5543f193d5aaabd21711748393be6d8038d GIT binary patch literal 23510 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 lx0`!_X>4VR+X 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 literal 0 HcmV?d00001 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..dcd95e1e7571018190a7d33cef3219d95384eccc GIT binary patch literal 586559 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 YEDv9*C2G98U@mbh_}E;xWGyrCKU-&)B>(^b literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b53acdeaedfb14c80cacf74b9c4f0e99789b9a1a GIT binary patch literal 5942 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 An*aa+ 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/_images/Workflow_figure_co2_calculator.drawio.png b/_images/Workflow_figure_co2_calculator.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..a327dbda1874e206ec8e36684d8ec702e16cd9ac GIT binary patch literal 61526 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, +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/electricity.rst.txt b/_sources/calculate/electricity.rst.txt new file mode 100644 index 0000000..9322093 --- /dev/null +++ b/_sources/calculate/electricity.rst.txt @@ -0,0 +1,10 @@ +=========== +Electricity +=========== + +.. contents:: + + +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/emission_factors.rst.txt b/_sources/calculate/emission_factors.rst.txt new file mode 100644 index 0000000..f4ae690 --- /dev/null +++ b/_sources/calculate/emission_factors.rst.txt @@ -0,0 +1,13 @@ + +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 + +.. csv-table:: Conversion factors heating + :file: ../../data/emission_factors.csv + :header-rows: 1 + :stub-columns: 2 diff --git a/_sources/calculate/heating.rst.txt b/_sources/calculate/heating.rst.txt new file mode 100644 index 0000000..e549d00 --- /dev/null +++ b/_sources/calculate/heating.rst.txt @@ -0,0 +1,21 @@ + +======= +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 building. +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. diff --git a/_sources/calculate/transport_modes.rst.txt b/_sources/calculate/transport_modes.rst.txt new file mode 100644 index 0000000..8e7ea27 --- /dev/null +++ b/_sources/calculate/transport_modes.rst.txt @@ -0,0 +1,43 @@ +==================== +Transportation modes +==================== + +.. contents:: + +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, 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, small, medium, large)and the ``vehicle_range`` (local, long-distance). + +Train trip +---------- +The quantity of CO2e emitted by a train trip depends on the ``vehicle_range`` (local, long-distance). + +Plane trip +---------- +The quantity of CO2e emitted by a plane trip depends on the +``seating_class`` (average, economy_class, business_class, first_class). + +Ferry trip +---------- +The quantity of CO2e emitted by a ferry trip depends on the +``seating_class`` (average, Foot passenger, Car passenger). + + +Motorbike trip +-------------- +The quantity of CO2e emitted by a motorbike trip depends on the ``size`` (average, small, medium, large) of the +motorbike. + +Tram, trolleybus, bicycle or pedelec trip +----------------------------------------- +For tram, trolleybus, bicylce or pedelec, no specifica have to be provided. diff --git a/_sources/documentation.md.txt b/_sources/documentation.md.txt new file mode 100644 index 0000000..9f74087 --- /dev/null +++ b/_sources/documentation.md.txt @@ -0,0 +1,149 @@ +# Methodology + +The *co2calculator* can compute emissions caused by mobility, heating and electricity consumption. Emissions are given as CO2 equivalents (CO2e). + +```{image} img/Workflow_figure_co2_calculator.drawio.png +:alt: workflow figure co2calculator +:class: bg-primary +:width: 600px +:align: center +``` + +## 1 General information +### What are CO2e emissions? + +Anthropogenic climate change is caused by greenhouse gases, such as carbon dioxide (CO2), methane (CH4), nitrous oxides (N2O) and others. The molecules of these gases contribute differently to global warming. For example, the impact of one methane molecule is 21 times higher than the impact caused by one carbon dioxide molecule ([Moss et al. 2000](https://animres.edpsciences.org/articles/animres/abs/2000/03/z0305/z0305.html)). This is why the impact of different greenhouse gases is usually converted to the equivalent impact that carbon dioxide molecules would have, resulting in CO2e equivalents as a standard unit ([Gohar & Shine 2007](https://rmets.onlinelibrary.wiley.com/doi/10.1002/wea.103)). The basic formula for a consumption value {math}`c` and an emission factor {math}`\epsilon` is: + + +### Sources + +```{math} +y_{co_2} = \epsilon \cdot c +``` + +CO2e emissions are quantified in kilograms. The unit of consumption values depend on the specific activity. For heating and electricity, the input value is the consumption in kilowatt-hours (kWh), and for mobility, it is the distance travelled in kilometers (km). + +### Emission factor sources and uncertainties + +The CO2e emissions are calculated using emission factors from different sources: +- Electricity: [carbon footprint (2023). International electricity factors.](https://www.carbonfootprint.com/international_electricity_factors.html) +- Mobility: [mobitoool (2023). mobitool-Faktoren v3.0](https://www.mobitool.ch/de/tools/mobitool-faktoren-v2-1-25.html) +- Heating: [GOV.UK (2023). Greenhouse gas reporting: conversion factors 2023](https://www.gov.uk/government/publications/greenhouse-gas-reporting-conversion-factors-2023) + +The specific emission factors for different activities are collected in [this emission factor table](https://github.com/pledge4future/co2calculator/blob/main/data/emission_factors.csv). + +Several data sources for emission factors are available with differences in their level of detail (e.g. occupancy rates of vehicles, car sizes...), geographic resolution (e.g. national, sub-national...) and up-to-dateness with resulting implications for their within- and across-country comparability. +With the selected sources, we aim at providing reliable and user-friendly emission calculations that are comparable across countries, most recent and that come along with acceptable user efforts. When comparisons within countries or more detailed heating emission calculations are required, we suggest to rely on national sources and to provide custom emission factors as district heating can vary significantly across district heating networks within a country. Similarly, while emission factors for most public and private transport are globally comparable, those for electrically powered trams or trains vary significantly across countries. For possible more detailed emission factors, see [Geographical coverage](#geographical-coverage). + +(compliance-with-the-ghg-protocols)= +### Compliance with the GHG Protocols + +The Greenhouse Gas (GHG) Protocol Corporate Standards provide a globally used framework to measure greenhouse gas emissions ([Greenhouse Gas Protocol 2024](https://ghgprotocol.org/)). They account for three scopes: +* Scope 1 emissions are direct emissions from sources that are owned or controlled by the reporting entity, such as emissions from combustion in owned vehicles or boilers. +* Scope 2 emissions are indirect emissions caused by the generation of purchased or consumed electricity, heating, cooling or steam. +* Scope 3 emissions are indirect emissions other than those captured in scope 3. These include all other emissions generated in the life cycle of the product, including production and disposal. + +For electricity and mobility, the *co2calculator* computes emissions based on the whole life cycle of a product, i.e. including scope 3 emissions. For heating, scope 1 emissions are caculated. + +(geographical-coverage)= +### Geographical coverage +The *co2calculator* can compute heating and mobility CO2e emissions for the whole globe. For electricity, emissions of production mixes can be calculated for the whole globe and residual mixes for most European countries. + +Sub-national electricity emission factors for the USA, Canada and Australia are available on [carbon footprint (2023). International electricity factors.](https://www.carbonfootprint.com/docs/2023_07_international_factors_release_11.xlsx). Further sub-national emission factors for the USA are also available on [EPA (2023)](https://www.epa.gov/system/files/documents/2023-03/ghg_emission_factors_hub.pdf). Detailed emission factors specifically for Germany can be derived from [ProBas](https://www.probas.umweltbundesamt.de/). Detailed emission factors specifically for France are available on [Base Carbone (2023)](https://data.ademe.fr/datasets/base-carboner). + +Country-specific emission factors for Switzerland, Austria, Germany, France and Italy for eletric trams and trains are provided by [mobitoool (2023). mobitool-Faktoren v3.0](https://www.mobitool.ch/de/tools/mobitool-faktoren-v2-1-25.html). + + +## 1 Electricity + +Electricity CO2e emissions can either be calculated from country-specific production mixes or, when available, residual mixes ([Carbon Footprint 2023](https://www.carbonfootprint.com/international_electricity_factors.html)). Production mixes are the mix of fuels used by local power stations and, therefore, the basis for location-based reporting. Residual mixes are electricity mixes after removing energy from specific (e.g. green or renewable) tariffs. These values can thus be used for emission accounting when the user has not bought energy from a specific mix of fuels. Emission factors rely on total or, respectively, residual production fuel mixes, which include scope 2 and scope 3 emissions of the GHG protocol (for details, see [Compliance with the GHG Protocols](#compliance-with-the-ghg-protocols)). +Alternatively, users can provide specific emission factors, for example, when they use green or renewable tariffs. + +Consumption must be provided in kilowatt-hours (kWh). The returned CO2e emissions are quantified in kilograms. + + +### Calculation of a share of electricity use + +If the electricity consumption is only known for a building or building complex and emissions should only be computed for parts of the building, the total consumption and an estimate of the share of energy use (approximated from the share of the building area) can be provided. + + +## 2 Heating + +Heating CO2e emissions depend on the type of burned fuel. Fuel types may be, for example, oil, gas, coal or biogas. The emissions are calculated using emission factors from ([GOV.UK 2023](https://www.gov.uk/government/publications/greenhouse-gas-reporting-conversion-factors-2023)). +The provided emission factors reflect scope 1 emissions of the GHG protocol (for details, see [Compliance with the GHG Protocols](#compliance-with-the-ghg-protocols)). +As we only have values at country level, we note that district heating varies considerably between district heating networks within countries. + +Consumption must be provided in kilowatt-hours (kWh). The returned CO2e emissions are quantified in kilograms. + +### Calculation of a share of heating consumption + +If the heating consumption is only known for a building or building complex and emissions should only be computed for parts of the building, the total consumption and an estimate of the share of energy use (approximated from the share of the building area) can be provided. + + +## 3 Mobility + +CO2e emissions from the mobility sector are calculated using emission factors from ([mobitoool 2023](https://www.mobitool.ch/de/tools/mobitool-faktoren-v2-1-25.html)). The emissions include scope 3 emissions of the GHG protocol (for details, see [Compliance with the GHG Protocols](#compliance-with-the-ghg-protocols)). For public transport, the emission factors assume certain occupancies. For private transport, an occupancy of one person is assumed. Further details can be found in ([Sacchi & Bauer 2023)](https://doi.org/10.5281/zenodo.5156043)). + +Mobility emissions depend on the mode of transport, such as car or bicycle, and the distance travelled in kilometers (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/main/co2calculator/distances.py). In the latter case, the coordinates of the locations are retrieved using geocoding before the travel distance between the locations is computed (for details, see [Geocoding](#geocoding)). + +(geocoding)= +### Geocoding + +Geocoding is done using the [openrouteservice](https://openrouteservice.org/dev/#/api-docs) geocoding service, which is built on top of [Pelias](https://github.com/pelias/pelias), a modular open-source search engine for the world. + +To find airports, we use [ourairports-data](https://davidmegginson.github.io/ourairports-data/) to search by **IATA-code**. To find train stations inside the EU, 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). 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. Then, different [detour coefficients or constants](#detour) 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 | x 1.0 | Currently no source + + +## 4 Calculation of the carbon budget + +### The carbon budget + +According to the IPCC (2021), + +>"[the] term ‘carbon budget’ refers to the maximum amount of cumulative net global anthropogenic $CO_2$ emissions that would result in limiting global warming to a given level with a given probability, taking into account the effect of other anthropogenic climate forcers. This is referred to as the total carbon budget when expressed starting from the pre-industrial period, and as the remaining carbon budget when expressed from a recent specified date [...]. The remaining carbon budget indicates how much CO2 could still be emitted while keeping warming below a specific temperature level". + +([IPCC 2021, p. 28](https://www.ipcc.ch/report/ar6/wg1/downloads/report/IPCC_AR6_WGI_SPM.pdf)) + +### Calculation of the remaining carbon budget + +To calculate the remaining carbon budget, we followed an equal-per-capita approach. This means that the remaining global carbon budget is distributed equally among the world's population. First, we divide the amount of CO2 that could still be emitted worldwide by the world population. For example, to reach the 1.5° goal, 300 billion tons of CO2 could still be emitted. Taking into account that the population of the world is growing, we do not divide the amount of CO2 by the current population of the world, but instead by the mean between the current population and the population projected for 2050. 2050 is when most of the countries plan to be carbon neutral. Finally, we divide the remaining carbon budget per person by the number of years left until carbon neutrality should be reached. + +The calculation of the carbon budget is summed up in the following table. Since Germany has pledged to be carbon neutral already by 2045, the remaining time is shorter and therefore the remaining carbon budget per person and year is a bit higher. You can view this remaining carbon budget as the average amount of carbon that could still be emitted per year and person until 2050 (or, respectively for Germany, 2045). + +Goal (°C) | Total carbon budget [t] | Carbon budget per person (2020-2050) [t] | Carbon budget per person and year in Germany (2020-2045) [t] | Carbon budget per person and year (2020-2050) [t] +------------ | ------------- | ------------- | ------------ | ------------- +1.5 | 3 billion | 34.0 | 1.4 | 1.1 +2 | 9 billion | 101.9 | 4.1 | 3.4 diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..d527703 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,33 @@ +.. 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 + mobility + calculate/heating + calculate/electricity + calculate/emission_factors + api + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/mobility.rst.txt b/_sources/mobility.rst.txt new file mode 100644 index 0000000..a90d7d1 --- /dev/null +++ b/_sources/mobility.rst.txt @@ -0,0 +1,82 @@ +======== +Mobility +======== + +.. toctree:: + :maxdepth: 2 + :caption: See also: + :titlesonly: + :includehidden: + + calculate/distances + calculate/transport_modes + +============== +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 :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 + +============== +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 +: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 ``fuel_type`` (cng, diesel) and bus ``size`` (average, small, medium, large). 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. + +Train, tram, bicycle or pedelec commute +-------------------------------- +For train, tram, bicylce or pedelec, no specifica have to be provided. 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..1172a4f --- /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 250px; +} + +div.sphinxsidebar { + width: 250px; + 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/api.html b/api.html new file mode 100644 index 0000000..a3faca4 --- /dev/null +++ b/api.html @@ -0,0 +1,127 @@ + + + + + + + + API Docs — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

API Docs

+ + + +
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/calculate/distances.html b/calculate/distances.html new file mode 100644 index 0000000..156efec --- /dev/null +++ b/calculate/distances.html @@ -0,0 +1,249 @@ + + + + + + + + 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/electricity.html b/calculate/electricity.html new file mode 100644 index 0000000..dd982f4 --- /dev/null +++ b/calculate/electricity.html @@ -0,0 +1,132 @@ + + + + + + + + Electricity — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

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/emission_factors.html b/calculate/emission_factors.html new file mode 100644 index 0000000..b092286 --- /dev/null +++ b/calculate/emission_factors.html @@ -0,0 +1,1836 @@ + + + + + + + + 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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.html b/calculate/heating.html new file mode 100644 index 0000000..58cc8c6 --- /dev/null +++ b/calculate/heating.html @@ -0,0 +1,179 @@ + + + + + + + + Heating — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

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 building. +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.

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

Transportation modes

+ +

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, 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, small, medium, large)and the vehicle_range (local, long-distance).

+
+
+

Train trip

+

The quantity of CO2e emitted by a train trip depends on the vehicle_range (local, long-distance).

+
+
+

Plane trip

+

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

+
+
+

Ferry trip

+

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

+
+
+

Motorbike trip

+

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

+
+
+

Tram, trolleybus, bicycle or pedelec trip

+

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

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

Methodology

+

The co2calculator can compute emissions caused by mobility, heating and electricity consumption. Emissions are given as CO2 equivalents (CO2e).

+workflow figure co2calculator +
+

1 General information

+
+

What are CO2e emissions?

+

Anthropogenic climate change is caused by greenhouse gases, such as carbon dioxide (CO2), methane (CH4), nitrous oxides (N2O) and others. The molecules of these gases contribute differently to global warming. For example, the impact of one methane molecule is 21 times higher than the impact caused by one carbon dioxide molecule (Moss et al. 2000). This is why the impact of different greenhouse gases is usually converted to the equivalent impact that carbon dioxide molecules would have, resulting in CO2e equivalents as a standard unit (Gohar & Shine 2007). The basic formula for a consumption value \(c\) and an emission factor \(\epsilon\) is:

+
+
+

Sources

+
+\[y_{co_2} = \epsilon \cdot c\]
+

CO2e emissions are quantified in kilograms. The unit of consumption values depend on the specific activity. For heating and electricity, the input value is the consumption in kilowatt-hours (kWh), and for mobility, it is the distance travelled in kilometers (km).

+
+
+

Emission factor sources and uncertainties

+

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.

+

Several data sources for emission factors are available with differences in their level of detail (e.g. occupancy rates of vehicles, car sizes…), geographic resolution (e.g. national, sub-national…) and up-to-dateness with resulting implications for their within- and across-country comparability. +With the selected sources, we aim at providing reliable and user-friendly emission calculations that are comparable across countries, most recent and that come along with acceptable user efforts. When comparisons within countries or more detailed heating emission calculations are required, we suggest to rely on national sources and to provide custom emission factors as district heating can vary significantly across district heating networks within a country. Similarly, while emission factors for most public and private transport are globally comparable, those for electrically powered trams or trains vary significantly across countries. For possible more detailed emission factors, see Geographical coverage.

+
+
+

Compliance with the GHG Protocols

+

The Greenhouse Gas (GHG) Protocol Corporate Standards provide a globally used framework to measure greenhouse gas emissions (Greenhouse Gas Protocol 2024). They account for three scopes:

+
    +
  • Scope 1 emissions are direct emissions from sources that are owned or controlled by the reporting entity, such as emissions from combustion in owned vehicles or boilers.

  • +
  • Scope 2 emissions are indirect emissions caused by the generation of purchased or consumed electricity, heating, cooling or steam.

  • +
  • Scope 3 emissions are indirect emissions other than those captured in scope 3. These include all other emissions generated in the life cycle of the product, including production and disposal.

  • +
+

For electricity and mobility, the co2calculator computes emissions based on the whole life cycle of a product, i.e. including scope 3 emissions. For heating, scope 1 emissions are caculated.

+
+
+

Geographical coverage

+

The co2calculator can compute heating and mobility CO2e emissions for the whole globe. For electricity, emissions of production mixes can be calculated for the whole globe and residual mixes for most European countries.

+

Sub-national electricity emission factors for the USA, Canada and Australia are available on carbon footprint (2023). International electricity factors.. Further sub-national emission factors for the USA are also available on EPA (2023). Detailed emission factors specifically for Germany can be derived from ProBas. Detailed emission factors specifically for France are available on Base Carbone (2023).

+

Country-specific emission factors for Switzerland, Austria, Germany, France and Italy for eletric trams and trains are provided by mobitoool (2023). mobitool-Faktoren v3.0.

+
+
+
+

1 Electricity

+

Electricity CO2e emissions can either be calculated from country-specific production mixes or, when available, residual mixes (Carbon Footprint 2023). Production mixes are the mix of fuels used by local power stations and, therefore, the basis for location-based reporting. Residual mixes are electricity mixes after removing energy from specific (e.g. green or renewable) tariffs. These values can thus be used for emission accounting when the user has not bought energy from a specific mix of fuels. Emission factors rely on total or, respectively, residual production fuel mixes, which include scope 2 and scope 3 emissions of the GHG protocol (for details, see Compliance with the GHG Protocols). +Alternatively, users can provide specific emission factors, for example, when they use green or renewable tariffs.

+

Consumption must be provided in kilowatt-hours (kWh). The returned CO2e emissions are quantified in kilograms.

+
+

Calculation of a share of electricity use

+

If the electricity consumption is only known for a building or building complex and emissions should only be computed for parts of the building, the total consumption and an estimate of the share of energy use (approximated from the share of the building area) can be provided.

+
+
+
+

2 Heating

+

Heating CO2e emissions depend on the type of burned fuel. Fuel types may be, for example, oil, gas, coal or biogas. The emissions are calculated using emission factors from (GOV.UK 2023). +The provided emission factors reflect scope 1 emissions of the GHG protocol (for details, see Compliance with the GHG Protocols). +As we only have values at country level, we note that district heating varies considerably between district heating networks within countries.

+

Consumption must be provided in kilowatt-hours (kWh). The returned CO2e emissions are quantified in kilograms.

+
+

Calculation of a share of heating consumption

+

If the heating consumption is only known for a building or building complex and emissions should only be computed for parts of the building, the total consumption and an estimate of the share of energy use (approximated from the share of the building area) can be provided.

+
+
+
+

3 Mobility

+

CO2e emissions from the mobility sector are calculated using emission factors from (mobitoool 2023). The emissions include scope 3 emissions of the GHG protocol (for details, see Compliance with the GHG Protocols). For public transport, the emission factors assume certain occupancies. For private transport, an occupancy of one person is assumed. Further details can be found in (Sacchi & Bauer 2023)).

+

Mobility emissions depend on the mode of transport, such as car or bicycle, and the distance travelled in kilometers (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 are retrieved using geocoding before the travel distance between the locations is computed (for details, see Geocoding).

+
+

Geocoding

+

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

+

To find airports, we use ourairports-data to search by IATA-code. To find train stations inside the EU, 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. 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

x 1.0

Currently no source

+
+
+
+
+

4 Calculation of the carbon budget

+
+

The carbon budget

+

According to the IPCC (2021),

+
+

“[the] term ‘carbon budget’ refers to the maximum amount of cumulative net global anthropogenic $CO_2$ emissions that would result in limiting global warming to a given level with a given probability, taking into account the effect of other anthropogenic climate forcers. This is referred to as the total carbon budget when expressed starting from the pre-industrial period, and as the remaining carbon budget when expressed from a recent specified date […]. The remaining carbon budget indicates how much CO2 could still be emitted while keeping warming below a specific temperature level”.

+
+

(IPCC 2021, p. 28)

+
+
+

Calculation of the remaining carbon budget

+

To calculate the remaining carbon budget, we followed an equal-per-capita approach. This means that the remaining global carbon budget is distributed equally among the world’s population. First, we divide the amount of CO2 that could still be emitted worldwide by the world population. For example, to reach the 1.5° goal, 300 billion tons of CO2 could still be emitted. Taking into account that the population of the world is growing, we do not divide the amount of CO2 by the current population of the world, but instead by the mean between the current population and the population projected for 2050. 2050 is when most of the countries plan to be carbon neutral. Finally, we divide the remaining carbon budget per person by the number of years left until carbon neutrality should be reached.

+

The calculation of the carbon budget is summed up in the following table. Since Germany has pledged to be carbon neutral already by 2045, the remaining time is shorter and therefore the remaining carbon budget per person and year is a bit higher. You can view this remaining carbon budget as the average amount of carbon that could still be emitted per year and person until 2050 (or, respectively for Germany, 2045).

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

Goal (°C)

Total carbon budget [t]

Carbon budget per person (2020-2050) [t]

Carbon budget per person and year in Germany (2020-2045) [t]

Carbon budget per person and year (2020-2050) [t]

1.5

3 billion

34.0

1.4

1.1

2

9 billion

101.9

4.1

3.4

+
+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..4f62864 --- /dev/null +++ b/genindex.html @@ -0,0 +1,120 @@ + + + + + + + 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..d42919b --- /dev/null +++ b/index.html @@ -0,0 +1,153 @@ + + + + + + + + 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/mobility.html b/mobility.html new file mode 100644 index 0000000..a7d99f1 --- /dev/null +++ b/mobility.html @@ -0,0 +1,194 @@ + + + + + + + + Mobility — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +
+

Mobility

+ +
+
+

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).

+
+
+

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 fuel_type (cng, diesel) and bus size (average, small, medium, large). 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.

+
+
+

Train, tram, bicycle or pedelec commute

+

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

+
+
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..c446337f03da1e32f674933ff0e321641ae94685 GIT binary patch literal 1322 zcmV+_1=ac^AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkoZ!%+H zY-4q7VRUbD3L_v^WpZ8b#rNMXCQiPX<{x4c-p0y&5qkP5Pl;?O z__3lHt1#K&Lga1D8cj79%@3uns~55C4!`f;&<U=hnAo&*N(mkk=fE==U2FhPd}!<0*`CH(>}taYXX5C9MW5Dx(OaR!d)m0JT4 zZ-a+di^IR19`L=$l@)-GYUoCgdjSu`e(n^q@l?PPZ{RP#s+DueMsu+Q;t1JzG7;X` zmVy@j8n3lyw7S(aHhzyWC~FnYMP0Xggbbc+u2cVG&Qx(ca3*P`g0 z0+?00^V$Z(8>Un$mJ>&;q>tHMP<*mc%Ev1tAT8yl70O2|WC`9{K3<^+j}pW<|K<$# zn<%ORF>PFcC%j0&5#z!eiPc;wV1GW-Tnjnl+*ryJ{V4XM5jL*76Po|%AfevQW=EQl zN+DQoKjZbK|2^3{)aZ;mthNdc$~8p`#JZw&=vA!x=Ava_R_Wlik;6^y z977*o;zJNK3fGF;z5dK~X{UH8FZe2jhN@Dj<#2WcVhA>#Kp;Kgkg#$5aKxt|ftDFd zUc6jorO}`@g7KzcfA$b3f>KwLq}h9Sr6^Jrb7gt&?llA5bPew9z;s)^?#|j9h?MRV zBs5TtYu}WLADJ#iAu4gXq1hYx{E+~$iw^}hEazB3RLyZkn*z7sCX`j)XwH^XA&`h8 z5lLDtOy2X1ikEp+x zEGK$*%P?9ONv|ab?;v}=K<9H|D;lR>i*#DY6bq$gSNWKrCEKv{g#Z}gO3;VUZ-FR! zpI8OEhG8wh%08fk{O7N~)zGtV42OrL(lo2seEspFHdDRm!$cd^{k~ffl6aR6dP+a5 z!O_rnkm>ewe2zroMIz;{HxfPse9>0SCtnS9S!VnXw&vXIguB!8ajYHzH*cgKZ&e=$ zBy_E4^A%95=76V;fTEx*MC){erE7*kQ;f>I94fjor}NQ$KbgD_g=Q31}&*irt_UObUO^Czj5BTR4gER^#A|> literal 0 HcmV?d00001 diff --git a/search.html b/search.html new file mode 100644 index 0000000..01e9d09 --- /dev/null +++ b/search.html @@ -0,0 +1,137 @@ + + + + + + + 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..8cfa900 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"1 Electricity": [[6, "electricity"]], "1 General information": [[6, "general-information"]], "2 Heating": [[6, "heating"]], "3 Mobility": [[6, "mobility"]], "4 Calculation of the carbon budget": [[6, "calculation-of-the-carbon-budget"]], "API Docs": [[0, "api-docs"]], "Bus commute": [[8, "bus-commute"]], "Bus trip": [[5, "bus-trip"]], "Business Trips": [[8, "business-trips"]], "Calculation of a share of electricity use": [[6, "calculation-of-a-share-of-electricity-use"]], "Calculation of a share of heating consumption": [[6, "calculation-of-a-share-of-heating-consumption"]], "Calculation of the remaining carbon budget": [[6, "calculation-of-the-remaining-carbon-budget"]], "Car commute": [[8, "car-commute"]], "Car trip": [[5, "car-trip"]], "Commuting": [[8, "commuting"]], "Compliance with the GHG Protocols": [[6, "compliance-with-the-ghg-protocols"]], "Contents": [[2, "contents"], [5, "contents"], [7, "contents"]], "Conversion factors heating": [[3, "id1"], [4, "id1"]], "Detour": [[6, "detour"]], "Detour parameters": [[1, "id3"]], "Distance calculations": [[1, "distance-calculations"]], "Distance computation": [[1, "distance-computation"], [6, "distance-computation"]], "Electricity": [[2, "electricity"]], "Emission factor sources and uncertainties": [[6, "emission-factor-sources-and-uncertainties"]], "Emission factors": [[3, "emission-factors"]], "Ferry trip": [[5, "ferry-trip"]], "Geocoding": [[1, "geocoding"], [6, "geocoding"]], "Geographical coverage": [[6, "geographical-coverage"]], "Heating": [[4, "heating"]], "Indices and tables": [[7, "indices-and-tables"]], "Methodology": [[6, "methodology"]], "Mobility": [[8, "mobility"]], "Motorbike commute": [[8, "motorbike-commute"]], "Motorbike trip": [[5, "motorbike-trip"]], "Plane trip": [[5, "plane-trip"]], "See also:": [[8, null]], "Sources": [[6, "sources"]], "The carbon budget": [[6, "the-carbon-budget"]], "Train trip": [[5, "train-trip"]], "Train, tram, bicycle or pedelec commute": [[8, "train-tram-bicycle-or-pedelec-commute"]], "Tram, trolleybus, bicycle or pedelec trip": [[5, "tram-trolleybus-bicycle-or-pedelec-trip"]], "Transportation modes": [[5, "transportation-modes"]], "Tutorial": [[9, "tutorial"]], "Welcome to co2calculator\u2019s documentation!": [[7, "welcome-to-co2calculator-s-documentation"]], "What are CO2e emissions?": [[6, "what-are-co2e-emissions"]], "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": ["api", "calculate/distances", "calculate/electricity", "calculate/emission_factors", "calculate/heating", "calculate/transport_modes", "documentation", "index", "mobility", "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": ["api.rst", "calculate/distances.rst", "calculate/electricity.rst", "calculate/emission_factors.rst", "calculate/heating.rst", "calculate/transport_modes.rst", "documentation.md", "index.rst", "mobility.rst", "tutorial.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": 6, "0": [1, 3, 4, 6], "009": 3, "015": 3, "01874": 3, "0188": 3, "0219": 3, "0221": 3, "0224": 3, "0233": 3, "0234": 3, "0239": 3, "0251": 3, "0256": 3, "0263": 3, "0272": 3, "0281": 3, "032": 3, "0329": 3, "0332": 3, "0349": 3, "0361": 3, "0389": 3, "0394": 3, "0407": 3, "0412": 3, "0423": 3, "04416": 3, "04878": 3, "0514": 3, "0524": 3, "05255": 3, "0548": 3, "0555": 3, "0603": 3, "0604": 3, "0617": 3, "0698": 3, "0764": 3, "0781": 3, "08306": 3, "0857": 3, "08597": 3, "0884": 3, "0914": 3, "0917": 3, "09349": 3, "0987": 3, "1": [1, 3, 4], "10": [3, 4], "100": 3, "1009": 3, "101": 6, "10148": 3, "10332": 3, "10881": 3, "109518": 3, "10999": 3, "11": 3, "11286": 3, "11355": 3, "116667": 3, "11874": 3, "12": 3, "12004": 3, "126383": 3, "12952": 3, "13": 3, "131": 3, "13245": 3, "138": 3, "14": [3, 4], "14787": 3, "14866": 3, "15": 3, "15152": 3, "15353": 3, "15491": 3, "16": 3, "16258": 6, "17": 3, "179": 3, "18": 3, "19": 3, "19309": 3, "198": 3, "1point5": 6, "2": [1, 3, 4], "20": 3, "200": 9, "2000": 6, "2007": 6, "201": 3, "2010": 3, "2012": 6, "2020": [3, 6], "2021": 6, "2023": 6, "2024": 6, "2045": 6, "2050": 6, "209": 3, "21": [3, 6], "215": 3, "22": 3, "224": 3, "22652": 3, "23": 3, "231": 3, "23659": 3, "237": 3, "24": 3, "24587": 3, "249": 3, "25": 3, "26": 3, "27": 3, "274": 3, "28": [3, 6], "29": 3, "291": 3, "2o": 6, "3": [1, 3, 4], "30": 3, "300": 6, "31": 3, "311": 3, "32": 3, "33": 3, "33581": 3, "34": [3, 6], "35": 3, "36": 3, "37": 3, "3700": 3, "38": 3, "39": 3, "4": [3, 4], "40": 3, "41": 3, "42": 3, "42882": 3, "43": 3, "44": 3, "44266": 3, "45": 3, "46": 3, "47": 3, "48": 3, "48541": 3, "49": 3, "5": [1, 3, 4, 6], "50": 3, "51": 3, "52": 3, "53": [3, 6], "54": 3, "55": 3, "56": 3, "57": 3, "58": 3, "59": 3, "59147": 3, "6": [3, 4], "60": 3, "61": 3, "62": 3, "63": 3, "64": 3, "65": 3, "65578": 3, "66": 3, "67": 3, "68": 3, "69": 3, "7": 3, "70": 3, "71": 3, "72": 3, "73": 3, "74": 3, "75": 3, "76": 3, "77": 3, "77367": 3, "78": 3, "79": 3, "8": [3, 4], "80": 3, "81": 3, "82": 3, "82455": 3, "83": 3, "84": 3, "85": 3, "86": 3, "87": 3, "87444": 3, "88": 3, "89": 3, "9": [3, 6], "90": 3, "91": 3, "92": 3, "93": 3, "9322": 3, "94": 3, "95": [1, 3, 6], "96": 3, "97": 3, "98": 3, "As": [1, 6], "For": [1, 3, 4, 5, 6, 8, 9], "If": [6, 8], "In": [1, 4, 6, 8], "Notting": 6, "The": [1, 4, 5, 8, 9], "Their": 8, "Then": 6, "These": [3, 6], "To": [1, 6], "With": [6, 8], "abbrevi": 6, "abov": 1, "accept": 6, "accord": 6, "account": [4, 6, 8], "accur": 8, "achiev": 1, "across": 6, "activ": [3, 6], "ad": 1, "adapt": [3, 6], "address": [1, 6], "administr": 6, "advis": 6, "affect": 1, "after": 6, "aim": 6, "airplan": 6, "airport": [1, 6], "al": 6, "alb": 6, "all": [3, 6], "along": 6, "alreadi": 6, "also": [4, 6], "altern": 6, "alwai": 6, "among": 6, "amorph": 3, "amount": 6, "an": [1, 4, 6], "analog": 6, "anthropogen": 6, "api": 7, "appli": 6, "approach": [1, 6], "approxim": [4, 6], "april": 8, "ar": [1, 2, 3, 4, 5, 8], "ardenn": 6, "area": 6, "area_shar": 4, "around": 1, "asid": 8, "ask": 8, "assign": 1, "associ": 1, "assum": 6, "australia": 6, "austria": 6, "automat": 8, "avail": [6, 9], "averag": [3, 5, 6, 8], "bad": 8, "baden": 6, "bahn": 3, "bangkok": 6, "base": [2, 4, 6], "basi": [3, 6], "basic": [6, 9], "batteri": 3, "bauer": 6, "becaus": 6, "befor": 6, "behaviour": 8, "below": [1, 3, 6], "best": 1, "between": [1, 4, 6], "bicycl": [3, 6], "bicylc": [5, 8], "bilan": 6, "billion": 6, "bioga": 6, "bit": 6, "boiler": 6, "bool": 1, "boolean": [6, 8], "borough": 6, "both": 1, "bought": 6, "braunkohl": 3, "brikett": 3, "brussel": 6, "bu": [1, 3, 6], "build": [4, 6], "built": 6, "burn": 6, "busi": [3, 7], "business_class": [3, 5], "bz": 3, "c": 6, "cacul": 6, "calc_co2_businesstrip": 1, "calcul": [5, 7, 8, 9], "calculate_trip": 9, "call": 1, "can": [1, 3, 4, 5, 6, 8], "canada": 6, "capac": 3, "capita": 6, "captur": 6, "car": [1, 3, 6, 9], "car_passeng": 3, "caraca": 6, "carbon": 5, "case": [4, 6, 8], "categori": 3, "caus": [6, 9], "cdot": 6, "central": 3, "certain": 6, "ch": 6, "chang": 6, "chip": 4, "circl": 1, "citi": 6, "class": 3, "client": 1, "climat": 6, "clnt": 1, "cng": [3, 5, 8], "co2": [6, 7], "co2calcul": [6, 9], "co2e": [3, 5, 8, 9], "co2e_unit": 3, "co_2": 6, "coal": [3, 4, 6], "code": [1, 6], "coeffici": [1, 6], "cold": 8, "collect": 6, "combin": 1, "combust": 6, "come": 6, "comment": 3, "committe": 6, "common": 4, "commonli": 6, "commut": 7, "compar": 6, "comparison": 6, "complex": 6, "comput": [2, 3, 4], "configur": [5, 8], "consider": 6, "constant": [1, 6], "consum": 6, "consumpt": [2, 4, 7], "context": 6, "contribut": 6, "control": 6, "convers": 6, "conversion_valu": 4, "convert": [4, 6], "cool": 6, "coord": 1, "coordin": [1, 6], "corpor": 6, "could": 6, "counti": 6, "countri": [1, 6], "crow": 6, "csn": 6, "cumul": 6, "current": [6, 8], "custom": 6, "cycl": 6, "d": 6, "data": [6, 8], "databas": [1, 6], "date": 6, "de": [1, 3, 6], "declar": 6, "default": 4, "defin": [6, 9], "delawar": 6, "depart": 3, "departur": [1, 8], "depend": [1, 3, 5, 6, 8], "deriv": 6, "dest_dict": 1, "destin": [1, 6, 8], "detail": 6, "deu": 6, "dictionari": 1, "diesel": [3, 5, 8], "differ": [1, 3, 4, 5, 6, 8], "dioxid": 6, "direct": [1, 6, 8], "directli": 6, "dispos": 6, "distanc": [3, 5, 7, 8, 9], "distribut": 6, "district": 6, "district_h": 3, "divid": 6, "divis": 6, "do": 6, "doc": [7, 8], "document": [5, 8], "domest": 3, "donau": 6, "done": 6, "doubl": [6, 8], "drastic": 3, "drive": [1, 6], "dure": 8, "e": [1, 4, 5, 8], "each": 8, "earth": 6, "economi": 3, "economist": 6, "economy_class": [1, 3, 5], "effect": 6, "effet": 6, "effort": 6, "either": [6, 8], "el": 3, "electr": [3, 5, 7, 8], "eletr": 6, "emiss": [1, 2, 4, 5, 7, 8, 9], "emit": [5, 6, 8], "en": [3, 6], "endenergi": 3, "energi": [2, 3, 4, 6], "engin": 6, "enter": 8, "entir": [4, 8], "entiti": 6, "enum": 9, "epa": 6, "epsilon": 6, "equal": 6, "equival": 6, "erdreich": 3, "estim": [6, 8], "et": 6, "etc": [5, 8], "eu": [3, 6], "europ": 1, "european": 6, "even": 1, "exampl": [1, 6], "exist": 6, "expect": 4, "express": [3, 6], "fact": 4, "factor": [2, 5, 7, 8], "fahrrad": 3, "faktoren": 6, "fals": 1, "fernw\u00e4rm": 3, "ferri": [1, 3, 6, 8], "field": 1, "final": 6, "find": [1, 3, 6], "first": [1, 3, 6], "first_class": [3, 5], "flach": 3, "fli": 6, "flight": 3, "floor": 4, "fl\u00fcssiggasheizung": 3, "follow": [6, 8], "foot": [3, 5], "foot_passeng": 3, "footprint": 6, "forc": 3, "forcer": 6, "formula": [1, 6], "found": 6, "fra": 1, "framework": 6, "franc": 6, "freight": 6, "friendli": 6, "from": [1, 4, 6, 7, 8, 9], "fr\u00e9d\u00e9ric": 6, "fuel": [4, 5, 6, 8], "fuel_typ": [3, 4, 5, 8], "full": 6, "function": [1, 9], "further": [1, 6], "fuzzi": 1, "g": [1, 4, 5, 6, 8], "ga": [3, 4, 6], "gase": 6, "gasolin": [3, 5, 8], "gaz": 6, "ge": 6, "gemi": 3, "geograph": 1, "german_energy_mix": 3, "germani": 6, "ghg": 3, "given": [6, 8], "global": 6, "globe": 6, "goal": 6, "gohar": 6, "good": 1, "gov": 6, "great": 1, "green": 6, "greenhous": 6, "gross": 3, "group": 4, "grow": 6, "ha": [1, 6, 8], "hackschnitzel": 3, "hamburg": 1, "haul": 3, "hauptbahnhof": 1, "have": [5, 6, 8], "haversin": [1, 6], "heat": 7, "heat_pump_air": 3, "heat_pump_ground": 3, "heat_pump_wat": 3, "heidelberg": 1, "heizung": 3, "heizwerk": 3, "here": [1, 5], "higher": 6, "highest": 6, "hill": 6, "holz": 3, "hour": 6, "hous": 6, "how": [1, 6], "hybrid": [3, 5, 8], "hydrogen": [3, 8], "h\u00e9ran": 6, "i": [1, 3, 4, 6, 7, 8, 9], "iata": [1, 6], "identifi": 1, "iina": 3, "impact": 6, "implic": 6, "import": [1, 6, 9], "in_hybrid": [3, 5, 8], "includ": [1, 6], "index": 7, "indic": [6, 8], "indirect": 6, "industri": [3, 6], "influenc": 5, "inform": [3, 8], "input": [1, 6], "insid": 6, "instal": 9, "instead": 6, "institut": 3, "intens": [3, 5], "intern": [1, 6], "ipcc": 6, "itali": 6, "iztapalapa": 6, "just": 4, "keep": 6, "kei": 1, "kerosin": 3, "keyword": 1, "kg": [3, 4], "kilogram": 6, "kilomet": 6, "kilowatt": 6, "klein": 3, "km": [1, 3, 6, 8], "known": [4, 6], "krei": 6, "kup": 3, "kw": 3, "kwh": [2, 4, 6], "l": 4, "la": 6, "larg": [3, 5, 8], "lat": 1, "latter": 6, "le": 6, "left": 6, "letter": 6, "level": 6, "librari": 1, "life": 6, "like": [1, 6], "limit": 6, "line": 6, "lini": 3, "linienbu": 3, "liquid_ga": [3, 4], "list": [1, 3], "litr": 4, "local": [1, 3, 5, 6, 8], "locat": [1, 6, 8], "london": 6, "long": [1, 3, 5], "look": 1, "luft": 3, "m": 4, "mai": [1, 3, 4, 6, 8], "make": 6, "manhatten": 6, "marai": 6, "march": 8, "match": 1, "maximum": 6, "mean": [1, 6, 8], "measur": 6, "medium": [3, 5, 8], "methan": 6, "methodologi": 7, "mexico": 6, "mittel": 3, "mix": [2, 3, 6], "mobil": 7, "mobitool": 6, "mobitoool": 6, "mode": [1, 6, 7, 8], "model": 3, "modul": 7, "modular": 6, "molecul": 6, "mono": 3, "month": 8, "more": 6, "moss": 6, "most": [1, 6], "mostli": 6, "motorbik": [3, 6], "much": 6, "multipli": 1, "municip": 6, "must": [4, 6, 8], "mw": 3, "m\u00e9thode": 6, "n": 6, "name": [3, 6], "nation": 6, "necessarili": 6, "need": 1, "neg": 1, "neighbourhood": 6, "net": 6, "network": 6, "neutral": 6, "nitrou": 6, "nonetheless": 6, "note": 6, "novemb": [6, 8], "number": [5, 6, 8], "ny": 6, "obtain": 1, "occup": [3, 6], "occupi": 4, "octob": 8, "offici": 6, "often": [4, 8], "oil": [3, 4, 6], "onc": 8, "one": [3, 6], "onli": [1, 4, 6], "ontario": 6, "open": [1, 6], "openrouteservic": [1, 6], "option": 6, "ors_api_kei": 1, "other": [6, 8], "otto": 3, "ourairport": 6, "outsid": 6, "over": 8, "overview": 5, "own": 6, "oxid": 6, "p": [3, 6], "packag": [1, 7, 9], "page": 7, "paramet": [4, 5, 6], "paramt": 8, "pari": 6, "park": 3, "part": [4, 6], "passeng": [3, 5, 6, 8], "pedelec": 3, "pelia": [1, 6], "pellet": [3, 4], "per": [3, 4, 6], "period": [6, 8], "person": 6, "personenfernverkehrszug": 3, "personennahverkehrszug": 3, "piec": 3, "pip": 9, "pkw": 3, "place": 1, "plan": 6, "plane": [1, 3, 6, 8], "planner": 6, "pledg": 6, "plug": [3, 5, 8], "popul": 6, "possibl": [4, 6, 8], "postal": 6, "postalcod": 6, "pour": 6, "power": 6, "pre": 6, "predefin": 1, "premium": 3, "premium_economy_class": 3, "privat": 6, "proba": 6, "probabl": 6, "product": 6, "profil": [1, 6], "project": 6, "provid": [1, 4, 5, 6, 8], "provinc": 6, "public": 6, "purchas": 6, "pv": 3, "py": 6, "python": [1, 7], "quantifi": 6, "quantiti": [5, 8], "radi": 3, "rang": 3, "range_categori": 1, "range_descript": 1, "rate": 6, "reach": 6, "recent": 6, "refer": 6, "reflect": 6, "region": 6, "reisebu": 3, "relat": 7, "reli": 6, "reliabl": 6, "remov": 6, "renew": 6, "report": 6, "requir": 6, "residu": 6, "resolut": 6, "respect": 6, "result": [1, 6], "retriev": [1, 6], "return": 6, "rf": 3, "rheinisch": 3, "roundtrip": [1, 6, 8], "rout": 1, "r\u00e9alis": 6, "sacchi": 6, "scope": 6, "scq": 1, "search": [1, 6, 7], "season": 8, "seat": [1, 3], "seating_class": 5, "sector": 6, "see": [1, 6], "select": 6, "separ": 8, "servic": 6, "set": 8, "sever": 6, "share": 4, "shine": 6, "short": 3, "shorter": 6, "should": [6, 8], "significantli": 6, "similarli": 6, "simpl": 9, "sinc": 6, "size": [3, 5, 6, 8], "small": [3, 5, 8], "so": 6, "solar": 3, "solarkollektor": 3, "some": [4, 9], "sometim": 1, "sourc": [1, 2, 3], "space": 4, "specif": [1, 3, 5, 6, 8], "specifi": [1, 2, 4, 6, 8], "specifica": [5, 8], "speedomet": 8, "stadt": 3, "standard": 6, "start": [1, 6], "start_dict": 1, "state": 6, "station": [1, 6], "station_nam": 1, "steam": 6, "step": 1, "still": 6, "stop": 6, "straight": 6, "strassen": 3, "strategi": 3, "street": 6, "string": 1, "structur": [1, 6], "subcategori": 3, "suggest": 6, "sum": 6, "summar": 5, "summari": 1, "summer": 8, "support": [6, 8], "switzerland": 6, "t": 6, "tabl": [1, 6], "take": 6, "tariff": 6, "temperatur": 6, "term": 6, "than": 6, "thefuzz": 1, "thei": [6, 8], "therefor": 6, "thi": [1, 4, 6, 8], "those": 6, "three": 6, "thu": [1, 6], "time": [6, 8], "tj": 3, "togeth": 1, "ton": 6, "top": 6, "total": 6, "train": [3, 6], "trainlin": [1, 6], "tram": [3, 6], "transport": [1, 3, 6, 7, 8], "transport_mod": 8, "transportation_mod": [1, 9], "transportationmod": 9, "travel": [6, 8], "tremod": 3, "trip": [6, 7], "tupl": 1, "tutori": 7, "two": [1, 6], "type": [4, 5, 6, 8], "typic": 4, "u": [3, 6], "uba": 3, "uk": [3, 6], "under": [5, 8], "uniqu": 1, "unit": [3, 4, 6], "until": 6, "up": 6, "urban": 6, "us": [1, 4, 8], "usa": 6, "user": [1, 6, 8], "usual": [1, 6, 8], "v3": 6, "valu": 6, "vari": 6, "vehicl": [3, 5, 6, 8], "vehicle_rang": [5, 8], "vernacular": 6, "version": 6, "via": 9, "view": 6, "wa": 8, "warm": 6, "wasser": 3, "we": [1, 6], "weather": 8, "weekli": 8, "weekly_dist": 8, "well": [1, 7], "were": 6, "when": [6, 8], "whether": 8, "which": [1, 5, 6, 8], "while": [4, 6], "who": 6, "whole": 6, "why": 6, "wil": 8, "winter": 8, "within": [1, 3, 6], "wood": 4, "woodchip": [3, 4], "work": [1, 4, 6, 7], "world": [1, 6], "worldwid": 6, "would": 6, "w\u00e4rmepump": 3, "w\u00fcrttemberg": 6, "x": 6, "y_": 6, "year": [6, 8], "you": [1, 3, 6], "\u00e0": 6, "\u00e9mission": 6, "\u00f6ko": 3, "\u00f6l": 3}, "titles": ["API Docs", "Distance calculations", "Electricity", "Emission factors", "Heating", "Transportation modes", "Methodology", "Welcome to co2calculator\u2019s documentation!", "Mobility", "Tutorial"], "titleterms": {"": 7, "1": 6, "2": 6, "3": 6, "4": 6, "The": 6, "air": 1, "also": 8, "api": 0, "ar": 6, "b": 1, "bicycl": [5, 8], "bu": [5, 8], "budget": 6, "busi": 8, "c": 1, "calcul": [1, 6], "car": [5, 8], "carbon": 6, "co": 6, "co2calcul": 7, "commut": 8, "complianc": 6, "comput": [1, 6], "consumpt": 6, "content": [2, 5, 7], "convers": [3, 4], "coverag": 6, "crow": 1, "detour": [1, 6], "distanc": [1, 6], "doc": 0, "document": 7, "e": 6, "electr": [2, 6], "emiss": [3, 6], "factor": [3, 4, 6], "ferri": 5, "fli": 1, "gener": 6, "geocod": [1, 6], "geograph": 6, "ghg": 6, "heat": [3, 4, 6], "indic": 7, "inform": 6, "methodologi": 6, "mobil": [6, 8], "mode": 5, "motorbik": [5, 8], "other": 1, "paramet": 1, "pedelec": [5, 8], "plane": 5, "protocol": 6, "remain": 6, "road": 1, "see": 8, "share": 6, "sourc": 6, "sub": 6, "tabl": 7, "train": [1, 5, 8], "tram": [5, 8], "transport": 5, "travel": 1, "trip": [1, 5, 8], "trolleybu": 5, "tutori": 9, "uncertainti": 6, "us": 6, "welcom": 7, "what": 6}}) \ No newline at end of file diff --git a/tutorial.html b/tutorial.html new file mode 100644 index 0000000..8b374ba --- /dev/null +++ b/tutorial.html @@ -0,0 +1,137 @@ + + + + + + + + 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