a
    +ca                    @   sF  d dl mZmZmZmZmZmZ d dlmZ d dlmZ d dl	Z	d dl
Z
d dlZd dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lT e Zd dlZed
ZG dd dZG dd dZ G dd dZ!G dd dZ"G dd dZ#G dd dZ$G dd dZ%G dd dZ&G dd dZ'dS )    )sincosatan2degreestansqrt)datetime)	timedeltaN)PIPE)	pgwrapper)
RunCommand)Module)*zmwprecip.Computingc                   @   s~   e Zd ZzedZW nH ey^ Z z0ejZe	
ededd  W Y dZ[n
dZ[0 0 dddZd	d
 Zdd ZdS )PointInterpolationpsycopg2EUnable to load python <{0}> lib (requires lib <{0}> being installed).'NFc                 C   sP  t d t|| _|| _|| _| jjt|dd }d| jj	|f }| jj
|dd d| jj	|f }| jj
|dd d}d}g }t| j}	|	d}
|
D ]@}|d }|d	 d
 }|d }|d }|d }|d }| ||||}|d	7 }t }| jrnt||kr| ||||\}}}}||8 }|d	7 }|| || || || || q q||d	  }tdt|D ]X}| ||||\}}}}|d	7 }|| || || || || qq|	|}|	|| jj d| jj	|f }| jj
|dd d| jj	|f }| jj
|dd t d d S )Nz#Interpolating points along lines...z.0 zDROP TABLE IF EXISTS %s.%sFTzSCREATE table %s.%s (linkid integer,long real,lat real,point_id serial PRIMARY KEY) r      i              z!ALTER TABLE %s.%s DROP COLUMN latz"alter table %s.%s drop column longz%Interpolating points along lines-done)timeMestimeMsgfloatstepdatabasemethodlinkPointsVecNamestrreplaceschema
connection
executeSqlVectorLoaderselectLinksbearinglistabsdestinationPointWGSappendrangeintgetASCIInodesgrass_vinASCII)selfr   r   Z
methodDistZ	nametablesqlaxZpointsZ	vecLoaderZlinksPointsrecordlinkidZdistlat1lon1lat2lon2ZazpointbackBrgZstep1iZresultPointsAlongLines r>   VC:/Users/landamar/grass_packager/grass786/addons/wx.mwprecip/etc/g.gui.mwprecip/mw3.py__init__'   s    















zPointInterpolation.__init__c           #   	   C   s  d}d}d}t t|}t t|}t t|}t|}	t|}
d| t| }dtd||   }|| }t||
}||	 }d||  }||| ||   ||  }d|d d|d|dd	|        }|d
 d|d|dd|       }|||  }dt j }t	|| dkrtd| | }t|}t|}|| ||d |dd| |   |d | dd| |   dd| |       }|}|||  | }q|| || |
  }t|| || |
  d| t|| ||   }t||	 || || |
  }|d | d|dd|     }|d| | | ||| ||| dd| |        }t|| }|dt j  } |t j }!|| }"t
|}t
|"}"t
| } t
|!}!| d d } |!d d }!||"| |!fS )NiRa gQ?XAg(Zwk?r   i @  i   i i@     i      iJ   /   r   g-q=r         r   h  )mathradiansr   r   r   r   r   r   Zpir*   r   )#r1   r7   r8   brngsr3   bfZbrgZsbcbZtu1Zcu1Zsu1s2ZsaZcsausABs1Zs1pZcs1mZss1Zcs1Zds1tr9   l2cldZfinalBrgr<   r:   r>   r>   r?   r+      sr    
($
*2 &
z&PointInterpolation.destinationPointWGSc           	      C   s   t t|}t t|}t t|}t t|}|| }t |t | }t |t | t |t | t |  }t t ||}|d d S )NrI   )rJ   rK   r   r   r   r   r   )	r1   r7   r8   r9   r:   ZdLonyr4   rL   r>   r>   r?   r(      s    zPointInterpolation.bearing)F)__name__
__module____qualname__	importlibimport_moduler   ModuleNotFoundErroremsggrassfatal_formatsplitr@   r+   r(   r>   r>   r>   r?   r      s   
]Ar   c                   @   sF   e Zd Zdd Zdd Zdd Zdd Zdd
dZdd Zdd Z	dS )r&   c                 C   s
   || _ d S N)db)r1   r   r>   r>   r?   r@      s    zVectorLoader.__init__c                 C   s   d| j j }| j j|ddS )Nz&SELECT nodeid, lat, long FROM %s.node;Trj   
dataSchemar$   r%   r1   r2   r>   r>   r?   selectNodes   s    zVectorLoader.selectNodesc                 C   s&   d| j j| j jf }| j j|ddS )Nz%SELECT gaugeid, lat, long FROM %s.%s;T)rj   rl   rgaugeTableNamer$   r%   rm   r>   r>   r?   selectRainGagues   s
    zVectorLoader.selectRainGaguesc                 C   s^   d}d}|D ]L}|d| 7 }|t |d d t |d  | 7 }|dt |d  | 7 }q|S )	N
