Commit 58bfe2813b911f5523ba5fdfa4316eb2f7280501

Authored by Goutte
1 parent 60b73eb1

Handle start and stop dates for the models as well.

Showing 1 changed file with 55 additions and 70 deletions   Show diff stats
@@ -427,44 +427,24 @@ def get_data_for_target(target_config, started_at, stopped_at): @@ -427,44 +427,24 @@ def get_data_for_target(target_config, started_at, stopped_at):
427 abort(500, "Invalid orbit configuration for '%s' : %s" 427 abort(500, "Invalid orbit configuration for '%s' : %s"
428 % (target_config['slug'], str(e))) 428 % (target_config['slug'], str(e)))
429 429
430 - # try:  
431 - # started_at = datetime.datetime.strptime(started_at, FILE_DATE_FMT)  
432 - # except:  
433 - # abort(400, "Invalid started_at config : '%s'." % started_at)  
434 - # try:  
435 - # stopped_at = datetime.datetime.strptime(stopped_at, FILE_DATE_FMT)  
436 - # except:  
437 - # abort(400, "Invalid stopped_at config : '%s'." % stopped_at)  
438 -  
439 - # Grab the list of netCDF files from Myriam's API  
440 - model_files = []  
441 - for model in models:  
442 - model_files = model_files + retrieve_amda_netcdf(  
443 - target_config['slug'], model['slug'], started_at, stopped_at  
444 - )  
445 - # Remove possible duplicates  
446 - model_files = set(model_files)  
447 -  
448 - # Let's return an empty dict when there's no data instead of crashing  
449 - # if not len(model_files):  
450 - # abort(500, "No model files found for '%s'." % target_config['slug'])  
451 - # if not len(orbit_files):  
452 - # abort(500, "No orbit files found for '%s'." % target_config['slug']) 430 + def _sta_sto(_cnf, _sta, _sto):
  431 + if 'started_at' in _cnf:
  432 + _s0 = datetime.datetime.strptime(_cnf['started_at'], FILE_DATE_FMT)
  433 + _s0 = max(_s0, _sta)
  434 + else:
  435 + _s0 = _sta
  436 + if 'stopped_at' in _cnf:
  437 + _s1 = datetime.datetime.strptime(_cnf['stopped_at'], FILE_DATE_FMT)
  438 + _s1 = min(_s1, _sto)
  439 + else:
  440 + _s1 = _sto
  441 + return _s1, _s0
