
`9Sc           @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Td  d l Td  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 Td  d l Td  d l Td  d l Ty d  d l TWn e k
 r e Z n Xe Z d g Z d e f d     YZ d f  d	     YZ d
 f  d     YZ d S(   iN(   t   *(   t   gui(   t   txt(   t   utilst   PhotometerDatabaseWidgetc           B   s  e  Z d  Z e   Z d Z d d  Z d   Z d   Z	 d   Z
 d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z e d  Z d   Z d   Z d   Z d   Z e r d   Z n  d   Z d   Z d   Z  d   Z! d   Z" d   Z# RS(   sl   Widget responsible for loading of Sun photometer data files for the
    aerosol profile retrieval algorithm.s   data/AERONETc         C   sT  t  j |  |  t j |  j  |  _ d  |  _ d  |  _ t	 j	 j
   j |  _ d |  _ g  |  _ t   } t d  } | j |  t   |  _ |  j j t j  |  j j j |  j  | j |  j  | j |  j  t d  } | j |  t   |  _ |  j j j |  j  | j |  j  | j |  j  t d  } | j |  t   |  _ |  j j j |  j  | j |  j  | j |  j  t j d  } t | d  |  _ |  j j   |  j j  j |  j!  | j |  j  | j"   t t j d  d  |  _# |  j# j$ t%  |  j# j& d	  |  j# j  j |  j'  | j |  j#  t t j d
  d  |  _( |  j( j& d  |  j( j  j |  j)  | j |  j(  t t j d  d  |  _* |  j* j& d  |  j* j  j |  j+  | j |  j*  | j, d d d d  |  j- |  t. r%|  j j/   n  |  j0 t%  |  j1   |  j2   |  j3   d  S(   Ns   1.5s   Aeronet &site:s   &Year:s   Data l&evel:t   worlds   &Update datas   microsoft-office-excelt    sN   Export the currently selected photometer data file into Microsoft Excel formatt   reloadsC   Save changes and reload the currently selected photometer data filet
   parameterss.   Select root folder for the photometer databasei    (4   t   StatusSignalingWidgett   __init__R   t   absolutePatht   defaultDatabaseDirt   databaseRootDirt   Nonet   siteInfoListt   siteNamet   datetimet   nowt   yeart	   dataLevelt   dataListt   QHBoxLayoutt   QLabelt	   addWidgett	   QComboBoxt   siteNameComboBoxt   setSizeAdjustPolicyt   AdjustToContentst   currentIndexChangedt   connectt   onComboBoxIndexChangedt   setBuddyt   yearComboBoxt   dataLevelComboBoxR   t   loadIcont   QPushButtont   updateDataButtont   hidet   clickedt   onUpdateDataButtonClickedt
   addStretcht   excelExportButtont
   setEnabledt   Falset
   setToolTipt   onExcelExportButtonClickedt   reloadButtont   onReloadButtonClickedt
   openButtont   onOpenButtonClickedt   setContentsMarginst	   setLayoutt   aeronetDownloaderPluginLoadedt   showt   populateSiteNameComboBoxt   populateYearComboBoxt   populateDataLevelComboBoxt   syncComboBoxIndices(   t   selft   parentt   layoutt   siteNameLabelt	   yearLabelt   dataLevelLabelt	   worldIcon(    (    s    code\PhotometerDatabaseWidget.pyR
   :   sv    					



	

c         C   s   |  j  S(   N(   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyt   getSiteName   s    c         C   s   |  j  S(   N(   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyt   getYear   s    c         C   s   |  j  S(   N(   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyt   getDataLevel   s    c         C   s   |  j  S(   s   Return the list of 'PhotometerInput' instances loaded from the
        currently selected photometer data file.

        If no data have been loaded, an empty list is returned.

        Note: Currently, the data list returned by this function may be
        directly edited by the caller.(   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyt   getDataList   s    	c         C   s   |  j  d k s |  j d k r" d Sx t r y t j |  j   |  j  PWq% t j	 k
 r } t
 j |  d | j t
 j t
 j Bt
 j  } | t
 j k r Pq q% Xq% Wd S(   s/  Save changes that have been made by the user to 'aot675Corr'
        attributes of the currently loaded list of 'PhotometerInput' instances
        in the appropriate AOT correction data file.

        Note: this function is called automatically whenever current photometer
        data file is changed.Ns"   Failed to save AOT correction file(   R   R   R   t   Truet   PhotometerInputt   updateAotCorrFileForDataListt   getAotCorrFilePathR   R   t   Errort   QMessageBoxt   criticalt   textt   Retryt   Ignore(   R;   t   et   answer(    (    s    code\PhotometerDatabaseWidget.pyt   saveAotCorrFile   s    
		c         C   s|   t  j | d  Z | j d t j |  j   | j d |  j  | j d |  j  | j d |  j  Wd QX|  j	   d S(   s  Save attributes of the currently selected photometer data file in
        the given 'QSettings' instance, and also save any changes that the user
        might have introduced to 'aot675Corr' attributes of the currently
        loaded list of 'PhotometerInput' instances.R   R   R   R   R   N(
   R   t   SettingsGroupert   setValueR   t   portablePathR   R   R   R   RR   (   R;   t   settings(    (    s    code\PhotometerDatabaseWidget.pyt   saveSettings   s    	c      	   C   sI  t  j | d  | j d  j   |  _ |  j d k rI |  j |  _ n  t j |  j  |  _ y= t | j d  j    |  _	 |  j	 d k r d	 |  _	 n  Wn t k
 r d	 |  _	 n X| j d  j   \ |  _ } | s d	 |  _ n  | j d  j   } | d k rd |  _ n	 d |  _ Wd	 QX|  j t  |  j   |  j   d	 S(
   s  Load attributes of the photometer data file stored in the given
        'QSettings' instance, load the AERONET site list file, and load the
        photometer data file itself if it is available and its site name is
        present in the AERONET site list.R   R   R   R   R   R   s   2.0s   1.5N(   R   RS   t   valuet   toStringR   R   R   R   t   strR   R   t   UnicodeEncodeErrort   toIntR   R   R7   RF   R:   t   loadPhotometerData(   R;   RV   t   conversionResultR   (    (    s    code\PhotometerDatabaseWidget.pyt   loadSettings   s*    
c         C   s   |  j  d k s$ t |  j   d k r( d St | |  } d } | j t |  j  d j |  j  d j   } xg t d t |  j    D]M } | j t |  j  | j |  j  | j   } | | k  r | } | } q q W|  j  | j S(   s   Return name of the AERONET site that is the nearest one with respect
        to the given geodetic latitude and longitude (in degrees), or 'None' if
        AERONET site list file has not been loaded yet or is not available.i    i   N(	   R   R   t   lent   GeodeticPointt   distToPointt   latitudet	   longitudet   rangeR   (   R;   Rc   Rd   t   targetPointt   nearestIndext   nearestDistancet   it   dist(    (    s    code\PhotometerDatabaseWidget.pyt   getNearestSiteName  s    $	#	#c         C   s\   | |  _  | |  _ |  j   |  j   |  j d k rX t j |  d d t j |   n  d S(   sj   Load photometer data file for the given site name and year, and the
        currently selected data level.s   AERONET data not availables*   AERONET data are not available for year %sN(	   R   R   R:   R]   R   RK   RL   R   t   quoteNumber(   R;   R   R   (    (    s    code\PhotometerDatabaseWidget.pyt   setSiteNameAndYear1  s    		

c         C   s/   t  j j |  j |  j t |  j  d |  j  S(   su   Return path to the directory where files related to the currently
        selected photometer data subset are stored.s   Level (   t   ost   patht   joinR   R   RZ   R   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyt   getAeronetFileDirF  s    c         C   s=   d |  j  d |  j  d |  j f } t j j |  j   |  S(   s   Return path to the original Dubovik data file that corresponds to
        the currently selected photometer (AERLID) data file.s   %02d0101_%02d1231_%s.dubovikid   (   R   R   Rn   Ro   Rp   Rq   (   R;   t   fileName(    (    s    code\PhotometerDatabaseWidget.pyt   getDubovikFilePathM  s    !c         C   s=   d |  j  d |  j  d |  j f } t j j |  j   |  S(   s|   Return path to the currently selected photometer data file (a
        Dubovik AERONET data file processed with AERLID tool).s   %02d0101_%02d1231_%s.lidar.txtid   (   R   R   Rn   Ro   Rp   Rq   (   R;   Rr   (    (    s    code\PhotometerDatabaseWidget.pyt   getAerlidFilePathV  s    !c         C   s=   d |  j  d |  j  d |  j f } t j j |  j   |  S(   s}   Return path to the AOT correction data file that corresponds to the
        currently selected photometer (AERLID) data file.s   %02d0101_%02d1231_%s.aot.txtid   (   R   R   Rn   Ro   Rp   Rq   (   R;   Rr   (    (    s    code\PhotometerDatabaseWidget.pyRI   _  s    !c         C   s   d S(   s/   Return path to the AERONET site list data file.s'   code/data/AERONET/aeronet_locations.txt(    (   R;   (    (    s    code\PhotometerDatabaseWidget.pyt   getSiteListFilePathh  s    c      	   C   sx  t  j |  j  P|  j j   d |  _ t r t |  j j    j	   } |  j j
 t | |   t  j d  } |  j j | d  n  | s |  j j t  d Sy t   j |  j    |  _ Wn7 t j k
 r } |  j j t  |  j | j  d SX|  j j t  |  j j d d    x: t t |  j   D]# } |  j j | |  j | j  q7WWd QX|  j   j   d S(   s  Fill in the combo box meant for selection the AERONET site name.

        The combo box will contain the site list itself, and also an item that
        will make it possible to download the most recent version of the site
        list file and reload it.

        If 'loadSiteInfoList' if 'False', only the extra utility item is added
        to the combobox. Otherwise, the AERONET site list file is loaded, and
        a corresponding error message is set on failure. The simpler
        initialization is used in the constructor, and the right one is used in
        'loadSettings', thus making sure that 'errorMessageChanged' signal
        could be received by the parent widget in case of an error.R   s   Update site listNt   cmpc         S   s   t  |  j | j  S(   N(   Rv   R   (   t   xt   y(    (    s    code\PhotometerDatabaseWidget.pyt   <lambda>  s    (    R   t   SignalBlockerR   t   clearR   R   R5   t   QFontMetricst   fontt   heightt   setIconSizet   QSizeR#   t   addItemR1   R+   R,   t   AeronetSiteListLoadert   loadFileRu   R   RJ   t   setErrorMessageRM   RF   t   sortRe   R`   t
   insertItemR   R=   t   activate(   R;   t   loadSiteInfoListt
   iconHeightRA   RP   Ri   (    (    s    code\PhotometerDatabaseWidget.pyR7   p  s6    			
c         C   sp   t  j |  j  X |  j j   t j j   j } x1 t d | d  D] } |  j j t	 |   qF WWd QXd S(   sQ   Fill in the combo box meant for selection of year of the photometer
        data.i  i   N(
   R   Rz   R!   R{   R   R   R   Re   R   RZ   (   R;   t   currentYearR   (    (    s    code\PhotometerDatabaseWidget.pyR8     s
    c         C   sJ   t  j |  j  2 |  j j   |  j j d  |  j j d  Wd QXd S(   sK   Fill in the combo box meant for selection of photometer data
        level.s   1.5s   2.0N(   R   Rz   R"   R{   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyR9     s    c      	   C   s  d } |  j  d k	 rj |  j d k	 rj xC t t |  j   D]) } |  j | j  |  j  k r: | } Pq: q: Wn  | d k r d |  _  n  t j |  j   |  j j |  Wd QX|  j	 j
 t |  j   } | d k r d |  _ n  t j |  j	   |  j	 j |  Wd QX|  j j
 |  j  } | d k s.t  t j |  j   |  j j |  Wd QX|  j j |  j  d k	 o{|  j d k	  d S(   s  Synchronize currently selected items of the combo boxes with actual
        attributes of the photometer data file stored in the local variables.

        If any of the values stored in the local variables is not present in
        the respective combo box, that value is reset to 'None', and current
        item of the combo box is cleared by setting its current index to -1.

        Note: this function does not load the currently selected photometer
        data file; use 'loadPhotometerData' for that.iN(   R   R   R   Re   R`   R   Rz   R   t   setCurrentIndexR!   t   findTextRZ   R   R"   R   t   AssertionErrorR%   R+   (   R;   t	   siteIndexRi   t	   yearIndext   dataLevelIndex(    (    s    code\PhotometerDatabaseWidget.pyR:     s*    	c         C   s   |  j  2|  j j t  |  j j   |  j d k r7 d S|  j d k sU |  j	 d k r |  j
 j |  j d k	 oy |  j	 d k	  |  j d  d S|  j   } |  j   } t j j |  r t j j |  r |  j d t j |   d St j j |  rt j j |  sWt j j |  rnt j j |  rnt j j |  t j j |  k rnt j d |  j  d S|  j   } t j j |  sd } n  y6 |  j d t j |  t  t j | |  |  _  Wn' t j k
 r} |  j | j  d SX|  j   |  j j t  |  j j   d S(   s[   Load the currently selected photometer data file as defined by the
        local variables.Ns&   Photometer data subset is not selecteds+   AERONET database file (%s) is not availablei    s%   Loading photometer input file (%s)...(   R   R*   R+   R,   t   dataListChangedt   emitR   R   R   R   R%   R   Rs   Rt   Rn   Ro   t   isfileR   t	   quotePatht   getmtimet   QTimert
   singleShott   runAerlidToolRI   t   setProgressMessageRF   RG   t   readDataListFromAerlidRJ   RM   t   clearStatusMessage(   R;   t   dubovikPatht
   aerlidPatht   aotCorrPathRP   (    (    s    code\PhotometerDatabaseWidget.pyR]     sF    		&	%$$		
c         C   s~   t  |  |  j    rp |  j t  |  j } |  j   |  j d k rz | |  _ |  j   d |  _ |  j   qz n
 |  j   d S(   s   Download the most recent version of the AERONET site list file,
            update contents of the site name combo box appropriately if the
            download succeeds, and then restore the currently selected site
            name in the combo box.N(	   t   downloadAeronetSiteListFileRu   R7   RF   R   R:   R   RR   R]   (   R;   t   previousSiteName(    (    s    code\PhotometerDatabaseWidget.pyt   updateSiteListFileM  s    	
	
	c         C   s   |  j  d t j |  j    t  t |  d d |  j   |  j    } | j   | j   d k	 rz |  j
 | j    d S|  j   d S(   s   Run AERLID tool for the original Dubovik data file that corresponds
        to the currently selected AERLID file, and then reload the updated
        AERLID data file.s   Processing AERONET data (%s)...s   code/binary/AERLIDg     0v@g     @g     @N(   g     0v@g     @g     @(   R   R   R   Rs   RF   t   AerlidToolDialogRt   t   exec_t   getErrorMessageR   R   R]   (   R;   t   aerlidToolDialog(    (    s    code\PhotometerDatabaseWidget.pyR   z  s    		
c         C   sN  |  j    |  j j   } t rg | |  j j   d k rg |  j j |  d k sV t  |  j   d Sn  | d k r t |  j j |   |  _	 n	 d |  _	 |  j j   } | d k r t |  j j |   |  _ n	 d |  _ |  j j   } | d k s t  t |  j j |   |  _ |  j j |  j	 d k	 o<|  j d k	  |  j   d S(   sU  Update local variables that define the currently selected photometer
        data file and load data from the newly selected file.

        If 'Update site list' item has been selected in the AERONET site name
        combo box, download the most recent version of the site list file and
        update the combo box' contents appropriately.i   s   Update site listNi    (   RR   R   t   currentIndexR5   t   countt   itemTextR   R   RZ   R   R   R!   t   intR   R"   R   R%   R+   R]   (   R;   t   indexR   R   R   (    (    s    code\PhotometerDatabaseWidget.pyR     s*    

			c         C   sA   t  r= t |  |  j |  j |  j |  j    r= |  j   q= n  d S(   s   Download the most recent version of the Dubovik AERONET data file
        corresponding to the currently selected photometer data subset, process
        the downloaded file with AERLID tool and then reload the updated AERLID
        data file.N(   R5   t   downloadAeronetDubovikDataFileR   R   R   Rs   R   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyR(     s
    c         C   s   t  j |  j    } t j |  d | d  } | j   r= d  St j |  } |  j d t	  y t  j
 | |  j  Wn, t j k
 r } t j |  d | j  n X|  j   d  S(   Ns7   Export photometer data fine into Microsoft Excel formats   Microsoft Excel files (*.xls)s=   Exporting photometer data file into Microsoft Excel format...s   Failed to save the file(   RG   t   getExcelExportFilePathRs   t   QFileDialogt   getSaveFileNamet   isNullR   R   R   RF   t   exportDataListToExcelR   RJ   RK   RL   RM   R   (   R;   t   defaultExcelFilePatht   excelFilePathRP   (    (    s    code\PhotometerDatabaseWidget.pyR.     s     			c         C   s/   |  j    |  j t  |  j   |  j   d S(   s   Save changes made to 'aot675Corr' attributes of the currently loaded
        list of 'PhotometerInput' instances, reload the AERONET site list file
        and then reload the currently selected photometer data file.N(   RR   R7   RF   R:   R]   (   R;   (    (    s    code\PhotometerDatabaseWidget.pyR0     s    

c         C   s<  d } t  j j |  j  s$ d } n	 |  j } t j |  | |  } | j   sZ | d k r^ d St j |  } |  j	 d k	 s t  g  |  j	 D] } | j ^ q } ya g  } xT t  j |  D]C } t  j j t  j j | |   r | | k r | j |  q q WWn2 t k
 r6t j |  | d t j |   d SXt |  d k r| j   t |  d k rd t j | d  } n t |  d	 k rd
 t j | d  t j | d  f } n t |  d k rd t j | d  t j | d  t j | d	  f } n: d t j | d  t j | d  t j | d	  f } t |  d k rnd } d }	 d }
 n d } d }	 d }
 t |   } | j |  | j d t j |  | | |	 |
 f  | j d  | j t j  | j t j t j B | j   t j k rd Sn  |  j    t j |  |  _ |  j!   d S(   s@   Ask the user to select a new value for the database root folder.s.   Select root folder for the photometer databaset   .R   Ns&   Selected folder (%s) is not accessiblei    i   s   %si   s	   %s and %si   s   %s, %s, and %ss   %s, %s, %s, etc.s   a subfoldert   nameu	   doesn’tt
   subfolderst   namesu   don’ts[   Selected folder (%s) contains %s (%s), whose %s %s coincide with any of AERONET site names.sI   Do you really want this folder to be the root of the photometer database?("   Rn   Ro   t   isdirR   R   t   getExistingDirectoryR   R   R   R   R   R   R   t   listdirRp   t   appendt   OSErrorRK   RL   R   R`   R   t   quotet   setWindowTitlet   setTextt   setInformativeTextt   setIcont   Warningt   setStandardButtonst   Yest   NoR   RR   R]   (   R;   t   dialogCaptiont   dirPatht   infot	   siteNamest   rootSubDirsR   t   nameListStrt   subfoldersStrt   namesStrt   dontStrt   msgBox(    (    s    code\PhotometerDatabaseWidget.pyR2     st    			!
*  	
N($   t   __name__t
   __module__t   __doc__t
   pyqtSignalR   R   R   R
   RB   RC   RD   RE   RR   RW   R_   Rk   Rm   Rq   Rs   Rt   RI   Ru   R,   R7   R8   R9   R:   R]   R5   R   R   R   R(   R.   R0   R2   (    (    (    s    code\PhotometerDatabaseWidget.pyR   .   s>   	h					"		-										B			5	K-		5			t   AeronetSiteInfoc           B   s   e  Z d  Z RS(   s  Description of an AERONET site stored in the AERONET site list file.

    Attributes:
      - 'siteName': string holding the AERONET site name.
      - 'longitude', 'latitude': geodetic coordinates of the site, in degrees.
      - 'altitude': site's elevation, in meters.(   R   R   R   (    (    (    s    code\PhotometerDatabaseWidget.pyR   h  s   R   c           B   sD   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s=   Utility class used for parsing of the AERONET site list file.c         C   sa   d |  _  |  j  j d  |  _ |  j  j d  |  _ |  j  j d  |  _ |  j  j d  |  _ d S(   sA   Initialize auxiliary attributes used to describe the data format.t	   Site_Names   Longitude(decimal_degrees)s   Latitude(decimal_degrees)s   Elevation(meters)N(   R   s   Longitude(decimal_degrees)s   Latitude(decimal_degrees)s   Elevation(meters)(   t   headersR   t	   nameIndext   longitudeIndext   latitudeIndext   altitudeIndex(   R;   (    (    s    code\PhotometerDatabaseWidget.pyR
   }  s     	c         C   s   t  j j |  s1 t j d t j |    n  y t |  |  _ Wn- t k
 rs t j d t j |    n Xd t j |  |  _	 zB y |  j
   SWn- t k
 r t j d t j |    n XWd |  j j   Xd S(   s   Load the specified AERONET site list file.

        Return a list of 'AeronetSiteInfo' instances.

        Raise 'txt.Error' if loading fails or file format is invalid.s,   Aeronet site list file (%s) is not availables9   Aeronet site list file (%s) may not be opened for readings/   Aeronet site list file format is invalid (%s): s*   Failed to read Aeronet site list file (%s)N(   Rn   Ro   R   R   RJ   R   t   opent   filet   IOErrort   errorPrefixt   readFilet   close(   R;   t   filePath(    (    s    code\PhotometerDatabaseWidget.pyR     s"    
		 	c         C   s  g  } |  j  j   |  j  j   j   j d  } x- t t |  j   D] } |  j | |  qG Wd |  _ x |  j  D] } | j   j d  } t	   } |  j
 |  | _ |  j | |  j  | _ |  j | |  j  | _ |  j | |  j  | _ | j |  |  j d 7_ qt W| S(   s4   Load the opened data file referenced in 'self.file'.t   ,i   i   (   R   t   readlinet   stript   splitRe   R`   R   t   testColumnHeadert   currentLineR   t   readSiteNameR   t   readFloatValueR   Rd   R   Rc   R   t   altitudeR   (   R;   R   t   dataHeadersRi   t   linet   dataStringst   siteInfo(    (    s    code\PhotometerDatabaseWidget.pyR     s&    					c         C   s   | t  |  k rR t j |  j d t j | d  t j |  j |  f   n  | | |  j | k r t j |  j d t j | d  t j | |  t j |  j |  f   n  d S(   s   Check if the given data column header has the expected value.

        Raise 'txt.Error' on failure.

        'headerList' should be the comlete list of header strings read from the
        file. 'i' should be the index of the data column.s   data column %s (%s) in missingi   s'   header of column %s is %s instead of %sN(   R`   R   RJ   R   Rl   R   R   (   R;   t
   headerListRi   (    (    s    code\PhotometerDatabaseWidget.pyR     s    1 c         C   s   | t  |  k rR t j |  j d t j | d  t j |  j d  f   n  y t | |  SWnN t k
 r t j |  j d t j | d  t j |  j d  f   n Xd S(   s#  Parse a floating-point value read from the data file.

        Return the parsed value.

        Raise 'txt.Error' on failure.

        'dataList' should be the comlete list of data strings read from a
        single line of the data file. 'i' should be the index of the data
        column.s#   missing data in column %s (line %s)i   s%   invalid number in column %s (line %s)N(   R`   R   RJ   R   Rl   R   t   floatt
   ValueError(   R;   R   Ri   (    (    s    code\PhotometerDatabaseWidget.pyR     s    !c         C   s   |  j  t |  k rB t j |  j d t j |  j d    n  | |  j  } t j d |  d k r t j |  j d t j |  j d  t j
 |  f   n  | S(   s  Parse and check the site name read from the AERONET site list file.

        Return a string holding the site name.

        Raise 'txt.Error' on failure.

        'dataList' should be the comlete list of data strings read from a
        single line of the data file.s   missing site name in line %si   s   [a-zA-Z0-9_\-]+$s!   invalid site name in line %s (%s)N(   R   R`   R   RJ   R   Rl   R   t   ret   matchR   R   (   R;   R   R   (    (    s    code\PhotometerDatabaseWidget.pyR     s    
-(	   R   R   R   R
   R   R   R   R   R   (    (    (    s    code\PhotometerDatabaseWidget.pyR   r  s   
		!	*		(   R   Rn   t   os.pathR   t   PyQt4.QtCoret   PyQt4.QtGuit   common.utilsR   R   R   t   common.GeodeticPointt   common.StatusSignalingWidgetR   RG   t   AeronetDownloadert   ImportErrorR,   R5   RF   t   __all__R	   R   R   R   (    (    (    s    code\PhotometerDatabaseWidget.pyt   <module>   s0   






	   =