VERTI:
zP 1 1r    r   1 r   r!   )r1   ZselectedPointsnewlineZ
pointsASCIr;   r>   r>   r?   r/      s    zVectorLoader.getASCIInodesFc                 C   sL   |s d| j j| j j| j jf }nd| j j| j j| j jf }| j j|ddS )NzSELECT l.linkid, n1.lat, n1.long ,n2.lat, n2.long                 FROM %s.node as n1                JOIN %s.link as l                 ON n1.nodeid=fromnodeid                JOIN %s.node as n2                 ON n2.nodeid= tonodeid;zSELECT l.linkid,l.lenght, n1.lat, n1.long ,n2.lat, n2.long                 FROM %s.node as n1                JOIN %s.link as l                 ON n1.nodeid=fromnodeid                JOIN %s.node as n2                 ON n2.nodeid= tonodeid;Trk   )r1   Zdistancer2   r>   r>   r?   r'      s    	zVectorLoader.selectLinksc                 C   s   d}d}|D ]p}|d| 7 }|t |d d t |d  | 7 }|t |d d t |d  | 7 }|d	t |d
  | 7 }q|S )Nrq   rr   zL 2 1r   rs   r   r   r   rt   r   ru   )r1   ZselectedLinksrv   Z
linksASCIIlinkr>   r>   r?   getASCIIlinks
  s    $$zVectorLoader.getASCIIlinksc                 C   sb   t jt jt}t j|d}t|d}|| |  t	j
d|d|ddd t | d S )Ntmpw+z
v.in.asciiZstandardT)inputrg   outputquiet	overwrite)ospathdirnamerealpath__file__joinopenwritecloserd   run_commandremove)r1   ZasciiStrZ
outMapNameZcurrDirZtmpFilerO   r>   r>   r?   r0     s    

zVectorLoader.grass_vinASCIIN)F)
r\   r]   r^   r@   rn   rp   r/   r'   rx   r0   r>   r>   r>   r?   r&      s   
r&   c                   @   s   e Zd Zdd Zdd ZdS )	RainGaugec                 C   s`   || _ || _|j| _|j| _d | _d | _d | _t| j}|D ]}t	j
| j|}| | q<d S ri   )rj   ZrgpathpathworkSchemaDir
schemaPathr#   gaugeidlatlonZgetFilesInFoldrr   r   r   readRaingauge)r1   r   ZpathfileZ	file_listfiler   r>   r>   r?   r@   *  s    
zRainGauge.__init__c              
   C   s  z`t |d:}t| | _t| | _t| | _W d    n1 sL0    Y  |  W n8 ty } z t	
d|j| W Y d }~n
d }~0 0 d}t|tj| j|ddd zvt tj| j|dJ}| }g }|D ] }t| jd | }|| q|  W d    n1 s$0    Y  W n8 tyh } zt	
dtt W Y d }~n
d }~0 0 zNt tj| j|d	"}	|	| |	  W d    n1 s0    Y  W n8 ty } zt	
dtt W Y d }~n
d }~0 0 t| jj| j| jjsd
| j| jjf }
| jj|
dd d| j| jj| j| jjf }
| jj|
dd d| j| jj| j| j| jf }
| j|
dd t tj| j|d}	| j|	d| j| jjf d |	  ttj| j| d S )NrbzI/O error({}): {}Z	gauge_tmpr   r   )Zold_fileZnew_filestartend,zI/O error({0}): {1}rz   zEcreate table %s.%s (gaugeid integer PRIMARY KEY,lat real,long real ) FTa   CREATE TABLE %s.%s                   (gaugeid integer NOT NULL,                  "time" timestamp without time zone NOT NULL,                  precip real,                  CONSTRAINT recordrg PRIMARY KEY (gaugeid, "time"),                  CONSTRAINT fk_record_rgague FOREIGN KEY (gaugeid)                  REFERENCES %s.%s (gaugeid) MATCH SIMPLE                  ON UPDATE NO ACTION ON DELETE NO ACTION)z@Insert into %s.%s ( gaugeid , lat , long) values (%s , %s , %s) r%s.%s) r   r.   nextr   r   r   r   r   IOErrorrd   errorrg   errnoZremoveLinesr   r   r   r   	readlinesr!   r,   strerror
writelinesZisTableExistrj   r$   r#   ro   r%   rgaugRecordcopyfromr   )r1   r   rO   rb   ZgaugeTMPfiledatary   lineZstriior2   r>   r>   r?   r   8  sl    ,*,(
,(zRainGauge.readRaingaugeN)r\   r]   r^   r@   r   r>   r>   r>   r?   r   )  s   r   c                   @   s   e Zd Zd	ddZdS )
BaselinenoDryWinNquantilea   r   r   c                 C   sj   |d u rd}t d || _|d u r2d}t d || _|d u rNd}t d || _|| _|| _|| _d S )Nr   z&Quantile is not defined. Default is 97r   z1Round is not defined. Default is 3 decimal placesr   z1Antena wetting value is not defined. Default is 0)loggerinfor   	roundModeaw
pathToFiletypestatFce)r1   r   r   r   r   r   r   r>   r>   r?   r@     s    	


