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

Business trips

+ +

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

+
    +
  • car

  • +
  • bus

  • +
  • train

  • +
  • plane

  • +
  • ferry

  • +
+

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

+

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

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

Distance calculations

+
+

Geocoding

+

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

+
+

a) Geocoding for air travel

+

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

+

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

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

b) Geocoding for train trips

+

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

+

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

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

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

+
+
+

c) Geocoding for other trips

+

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

+

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

+
+
+
+

Distance computation

+

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

+
+

a) Distance as the crow flies + detour

+

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

+

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

+

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

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

transportation_mode

coefficient

constant [km]

0

bus

1.5

0.0

1

train

1.2

0.0

2

plane

1.0

95

3

ferry

1.0

0.0

+
+
+

b) Road distance

+

Calculating the road distance using openrouteservice.

+

This approach is only used for the transport mode car.

+

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

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

Emission factors

+

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

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

category

subcategory

source

model

name

unit

size

occupancy

capacity

range

fuel_type

co2e_unit

co2e

seating

comment

0

transport

bus

Öko-Institut

gemis

Bus-Linie-BZ-DE-2020-Basis

P.km

average

local

hydrogen

kg/P.km

0.0251

1

transport

bus

Öko-Institut-adapted

gemis

Bus-Linie-BZ-DE-2020-Basis

P.km

average

long-distance

hydrogen

kg/P.km

0.0251

2

transport

bus

Öko-Institut

gemis

Bus-Linie-CNG-DE-2020-Basis

P.km

average

local

cng

kg/P.km

0.0617

3

transport

bus

Öko-Institut-adapted

gemis

Bus-Linie-CNG-DE-2020-Basis

P.km

average

long-distance

cng

kg/P.km

0.0617

4

transport

bus

UBA

tremod

Linienbus

P.km

medium

100

60

local

diesel

kg/P.km

0.0239

5

transport

bus

UBA

tremod

Linienbus

P.km

medium

20

60

local

diesel

kg/P.km

0.0914

6

transport

bus

UBA

tremod

Linienbus

P.km

medium

50

60

local

diesel

kg/P.km

0.0407

7

transport

bus

UBA

tremod

Linienbus

P.km

medium

80

60

local

diesel

kg/P.km

0.0281

8

transport

bus

UBA

tremod

Linienbus

P.km

large

100

90

local

diesel

kg/P.km

0.0221

9

transport

bus

UBA

tremod

Linienbus

P.km

large

20

90

local

diesel

kg/P.km

0.0781

10

transport

bus

UBA

tremod

Linienbus

P.km

large

50

90

local

diesel

kg/P.km

0.0361

11

transport

bus

UBA

tremod

Linienbus

P.km

large

80

90

local

diesel

kg/P.km

0.0256

12

transport

bus

UBA

tremod

Linienbus

P.km

small

100

30

local

diesel

kg/P.km

0.0349

13

transport

bus

UBA

tremod

Linienbus

P.km

small

20

30

local

diesel

kg/P.km

0.138

14

transport

bus

UBA

tremod

Linienbus

P.km

small

50

30

local

diesel

kg/P.km

0.0603

15

transport

bus

UBA

tremod

Linienbus

P.km

small

80

30

local

diesel

kg/P.km

0.0412

16

transport

bus

UBA

tremod

Linienbus

P.km

average

20

70.5

local

diesel

kg/P.km

0.0857

17

transport

bus

UBA

tremod

Linienbus

P.km

average

50

70.5

local

diesel

kg/P.km

0.0389

18

transport

bus

UBA

tremod

Linienbus

P.km

average

80

70.5

local

diesel

kg/P.km

0.0272

19

transport

bus

UBA

tremod

Linienbus

P.km

average

100

70.5

local

diesel

kg/P.km

0.0234

20

transport

bus

UBA

tremod

Reisebus

P.km

large

100

60

long-distance

diesel

kg/P.km

0.0188

21

transport

bus

UBA

tremod

Reisebus

P.km

large

20

60

long-distance

diesel

kg/P.km

0.0764

22

transport

bus

UBA

tremod

Reisebus

P.km

large

50

60

long-distance

diesel

kg/P.km

0.0332

23

transport

bus

UBA

tremod

Reisebus

P.km

large

80

60

long-distance

diesel

kg/P.km

0.0224

24

transport

bus

UBA

tremod

Reisebus

P.km

medium

100

39.9

long-distance

diesel

kg/P.km

0.0233