453 442
454 precision = "%Y-%m-%dT%H" # model and orbits times are only equal-ish 443 precision = "%Y-%m-%dT%H" # model and orbits times are only equal-ish
455 orbit_data = {} # keys are datetime as str, values arrays of XY 444 orbit_data = {} # keys are datetime as str, values arrays of XY
456 445
457 for orbit in orbits: 446 for orbit in orbits:
458 - if 'started_at' in orbit:  
459 - s0 = datetime.datetime.strptime(orbit['started_at'], FILE_DATE_FMT)  
460 - s0 = max(s0, started_at)  
461 - else:  
462 - s0 = started_at  
463 - if 'stopped_at' in orbit:  
464 - s1 = datetime.datetime.strptime(orbit['stopped_at'], FILE_DATE_FMT)  
465 - s1 = min(s1, stopped_at)  
466 - else:  
467 - s1 = stopped_at 447 + s0, s1 = _sta_sto(orbit, started_at, stopped_at)
468 448
469 orbit_files = retrieve_amda_netcdf( 449 orbit_files = retrieve_amda_netcdf(
470 target_config['slug'], orbit['slug'], s0, s1 450 target_config['slug'], orbit['slug'], s0, s1
@@ -493,43 +473,48 @@ def get_data_for_target(target_config, started_at, stopped_at): @@ -493,43 +473,48 @@ def get_data_for_target(target_config, started_at, stopped_at):
493 cdf_handle.close() 473 cdf_handle.close()
494 474
495 all_data = {} # keys are datetime as str, values tuples of data 475 all_data = {} # keys are datetime as str, values tuples of data
496 - for model_file in model_files:  
497 - # Time, StartTime, StopTime, V, B, N, T, Delta_angle, P_dyn  
498 - log.debug("%s: opening model NETCDF4 '%s'..." %  
499 - (target_config['name'], model_file))  
500 - cdf_handle = Dataset(model_file, "r", format="NETCDF4")  
501 - times = cdf_handle.variables['Time'] # YYYY DOY HH MM SS .ms  
502 - data_v = cdf_handle.variables['V']  
503 - data_b = cdf_handle.variables['B']  
504 - data_t = cdf_handle.variables['T']  
505 - data_n = cdf_handle.variables['N']  
506 - data_p = cdf_handle.variables['P_dyn']  
507 - data_d = cdf_handle.variables['Delta_angle']  
508 - log.debug("%s: aggregating data from '%s'..." %  
509 - (target_config['name'], model_file))  
510 - for time, datum_v, datum_b, datum_t, datum_n, datum_p, datum_d \  
511 - in zip(times, data_v, data_b, data_t, data_n, data_p, data_d):  
512 - vrad = datum_v[0]  
513 - vtan = datum_v[1]  
514 - try:  
515 - dtime = datetime_from_list(time)  
516 - except Exception as e:  
517 - log.error("Failed to parse time from %s." % time)  
518 - raise e  
519 - if started_at <= dtime <= stopped_at:  
520 - dkey = round_time(dtime, 60*60).strftime(precision)  
521 - x_hee = None  
522 - y_hee = None  
523 - if dkey in orbit_data:  
524 - x_hee = orbit_data[dkey][0]  
525 - y_hee = orbit_data[dkey][1]  
526 - all_data[dkey] = (  
527 - dtime.strftime("%Y-%m-%dT%H:%M:%S+00:00"),  
528 - vrad, vtan, sqrt(vrad * vrad + vtan * vtan),  
529 - datum_b, datum_t, datum_n, datum_p, datum_d,  
530 - x_hee, y_hee  
531 - )  
532 - cdf_handle.close() 476 + for model in models:
  477 + s0, s1 = _sta_sto(model, started_at, stopped_at)
  478 + model_files = retrieve_amda_netcdf(
  479 + target_config['slug'], model['slug'], s0, s1
  480 + )
  481 + for model_file in model_files:
  482 + # Time, StartTime, StopTime, V, B, N, T, Delta_angle, P_dyn
  483 + log.debug("%s: opening model NETCDF4 '%s'..." %
  484 + (target_config['name'], model_file))
  485 + cdf_handle = Dataset(model_file, "r", format="NETCDF4")
  486 + times = cdf_handle.variables['Time'] # YYYY DOY HH MM SS .ms
  487 + data_v = cdf_handle.variables['V']
  488 + data_b = cdf_handle.variables['B']
  489 + data_t = cdf_handle.variables['T']
  490 + data_n = cdf_handle.variables['N']
  491 + data_p = cdf_handle.variables['P_dyn']
  492 + data_d = cdf_handle.variables['Delta_angle']
  493 + log.debug("%s: aggregating data from '%s'..." %
  494 + (target_config['name'], model_file))
  495 + for time, datum_v, datum_b, datum_t, datum_n, datum_p, datum_d \
  496 + in zip(times, data_v, data_b, data_t, data_n, data_p, data_d):
  497 + vrad = datum_v[0]
  498 + vtan = datum_v[1]
  499 + try:
  500 + dtime = datetime_from_list(time)
  501 + except Exception as e:
  502 + log.error("Failed to parse time from %s." % time)
  503 + raise e
  504 + if s0 <= dtime <= s1:
  505 + dkey = round_time(dtime, 60*60).strftime(precision)
  506 + x_hee = None
  507 + y_hee = None
  508 + if dkey in orbit_data:
  509 + x_hee = orbit_data[dkey][0]
  510 + y_hee = orbit_data[dkey][1]
  511 + all_data[dkey] = (
  512 + dtime.strftime("%Y-%m-%dT%H:%M:%S+00:00"),
  513 + vrad, vtan, sqrt(vrad * vrad + vtan * vtan),
  514 + datum_b, datum_t, datum_n, datum_p, datum_d,
  515 + x_hee, y_hee
  516 + )
  517 + cdf_handle.close()
533 518
534 return all_data 519 return all_data
535 520