zBaseline.__init__)r   Nr   r   r   r   )r\   r]   r^   r@   r>   r>   r>   r?   r     s         r   c                   @   sN   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dS )TimeWindowsNFc
           
      C   s   |	| _ || _|| _|| _|| _|j| _|j| _|j	| _	|| _
|j| _|j| _|| _|| _|| _i | _d| jd< d| jd< d | _d | _d | _d | _d | _d| _| jdkrd| _n| jdkrd	| _nd
| _d S )NFboolDonerc   r   Zminute<   Zhouri  iQ )linksMap	startTimeendTimesumStepr   r$   rj   r   r   r#   typeIDviewStatementcomputedPreciptbNamelinkslinksIgnored	linksOnlystatusviewDBintervalStrtimestamp_maxtimestamp_minZtemporalRegPath
numWindows)
r1   r   ZIDtyper   r   r   r   r   r   r   r>   r>   r?   r@     s8    



zTimeWindows.__init__c                 C   sH   |    | jd ur| j| j_n| jr.|   n| jr<|   |   d S ri   )		sumValuesr   r   linkVecMapNamer   removeLinksIgnorer   removeLinksOtherscrateTimeWinr1   r>   r>   r?   	createWin  s    

zTimeWindows.createWinc                 C   sz   d| _ d| j| j| j | j| jj| j| j| j| j| jf
 }| jj	|dd d| j| j| j | jj
f }| jj	|dd d S )NZcomputed_precip_sumzCREATE %s %s.%s as                 SELECT %s ,round(avg(precip)::numeric,3) as %s, date_trunc('%s',time)as time                 FROM %s.%s                GROUP BY %s, date_trunc('%s',time)               ORDER BY timeFTz1ALTER %s %s.%s                ADD %s VARCHAR(11) )r   r   r#   r   r   precipColNamer   r   r$   r%   colorColrm   r>   r>   r?   r     s(    zTimeWindows.sumValuesc                 C   s   | j  | _| j  | _| jd urXtt| jd| _| j| jkrP| 	d dS | j| _t
| j| j| _| jd urtt| jd| _| j| jk r| 	d dS | j| _t
| j| j| _dS )N%Y-%m-%d %H:%M:%Sz-'startTime' value is not in temporal dataset Fz*'endTime' value is not in temporal datasetT)r   minTimestampr   maxTimestampr   r   r   strptimer!   logMsg	roundTimer   r   r   r>   r>   r?   setTimestamp  s"    



zTimeWindows.setTimestampc                 C   s>   | j dD ],}d| j| j| j|f }| jj|dd qdS )zRemove ignored linksr   zDELETE FROM %s.%s WHERE %s=%s FTN)r   rh   r#   r   r   r   r$   r%   )r1   rw   r2   r>   r>   r?   r     s    zTimeWindows.removeLinksIgnorec              	   C   s   d| j  }| jj|dd | jdD ]$}d| j |f }| jj|dd q(d| j  }| jj|dd d| j | j| j| j | j | j| j| jf }| jj|dd dS )	zRemove not selected linksz9CREATE TABLE %s.linktmp(linkid int NOT NULL PRIMARY KEY) FTr   z$INSERT INTO  %s.linktmp values (%s);zDROP TABLE %s.linktmp zxDELETE FROM %s.%s WHERE NOT EXISTS              (SELECT %s FROM   %s.linktmp                WHERE %s.%s.%s=linksonly.%s)N)r#   r   r$   r%   r   rh   r   r   )r1   r2   rw   r>   r>   r?   r   $  s,    

zTimeWindows.removeLinksOthersc              
   C   s  t d d}g }g }| j}d}| jdkr.d}t dt| j d t| j d | j  || jk rF|  jd	7  _t	d
t
t|d}d|| jj|f }|d }|| | jdkr|d t| d }	||	 n|d t| d }	||	 d| j|| j| j| j|f }
| jj|
dd}|| jtd	d  }|| j7 }qZ| jdkrXd}nd}z,ttj| j|d}|| |  W n@ ty } z&tdtj| j|  W Y d }~n
d }~0 0 t d d S )Nzcreating time windowsr   rY   r   gzfrom z to z per r   z%Y_%m_%d_%H_%Mr   z%s%s%srq   r6   |zCREATE TABLE %s.%s as                   SELECT * from %s.%s                    WHERE time=(timestamp'%s'+ %s * interval '1 second')FTZsecondsl_timewindowZg_timewindowrz   z+Cannot write temporal registration file  %szcreating time windows-done)r   r   r   r   r!   r   r   r   timestrftimer   r   r   r,   r#   r   r$   r%   r   r	   r   r   r   r   r   r   r   rd   warning)r1   Z
time_constZnameListZtgrass_vectorZcur_timestampprefixr3   Z	view_nameZvwZtgrassr2   r   ZTMPnameZio2rb   r>   r>   r?   r   A  sx    

	



