3737# Stevan Gavrilovic
3838#
3939
40+ import os
4041import argparse # noqa: I001
4142import json , csv # noqa: E401
4243from pathlib import Path
@@ -53,13 +54,18 @@ def sample_raster_at_latlon(src, lat, lon): # noqa: D103
5354 if row < 0 or row >= src .height or col < 0 or col >= src .width :
5455 raise IndexError ('Transformed coordinates are out of raster bounds' ) # noqa: EM101, TRY003
5556
56- # Read the raster value at the given row and column
57- raster_value = src .read (1 )[row , col ]
57+ # Read the raster value at the given row and column for all layers NOT just the first
58+ #raster_value = src.read(1)[row, col]
59+ data = src .read ()
60+ raster_values = data [:, row , col ]
61+ return raster_values # noqa: RET504
5862
59- return raster_value # noqa: RET504
6063
64+ def create_event (asset_file , event_grid_file , num_entry ): # noqa: C901, D103, N803, RUF100
6165
62- def create_event (asset_file , event_grid_file ): # noqa: C901, D103, N803, RUF100
66+ #print(f'asset_file: {asset_file}, entry: {num_entry}')
67+ #print(f'event_grid_file: {event_grid_file}, entry: {num_entry}')
68+
6369 # read the event grid data file
6470 event_grid_path = Path (event_grid_file ).resolve ()
6571 event_dir = event_grid_path .parent
@@ -94,7 +100,13 @@ def create_event(asset_file, event_grid_file): # noqa: C901, D103, N803, RUF100
94100 # Load the asset data
95101 asset_data = json .load (asset_file )
96102
97- im_tag = asset_data ['RegionalEvent' ]['intensityMeasures' ][0 ]
103+ if num_entry == 0 :
104+ im_tag = asset_data ['RegionalEvent' ]['intensityMeasures' ]
105+ units = asset_data ['RegionalEvent' ]['units' ]
106+ else :
107+ im_tag = asset_data ['RegionalEvent' ]['multiple' ][num_entry - 1 ]['intensityMeasures' ]
108+ units = asset_data ['RegionalEvent' ]['multiple' ][num_entry - 1 ]['units' ]
109+
98110
99111 # Extract the latitude and longitude
100112 lat = float (asset_data ['GeneralInformation' ]['location' ]['latitude' ])
@@ -113,31 +125,81 @@ def create_event(asset_file, event_grid_file): # noqa: C901, D103, N803, RUF100
113125 val = sample_raster_at_latlon (
114126 src = src , lat = lat_transformed , lon = lon_transformed
115127 )
116-
117- data = [[ im_tag ], [ val ] ]
128+
129+ data = [im_tag , val ]
118130
119131 # Save the simcenter file name
120132 file_name = f'Site_{ asset_id } .csvx{ 0 } x{ int (asset_id ):05d} '
121133
122134 data_final .append ([file_name , lat , lon ])
123135
124136 csv_save_path = event_dir / f'Site_{ asset_id } .csv'
125- with open (csv_save_path , 'w' , newline = '' ) as file : # noqa: PTH123
126- # Create a CSV writer object
127- writer = csv .writer (file )
128137
129- # Write the data to the CSV file
130- writer .writerows (data )
138+ if num_entry == 0 :
139+
140+ # if first entry
141+ # create the csv file and add the data
142+
143+ with open (csv_save_path , 'w' , newline = '' ) as file : # noqa: PTH123
144+ # Create a CSV writer object
145+ writer = csv .writer (file )
146+
147+ # Write the data to the CSV file
148+ writer .writerows (data )
149+ else :
150+
151+ # subsequent entries
152+ # read existing file, append header and row data,
153+ # and finally write new file with updated data
154+ #
155+
156+ # Read the existing file
157+ if os .path .exists (csv_save_path ):
158+ with open (csv_save_path , mode = 'r' ) as f :
159+ reader = csv .DictReader (f )
160+ rows = list (reader )
161+ fieldnames = reader .fieldnames or []
162+ else :
163+ rows = []
164+ fieldnames = []
165+
166+ # extend field names and row data with additional stuff to be added
167+ # IS IM_TAG a single value or an array .. should be array!
168+
169+ extra = dict (zip (im_tag , val ))
170+ for k in extra :
171+ if k not in fieldnames :
172+ fieldnames .append (k )
173+ for row in rows :
174+ row .update (extra )
175+
176+ # Overwrite existing file
177+ with open (csv_save_path , mode = 'w' , newline = '' ) as f :
178+ writer = csv .DictWriter (f , fieldnames = fieldnames )
179+ writer .writeheader ()
180+ writer .writerows (rows )
181+
131182
132183 # prepare a dictionary of events
133184 event_list_json = [[file_name , 1.0 ]]
134185
135- asset_data ['Events' ] = [{}]
136- asset_data ['Events' ][0 ] = {
137- 'EventFolderPath' : str (event_dir ),
138- 'Events' : event_list_json ,
139- 'type' : 'intensityMeasure' ,
140- }
186+
187+ # in asset file, add event info including now units
188+ if num_entry == 0 :
189+
190+ # if first, add an event field
191+ asset_data ['Events' ] = [{}]
192+ asset_data ['Events' ][0 ] = {
193+ 'EventFolderPath' : str (event_dir ),
194+ 'Events' : event_list_json ,
195+ 'type' : 'intensityMeasure' ,
196+ 'units' : units
197+ }
198+
199+ else :
200+
201+ # if additional, update units to include new
202+ asset_data ['Events' ][0 ]['units' ].update (units )
141203
142204 with open (asset_file_path , 'w' , encoding = 'utf-8' ) as f : # noqa: PTH123
143205 json .dump (asset_data , f , indent = 2 )
0 commit comments