Package: wltp
release:0.1.2a0date:2019-06-05 22:10:33documentation:https://wltp.readthedocs.org/(build-date: x.x.x)source:https://github.com/JRCSTU/wltppypi-repo:https://pypi.python.org/pypi/wltpkeywords:UNECE, automotive, car, cars, driving, engine, fuel-consumption, gears, gearshifts,
rpm, simulation, simulator, standard, vehicle, vehicles, wltc, nedcCopyright:2013-2014 European Commission (JRC-IET)License:EUPL 1.1+A python package to generate thegear-shiftsof Light-duty vehicles
running theWLTPdriving-cycles, according toUNECE’sGTRs.Attention!Thiswltppython project is still inalphastage, in the send that
its results are not “correct” by the standard, and no WLTP dyno-tests should rely
currently on them.Some of the known deficiencies are described in these places:In the doc(CHANGES).Presented in the diagrams of the doc(metrics) section.Imprinted in the mod(~wltp.test.wltp_db_tests) test-case
which automatically compares, on each build, the mean RPMs & Gears of this program
against Heinz’sphase-1a(end of 2014) MSAccess,
for a pre-determined set ofHeinz-dbvehicles.
Currently, genrated mean-RPMs differ from Heinz-db < 0.5% and
gears < 5% for a 1800-step class-3 cycle.Table of ContentsIntroductionOverviewQuick-startInstallPython installationPackage installationOlder versionsInstalling from sourcesProject files and foldersUsageCmd-line usageExcel usagePython usageIPython notebook usageRequirementsInstructionsGetting InvolvedSources & DependenciesDevelopment procedureSpecs & AlgorithmCyclesDevelopment teamGlossaryIntroductionOverviewThe calculator accepts as input the vehicle’s technical data, along with parameters for modifying the execution
of theWLTCcycle, and it then spits-out the gear-shifts of the vehicle, the attained speed-profile,
and any warnings.  It does not calculate any COsub(2) emissions.An “execution” or a “run” of an experiment is depicted in the following diagram:.---------------------.                         .----------------------------.
          ;   Input-DataModel   ;                         ;      Output-DataModel       ;
         ;---------------------;                         ;----------------------------;
        ; +--vehicle          ;     ____________        ; +---...                    ;
       ;  +--params          ;     |            |      ;  +--cycle_run:             ;
      ;       +--wltc_data  ;  ==> |   Cycle    | ==> ;      t  v_class gear ...   ;
     ;                     ;       | Generator  |    ;      --------------------  ;
    ;                     ;        |____________|   ;       00      0.0    1     ;
   ;                     ;                         ;        01      1.3    1    ;
  ;                     ;                         ;         02      5.5    1   ;
 ;                     ;                         ;          ...               ;