25

transport

bus

UBA

tremod

Reisebus

P.km

medium

20

39.9

long-distance

diesel

kg/P.km

0.0987

26

transport

bus

UBA

tremod

Reisebus

P.km

medium

50

39.9

long-distance

diesel

kg/P.km

0.0423

27

transport

bus

UBA

tremod

Reisebus

P.km

medium

80

39.9

long-distance

diesel

kg/P.km

0.0281

28

transport

bus

UBA

tremod

Reisebus

P.km

average

20

44.6

long-distance

diesel

kg/P.km

0.0917

29

transport

bus

UBA

tremod

Reisebus

P.km

average

50

44.6

long-distance

diesel

kg/P.km

0.0394

30

transport

bus

UBA

tremod

Reisebus

P.km

average

80

44.6

long-distance

diesel

kg/P.km

0.0263

31

transport

bus

UBA

tremod

Reisebus

P.km

average

100

44.6

long-distance

diesel

kg/P.km

0.0219

32

transport

car

Öko-Institut

gemis

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

P.km

large

cng

kg/P.km

0.291

33

transport

car

Öko-Institut

gemis

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

P.km

small

cng

kg/P.km

0.198

34

transport

car

Öko-Institut

gemis

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

P.km

medium

cng

kg/P.km

0.237

35

transport

car

Öko-Institut-adapted

gemis

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

P.km

average

cng

kg/P.km

0.237

36

transport

car

UBA

tremod

PKW

P.km

average

average

kg/P.km

0.215

37

transport

car

UBA

tremod

PKW

P.km

small

average

kg/P.km

0.179

38

transport

car

UBA

tremod

PKW

P.km

medium

average

kg/P.km

0.209

39

transport

car

UBA

tremod

PKW

P.km

large

average

kg/P.km

0.274

40

transport

car

UBA

tremod

PKW

P.km

average

gasoline

kg/P.km

0.224

41

transport

car

UBA

tremod

PKW

P.km

small

gasoline

kg/P.km

0.18

42

transport

car

UBA

tremod

PKW

P.km

medium

gasoline

kg/P.km

0.231

43

transport

car

UBA

tremod

PKW

P.km

large

gasoline

kg/P.km

0.311

44

transport

car

UBA

tremod

PKW

P.km

average

diesel

kg/P.km

0.201

45

transport

car

UBA

tremod

PKW

P.km

small

diesel

kg/P.km

0.131

46

transport

car

UBA

tremod

PKW

P.km

medium

diesel

kg/P.km

0.18

47

transport

car

UBA

tremod

PKW

P.km

large

diesel

kg/P.km

0.249

48

electricity

Öko-Institut

gemis

Solar-PV-amorph-DE-2010

TJ

solar

kg/TJ

11874

49

electricity

IINAS

gemis

El-KW-Park-DE-2020

TJ

german_energy_mix

kg/TJ

109518

50

heating

Öko-Institut

gemis

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

TJ

coal

kg/TJ

126383

51

heating

Öko-Institut

gemis

Fernwärme-Heizung-DE-2020/en

TJ

district_heating

kg/TJ

77367

52

heating

Öko-Institut

gemis

El-Heizung-DE-2020-mix

TJ

electricity

kg/TJ

116667

53

heating

IINAS

gemis

Gas-Heizung-DE-2020 (Endenergie)

TJ

gas

kg/TJ

65578

54

heating

Öko-Institut

gemis

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

TJ

heat_pump_air

kg/TJ

33581

55

heating

Öko-Institut

gemis

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

TJ

heat_pump_ground

kg/TJ

48541

56

heating

Öko-Institut

gemis

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

TJ

heat_pump_water

kg/TJ

44266

57

heating

Öko-Institut

gemis

FlüssiggasHeizung-DE-2020

TJ

liquid_gas

kg/TJ

82455

58

heating

IINAS

gemis

Öl-Heizung-DE-2020 (Endenergie)

TJ

oil

kg/TJ

87444

59

heating

IINAS

gemis

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

TJ

pellet

kg/TJ

14866

60

heating

Öko-Institut

gemis

SolarKollektor-Flach-DE-2020

TJ

solar

kg/TJ

10881

61

heating

IINAS

gemis

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

TJ

woodchips

kg/TJ

9322

62

transport

train

UBA

tremod

Personenfernverkehrszug

P.km

average

long-distance

average

kg/P.km

0.0329

63

transport

train

UBA

tremod