zTimeWindows.crateTimeWinc                 C   s>   | j ddkrd| j d< | j d  |d 7  < t| d S Nrc   r   r   rq   )r   getrd   r   )r1   rc   r>   r>   r?   r     s    
zTimeWindows.logMsg)NNFFNN)r\   r]   r^   r@   r   r   r   r   r   r   r   r>   r>   r>   r?   r     s         
.Mr   c                   @   s   e Zd ZzedZW nH ey^ Z z0ejZe	
ededd  W Y dZ[n
dZ[0 0 dd Zdd	 Zd
d Zdd Zdd ZdddZdddZdd ZdS )ComputorZnumpyr   r   r   Nc                 C   sn   |j | _|| _|| _|| _d | _i | _d| jd< d| jd< |   | |d |d rj| j	  d| jd< d S )NFr   r   rc   getDatadataOnlyT)
r   ZawConstr   baselinetimeWinbaselineDictr   cleanDatabasecomputePrecipr   )r1   r   r   r   Z
exportDatar>   r>   r?   r@     s    


zComputor.__init__c                 C   s   | j d| j dfS )Nr   rc   )r   r   r   r>   r>   r?   	GetStatus  s    zComputor.GetStatusc                 C   s   d S ri   r>   r   r>   r>   r?   
ExportData  s    zComputor.ExportDatac                 C   s\   d| j j }t| j j t| j j | j j|dd d| j j }| j j|dd d S Nz DROP schema IF EXISTS %s CASCADEFTzCREATE schema %s)	r   r#   shutilrmtreer   r   makedirsr$   r%   rm   r>   r>   r?   r     s    zComputor.cleanDatabasec                    s$  j  jjjjjjjjj fdd fdd}dfdd	} fdd	d
d }j jdkr|j j_	nj jdkrt
dj j  | r|tjjd_	dS dS nFj jdkr t
dj j  | r|tjjd_	dS dS dS )z!@note  returns disct - key:linkidc                    s   d|  }j |dd}dj j| f }j |dd g }|D ]P}|d }dj|f }j |ddd d }|t|d t| d  qBd	j }j |dd ttj	j
d
d}|| |  d S )Nz SELECT linkid from %s group by 1TzMCREATE TABLE %s.tempround as SELECT round(a::numeric,%s) as a, linkid FROM %sFr   z@SELECT mode(a) AS modal_value FROM %s.tempround where linkid=%s;r   rq   zDROP TABLE %s.temproundr   rz   )r$   r%   r#   r   r,   r!   r   r   r   r   r   r   r   )recordTabler2   linksidry   r6   resuio0)r   r   r>   r?   computeBaselinFromMode  s*     

z5Computor.getBaselDict.<locals>.computeBaselinFromModec               
      s  fdd} g }d} j dkrL jdkrd j dkr`djf }j|dd}|| nzt jd}W n4 ty } zt	
d	 j  W Y d }~n
d }~0 0 |D ]}||d
d7 }d|d
d v rv| }| |s dS ||d
d7 }| }	| |	s dS t|r*t|	s:t	
d  dS ||	d
d7 }dj||	f }j|dd}|| q|d
d }
t|
st	
d  dS zt|
d}
W n" ty   td Y  dS 0 |t|
d
d7 }|
tdd }| |s dS |
tdd }	| |	s" dS dj||	f }j|dd}|| qqi }d}|D ]J}dd |D }|du r|}d}q\|D ]}||  || 7  < qq\t|}t|d }d}|D ]D}|D ]2}|d7 }||d   |  < ||kr q q q
qtttjjdd}| D ]\}}|||g q.n j dksd j dkr
 jdkrdjf }j|dd}j|dd nzt jd}W n2 ty } zt	
d W Y d }~dS d }~0 0 |D ]}||d
d7 }d|d
d v r| }| |s. dS ||d
d7 }| }	| |	sV dS t|rjt|	szt	
d  dS ||	d
d7 }dj||	f }j|dd}||7 }n|d
d }
t|
st	
d  dS zt|
d}
W n" ty   td Y  dS 0 |t|
d
d7 }|
tdd }| |sB dS |
tdd }	| |	s` dS dj||	f }j|dd}||7 }qq||  j d }d j|f }j|dd ttjj|d}d}|D ]D}|D ]8}t|d d! t|d  d
 }| | |d7 }qq|!  zPttjj|d}j"|d"j|f  |!  t#tjj| W n6 ty } zt	