'---------------------'                         '----------------------------.TheInput & Output DataModelsare instances ofpandas-model, trees of strings and numbers, assembled with:sequences,dictionaries,class(pandas.DataFrame),class(pandas.Series), andURI-references to other model-trees.Quick-startNoteThe program runs onPython-2.7+andPython-3.3+(preferred) and requiresnumpy/scipy,pandasandwin32libraries along with theirnative backendsto be installed.
If you do not have such an environment already installed, please read doc(install) section below for
suitable distributions such asWinPythonorAnaconda.Assuming that you have a working python-environment, open acommand-shell,
(inWindowsuse program(cmd.exe) BUT ensure program(python.exe) is in itsenv[$PATH]),
you can try the following commands:TipThe commands beginning with$, below, imply aUnixlike operating system with aPOSIXshell
(Linux,OS X). Although the commands are simple and easy to translate in itsWindowscmd.execounterpart,
it would be worthwile to installCygwinto get the same environment onWindows.
If you choose to do that, include also the following packages in theCygwin’s installation wizard:* git, git-completion
* make, zip, unzip, bzip2, dos2unix
* openssh, curl, wgetBut do not install/rely on cygwin’s outdated python environment.Install:$pipinstallwltp## Use `--pre` if version-string has a build-suffix.$wltp--winmenus## Adds StartMenu-items, Windows only.Or in case you need the very latest frommasterbranch :$pipinstallgit+git://github.com/ankostis/wltp.git@master--preSee: doc(install)Cmd-line:$wltp--version0.1.2a0$wltp--help...See: ref:cmd-line-usageExcel:$wltp--excelrun## Windows & OS X onlySee: ref:excel-usagePython-code:fromwltp.experimentimportExperimentinput_model={...}## See also "Python Usage" for model contents.exp=Experiment(input_model)output_model=exp.run()print('Results:\n%s'%output_model['cycle_run'])See: ref:python-usageInstallCurrent version(x.x.x) runs onPython-2.7+andPython-3.3+and requiresnumpy/scipy,pandasandwin32libraries along with theirnative backendsto be installed.It has been tested underWindowsandLinuxandPython-3.3+is the preferred interpreter,
i.e, theExcelinterface and desktop-UI runs only with it.It is distributed onWheels.Python installationWarningOnWindowsit is strongly suggestedNOT to install the standard CPython distribution,
unless:you haveadministrative priviledges,you are an experienced python programmer, so thatyou know how to hunt dependencies fromPyPirepository and/or
theUnofficial Windows Binaries for Python Extension Packages.As explained above, this project depends on packages withnative-backendsthat require the use
ofCandFortrancompilers to build from sources.
To avoid this hassle, you should choose one of the user-friendly distributions suggested below.Below is a matrix of the two suggested self-wrapped python distributions for running this program
(we excluded here defaultpythonincluded inlinux). Both distributions:are free (as of freedom),do not requireadmin-rightsfor installation inWindows, andhave been tested to run successfully this program (also tested on defaultlinuxdistros).DistributionsWinPythonAnacondaPlatformWindowsWindows,Mac OS,LinuxEase ofInstallationFairCurrently (March-2015) it
requires fiddling with theenv[$PATH]after install.Anaconda:EasyMiniConda:ModerateEase of UseEasyModerateShould use command(conda) and/or
command(pip)
depending on whether a package
contains native libraries# of PackagesOnly what’s included in the
downloaded-archiveMany 3rd-party packages
uploaded by usersNotesAfter installation, seefaqfor:Registering WinPython installationAdding your installation inenv[$PATH]Check also the lighterminiconda.For installing native-dependencies
with command(conda) see files:
- file(requirements/miniconda.txt)
- file(.travis.yaml)Check also installation instructions fromthe  pandas site.Package installationBefore installing it, make sure that there are no older versions left over
on the python installation you are using.
To cleanly uninstall it, run this command until you cannot find any project installed:$pipuninstallwltp## Use `pip3` if both python-2 & 3 are in PATH.You can install the project directly from thePyPirepothe “standard” way,
by typing the command(pip) in the console:$pipinstallwltpIf you want to install apre-releaseversion (the version-string is not plain numbers, but
ends withalpha,beta.2or something else), use additionally option(–pre).$pipinstallwltpAlso you can install the very latest version straight from the sources:$pipinstallgit+git://github.com/ankostis/wltp.git--preIf you want to upgrade an existing instalation along with all its dependencies,
add also option(–upgrade) (or option(-U) equivalently), but then the build might take some
considerable time to finish.  Also there is the possibility the upgraded libraries might break
existing programs(!) so use it with caution, or from within avirtualenv(isolated Python environment).To install it for different Python environments, repeat the procedure using
the appropriate program(python.exe) interpreter for each environment.TipTo debug installation problems, you can export a non-emptyenv[$DISTUTILS_DEBUG]anddistutilswill print detailed information about what it is doing and/or
print the whole command line when an external program (like a C compiler) fails.After installation, it is important that you check which version is visible in yourenv[$PATH]:$wltp--version0.1.2a0To install for different Python versions, repeat the procedure for every required version.Older versionsAn additional purpose of the versioning schema of the project is to track which specific version
of the GTR it implements.
Given a version numberMAJOR.MINOR.PATCH, theMAJORpart tracks the GTR phase implemented.
See the “GTR version matrix” section in doc(CHANGES) for the mapping of MAJOR-numbers to GTR versions.To install an older released version issue the console command:$pipinstallwltp=1.1.1## Use `--pre` if version-string has a build-suffix.or alternatively straight from the sources:$pipinstallgit+git://github.com/ankostis/wltp.git@v0.0.9-alpha.3.1--preOfcourse you can substitutev0.0.9-alpha.3.1with any slug from “commits”, “branches” or “releases”
that you will find on project’sgithub-repo).NoteIf you have another version already installed, you have to use option(–ignore-installed) (or option(-I)).
For using the specific version, check this (untested)stackoverflow question.You can install each version in a separatevirtualenv(isolated Python environment)and shy away from all this.
CheckInstalling from sourcesIf you download the sources you have more options for installation.
There are various methods to get hold of them:Download thesourcedistribution fromPyPirepo.Download arelease-snapshot from githubClone thegit-repositoryatgithub.Assuming you have a working installation ofgityou can fetch and install the latest version of the project with the following series of commands:$gitclone"https://github.com/JRCSTU/wltp.git"wltp.git$cdwltp.git$pythonsetup.pyinstall## Use `python3` if both python-2 & 3 installed.When working with sources, you need to have installed all libraries that the project depends on:$pipinstall-rrequirements/execution.txt.The previous command installs a “snapshot” of the project as it is found in the sources.
If you wish to link the project’s sources with your python environment, install the project
indevelopment mode:$pythonsetup.pydevelopNoteThis last command installs any missing dependencies inside the project-folder.Project files and foldersThe files and folders of the project are listed below:+--wltp/            ## (package) The python-code of the calculator
|   +--cycles/      ## (package) The python-code for the WLTC data
|   +--test/        ## (package) Test-cases and the wltp_db
|   +--model        ## (module) Describes the data and their schema for the calculation
|   +--experiment   ## (module) The calculator
|   +--plots        ## (module) Diagram-plotting code and utilities
+--docs/            ## Documentation folder
|   +--pyplots/     ## (scripts) Plot the metric diagrams embeded in the README
+--devtools/        ## (scripts) Preprocessing of WLTC data on GTR and the wltp_db
|   +--run_tests.sh ## (script) Executes all TestCases
+--setup.py         ## (script) The entry point for `setuptools`, installing, testing, etc
+--requirements/    ## (txt-files) Various pip-dependencies for tools.
+--README.rst
+--CHANGES.rst
+--LICENSE.txtUsageCmd-line usageWarningNot implemented in yet.The command-line usage below requires the Python environment to be installed, and provides for
executing an experiment directly from the OS’s shell (i.e. program(cmd) in windows or program(bash) in POSIX),
and in asinglecommand.  To have precise control over the inputs and outputs
(i.e. experiments in a “batch” and/or in a design of experiments)
you have to run the experiments using the API python, as explained below.The entry-point script is called program(wltp), and it must have been placed in yourenv[$PATH]during installation.  This script can construct amodelby reading input-data
from multiple files and/or overriding specific single-value items. Conversely,
it can output multiple parts of the resulting-model into files.To get help for this script, use the following commands:$wltp--help## to get generic help for cmd-line syntax$wltcmdp.py-Mvehicle/full_load_curve## to get help for specific model-pathsand then, assumingvehicle.csvis a CSV file with the vehicle parameters
for which you want to override then_idleonly, run the following:$wltp-v\-Ivehicle.csvfile_frmt=SERIESmodel_path=paramsheader@=None\-mvehicle/n_idle:=850\-Ocycle.csvmodel_path=cycle_runExcel usageAttention!Excel-integration requires Python 3 andWindowsorOS X!InWindowsandOS Xyou may utilize the excellentxlwingslibrary
to use Excel files for providing input and output to the experiment.To create the necessary template-files in your current-directory you should enter:$wltp--excelYou could type instead samp(wltp –excel {file_path}) to specify a different destination path.Inwindows/OS Xyou can type samp(wltp –excelrun) and the files will be created in your home-directory
and the excel will open them in one-shot.All the above commands creates two files:file(wltp_excel_runner.xlsm)The python-enabled excel-file where input and output data are written, as seen in the screenshot below:After opening it the first tie, enable the macros on the workbook, select the python-code at the left and click
the menuselection(Run Selection as Pyhon) button; one sheet per vehicle should be created.The excel-file contains additionally appropriateVBAmodules allowing you to invokePython codepresent inselected cellswith a click of a button, and python-functions declared in the python-script, below,
using themypynamespace.To add more input-columns, you need to set as columnHeadersthejson-pointerspath of the desired
model item (see ref:python-usagebelow,).file(wltp_excel_runner.py)Utility python functions used by the above xls-file for running a batch of experiments.The particular functions included reads multiple vehicles from the input table with various
vehicle characteristics and/or experiment parameters, and then it adds a new worksheet containing
the cycle-run of each vehicle .
Of course you can edit it to further fit your needs.NoteYou may reverse the procedure described above and run the python-script instead.
The script will open the excel-file, run the experiments and add the new sheets, but in case any errors occur,
this time you can debug them, if you had executed the script throughLiClipse, orIPython!Some general notes regarding the python-code from excel-cells:On each invocation, the predefined VBA modulepandalonexecutes a dynamically generated python-script file
in the same folder where the excel-file resides, which, among others, imports the “sister” python-script file.
You can read & modify the sister python-script to import libraries such as ‘numpy’ and ‘pandas’,
or pre-define utility python functions.The name of the sister python-script is automatically calculated from the name of the Excel-file,
and it must be valid as a python module-name.  Therefore do not use non-alphanumeric characters such as
spaces(``), dashes(-) and dots(.``) on the Excel-file.On errors, a log-file is written in the same folder where the excel-file resides,
for as long asthe message-box is visible, and it is deleted automatically after you click ‘ok’!Readhttp://docs.xlwings.org/quickstart.htmlPython usageExample python REPL (Read-Eval-Print Loop) example-commands  are given below
that setup and run anexperiment.First run command(python) or command(ipython) and try to import the project to check its version:code-block:>>> import wltp

>>> wltp.__version__            ## Check version once more.
'0.1.2a0'

>>> wltp.__file__               ## To check where it was installed.         # doctest: +SKIP
/usr/local/lib/site-package/wltp-...If everything works, create thepandas-modelthat will hold the input-data (strings and numbers)
of the experiment.  You can assemble the model-tree by the use of:sequences,dictionaries,class(pandas.DataFrame),class(pandas.Series), andURI-references to other model-trees.For instance:code-block:>>> from wltp import model
>>> from wltp.experiment import Experiment
>>> from collections import OrderedDict as odic         ## It is handy to preserve keys-order.

>>> mdl = odic(
...   vehicle = odic(
...     unladen_mass = 1430,
...     test_mass    = 1500,
...     v_max        = 195,
...     p_rated      = 100,
...     n_rated      = 5450,
...     n_idle       = 950,
...     n_min        = None,                            ## Manufacturers my overridde it
...     gear_ratios         = [120.5, 75, 50, 43, 37, 32],
...     resistance_coeffs   = [100, 0.5, 0.04],
...   )
... )For information on the accepted model-data, check itsJSON-schema:code-block:>>> model.json_dumps(model.model_schema(), indent=2)                                # doctest: +SKIP
{
  "properties": {
    "params": {
      "properties": {
        "f_n_min_gear2": {
          "description": "Gear-2 is invalid when N :< f_n_min_gear2 * n_idle.",
          "type": [
            "number",
            "null"
          ],
          "default": 0.9
        },
        "v_stopped_threshold": {
          "description": "Velocity (Km/h) under which (<=) to idle gear-shift (Annex 2-3.3, p71).",
          "type": [
...You then have to feed this model-tree to the class(~wltp.experiment.Experiment)
constructor. Internally the class(~wltp.pandel.Pandel) resolves URIs, fills-in default values and
validates the data based on the project’s pre-defined JSON-schema:code-block:>>> processor = Experiment(mdl)         ## Fills-in defaults and Validates model.Assuming validation passes without errors, you can now inspect the defaulted-model
before running the experiment:code-block:>>> mdl = processor.model               ## Returns the validated model with filled-in defaults.
>>> sorted(mdl)                         ## The "defaulted" model now includes the `params` branch.
['params', 'vehicle']
>>> 'full_load_curve' in mdl['vehicle'] ## A default wot was also provided in the `vehicle`.
TrueNow you can run the experiment:code-block:>>> mdl = processor.run()               ## Runs experiment and augments the model with results.
>>> sorted(mdl)                         ## Print the top-branches of the "augmented" model.
['cycle_run', 'params', 'vehicle']To access the time-based cycle-results it is better to use a class(pandas.DataFrame):code-block:>>> import pandas as pd
>>> df = pd.DataFrame(mdl['cycle_run']); df.index.name = 't'
>>> df.shape                            ## ROWS(time-steps) X COLUMNS.
(1801, 11)
>>> df.columns
Index(['v_class', 'v_target', 'clutch', 'gears_orig', 'gears', 'v_real', 'p_available', 'p_required', 'rpm', 'rpm_norm', 'driveability'], dtype='object')
>>> 'Mean engine_speed: %s' % df.rpm.mean()
'Mean engine_speed: 1940.72109939'
>>> df.describe()
           v_class     v_target     clutch   gears_orig        gears  \
count  1801.000000  1801.000000       1801  1801.000000  1801.000000
mean     46.506718    46.506718  0.0660744     3.794003     3.683509
std      36.119280    36.119280  0.2484811     2.278959     2.278108
...
<BLANKLINE>
            v_real  p_available   p_required          rpm     rpm_norm
count  1801.000000  1801.000000  1801.000000  1801.000000  1801.000000
mean     50.356222    28.846639     4.991915  1940.721099     0.214898
std      32.336908    15.833262    12.139823   840.959339     0.195142
...

>>> processor.driveability_report()                                             # doctest: +SKIP
...
  12: (a: X-->0)
  13: g1: Revolutions too low!
  14: g1: Revolutions too low!
...
  30: (b2(2): 5-->4)
...
  38: (c1: 4-->3)
  39: (c1: 4-->3)
  40: Rule e or g missed downshift(40: 4-->3) in acceleration?
...
  42: Rule e or g missed downshift(42: 3-->2) in acceleration?
...You can export the cycle-run results in a CSV-file with the following pandas command:>>>df.to_csv('cycle_run.csv')# doctest: +SKIPFor more examples, download the sources and check the test-cases
found under the file(/wltp/test/) folder.IPython notebook usageThe list ofIPython notebooksfor wltp is maintained at thewikiof the project.RequirementsIn order to run them interactively, ensure that the following requirements are satisfied:Aipython-notebook server>= v2.x.x is installed forpython-3,
it is up, and running.Thewltpis installed on your system (see doc(install) above).InstructionsVisit eachnotebookfrom the wiki-list that you wish to run anddownloadit as file(ipynb) file
from the menu (menuselection(File|Download as…|IPython Notebook(.ipynb))).Locate the downloaded file with yourfile-browseranddrag n’ dropit on the landing page
of your notebook’s server (the one with the folder-list).Enjoy!Getting InvolvedThis project is hosted ingithub.
To provide feedback about bugs and errors or questions and requests for enhancements,
usegithub’s Issue-tracker.Sources & DependenciesTo get involved with development, you need a POSIX environment to fully build it
(Linux,OSXorCygwinonWindows).First you need to download the latest sources:$gitclonehttps://github.com/JRCSTU/wltp.gitwltp.git$cdwltp.gitVirtualenvYou may choose to work in avirtualenv(isolated Python environment),
to install dependency libraries isolated from system’s ones, and/or withoutadmin-rights(this is recommended forLinux/Mac OS).Attention!If you decide to reuse stystem-installed packages using  option(–system-site-packages)
withvirtualenv <= 1.11.6(to avoid, for instance, having to reinstallnumpyandpandasthat require native-libraries)
you may be bitten bybug #461which
prevents you from upgrading any of the pre-installed packages with command(pip).Liclipse IDEWithin the sources there are two sample files for the comprehensiveLiClipse IDE:file(eclipse.project)file(eclipse.pydevproject)Remove theeclipseprefix, (but leave the dot(.)) and import it as “existing project” from
Eclipse’sFile*`menu.Another issue is caused due to the fact that LiClipse contains its own implementation ofGit,EGit,
which badly interacts with unixsymbolic-links, such as the file(docs/docs), and it detects
working-directory changes even after a fresh checkout.  To workaround this, Right-click on the above file
menuselection(Properties –> Team –> Advanced –> Assume Unchanged)Then you can install all project’s dependencies in`development modeusing the file(setup.py) script:$pythonsetup.py--help## Get help for this script.Common commands: (see '--help-commands' for more)

  setup.py build      will build the package underneath 'build/'
  setup.py install    will install the package

Global options:
  --verbose (-v)      run verbosely (default)
  --quiet (-q)        run quietly (turns verbosity off)
  --dry-run (-n)      don't actually do anything
...$pythonsetup.pydevelop## Also installs dependencies into project's folder.$pythonsetup.pybuild## Check that the project indeed builds ok.You should now run the test-cases (see doc(metrics)) to check
that the sources are in good shape:$pythonsetup.pytestNoteThe above commands installed the dependencies inside the project folder and
for thevirtual-environment.  That is why all build and testing actions have to go through
samp(python setup.py {some_cmd}).If you are dealing with installation problems and/or you want to permantly install dependant packages,
you have todeactivatethe virtual-environment and start installing them into yourbasepython environment:$deactivate$pythonsetup.pydevelopor even try the morepermanentinstallation-mode:$pythonsetup.pyinstall# May require admin-rightsDevelopment procedureFor submitting code, useUTF-8everywhere, unix-eol(LF) and setgit--configcore.autocrlf = input.The typical development procedure is like this:Modify the sources in small, isolated and well-defined changes, i.e.
adding a single feature, or fixing a specific bug.Add test-cases “proving” your code.Rerun all test-cases to ensure that you didn’t break anything,
and check theircoverageremain above 80%:$pythonsetup.pynosetests--with-coverage--cover-packagewltp.model,wltp.experiment--cover-min-percentage=80TipYou can enter just:python setup.py test_allinstead of the above cmd-line
since it has beenaliasedin the file(setup.cfg) file.
Check this file for more example commands to use during development.If you made a rather important modification, update also the doc(CHANGES) file and/or
other documents (i.e. README.rst).  To see the rendered results of the documents,
issue the following commands and read the result html at file(build/sphinx/html/index.html):$pythonsetup.pybuild_sphinx# Builds html docs$pythonsetup.pybuild_sphinx-bdoctest# Checks if python-code embeded in comments runs ok.If there are no problems, commit your changes with a descriptive message.Repeat this cycle for other bugs/enhancements.When you are finished, push the changes upstream togithuband make amerge_request.
You can check whether your merge-request indeed passed the tests by checking
its build-statuson the integration-server’s site (TravisCI).HintSkim through the small IPython developer’s documentantion on the matter:The perfect pull requestSpecs & AlgorithmThis program was implemented from scratch based on
this download(GTR specification <23.10.2013 ECE-TRANS-WP29-GRPE-2013-13 0930.docx>)
(included in the file(docs/) folder).  The latest version of this GTR, along
with other related documents can be found at UNECE’s site:http://www.unece.org/trans/main/wp29/wp29wgs/wp29grpe/grpedoc_2013.htmlhttps://www2.unece.org/wiki/pages/viewpage.action?pageId=2523179Probably a more comprehensible but older spec is this one:https://www2.unece.org/wiki/display/trans/DHC+draft+technical+reportThe WLTC-profiles for the various classes in the file(devtools/data/cycles/) folder were generated from the tables
of the specs above using the file(devtools/csvcolumns8to2.py) script, but it still requires
an intermediate manual step involving a spreadsheet to copy the table into ands save them as CSV.Then use the file(devtools/buildwltcclass.py) to construct the respective python-vars into the
mod(wltp/model.py) sources.Data-files generated from Steven Heinz’s ms-accessvehicle infodb-table can be processed
with the  file(devtools/preprocheinz.py) script.CyclesDevelopment teamAuthor:Kostis AnagnostopoulosContributing Authors:Heinz Steven (test-data, validation and review)Georgios Fontaras (simulation, physics & engineering support)Alessandro Marotta (policy support)Glossaryrubric:WLTP
    The `Worldwide harmonised Light duty vehicles Test Procedure <https://www2.unece.org/wiki/pages/viewpage.action?pageId=2523179>`_,
    a `GRPE` informal working group

UNECE
    The United Nations Economic Commission for Europe, which has assumed the steering role
    on the `WLTP`.

GRPE
    `UNECE` Working party on Pollution and Energy - Transport Programme

GTR
GTRs
    Any of the *Global Technical Regulation* documents of the `WLTP` .

GS Task-Force
    The Gear-shift Task-force of the `GRPE`. It is the team of automotive experts drafting
    the gear-shifting strategy for vehicles running the `WLTP` cycles.

WLTC
    The family of pre-defined *driving-cycles* corresponding to vehicles with different
    PMR (Power to Mass Ratio). Classes 1,2, 3a & 3b are split in 2, 4, 4 and 4 *parts* respectively.

Unladen mass
    *UM* or *Curb weight*, the weight of the vehicle in running order minus
    the mass of the driver.

Test mass
    *TM*, the representative weight of the vehicle used as input for the calculations of the simulation,
    derived by interpolating between high and low values for the |CO2|-family of the vehicle.

Downscaling
    Reduction of the top-velocity of the original drive trace to be followed, to ensure that the vehicle
    is not driven in an unduly high proportion of "full throttle".

pandas-model
    The *container* of data that the gear-shift calculator consumes and produces.
    It is implemented by class(`wltp.pandel.Pandel`) as a mergeable stack of `JSON-schema` abiding trees of
    strings and numbers, formed with sequences, dictionaries, mod(`pandas`)-instances and URI-references.

JSON-schema
    The `JSON schema <http://json-schema.org/>`_ is an `IETF draft <http://tools.ietf.org/html/draft-zyp-json-schema-03>`_
    that provides a *contract* for what JSON-data is required for a given application and how to interact
    with it.  JSON Schema is intended to define validation, documentation, hyperlink navigation, and
    interaction control of JSON data.
    You can learn more about it from this `excellent guide <http://spacetelescope.github.io/understanding-json-schema/>`_,
    and experiment with this `on-line validator <http://www.jsonschema.net/>`_.

JSON-pointer
    JSON Pointer(rfc(`6901`)) defines a string syntax for identifying a specific value within
    a JavaScript Object Notation (JSON) document. It aims to serve the same purpose as *XPath* from the XML world,
    but it is much simpler.