vortex-nwp 2.0.0b1__py3-none-any.whl → 2.0.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. vortex/__init__.py +59 -45
  2. vortex/algo/__init__.py +3 -2
  3. vortex/algo/components.py +940 -614
  4. vortex/algo/mpitools.py +802 -497
  5. vortex/algo/serversynctools.py +34 -33
  6. vortex/config.py +19 -22
  7. vortex/data/__init__.py +9 -3
  8. vortex/data/abstractstores.py +593 -655
  9. vortex/data/containers.py +217 -162
  10. vortex/data/contents.py +65 -39
  11. vortex/data/executables.py +93 -102
  12. vortex/data/flow.py +40 -34
  13. vortex/data/geometries.py +228 -132
  14. vortex/data/handlers.py +428 -225
  15. vortex/data/outflow.py +15 -15
  16. vortex/data/providers.py +185 -163
  17. vortex/data/resources.py +48 -42
  18. vortex/data/stores.py +544 -413
  19. vortex/gloves.py +114 -87
  20. vortex/layout/__init__.py +1 -8
  21. vortex/layout/contexts.py +150 -84
  22. vortex/layout/dataflow.py +353 -202
  23. vortex/layout/monitor.py +264 -128
  24. vortex/nwp/__init__.py +5 -2
  25. vortex/nwp/algo/__init__.py +14 -5
  26. vortex/nwp/algo/assim.py +205 -151
  27. vortex/nwp/algo/clim.py +683 -517
  28. vortex/nwp/algo/coupling.py +447 -225
  29. vortex/nwp/algo/eda.py +437 -229
  30. vortex/nwp/algo/eps.py +403 -231
  31. vortex/nwp/algo/forecasts.py +420 -271
  32. vortex/nwp/algo/fpserver.py +683 -307
  33. vortex/nwp/algo/ifsnaming.py +205 -145
  34. vortex/nwp/algo/ifsroot.py +210 -122
  35. vortex/nwp/algo/monitoring.py +132 -76
  36. vortex/nwp/algo/mpitools.py +321 -191
  37. vortex/nwp/algo/odbtools.py +617 -353
  38. vortex/nwp/algo/oopsroot.py +449 -273
  39. vortex/nwp/algo/oopstests.py +90 -56
  40. vortex/nwp/algo/request.py +287 -206
  41. vortex/nwp/algo/stdpost.py +878 -522
  42. vortex/nwp/data/__init__.py +22 -4
  43. vortex/nwp/data/assim.py +125 -137
  44. vortex/nwp/data/boundaries.py +121 -68
  45. vortex/nwp/data/climfiles.py +193 -211
  46. vortex/nwp/data/configfiles.py +73 -69
  47. vortex/nwp/data/consts.py +426 -401
  48. vortex/nwp/data/ctpini.py +59 -43
  49. vortex/nwp/data/diagnostics.py +94 -66
  50. vortex/nwp/data/eda.py +50 -51
  51. vortex/nwp/data/eps.py +195 -146
  52. vortex/nwp/data/executables.py +440 -434
  53. vortex/nwp/data/fields.py +63 -48
  54. vortex/nwp/data/gridfiles.py +183 -111
  55. vortex/nwp/data/logs.py +250 -217
  56. vortex/nwp/data/modelstates.py +180 -151
  57. vortex/nwp/data/monitoring.py +72 -99
  58. vortex/nwp/data/namelists.py +254 -202
  59. vortex/nwp/data/obs.py +400 -308
  60. vortex/nwp/data/oopsexec.py +22 -20
  61. vortex/nwp/data/providers.py +90 -65
  62. vortex/nwp/data/query.py +71 -82
  63. vortex/nwp/data/stores.py +49 -36
  64. vortex/nwp/data/surfex.py +136 -137
  65. vortex/nwp/syntax/__init__.py +1 -1
  66. vortex/nwp/syntax/stdattrs.py +173 -111
  67. vortex/nwp/tools/__init__.py +2 -2
  68. vortex/nwp/tools/addons.py +22 -17
  69. vortex/nwp/tools/agt.py +24 -12
  70. vortex/nwp/tools/bdap.py +16 -5
  71. vortex/nwp/tools/bdcp.py +4 -1
  72. vortex/nwp/tools/bdm.py +3 -0
  73. vortex/nwp/tools/bdmp.py +14 -9
  74. vortex/nwp/tools/conftools.py +728 -378
  75. vortex/nwp/tools/drhook.py +12 -8
  76. vortex/nwp/tools/grib.py +65 -39
  77. vortex/nwp/tools/gribdiff.py +22 -17
  78. vortex/nwp/tools/ifstools.py +82 -42
  79. vortex/nwp/tools/igastuff.py +167 -143
  80. vortex/nwp/tools/mars.py +14 -2
  81. vortex/nwp/tools/odb.py +234 -125
  82. vortex/nwp/tools/partitioning.py +61 -37
  83. vortex/nwp/tools/satrad.py +27 -12
  84. vortex/nwp/util/async.py +83 -55
  85. vortex/nwp/util/beacon.py +10 -10
  86. vortex/nwp/util/diffpygram.py +174 -86
  87. vortex/nwp/util/ens.py +144 -63
  88. vortex/nwp/util/hooks.py +30 -19
  89. vortex/nwp/util/taskdeco.py +28 -24
  90. vortex/nwp/util/usepygram.py +278 -172
  91. vortex/nwp/util/usetnt.py +31 -17
  92. vortex/sessions.py +72 -39
  93. vortex/syntax/__init__.py +1 -1
  94. vortex/syntax/stdattrs.py +410 -171
  95. vortex/syntax/stddeco.py +31 -22
  96. vortex/toolbox.py +327 -192
  97. vortex/tools/__init__.py +11 -2
  98. vortex/tools/actions.py +125 -59
  99. vortex/tools/addons.py +111 -92
  100. vortex/tools/arm.py +42 -22
  101. vortex/tools/compression.py +72 -69
  102. vortex/tools/date.py +11 -4
  103. vortex/tools/delayedactions.py +242 -132
  104. vortex/tools/env.py +75 -47
  105. vortex/tools/folder.py +342 -171
  106. vortex/tools/grib.py +311 -149
  107. vortex/tools/lfi.py +423 -216
  108. vortex/tools/listings.py +109 -40
  109. vortex/tools/names.py +218 -156
  110. vortex/tools/net.py +632 -298
  111. vortex/tools/parallelism.py +93 -61
  112. vortex/tools/prestaging.py +55 -31
  113. vortex/tools/schedulers.py +172 -105
  114. vortex/tools/services.py +402 -333
  115. vortex/tools/storage.py +293 -358
  116. vortex/tools/surfex.py +24 -24
  117. vortex/tools/systems.py +1211 -631
  118. vortex/tools/targets.py +156 -100
  119. vortex/util/__init__.py +1 -1
  120. vortex/util/config.py +377 -327
  121. vortex/util/empty.py +2 -2
  122. vortex/util/helpers.py +56 -24
  123. vortex/util/introspection.py +18 -12
  124. vortex/util/iosponge.py +8 -4
  125. vortex/util/roles.py +4 -6
  126. vortex/util/storefunctions.py +39 -13
  127. vortex/util/structs.py +3 -3
  128. vortex/util/worker.py +29 -17
  129. vortex_nwp-2.0.0b2.dist-info/METADATA +66 -0
  130. vortex_nwp-2.0.0b2.dist-info/RECORD +142 -0
  131. {vortex_nwp-2.0.0b1.dist-info → vortex_nwp-2.0.0b2.dist-info}/WHEEL +1 -1
  132. vortex/layout/appconf.py +0 -109
  133. vortex/layout/jobs.py +0 -1276
  134. vortex/layout/nodes.py +0 -1424
  135. vortex/layout/subjobs.py +0 -464
  136. vortex_nwp-2.0.0b1.dist-info/METADATA +0 -50
  137. vortex_nwp-2.0.0b1.dist-info/RECORD +0 -146
  138. {vortex_nwp-2.0.0b1.dist-info → vortex_nwp-2.0.0b2.dist-info}/LICENSE +0 -0
  139. {vortex_nwp-2.0.0b1.dist-info → vortex_nwp-2.0.0b2.dist-info}/top_level.txt +0 -0
@@ -38,33 +38,32 @@ __all__ = []
38
38
  # Base & Generic classes
39
39
  # ##############################################################################
40
40
 
41
+
41
42
  class IFSNamingConvention(footprints.FootprintBase):
42
43
  """Abstract class for any object representing an IFS/Arpege naming scheme."""
43
44
 
44
45
  _abstract = True
45
- _collector = ('ifsnamingconv', )
46
+ _collector = ("ifsnamingconv",)
46
47
  _footprint = [
47
48
  model,
48
49
  actualfmt,
49
50
  arpifs_cycle,
50
51
  dict(
51
- attr = dict(
52
- kind = dict(
53
- info = 'The type of targeted input/output file'
52
+ attr=dict(
53
+ kind=dict(info="The type of targeted input/output file"),
54
+ conf=dict(
55
+ info="IFS/Arpege configuration number",
56
+ type=int,
54
57
  ),
55
- conf = dict(
56
- info = 'IFS/Arpege configuration number',
57
- type = int,
58
+ xpname=dict(
59
+ info="IFS/Arpege experiment name",
58
60
  ),
59
- xpname = dict(
60
- info = 'IFS/Arpege experiment name',
61
+ actualfmt=dict(
62
+ info="The target file format",
63
+ optional=True,
61
64
  ),
62
- actualfmt = dict(
63
- info = 'The target file format',
64
- optional = True,
65
- )
66
65
  )
67
- )
66
+ ),
68
67
  ]
69
68
 
70
69
  def _naming_format_string(self, **kwargs):
@@ -72,16 +71,18 @@ class IFSNamingConvention(footprints.FootprintBase):
72
71
  raise NotImplementedError()
73
72
 
74
73
  def __call__(self, **kwargs):
75
- return self._naming_format_string(** kwargs).format(xpname=self.xpname,
76
- conf=self.conf,
77
- fmt=self.actualfmt,
78
- model=self.model,
79
- ** kwargs)
74
+ return self._naming_format_string(**kwargs).format(
75
+ xpname=self.xpname,
76
+ conf=self.conf,
77
+ fmt=self.actualfmt,
78
+ model=self.model,
79
+ **kwargs,
80
+ )
80
81
 
81
82
 
82
83
  # Activate the footprint's fasttrack on the ifsnamingconv collector
83
- ncollect = footprints.collectors.get(tag='ifsnamingconv')
84
- ncollect.fasttrack = ('kind', )
84
+ ncollect = footprints.collectors.get(tag="ifsnamingconv")
85
+ ncollect.fasttrack = ("kind",)
85
86
  del ncollect
86
87
 
87
88
 
@@ -92,12 +93,10 @@ class IFSHardWiredNamingConvention(IFSNamingConvention):
92
93
  """
93
94
 
94
95
  _footprint = dict(
95
- attr = dict(
96
- namingformat = dict()
96
+ attr=dict(namingformat=dict()),
97
+ priority=dict(
98
+ level=footprints.priorities.top.TOOLBOX # @UndefinedVariable
97
99
  ),
98
- priority = dict(
99
- level = footprints.priorities.top.TOOLBOX # @UndefinedVariable
100
- )
101
100
  )
102
101
 
103
102
  def _naming_format_string(self, **kwargs):
@@ -107,203 +106,245 @@ class IFSHardWiredNamingConvention(IFSNamingConvention):
107
106
  # Climatology files names
108
107
  # ##############################################################################
109
108
 
109
+
110
110
  class ModelClimName(IFSNamingConvention):
111
111
  """An IFS/Arpege model clim."""
112
112
 
113
113
  _footprint = dict(
114
- attr = dict(
115
- kind = dict(
116
- values = ['modelclim', ],
114
+ attr=dict(
115
+ kind=dict(
116
+ values=[
117
+ "modelclim",
118
+ ],
117
119
  ),
118
- conf = dict(
119
- outcast = [701, ],
120
+ conf=dict(
121
+ outcast=[
122
+ 701,
123
+ ],
124
+ ),
125
+ model=dict(
126
+ outcast=[
127
+ "surfex",
128
+ ]
120
129
  ),
121
- model = dict(
122
- outcast = ['surfex', ]
123
- )
124
130
  )
125
131
  )
126
132
 
127
133
  def _naming_format_string(self, **kwargs):
128
- return 'Const.Clim'
134
+ return "Const.Clim"
129
135
 
130
136
 
131
137
  class SurfexClimName(IFSNamingConvention):
132
138
  """A Surfex model clim."""
133
139
 
134
140
  _footprint = dict(
135
- attr = dict(
136
- kind = dict(
137
- values = ['modelclim', ],
141
+ attr=dict(
142
+ kind=dict(
143
+ values=[
144
+ "modelclim",
145
+ ],
146
+ ),
147
+ model=dict(
148
+ values=[
149
+ "surfex",
150
+ ]
138
151
  ),
139
- model = dict(
140
- values = ['surfex', ]
141
- )
142
152
  )
143
153
  )
144
154
 
145
155
  def _naming_format_string(self, **kwargs):
146
- return 'Const.Clim.sfx'
156
+ return "Const.Clim.sfx"
147
157
 
148
158
 
149
159
  class TargetClimName(IFSNamingConvention):
150
160
  """A BDAP clim file or a target domain IFS/Arpege clim file."""
151
161
 
152
162
  _footprint = dict(
153
- attr = dict(
154
- kind = dict(
155
- values = ['targetclim', ],
163
+ attr=dict(
164
+ kind=dict(
165
+ values=[
166
+ "targetclim",
167
+ ],
168
+ ),
169
+ model=dict(
170
+ outcast=[
171
+ "surfex",
172
+ ]
156
173
  ),
157
- model = dict(
158
- outcast = ['surfex', ]
159
- )
160
174
  )
161
175
  )
162
176
 
163
177
  def _naming_format_string(self, **kwargs):
164
- return 'const.clim.{area:s}'
178
+ return "const.clim.{area:s}"
165
179
 
166
180
 
167
181
  class SurfexTargetClimName(IFSNamingConvention):
168
182
  """A target domain Surfex clim file."""
169
183
 
170
184
  _footprint = dict(
171
- attr = dict(
172
- kind = dict(
173
- values = ['targetclim', ],
185
+ attr=dict(
186
+ kind=dict(
187
+ values=[
188
+ "targetclim",
189
+ ],
190
+ ),
191
+ model=dict(
192
+ values=[
193
+ "surfex",
194
+ ]
174
195
  ),
175
- model = dict(
176
- values = ['surfex', ]
177
- )
178
196
  )
179
197
  )
180
198
 
181
199
  def _naming_format_string(self, **kwargs):
182
- return 'const.clim.sfx.{area:s}'
200
+ return "const.clim.sfx.{area:s}"
183
201
 
184
202
 
185
203
  class CanariModelClimName(IFSNamingConvention):
186
204
  """An IFS/Arpege model clim (specific naming for Canari)."""
187
205
 
188
206
  _footprint = dict(
189
- attr = dict(
190
- kind = dict(
191
- values = ['modelclim', ],
207
+ attr=dict(
208
+ kind=dict(
209
+ values=[
210
+ "modelclim",
211
+ ],
192
212
  ),
193
- conf = dict(
194
- values = [701, ],
213
+ conf=dict(
214
+ values=[
215
+ 701,
216
+ ],
217
+ ),
218
+ model=dict(
219
+ outcast=[
220
+ "surfex",
221
+ ]
195
222
  ),
196
- model = dict(
197
- outcast = ['surfex', ]
198
- )
199
223
  )
200
224
  )
201
225
 
202
226
  def _naming_format_string(self, **kwargs):
203
- return 'ICMSH{xpname:s}CLIM'
227
+ return "ICMSH{xpname:s}CLIM"
204
228
 
205
229
 
206
230
  class CanariClosestModelClimName(CanariModelClimName):
207
231
  """An IFS/Arpege model clim for the closest month (specific naming for Canari)."""
208
232
 
209
233
  _footprint = dict(
210
- attr = dict(
211
- kind = dict(
212
- values = ['closest_modelclim', ],
234
+ attr=dict(
235
+ kind=dict(
236
+ values=[
237
+ "closest_modelclim",
238
+ ],
213
239
  ),
214
240
  )
215
241
  )
216
242
 
217
243
  def _naming_format_string(self, **kwargs):
218
- return 'ICMSH{xpname:s}CLI2'
244
+ return "ICMSH{xpname:s}CLI2"
219
245
 
220
246
 
221
247
  # Initial conditions file names
222
248
  # ##############################################################################
223
249
 
224
- class InitialContionsName(IFSNamingConvention):
225
250
 
251
+ class InitialContionsName(IFSNamingConvention):
226
252
  _footprint = dict(
227
- attr = dict(
228
- kind = dict(
229
- values = ['ic', ],
253
+ attr=dict(
254
+ kind=dict(
255
+ values=[
256
+ "ic",
257
+ ],
258
+ ),
259
+ model=dict(
260
+ outcast=[
261
+ "surfex",
262
+ ]
230
263
  ),
231
- model = dict(
232
- outcast = ['surfex', ]
233
- )
234
264
  )
235
265
  )
236
266
 
237
267
  def _naming_format_string(self, **kwargs):
238
- return 'ICMSH{xpname:s}INIT'
268
+ return "ICMSH{xpname:s}INIT"
239
269
 
240
270
 
241
271
  class SurfexInitialContionsName(IFSNamingConvention):
242
-
243
272
  _footprint = dict(
244
- attr = dict(
245
- kind = dict(
246
- values = ['ic', ],
273
+ attr=dict(
274
+ kind=dict(
275
+ values=[
276
+ "ic",
277
+ ],
278
+ ),
279
+ model=dict(
280
+ values=[
281
+ "surfex",
282
+ ]
247
283
  ),
248
- model = dict(
249
- values = ['surfex', ]
250
- )
251
284
  )
252
285
  )
253
286
 
254
287
  def _naming_format_string(self, **kwargs):
255
- return 'ICMSH{xpname:s}INIT.sfx'
288
+ return "ICMSH{xpname:s}INIT.sfx"
256
289
 
257
290
 
258
291
  class IauAnalysisName(IFSNamingConvention):
259
-
260
292
  _footprint = dict(
261
- attr = dict(
262
- kind = dict(
263
- values = ['iau_analysis', ],
293
+ attr=dict(
294
+ kind=dict(
295
+ values=[
296
+ "iau_analysis",
297
+ ],
298
+ ),
299
+ model=dict(
300
+ outcast=[
301
+ "surfex",
302
+ ]
264
303
  ),
265
- model = dict(
266
- outcast = ['surfex', ]
267
- )
268
304
  )
269
305
  )
270
306
 
271
307
  def _naming_format_string(self, **kwargs):
272
- return 'ICIAU{xpname:s}IN{number:02d}'
308
+ return "ICIAU{xpname:s}IN{number:02d}"
273
309
 
274
310
 
275
311
  class IauBackgroundName(IFSNamingConvention):
276
-
277
312
  _footprint = dict(
278
- attr = dict(
279
- kind = dict(
280
- values = ['iau_background', ],
313
+ attr=dict(
314
+ kind=dict(
315
+ values=[
316
+ "iau_background",
317
+ ],
318
+ ),
319
+ model=dict(
320
+ outcast=[
321
+ "surfex",
322
+ ]
281
323
  ),
282
- model = dict(
283
- outcast = ['surfex', ]
284
- )
285
324
  )
286
325
  )
287
326
 
288
327
  def _naming_format_string(self, **kwargs):
289
- return 'ICIAU{xpname:s}BK{number:02d}'
328
+ return "ICIAU{xpname:s}BK{number:02d}"
290
329
 
291
330
 
292
331
  # Lateral Boundary Conditions Files
293
332
  # ##############################################################################
294
333
 
295
- class LAMBoundaryConditionsName(IFSNamingConvention):
296
334
 
335
+ class LAMBoundaryConditionsName(IFSNamingConvention):
297
336
  _footprint = dict(
298
- attr = dict(
299
- kind = dict(
300
- values = ['lbc', ],
337
+ attr=dict(
338
+ kind=dict(
339
+ values=[
340
+ "lbc",
341
+ ],
301
342
  ),
302
343
  )
303
344
  )
304
345
 
305
346
  def _naming_format_string(self, **kwargs):
306
- return 'ELSCF{xpname:s}ALBC{number:03d}'
347
+ return "ELSCF{xpname:s}ALBC{number:03d}"
307
348
 
308
349
 
309
350
  # Strange files used in the EDA
@@ -311,20 +352,26 @@ class LAMBoundaryConditionsName(IFSNamingConvention):
311
352
 
312
353
 
313
354
  class IfsEdaInputName(IFSNamingConvention):
314
-
315
355
  _abstract = True
316
356
  _footprint = dict(
317
- attr = dict(
318
- kind = dict(
319
- values = ['edainput', ],
357
+ attr=dict(
358
+ kind=dict(
359
+ values=[
360
+ "edainput",
361
+ ],
320
362
  ),
321
- variant = dict(
322
- values = ['infl', 'infl_factor', 'mean', 'covb', ],
363
+ variant=dict(
364
+ values=[
365
+ "infl",
366
+ "infl_factor",
367
+ "mean",
368
+ "covb",
369
+ ],
323
370
  ),
324
- totalnumber = dict(
325
- info = 'The total number of input files',
326
- type = int,
327
- optional = True,
371
+ totalnumber=dict(
372
+ info="The total number of input files",
373
+ type=int,
374
+ optional=True,
328
375
  ),
329
376
  )
330
377
  )
@@ -335,69 +382,82 @@ class IfsEdaInputName(IFSNamingConvention):
335
382
  ndigits = max(int(math.floor(math.log10(self.totalnumber))) + 1, 3)
336
383
  else:
337
384
  ndigits = 3
338
- return '{number:0' + str(ndigits) + 'd}'
385
+ return "{number:0" + str(ndigits) + "d}"
339
386
 
340
387
 
341
388
  class IfsEdaArpegeFaInputName(IfsEdaInputName):
342
-
343
389
  _footprint = dict(
344
- attr = dict(
345
- model = dict(
346
- values = ['arpege', ]
390
+ attr=dict(
391
+ model=dict(
392
+ values=[
393
+ "arpege",
394
+ ]
395
+ ),
396
+ actualfmt=dict(
397
+ values=[
398
+ "fa",
399
+ ]
347
400
  ),
348
- actualfmt = dict(
349
- values = ['fa', ]
350
- )
351
401
  )
352
402
  )
353
403
 
354
404
  def _naming_format_string(self, **kwargs):
355
- return 'FAMEMBER_' + self._number_fmt
405
+ return "FAMEMBER_" + self._number_fmt
356
406
 
357
407
 
358
408
  class IfsEdaArpegeGribInputName(IfsEdaInputName):
359
-
360
409
  _footprint = dict(
361
- attr = dict(
362
- model = dict(
363
- values = ['arpege', ]
410
+ attr=dict(
411
+ model=dict(
412
+ values=[
413
+ "arpege",
414
+ ]
415
+ ),
416
+ actualfmt=dict(
417
+ values=[
418
+ "grib",
419
+ ]
364
420
  ),
365
- actualfmt = dict(
366
- values = ['grib', ]
367
- )
368
421
  )
369
422
  )
370
423
 
371
424
  def _naming_format_string(self, **kwargs):
372
- return 'GRIBERm' + self._number_fmt
425
+ return "GRIBERm" + self._number_fmt
373
426
 
374
427
 
375
428
  class IfsEdaAromeInputName(IfsEdaInputName):
376
-
377
429
  _footprint = dict(
378
- attr = dict(
379
- model = dict(
380
- values = ['arome', ]
430
+ attr=dict(
431
+ model=dict(
432
+ values=[
433
+ "arome",
434
+ ]
381
435
  ),
382
436
  )
383
437
  )
384
438
 
385
439
  def _naming_format_string(self, **kwargs):
386
- return 'ELSCF{xpname:s}ALBC' + self._number_fmt
440
+ return "ELSCF{xpname:s}ALBC" + self._number_fmt
387
441
 
388
442
 
389
443
  class IfsEdaOutputName(IFSNamingConvention):
390
-
391
444
  _footprint = dict(
392
- attr = dict(
393
- kind = dict(
394
- values = ['edaoutput', ],
445
+ attr=dict(
446
+ kind=dict(
447
+ values=[
448
+ "edaoutput",
449
+ ],
395
450
  ),
396
- variant = dict(
397
- values = ['infl', 'infl_factor', 'mean', 'covb', ],
451
+ variant=dict(
452
+ values=[
453
+ "infl",
454
+ "infl_factor",
455
+ "mean",
456
+ "covb",
457
+ ],
398
458
  ),
399
459
  )
400
460
  )
401
461
 
402
462
  def _naming_format_string(self, **kwargs):
403
- return 'ICMSH{xpname:s}+{term.fmth}_m{number:03d}'
463
+ return "ICMSH{xpname:s}+{term.fmth}_m{number:03d}"