d#|  W Y d }~dS d }~0 0 jd$ | } j dkr؈|  j dkr| d%j|f }j|dd dS )&Nc                    sX   t | dd} zt| d} W n ty>   td Y dS 0 |  ksP| k rTdS dS )Nrq   r   r   Wrong datetime formatFT)r!   r"   r   r   
ValueErrorr   r   )ZtIn)tMaxtMinr>   r?   chckTimeValidity  s    
zPComputor.getBaselDict.<locals>.computeBaselineFromTime.<locals>.chckTimeValidityr   Zavgr   zSELECT linkid, avg(a) FROM %s.record                                WHERE time >='%s' AND time<='%s' group by linkid order by 1Tr   z4Path to file with dry-window definiton not exist; %srq   r=   r   Fz0Input data are not valid. Parameter 'baselitime'zSELECT linkid, avg(a) FROM %s.record                                    WHERE time >='%s' AND time<='%s' group by linkid order by 1r   r   ir   r   c                 S   s"   i | ]}t |d  t|d qS r   r   )r.   r   .0Zrowsr>   r>   r?   
<dictcomp>\      zJComputor.getBaselDict.<locals>.computeBaselineFromTime.<locals>.<dictcomp>r   r   rz   moder   zASELECT linkid, a from  %s.record WHERE time >='%s' and time<='%s'z0Path to file with dry-window definiton not existzASELECT linkid,  a from %s.record WHERE time >='%s' and time<='%s'Z_tmpz,CREATE TABLE %s.%s ( linkid integer,a real);r   r   zCannot open <%s> file.zDROP TABLE %s.%s)$r   r   r#   r$   r%   r,   r   r   r   rd   r   
pathTofiler"   rh   r   ZisTimeValidr   r   r   r   r   r!   r	   lencsvwriterr   r   r   r   itemsZwriterowr   r   r   r   )r   ry   str2   r   rO   rb   r   ZfromtZtotr   Zmydict1r=   Zdatasetmydictrw   Zlengthr   r   keyvalueZ	table_tmpr   rX   itr3   io1Zrecname)r   r   computeBaselineFromQuentiler   r   r   r   r   r>   r?   computeBaselineFromTime  sv   






























 
z6Computor.getBaselDict.<locals>.computeBaselineFromTime      ?c                    sX   t |d } jj| | jt|  d\}}d|  t|  }|||k d }|S )z
            Returns the q'th percentile of the distribution given in the argument
            'data'. Uses the 'precision' parameter to control the noise level.
            d   )binsr
  r   )r   npZ	histogramr   r   Zcumsum)r   qZ	precisionNr  Z
norm_cumulZretr   r>   r?   Quantile
  s
    $z'Computor.getBaselDict.<locals>.Quantilec           	         s   d|  }j |dd}g }|D ]n}|d }d| |f }j |dd}j|}j|dt j d }|t|d t| d  q t	t
jjdd	}|| |  d S )
Nz%SELECT linkid from %s group by linkidTr   z SELECT a from %s where linkid=%sr  r   rq   r   rz   )r$   r%   r  ZarrayZ
percentiler   r   r,   r!   r   r   r   r   r   r   r   )	r   r2   r   ry   r6   r   r   ZquantileResr   )r   r   r1   r>   r?   r    s     
z:Computor.getBaselDict.<locals>.computeBaselineFromQuentilec                 S   sL   t | dd,}tj|dd}dd |D }W d    n1 s>0    Y  |S )Nr   )r   r   )Z	delimiterc                 S   s"   i | ]}t |d  t |d qS r   )r   r   r>   r>   r?   r   1  r   zGComputor.getBaselDict.<locals>.readBaselineFromText.<locals>.<dictcomp>)r   r   reader)r   Zinfiler  r  r>   r>   r?   readBaselineFromText.  s    ,z3Computor.getBaselDict.<locals>.readBaselineFromTextvaluesZ
fromDryWinz(Computing baselines "dry window" "%s"...r   TFr   z+Computing baselines "no dry window" "%s"...N)r
  )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r1   r	  r  r  r>   )	r   r   r  r   r   r1   r   r   r   r?   getBaselDict  sF       "

zComputor.getBaselDictFc                 C   sN   | j ddkrd| j d< | j d  |d 7  < |s@t| n
t| d S r   )r   r   rd   r   re   )r1   rc   errr>   r>   r?   r   P  s    
zComputor.logMsgc                  C   s  dd }| j jd u rd| j _t| j j}| jjd}d| jj| jjf }| j	 sd| 
dd dS td	 d
| jj }| jj|dd}i }	|D ]6\}
}}}g }|| || || ||	|
< qd| jj| jj| jj| jjf }| jj|dd d| jj }| jj|dd}td d| }| jj|dd td |  sd| 
dd dS t| jdkr| 
dd dS td t| j|k rd}| jj|dd}|D ],}
|
d | jvrtdt|
d   qtd g }g }td g }|D ]J}|	|d  }|d d u r@|d |vr@d|d< |d | jv r
||d |d rz| |d |d }n2|d |vr||d  | 
d|d   q
| j|d  }|d | | }||d  }||d  }|dk r|d9 }|d|d   }|d9 }n|d|d   }t|d d t|d  d t| d }|| q
td tj| jjd}t|d }|| |  td!|  td" td# ttj| jjdd$}| jj || |rdS dS )%Nc                 S   s$   | dk rdS |du s|du r dS dS )Ni FVHTr>   )freqpolarizationr>   r>   r?   checkValidityZ  s
    z-Computor.computePrecip.<locals>.checkValidityr   rw   r   zOut of available time intervalr   FzQuering datazHSELECT linkid,lenght,polarization,frequency                 FROM %s.linkTzCREATE TABLE %s.record AS (SELECT linkid,time,txpower-rxpower as a               FROM %s.record               WHERE time >= '%s' AND                    time <= '%s'                     ORDER by recordid);zSELECT * from %s.recordzQuering data-donez>CREATE TABLE %s ( linkid integer,time timestamp, precip real);zComputing baselinez5Dry interval is out of defined time interval(from,to)z-Baselines coputation faild. Check dry windowszComputing baseline-donezSELECT linkid FROM linkz Linkid= %s is missing in txtfilezbMissing values "linkid,baseline," in text file. Data are not available in dry interval(baseline) .zComputing precipitationr  r   zData of link <%s> are not validrE   r   rq   zComputing precipitation-doneZpreciprz   z$Computed data has been saved to <%s>z1File structure is <linkid> <time> <precipitation>z-Writing computed precipitation to database...r   )!r   r   r   r   r$   countr#   r   r   r   r   r   r   rl   r%   r,   r   r   r  r   r   r   r   r!   computeAlphaKr   r   r   r   r   r   r   r   ) r1   r   r   r  ZAwZlink_numZcompPrecTabr2   ZlinkResuZ	linksDictrw   ZlengZpolr  Z	linksInfor   r   ZtempZerrLinkListZskippedListr5   ZcurLinkDataZcoef_a_kZbaseline_decibelZAmZylZaaZR1outZpathExpr   r  r>   r>   r?   r   Y  s    















