Skip to content
Snippets Groups Projects
Select Git revision
  • 5e6706b2be2d0d047877fa580a8d4186db7472d3
  • master default protected
  • use_flight_altitude
  • distribute
4 results

sss1day_FMB_py3.py

Blame
  • user avatar
    08e862ff
    History
    sss1day_FMB_py3.py 12.54 KiB
    import os
    import numpy
    
    # Import CODA definitions
    	# Older dates
    # os.putenv('CODA_DEFINITION', '/home/huiliu/CODA/share/coda/definitions/')
    # os.putenv('CODA_DEFINITION', '/home/stevew/CODA/share/coda/definitions/')
    os.putenv('CODA_DEFINITION', '/data/Personal/stevew/AEOLUS/CODA/share/coda/definitions/')
    	# Newer dates
    #os.putenv('CODA_DEFINITION', '/home/huiliu/CODA/share/coda/definitions/AEOLUS-20190611.codadef')
    
    from numpy import vstack, zeros, linspace, where, logical_and
    
    import sys
    #   Tell python scripts where to find CODA (next import coda) --------
    # sys.path.append('/home/huiliu/CODA/lib/python2.7/site-packages')
    # sys.path.append('/home/stevew/CODA/lib/python2.7/site-packages')
    sys.path.append('/data/Personal/stevew/AEOLUS/CODA/lib/python3.7/site-packages')
    import coda
    
    import matplotlib.pyplot as plt
    import glob, ast, datetime
    
    files = open('flist_adm.txt').read().split()
    print(files)
    
    nfile  = len(files)
    allobs = 0
    wind_err_thresh = 50
    check_wind_err = True
    
    f66=open('./ray1day.out', 'w+')
    f60=open('./mie1day.out', 'w+')
    
    # ------- loop over data files ------
    
    for n, filename in enumerate(files):
      print('Reading file: %s' %filename)
    
      product = coda.open(filename)
    
    ### ------- Mie wind profile ---------
    ### ------- Mie wind profile ---------
    
    # print("Individual Mie HLOS wind points")
    # latitude  = coda.fetch(product, 'mie_geolocation',-1, 'windresult_geolocation/latitude_cog')
    # longitude = coda.fetch(product, 'mie_geolocation',-1, 'windresult_geolocation/longitude_cog')
    # mie_alt in (m)
      mie_alt0  = coda.fetch(product, 'mie_geolocation',-1, 'windresult_geolocation/altitude_vcog')
      mie_altt  = coda.fetch(product, 'mie_geolocation',-1, 'windresult_geolocation/altitude_top')
      mie_altb  = coda.fetch(product, 'mie_geolocation',-1, 'windresult_geolocation/altitude_bottom')
      mie_azimuth0 = coda.fetch(product, 'mie_geolocation',-1, 'windresult_geolocation/los_azimuth')
    
      mie_length0 = coda.fetch(product, 'mie_hloswind',-1, 'windresult/integration_length')
      mie_valid0  = coda.fetch(product, 'mie_hloswind',-1, 'windresult/validity_flag')
      mie_wind0 = coda.fetch(product, 'mie_hloswind',-1, 'windresult/mie_wind_velocity')
    
      # new field for Mie scattering ratio
      # sr0 = coda.fetch(product, 'mie_wind_prod_conf_data', -1, 'mie_wind_qc', 'fitting_mie_sr')
    
    	#klukens
    #  mie_pppp0  = coda.fetch(product, 'mie_hloswind',-1, 'windresult/reference_pressure')
    #  mie_pppp0  = coda.get_field_names(product,'mie_geolocation[0]/windresult_geolocation')
    #  mie_pppp0  = coda.get_field_names(product,'mie_hloswind[0]/windresult')
    #  print "mie_pppp0 fetch all = ",mie_pppp0
    
      mie_err0  = coda.fetch(product, 'mie_wind_prod_conf_data',-1, 'mie_wind_qc/hlos_error_estimate')
    #  mie_snr0       = coda.fetch(product, 'mie_wind_prod_conf_data',-1, 'mie_wind_qc/mie_snr')
    
    # -------  Rayleigh profiles  ---------
    # -------  Rayleigh profiles  ---------
    
    #  print("Individual Rayleight HLOS wind points")
      rayleigh_azimuth0 = coda.fetch(product, 'rayleigh_geolocation',-1, 'windresult_geolocation/los_azimuth')
    
    # latitude      = coda.fetch(product, 'rayleigh_geolocation',-1, 'windresult_geolocation/latitude_cog')
    # longitude     = coda.fetch(product, 'rayleigh_geolocation',-1, 'windresult_geolocation/longitude_cog')
    
      rayleigh_alt0 = coda.fetch(product, 'rayleigh_geolocation',-1, 'windresult_geolocation/altitude_vcog')
      rayleigh_altt = coda.fetch(product, 'rayleigh_geolocation',-1, 'windresult_geolocation/altitude_top')
      rayleigh_altb = coda.fetch(product, 'rayleigh_geolocation',-1, 'windresult_geolocation/altitude_bottom')
    
      rayleigh_wind0 = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/rayleigh_wind_velocity')
    
    # ----- rayleigh data is from top (26.5km) --> bottom (24 levels) ---------
    #     wind_err in (m/s)
    
      rayleigh_err0  = coda.fetch(product, 'rayleigh_wind_prod_conf_data',-1, 'rayleigh_wind_qc/hlos_error_estimate')
      rayleigh_sratio0 = coda.fetch(product, 'rayleigh_wind_prod_conf_data',-1, 'rayleigh_wind_qc/scattering_ratio')
      rayleigh_wind_to_T  = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/rayleigh_wind_to_temperature')
      rayleigh_wind_to_P  = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/rayleigh_wind_to_pressure')
    
      rayleigh_temp  = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/reference_temperature')
      rayleigh_pppp  = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/reference_pressure')
    
      ray_length0 = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/integration_length')
      rayleigh_valid0 = coda.fetch(product, 'rayleigh_hloswind',-1, 'windresult/validity_flag')
    # print(rayleigh_wind0.shape)
    
    
    #=================================================
    ## ---------- Mie profile information ------------
    #=================================================
      print("Mie HLOS wind profiles")
    
      rid = coda.fetch(product, 'mie_profile',-1, 'l2b_wind_profiles/wind_result_id_number')
      rid = vstack(rid)
    # print(rid.shape)
    
      typ_id = coda.fetch(product, 'mie_profile',-1, 'l2b_wind_profiles/Obs_Type')
    
      nprofm = rid.shape[0]
      nlevm  = rid.shape[1]
    
    # -----------------  the data is from top --> bottom -------------
    #   NOTE: i = 0 - nprof-1 in the xrange FUNTION of PYTHON 
    #-----------------------------------------------------------------
    
      mie_azimuth = zeros(rid.shape)
      mie_err = zeros(rid.shape)
      mie_hhh = zeros(rid.shape)
      mie_hht = zeros(rid.shape)
      mie_hhb = zeros(rid.shape)
      mie_wind = zeros(rid.shape)
    #  mie_pppp    = zeros(rid.shape)	#klukens
      mie_valid = zeros(rid.shape)
      mie_length = zeros(rid.shape)
      mie_sratio = zeros(rid.shape)
    #  mie_snr     = zeros(rid.shape)
    
    #  wind m/s, 
    
      mie_wind[rid != 0] = mie_wind0[rid[rid != 0]-1]*0.01
      mie_azimuth[rid != 0] = mie_azimuth0[rid[rid != 0]-1]*1.0
    
      mie_valid[rid != 0] = mie_valid0[rid[rid != 0]-1]
    #     length in km output
      mie_length[rid != 0] = mie_length0[rid[rid != 0]-1]*0.001
    
    #  mie_pppp[rid !=0] = mie_pppp0[rid[rid !=0]-1]*0.01	#klukens
    
    #  wind error m/s
      mie_err[rid != 0] = mie_err0[rid[rid != 0]-1]*1.0
    #  mie_snr    [rid !=0] = mie_snr0     [rid[rid !=0]-1]*1.0
    
    #    height in (km)
    #    add 250m shift to the height for this version of L2B data
      mie_hhh[rid != 0] = mie_alt0[rid[rid != 0]-1] * 0.001+0.25
    
      mie_hht[rid != 0] = mie_altt[rid[rid != 0]-1] * 0.001 + 0.25
      mie_hhb[rid != 0] = mie_altb[rid[rid != 0]-1] * 0.001 + 0.25
    
      latrid = coda.fetch(product, 'mie_profile',-1, 'Profile_lat_average')
      lonrid = coda.fetch(product, 'mie_profile',-1, 'Profile_lon_average')
      sstime = coda.fetch(product, 'mie_profile',-1, 'Profile_DateTime_Average')
    
      for i in range(nprofm):
         timestep = datetime.datetime(2000, 1, 1)+datetime.timedelta(seconds=sstime[i])
         yyyy = timestep.strftime('%Y')
         mm = timestep.strftime('%m')
         dd = timestep.strftime('%d')
         hh = timestep.strftime('%H')
         min = timestep.strftime('%M')
         sec = timestep.strftime('%S')	 # klukens
    
         if check_wind_err:
            totlevs = numpy.sum(logical_and(mie_valid[i, :] > 0, logical_and(rid[i, :] > 0, mie_err[i, :] < wind_err_thresh)))
         else:
            totlevs = numpy.sum(logical_and(mie_valid[i, :] > 0, rid[i, :] > 0))
    
         if totlevs > 0:
          if typ_id[i] == 1:  # cloudy type Mie winds
    
           print(yyyy, mm, dd, hh, min, sec, '%7.2f %7.2f %2i' % (float(lonrid[i]), float(latrid[i]), int(totlevs)), file=f60)
    
           if check_wind_err:
               for m in range(nlevm):
        #       keep consistent with the lines of totlevs above !!!
                if rid[i, m] > 0:
                 if mie_err[i, m] < wind_err_thresh:
                  if mie_valid[i, m] > 0.0:
                   print('%2i %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f' % (int(m+1),
                     mie_hhh[i,m], mie_hht[i,m], mie_hhb[i,m], mie_err[i,m],
                     mie_azimuth[i,m], mie_wind[i,m], mie_length[i,m]), file=f60)
           else:
               for m in range(nlevm):
                if rid[i, m] > 0:
                  if mie_valid[i, m] > 0.0:
                    print('%2i %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f' % (int(m+1),
                       mie_hhh[i,m], mie_hht[i,m], mie_hhb[i,m], mie_err[i,m],
                          mie_azimuth[i,m], mie_wind[i,m], mie_length[i,m]), file=f60)
    
    
    # -----------------------------------------------
    #          Rayleigh profile information 
    # -----------------------------------------------
    
      print("Rayleigh HLOS wind profiles")
      rid = coda.fetch(product, 'rayleigh_profile',-1, 'l2b_wind_profiles/wind_result_id_number')
      rid = vstack(rid)
    
    #==========================================
    # tpye =1, cloudy, =2 clear
    #==========================================
      typ_id = coda.fetch(product, 'rayleigh_profile',-1, 'l2b_wind_profiles/Obs_Type')
    
    #    profile number of Rayleigh winds profiles in this orbit
      nprof = rid.shape[0]
      nlev  = rid.shape[1]
    # print(rid.shape)
    
    # -----------------  the data is from top --> bottom -------------
    #   NOTE: i = 0 - nprof-1 in the xrange FUNTION of PYTHON 
    #-----------------------------------------------------------------
    
      ray_azimuth = zeros(rid.shape)
      ray_err = zeros(rid.shape)
      wind_sens_T = zeros(rid.shape)
      wind_sens_P = zeros(rid.shape)
      ray_length = zeros(rid.shape)
      ray_valid = zeros(rid.shape)
      ref_temp = zeros(rid.shape)
      ref_pppp = zeros(rid.shape)
      ray_hhh = zeros(rid.shape)
      ray_hht = zeros(rid.shape)
      ray_hhb = zeros(rid.shape)
      ray_wind = zeros(rid.shape)
      ray_sratio = zeros(rid.shape)
    
      ray_wind[rid != 0] = rayleigh_wind0[rid[rid != 0]-1]*0.01
      ray_azimuth[rid != 0] = rayleigh_azimuth0[rid[rid != 0]-1]*1.0
      ray_sratio [rid != 0] = rayleigh_sratio0[rid[rid != 0]-1]*1.0
    
    #  print(rayleigh_wind0.shape)
    #  print(rid.shape)
    #  print(rid)
    #  from 2D OBS fortran index rid (1-nnn), to index 0-(nnn-1) of 1D mie_wind0
    #
    
    #  wind error m/s
      ray_err[rid != 0] = rayleigh_err0[rid[rid != 0]-1]*1.0
    
    #   m/s/K
      wind_sens_T[rid != 0] = rayleigh_wind_to_T[rid[rid != 0]-1]*0.01
    # K
      ref_temp[rid != 0] = rayleigh_temp[rid[rid != 0]-1]
      ref_pppp[rid != 0] = rayleigh_pppp[rid[rid != 0]-1]*0.01
    
    # cm/s/hPa 
      wind_sens_P[rid != 0] = rayleigh_wind_to_P[rid[rid !=0]-1] * 1.0e-4
      ray_length[rid != 0] = ray_length0[rid[rid != 0]-1] * 0.001
      ray_valid[rid != 0] = rayleigh_valid0[rid[rid != 0]-1]
    
    #    height in (km)
    #    add 250m shift to the height for this version of L2B data
      ray_hhh[rid != 0] = rayleigh_alt0[rid[rid != 0]-1] * 0.001 + 0.25
      ray_hht[rid != 0] = rayleigh_altt[rid[rid != 0]-1] * 0.001 + 0.25
      ray_hhb[rid != 0] = rayleigh_altb[rid[rid != 0]-1] * 0.001 + 0.25
    
      latrid =coda.fetch(product, 'rayleigh_profile',-1, 'Profile_lat_average')
      lonrid =coda.fetch(product, 'rayleigh_profile',-1, 'Profile_lon_average')
      sstime =coda.fetch(product, 'rayleigh_profile',-1, 'Profile_DateTime_Average')
    
      for i in range(nprof):
         timestep = datetime.datetime(2000, 1, 1) + datetime.timedelta(seconds=sstime[i])
         yyyy = timestep.strftime('%Y')
         mm   = timestep.strftime('%m')
         dd   = timestep.strftime('%d')
         hh   = timestep.strftime('%H')
         min  = timestep.strftime('%M')
         sec  = timestep.strftime('%S')	#klukens
    
         if check_wind_err:
             totlevs = numpy.sum(logical_and(ray_valid[i, :] > 0, logical_and(rid[i, :] > 0, ray_err[i, :] < wind_err_thresh)))
         else:
             totlevs = numpy.sum(logical_and(ray_valid[i, :] > 0, rid[i, :] > 0))
    
    #  for clear sky Rayleigh winds ----------
         if totlevs > 0:
          if typ_id[i] == 2:
    
           print(yyyy, mm, dd, hh, min, sec, '%7.2f %7.2f %2i' % (float(lonrid[i]), float(latrid[i]), int(totlevs)), file=f66)
    
           if check_wind_err:
               for m in range(nlev):
        #       keep consistent with the lines of totlevs above !!!
                if rid[i, m] > 0:
                  if ray_err[i, m] < wind_err_thresh:
                   if ray_valid[i, m] > 0.0:
                    print('%2i %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f'
                      % (int(m+1), ray_hhh[i,m], ray_hht[i,m], ray_hhb[i,m],
                      ray_err[i,m], ray_azimuth[i,m], ray_wind[i,m],
                      ref_temp[i,m]*0.01, ref_pppp[i,m], wind_sens_T[i,m],
                      wind_sens_P[i,m], ray_sratio [i,m], ray_length[i,m]), file=f66)
           else:
               for m in range(nlev):
                   if rid[i, m] > 0:
                        if ray_valid[i, m] > 0.0:
                            print('%2i %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f'
                               % (int(m + 1), ray_hhh[i, m], ray_hht[i, m], ray_hhb[i, m],
                                        ray_err[i, m], ray_azimuth[i, m], ray_wind[i, m],
                                        ref_temp[i, m] * 0.01, ref_pppp[i, m], wind_sens_T[i, m],
                                        wind_sens_P[i, m], ray_sratio[i, m], ray_length[i, m]), file=f66)
    
      coda.close(product)
    
    print('Finished data. Processed, file loop')
    exit()