Personenfernverkehrszug

P.km

average

long-distance

diesel

kg/P.km

0.0698

64

transport

train

UBA

tremod

Personenfernverkehrszug

P.km

average

long-distance

electric

kg/P.km

0.032

65

transport

train

UBA

tremod

Personennahverkehrszug

P.km

average

local

average

kg/P.km

0.0604

66

transport

train

UBA

tremod

Personennahverkehrszug

P.km

average

local

diesel

kg/P.km

0.0884

67

transport

train

UBA

tremod

Personennahverkehrszug

P.km

average

local

electric

kg/P.km

0.0524

68

transport

tram

UBA

tremod

Strassen-Stadt-U-Bahn

P.km

average

electric

kg/P.km

0.0548

69

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, small car

P.km

small

hybrid

kg/P.km

0.10332

70

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, medium car

P.km

medium

hybrid

kg/P.km

0.10999

71

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, large car

P.km

large

hybrid

kg/P.km

0.15491

72

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Hybrid, average car

P.km

average

hybrid

kg/P.km

0.12004

73

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, small car

P.km

small

plug-in_hybrid

kg/P.km

0.05255

74

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, medium car

P.km

medium

plug-in_hybrid

kg/P.km

0.08597

75

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, large car

P.km

large

plug-in_hybrid

kg/P.km

0.10148

76

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Plug-in Hybrid Electric Vehicle, average car

P.km

average

plug-in_hybrid

kg/P.km

0.09349

77

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, small car

P.km

small

electric

kg/P.km

0.04416

78

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, medium car

P.km

medium

electric

kg/P.km

0.04878

79

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, large car

P.km

large

electric

kg/P.km

0.0555

80

transport

car

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Battery Electric Vehicle, average car

P.km

average

electric

kg/P.km

0.0514

81

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, domestic, average passenger

P.km

domestic

kerosine

kg/P.km

0.24587

average

with RF (radiative forcing)

82

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, short-haul, average passenger

P.km

short-haul

kerosine

kg/P.km

0.15353

average

with RF

83

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, short-haul, Economy class passenger

P.km

short-haul

kerosine

kg/P.km

0.15152

economy_class

with RF <= 3700 km

84

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, short-haul, Business class passenger

P.km

short-haul

kerosine

kg/P.km

0.22652

business_class

with RF <= 3700 km

85

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, average passenger

P.km

long-haul

kerosine

kg/P.km

0.19309

average

with RF > 3700 km

86

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, Economy class passenger

P.km

long-haul

kerosine

kg/P.km

0.14787

economy_class

with RF > 3700 km

87

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, Premium economy class passenger

P.km

long-haul

kerosine

kg/P.km

0.23659

premium_economy_class

with RF > 3700 km

88

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, Business class passenger

P.km

long-haul

kerosine

kg/P.km

0.42882

business_class

with RF > 3700 km

89

transport

plane

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Flight, long-haul, First class passenger

P.km

long-haul

kerosine

kg/P.km

0.59147

first_class

with RF > 3700 km

90

transport

ferry

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Ferry, Foot passenger

P.km

kg/P.km

0.01874

foot_passenger

with RF > 3700 km

91

transport

ferry

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Ferry, Car passenger

P.km

kg/P.km

0.12952

car_passenger

with RF > 3700 km

92

transport

ferry

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Ferry, Average

P.km

kg/P.km

0.11286

average

with RF > 3700 km

93

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, small

P.km

small

kg/P.km

0.08306

94

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, medium

P.km

medium

kg/P.km

0.1009

95

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, large

P.km

large

kg/P.km

0.13245

96

transport

motorbike

UK, Department for Business, Energy & Industrial Strategy

2020 UK GHG Conversion factors

Motorbike, average

P.km

average

kg/P.km

0.11355

97

transport

bicycle

UBA

Fahrrad

P.km

kg/P.km

0.009

98

transport

pedelec

UBA

Pedelec

P.km

kg/P.km

0.015

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

Heating and electricity

+ +
+

Heating

+

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

+

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

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

fuel_type

unit

conversion_value

0

oil

l

10.6

1

liquid_gas

kg

14.1

2

coal

kg

6.0

3

pellet

kg

5.4

4

woodchips

kg

5.2

5

gas

m^3

10.8

+

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

+
+
+

Electricity

+

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

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

Transportation modes

+ +

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

+
+

Car trip

+

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

+
+
+

Bus trip

+

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

+
+
+

Train trip

+

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