,




zComputor.computePrecipc                  C   s:  |d }|dkrd}d}d}d}d}d}d	}	d
}
d}d}d}d}t dt|D ]>}tt|||  ||  d }||| t| 7 }qPd||t|  |  }t dt|D ]>}tt||	|  |
|  d }||| t| 7 }q||t|  | }||fS g d}g d}g d}d}d}g d}g d}g d}d}d}d}d}t dt|D ]@}tt|||  ||  d }||| t| 7 }qld||t|  |  }t dt|D ]@}tt|||  ||  d }||| t| 7 }q||t|  | }||fS dS )u   @RECOMMENDATION ITU-R P.838-3
        Specific attenuation model for rain for use in prediction methods
        γR = kR^α
        return kv and αv (vertical polarization)
        return kh and αh (horizontal polarization)
        i@B r  )g$[g 3hֿg-sοgo*Ral!)gtמg{P?g+ٱ?g>?)g|~?guV?g]P2?g5?gM#EȿgN»\?)g{S¿g#0?g^2?g7[ g@߾,0@)gp0?g/
?gղHh?g	^)gڊe
)g4FgE_?ga7l[?gIK?gMJ@g70?gE2Ir   r   
   )grg+eg}˜.ٿgYLl>?)g	8?g3ySͿgÙ_?gNG+?)ga?gDV?g v?gk	g?gZKĿg++MJA?)gyt䳿g@j'?gH|ɿgH&HgJH@)g0'@g?g46<R?g9:ZU?g#ӡS?)gn/ig"J?gb(?g?gWѽ?g
