In [1]:
from netCDF4 import Dataset
import numpy as np
import sys
import time

In [2]:
flt = ['20150706']

flts = ['20150617','20150620','20150701','20150702','20150706','20150709']

savePath = '/Users/danstechman/GoogleDrive/PECAN-Data/'

# Recreate all parameter files
runAll = True

In [3]:
if runAll:
    runFlights = flts
else:
    runFlights = flt

In [4]:
for flight in runFlights:
    if flight == '20150617':
        ## Flight-level data parameters
        flFile = '20150617I1_AXC.nc'
        dewPtSens = 'TDM.1'
        altSens = 'AltGPS.2'
        wsSens = 'WS.dX'


        ## Microphysics parameters
        # Start and end times of spirals in seconds
        startT = np.array([14203, 16750, 18576, 20353, 21846, 23588, 24995],dtype=float)
        endT = np.array([14917, 17948, 19577, 21440, 22905, 24570, 25895],dtype=float)
        
        # Start and end times of PDDs in seconds
        PDDstartT = np.array([9272, 9671, 10827, 12996, 14925, 16023, 19682, 21499, 24672, 26046],dtype=float)
        PDDendT = np.array([9647, 10433, 11843, 14107, 15484, 16602, 20322, 21846, 24995, 26376],dtype=float)

        # Time/[temp at same time] when last evidence of ice was observed
        mlBotTemp = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        mlBotTime = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)

        # Time/[temp at same time] when first evidence of liquid water was observed
        mlTopTemp = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        mlTopTime = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)

        # MCS stage of evolution. 
        # F = Formative, M = Mature, W = Weakening, U = Unclassified
        mcsStg = np.array(['U', 'U', 'U', 'U', 'U', 'U', 'U'],dtype=str)

        # Location of spiral relative to MCS structure. 
        # T = Transition Zone, S = Enhanced Stratiform Region, A = Rear Anvil, U = Unclassified
        sprlZone = np.array(['U', 'U', 'U', 'U', 'U', 'U', 'U'],dtype=str)

        # Thresholds of particle interarrival time (in seconds) for each spiral 
        # below which particles are to be considered shattered
        CIP_intArvThrsh = np.array([1.9e-5, 1.2e-5, 7.8e-5, 3.7e-6, 7e-6, 8.7e-6, 3e-6],dtype=float)
        PIP_intArvThrsh = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        
        PIP_acptStartT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], dtype=float)
        PIP_acptEndT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        PIP_rjctStartT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        PIP_rjctEndT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)

    elif flight == '20150620':
        ## Flight-level data parameters
        flFile = '20150620I1_AXC.nc'
        dewPtSens = 'TDM.1'
        altSens = 'AltGPS.2'
        wsSens = 'WS.dX'


        ## Microphysics parameters
        startT = np.array([17757, 18230, 19284, 20845, 21877, 23890, 27947],dtype=float)
        endT = np.array([18229, 18783, 20227, 21826, 22968, 24451, 28702],dtype=float)
        
        # Start and end times of PDDs in seconds
        PDDstartT = np.array([15109, 17115, 18841, 20289, 22907, 24433, 25740, 26898],dtype=float)
        PDDendT = np.array([17002, 17715, 19295, 20838, 23876, 25709, 26774, 27973],dtype=float)

        mlBotTemp = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        mlBotTime = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)

        mlTopTemp = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        mlTopTime = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)

        mcsStg = np.array(['U', 'U', 'U', 'U', 'U', 'U', 'U'],dtype=str)

        sprlZone = np.array(['U', 'U', 'U', 'U', 'U', 'U', 'U'],dtype=str)

        CIP_intArvThrsh = np.array([np.nan, 7e-6, 3e-5, 6e-6, 6e-6, 1.5e-5, 3e-6],dtype=float) # Need value for new first spiral
        PIP_intArvThrsh = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        
        PIP_acptStartT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], dtype=float)
        PIP_acptEndT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        PIP_rjctStartT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        PIP_rjctEndT = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)

    elif flight == '20150701':
        ## Flight-level data parameters
        flFile = '20150701I1_AXC.nc'
        dewPtSens = 'TDM.2X'
        altSens = 'AltGPS.2'
        wsSens = 'WS.d'


        ## Microphysics parameters
        startT = np.array([21882],dtype=float)
        endT = np.array([22838],dtype=float)
        
        # Start and end times of PDDs in seconds
        PDDstartT = np.array([17421, 21247, 22838, 23775, 25230, 25899, 26398, 27598, 28944, 30158, 31008],dtype=float)
        PDDendT = np.array([20037, 21901, 23699, 25152, 25819, 26318, 27519, 28871, 30052, 30978, 31920],dtype=float)

        mlBotTemp = np.array([np.nan],dtype=float)
        mlBotTime = np.array([np.nan],dtype=float)

        mlTopTemp = np.array([np.nan],dtype=float)
        mlTopTime = np.array([np.nan],dtype=float)

        mcsStg = np.array(['U'],dtype=str)

        sprlZone = np.array(['U'],dtype=str)

        CIP_intArvThrsh = np.array([3e-5],dtype=float)
        PIP_intArvThrsh = np.array([np.nan],dtype=float)
        
        PIP_acptStartT = np.array([np.nan], dtype=float)
        PIP_acptEndT = np.array([np.nan],dtype=float)
        PIP_rjctStartT = np.array([np.nan],dtype=float)
        PIP_rjctEndT = np.array([np.nan],dtype=float)

    elif flight == '20150702':
        ## Flight-level data parameters
        flFile = '20150702I1_AXC.nc'
        dewPtSens = 'TDM.2X'
        altSens = 'AltGPS.3'
        wsSens = 'WS.d'


        ## Microphysics parameters
        startT = np.array([13336, 15350, 16892],dtype=float)
        endT = np.array([14551, 16501, 18196],dtype=float)
        
        # Start and end times of PDDs in seconds
        PDDstartT = np.array([10203, 12967, 14692, 16500, 18177, 20573, 22860],dtype=float)
        PDDendT = np.array([11734, 13335, 15350, 16932, 20497, 22783, 25177],dtype=float)

        mlBotTemp = np.array([np.nan, np.nan, np.nan],dtype=float)
        mlBotTime = np.array([np.nan, np.nan, np.nan],dtype=float)

        mlTopTemp = np.array([np.nan, np.nan, np.nan],dtype=float)
        mlTopTime = np.array([np.nan, np.nan, np.nan],dtype=float)

        mcsStg = np.array(['U', 'U', 'U'],dtype=str)

        sprlZone = np.array(['U', 'U', 'U'],dtype=str)

        CIP_intArvThrsh = np.array([1.7e-4, 3.9e-5, 3.9e-5],dtype=float)
        PIP_intArvThrsh = np.array([np.nan, np.nan, np.nan],dtype=float)
        
        PIP_acptStartT = np.array([np.nan, np.nan, np.nan], dtype=float)
        PIP_acptEndT = np.array([np.nan, np.nan, np.nan],dtype=float)
        PIP_rjctStartT = np.array([np.nan, np.nan, np.nan],dtype=float)
        PIP_rjctEndT = np.array([np.nan, np.nan, np.nan],dtype=float)

    elif flight == '20150706':
        ## Flight-level data parameters
        flFile = '20150706I1_AC.nc'
        dewPtSens = 'TDM.2'
        altSens = 'AltGPS.2'
        wsSens = 'WS.d'


        ## Microphysics parameters
        startT = np.array([11987, 12653, 15824, 16805, 20419, 21384, 22950, 23879],dtype=float)
        endT = np.array([12652, 13534, 16804, 17615, 21349, 22393, 23878, 24875],dtype=float)
        
        # Start and end times of PDDs in seconds
        PDDstartT = np.array([6988, 10269, 11536, 13570, 14475, 15460, 17760, 19098, 22517, 25204],dtype=float)
        PDDendT = np.array([8340, 11435, 12063, 14172, 15380, 15820, 18897, 20401, 22950, 27063],dtype=float)

        mlBotTemp = np.array([np.nan, 1.9535, 3.7707, 4.9644, 1.9219, 3.5011, 3.0759, 3.6202],dtype=float) 
        mlBotTime = np.array([np.nan, 13099, 16228, 17252, 20851, 21872, 23420, 24383],dtype=float) 

        mlTopTemp = np.array([np.nan, 0.8741, 0.0271, 0.2957, 0.0111, 0.3134, 0.1221, 0.0554],dtype=float) 
        mlTopTime = np.array([np.nan, 13054, 16336, 17156, 20917, 21792, 23492, 24281],dtype=float)

        mcsStg = np.array(['F','F', 'F', 'F', 'M', 'M', 'M', 'M'],dtype=str)

        sprlZone = np.array(['T','T', 'T', 'T', 'S', 'S', 'S', 'S'],dtype=str)

        CIP_intArvThrsh = np.array([np.nan, 2.7e-5, 2.7e-5, 3.4e-5, 3.3e-6, 9e-6, 2.5e-5, 2.5e-5],dtype=float) # Need value for new first spiral
        PIP_intArvThrsh = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        
        PIP_acptStartT = np.array([startT[0], startT[1], startT[2], startT[3], startT[4], startT[5],
                                   np.nan, np.nan], dtype=float)
        PIP_acptEndT = np.array([endT[0], 12798, endT[2], 17067, endT[4], 21659,
                                 np.nan, np.nan],dtype=float)
        PIP_rjctStartT = np.array([np.nan, 12799, np.nan, 17068, np.nan, 21660,
                                  startT[6], startT[7]],dtype=float)
        PIP_rjctEndT = np.array([np.nan, endT[1], np.nan, endT[3], np.nan, endT[5],
                                endT[6], endT[7]],dtype=float)

    elif flight == '20150709':
        ## Flight-level data parameters
        flFile = '20150709I1_AC.nc'
        dewPtSens = 'TDM.2'
        altSens = 'AltGPS.3'
        wsSens = 'WS.d'


        ## Microphysics parameters
        startT = np.array([8857, 9584, 10643, 11371, 12769, 13665, 14517, 15379, 
                           16585, 17482,19045, 19960, 20891, 21834, 22729, 23546],dtype=float)
        endT = np.array([9582, 10417, 11369, 12160, 13532, 14516, 15377, 16150, 
                         17481, 18226, 19959, 20687, 21833, 22363, 23544, 24074],dtype=float)
        
        # Start and end times of PDDs in seconds
        PDDstartT = np.array([5975, 7245, 8433, 10404, 12117, 16351, 18316, 18695, 20694, 22451, 24082],dtype=float)
        PDDendT = np.array([7161, 8330, 8847, 10656, 12720, 16602, 18574, 18876, 20885, 22717, 24732],dtype=float)

        mlBotTemp = np.array([0.827, 2.76, 1.584, 2.2527, 2.8054, 4.7628, 3.823, 5.7988, 3.7277, 
                              5.6487, 2.3316, 4.7067, 3.6857, 4.9586, 2.5909, 5.7844],dtype=float)
        mlBotTime = np.array([9166, 10102, 10997, 11769, 13072, 14202, 14867, 15861, 16956, 17932, 
                              19429, 20445, 21312, 22169, 23075, 23942],dtype=float)

        mlTopTemp = np.array([0.0104, 0.0034, 0.0423, 0.1119, 0.4757, 3.4426, 1.3057, 2.5534, 0.4398, 
                              2.0643, 0.0656, 1.5315, 0.6095, 2.740, 0.6454, 2.5692],dtype=float)
        mlTopTime = np.array([9185, 10028, 11036, 11711, 13146, 14163, 14903, 15820, 17038, 
                              17866, 19494, 20391, 21391, 22136, 23121, 23882],dtype=float)

        mcsStg = np.array(['F', 'F', 'F', 'F', 'F', 'M', 'M', 'M', 'M',
                           'M', 'M', 'M', 'M', 'M', 'M', 'M'],dtype=str)

        sprlZone = np.array(['T', 'T', 'T', 'T', 'S', 'S', 'S', 'S', 'S', 
                             'S', 'S', 'S', 'S', 'S', 'S', 'S'],dtype=str)

        CIP_intArvThrsh = np.array([6.9e-5, 5.4e-5 ,6.9e-5, 3.4e-5, 3.4e-5, 2.7e-5, 1e-4, 8.7e-5, 4.3e-5, 
                                    1e-4, 3.4e-5, 3.4e-5, 3.4e-5, 2.7e-5, 3.4e-5, 3.4e-5],dtype=float)
        PIP_intArvThrsh = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 
                                   np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],dtype=float)
        
        PIP_acptStartT = np.array([startT[0], startT[1], 11042, startT[3], startT[4], startT[5], 14891, startT[7], startT[8], 
                                   startT[9], startT[10], startT[11], 21125.96, startT[13], 22825, startT[15]], dtype=float)
        PIP_acptEndT = np.array([endT[0], 9916, endT[2], 11708, endT[4], 14186, endT[6], 15778, endT[8], 
                                   17845, endT[10], 20372, endT[12], 21986, endT[14], 23677],dtype=float)
        PIP_rjctStartT = np.array([np.nan, 9933, startT[2], 11711, np.nan, 14235, startT[6], 15779, np.nan, 
                                   17845, np.nan, 20372, startT[12], 21986, startT[14], 23678],dtype=float)
        PIP_rjctEndT = np.array([np.nan, endT[1], 10996, endT[3], np.nan, endT[5], 14878, endT[7], np.nan, 
                                   endT[9], np.nan, endT[11], 21120, endT[13], 22818, endT[15]],dtype=float)

    else:
        sys.exit('The flight string provided is not valid')

    numSprls = len(startT)
    numPDDs = len(PDDstartT)

    
    ## Define flight-independent parameters
    # Variables used from flight-level data
    latSens = 'LatGPS.1'
    lonSens = 'LonGPS.1'
    tempSens = 'TA.d'
    rhSens = 'HUM_REL.d'
    spSens = 'PSM.2'
    dpSens = 'PQM.2'
    wSens = 'DPJ_WSZ'
    wind_xSens = 'UWX.d'
    wind_ySens = 'UWY.d'
    relWind_xSens = 'URX.d'
    relWind_ySens = 'URY.d'
    wdSens = 'WD.d'
    

    
    ## Create the netCDF file and define global/variable attributes
    rootGrp = Dataset((savePath + flight + '_PECANparams.nc'),'w',format='NETCDF4')
    rootGrp.set_fill_on()

    sprls = rootGrp.createDimension('sprls',numSprls)
    pdds = rootGrp.createDimension('pdds',numPDDs)

    sT = rootGrp.createVariable('startT','f8',('sprls',))
    eT = rootGrp.createVariable('endT','f8',('sprls',))
    PsT = rootGrp.createVariable('PDDstartT','f8',('pdds',))
    PeT = rootGrp.createVariable('PDDendT','f8',('pdds',))
    mlBtmp = rootGrp.createVariable('mlBotTemp','f8',('sprls',))
    mlBtime = rootGrp.createVariable('mlBotTime','f8',('sprls',))
    mlTtmp = rootGrp.createVariable('mlTopTemp','f8',('sprls',))
    mlTtime = rootGrp.createVariable('mlTopTime','f8',('sprls',))
    stg = rootGrp.createVariable('mcsStg','S1',('sprls',))
    zone = rootGrp.createVariable('sprlZone','S1',('sprls',))
    CiaT = rootGrp.createVariable('CIP_intArvThrsh','f8',('sprls',))
    PiaT = rootGrp.createVariable('PIP_intArvThrsh','f8',('sprls',))
    PAcptST = rootGrp.createVariable('PIP_acptStartT','f8',('sprls',))
    PAcptET = rootGrp.createVariable('PIP_acptEndT','f8',('sprls',))
    PRjctST = rootGrp.createVariable('PIP_rjctStartT','f8',('sprls',))
    PRjctET = rootGrp.createVariable('PIP_rjctEndT','f8',('sprls',))

    # Global attributes
    rootGrp.description = 'Flight- and spiral-specific PECAN microphysics parameters'
    rootGrp.flight = flight
    rootGrp.history = 'Created ' + time.asctime(time.gmtime()) + ' UTC'
    rootGrp.FL_rawFile = flFile
    rootGrp.FL_procFile = flight + '_FltLvl_Processed.nc'
    rootGrp.FL_dwptSens = dewPtSens
    rootGrp.FL_altSens = altSens
    rootGrp.FL_latSens = latSens
    rootGrp.FL_lonSens = lonSens
    rootGrp.FL_tempSens = tempSens
    rootGrp.FL_rhSens = rhSens
    rootGrp.FL_spSens = spSens
    rootGrp.FL_dpSens = dpSens
    rootGrp.FL_wSens = wSens
    rootGrp.FL_wind_xSens = wind_xSens
    rootGrp.FL_wind_ySens = wind_ySens
    rootGrp.FL_relWind_xSens = relWind_xSens
    rootGrp.FL_relWind_ySens = relWind_ySens
    rootGrp.FL_wdSens = wdSens
    rootGrp.FL_wsSens = wsSens


    sT.description = 'Time spiral began'
    sT.units = 'Seconds since midnight UTC'
    sT._Fill_Value = np.nan

    eT.description = 'Time spiral ended'
    eT.units = 'Seconds since midnight UTC'
    eT._Fill_Value = np.nan
    
    PsT.description = 'Time PDD began'
    PsT.units = 'Seconds since midnight UTC'
    PsT._Fill_Value = np.nan

    PeT.description = 'Time PDD ended'
    PeT.units = 'Seconds since midnight UTC'
    PeT._Fill_Value = np.nan

    mlBtmp.long_name = 'Melting layer bottom temperature'
    mlBtmp.description = 'Temperature where last evidence of ice was observed in spiral'
    mlBtmp.units = 'deg C'
    mlBtmp._Fill_Value = np.nan

    mlBtime.long_name = 'Melting layer bottom time'
    mlBtime.description = 'Time when last evidence of ice was observed in spiral'
    mlBtime.units = 'Seconds since midnight UTC'
    mlBtime._Fill_Value = np.nan

    mlTtmp.long_name = 'Melting layer top temperature'
    mlTtmp.description = 'Temperature where first evidence of liquid water was observed in spiral'
    mlTtmp.units = 'deg C'
    mlTtmp._Fill_Value = np.nan

    mlTtime.long_name = 'Melting layer top time'
    mlTtime.description = 'Time when first evidence of liquid water was observed in spiral'
    mlTtime.units = 'Seconds since midnight UTC'
    mlTtime._Fill_Value = np.nan

    stg.description = 'MCS stage of evolution at time of spiral'
    stg.units = 'F = formative; M = mature; W = weakening; U = Unclassified'

    zone.description = 'Location of spiral relative to MCS structure'
    zone.units = 'T = Transition Zone; S = Enhanced Stratiform Region; A = Rear Anvil; U = Unclassified'

    CiaT.description = 'Thresholds of CIP particle interarrival time (in seconds) for each spiral below which particles are to be considered shattered'
    CiaT.units = 'seconds'
    CiaT._Fill_Value = np.nan

    PiaT.description = 'Thresholds of PIP particle interarrival time (in seconds) for each spiral below which particles are to be considered shattered'
    PiaT.units = 'seconds'
    PiaT._Fill_Value = np.nan
    
    PAcptST.description = 'Start time of good PIP data for each spiral'
    PAcptST.units = 'Seconds since midnight UTC'
    PAcptST._Fill_Value = np.nan
    
    PAcptET.description = 'End time of good PIP data for each spiral'
    PAcptET.units = 'Seconds since midnight UTC'
    PAcptET._Fill_Value = np.nan
    
    PRjctST.description = 'Start time of bad PIP data for each spiral'
    PRjctST.units = 'Seconds since midnight UTC'
    PRjctST._Fill_Value = np.nan
    
    PRjctET.description = 'End time of bad PIP data for each spiral'
    PRjctET.units = 'Seconds since midnight UTC'
    PRjctET._Fill_Value = np.nan

    
    ## Write variables to file
    sT[:] = startT
    eT[:] = endT
    PsT[:] = PDDstartT
    PeT[:] = PDDendT
    mlBtmp[:] = mlBotTemp
    mlBtime[:] = mlBotTime
    mlTtmp[:] = mlTopTemp
    mlTtime[:] = mlTopTime
    stg[:] = mcsStg
    zone[:] = sprlZone
    CiaT[:] = CIP_intArvThrsh
    PiaT[:] = PIP_intArvThrsh
    PAcptST[:] = PIP_acptStartT
    PAcptET[:] = PIP_acptEndT
    PRjctST[:] = PIP_rjctStartT
    PRjctET[:] = PIP_rjctEndT

    rootGrp.close()