nabu_config.py 18 KB
Newer Older
Pierre Paleo's avatar
Pierre Paleo committed
1
from .validators import *
Pierre Paleo's avatar
Pierre Paleo committed
2
from .. import __version__
Pierre Paleo's avatar
Pierre Paleo committed
3

Pierre Paleo's avatar
Pierre Paleo committed
4
5
6
7
8
9
#
# option "type":
#  - required: always visible, user must provide a valid value
#  - optional: visible, but might be left blank
#  - advanced: optional and not visible by default
#  - unsupported: hidden (not implemented yet)
10
11
12
13
14
15
16
_options_levels = {
    "required": 0,
    "optional": 1,
    "advanced": 2,
    "unsupported": 10,
}

Pierre Paleo's avatar
Pierre Paleo committed
17

Pierre Paleo's avatar
Pierre Paleo committed
18
19
20
nabu_config = {
    "dataset": {
        "location": {
Pierre Paleo's avatar
Pierre Paleo committed
21
            "default": "",
22
            "help": "Dataset location, either a directory or a HDF5-Nexus file.",
Pierre Paleo's avatar
Pierre Paleo committed
23
            "validator": dataset_location_validator,
Pierre Paleo's avatar
Pierre Paleo committed
24
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
25
        },
26
27
28
29
30
31
        "hdf5_entry": {
            "default": "",
            "help": "Entry in the HDF5 file, if applicable. Default is the first available entry.",
            "validator": optional_string_validator,
            "type": "advanced",
        },
32
33
        "binning": {
            "default": "1",
Pierre Paleo's avatar
Pierre Paleo committed
34
            "help": "Binning factor in the horizontal dimension when reading the data.\nThe final slices dimensions will be divided by 'slices_binning'",
35
            "validator": binning_validator,
Pierre Paleo's avatar
Pierre Paleo committed
36
            "type": "advanced",
37
38
39
        },
        "binning_z": {
            "default": "1",
Pierre Paleo's avatar
Pierre Paleo committed
40
            "help": "Binning factor in the vertical dimension when reading the data.\nThis retsults in a lesser number of reconstructed slices.",
41
            "validator": binning_validator,
Pierre Paleo's avatar
Pierre Paleo committed
42
            "type": "advanced",
43
44
45
46
47
        },
        "projections_subsampling": {
            "default": "1",
            "help": "Projections subsampling factor: take one projection out of 'projection_subsampling'",
            "validator": binning_validator,
Pierre Paleo's avatar
Pierre Paleo committed
48
            "type": "advanced",
49
        },
50
51
52
53
54
55
        "exclude_projections": {
            "default": "",
            "help": "Path to a file name containing projections to exclude (projection indices).",
            "validator": optional_file_location_validator,
            "type": "advanced",
        },
Pierre Paleo's avatar
Pierre Paleo committed
56
57
58
59
    },
    "preproc": {
        "flatfield_enabled": {
            "default": "1",
60
61
            "help": "Whether to enable flat-field normalization. If the value is 'forced', then nabu will perform flatfield regardless of the dataset by attempting to load flats/refs from tomwer_processes.h5 file or nabu_processes.h5 or file provided in 'processes_file'.",
            "validator": flatfield_enabled_validator,
62
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
63
64
65
66
67
        },
        "ccd_filter_enabled": {
            "default": "0",
            "help": "Whether to enable the CCD hotspots correction.",
            "validator": boolean_validator,
Pierre Paleo's avatar
Pierre Paleo committed
68
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
69
70
71
72
73
        },
        "ccd_filter_threshold": {
            "default": "0.04",
            "help": "If ccd_filter_enabled = 1, a median filter is applied on the 3X3 neighborhood\nof every pixel. If a pixel value exceeds the median value more than this parameter,\nthen the pixel value is replaced with the median value.",
            "validator": float_validator,
Pierre Paleo's avatar
Pierre Paleo committed
74
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
75
        },
76
77
78
79
80
81
82
83
84
85
86
87
        "double_flatfield_enabled": {
            "default": "0",
            "help": "Whether to enable the 'double flat-field' filetering for correcting rings artefacts.",
            "validator": boolean_validator,
            "type": "optional",
        },
        "dff_sigma": {
            "default": "",
            "help": "Enable high-pass filtering on double flatfield with this value of 'sigma'",
            "validator": optional_float_validator,
            "type": "advanced",
        },
Pierre Paleo's avatar
Pierre Paleo committed
88
89
        "take_logarithm": {
            "default": "1",
Pierre Paleo's avatar
Pierre Paleo committed
90
            "help": "Whether to take logarithm after flat-field and phase retrieval.",
91
            "validator": boolean_validator,
Pierre Paleo's avatar
Pierre Paleo committed
92
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
93
        },
94
95
96
97
        "log_min_clip": {
            "default": "1e-6",
            "help": "After division by the FF, and before the logarithm, the is clipped to this minimum. Enabled only if take_logarithm=1",
            "validator": float_validator,
98
            "type": "advanced",
99
100
101
102
103
        },
        "log_max_clip": {
            "default": "10.0",
            "help": "After division by the FF, and before the logarithm, the is clipped to this maximum. Enabled only if take_logarithm=1",
            "validator": float_validator,
104
            "type": "advanced",
105
        },
106
107
108
109
        "sino_normalization": {
            "default": "",
            "help": "Sinogram normalization method. Available methods are: chebyshev, none. Default is none (no normalization)",
            "validator": sino_normalization_validator,
110
            "type": "advanced",
111
        },
Pierre Paleo's avatar
Pierre Paleo committed
112
113
114
115
116
117
        "processes_file": {
            "default": "",
            "help": "Load results from a previous session. This the path to a HDF5 file containing results data along with configuration needed to obtain it.",
            "validator": optional_file_location_validator,
            "type": "advanced",
        },
118
119
120
121
122
123
124
        "sino_rings_correction": {
            "default": "",
            "help": "Sinogram rings removal method. Default (empty) is None. Available are: None, munch. See also: sino_rings_options",
            "validator": sino_deringer_methods,
            "type": "optional",
        },
        "sino_rings_options": {
125
            "default": "sigma=1.0 ; levels=10",
126
127
128
129
            "help": "Options for sinogram rings correction methods. The parameters are separated by commas and passed as 'name=value', for example: sigma=1.0;levels=10. Mind the semicolon separator (;).",
            "validator": cor_options_validator,
            "type": "advanced",
        },
Pierre Paleo's avatar
Pierre Paleo committed
130
131
132
    },
    "phase": {
        "method": {
133
            "default": "none",
Pierre Paleo's avatar
Pierre Paleo committed
134
135
            "help": "Phase retrieval method. Available are: Paganin, None",
            "validator": phase_method_validator,
Pierre Paleo's avatar
Pierre Paleo committed
136
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
137
        },
Pierre Paleo's avatar
Pierre Paleo committed
138
        "delta_beta": {
Pierre Paleo's avatar
Pierre Paleo committed
139
            "default": "100.0",
Pierre Paleo's avatar
Typos    
Pierre Paleo committed
140
            "help": "Single-distance phase retrieval related parameters\n----------------------------\ndelta/beta ratio for the Paganin/CTR method",
Pierre Paleo's avatar
Pierre Paleo committed
141
            "validator": float_validator,
Pierre Paleo's avatar
Pierre Paleo committed
142
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
143
        },
Nicola Vigano's avatar
Nicola Vigano committed
144
        "margin": {
Pierre Paleo's avatar
Pierre Paleo committed
145
            "default": "50",
Nicola Vigano's avatar
Nicola Vigano committed
146
            "help": "Margin (in pixels) in the Paganin/CTR filtering.",
Pierre Paleo's avatar
Pierre Paleo committed
147
            "validator": integer_validator,
148
            "type": "advanced",
Pierre Paleo's avatar
Pierre Paleo committed
149
        },
Pierre Paleo's avatar
Pierre Paleo committed
150
        "unsharp_coeff": {
Pierre Paleo's avatar
Pierre Paleo committed
151
            "default": "0",
Pierre Paleo's avatar
Pierre Paleo committed
152
            "help": "Unsharp mask strength. The unsharped image is equal to\n  UnsharpedImage =  (1 + coeff)*originalPaganinImage - coeff * ConvolvedImage. Setting this coefficient to zero means that no unsharp mask will be applied.",
Pierre Paleo's avatar
Pierre Paleo committed
153
            "validator": float_validator,
Pierre Paleo's avatar
Pierre Paleo committed
154
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
155
        },
Pierre Paleo's avatar
Pierre Paleo committed
156
        "unsharp_sigma": {
Pierre Paleo's avatar
Pierre Paleo committed
157
            "default": "0",
Pierre Paleo's avatar
Pierre Paleo committed
158
            "help": "Standard deviation of the Gaussian filter when applying an unsharp mask\nafter the Paganin filtering. Disabled if set to 0.",
Pierre Paleo's avatar
Pierre Paleo committed
159
            "validator": float_validator,
Pierre Paleo's avatar
Pierre Paleo committed
160
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
161
        },
Pierre Paleo's avatar
Pierre Paleo committed
162
        "padding_type": {
163
            "default": "edge",
Pierre Paleo's avatar
Pierre Paleo committed
164
            "help": "Padding type for the filtering step in Paganin/CTR. Available are: mirror, edge, zeros",
Pierre Paleo's avatar
Pierre Paleo committed
165
            "validator": padding_mode_validator,
Pierre Paleo's avatar
Pierre Paleo committed
166
            "type": "advanced",
Pierre Paleo's avatar
Pierre Paleo committed
167
168
169
        },
    },
    "reconstruction": {
Pierre Paleo's avatar
Pierre Paleo committed
170
171
172
173
        "method": {
            "default": "FBP",
            "help": "Reconstruction method. Possible values: FBP, none. If value is 'none', no reconstruction will be done.",
            "validator": reconstruction_method_validator,
Pierre Paleo's avatar
Pierre Paleo committed
174
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
175
        },
Pierre Paleo's avatar
Pierre Paleo committed
176
177
        "angles_file": {
            "default": "",
Pierre Paleo's avatar
Pierre Paleo committed
178
            "help": "In the case you want to override the angles found in the files metadata. The angles are in degree.",
Pierre Paleo's avatar
Pierre Paleo committed
179
            "validator": optional_file_location_validator,
Pierre Paleo's avatar
Pierre Paleo committed
180
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
181
        },
Pierre Paleo's avatar
Pierre Paleo committed
182
183
        "rotation_axis_position": {
            "default": "",
184
            "help": "Rotation axis position. Default (empty) is the middle of the detector width.\nAdditionally, the following methods are available to find automaticall the Center of Rotation (CoR):\n - centered : a fast and simple auto-CoR method. It only works when the CoR is not far from the middle of the detector. It does not work for half-tomography.\n - global : a slow but robust auto-CoR.\n - sliding-window : semi-automatically find the CoR with a sliding window. You have to specify on which side the CoR is (left, center, right). Please see the 'cor_options' parameter.\n - growing-window : automatically find the CoR with a sliding-and-growing window. You can tune the option with the parameter 'cor_options'.",
185
            "validator": cor_validator,
186
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
187
        },
188
189
        "cor_options": {
            "default": "",
190
            "help": "Options for methods finding automatically the rotation axis position. The parameters are separated by commas and passed as 'name=value', for example: low_pass=1; high_pass=20. Mind the semicolon separator (;).",
191
192
193
            "validator": cor_options_validator,
            "type": "advanced",
        },
Pierre Paleo's avatar
Pierre Paleo committed
194
195
        "axis_correction_file": {
            "default": "",
Pierre Paleo's avatar
Pierre Paleo committed
196
            "help": "In the case where the axis position is specified for each slice",
Pierre Paleo's avatar
Pierre Paleo committed
197
            "validator": optional_values_file_validator,
Pierre Paleo's avatar
Pierre Paleo committed
198
            "type": "advanced",
Pierre Paleo's avatar
Pierre Paleo committed
199
        },
Pierre Paleo's avatar
Pierre Paleo committed
200
201
202
        "translation_movements_file": {
            "default": "",
            "help": "A file where each line describes the translation in X and Z of the sample (or detector).",
Pierre Paleo's avatar
Pierre Paleo committed
203
            "validator": optional_values_file_validator,
Pierre Paleo's avatar
Pierre Paleo committed
204
205
            "type": "advanced",
        },
Pierre Paleo's avatar
Pierre Paleo committed
206
207
        "angle_offset": {
            "default": "0",
208
            "help": "Use this if you want to obtain a rotated reconstructed slice. The angle is in degrees.",
Pierre Paleo's avatar
Pierre Paleo committed
209
            "validator": float_validator,
Pierre Paleo's avatar
Pierre Paleo committed
210
            "type": "advanced",
Pierre Paleo's avatar
Pierre Paleo committed
211
212
213
214
215
        },
        "fbp_filter_type": {
            "default": "ramlak",
            "help": "Filter type for FBP method. Available are: ramlak, none",
            "validator": fbp_filter_name_validator,
Pierre Paleo's avatar
Pierre Paleo committed
216
            "type": "advanced",
Pierre Paleo's avatar
Pierre Paleo committed
217
218
219
        },
        "padding_type": {
            "default": "zeros",
Pierre Paleo's avatar
Pierre Paleo committed
220
            "help": "Padding type for FBP. Available are: zeros, edges",
Pierre Paleo's avatar
Pierre Paleo committed
221
            "validator": padding_mode_validator,
Pierre Paleo's avatar
Pierre Paleo committed
222
            "type": "optional", # put "advanced" with default value "edges" ?
Pierre Paleo's avatar
Pierre Paleo committed
223
224
        },
        "enable_halftomo": {
Pierre Paleo's avatar
Pierre Paleo committed
225
            "default": "0",
Pierre Paleo's avatar
Pierre Paleo committed
226
            "help": "Whether to enable half-acquisition",
Pierre Paleo's avatar
Pierre Paleo committed
227
            "validator": boolean_validator,
Pierre Paleo's avatar
Pierre Paleo committed
228
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
229
230
231
        },
        "start_x": {
            "default": "0",
Pierre Paleo's avatar
Pierre Paleo committed
232
            "help": "\nParameters for sub-volume reconstruction. Indices start at 0 !\n----------------------------------------------------------------\n(x, y) are the dimension of a slice, and (z) is the 'vertical' axis\nBy default, all the volume is reconstructed slice by slice, along the axis 'z'.",
Pierre Paleo's avatar
Pierre Paleo committed
233
            "validator": nonnegative_integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
234
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
235
236
237
238
239
        },
        "end_x": {
            "default": "-1",
            "help": "",
            "validator": integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
240
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
241
242
243
244
245
        },
        "start_y": {
            "default": "0",
            "help": "",
            "validator": nonnegative_integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
246
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
247
248
249
250
251
        },
        "end_y": {
            "default": "-1",
            "help": "",
            "validator": integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
252
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
253
254
255
256
257
        },
        "start_z": {
            "default": "0",
            "help": "",
            "validator": nonnegative_integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
258
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
259
260
261
262
263
        },
        "end_z": {
            "default": "-1",
            "help": "",
            "validator": integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
264
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
265
266
267
268
269
        },
        "iterations": {
            "default": "200",
            "help": "\nParameters for iterative algorithms\n------------------------------------\nNumber of iterations",
            "validator": nonnegative_integer_validator,
Pierre Paleo's avatar
Pierre Paleo committed
270
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
271
272
        },
        "optim_algorithm": {
Pierre Paleo's avatar
Pierre Paleo committed
273
            "default": "chambolle-pock",
Pierre Paleo's avatar
Pierre Paleo committed
274
275
            "help": "Optimization algorithm for iterative methods",
            "validator": optimization_algorithm_name_validator,
Pierre Paleo's avatar
Pierre Paleo committed
276
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
277
278
279
280
281
        },
        "weight_tv": {
            "default": "1.0e-2",
            "help": "Total Variation regularization parameter for iterative methods",
            "validator": float_validator,
Pierre Paleo's avatar
Pierre Paleo committed
282
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
283
284
285
286
287
        },
        "preconditioning_filter": {
            "default": "1",
            "help": "Whether to enable 'filter preconditioning' for iterative methods",
            "validator": boolean_validator,
Pierre Paleo's avatar
Pierre Paleo committed
288
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
289
290
291
292
293
        },
        "positivity_constraint": {
            "default": "1",
            "help": "Whether to enforce a positivity constraint in the reconstruction.",
            "validator": boolean_validator,
Pierre Paleo's avatar
Pierre Paleo committed
294
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
295
296
297
298
        },
    },
    "output": {
        "location": {
Pierre Paleo's avatar
Pierre Paleo committed
299
300
            "default": "",
            "help": "Directory where the output reconstruction is stored.",
301
            "validator": optional_directory_location_validator,
Pierre Paleo's avatar
Pierre Paleo committed
302
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
303
304
        },
        "file_prefix": {
305
            "default": "",
Pierre Paleo's avatar
Pierre Paleo committed
306
            "help": "File prefix. Optional, by default it is inferred from the scanned dataset.",
307
            "validator": optional_file_name_validator,
Pierre Paleo's avatar
Pierre Paleo committed
308
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
309
310
311
        },
        "file_format": {
            "default": "hdf5",
Pierre Paleo's avatar
Pierre Paleo committed
312
            "help": "Output file format. Available are: hdf5, tiff, jp2, edf",
Pierre Paleo's avatar
Pierre Paleo committed
313
            "validator": output_file_format_validator,
Pierre Paleo's avatar
Pierre Paleo committed
314
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
315
        },
316
317
        "overwrite_results": {
            "default": "0",
Pierre Paleo's avatar
Pierre Paleo committed
318
            "help": "What to do in the case where the output file exists.\nBy default, the output data is never overwritten and the process is interrupted if the file already exists.\nSet this option to 1 if you want to overwrite the output files.",
319
320
321
            "validator": boolean_validator,
            "type": "required",
        },
Pierre Paleo's avatar
Pierre Paleo committed
322
    },
323
324
325
326
327
328
329
330
331
332
333
334
335
336
    "postproc": {
        "output_histogram": {
            "default": "0",
            "help": "Whether to compute a histogram of the volume.",
            "validator": boolean_validator,
            "type": "optional",
        },
        "histogram_bins": {
            "default": "1000000",
            "help": "Number of bins for the output histogram. Default is one million. ",
            "validator": nonnegative_integer_validator,
            "type": "advanced",
        },
    },
Pierre Paleo's avatar
Pierre Paleo committed
337
338
    "resources": {
        "method": {
Pierre Paleo's avatar
Pierre Paleo committed
339
            "default": "local",
Pierre Paleo's avatar
Typos    
Pierre Paleo committed
340
            "help": "Computations distribution method. It can be:\n  - local:  run the computations on the local machine\n  - slurm: run the computations through SLURM\n  - preview: reconstruct the slices/volume as quickly as possible, possibly doing some binning.",
Pierre Paleo's avatar
Pierre Paleo committed
341
            "validator": distribution_method_validator,
Pierre Paleo's avatar
Pierre Paleo committed
342
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
343
        },
344
345
346
347
        "gpus": {
            "default": "1",
            "help": "Number of GPUs to use.",
            "validator": nonnegative_integer_validator,
348
            "type": "unsupported",
349
350
351
        },
        "gpu_id": {
            "default": "",
352
            "help": "For method = local only. List of GPU IDs to use. This parameter overwrites 'gpus'.\nIf left blank, exactly one GPU will be used, and the best one will be picked.",
353
            "validator": list_of_int_validator,
354
            "type": "unsupported",
355
        },
356
357
358
359
        "cpu_workers": {
            "default": "0",
            "help": "Number of 'CPU workers' for each GPU worker. It is discouraged to set this number to more than one. A value of -1 means exactly one CPU worker.",
            "validator": integer_validator,
360
            "type": "unsupported",
361
        },
Pierre Paleo's avatar
Pierre Paleo committed
362
        "memory_per_node": {
Pierre Paleo's avatar
Pierre Paleo committed
363
            "default": "90%",
364
            "help": "RAM memory per computing node, either in GB or in percent of the AVAILABLE (!= total) node memory.\nIf several workers share the same node, their combined memory usage will not exceed this number.",
Pierre Paleo's avatar
Pierre Paleo committed
365
            "validator": resources_validator,
366
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
367
        },
368
        "threads_per_node": {
Pierre Paleo's avatar
Pierre Paleo committed
369
            "default": "100%",
370
            "help": "Number of threads to allocate on each node, either a number or a percentage of the available threads",
Pierre Paleo's avatar
Pierre Paleo committed
371
            "validator": resources_validator,
372
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
373
        },
374
375
376
377
        "queue": {
            "default": "gpu",
            "help": "\nParameters exclusive to the 'slurm' distribution method\n------------------------------------------------------\nName of the SLURM partition ('queue'). Full list is obtained with 'scontrol show partition'",
            "validator": nonempty_string_validator,
378
            "type": "unsupported",
379
        },
Pierre Paleo's avatar
Pierre Paleo committed
380
381
        "walltime": {
            "default": "01:00:00",
382
            "help": "Time limit for the SLURM resource allocation, in the format Hours:Minutes:Seconds",
Pierre Paleo's avatar
Pierre Paleo committed
383
            "validator": walltime_validator,
384
            "type": "unsupported",
Pierre Paleo's avatar
Pierre Paleo committed
385
386
387
388
389
390
        },
    },
    "about": {
        "nabu_version": {
            "default": __version__,
            "help": "Version of the nabu software",
Pierre Paleo's avatar
Pierre Paleo committed
391
            "validator": no_validator,
Pierre Paleo's avatar
Pierre Paleo committed
392
            "type": "required",
Pierre Paleo's avatar
Pierre Paleo committed
393
394
        },
        "verbosity": {
395
            "default": "2",
Pierre Paleo's avatar
Pierre Paleo committed
396
            "help": "Level of verbosity of the processing. 0 = terse, 3 = much information.",
Pierre Paleo's avatar
Pierre Paleo committed
397
            "validator": logging_validator,
Pierre Paleo's avatar
Pierre Paleo committed
398
            "type": "optional",
Pierre Paleo's avatar
Pierre Paleo committed
399
400
401
        },
    },
}
402
403
404

renamed_keys = {
    "marge": {
Pierre Paleo's avatar
Pierre Paleo committed
405
        "section": "phase",
406
407
        "new_name": "margin",
        "since": "2020.2.0",
408
409
        "message": "Option 'marge' has been renamed to 'margin' in [phase]",
    },
410
411
412
413
414
415
    "overwrite_results": {
        "section": "about",
        "new_name": "overwrite_results",
        "new_section": "output",
        "since": "2020.3.0",
        "message": "Option 'overwrite_results' was moved from section [about] to section [output]",
Pierre Paleo's avatar
Pierre Paleo committed
416
417
418
419
420
421
422
423
    },
    "nabu_config_version": {
        "section": "about",
        "new_name": "",
        "new_section": "about",
        "since": "2020.3.1",
        "message": "Option 'nabu_config_version' was removed.",
    },
424
}