g4KԲ?N)r-   r   rJ   powZlog10Zexp) r1   r  r  Zaj_khZbj_khZcj_khZmk_khZck_khZaj_ahZbj_ahZcj_ahZma_ahZca_ahZkhZahjZfrac_khZfrac_ahZaj_kvZbj_kvZcj_kvZmk_kvZck_kvZaj_avZbj_avZcj_avZma_avZca_avZkvavZfrac_kvZfrac_avr>   r>   r?   r    sX    
$$$$zComputor.computeAlphaK)F)FF)r\   r]   r^   r_   r`   r  ra   rb   rc   rd   re   rf   rg   rh   r@   r   r   r   r  r   r   r  r>   r>   r>   r?   r     s.      
	
 0r   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )GrassLayerMgrNc                 C   s8   || _ || _|| _|  }|d us*|d ur4| | d S ri   )colorrulesr   connectDBaLayersmakeRGB)r1   r   r#  r$  mapr>   r>   r?   r@   T  s    zGrassLayerMgr.__init__c                 C   s   t d z| jdvrTtd| | jjdD ]&}td|d| jj| j| jj	d|d q,| j
dvrtd| | jjdD ]&}td|d| jj| j
| jj	d|d qtt d	 W n2 ty } ztd
|  W Y d }~n
d }~0 0 d S )NzCreating RGB column in database)Nr   r   zv.colorsattrT)r'  usecolumnr$  
rgb_columnr}   layer)r'  r)  r*  r#  r+  r}   r,  z$Creating RGB column in database-donezv.color error < %s>)r   r   r$  r-   getNumLayerr   r   r   r   r   r#  	Exceptionrd   r   )r1   r'  Zlayrb   r>   r>   r?   r&  ]  s:    


zGrassLayerMgr.makeRGBc                 C   s"   t d|ddtd}t|jj S )N
v.categoryZlayersT)r{   optionr}   stdout_r   r
   r   Zoutputsstdout
splitlines)r1   r'  ZnumLayr>   r>   r?   r-  ~  s    
zGrassLayerMgr.getNumLayerc                 C   s"   t d|ddtd}t|jj S )Nv.db.connectTr   )r'  r}   flagsr1  r2  )r1   r'  ZnumLinkr>   r>   r?   getNumLinks  s    zGrassLayerMgr.getNumLinksc              	   C   sb   t dt| |dD ]}td|d|dd qt dt| |dD ]}td|d|ddd	 qDd S )
Nr   r5  rZ   T)r'  r6  r,  r}   zv.editZcatdelz1-10000)r'  Ztoolr,  Zcatsr}   )r-   r.   r7  r   r-  )r1   r'  rY   r>   r>   r?   unlinkLayer  s    zGrassLayerMgr.unlinkLayerc                 C   s  t d | jj}d| jjv r4| jjdd | j_| j jd| jj 7  _zttj	| jj
dd}W n   td Y d S 0 tj| jjdd	d
 r| | jj d}d}|  D ]}|d7 }|t|d 7 }q|d d }|  td|| jjdd|ddd zttj	| jj
dd}W n   td Y n0 d}|  D ]D}|d7 }| jjd | }t| tdd| jj|d|ddd qL|  t d | jjS )NzConnecting tables to maps@r   z_%sr   r   z4Cannot connect tables(time-windows)  to vector layervector)elementfullnamer   r   r   rE   r/  ZtransferTrV   )r{   r|   r0  r~   r,  r6  r}   r   r5  pgr6   )driverr'  tabler  r,  r~   r}   zConnecting tables to maps-done)r   r   r   r   rh   r#   r   r   r   r   r   rd   r   Z	find_filer8  readr4  r!   r   r   r   r   )r1   ZinputMaprO   ZlayerNumZlayStrwinr>   r>   r?   r%    sf    





zGrassLayerMgr.connectDBaLayers)NN)	r\   r]   r^   r@   r&  r-  r7  r8  r%  r>   r>   r>   r?   r"  S  s   
	!r"  c                   @   s&   e Zd Zdd Zd
ddZdd	 ZdS )GrassTemporalMgrc                 C   sH   || _ || _|j| _d| _d|j|j|j|jf | _	| 
  |   d S )NzMW time datasetz. IDtype=%s,sumStep=%s,startTime=%s,endTime='%s)r   timeWinConfr#   datasetNamedatasetTitler   r   r   r   datasetTdescriptioncreateTimedatasetregisterMaps)r1   r   rC  r>   r>   r?   r@     s    zGrassTemporalMgr.__init__Nabsolutemeanc              
   C   sJ   |d ur|| _ |d ur|| _|d ur*|| _tdd| j | jd||dd d S )Nzt.createZstvdsztest mw T)r   r|   titleZdescriptionZtemporaltypeZsemantictyper~   )rD  rE  rF  r   )r1   rD  rE  rF  ZtemporalTypeZsemanticTyper>   r>   r?   rG    s     z"GrassTemporalMgr.createTimedatasetc                 C   s   t d t }| jj}d}tj| j	j
d}td| jjd dD ]R}t| j	jd t| d |d  }|t| jjd7 }||d	 t| d
 7 }qDt|d}|||jf |  td| j  t| td| jd|dd t d d S )Nz$Registring maps to temporal databaser   Ztemporal_reg_filer   :r9  ZMAPSETr   r   rq   rz   zdatasetName %sz
t.registerr:  T)r{   r   r   r~   z)Registring maps to temporal database-done)r   r   rd   ZgisenvrC  r   r   r   r   r   r   r-   r   r!   r   r	   r   r   r   r   r   r   rD  r   )r1   Zgisenv_grassZ	timeOfLayZregTMPZregFilePathr,  ZmapsNamer  r>   r>   r?   rH    s@    


zGrassTemporalMgr.registerMaps)NNNrI  rJ  )r\   r]   r^   r@   rG  rH  r>   r>   r>   r?   rB    s        
rB  c                   @   sX   e Zd ZdddZdd Zd	d
 ZdddZdd Zdd Zdd Z	dd Z
dd ZdS )DatabaseNnoderw   
linkPointsc                 C   s   || _ || _|| _|| _|| _|| _|
d u r8dtd }
|
| _|d u rJd}|| _d | _	d| _
d| _d| _d| _d| _d	| _d
| _d| _|| _|| _|| _tj|	dd| j | _|   |   | d d S )NZtmp_r   publicr?  r5   Zmw_computed_precipZrgauge_computed_precipZrgauge_recordZrgaugeZprecip_mm_hZrgbZprofilesz%spostgres)	dbConnStrdbNameuserportpasswordhostZ
randomWordr#   rl   r$   r   recordTableNamer   ZcomputedPrecipGauger   ro   r   r   nodeVecMapNamer   r    r   r   r   r   pyConnectiongrassConnectionRemotegrassTemporalConnection)r1   namerT  rV  rW  rU  rY  r   r    ZworkPathZ
workSchemarl   r>   r>   r?   r@   '  s8    zDatabase.__init__c                 C   s2   d| j | jf }| j|d d }t|d}|S )NzSELECT min(time) FROM %s.%sr      rl   rX  r$   r%   r   r1   r2   r   r>   r>   r?   r   X  s    
zDatabase.minTimestampc                 C   s2   d| j | jf }| j|d d }t|d}|S )NzSELECT max(time) FROM  %s.%sr   r^  r_  r`  r>   r>   r?   r   ^  s    
zDatabase.maxTimestamprQ  c                 C   s   t jddd d S )Nz	t.connectrZ   )r6  )rd   r   )r1   rj   r>   r>   r?   r\  d  s    z Database.grassTemporalConnectionc              
   C   s   | j | _| jr0| js0tjdd| j | jddd n| jr| jr| jrn| jrntjdd| j | j| j| j| jdd q| jrtjdd| j | j| j| jdd qtjdd| j | j| jdd ntjdd| j dddd tjdd| j dd	d
