source: flex_extract.git/Documentation/html/_modules/tools.html @ 903ed4f

dev
Last change on this file since 903ed4f was 903ed4f, checked in by anphi <anne.philipp@…>, 4 years ago

spell correction

  • Property mode set to 100644
File size: 100.6 KB
Line 
1
2
3<!DOCTYPE html>
4<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
5<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
6<head>
7  <meta charset="utf-8">
8 
9  <meta name="viewport" content="width=device-width, initial-scale=1.0">
10 
11  <title>tools &mdash; flex_extract 7.1.2 documentation</title>
12 
13
14 
15 
16 
17 
18
19 
20  <script type="text/javascript" src="../_static/js/modernizr.min.js"></script>
21 
22   
23      <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
24        <script src="../_static/jquery.js"></script>
25        <script src="../_static/underscore.js"></script>
26        <script src="../_static/doctools.js"></script>
27        <script src="../_static/language_data.js"></script>
28        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
29   
30    <script type="text/javascript" src="../_static/js/theme.js"></script>
31
32   
33
34 
35  <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
36  <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
37  <link rel="stylesheet" href="../_static/css/custom.css" type="text/css" />
38  <link rel="stylesheet" href="../_static/css/theme_overrides.css" type="text/css" />
39    <link rel="index" title="Index" href="../genindex.html" />
40    <link rel="search" title="Search" href="../search.html" /> 
41</head>
42
43<body class="wy-body-for-nav">
44
45   
46  <div class="wy-grid-for-nav">
47   
48    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
49      <div class="wy-side-scroll">
50        <div class="wy-side-nav-search" >
51         
52
53         
54            <a href="../index.html" class="icon icon-home"> flex_extract
55         
56
57         
58          </a>
59
60         
61           
62           
63              <div class="version">
64                7.1.2
65              </div>
66           
67         
68
69         
70<div role="search">
71  <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
72    <input type="text" name="q" placeholder="Search docs" />
73    <input type="hidden" name="check_keywords" value="yes" />
74    <input type="hidden" name="area" value="default" />
75  </form>
76</div>
77
78         
79        </div>
80
81        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
82         
83           
84           
85             
86           
87           
88              <p class="caption"><span class="caption-text">Table of Contents:</span></p>
89<ul>
90<li class="toctree-l1"><a class="reference internal" href="../ecmwf_data.html">ECMWF Data</a></li>
91<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
92<li class="toctree-l1"><a class="reference internal" href="../quick_start.html">Usage</a></li>
93<li class="toctree-l1"><a class="reference internal" href="../documentation.html">Code-Level Documentation</a></li>
94<li class="toctree-l1"><a class="reference internal" href="../evaluation.html">Evaluation</a></li>
95<li class="toctree-l1"><a class="reference internal" href="../dev_guide.html">Developer Guide</a></li>
96<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Changelog</a></li>
97<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li>
98<li class="toctree-l1"><a class="reference internal" href="../Support/faq.html">FAQ - Frequently asked questions</a></li>
99<li class="toctree-l1"><a class="reference internal" href="../authors.html">Developer Team</a></li>
100</ul>
101
102           
103         
104        </div>
105      </div>
106    </nav>
107
108    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
109
110     
111      <nav class="wy-nav-top" aria-label="top navigation">
112       
113          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
114          <a href="../index.html">flex_extract</a>
115       
116      </nav>
117
118
119      <div class="wy-nav-content">
120       
121        <div class="rst-content">
122       
123         
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139<div role="navigation" aria-label="breadcrumbs navigation">
140
141  <ul class="wy-breadcrumbs">
142   
143      <li><a href="../index.html">Docs</a> &raquo;</li>
144       
145          <li><a href="index.html">Module code</a> &raquo;</li>
146       
147      <li>tools</li>
148   
149   
150      <li class="wy-breadcrumbs-aside">
151       
152      </li>
153   
154  </ul>
155
156 
157  <hr/>
158</div>
159          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
160           <div itemprop="articleBody">
161           
162  <h1>Source code for tools</h1><div class="highlight"><pre>
163<span></span><span class="ch">#!/usr/bin/env python3</span>
164<span class="c1"># -*- coding: utf-8 -*-</span>
165<span class="c1">#*******************************************************************************</span>
166<span class="c1"># @Author: Anne Philipp (University of Vienna)</span>
167<span class="c1">#</span>
168<span class="c1"># @Date: May 2018</span>
169<span class="c1">#</span>
170<span class="c1"># @Change History:</span>
171<span class="c1">#    October 2014 - Anne Fouilloux (University of Oslo)</span>
172<span class="c1">#        - created functions silent_remove and product (taken from ECMWF)</span>
173<span class="c1">#</span>
174<span class="c1">#    November 2015 - Leopold Haimberger (University of Vienna)</span>
175<span class="c1">#        - created functions: interpret_args_and_control, clean_up</span>
176<span class="c1">#          my_error, normal_exit, init128, to_param_id</span>
177<span class="c1">#</span>
178<span class="c1">#    April - December 2018 - Anne Philipp (University of Vienna):</span>
179<span class="c1">#        - applied PEP8 style guide</span>
180<span class="c1">#        - added documentation</span>
181<span class="c1">#        - moved all non class methods from former file Flexparttools in here</span>
182<span class="c1">#        - separated args and control interpretation</span>
183<span class="c1">#        - added functions get_list_as_string, read_ecenv, send_mail, make_dir,</span>
184<span class="c1">#          put_file_to_ecserver, submit_job_to_ecserver, get_informations,</span>
185<span class="c1">#          get_dimensions, execute_subprocess, none_or_int, none_or_str</span>
186<span class="c1">#</span>
187<span class="c1">#    August 2020 - Leopold Haimberger (University of Vienna)</span>
188<span class="c1">#        - added function to check if a specific string is in a file</span>
189<span class="c1">#        - added function to overwrite lines in a file which contain specific string</span>
190<span class="c1">#</span>
191<span class="c1"># @License:</span>
192<span class="c1">#    (C) Copyright 2014-2020.</span>
193<span class="c1">#    Anne Philipp, Leopold Haimberger</span>
194<span class="c1">#</span>
195<span class="c1">#    SPDX-License-Identifier: CC-BY-4.0</span>
196<span class="c1">#</span>
197<span class="c1">#    This work is licensed under the Creative Commons Attribution 4.0</span>
198<span class="c1">#    International License. To view a copy of this license, visit</span>
199<span class="c1">#    http://creativecommons.org/licenses/by/4.0/ or send a letter to</span>
200<span class="c1">#    Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.</span>
201<span class="c1">#</span>
202<span class="c1"># @Methods:</span>
203<span class="c1">#    none_or_str</span>
204<span class="c1">#    none_or_int</span>
205<span class="c1">#    get_cmdline_args</span>
206<span class="c1">#    read_ecenv</span>
207<span class="c1">#    clean_up</span>
208<span class="c1">#    my_error</span>
209<span class="c1">#    send_mail</span>
210<span class="c1">#    normal_exit</span>
211<span class="c1">#    product</span>
212<span class="c1">#    silent_remove</span>
213<span class="c1">#    init128</span>
214<span class="c1">#    to_param_id</span>
215<span class="c1">#    get_list_as_string</span>
216<span class="c1">#    make_dir</span>
217<span class="c1">#    put_file_to_ecserver</span>
218<span class="c1">#    submit_job_to_ecserver</span>
219<span class="c1">#    get_informations</span>
220<span class="c1">#    get_dimensions</span>
221<span class="c1">#    execute_subprocess</span>
222<span class="c1">#*******************************************************************************</span>
223<span class="sd">&#39;&#39;&#39;This module contains a collection of diverse tasks within flex_extract.</span>
224<span class="sd">&#39;&#39;&#39;</span>
225
226<span class="c1"># ------------------------------------------------------------------------------</span>
227<span class="c1"># MODULES</span>
228<span class="c1"># ------------------------------------------------------------------------------</span>
229<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span>
230
231<span class="kn">import</span> <span class="nn">os</span>
232<span class="kn">import</span> <span class="nn">errno</span>
233<span class="kn">import</span> <span class="nn">sys</span>
234<span class="kn">import</span> <span class="nn">glob</span>
235<span class="kn">import</span> <span class="nn">subprocess</span>
236<span class="kn">import</span> <span class="nn">traceback</span>
237<span class="c1"># pylint: disable=unused-import</span>
238<span class="k">try</span><span class="p">:</span>
239    <span class="kn">import</span> <span class="nn">exceptions</span>
240<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
241    <span class="kn">import</span> <span class="nn">builtins</span> <span class="k">as</span> <span class="nn">exceptions</span>
242<span class="c1"># pylint: enable=unused-import</span>
243<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
244<span class="kn">from</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="n">ArgumentParser</span><span class="p">,</span> <span class="n">ArgumentDefaultsHelpFormatter</span>
245
246<span class="c1"># ------------------------------------------------------------------------------</span>
247<span class="c1"># METHODS</span>
248<span class="c1"># ------------------------------------------------------------------------------</span>
249
250<div class="viewcode-block" id="setup_controldata"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.setup_controldata">[docs]</a><span class="k">def</span> <span class="nf">setup_controldata</span><span class="p">():</span>
251    <span class="sd">&#39;&#39;&#39;Collects, stores and checks controlling arguments from command line,</span>
252<span class="sd">    CONTROL file and ECMWF_ENV file.</span>
253
254<span class="sd">    Parameters</span>
255<span class="sd">    ----------</span>
256
257<span class="sd">    Return</span>
258<span class="sd">    ------</span>
259<span class="sd">    c : ControlFile</span>
260<span class="sd">        Contains all the parameters of CONTROL file and</span>
261<span class="sd">        command line.</span>
262
263<span class="sd">    ppid : str</span>
264<span class="sd">        Parent process id.</span>
265
266<span class="sd">    queue : str</span>
267<span class="sd">        Name of queue for submission to ECMWF (e.g. ecgate or cca )</span>
268
269<span class="sd">    job_template : str</span>
270<span class="sd">        Name of the job template file for submission to ECMWF server.</span>
271<span class="sd">    &#39;&#39;&#39;</span>
272    <span class="kn">import</span> <span class="nn">_config</span>
273    <span class="kn">from</span> <span class="nn">Classes.ControlFile</span> <span class="kn">import</span> <span class="n">ControlFile</span>
274
275    <span class="n">args</span> <span class="o">=</span> <span class="n">get_cmdline_args</span><span class="p">()</span>
276    <span class="n">c</span> <span class="o">=</span> <span class="n">ControlFile</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span>
277    <span class="n">c</span><span class="o">.</span><span class="n">assign_args_to_control</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
278    <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_ECMWF_ENV</span><span class="p">):</span>
279        <span class="n">env_parameter</span> <span class="o">=</span> <span class="n">read_ecenv</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_ECMWF_ENV</span><span class="p">)</span>
280        <span class="n">c</span><span class="o">.</span><span class="n">assign_envs_to_control</span><span class="p">(</span><span class="n">env_parameter</span><span class="p">)</span>
281    <span class="n">c</span><span class="o">.</span><span class="n">check_conditions</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">queue</span><span class="p">)</span>
282
283    <span class="k">return</span> <span class="n">c</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">ppid</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">queue</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">job_template</span></div>
284
285<div class="viewcode-block" id="none_or_str"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.none_or_str">[docs]</a><span class="k">def</span> <span class="nf">none_or_str</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
286    <span class="sd">&#39;&#39;&#39;Converts the input string into Pythons None type if it</span>
287<span class="sd">    contains the string &quot;None&quot;.</span>
288
289<span class="sd">    Parameters</span>
290<span class="sd">    ----------</span>
291<span class="sd">    value : str</span>
292<span class="sd">        String to be checked for the &quot;None&quot; word.</span>
293
294<span class="sd">    Return</span>
295<span class="sd">    ------</span>
296<span class="sd">    None or value:</span>
297<span class="sd">        Return depends on the content of the input value. If it was &quot;None&quot;,</span>
298<span class="sd">        then the Python type None is returned, otherwise the string itself.</span>
299<span class="sd">    &#39;&#39;&#39;</span>
300    <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">&#39;None&#39;</span><span class="p">:</span>
301        <span class="k">return</span> <span class="kc">None</span>
302    <span class="k">return</span> <span class="n">value</span></div>
303
304<div class="viewcode-block" id="none_or_int"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.none_or_int">[docs]</a><span class="k">def</span> <span class="nf">none_or_int</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
305    <span class="sd">&#39;&#39;&#39;Converts the input string into Pythons None-type if it</span>
306<span class="sd">    contains string &quot;None&quot;; otherwise it is converted to an integer value.</span>
307
308<span class="sd">    Parameters</span>
309<span class="sd">    ----------</span>
310<span class="sd">    value : str</span>
311<span class="sd">        String to be checked for the &quot;None&quot; word.</span>
312
313<span class="sd">    Return</span>
314<span class="sd">    ------</span>
315<span class="sd">    None or int(value):</span>
316<span class="sd">        Return depends on the content of the input value. If it was &quot;None&quot;,</span>
317<span class="sd">        then the python type None is returned. Otherwise the string is</span>
318<span class="sd">        converted into an integer value.</span>
319<span class="sd">    &#39;&#39;&#39;</span>
320    <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">&#39;None&#39;</span><span class="p">:</span>
321        <span class="k">return</span> <span class="kc">None</span>
322    <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">)</span></div>
323
324<div class="viewcode-block" id="get_cmdline_args"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.get_cmdline_args">[docs]</a><span class="k">def</span> <span class="nf">get_cmdline_args</span><span class="p">():</span>
325    <span class="sd">&#39;&#39;&#39;Decomposes the command line arguments and assigns them to variables.</span>
326<span class="sd">    Apply default values for arguments not present.</span>
327
328<span class="sd">    Parameters</span>
329<span class="sd">    ----------</span>
330
331<span class="sd">    Return</span>
332<span class="sd">    ------</span>
333<span class="sd">    args : Namespace</span>
334<span class="sd">        Contains the command line arguments from the script / program call.</span>
335<span class="sd">    &#39;&#39;&#39;</span>
336
337    <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">&#39;Retrieve FLEXPART input from </span><span class="se">\</span>
338<span class="s1">                                ECMWF MARS archive&#39;</span><span class="p">,</span>
339                            <span class="n">formatter_class</span><span class="o">=</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
340
341    <span class="c1"># control parameters that override control file values</span>
342    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--start_date&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;start_date&quot;</span><span class="p">,</span>
343                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
344                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;start date YYYYMMDD&quot;</span><span class="p">)</span>
345    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--end_date&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;end_date&quot;</span><span class="p">,</span>
346                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
347                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;end_date YYYYMMDD&quot;</span><span class="p">)</span>
348    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--date_chunk&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;date_chunk&quot;</span><span class="p">,</span>
349                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
350                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;# of days to be retrieved at once&quot;</span><span class="p">)</span>
351    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--job_chunk&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;job_chunk&quot;</span><span class="p">,</span>
352                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
353                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;# of days to be retrieved within a single job&quot;</span><span class="p">)</span>
354    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--controlfile&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;controlfile&quot;</span><span class="p">,</span>
355                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">&#39;CONTROL_EA5&#39;</span><span class="p">,</span>
356                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The file with all CONTROL parameters.&quot;</span><span class="p">)</span>
357    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--basetime&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;basetime&quot;</span><span class="p">,</span>
358                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
359                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;base time such as 0 or 12 (for half day retrievals)&quot;</span><span class="p">)</span>
360    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--step&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;step&quot;</span><span class="p">,</span>
361                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
362                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Forecast steps such as 00/to/48&quot;</span><span class="p">)</span>
363    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--levelist&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;levelist&quot;</span><span class="p">,</span>
364                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
365                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Vertical levels to be retrieved, e.g. 30/to/60&quot;</span><span class="p">)</span>
366    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--area&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;area&quot;</span><span class="p">,</span>
367                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
368                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;area, defined by north/west/south/east&quot;</span><span class="p">)</span>
369
370    <span class="c1"># some switches</span>
371    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--debug&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;debug&quot;</span><span class="p">,</span>
372                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
373                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;debug mode - temporary files will be conserved&quot;</span><span class="p">)</span>
374    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--oper&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;oper&quot;</span><span class="p">,</span>
375                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
376                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;operational mode - prepares dates from &#39;</span>
377                        <span class="s1">&#39;environment variables&#39;</span><span class="p">)</span>
378    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--request&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;request&quot;</span><span class="p">,</span>
379                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
380                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;list all MARS requests in file mars_requests.dat&quot;</span><span class="p">)</span>
381    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--public&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;public&quot;</span><span class="p">,</span>
382                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
383                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;public mode - retrieves public datasets&quot;</span><span class="p">)</span>
384    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--rrint&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;rrint&quot;</span><span class="p">,</span>
385                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_int</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
386                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Selection of old or new  &#39;</span>
387                        <span class="s1">&#39;interpolation method for precipitation:</span><span class="se">\n</span><span class="s1">&#39;</span>
388                        <span class="s1">&#39;     0 - old method</span><span class="se">\n</span><span class="s1">&#39;</span>
389                        <span class="s1">&#39;     1 - new method (additional subgrid points)&#39;</span><span class="p">)</span>
390
391    <span class="c1"># set directories</span>
392    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--inputdir&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;inputdir&quot;</span><span class="p">,</span>
393                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
394                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Path to temporary directory for &#39;</span>
395                        <span class="s1">&#39;retrieved grib files and other processing files.&#39;</span><span class="p">)</span>
396    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--outputdir&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;outputdir&quot;</span><span class="p">,</span>
397                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
398                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Path to final directory where &#39;</span>
399                        <span class="s1">&#39;FLEXPART input files will be stored.&#39;</span><span class="p">)</span>
400
401    <span class="c1"># this is only used by prepare_flexpart.py to rerun a postprocessing step</span>
402    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--ppid&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;ppid&quot;</span><span class="p">,</span>
403                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
404                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;This is the specify the parent process id of a &#39;</span>
405                        <span class="s1">&#39;single flex_extract run to identify the files. &#39;</span>
406                        <span class="s1">&#39;It is the second number in the GRIB files.&#39;</span><span class="p">)</span>
407
408    <span class="c1"># arguments for job submission to ECMWF, only needed by submit.py</span>
409    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--job_template&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">&#39;job_template&#39;</span><span class="p">,</span>
410                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;job.temp&quot;</span><span class="p">,</span>
411                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Job template file. Will be used for submission &#39;</span>
412                        <span class="s1">&#39;to the batch system on the ECMWF server after &#39;</span>
413                        <span class="s1">&#39;modification.&#39;</span><span class="p">)</span>
414    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">&quot;--queue&quot;</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">&quot;queue&quot;</span><span class="p">,</span>
415                        <span class="nb">type</span><span class="o">=</span><span class="n">none_or_str</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
416                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The name of the ECMWF server name where the&#39;</span>
417                        <span class="s1">&#39;job script is to be submitted &#39;</span>
418                        <span class="s1">&#39;(e.g. ecgate | cca | ccb)&#39;</span><span class="p">)</span>
419
420    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
421
422    <span class="k">return</span> <span class="n">args</span></div>
423
424<div class="viewcode-block" id="read_ecenv"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.read_ecenv">[docs]</a><span class="k">def</span> <span class="nf">read_ecenv</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span>
425    <span class="sd">&#39;&#39;&#39;Reads the file into a dictionary where the key values are the parameter</span>
426<span class="sd">    names.</span>
427
428<span class="sd">    Parameters</span>
429<span class="sd">    ----------</span>
430<span class="sd">    filepath : str</span>
431<span class="sd">        Path to file where the ECMWF environment parameters are stored.</span>
432
433<span class="sd">    Return</span>
434<span class="sd">    ------</span>
435<span class="sd">    envs : dict</span>
436<span class="sd">        Contains the environment parameter ecuid, ecgid, gateway</span>
437<span class="sd">        and destination for ECMWF server environments.</span>
438<span class="sd">    &#39;&#39;&#39;</span>
439    <span class="n">envs</span> <span class="o">=</span> <span class="p">{}</span>
440    <span class="k">try</span><span class="p">:</span>
441        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
442            <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
443                <span class="n">data</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
444                <span class="n">envs</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
445    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
446        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">))</span>
447        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
448
449        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">... Error occured while trying to read ECMWF_ENV &#39;</span>
450                 <span class="s1">&#39;file: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">filepath</span><span class="p">))</span>
451
452    <span class="k">return</span> <span class="n">envs</span></div>
453
454<div class="viewcode-block" id="clean_up"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.clean_up">[docs]</a><span class="k">def</span> <span class="nf">clean_up</span><span class="p">(</span><span class="n">c</span><span class="p">):</span>
455    <span class="sd">&#39;&#39;&#39;Remove files from the intermediate directory (inputdir).</span>
456
457<span class="sd">    It keeps the final FLEXPART input files if program runs without</span>
458<span class="sd">    ECMWF API and keywords &quot;ectrans&quot; or &quot;ecstorage&quot; are set to &quot;1&quot;.</span>
459
460<span class="sd">    Parameters</span>
461<span class="sd">    ----------</span>
462<span class="sd">    c : ControlFile</span>
463<span class="sd">        Contains all the parameters of CONTROL file and</span>
464<span class="sd">        command line.</span>
465
466<span class="sd">    Return</span>
467<span class="sd">    ------</span>
468
469<span class="sd">    &#39;&#39;&#39;</span>
470
471    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;... clean inputdir!&quot;</span><span class="p">)</span>
472
473    <span class="n">cleanlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">filename</span> <span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span>
474                 <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s2">&quot;*&quot;</span><span class="p">))</span>
475                 <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">prefix</span><span class="p">)]</span>
476
477    <span class="k">if</span> <span class="n">cleanlist</span><span class="p">:</span>
478        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">cleanlist</span><span class="p">:</span>
479            <span class="n">silent_remove</span><span class="p">(</span><span class="n">element</span><span class="p">)</span>
480        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;... done!&quot;</span><span class="p">)</span>
481    <span class="k">else</span><span class="p">:</span>
482        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;... nothing to clean!&quot;</span><span class="p">)</span>
483
484    <span class="k">return</span></div>
485
486
487<div class="viewcode-block" id="my_error"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.my_error">[docs]</a><span class="k">def</span> <span class="nf">my_error</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="s1">&#39;ERROR&#39;</span><span class="p">):</span>
488    <span class="sd">&#39;&#39;&#39;Prints a specified error message which can be passed to the function</span>
489<span class="sd">    before exiting the program.</span>
490
491<span class="sd">    Parameters</span>
492<span class="sd">    ----------</span>
493<span class="sd">    message : str, optional</span>
494<span class="sd">        Error message. Default value is &quot;ERROR&quot;.</span>
495
496<span class="sd">    Return</span>
497<span class="sd">    ------</span>
498
499<span class="sd">    &#39;&#39;&#39;</span>
500
501    <span class="n">trace</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_stack</span><span class="p">())</span>
502    <span class="n">full_message</span> <span class="o">=</span> <span class="n">message</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n\n</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="n">trace</span>
503
504    <span class="nb">print</span><span class="p">(</span><span class="n">full_message</span><span class="p">)</span>
505
506    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
507
508    <span class="k">return</span></div>
509
510
511<div class="viewcode-block" id="send_mail"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.send_mail">[docs]</a><span class="k">def</span> <span class="nf">send_mail</span><span class="p">(</span><span class="n">users</span><span class="p">,</span> <span class="n">success_mode</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
512    <span class="sd">&#39;&#39;&#39;Prints a specific exit message which can be passed to the function.</span>
513
514<span class="sd">    Parameters</span>
515<span class="sd">    ----------</span>
516<span class="sd">    users : list of str</span>
517<span class="sd">        Contains all email addresses which should be notified.</span>
518<span class="sd">        It might also contain just the ecmwf user name which wil trigger</span>
519<span class="sd">        mailing to the associated email address for this user.</span>
520
521<span class="sd">    success_mode : str</span>
522<span class="sd">        States the exit mode of the program to put into</span>
523<span class="sd">        the mail subject line.</span>
524
525<span class="sd">    message : str, optional</span>
526<span class="sd">        Message for exiting program. Default value is &quot;Done!&quot;.</span>
527
528<span class="sd">    Return</span>
529<span class="sd">    ------</span>
530
531<span class="sd">    &#39;&#39;&#39;</span>
532
533    <span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">users</span><span class="p">:</span>
534        <span class="k">if</span> <span class="s1">&#39;$</span><span class="si">{USER}</span><span class="s1">&#39;</span> <span class="ow">in</span> <span class="n">user</span><span class="p">:</span>
535            <span class="n">user</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s1">&#39;USER&#39;</span><span class="p">)</span>
536        <span class="k">try</span><span class="p">:</span>
537            <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s1">&#39;mail&#39;</span><span class="p">,</span> <span class="s1">&#39;-s flex_extract_v7.1 &#39;</span> <span class="o">+</span>
538                                  <span class="n">success_mode</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">user</span><span class="p">)],</span>
539                                 <span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
540                                 <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
541                                 <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
542                                 <span class="n">bufsize</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
543            <span class="n">pout</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">communicate</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">message</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n\n</span><span class="s1">&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
544        <span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
545            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
546            <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... Email could not be sent!&#39;</span><span class="p">)</span>
547        <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
548            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">))</span>
549            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
550            <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... Email could not be sent!&#39;</span><span class="p">)</span>
551        <span class="k">else</span><span class="p">:</span>
552            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Email sent to &#39;</span> <span class="o">+</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">user</span><span class="p">))</span>
553
554    <span class="k">return</span></div>
555
556
557<div class="viewcode-block" id="normal_exit"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.normal_exit">[docs]</a><span class="k">def</span> <span class="nf">normal_exit</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="s1">&#39;Done!&#39;</span><span class="p">):</span>
558    <span class="sd">&#39;&#39;&#39;Prints a specific exit message which can be passed to the function.</span>
559
560<span class="sd">    Parameters</span>
561<span class="sd">    ----------</span>
562<span class="sd">    message : str, optional</span>
563<span class="sd">        Message for exiting program. Default value is &quot;Done!&quot;.</span>
564
565<span class="sd">    Return</span>
566<span class="sd">    ------</span>
567
568<span class="sd">    &#39;&#39;&#39;</span>
569
570    <span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">message</span><span class="p">))</span>
571
572    <span class="k">return</span></div>
573
574
575<div class="viewcode-block" id="product"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.product">[docs]</a><span class="k">def</span> <span class="nf">product</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
576    <span class="sd">&#39;&#39;&#39;Creates combinations of all passed arguments.</span>
577
578<span class="sd">    This method combines the single characters of the passed arguments</span>
579<span class="sd">    with each other in a way that each character of each argument value</span>
580<span class="sd">    will be combined with each character of the other arguments as a tuple.</span>
581
582<span class="sd">    Note</span>
583<span class="sd">    ----</span>
584<span class="sd">    This method is taken from an example at the ECMWF wiki website.</span>
585<span class="sd">    https://software.ecmwf.int/wiki/display/GRIB/index.py; 2018-03-16</span>
586
587<span class="sd">    It was released under the following license:</span>
588<span class="sd">    https://confluence.ecmwf.int/display/ECC/License</span>
589
590<span class="sd">    Example</span>
591<span class="sd">    -------</span>
592<span class="sd">    product(&#39;ABCD&#39;, &#39;xy&#39;) --&gt; Ax Ay Bx By Cx Cy Dx Dy</span>
593
594<span class="sd">    product(range(2), repeat = 3) --&gt; 000 001 010 011 100 101 110 111</span>
595
596<span class="sd">    Parameters</span>
597<span class="sd">    ----------</span>
598<span class="sd">    \*args : list or str</span>
599<span class="sd">        Positional arguments (arbitrary number).</span>
600
601<span class="sd">    \*\*kwds : dict</span>
602<span class="sd">        Contains all the keyword arguments from \*args.</span>
603
604<span class="sd">    Return</span>
605<span class="sd">    ------</span>
606<span class="sd">    prod : :obj:`tuple`</span>
607<span class="sd">        Return will be done with &quot;yield&quot;. A tuple of combined arguments.</span>
608<span class="sd">        See example in description above.</span>
609<span class="sd">    &#39;&#39;&#39;</span>
610    <span class="k">try</span><span class="p">:</span>
611        <span class="n">pools</span> <span class="o">=</span> <span class="p">[</span><span class="nb">tuple</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]</span> <span class="o">*</span> <span class="n">kwds</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;repeat&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
612        <span class="n">result</span> <span class="o">=</span> <span class="p">[[]]</span>
613        <span class="k">for</span> <span class="n">pool</span> <span class="ow">in</span> <span class="n">pools</span><span class="p">:</span>
614            <span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="o">+</span> <span class="p">[</span><span class="n">y</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">result</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">pool</span><span class="p">]</span>
615        <span class="k">for</span> <span class="n">prod</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
616            <span class="k">yield</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">prod</span><span class="p">)</span>
617    <span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
618        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... PRODUCT GENERATION FAILED!&#39;</span><span class="p">)</span>
619
620    <span class="k">return</span></div>
621
622
623<div class="viewcode-block" id="silent_remove"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.silent_remove">[docs]</a><span class="k">def</span> <span class="nf">silent_remove</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
624    <span class="sd">&#39;&#39;&#39;Remove file if it exists.</span>
625<span class="sd">    The function does not fail if the file does not exist.</span>
626
627<span class="sd">    Parameters</span>
628<span class="sd">    ----------</span>
629<span class="sd">    filename : str</span>
630<span class="sd">        The name of the file to be removed without notification.</span>
631
632<span class="sd">    Return</span>
633<span class="sd">    ------</span>
634
635<span class="sd">    &#39;&#39;&#39;</span>
636    <span class="k">try</span><span class="p">:</span>
637        <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
638    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
639        <span class="c1"># errno.ENOENT  =  no such file or directory</span>
640        <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">ENOENT</span><span class="p">:</span>
641            <span class="k">pass</span>
642        <span class="k">else</span><span class="p">:</span>
643            <span class="k">raise</span>  <span class="c1"># re-raise exception if a different error occured</span>
644
645    <span class="k">return</span></div>
646
647
648<div class="viewcode-block" id="init128"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.init128">[docs]</a><span class="k">def</span> <span class="nf">init128</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span>
649    <span class="sd">&#39;&#39;&#39;Opens and reads the grib file with table 128 information.</span>
650
651<span class="sd">    Parameters</span>
652<span class="sd">    ----------</span>
653<span class="sd">    filepath : str</span>
654<span class="sd">        Path to file of ECMWF grib table number 128.</span>
655
656<span class="sd">    Return</span>
657<span class="sd">    ------</span>
658<span class="sd">    table128 : dict</span>
659<span class="sd">        Contains the ECMWF grib table 128 information.</span>
660<span class="sd">        The key is the parameter number and the value is the</span>
661<span class="sd">        short name of the parameter.</span>
662<span class="sd">    &#39;&#39;&#39;</span>
663    <span class="n">table128</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
664    <span class="k">try</span><span class="p">:</span>
665        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
666            <span class="n">fdata</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
667    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
668        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">))</span>
669        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
670
671        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">... Error occured while trying to read parameter &#39;</span>
672                 <span class="s1">&#39;table file: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">filepath</span><span class="p">))</span>
673    <span class="k">else</span><span class="p">:</span>
674        <span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">fdata</span><span class="p">:</span>
675            <span class="k">if</span> <span class="n">data</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;!&#39;</span><span class="p">:</span>
676                <span class="n">table128</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">3</span><span class="p">]]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">59</span><span class="p">:</span><span class="mi">65</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
677
678    <span class="k">return</span> <span class="n">table128</span></div>
679
680
681<div class="viewcode-block" id="to_param_id"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.to_param_id">[docs]</a><span class="k">def</span> <span class="nf">to_param_id</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span>
682    <span class="sd">&#39;&#39;&#39;Transform parameter names to parameter ids with ECMWF grib table 128.</span>
683
684<span class="sd">    Parameters</span>
685<span class="sd">    ----------</span>
686<span class="sd">    pars : str</span>
687<span class="sd">        Addpar argument from CONTROL file in the format of</span>
688<span class="sd">        parameter names instead of IDs. The parameter short</span>
689<span class="sd">        names are separated by &quot;/&quot; and passed as one single string.</span>
690
691<span class="sd">    table : dict</span>
692<span class="sd">        Contains the ECMWF grib table 128 information.</span>
693<span class="sd">        The key is the parameter number and the value is the</span>
694<span class="sd">        short name of the parameter.</span>
695
696<span class="sd">    Return</span>
697<span class="sd">    ------</span>
698<span class="sd">    ipar : list of int</span>
699<span class="sd">        List of addpar parameters from CONTROL file transformed to</span>
700<span class="sd">        parameter ids in the format of integer.</span>
701<span class="sd">    &#39;&#39;&#39;</span>
702    <span class="k">if</span> <span class="ow">not</span> <span class="n">pars</span><span class="p">:</span>
703        <span class="k">return</span> <span class="p">[]</span>
704    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
705        <span class="n">pars</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">pars</span><span class="p">)</span>
706
707    <span class="n">cpar</span> <span class="o">=</span> <span class="n">pars</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
708    <span class="n">ipar</span> <span class="o">=</span> <span class="p">[]</span>
709    <span class="k">for</span> <span class="n">par</span> <span class="ow">in</span> <span class="n">cpar</span><span class="p">:</span>
710        <span class="n">par</span> <span class="o">=</span> <span class="n">par</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
711        <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">table</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
712            <span class="k">if</span> <span class="n">par</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
713                <span class="n">par</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">par</span><span class="p">))</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
714            <span class="k">if</span> <span class="n">par</span> <span class="o">==</span> <span class="n">k</span> <span class="ow">or</span> <span class="n">par</span> <span class="o">==</span> <span class="n">v</span><span class="p">:</span>
715                <span class="n">ipar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">k</span><span class="p">))</span>
716                <span class="k">break</span>
717        <span class="k">else</span><span class="p">:</span>
718            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Warning: par &#39;</span> <span class="o">+</span> <span class="n">par</span> <span class="o">+</span> <span class="s1">&#39; not found in table 128&#39;</span><span class="p">)</span>
719
720    <span class="k">return</span> <span class="n">ipar</span></div>
721
722<div class="viewcode-block" id="to_param_id_with_tablenumber"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.to_param_id_with_tablenumber">[docs]</a><span class="k">def</span> <span class="nf">to_param_id_with_tablenumber</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span>
723    <span class="sd">&#39;&#39;&#39;Transform parameter names to parameter IDs and add table ID.</span>
724
725<span class="sd">    Conversion with ECMWF grib table 128.</span>
726
727<span class="sd">    Parameters</span>
728<span class="sd">    ----------</span>
729<span class="sd">    pars : str</span>
730<span class="sd">        Addpar argument from CONTROL file in the format of</span>
731<span class="sd">        parameter names instead of ID. The parameter short</span>
732<span class="sd">        names are separated by &quot;/&quot; and passed as one single string.</span>
733
734<span class="sd">    table : dict</span>
735<span class="sd">        Contains the ECMWF grib table 128 information.</span>
736<span class="sd">        The key is the parameter number and the value is the</span>
737<span class="sd">        short name of the parameter.</span>
738
739<span class="sd">    Return</span>
740<span class="sd">    ------</span>
741<span class="sd">    spar : str</span>
742<span class="sd">        List of addpar parameters from CONTROL file transformed to</span>
743<span class="sd">        parameter IDs in the format of integer.</span>
744<span class="sd">    &#39;&#39;&#39;</span>
745    <span class="k">if</span> <span class="ow">not</span> <span class="n">pars</span><span class="p">:</span>
746        <span class="k">return</span> <span class="p">[]</span>
747    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
748        <span class="n">pars</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">pars</span><span class="p">)</span>
749
750    <span class="n">cpar</span> <span class="o">=</span> <span class="n">pars</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
751    <span class="n">spar</span> <span class="o">=</span> <span class="p">[]</span>
752    <span class="k">for</span> <span class="n">par</span> <span class="ow">in</span> <span class="n">cpar</span><span class="p">:</span>
753        <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">table</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
754            <span class="k">if</span> <span class="n">par</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
755                <span class="n">par</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">par</span><span class="p">))</span><span class="o">.</span><span class="n">zfill</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
756            <span class="k">if</span> <span class="n">par</span> <span class="o">==</span> <span class="n">k</span> <span class="ow">or</span> <span class="n">par</span> <span class="o">==</span> <span class="n">v</span><span class="p">:</span>
757                <span class="n">spar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">k</span> <span class="o">+</span> <span class="s1">&#39;.128&#39;</span><span class="p">)</span>
758                <span class="k">break</span>
759        <span class="k">else</span><span class="p">:</span>
760            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n\n\t\t</span><span class="s1">Warning: par &#39;</span> <span class="o">+</span> <span class="n">par</span> <span class="o">+</span> <span class="s1">&#39; not found in table 128</span><span class="se">\n\n</span><span class="s1">&#39;</span><span class="p">)</span>
761
762    <span class="k">return</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">spar</span><span class="p">)</span></div>
763
764<div class="viewcode-block" id="get_list_as_string"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.get_list_as_string">[docs]</a><span class="k">def</span> <span class="nf">get_list_as_string</span><span class="p">(</span><span class="n">list_obj</span><span class="p">,</span> <span class="n">concatenate_sign</span><span class="o">=</span><span class="s1">&#39;, &#39;</span><span class="p">):</span>
765    <span class="sd">&#39;&#39;&#39;Converts a list of arbitrary content into a single string using a given</span>
766<span class="sd">    concatenation character.</span>
767
768<span class="sd">    Parameters</span>
769<span class="sd">    ----------</span>
770<span class="sd">    list_obj : list of *</span>
771<span class="sd">        A list with arbitrary content.</span>
772
773<span class="sd">    concatenate_sign : str, optional</span>
774<span class="sd">        A string which is used to concatenate the single</span>
775<span class="sd">        list elements. Default value is &quot;, &quot;.</span>
776
777<span class="sd">    Return</span>
778<span class="sd">    ------</span>
779<span class="sd">    str_of_list : str</span>
780<span class="sd">        The content of the list as a single string.</span>
781<span class="sd">    &#39;&#39;&#39;</span>
782
783    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">list_obj</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
784        <span class="n">list_obj</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">list_obj</span><span class="p">)</span>
785    <span class="n">str_of_list</span> <span class="o">=</span> <span class="n">concatenate_sign</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">list_obj</span><span class="p">)</span>
786
787    <span class="k">return</span> <span class="n">str_of_list</span></div>
788
789<div class="viewcode-block" id="make_dir"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.make_dir">[docs]</a><span class="k">def</span> <span class="nf">make_dir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
790    <span class="sd">&#39;&#39;&#39;Creates a directory.</span>
791
792<span class="sd">    If the directory already exists, an information is printed and the creation</span>
793<span class="sd">    skipped. The program stops only if there is another problem.</span>
794
795<span class="sd">    Parameters</span>
796<span class="sd">    ----------</span>
797<span class="sd">    directory : str</span>
798<span class="sd">        The path to directory which should be created.</span>
799
800<span class="sd">    Return</span>
801<span class="sd">    ------</span>
802
803<span class="sd">    &#39;&#39;&#39;</span>
804    <span class="k">try</span><span class="p">:</span>
805        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
806    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
807        <span class="c1"># errno.EEXIST = directory already exists</span>
808        <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">EEXIST</span><span class="p">:</span>
809            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;INFORMATION: Directory </span><span class="si">{0}</span><span class="s1"> already exists!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory</span><span class="p">))</span>
810        <span class="k">else</span><span class="p">:</span>
811            <span class="k">raise</span> <span class="c1"># re-raise exception if a different error occured</span>
812
813    <span class="k">return</span></div>
814
815<div class="viewcode-block" id="put_file_to_ecserver"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.put_file_to_ecserver">[docs]</a><span class="k">def</span> <span class="nf">put_file_to_ecserver</span><span class="p">(</span><span class="n">ecd</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">):</span>
816    <span class="sd">&#39;&#39;&#39;Uses the ecaccess-file-put command to send a file to the ECMWF servers.</span>
817
818<span class="sd">    Note</span>
819<span class="sd">    ----</span>
820<span class="sd">    The return value is just for testing reasons. It does not have</span>
821<span class="sd">    to be used from the calling function since the whole error handling</span>
822<span class="sd">    is done in here.</span>
823
824<span class="sd">    Parameters</span>
825<span class="sd">    ----------</span>
826<span class="sd">    ecd : str</span>
827<span class="sd">        The path were the file is stored.</span>
828
829<span class="sd">    filename : str</span>
830<span class="sd">        The name of the file to send to the ECMWF server.</span>
831
832<span class="sd">    target : str</span>
833<span class="sd">        The target queue where the file should be sent to.</span>
834
835<span class="sd">    ecuid : str</span>
836<span class="sd">        The user id on ECMWF server.</span>
837
838<span class="sd">    ecgid : str</span>
839<span class="sd">        The group id on ECMWF server.</span>
840
841<span class="sd">    Return</span>
842<span class="sd">    ------</span>
843
844<span class="sd">    &#39;&#39;&#39;</span>
845
846    <span class="k">try</span><span class="p">:</span>
847        <span class="n">subprocess</span><span class="o">.</span><span class="n">check_output</span><span class="p">([</span><span class="s1">&#39;ecaccess-file-put&#39;</span><span class="p">,</span>
848                                 <span class="n">ecd</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="n">filename</span><span class="p">,</span>
849                                 <span class="n">target</span> <span class="o">+</span> <span class="s1">&#39;:/home/ms/&#39;</span> <span class="o">+</span>
850                                 <span class="n">ecgid</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="n">ecuid</span> <span class="o">+</span>
851                                 <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="n">filename</span><span class="p">],</span>
852                                <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">STDOUT</span><span class="p">)</span>
853    <span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
854        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">returncode</span><span class="p">))</span>
855        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
856
857        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">... Do you have a valid ecaccess certification key?&#39;</span><span class="p">)</span>
858        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... ECACCESS-FILE-PUT FAILED!&#39;</span><span class="p">)</span>
859    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
860        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">))</span>
861        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
862
863        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">... Most likely the ECACCESS library is not available!&#39;</span><span class="p">)</span>
864        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... ECACCESS-FILE-PUT FAILED!&#39;</span><span class="p">)</span>
865
866    <span class="k">return</span></div>
867
868<div class="viewcode-block" id="submit_job_to_ecserver"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.submit_job_to_ecserver">[docs]</a><span class="k">def</span> <span class="nf">submit_job_to_ecserver</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">jobname</span><span class="p">):</span>
869    <span class="sd">&#39;&#39;&#39;Uses ecaccess-job-submit command to submit a job to the ECMWF server.</span>
870
871<span class="sd">    Note</span>
872<span class="sd">    ----</span>
873<span class="sd">    The return value is just for testing reasons. It does not have</span>
874<span class="sd">    to be used from the calling function since the whole error handling</span>
875<span class="sd">    is done in here.</span>
876
877<span class="sd">    Parameters</span>
878<span class="sd">    ----------</span>
879<span class="sd">    target : str</span>
880<span class="sd">        The target where the file should be sent to, e.g. the queue.</span>
881
882<span class="sd">    jobname : str</span>
883<span class="sd">        The name of the jobfile to be submitted to the ECMWF server.</span>
884
885<span class="sd">    Return</span>
886<span class="sd">    ------</span>
887<span class="sd">    job_id : int</span>
888<span class="sd">        The id number of the job as a reference at the ECMWF server.</span>
889<span class="sd">    &#39;&#39;&#39;</span>
890
891    <span class="k">try</span><span class="p">:</span>
892        <span class="n">job_id</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_output</span><span class="p">([</span><span class="s1">&#39;ecaccess-job-submit&#39;</span><span class="p">,</span> <span class="s1">&#39;-queueName&#39;</span><span class="p">,</span>
893                                          <span class="n">target</span><span class="p">,</span> <span class="n">jobname</span><span class="p">])</span>
894
895    <span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
896        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">returncode</span><span class="p">))</span>
897        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
898
899        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">... Do you have a valid ecaccess certification key?&#39;</span><span class="p">)</span>
900        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... ecaccess-job-submit FAILED!&#39;</span><span class="p">)</span>
901    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
902        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">))</span>
903        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
904
905        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">... Most likely the ECACCESS library is not available!&#39;</span><span class="p">)</span>
906        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... ecaccess-job-submit FAILED!&#39;</span><span class="p">)</span>
907
908    <span class="k">return</span> <span class="n">job_id</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span></div>
909
910
911<div class="viewcode-block" id="get_informations"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.get_informations">[docs]</a><span class="k">def</span> <span class="nf">get_informations</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
912    <span class="sd">&#39;&#39;&#39;Extracts basic information from a sample grib file.</span>
913
914<span class="sd">    This information is needed for later use and the</span>
915<span class="sd">    initialization of numpy arrays where data are stored.</span>
916
917<span class="sd">    Parameters</span>
918<span class="sd">    ----------</span>
919<span class="sd">    filename : str</span>
920<span class="sd">            Name of the file which will be opened to extract basic information.</span>
921
922<span class="sd">    Return</span>
923<span class="sd">    ------</span>
924<span class="sd">    data : dict</span>
925<span class="sd">        Contains basic informations of the ECMWF grib files, e.g.</span>
926<span class="sd">        &#39;Ni&#39;, &#39;Nj&#39;, &#39;latitudeOfFirstGridPointInDegrees&#39;,</span>
927<span class="sd">        &#39;longitudeOfFirstGridPointInDegrees&#39;, &#39;latitudeOfLastGridPointInDegrees&#39;,</span>
928<span class="sd">        &#39;longitudeOfLastGridPointInDegrees&#39;, &#39;jDirectionIncrementInDegrees&#39;,</span>
929<span class="sd">        &#39;iDirectionIncrementInDegrees&#39;, &#39;missingValue&#39;</span>
930<span class="sd">    &#39;&#39;&#39;</span>
931    <span class="kn">from</span> <span class="nn">eccodes</span> <span class="kn">import</span> <span class="n">codes_grib_new_from_file</span><span class="p">,</span> <span class="n">codes_get</span><span class="p">,</span> <span class="n">codes_release</span>
932
933    <span class="n">data</span> <span class="o">=</span> <span class="p">{}</span>
934
935    <span class="c1"># --- open file ---</span>
936    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Opening grib file for extraction of information --- </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">filename</span><span class="p">)</span>
937    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
938        <span class="c1"># load first message from file</span>
939        <span class="n">gid</span> <span class="o">=</span> <span class="n">codes_grib_new_from_file</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
940
941        <span class="c1"># information needed from grib message</span>
942        <span class="n">keys</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Ni&#39;</span><span class="p">,</span>
943                <span class="s1">&#39;Nj&#39;</span><span class="p">,</span>
944                <span class="s1">&#39;latitudeOfFirstGridPointInDegrees&#39;</span><span class="p">,</span>
945                <span class="s1">&#39;longitudeOfFirstGridPointInDegrees&#39;</span><span class="p">,</span>
946                <span class="s1">&#39;latitudeOfLastGridPointInDegrees&#39;</span><span class="p">,</span>
947                <span class="s1">&#39;longitudeOfLastGridPointInDegrees&#39;</span><span class="p">,</span>
948                <span class="s1">&#39;jDirectionIncrementInDegrees&#39;</span><span class="p">,</span>
949                <span class="s1">&#39;iDirectionIncrementInDegrees&#39;</span><span class="p">,</span>
950                <span class="s1">&#39;missingValue&#39;</span><span class="p">,</span>
951               <span class="p">]</span>
952
953        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">Information extracted: &#39;</span><span class="p">)</span>
954        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
955            <span class="c1"># Get the value of the key in a grib message.</span>
956            <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">codes_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
957            <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> = </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
958
959        <span class="c1"># Free the memory for the message referred as gribid.</span>
960        <span class="n">codes_release</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span>
961
962    <span class="k">return</span> <span class="n">data</span></div>
963
964
965<div class="viewcode-block" id="get_dimensions"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.get_dimensions">[docs]</a><span class="k">def</span> <span class="nf">get_dimensions</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">purefc</span><span class="p">,</span> <span class="n">dtime</span><span class="p">,</span> <span class="n">index_vals</span><span class="p">,</span> <span class="n">start_date</span><span class="p">,</span> <span class="n">end_date</span><span class="p">):</span>
966    <span class="sd">&#39;&#39;&#39;This function specifies the correct dimensions for x, y, and t.</span>
967
968<span class="sd">    Parameters</span>
969<span class="sd">    ----------</span>
970<span class="sd">    info : dict</span>
971<span class="sd">        Contains basic informations of the ECMWF grib files, e.g.</span>
972<span class="sd">        &#39;Ni&#39;, &#39;Nj&#39;, &#39;latitudeOfFirstGridPointInDegrees&#39;,</span>
973<span class="sd">        &#39;longitudeOfFirstGridPointInDegrees&#39;, &#39;latitudeOfLastGridPointInDegrees&#39;,</span>
974<span class="sd">        &#39;longitudeOfLastGridPointInDegrees&#39;, &#39;jDirectionIncrementInDegrees&#39;,</span>
975<span class="sd">        &#39;iDirectionIncrementInDegrees&#39;, &#39;missingValue&#39;</span>
976
977<span class="sd">    purefc : int</span>
978<span class="sd">        Switch for definition of pure forecast mode or not.</span>
979
980<span class="sd">    dtime : str</span>
981<span class="sd">        Time step in hours.</span>
982
983<span class="sd">    index_vals : list of list of str</span>
984<span class="sd">        Contains the values from the keys used for a distinct selection</span>
985<span class="sd">        of GRIB messages in processing the grib files.</span>
986<span class="sd">        Content looks like e.g.:</span>
987<span class="sd">        index_vals[0]: (&#39;20171106&#39;, &#39;20171107&#39;, &#39;20171108&#39;) ; date</span>
988<span class="sd">        index_vals[1]: (&#39;0&#39;, &#39;1200&#39;, &#39;1800&#39;, &#39;600&#39;) ; time</span>
989<span class="sd">        index_vals[2]: (&#39;0&#39;, &#39;12&#39;, &#39;3&#39;, &#39;6&#39;, &#39;9&#39;) ; stepRange</span>
990
991<span class="sd">    start_date : str</span>
992<span class="sd">        The start date of the retrieval job.</span>
993
994<span class="sd">    end_date : str</span>
995<span class="sd">        The end date of the retrieval job.</span>
996
997<span class="sd">    Return</span>
998<span class="sd">    ------</span>
999<span class="sd">    (ix, jy, it) : tuple of int</span>
1000<span class="sd">        Dimension in x-direction, y-direction and in time.</span>
1001<span class="sd">    &#39;&#39;&#39;</span>
1002
1003    <span class="n">ix</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s1">&#39;Ni&#39;</span><span class="p">]</span>
1004
1005    <span class="n">jy</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s1">&#39;Nj&#39;</span><span class="p">]</span>
1006
1007    <span class="k">if</span> <span class="ow">not</span> <span class="n">purefc</span><span class="p">:</span>
1008        <span class="n">it</span> <span class="o">=</span> <span class="p">((</span><span class="n">end_date</span> <span class="o">-</span> <span class="n">start_date</span><span class="p">)</span><span class="o">.</span><span class="n">days</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">//</span> <span class="nb">int</span><span class="p">(</span><span class="n">dtime</span><span class="p">)</span>
1009    <span class="k">else</span><span class="p">:</span>
1010        <span class="c1"># #no of step * #no of times * #no of days</span>
1011        <span class="n">it</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">index_vals</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">index_vals</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">index_vals</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
1012
1013    <span class="k">return</span> <span class="p">(</span><span class="n">ix</span><span class="p">,</span> <span class="n">jy</span><span class="p">,</span> <span class="n">it</span><span class="p">)</span></div>
1014
1015
1016<div class="viewcode-block" id="execute_subprocess"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.execute_subprocess">[docs]</a><span class="k">def</span> <span class="nf">execute_subprocess</span><span class="p">(</span><span class="n">cmd_list</span><span class="p">,</span> <span class="n">error_msg</span><span class="o">=</span><span class="s1">&#39;SUBPROCESS FAILED!&#39;</span><span class="p">):</span>
1017    <span class="sd">&#39;&#39;&#39;Executes a command via a subprocess.</span>
1018
1019<span class="sd">    Error handling is done if an error occures.</span>
1020
1021<span class="sd">    Parameters</span>
1022<span class="sd">    ----------</span>
1023<span class="sd">    cmd_list : list of str</span>
1024<span class="sd">        A list of the components for the command line execution.</span>
1025<span class="sd">        They will be concatenated with blank space for the command</span>
1026<span class="sd">        to be submitted, like [&#39;mv&#39;, file1, file2] for mv file1 file2.</span>
1027
1028<span class="sd">    Return</span>
1029<span class="sd">    ------</span>
1030<span class="sd">    error_msg : str, optional</span>
1031<span class="sd">        Error message if the subprocess fails.</span>
1032<span class="sd">        By default it will just say &quot;SUBPROCESS FAILED!&quot;.</span>
1033<span class="sd">    &#39;&#39;&#39;</span>
1034
1035    <span class="k">try</span><span class="p">:</span>
1036        <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">(</span><span class="n">cmd_list</span><span class="p">)</span>
1037    <span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
1038        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">returncode</span><span class="p">))</span>
1039        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
1040
1041        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... &#39;</span> <span class="o">+</span> <span class="n">error_msg</span><span class="p">)</span>
1042    <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
1043        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR CODE: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="p">))</span>
1044        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> </span><span class="se">\t</span><span class="s1"> &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span>
1045
1046        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">&#39;... &#39;</span> <span class="o">+</span> <span class="n">error_msg</span><span class="p">)</span>
1047
1048    <span class="k">return</span></div>
1049
1050
1051<div class="viewcode-block" id="generate_retrieval_period_boundary"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.generate_retrieval_period_boundary">[docs]</a><span class="k">def</span> <span class="nf">generate_retrieval_period_boundary</span><span class="p">(</span><span class="n">c</span><span class="p">):</span>
1052    <span class="sd">&#39;&#39;&#39;Generates retrieval period boundary datetimes from CONTROL information.</span>
1053
1054<span class="sd">    Parameters</span>
1055<span class="sd">    ----------</span>
1056<span class="sd">    c : ControlFile</span>
1057<span class="sd">        Contains all the parameters of CONTROL file and</span>
1058<span class="sd">        command line.</span>
1059
1060<span class="sd">    Return</span>
1061<span class="sd">    ------</span>
1062<span class="sd">    start_period : datetime</span>
1063<span class="sd">        The first timestamp of the actual retrieval period disregarding</span>
1064<span class="sd">        the temporary times which were used for processing reasons.</span>
1065
1066<span class="sd">    end_period : datetime</span>
1067<span class="sd">        The last timestamp of the actual retrieval period disregarding</span>
1068<span class="sd">        the temporary times which were used for processing reasons.</span>
1069<span class="sd">    &#39;&#39;&#39;</span>
1070    <span class="c1"># generate start and end timestamp of the retrieval period</span>
1071    <span class="n">start_period</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">start_date</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s1">&#39;%Y%m</span><span class="si">%d</span><span class="s1">%H&#39;</span><span class="p">)</span>
1072    <span class="n">start_period</span> <span class="o">=</span> <span class="n">start_period</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
1073    <span class="n">end_period</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="s1">&#39;%Y%m</span><span class="si">%d</span><span class="s1">%H&#39;</span><span class="p">)</span>
1074    <span class="n">end_period</span> <span class="o">=</span> <span class="n">end_period</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
1075
1076
1077    <span class="k">return</span> <span class="n">start_period</span><span class="p">,</span> <span class="n">end_period</span></div>
1078
1079
1080<div class="viewcode-block" id="check_for_string_in_file"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.check_for_string_in_file">[docs]</a><span class="k">def</span> <span class="nf">check_for_string_in_file</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="n">search_string</span><span class="p">):</span>
1081    <span class="sd">&quot;&quot;&quot;</span>
1082<span class="sd">    Search for a specific string in a file and return True if</span>
1083<span class="sd">    the string was found.</span>
1084
1085<span class="sd">    Parameters</span>
1086<span class="sd">    ----------</span>
1087<span class="sd">    filepath : str</span>
1088<span class="sd">        The full file path which is to be examined.</span>
1089
1090<span class="sd">    search_string : str</span>
1091<span class="sd">        The string which is looked up for in the file.</span>
1092
1093<span class="sd">    Return</span>
1094<span class="sd">    ------</span>
1095<span class="sd">    Boolean :</span>
1096<span class="sd">        True : String was found</span>
1097<span class="sd">        False : String was not found</span>
1098<span class="sd">    &quot;&quot;&quot;</span>
1099    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fio</span><span class="p">:</span>
1100        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fio</span><span class="p">:</span>
1101            <span class="k">if</span> <span class="n">search_string</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
1102                <span class="k">return</span> <span class="kc">True</span>
1103    <span class="k">return</span> <span class="kc">False</span></div>
1104
1105
1106<div class="viewcode-block" id="overwrite_lines_in_file"><a class="viewcode-back" href="../Documentation/Api/api_python.html#tools.overwrite_lines_in_file">[docs]</a><span class="k">def</span> <span class="nf">overwrite_lines_in_file</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="n">search_string</span><span class="p">,</span> <span class="n">sub_string</span><span class="p">):</span>
1107    <span class="sd">&quot;&quot;&quot;</span>
1108<span class="sd">    Overwrites lines which contain the given search string with the</span>
1109<span class="sd">    substitution string.</span>
1110
1111<span class="sd">    Parameters</span>
1112<span class="sd">    ----------</span>
1113<span class="sd">    search_string : str</span>
1114<span class="sd">        The string which is looked up for in the file.</span>
1115
1116<span class="sd">    sub_string : str</span>
1117<span class="sd">        The string which overwrites the search string.</span>
1118
1119<span class="sd">    Return</span>
1120<span class="sd">    ------</span>
1121<span class="sd">    &quot;&quot;&quot;</span>
1122    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fio</span><span class="p">:</span>
1123        <span class="n">data</span> <span class="o">=</span> <span class="n">fio</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
1124
1125    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fio</span><span class="p">:</span>
1126        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
1127            <span class="k">if</span> <span class="n">search_string</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
1128                <span class="n">fio</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">sub_string</span><span class="p">)</span>
1129            <span class="k">else</span><span class="p">:</span>
1130                <span class="n">fio</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
1131
1132    <span class="k">return</span></div>
1133
1134</pre></div>
1135
1136           </div>
1137           
1138          </div>
1139          <footer>
1140 
1141
1142  <hr/>
1143
1144  <div role="contentinfo">
1145    <p>
1146        &copy; Copyright 2020, Anne Philipp, Leopold Haimberger and Petra Seibert
1147
1148    </p>
1149  </div>
1150  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
1151
1152</footer>
1153
1154        </div>
1155      </div>
1156
1157    </section>
1158
1159  </div>
1160 
1161
1162
1163  <script type="text/javascript">
1164      jQuery(function () {
1165          SphinxRtdTheme.Navigation.enable(true);
1166      });
1167  </script>
1168
1169 
1170 
1171   
1172   
1173
1174</body>
1175</html>
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG