cetk 0.0.6.dev0__tar.gz → 0.0.7.dev0__tar.gz

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 (137) hide show
  1. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/PKG-INFO +2 -2
  2. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/pyproject.toml +1 -1
  3. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/__init__.py +1 -1
  4. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/const.py +1 -1
  5. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/fleets.py +0 -1
  6. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/rasterize/rasterizer.py +17 -13
  7. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/filters.py +0 -2
  8. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/queries.py +23 -8
  9. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/roadsource_emissions.sql +4 -2
  10. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/views.py +1 -1
  11. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/cetk_command.py +2 -7
  12. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/PKG-INFO +2 -2
  13. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/requires.txt +1 -1
  14. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_common_models.py +0 -1
  15. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_aggregate_emissions.py +1 -1
  16. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_calculate.py +6 -2
  17. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/.pre-commit-config.yaml +0 -0
  18. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/CONTRIBUTING.md +0 -0
  19. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/LICENSE +0 -0
  20. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/MANIFEST.in +0 -0
  21. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/README.md +0 -0
  22. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/constraints-lowest.txt +0 -0
  23. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/flatpak_install.sh +0 -0
  24. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/manage.py +0 -0
  25. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/noxfile.py +0 -0
  26. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/requirements-dev.in +0 -0
  27. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/requirements-dev.txt +0 -0
  28. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/setup.cfg +0 -0
  29. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/db.py +0 -0
  30. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/__init__.py +0 -0
  31. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/apps.py +0 -0
  32. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/cache.py +0 -0
  33. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/copy.py +0 -0
  34. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/exporters.py +0 -0
  35. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/fixtures/edb-ref.json +0 -0
  36. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/__init__.py +0 -0
  37. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/activity_import.py +0 -0
  38. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/codeset_import.py +0 -0
  39. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/gridsource_import.py +0 -0
  40. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/roadsource_import.py +0 -0
  41. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/source_import.py +0 -0
  42. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/timevar_import.py +0 -0
  43. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/utils.py +0 -0
  44. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/validation.py +0 -0
  45. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/ltreefield.py +0 -0
  46. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/0001_initial.py +0 -0
  47. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/0002_data.py +0 -0
  48. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/0003_create_gpkg_tables.py +0 -0
  49. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/__init__.py +0 -0
  50. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/__init__.py +0 -0
  51. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/base.py +0 -0
  52. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/common_models.py +0 -0
  53. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/gridsource_models.py +0 -0
  54. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/road_classes.py +0 -0
  55. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/road_models.py +0 -0
  56. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/source_models.py +0 -0
  57. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/timevar_models.py +0 -0
  58. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/rasterize/__init__.py +0 -0
  59. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/signals.py +0 -0
  60. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/traffic.py +0 -0
  61. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/units.py +0 -0
  62. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/utils.py +0 -0
  63. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/__init__.py +0 -0
  64. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/aggregate_emissions.sql +0 -0
  65. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/areasource_emissions.sql +0 -0
  66. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/calc.py +0 -0
  67. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/gridsource_emissions.sql +0 -0
  68. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/pointsource_emissions.sql +0 -0
  69. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/used_substances.sql +0 -0
  70. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/logging.py +0 -0
  71. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/settings.py +0 -0
  72. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/__init__.py +0 -0
  73. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/manage.py +0 -0
  74. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/utils.py +0 -0
  75. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/utils.py +0 -0
  76. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/SOURCES.txt +0 -0
  77. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/dependency_links.txt +0 -0
  78. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/entry_points.txt +0 -0
  79. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/top_level.txt +0 -0
  80. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/conftest.py +0 -0
  81. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/TrafficImportFormat.xlsx +0 -0
  82. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/__init__.py +0 -0
  83. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/all_sources.xlsx +0 -0
  84. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/areasourceactivities.xlsx +0 -0
  85. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/areasources.xlsx +0 -0
  86. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/congestion_profiles.json +0 -0
  87. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/fleets.json +0 -0
  88. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/fleets.xlsx +0 -0
  89. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_NOx_1990010100_1991010100.tif +0 -0
  90. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_PM25_1990010100_1991010100.tif +0 -0
  91. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_PM25_2000010100_2001010100.tif +0 -0
  92. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_PM25_2011010100_2012010100.tif +0 -0
  93. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsources.xlsx +0 -0
  94. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsources_tmp.xlsx +0 -0
  95. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/pointsourceactivities.xlsx +0 -0
  96. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/pointsources.csv +0 -0
  97. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/pointsources.xlsx +0 -0
  98. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclass_settings.xlsx +0 -0
  99. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses.csv +0 -0
  100. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses.json +0 -0
  101. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses_1attr.csv +0 -0
  102. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses_1attr.json +0 -0
  103. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roaddata.gpkg +0 -0
  104. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roads.json +0 -0
  105. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roads.xlsx +0 -0
  106. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/sinuous_road.geojson +0 -0
  107. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/timevars.json +0 -0
  108. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicle_settings.xlsx +0 -0
  109. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicles.csv +0 -0
  110. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicles.json +0 -0
  111. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicles.xlsx +0 -0
  112. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_fleets.py +0 -0
  113. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_gridsource_models.py +0 -0
  114. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_importers.py +0 -0
  115. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_ltreefield.py +0 -0
  116. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_rasterize.py +0 -0
  117. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_road_classes.py +0 -0
  118. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_road_importers.py +0 -0
  119. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_road_models.py +0 -0
  120. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/__init__.py +0 -0
  121. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_areasource_emissions.py +0 -0
  122. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_custom_sqlite_functions.py +0 -0
  123. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_gridsource_emissions.py +0 -0
  124. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_pointsource_emissions.py +0 -0
  125. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_roadsource_emissions.py +0 -0
  126. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_utils.py +0 -0
  127. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/test_db.py +0 -0
  128. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/conftest.py +0 -0
  129. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/data/__init__.py +0 -0
  130. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/data/inventory.xlsx +0 -0
  131. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/data/validation.xlsx +0 -0
  132. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_create.py +0 -0
  133. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_delete.py +0 -0
  134. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_exports.py +0 -0
  135. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_imports.py +0 -0
  136. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_info.py +0 -0
  137. {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/windows_find_gdal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cetk
3
- Version: 0.0.6.dev0
3
+ Version: 0.0.7.dev0
4
4
  Summary: CLAIRs Emission ToolKit cetk
5
5
  Author: Christian Asker, Mattias Jakobsson, David Segersson, Eef van Dongen
6
6
  Maintainer-email: FO Luft <foluftadmin@smhi.se>
@@ -18,7 +18,7 @@ Requires-Dist: numpy>=1.20.3
18
18
  Requires-Dist: openpyxl>=3.0.7
19
19
  Requires-Dist: pandas>=2.0
20
20
  Requires-Dist: pyogrio>=0.4.2
21
- Requires-Dist: rastafari>=0.4
21
+ Requires-Dist: rastafari2>=0.4
22
22
  Requires-Dist: rasterio>=1.3
23
23
  Requires-Dist: shapely>=2.0
24
24
  Dynamic: license-file
@@ -31,7 +31,7 @@ dependencies = [ # Release date Comment
31
31
  "openpyxl >=3.0.7", # 2021-03-09 required by pandas 2.0.0
32
32
  "pandas >=2.0", # 2023-04-03 cetk import test fails with earlier versions
33
33
  "pyogrio >=0.4.2", # 2022-10-06 cetk export test fails with earlier versions
34
- "rastafari >=0.4",
34
+ "rastafari2 >=0.4",
35
35
  "rasterio >=1.3", # 2022-07-06 rasterio.CRS is missing in earlier versions
36
36
  "shapely >=2.0", # 2022-12-12 cetk calc --rasterize fails with earlier versions
37
37
  ]
@@ -1,6 +1,6 @@
1
1
  """cetk, a python library for editing Clair emission inventories offline."""
2
2
 
3
- __version__ = "0.0.6.dev"
3
+ __version__ = "0.0.7.dev"
4
4
 
5
5
  import os
6
6
 
@@ -3,7 +3,7 @@ DEFAULT_SRID = 3857
3
3
  CHAR_FIELD_LENGTH = 100
4
4
  CODE_FIELD_LENGTH = 50
5
5
  NODATA = -9999.0
6
- DEFAULT_EMISSION_UNIT = "kg/year"
6
+ DEFAULT_EMISSION_UNIT = "kg/s"
7
7
 
8
8
  # sheet names which are valid for data import
9
9
  SHEET_NAMES = [
@@ -25,7 +25,6 @@ class FleetManager(models.Manager):
25
25
  for f in data:
26
26
  for m in f["members"]:
27
27
  for fu in m["fuels"]:
28
- # breakpoint()
29
28
  if (m["vehicle"], fu["fuel"]) not in validcombinations:
30
29
  raise ValueError(
31
30
  f"{m['vehicle']}/{fu['fuel']} is not a valid vehicle/fuel"
@@ -318,15 +318,7 @@ class EmissionRasterizer:
318
318
  """Get querysets for emissions."""
319
319
 
320
320
  sourcetypes = sourcetypes or SOURCETYPES
321
- # not used; srid = Settings.get_current().srid
322
-
323
- # if ac1 is not None or ac2 is not None or ac3 is not None:
324
- # breakpoint()
325
- # # raise ValueError(
326
- # # "filtering for ac not implemented in source_emissions_query yet!"
327
- # # )
328
- # if activity codes are given as strings, get the corresponding
329
- # activity code instances
321
+
330
322
  if ac1 is not None and len(ac1) > 0 and isinstance(ac1[0], str):
331
323
  # TODO why code__in= not code= ?
332
324
  codeset1 = Settings.get_current().codeset1
@@ -708,10 +700,12 @@ class EmissionRasterizer:
708
700
  name=var_name,
709
701
  unit=self.unit,
710
702
  instance=self.instance,
703
+ substance=substance.slug,
711
704
  cell_methods=cell_methods,
712
705
  parameter=param.name,
713
706
  time=time,
714
707
  chunksizes=chunking,
708
+ quantity="emission",
715
709
  )
716
710
  subst_vars["field2d"] = {"emission": var_name}
717
711
  else:
@@ -890,6 +884,7 @@ class EmissionRasterizer:
890
884
  # rasterizing chunks and writing to dataset
891
885
  chunk_begin = begin
892
886
  chunk_end = begin
887
+ chunk_time_ind = 0
893
888
  while chunk_end < end:
894
889
  if min_time_chunksize == 1e9:
895
890
  # means no result_files exist
@@ -934,13 +929,19 @@ class EmissionRasterizer:
934
929
  substance,
935
930
  emis_chunk,
936
931
  timestamps=[chunk_begin, chunk_end],
932
+ chunk_time_ind=chunk_time_ind,
937
933
  )
938
934
  # update time-span of variable and dataset
939
935
 
940
936
  # update chunk time interval
937
+ chunk_time_ind = (
938
+ chunk_time_ind
939
+ + int((chunk_end - chunk_begin).total_seconds() / 3600)
940
+ + 1
941
+ )
941
942
  chunk_begin = chunk_end + datetime.timedelta(hours=1)
942
943
 
943
- def set_data(self, dset, substance, data, timestamps=None):
944
+ def set_data(self, dset, substance, data, timestamps=None, chunk_time_ind=0):
944
945
  """Add chunk of data to variable."""
945
946
 
946
947
  var = dset[f"emission_{substance.slug}"]
@@ -951,12 +952,12 @@ class EmissionRasterizer:
951
952
  else:
952
953
  time_var = dset["time"]
953
954
  # map_oriented, np.fliplr flips 3d data along second dimension
954
- var[:, :, :] = np.fliplr(data)
955
+ var[chunk_time_ind:, :, :] = np.fliplr(data)
955
956
  times = pd.date_range(timestamps[0], timestamps[1], freq=self.time_step)
956
957
  hours_since_1970 = (
957
958
  times - pd.to_datetime("1970-01-01").tz_localize(self.timezone)
958
959
  ).total_seconds() / 3600
959
- time_var[:] = hours_since_1970
960
+ time_var[chunk_time_ind:] = hours_since_1970
960
961
 
961
962
  def _timeseries_emis(self, substance, begin, end, sourcetype):
962
963
  """Get emission timeseries data chunk for sources.
@@ -1398,7 +1399,7 @@ class EmissionRasterizer:
1398
1399
  self.log.info(
1399
1400
  f"No exact match for EPSG and spatial ref, using best guess: {epsg}"
1400
1401
  )
1401
- grid_mapping.srid = epsg
1402
+ grid_mapping.srid = epsg
1402
1403
  grid_mapping.crs_wkt = crs.to_wkt() # for CF Conventions 1.7
1403
1404
  return grid_mapping
1404
1405
 
@@ -1409,6 +1410,7 @@ def create_variable(
1409
1410
  name: str,
1410
1411
  unit: Optional[str] = None,
1411
1412
  quantity: Optional[str] = None,
1413
+ substance: Optional[str] = None,
1412
1414
  instance: Optional[str] = None,
1413
1415
  cell_methods: Optional[str] = None,
1414
1416
  parameter: Optional[str] = None,
@@ -1437,6 +1439,8 @@ def create_variable(
1437
1439
  var.parameter = parameter
1438
1440
  if quantity is not None:
1439
1441
  var.quantity = quantity
1442
+ if substance is not None:
1443
+ var.substance = substance
1440
1444
  if instance is not None:
1441
1445
  var.instance = instance
1442
1446
  if cell_methods is not None:
@@ -89,8 +89,6 @@ def create_activitycode_where_clauses(ac1, ac2, ac3):
89
89
  """
90
90
 
91
91
  sql_list = [] # return list of sql strings
92
- # TODO
93
- # breakpoint()
94
92
 
95
93
  # ac1, ac2, ac3 can be either a single code or an iterable
96
94
  if ac1 is not None:
@@ -50,6 +50,7 @@ def create_source_emis_query(
50
50
  """
51
51
 
52
52
  sql = load_sql(f"{sourcetype}source_emissions.sql")
53
+ ac_filter = ""
53
54
  source_filters = []
54
55
  if tags is not None:
55
56
  source_filters.append(create_tag_where_clause(tags))
@@ -60,7 +61,11 @@ def create_source_emis_query(
60
61
  if polygon is not None and sourcetype != "grid":
61
62
  source_filters.append(create_polygon_where_clause(polygon))
62
63
  if ac1 is not None or ac2 is not None or ac3 is not None:
63
- source_filters += create_activitycode_where_clauses(ac1, ac2, ac3)
64
+ if sourcetype != "road":
65
+ source_filters += create_activitycode_where_clauses(ac1, ac2, ac3)
66
+ else:
67
+ ac_filter = create_activitycode_where_clauses(ac1, ac2, ac3)
68
+ ac_filter = "AND " + ac_filter[0]
64
69
 
65
70
  if len(source_filters) > 0:
66
71
  source_filter_sql = "WHERE " + " AND ".join(source_filters)
@@ -81,13 +86,23 @@ def create_source_emis_query(
81
86
  emis_subst_filter = ""
82
87
 
83
88
  # replace place-holders by generated sql
84
- sql = sql.format(
85
- srid=srid,
86
- source_filters=source_filter_sql,
87
- ef_substance_filter=ef_subst_filter,
88
- emis_substance_filter=emis_subst_filter,
89
- traffic_work_subst_id=traffic_work.id,
90
- )
89
+ if sourcetype != "road":
90
+ sql = sql.format(
91
+ srid=srid,
92
+ source_filters=source_filter_sql,
93
+ ef_substance_filter=ef_subst_filter,
94
+ emis_substance_filter=emis_subst_filter,
95
+ traffic_work_subst_id=traffic_work.id,
96
+ )
97
+ else:
98
+ sql = sql.format(
99
+ srid=srid,
100
+ source_filters=source_filter_sql,
101
+ ef_substance_filter=ef_subst_filter,
102
+ emis_substance_filter=emis_subst_filter,
103
+ traffic_work_subst_id=traffic_work.id,
104
+ ac_filter=ac_filter,
105
+ )
91
106
  return sql
92
107
 
93
108
 
@@ -65,7 +65,7 @@ fleet_veh as (
65
65
  LEFT JOIN edb_activitycode as ac1 ON vfc.activitycode1_id=ac1.id
66
66
  LEFT JOIN edb_activitycode as ac2 ON vfc.activitycode2_id=ac2.id
67
67
  LEFT JOIN edb_activitycode as ac3 ON vfc.activitycode3_id=ac3.id
68
- WHERE veh_ef.substance_id != {traffic_work_subst_id}
68
+ WHERE veh_ef.substance_id != {traffic_work_subst_id} {ac_filter}
69
69
  GROUP BY fm.fleet_id, fm.id, veh_ef.traffic_situation_id,
70
70
  fm.vehicle_id, veh_ef.substance_id
71
71
  UNION
@@ -89,6 +89,7 @@ fleet_veh as (
89
89
  LEFT JOIN edb_activitycode as ac1 ON vfc.activitycode1_id=ac1.id
90
90
  LEFT JOIN edb_activitycode as ac2 ON vfc.activitycode2_id=ac2.id
91
91
  LEFT JOIN edb_activitycode as ac3 ON vfc.activitycode3_id=ac3.id
92
+ WHERE 1=1 {ac_filter}
92
93
  ) as ef
93
94
  JOIN edb_fleetmember fm ON ef.fleetmember_id = fm.id
94
95
  JOIN edb_vehicle veh ON ef.vehicle_id=veh.id
@@ -101,7 +102,8 @@ fleet_veh as (
101
102
  ef.stopngo_ef != 0 OR
102
103
  ef.heavy_ef != 0 OR
103
104
  ef.saturated_ef != 0
104
- ) {ef_substance_filter}
105
+ )
106
+ {ef_substance_filter}
105
107
  ),
106
108
  /*
107
109
  Calculate weight of each LOS (Level Of Service) for all valid combinations
@@ -79,7 +79,7 @@ def create_emission_table(sourcetype, substances=None, unit=DEFAULT_EMISSION_UNI
79
79
  """
80
80
  cur = connection.cursor()
81
81
  cur.execute(f"DROP TABLE IF EXISTS {sourcetype}source_emissions")
82
- # breakpoint()
82
+
83
83
  cur.execute(table_sql)
84
84
  cur.execute(
85
85
  f"""
@@ -293,6 +293,7 @@ class Editor(object):
293
293
  srid=srid,
294
294
  basename=basename,
295
295
  )
296
+ kwargs = {f"ac{codeset_index}": code}
296
297
  rasterizer = EmissionRasterizer(output, nx=nx, ny=ny)
297
298
  rasterizer.process(
298
299
  substances,
@@ -304,14 +305,8 @@ class Editor(object):
304
305
  area_ids=area_ids,
305
306
  grid_ids=grid_ids,
306
307
  road_ids=road_ids,
307
- ac1=code,
308
+ **kwargs,
308
309
  )
309
- # except Exception as err:
310
- # print(f"could not rasterize emissions: {str(err)}")
311
- # breakpoint()
312
- # continue
313
- # log.error(f"could not rasterize emissions: {str(err)}")
314
- # sys.exit(1)
315
310
  else:
316
311
  try:
317
312
  output = Output(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cetk
3
- Version: 0.0.6.dev0
3
+ Version: 0.0.7.dev0
4
4
  Summary: CLAIRs Emission ToolKit cetk
5
5
  Author: Christian Asker, Mattias Jakobsson, David Segersson, Eef van Dongen
6
6
  Maintainer-email: FO Luft <foluftadmin@smhi.se>
@@ -18,7 +18,7 @@ Requires-Dist: numpy>=1.20.3
18
18
  Requires-Dist: openpyxl>=3.0.7
19
19
  Requires-Dist: pandas>=2.0
20
20
  Requires-Dist: pyogrio>=0.4.2
21
- Requires-Dist: rastafari>=0.4
21
+ Requires-Dist: rastafari2>=0.4
22
22
  Requires-Dist: rasterio>=1.3
23
23
  Requires-Dist: shapely>=2.0
24
24
  Dynamic: license-file
@@ -6,6 +6,6 @@ numpy>=1.20.3
6
6
  openpyxl>=3.0.7
7
7
  pandas>=2.0
8
8
  pyogrio>=0.4.2
9
- rastafari>=0.4
9
+ rastafari2>=0.4
10
10
  rasterio>=1.3
11
11
  shapely>=2.0
@@ -34,7 +34,6 @@ class TestActivityCodes:
34
34
  ac1 = code_set.codes.get(code="1")
35
35
  ac13 = code_set.codes.get(code="1.3")
36
36
  ac131 = code_set.codes.get(code="1.3.1")
37
- # breakpoint()
38
37
  assert ac13 in list(ac1.get_children())
39
38
  assert ac131 not in list(ac1.get_children())
40
39
  assert ac131 in list(ac13.get_children())
@@ -155,5 +155,5 @@ def test_aggregate_emissions_all_sourcetypes(
155
155
  assert df.index[0] == ("3", "Diffuse sources")
156
156
  assert df.columns[0] == ("emission", "SOx")
157
157
  # reference emission: "seconds of year" * "grid fraction in polygon"
158
- ref_emis = 1.0 * 365.25 * 24 * 3600 * raster_share
158
+ ref_emis = 1.0 * raster_share
159
159
  assert ref_emis == pytest.approx(df.iloc[0, 0], 1e-5)
@@ -45,8 +45,12 @@ def test_aggregate(inventory, tmpdir):
45
45
  assert np.all(df.columns.levels[0] == ["emission"])
46
46
  assert np.all(df.columns.levels[1] == ["CO", "NMVOC", "NOx", "PM10", "PM25", "SOx"])
47
47
  assert df.index.names == ["activity"]
48
- assert df.loc["total", ("emission", "NOx")].item() == pytest.approx(45108)
49
- assert df.loc["total", ("emission", "PM25")].item() == pytest.approx(5.411264e6)
48
+ assert df.loc["total", ("emission", "NOx")].item() == pytest.approx(
49
+ 45108 / (365.25 * 24 * 3600)
50
+ )
51
+ assert df.loc["total", ("emission", "PM25")].item() == pytest.approx(
52
+ 5.411264e6 / (365.25 * 24 * 3600)
53
+ )
50
54
 
51
55
 
52
56
  @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes