Skip to content

Commit 70f9819

Browse files
committed
Process turbulence
1 parent 4d0f264 commit 70f9819

File tree

4 files changed

+82
-15
lines changed

4 files changed

+82
-15
lines changed

scripts/cloudnet.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,10 @@ def _process_file(
357357
process_instrument(processor, instru_params, Path(directory))
358358
except utils.SkipTaskError as err:
359359
logging.warning("Skipped task: %s", err)
360-
elif product.id in ("mwr-single", "mwr-multi"):
360+
elif product.id in ("mwr-single", "mwr-multi", "epsilon-lidar"):
361361
if args.uuids:
362362
instruments = {processor.get_instrument(uuid) for uuid in args.uuids}
363-
else:
363+
elif product.id in ("mwr-single", "mwr-multi"):
364364
payload = {
365365
"site": site.id,
366366
"date": date.isoformat(),
@@ -369,6 +369,15 @@ def _process_file(
369369
metadata = processor.md_api.get("api/files", payload)
370370
instrument_uuids = {meta["instrumentInfoUuid"] for meta in metadata}
371371
instruments = {processor.get_instrument(uuid) for uuid in instrument_uuids}
372+
else:
373+
payload = {
374+
"site": site.id,
375+
"date": date.isoformat(),
376+
"product": "doppler-lidar",
377+
}
378+
metadata = processor.md_api.get("api/files", payload)
379+
instrument_uuids = {meta["instrumentInfoUuid"] for meta in metadata}
380+
instruments = {processor.get_instrument(uuid) for uuid in instrument_uuids}
372381
for instrument in instruments:
373382
_print_header(
374383
{

src/processing/harmonizer/doppler_lidar.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def copy_file(self, valid_ind: list):
126126
"time",
127127
"wavelength",
128128
"polariser_bleed_through",
129+
"ray_accumulation_time",
130+
"pulses_per_ray",
129131
"elevation",
130132
"range",
131133
)
@@ -175,6 +177,14 @@ def fix_long_names(self):
175177
self.nc.variables[
176178
"polariser_bleed_through"
177179
].long_name = "Polariser bleed-through"
180+
if "pulses_per_ray" in self.nc.variables:
181+
self.nc.variables[
182+
"pulses_per_ray"
183+
].long_name = "Pulses per ray"
184+
if "ray_accumulation_time" in self.nc.variables:
185+
self.nc.variables[
186+
"ray_accumulation_time"
187+
].long_name = "Ray accumulation time"
178188
if "beta_cross" in self.nc.variables:
179189
self.nc.variables[
180190
"beta_cross"

src/processing/instrument_process.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -756,9 +756,9 @@ def _fix_cl51_timestamps(filename: str, offset: datetime.timedelta) -> None:
756756
def _doppy_stare_to_nc(
757757
stare: doppy.product.Stare | doppy.product.StareDepol, filename: str
758758
) -> None:
759-
with doppy.netcdf.Dataset(filename) as nc:
759+
with doppy.netcdf.Dataset(filename, format="NETCDF4_CLASSIC") as nc:
760760
nc.add_dimension("time")
761-
nc.add_dimension("range")
761+
nc.add_dimension("range",size=len(stare.radial_distance))
762762
nc.add_time(
763763
name="time",
764764
dimensions=("time",),
@@ -780,7 +780,7 @@ def _doppy_stare_to_nc(
780780
units="degrees",
781781
data=stare.elevation,
782782
dtype="f4",
783-
long_name="elevation from horizontal",
783+
long_name="Elevation from horizontal",
784784
)
785785
nc.add_variable(
786786
name="beta_raw",
@@ -795,7 +795,7 @@ def _doppy_stare_to_nc(
795795
units="sr-1 m-1",
796796
data=stare.beta,
797797
dtype="f4",
798-
mask=stare.mask,
798+
mask=stare.mask_beta,
799799
)
800800
nc.add_variable(
801801
name="v",
@@ -804,7 +804,7 @@ def _doppy_stare_to_nc(
804804
long_name="Doppler velocity",
805805
data=stare.radial_velocity,
806806
dtype="f4",
807-
mask=stare.mask,
807+
mask=stare.mask_radial_velocity,
808808
)
809809
nc.add_scalar_variable(
810810
name="wavelength",
@@ -828,7 +828,7 @@ def _doppy_stare_to_nc(
828828
units="1",
829829
data=stare.depolarisation,
830830
dtype="f4",
831-
mask=stare.mask | stare.mask_depolarisation,
831+
mask=stare.mask_beta | stare.mask_depolarisation,
832832
)
833833
nc.add_variable(
834834
name="beta_cross_raw",
@@ -843,7 +843,7 @@ def _doppy_stare_to_nc(
843843
dimensions=("time", "range"),
844844
units="sr-1 m-1",
845845
data=stare.beta_cross,
846-
mask=stare.mask | stare.mask_beta_cross,
846+
mask=stare.mask_beta | stare.mask_beta_cross,
847847
dtype="f4",
848848
)
849849
nc.add_scalar_variable(
@@ -855,14 +855,31 @@ def _doppy_stare_to_nc(
855855
)
856856
nc.add_attribute("serial_number", stare.system_id)
857857
nc.add_attribute("doppy_version", doppy.__version__)
858+
match stare.ray_info:
859+
case doppy.product.stare.RayAccumulationTime(value):
860+
nc.add_scalar_variable(
861+
name="ray_accumulation_time",
862+
units="s",
863+
long_name="Ray accumulation time",
864+
data=value,
865+
dtype="f4",
866+
)
867+
case doppy.product.stare.PulsesPerRay(value):
868+
nc.add_scalar_variable(
869+
name="pulses_per_ray",
870+
units="1",
871+
long_name="Pulses per ray",
872+
data=value,
873+
dtype="i4",
874+
)
858875

859876

860877
def _doppy_wind_to_nc(
861878
wind: doppy.product.Wind, filename: str, options: doppy.product.WindOptions | None
862879
) -> None:
863-
with doppy.netcdf.Dataset(filename) as nc:
880+
with doppy.netcdf.Dataset(filename,format="NETCDF4_CLASSIC") as nc:
864881
nc.add_dimension("time")
865-
nc.add_dimension("height")
882+
nc.add_dimension("height", size=len(wind.height))
866883
nc.add_time(
867884
name="time",
868885
dimensions=("time",),
@@ -929,9 +946,9 @@ def _doppy_wind_to_nc(
929946
def _doppy_wls70_wind_to_nc(
930947
wind: doppy.product.Wind, filename: str, options: doppy.product.WindOptions | None
931948
) -> None:
932-
with doppy.netcdf.Dataset(filename) as nc:
949+
with doppy.netcdf.Dataset(filename,format="NETCDF4_CLASSIC") as nc:
933950
nc.add_dimension("time")
934-
nc.add_dimension("height")
951+
nc.add_dimension("height", size=len(wind.height))
935952
nc.add_time(
936953
name="time",
937954
dimensions=("time",),

src/processing/product.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
from cloudnetpy.model_evaluation.products import product_resampling
1111
from cloudnetpy.products import generate_mwr_multi, generate_mwr_single
1212
from orbital_radar import Suborbital
13+
from cloudnetpy.products.epsilon import generate_epsilon_from_lidar
1314
from requests import HTTPError
1415

15-
from processing import utils
16+
from processing import instrument, utils
1617
from processing.netcdf_comparer import NCDiff, nc_difference
1718
from processing.processor import ModelParams, Processor, ProductParams
1819
from processing.utils import SkipTaskError, Uuid
@@ -104,6 +105,8 @@ def process_product(processor: Processor, params: ProductParams, directory: Path
104105
new_file = _process_categorize(processor, params, uuid, directory)
105106
elif params.product.id == "cpr-simulation":
106107
new_file = _process_cpr_simulation(processor, params, uuid, directory)
108+
elif params.product.id == "epsilon-lidar":
109+
new_file = _process_epsilon_from_lidar(processor, params, uuid, directory)
107110
else:
108111
new_file = _process_level2(processor, params, uuid, directory)
109112
except CloudnetException as err:
@@ -174,7 +177,8 @@ def _generate_filename(params: ProductParams | ModelParams) -> str:
174177
def _process_mwrpy(
175178
processor: Processor, params: ProductParams, uuid: Uuid, directory: Path
176179
) -> Path:
177-
assert params.instrument is not None
180+
if params.instrument is None:
181+
raise RuntimeError("Instrument is None")
178182
payload = _get_payload(
179183
params,
180184
product_id="mwr-l1c",
@@ -217,6 +221,33 @@ def _process_cpr_simulation(
217221
str(categorize_file), str(output_file), mean_wind=6, uuid=uuid.volatile
218222
)
219223
utils.add_global_attributes(output_file)
224+
225+
226+
def _process_epsilon_from_lidar(
227+
processor: Processor, params: ProductParams, uuid: Uuid, directory: Path
228+
) -> Path:
229+
if params.instrument is None:
230+
raise RuntimeError("Instrument is None")
231+
payload_stare = _get_payload(
232+
params,
233+
product_id="doppler-lidar",
234+
instrument_pid=params.instrument.pid,
235+
)
236+
metadata_stare = processor.md_api.get("api/files", payload_stare)
237+
_check_response(metadata_stare, "doppler-lidar")
238+
239+
payload_wind = _get_payload(
240+
params,
241+
product_id="doppler-lidar-wind",
242+
)
243+
metadata_wind = processor.md_api.get("api/files", payload_wind)
244+
245+
_check_response(metadata_wind, "doppler-lidar-wind")
246+
247+
file_lidar, file_wind = processor.storage_api.download_products([metadata_stare[0],metadata_wind[0]], directory)
248+
249+
output_file = directory / "output.nc"
250+
uuid.product = generate_epsilon_from_lidar(file_lidar, file_wind, str(output_file), uuid.volatile)
220251
return output_file
221252

222253

0 commit comments

Comments
 (0)