Changeset 368


Ignore:
Timestamp:
04/11/05 00:54:35 (14 years ago)
Author:
astephen
Message:

Updates for correctly converting and reducing volume of FAAM flight data using the localRules/aircraftData.py module.

Location:
nappy/trunk
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • nappy/trunk/bin/nc2na

    r366 r368  
    1414===== 
    1515 
    16     nc2na [-v <var_list>] [-j] [-f <float_format>] [-s <spacer>] [-e <ex_var_list>] [<overwrite_global_metadata>] -i <infilename> -o <outfilename> 
     16    nc2na [-v <var_list>] [-r <rulename>[,<ruletype>[,<ra1>[,<ra2>[,<ra3>]]]]]] [-j] [-f <float_format>]  
     17              [-s <spacer>] [-d <DATE>] [-l <limitFFI1001Rows>]  
     18              [-e <ex_var_list>] [<overwrite_global_metadata>] -i <infilename> -o <outfilename> 
    1719 
    1820Where 
     
    2224    outfilename - name of output file (NASA Ames). 
    2325    varlist     - a comma separated list of variables to include in the output file. 
     26    -r          - provide rule arguments for calling additional routines held in nappy/rules sub-package. 
     27                  example call would be "-r aircraft,av,1,1f,2f,3f" telling nappy to call rules/aircraftData.py 
     28                  and interpret the rest of the arguments when called. 
     29    limitFFI1001Rows - if format FFI is 1001 then chop files up into <limitFFI1001Rows> rows of data. 
    2430    -j          - just display file names that would be produced - without creating files. 
     31    -s          - resample data to per-second for aircraft data.      
    2532    floatformat - a python formatting string such as %s or %5.2f 
    2633    spacer      - the spacer you wish to use between data items in the output file such as "   " or "\t" 
    27     options     - list of options [NOT YET IMPLEMENTED]. 
    28                 - "RDATE", "ANAME", "MNAME", 
    29            "ONAME", "ORG", "SNAME", "VNAME" 
     34    DATE    - to replace first valid Date of data ("DATE") in the file.  
     35    overwrite_global_metadata           -  one of "DATE", "RDATE", "ANAME", "MNAME", 
     36           "ONAME", "ORG", "SNAME", "VNAME" followed by "=<overwrite_value>". 
    3037     
    3138""" 
     
    5057 
    5158    nFilesOnly="no" 
     59    rule=None 
    5260    spacer="    " 
     61    sizeLimit=None 
    5362    floatFormat="%8.3f"  
    5463    naVars={} 
     64 
    5565    for arg in args: 
    5666        if arg=="-i": 
     
    6272        elif arg=="-j": 
    6373            nFilesOnly="yes" 
     74        elif arg=="-r": 
     75            rule=args[args.index(arg)+1].split(",") 
    6476        elif arg=="-s": 
    6577            spacer=args[args.index(arg)+1]           
    66         elif arg=="-f": 
     78        elif arg=="-d": 
    6779            naVars["DATE"]=args[args.index(arg)+1]           
     80        elif arg=="-l": 
     81            sizeLimit=long(args[args.index(arg)+1]) 
    6882        elif arg[0]=="-" and arg[1:] in allowedOverwriteMetadata: 
    6983            naVars[arg[1:]]=args[args.index(arg)+1] 
     
    7185            variables=args[args.index(arg)+1].split(",") 
    7286 
    73     rtvalue=cdms2na(infile, outfile, naVars, variables, nFilesOnly, spacer=spacer, floatFormat=floatFormat)  
     87    rtvalue=cdms2na(infile, outfile, naVars, variables, nFilesOnly, sizeLimit=sizeLimit, rule=rule, spacer=spacer,  
     88floatFormat=floatFormat)  
    7489    if nFilesOnly=="yes": 
    7590        print "\n\nOutput files would be:" 
  • nappy/trunk/cdms2na.py

    r366 r368  
    2121    infilename  - name of input file (NetCDF). 
    2222    outfilename - name of output file (NASA Ames). 
    23     options     - list of options [NOT YET IMPLEMENTED]. 
     23    options     - list of options. 
    2424     
    2525""" 
     
    133133    if hasattr(var, "name"): name=var.name 
    134134    if hasattr(var, "title"): name=var.title 
     135    if hasattr(var, "standard_name"): name=var.standard_name 
    135136    if hasattr(var, "long_name"): name=var.long_name 
    136     if hasattr(var, "standard_name"): name=var.standard_name 
     137    #if hasattr(var, "standard_name"): name=var.standard_name 
    137138     
    138139    if hasattr(var, "has_key"): 
     
    141142        if var.has_key("name"): name=var["name"] 
    142143        if var.has_key("title"): name=var["title"]       
     144        if var.has_key("standard_name"): name=var["standard_name"] 
    143145        if var.has_key("long_name"): name=var["long_name"] 
    144         if var.has_key("standard_name"): name=var["standard_name"]    
     146        #if var.has_key("standard_name"): name=var["standard_name"]    
    145147     
    146148    if hasattr(var, "units") and not re.match("^\s+$", var.units):  
    147         name="%s (%s)" % (name, var.units)     
     149        units=var.units.strip() 
     150        name="%s (%s)" % (name, units)     
    148151        # Do a check to see units are not duplicated 
    149152        # [The regex below failed because it interpreted 'm**2' as 
     
    152155        #if match: 
    153156        #    name=match.groups()[0]+match.groups()[1] 
    154         if name.count("(%s)" % var.units)>1: 
    155             name=name.replace("(%s)" % var.units, "") 
    156             name="%s (%s)" % (name, var.units) 
     157        if name.count("(%s)" % units)>1: 
     158            name=name.replace("(%s)" % units, "") 
     159            name="%s (%s)" % (name, units) 
    157160         
    158161    if name[-2:]=="()": name=name[:-2] 
     
    166169    miss=None 
    167170    if hasattr(var, "missing_value"): miss=var.missing_value 
     171    if hasattr(var, "_fill_value"): miss=var._fill_value 
    168172    # if hasattr(var, "fill_value"): miss=var.fill_value  # returns an array???? 
    169173    if hasattr(var, "_FillValue"): miss=var._FillValue 
    170174    if miss==None: 
    171         return 1.E20 
    172     else: 
    173         return miss 
     175        try: 
     176            miss=var.getMissing() 
     177        except: 
     178            miss=1.E20 
     179    return miss 
    174180 
    175181 
     
    195201          sys.stdout.write(line) 
    196202 
    197  
    198 def cdms2na(infilename, outfilenames, naVars={}, variables=None, nFilesOnly="no", ffi="automatic", spacer="    ", floatFormat="%8.3f", rules=None): 
     203def flatten2DTimeData(var, timevar): 
     204    """ 
     205    Returns a flattened 2D array variable with a recalculated time axies. 
     206    """ 
     207    import MV, cdtime 
     208    data=MV.ravel(var) 
     209    missing=var.getMissing() 
     210 
     211    timevalues=timevar._data 
     212    timeunit=timevar.units 
     213    samprate=var.getAxis(1) 
     214    rate=int(samprate.id[3:]) 
     215    newTimeValues=[] 
     216 
     217    for t in timevalues: 
     218        for i in range(rate): 
     219            tvalue=t+((1./rate)*i) 
     220            newTimeValues.append(tvalue) 
     221 
     222    newTimeAx=cdms.createAxis(newTimeValues) 
     223    newTimeAx.units=timeunit 
     224    newTimeAx.designateTime() 
     225    newTimeAx.id=newTimeAx.long_name=newTimeAx.standard_name="time" 
     226 
     227    atts=var.attributes 
     228    newAtts={} 
     229    for att,value in atts.items(): 
     230        if type(value) in (type((1,1)), type([1,2]), type(Numeric.array([1.]))) and len(value)==1: 
     231            value=value[0] 
     232        if type(value) in (type(1), type(1.), type(long(1))): 
     233            newAtts[att]=value 
     234        elif type(value)==type(""): 
     235            newAtts[att]=value.strip() 
     236 
     237    # Now create the variable 
     238    newvar=cdms.createVariable(data, id=var.id, fill_value=missing, axes=[newTimeAx], attributes=newAtts) 
     239    return newvar 
     240 
     241 
     242def modifyNADictCopy(indict, v_new, start, end, ivol, nvol): 
     243    """ 
     244    Returns a copy of a dictionary with some modifications. 
     245    """ 
     246    newDict={} 
     247    for key,value in indict.items():  
     248        if key=="X": 
     249            newlist=indict["X"][start:end] 
     250            newDict["X"]=newlist 
     251        elif key=="V": 
     252            newDict["V"]=v_new 
     253        elif key=="IVOL": 
     254            newDict["IVOL"]=ivol 
     255        elif key=="NVOL": 
     256            newDict["NVOL"]=nvol 
     257        else: 
     258            newDict[key]=value 
     259    return newDict 
     260 
     261 
     262def cdms2na(infilename, outfilenames, naVars={}, variables=None, nFilesOnly="no",  
     263            rule=None, ffi="automatic", spacer="    ", floatFormat="%8.3f",  
     264            rules=None, sizeLimit=None): 
    199265    """ 
    200266    Main conversion function that calls the appropriate classes and functions 
    201267    to write a NASA Ames file. 
    202268    """ 
    203     print infilename, outfilenames, nFilesOnly, naVars, variables 
     269    #print infilename, outfilenames, nFilesOnly, naVars, variables 
    204270    if type(outfilenames)==type(""): outfilenames=[outfilenames] 
    205271     
     
    216282    # VNAME strings - var names. 
    217283    outputMessage=[] 
    218     msg="Reading data from: %s" % infilename 
     284    msg="Reading data from: %s\n" % infilename 
    219285    print msg 
    220286    outputMessage.append(msg) 
     
    236302                #print varMetadata, varValue, varMetadata.keys(), varMetadata._obj_.id 
    237303                varObj=cdms.createVariable(Numeric.array(varObj), id=getBestName(varMetadata).replace(" ", "_"), attributes=varMetadata) 
     304                #print varObj, dir(varObj); sys.exit() 
     305                varObj.value=varObj._data[0] 
    238306                #varObj.rank=0 
    239307                 
     
    259327    vars=vars+otherVars 
    260328     
    261     builder=CdmsToNABuilder(vars, globals) 
     329    builder=CdmsToNABuilder(vars, globals, rule=rule, cdmsfile=cdmsfile) 
    262330    #print builder.naDict["X"] 
    263331    builtNADicts=[[builder.naDict, builder.varIDs]] 
     332    if builder.varIDs==None: 
     333        msg="\nNo files created after variables parsed." 
     334        print msg 
     335        outputMessage.append(msg) 
     336        return outputMessage 
     337 
    264338    while len(builder.varBin)>0: 
    265         builder=CdmsToNABuilder(builder.varBin, globals) 
     339        builder=CdmsToNABuilder(builder.varBin, globals, rule=rule, cdmsfile=cdmsfile) 
    266340        outputMessage=outputMessage+builder.outputMessage 
    267         builtNADicts.append([builder.naDict, builder.varIDs]) 
     341        if builder.varIDs!=None:  builtNADicts.append([builder.naDict, builder.varIDs]) 
    268342 
    269343    # Return only filenames if only want to know them now. 
    270     count=1     
     344    ncount=1 
    271345    fileNames=[] 
    272346    if nFilesOnly=="yes":  
     
    275349                suffix="" 
    276350            else: 
    277                 suffix="_%s" % count 
     351                suffix="_%s" % ncount 
    278352            nameparts=outfilenames[0].split(".")     
    279353            newname=(".".join(nameparts[:-1]))+suffix+"."+nameparts[-1] 
    280354            fileNames.append(newname) 
    281             count=count+1            
     355        ncount=ncount+1 
    282356             
    283357        return fileNames 
    284358                 
    285     msg="%s files to write" % len(builtNADicts) 
     359    msg="\n%s files to write" % len(builtNADicts) 
    286360    print msg 
    287361    outputMessage.append(msg) 
    288362 
    289363    count=1 
     364    ncount=1 
    290365    for i in builtNADicts: 
    291366        if len(outfilenames)==1: 
     
    293368                suffix="" 
    294369            else: 
    295                 suffix="_%s" % count 
     370                suffix="_%s" % ncount 
    296371            nameparts=outfilenames[0].split(".")     
    297372            newname=(".".join(nameparts[:-1]))+suffix+"."+nameparts[-1] 
     
    317392                    print msg 
    318393                    outputMessage.append(msg) 
    319                  
    320         general.openNAFile(newname, 'w', builtNADict, spacer=spacer, floatFormat=floatFormat) 
     394         
     395        fileList=[] 
     396        # Cope with size limits if specified and FFI is 1001 
     397        if sizeLimit and (builtNADict["FFI"]==1001 and len(builtNADict["V"][0])>sizeLimit): 
     398            varList=builtNADict["V"] 
     399            arrayLength=len(varList[0]) 
     400            nvolInfo=divmod(arrayLength, sizeLimit) 
     401            nvol=nvolInfo[0] 
     402            if nvolInfo[1]>0: nvol=nvol+1 
     403            start=0 
     404            letterCount=0 
     405            ivol=0 
     406            while start<arrayLength: 
     407                ivol=ivol+1 
     408                end=start+sizeLimit 
     409                if end>arrayLength: 
     410                    end=arrayLength 
     411                currentBlock=[] 
     412                # Write new V array 
     413                for v in varList: 
     414                    currentBlock.append(v[start:end]) 
     415 
     416                # Adjust X accordingly 
     417                NADictCopy=modifyNADictCopy(builtNADict, currentBlock, start, end, ivol, nvol) 
     418                 
     419                # Write data to output file 
     420                newnamePlusLetter="%s-%.3d.na" % (newname[:-3], ivol) 
     421                fileList.append(newnamePlusLetter) 
     422                general.openNAFile(newnamePlusLetter, 'w', NADictCopy, spacer=spacer, floatFormat=floatFormat) 
     423                msg="\nOutput files split on size limit: %s\nFilename used: %s" % (sizeLimit, newnamePlusLetter) 
     424                print msg 
     425                outputMessage.append(msg) 
     426                letterCount=letterCount+1 
     427                start=end 
     428 
     429 
     430        else:            
     431            general.openNAFile(newname, 'w', builtNADict, spacer=spacer, floatFormat=floatFormat) 
    321432        #nlhead=fixHeaderLength(newname)   
    322         msg="\nWrote the following variables to this file:"+"\n\t"+("\n\t".join(i[1][0])) 
     433 
     434        msg="\nWrote the following variables:"+"\n\t"+("\n\t".join(i[1][0])) 
    323435        print msg 
    324436        outputMessage.append(msg) 
    325437         
    326438        if len(i[1][1])>0: 
    327             msg="\nWrote the following auxiliary variables to this file:" 
     439            msg="\nWrote the following auxiliary variables:" 
    328440            msg=msg+"\n\t"+("\n\t".join(i[1][1]))        
    329             msg=msg+"\nNASA Ames file written successfully: %s" % newname 
    330             print msg 
    331             outputMessage.append(msg) 
    332         count=count+1 
    333                
    334     msg="\n%s files written." % (count-1) 
     441             
     442        if len(i[1][2])>0: 
     443            msg="\nWrote the following Singleton variables:" 
     444            msg=msg+"\n\t"+("\n\t".join(i[1][2])) 
     445 
     446        if len(fileList)>0: 
     447            msg=msg+("\n\nNASA Ames files written successfully: \n%s" % "\n".join(fileList)) 
     448            count=count+len(fileList) 
     449        else: 
     450            msg=msg+"\n\nNASA Ames file written successfully: %s" % newname 
     451            count=count+1 
     452        ncount=ncount+1 
     453 
     454        print msg 
     455        outputMessage.append(msg) 
     456             
     457    if (count-1)==1: 
     458        plural="" 
     459    else: 
     460        plural="s"             
     461    msg="\n%s file%s written." % ((count-1), plural) 
    335462    print msg 
    336463    outputMessage.append(msg) 
     
    344471    """ 
    345472     
    346     def __init__(self, vars, global_attributes={}): 
     473    def __init__(self, vars, global_attributes={}, cdmsfile=None, rule=None): 
    347474        """ 
    348475        Sets up instance variables and calls appropriate methods to 
    349476        generate sections of NASA Ames file object. 
    350477        """ 
     478        self.rule=rule 
     479        self.cdmsfile=cdmsfile 
    351480        self.outputMessage=[] 
    352481        self.naDict={} 
    353482        self.vars=vars 
    354         self.globals=global_attributes 
     483        self.varIDs=None 
     484        self.globals=global_attributes   
     485        self.rankZeroVars=[] 
     486        self.rankZeroVarIDs=[] 
    355487        (self.orderedVars, auxVars)=self.analyseVariables() 
    356488        if self.orderedVars==None: 
    357             msg="All variables located." 
    358             print msg 
    359             outputMessage.append(msg) 
    360489            self.varBin=[] 
    361490        else: 
    362491            #print "NAMELISTS:", [var.id for var in self.orderedVars],[var.id for var in auxVars] 
    363             self.varIDs=[[var.id for var in self.orderedVars],[var.id for var in auxVars]] 
     492            self.varIDs=[[var.id for var in self.orderedVars],[var.id for var in auxVars], self.rankZeroVarIDs] 
    364493         
    365494            self.naDict["NLHEAD"]="-999" 
     
    385514        # Need to group the variables together in bins 
    386515        self.varBin=[] 
    387         self.rankZeroVars=[] 
    388         self.rankZeroVarIDs=[] 
    389516        # Get largest ranked variable as the one we use as standard 
    390517        highrank=-1 
     518        bestVar=None 
    391519        count=0 
    392520        for var in self.vars: 
     
    395523            self.outputMessage.append(msg) 
    396524            count=count+1 
    397             #print count 
    398             # Deal with singleton dimensions 
    399             #if callable(var.rank): 
    400             #    rank=var.rank() 
    401             #else: 
    402             #    rank=var.rank 
    403             #print var.id, var.rank() 
     525 
     526            # get rank 
    404527            rank=var.rank() 
     528 
     529            # Deal with specific datasets with special rules 
     530            if self.rule[0]=="aircraft": 
     531                var=self._useLocalRule(var, self.rule) 
     532                if type(var)==type(None):  
     533                    continue  
     534                rank=1 
     535 
     536            # Deal with singleton variables 
    405537            if rank==0:  
    406538                self.rankZeroVars.append(var) 
     
    409541             
    410542            if rank>highrank: 
    411                 highrank=rank 
     543                highrank=rank 
    412544                bestVar=var 
    413545                bestVarIndex=count 
     
    418550         
    419551        if len(self.rankZeroVars)==len(self.vars):  return (None, None) 
    420          
     552        if not bestVar:   
     553            print "No variables produced" 
     554            return (None, None) 
     555 
    421556        vars4NA=[bestVar] 
    422557        auxVars4NA=[] 
     
    442577        #print [v.id for v in self.vars[:bestVarIndex-1]+self.vars[bestVarIndex:]] 
    443578        for var in self.vars[:bestVarIndex-1]+self.vars[bestVarIndex:]: 
     579            # Deal with specific datasets with special rules 
     580            if self.rule[0]=="aircraft": 
     581                if var.rank()==2: 
     582                    var=self._useLocalRule(var, self.rule) 
     583                    if type(var)==type(None): continue 
     584 
    444585            #print self.rankZeroVars 
    445586            #for rzv in self.rankZeroVars:   
     
    626767 
    627768        self.extra_comments=[[],[],[]]  # Normal comments, special comments, other comments 
     769        conventionOrReferenceComments=[] 
    628770        for key in self.globals.keys(): 
    629771            if key!="first_valid_date_of_data" and type(self.globals[key]) not in (str, float, int): continue 
     
    631773                if key=="history": 
    632774                    timestring=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) 
    633                     self.history="History:\n\t%s - Converted to NASA Ames format using nappy-%s.\n\t%s" % (timestring, version.version, self.globals[key]) 
    634                     self.history=self.history.split("\n")  
     775                    history="History:\t%s - Converted to NASA Ames format using nappy-%s.\n\t%s" % (timestring, version.version, self.globals[key]) 
     776                    history=history.split("\n")  
     777                    self.history=[] 
     778                    for h in history: 
     779                        if h[:8]!="History:" and h[:1]!="\t": h="\t"+h 
     780                        self.history.append(h)  
    635781                     
    636782                elif key=="institution": 
     
    680826                 
    681827                elif key in ("Conventions", "references"): 
    682                     pass 
     828                    #conventionOrReferenceComments.append("%s:   %s" % (key, self.globals[key])) 
     829                    self.extra_comments[2].append("%s:   %s" % (key, self.globals[key])) 
    683830                else: 
    684831                    self.naDict[globalmap[key]]=self.globals[key] 
    685832            else: 
    686833                self.extra_comments[2].append("%s:   %s" % (key, self.globals[key])) 
     834        #self.extra_comments 
    687835        return 
    688836 
     
    729877 
    730878 
    731         used_var_atts=("name", "long_name", "standard_name", "id",  
    732                 "missing_value", "fill_value", "units",  
    733                 "nasa_ames_var_number", "nasa_ames_aux_var_number") 
     879        #used_var_atts=("name", "long_name", "standard_name", "id",  
     880            #    "missing_value", "fill_value", "units",  
     881                #"nasa_ames_var_number", "nasa_ames_aux_var_number") 
     882        used_var_atts=("id",  "missing_value", "fill_value", "units",  
     883                   "nasa_ames_var_number", "nasa_ames_aux_var_number") 
    734884        varCommentsFlag=None 
    735885 
     
    737887        rankZeroVarsString=[] 
    738888        for var in self.rankZeroVars: 
    739             rankZeroVarsString.append("\tVariable (%s): %s" % (var.id, getBestName(var))) 
     889            rankZeroVarsString.append("\tVariable %s: %s" % (var.id, getBestName(var))) 
    740890            for att in var.attributes.keys(): 
    741891                value=var.attributes[att] 
     
    751901            varflag="unused" 
    752902            name=getBestName(var) 
    753             for scom in var.attributes.keys(): 
    754                 if type(scom) in (str, float, int) and scom not in used_var_atts: 
     903            for scom,value in var.attributes.items(): 
     904                if type(value) in (type([]), type(Numeric.array([0]))) and len(value)==1: 
     905                    value=value[0] 
     906                if type(value) in (str, float, int) and scom not in used_var_atts: 
    755907                    if varflag=="unused": 
    756908                        if varCommentsFlag==None: 
     
    761913                            SCOM.append("###Variable attributes from source (NetCDF) file follow###") 
    762914                        varflag="using"  
    763                         SCOM.append("\tVariable (%s): %s" % (var.id, name)) 
    764                     SCOM.append("\t\t%s = %s" % (scom, var.attributes[scom])) 
     915                        SCOM.append("\tVariable %s: %s" % (var.id, name)) 
     916                    SCOM.append("\t\t%s = %s" % (scom, value)) 
     917 
    765918        if varCommentsFlag==1:  SCOM.append("###Variable attributes from source (NetCDF) file end###") 
    766919        if specCommentsFlag==1: 
     
    769922        """used_var_atts=("name", "long_name", "standard_name", "id", "missing_value", "fill_value", "units") 
    770923        for var in self.vars: 
    771             for scom in var.attributes.keys(): 
     924            for scom,value in var.attributes.items(): 
    772925                name=getBestName(var) 
    773                 if type(scom) in (str, float, int) and scom not in used_var_atts: 
    774                     SCOM.append("\t%s: %s - %s" % (name, scom, var.attributes[scom]))""" 
     926                if type(value) in (str, float, int) and scom not in used_var_atts: 
     927                    SCOM.append("\t%s: %s - %s" % (name, scom, value))""" 
    775928 
    776929        # Strip out empty lines (or returns) 
    777930        NCOM_cleaned=[] 
    778931        SCOM_cleaned=[] 
     932        #hiddenNewLineCount1=0 
    779933        for c in NCOM: 
    780             if c.strip() not in ("", " ", "  "): NCOM_cleaned.append(c) 
     934            if c.strip() not in ("", " ", "  "): 
     935                #hiddenNewLineCount1=hiddenNewLineCount1+c.count("\n") 
     936                # Replace new lines within one attribute with a newline and tab so easier to read 
     937                lines=c.split("\n") 
     938                for line in lines: 
     939                    if line!=lines[0]: line="\t"+line 
     940                    NCOM_cleaned.append(line) 
     941                 
     942        #hiddenNewLineCount2=0   
    781943        for c in SCOM: 
    782             if c.strip() not in ("", " ", "  "): SCOM_cleaned.append(c) 
    783  
     944            if c.strip() not in ("", " ", "  "):                 
     945                #hiddenNewLineCount2=hiddenNewLineCount2+c.count("\n") 
     946                # Replace new lines within one attribute with a newline and tab so easier to read 
     947                #c=c.replace("\n", "\n\t") 
     948                #SCOM_cleaned.append(c) 
     949                lines=c.split("\n") 
     950                for line in lines: 
     951                    if line!=lines[0]: line="\t"+line 
     952                    SCOM_cleaned.append(line) 
     953                     
    784954        self.naDict["NCOM"]=NCOM_cleaned 
    785         self.naDict["NNCOML"]=len(self.naDict["NCOM"]) 
     955        self.naDict["NNCOML"]=len(self.naDict["NCOM"])#+hiddenNewLineCount1 
    786956        self.naDict["SCOM"]=SCOM_cleaned 
    787         self.naDict["NSCOML"]=len(self.naDict["SCOM"]) 
     957        self.naDict["NSCOML"]=len(self.naDict["SCOM"])#+hiddenNewLineCount2 
    788958        return 
    789959 
     
    822992             self.naDict[key]=header_items[key] 
    823993        return 
     994 
     995 
     996    def _useLocalRule(self, var, ruleArgs): 
     997        """ 
     998        Applies some logic based on a local rule. 
     999        """ 
     1000        ruleName=ruleArgs[0] 
     1001        rule=ruleArgs 
     1002        if ruleName=="aircraft": 
     1003            # Fixes aircraft data 2D time axis, missing values and does sub-selection by default 
     1004            flagVar=None 
     1005 
     1006            # return if variable is time 
     1007            if var.id=="Time": 
     1008                return None 
     1009 
     1010            if len(rule)<2: rule.append("av") 
     1011            if len(rule)<3: rule.append("flag") 
     1012            if rule[2]=="flag": 
     1013                # Only use flag var for processing real variable 
     1014                if var.id.strip()[-4:]=="FLAG":  
     1015                    print "Ignore flag: %s" % var.id 
     1016                    return None  
     1017 
     1018                flagID=var.id.strip()+"FLAG" 
     1019                try: 
     1020                    flagVar=self.cdmsfile(flagID) 
     1021                except: 
     1022                    raise "Cannot get flag variable for '%s'" % var.id 
     1023            elif rule[2]=="noflag": 
     1024                flagVar=None 
     1025 
     1026            timeVar=self.cdmsfile("Time") 
     1027            import localRules.aircraftData 
     1028            ruleArgs=[rule[1]]+rule[3:] 
     1029            fixedVar=localRules.aircraftData.AircraftData(var, timeVar, flagVar, ruleArgs).subSampledVar 
     1030            return fixedVar 
     1031        else: 
     1032            raise "Rule '%s' not yet defined." % ruleName 
    8241033                 
    8251034 
  • nappy/trunk/naToCdms.py

    r366 r368  
    3535 
    3636# Define global variables 
    37 safe_nc_id=re.compile("[\s\[\(\)\]\=\+\-\?\#\~\@\&\$\%\!\*\{\}\^]+") 
     37safe_nc_id=re.compile("[\/\s\[\(\)\]\=\+\-\?\#\~\@\&\$\%\!\*\{\}\^]+") 
    3838 
    3939time_units_pattn=re.compile("\w+\s+since\s+\d{4}-\d{1,2}-\d{1,2}\s+\d+:\d+:\d+") 
     
    8181        # Read the data section of the NASA Ames file 
    8282        self.readData() 
     83        print "Reading in data..." 
    8384        self.cdmsFilename=filename 
    8485        self.cdmsFile=cdms.open(self.cdmsFilename, 'w') 
  • nappy/trunk/version.py

    r366 r368  
    1111""" 
    1212 
    13 version="0.0.1.9" 
     13version="0.0.2.0" 
    1414 
Note: See TracChangeset for help on using the changeset viewer.