Ignore:
Timestamp:
05/11/04 12:57:38 (15 years ago)
Author:
selatham
Message:

Incorporates changes by selatham and Ag Stephens. as of 5/11/04.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • nappy/trunk/naToCdms.py

    r343 r347  
    1818import cdmsMap 
    1919from naError import * 
     20import version 
    2021 
    2122# Import external packages (if available) 
     
    2425else: 
    2526    try: 
    26         import cdms, Numeric  
     27        import cdms, Numeric 
     28        cdms.setAutoBounds("off")  
    2729    except: 
    2830        print "Cannot import cdms package, CDAT-dependent features will not work." 
    2931 
    3032# Define global variables 
    31 safe_nc_id=re.compile("[\s\[\(\)\]\=\+\-\?\#\~\@\&\$\%\£\!\*\{\}]+") 
     33safe_nc_id=re.compile("[\s\[()\]=+-?#~@&$%!*{}\^]+") 
     34time_units_pattn=re.compile("\w+\s+since\s+\d{4}-\d{1,2}-\d{1,2}\s+\d+:\d+:\d+") 
    3235 
    3336class NAToCdms: 
    3437 
    35     def toCdmsFile(self, filename, variables="all", aux_variable="all", global_attributes={"Conventions":"CF-1.0"}, ffi=None): 
    36         if sys.platform.find("win")>-1: 
    37             raise NAPlatformError 
    38  
     38    def toCdmsFile(self, filename, time_units=None, variables="all", aux_variable="all", global_attributes={"Conventions":"CF-1.0"}, ffi=None): 
     39        if sys.platform.find("win")>-1: 
     40            raise NAPlatformError 
     41 
     42        self.time_units=time_units 
     43        # Read the data section of the NASA Ames file 
     44        self.readData() 
    3945        self.cdmsFilename=filename 
    4046        self.cdmsFile=cdms.open(self.cdmsFilename, 'w') 
     
    4450            setattr(self.cdmsFile, key, global_attributes[key]) 
    4551 
    46         for key in cdmsMap.cdmsMap["fromNA"].keys(): 
     52        for key in cdmsMap.fromNA.keys(): 
    4753            if type(key)==tuple: 
    4854                if key==("SCOM", "NCOM"): 
    49                     commentline="NASA Ames Special Comments:\n" 
    50                     for i in self.SCOM: commentline=commentline+"\n"+i 
    51                     commentline=commentline+"NASA Ames Normal Comments:\n" 
    52                     for i in self.NCOM: commentline=commentline+"\n"+i 
     55                    # Map special and normal comments into the global comments section 
     56                     
     57                    commentline="" 
     58                    if self.NSCOML>0: 
     59                        commentline=commentline+"###NASA Ames Special Comments follow###\n" 
     60                        for i in self.SCOM:  
     61                            if i.strip() not in ("###NASA Ames Special Comments follow###", "###NASA Ames Special Comments end###", 
     62                                    "Additional Variable Attributes defined in the source file and not translated elsewhere:", 
     63                                    "Additional Global Attributes defined in the source file and not translated elsewhere:", "\n"): 
     64                                commentline=commentline+"\n"+i 
     65                        commentline=commentline+"\n###NASA Ames Special Comments end###\n" 
     66                    if self.NNCOML>0: 
     67                        commentline=commentline+"###NASA Ames Normal Comments follow###\n" 
     68                        for i in self.NCOM:  
     69                            if i.strip() not in ("###NASA Ames Normal Comments follow###", "###NASA Ames Normal Comments end###", "###Data Section begins on the next line###", 
     70                                    "Additional Variable Attributes defined in the source file and not translated elsewhere:", 
     71                                    "Additional Global Attributes defined in the source file and not translated elsewhere:", "\n"): 
     72                                commentline=commentline+"\n"+i 
     73                        commentline=commentline+"\n###NASA Ames Normal Comments end###" 
     74                        commentline=commentline.replace("\n\n", "\n") 
    5375                    self.cdmsFile.comment=commentline 
     76                elif key==("ONAME", "ORG"): 
     77                    # Map the two organisation NA files to the institution field in CDMS (NetCDF) 
     78                    self.cdmsFile.institution="%s (ONAME from NASA Ames file); %s (ORG from NASA Ames file)." % (self.ONAME, self.ORG) 
    5479                else: 
    5580                    item=(getattr(self, key[0]))+"\n"+(getattr(self, key[1])) 
    56                     setattr(self.cdmsFile, cdmsMap.cdmsMap["fromNA"][key], item) 
     81                    setattr(self.cdmsFile, cdmsMap.fromNA[key], item) 
    5782            elif key=="RDATE": 
    5883                dateparts=getattr(self, "RDATE") 
     
    6085                item=datestring+" - NASA Ames File created/revised.\n" 
    6186                timestring=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) 
    62                 item=item+"\n"+timestring+" - Data written to NetCDF file." 
     87                item=item+"\n"+timestring+" - Converted to CDMS (NetCDF) format using nappy-%s." % version.version 
    6388            else: 
    64                 setattr(self.cdmsFile, cdmsMap.cdmsMap["fromNA"][key], getattr(self, key)) 
     89                setattr(self.cdmsFile, cdmsMap.fromNA[key], getattr(self, key)) 
    6590 
    6691        # Then do dimensions 
     
    91116            raise NAPlatformError 
    92117        (varname, units, miss, scal)=self.getVariable(var_number) 
    93  
     118        print self.V 
    94119        array=Numeric.array(self.V[var_number]) 
    95120        array=array*scal 
     
    103128        # Sort units etc 
    104129        if units:   var.units=units 
     130         
     131        # Add the best variable name 
    105132        if len(varname)<20: 
    106133            var.id=safe_nc_id.sub("_", varname).lower() 
     
    109136 
    110137        var.long_name=var.name=varname 
     138 
     139        # If we have a standard name list then compare to it 
    111140        if varname in ("standard_name_list",) or varname in ("badc_list",): 
    112             var.standard_name="name from the list*****" 
     141            var.standard_name="name from the list###**" 
     142 
     143        # Add a NASA Ames variable number (for mapping correctly back to NASA Ames) 
     144        var.nasa_ames_var_number=var_number 
    113145 
    114146        return var 
     
    142174        var.long_name=var.name=varname 
    143175        if varname in ("standard_name_list",) or varname in ("badc_list",): 
    144             var.standard_name="name from the list*****" 
     176            var.standard_name="name from the list***" 
     177 
     178 
     179        # Add a NASA Ames auxiliary variable number (for mapping correctly back to NASA Ames) 
     180        var.nasa_ames_aux_var_number=avar_number 
    145181 
    146182        return var         
     
    182218                axis.standard_name=axis.id=axis_type 
    183219                apply(designators[axis_type.lower()]) 
     220                # Check warning for time units pattern 
     221                if axis.isTime() and (not hasattr(axis, "units") or not time_units_pattn.match(axis.units)): 
     222                    if self.time_units==None: 
     223                        print """\nWARNING: Could not recognise time units. For true NetCDF compability 
     224please insert the correct time unit string below in the format: 
     225     
     226    <units> since <YYYY>-<MM>-<DD> <hh>-<mm>-<ss> 
     227     
     228Where: 
     229    <units> is a known time interval such as years, months, days, etc. 
     230    <YYYY> is the year, <MM> is the month, <DD> is the day, 
     231    <hh> is the hour, <mm> is minutes, <ss> is seconds. 
     232""" 
     233                        timeUnitsInput="I WON'T MATCH" 
     234                        while timeUnitsInput!="" and not time_units_pattn.match(timeUnitsInput): 
     235                            timeUnitsInput=raw_input("Please insert your time unit string here (or leave blank):").strip() 
     236                        if timeUnitsInput!="": 
     237                            self.time_units=timeUnitsInput 
     238                    axis.units=self.time_units 
     239                    axis.long_name=axis.name="time (%s)" % self.time_units 
     240                 
    184241        return axis 
    185242 
     243 
     244class NA2Cdms(NAToCdms): 
     245    """ 
     246    Pseudonym for NAToCdms class. 
     247    """ 
     248    pass 
Note: See TracChangeset for help on using the changeset viewer.