+
+
+

Plane trip

+

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

+
+
+

Ferry trip

+

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

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

Commuting

+ +

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

+
    +
  • car

  • +
  • bus

  • +
  • train

  • +
  • motorbike

  • +
  • tram

  • +
  • bicycle

  • +
  • pedelec

  • +
+

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

+

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

+

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

+
+

Car commute

+

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

+
+
+

Bus commute

+

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

+
+
+

Train commute

+

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

+
+
+

Motorbike commute

+

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

+
+
+

Tram, bicycle or pedelec commute

+

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

+
+
+

Aggregating emissions to the group level

+

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

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

Methodology

+

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

+

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

+

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

+ +

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

+

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

+
+

1 Electricity

+

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

+
+

Defining a share of electricity use

+

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

+
+
+
+

2 Heating

+

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

+
    +
  • Oil: l

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

  • +
  • Gas: m3

  • +
+

The conversion factors are retrieved from:

+ +

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

+
+

Defining a share of heating consumption

+

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

+
+
+
+

3 Business trips

+

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

+
+

Geocoding

+

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

+

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

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

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

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

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

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

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

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

    +
      +
    • e.g., Bangkok, Caracas

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

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

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

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

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

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

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

    • +
    +
  • +
+
+
+

Distance computation

+

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

+

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

+
+

Detour

+

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

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

Mode of transport

Detour formula

Source

Bus

x 1.5

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

Train

x 1.2

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

Plane

+ 95 km

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

Ferry

???

???

+
+
+
+

Specifica of the modes of transport

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

Mode of transport

Fuel type

Size

Occupancy

Seating

Passengers

Range

Car

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

[small, medium, large, average]

-

-

[1..9]

-

Train

[diesel, electric, average]

-

-

-

-

- (assumes “long-distance”)

Bus

[diesel]

[medium, large, average]

in % [20, 50, 80, 100]

-

-

- (assumes “long-distance”)

Plane

-

-

-

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

-

- (determined from distance)

Ferry

-

-

-

[average, Foot passenger, Car passenger]

-

-

+

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

+
+
+

Default values of the specifica of the modes of transport

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

Mode of transport

Fuel type

Size

Occupancy

Seating

Passengers

Range

Car

[average]

[average]

-

-

[1]

-

Motorbike

-

[average]

-

-

-

-

Train

[average]

-

-

-

-

[long distance]

Bus

[diesel]

[average]

[50 %]

-

-

[long distance]

Plane

-

-

-

[average]

-

- (determined from distance)

Ferry

-

-

-

[average]

-

-

+
+
+

Range categories

+

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

+
    +
  • Very short haul: < 500 km

  • +
  • Short distance: 500 - 1500 km

  • +
  • Medium distance: 1500 - 4000 km

  • +
  • Long distance: > 4000 km

  • +
+
+
+
+

4 Commuting

+

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

+
    +
  • Car

  • +
  • (Local) bus

  • +
  • (Local) train

  • +
  • Tram

  • +
  • Motorbike

  • +
  • Bicycle

  • +
  • Pedelec

  • +
+
+

Specifica of the modes of transport

+

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

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

Mode of transport

Fuel type

Size

Occupancy

Seating

Passengers

Range

Car

[diesel, gasoline, cng, electric, average]

[small, medium, large, average]

-

-

[1..9]

-

Motorbike

-

[small, medium, large, average]

-

-

-

-

Train

[diesel, electric, average]

-

-

-

-

- (assumes “local”)

Bus

-

[medium, large, average]

in % [20, 50, 80, 100]

-

-

- (assumes “local”)

Tram

-

[medium, large, average]

in % [20, 50, 80, 100]

-

-

- (assumes “local”)

Bicycle

-

-

-

-

-

-

Pedelec

-

-

-

-

-

-

+
+
+

Aggregating to the group’s level

+

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

+

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

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

Index

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

Welcome to co2calculator’s documentation!

+

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

+
+
+

Contents

+ +
+
+

Indices and tables

+ +
+ + +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000..1c15c68 Binary files /dev/null and b/objects.inv differ diff --git a/search.html b/search.html new file mode 100644 index 0000000..7cc2fcd --- /dev/null +++ b/search.html @@ -0,0 +1,135 @@ + + + + + + + Search — co2calculator 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + +
+ +

Search

+ + + + +

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

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

Tutorial

+

The co2calculator package is available via pip:

+
pip install co2calculator
+
+
+

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

+

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