krtd d S )Nzdb.loginr=  r   T)r>  r   rT  rV  r~   )r>  r   rT  rV  rW  rU  r~   )r>  r   rT  rV  rW  r~   z
db.connect)r>  r   r~   r   z2Unable to connect to the database by grass driver.)	rS  rR  rT  rV  rd   r   rU  rW  r   r   r>   r>   r?   r[  }  sn    	

	

zDatabase.grassConnectionRemotec              
   C   s   z^d| j i}| jr| j|d< | jr,| j|d< | jr<| j|d< | jrL| j|d< tf i || _W n< | jjy } z t	
d| j |f  W Y d }~n
d }~0 0 d S )NZdbnamerT  ZpasswdrW  rU  z*Unable to connect to the database <%s>. %s)rS  rT  rV  rW  rU  r=  r$   r   ZOperationalErrorrd   r   )r1   Zconninforb   r>   r>   r?   rZ    s    




zDatabase.pyConnectionc                 C   s  t | jdddstd d}| j|dd td d	}| j|dd td
 d}| j|dd td d}| j|dd td d}| j|dd td d}| j|dd d}| j|dd td d}| j|dd d}| j|dd d S )NrP  rw   ZlenghtzAdd colum lenghtz)ALTER TABLE link ADD COLUMN lenght real; FTz$Add function for computing distance a  CREATE OR REPLACE FUNCTION get_earth_distance1 (lon1 Float, lat1 Float, lon2 Float, lat2 Float, Radius Float DEFAULT 6387.7) RETURNS FLOAT AS ' DECLARE K FLOAT := 57.29577951; v_dist FLOAT; BEGIN v_dist := (Radius * ACOS((SIN(Lat1 / K) * SIN(Lat2 / K)) + (COS(Lat1 / K) * COS(Lat2 / K) * COS(Lon2 / K - Lon1 / K)))); RETURN round(CAST (v_dist AS Numeric),3); END; ' LANGUAGE 'plpgsql';zComputing column lenghta  UPDATE link SET lenght = get_earth_distance1(n1.long,n1.lat,n2.long,n2.lat)                     FROM node AS n1 JOIN                     link AS l ON n1.nodeid = fromnodeid                     JOIN node AS n2 ON n2.nodeid = tonodeid                     WHERE link.linkid = l.linkid; zCreate sequencez CREATE SEQUENCE serial START 1; zAdd column recordidzJALTER TABLE record add column recordid integer default nextval('serial'); zCreate index on recordidz6CREATE INDEX idindex ON record USING btree(recordid); z5CREATE INDEX timeindex ON record USING btree (time); zAdd mode functionzCREATE OR REPLACE FUNCTION _final_mode(anyarray)                        RETURNS anyelement AS $BODY$ SELECT a FROM unnest($1)                        a GROUP BY 1  ORDER BY COUNT(1) DESC, 1 LIMIT 1;                        $BODY$ LANGUAGE 'sql' IMMUTABLE;zCREATE AGGREGATE mode(anyelement) (                        SFUNC=array_append,                         STYPE=anyarray,                        FINALFUNC=_final_mode,                         INITCOND='{}');)ZisAttributExistr$   r   r   r%   rm   r>   r>   r?   firstPreparation  s4    






zDatabase.firstPreparationc                 C   sb   d| j  }zt| j W n   t| j Y n0 | j|dd d| j  }| j|dd d S r   )r#   r   r   r   r   r   r$   r%   rm   r>   r>   r?   	prepareDB  s    

zDatabase.prepareDBc                 C   s8   zt | j W n" ty2   t j| js. Y n0 d S ri   )r   r   r   OSErrorr   isdirr   r>   r>   r?   
prepareDir'  s
    zDatabase.prepareDir)NNNNNrN  rw   rO  NNN)rQ  )r\   r]   r^   r@   r   r   r\  r[  rZ  ra  rb  re  r>   r>   r>   r?   rM  &  s(              
1
>P
rM  )(rJ   r   r   r   r   r   r   r   r	   r   r_   r   sysr   
subprocessr
   r   r=  Z	core.gcmdr   Zgrass.pygrass.modulesr   Zgrass.scriptZscriptrd   Zmw_utilZMeasureTimer   ZloggingZ	getLoggerr   r   r&   r   r   r   r   r"  rB  rM  r>   r>   r>   r?   <module>   sH    
 ;T[ w     C~U  